<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Anti-Pattern Inc. Engineering Blog]]></title><description><![CDATA[Anti-Pattern Inc.(株式会社アンチパターン)のエンジニアブログです。]]></description><link>https://tech.anti-pattern.co.jp/</link><image><url>https://tech.anti-pattern.co.jp/favicon.png</url><title>Anti-Pattern Inc. Engineering Blog</title><link>https://tech.anti-pattern.co.jp/</link></image><generator>Ghost 2.9</generator><lastBuildDate>Fri, 15 May 2026 05:02:33 GMT</lastBuildDate><atom:link href="https://tech.anti-pattern.co.jp/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[gitleaksを使ってsecretの誤コミット対策してみた]]></title><description><![CDATA[こんにちは、いわむらです。

AI
エージェントといっしょに作業することが増えてきました。速くて助かる一方で、ローカルの設定値や検証用トークンが、気づかないうちにコミットに紛れ込むリスクは前より意識するようになりました。

間違ってコミットに含まれてしまうのを避けるため、機密情報はコミット前に機械的に止めるやり方にチャレンジしてみた内容を共有できたらと思っています。今回は、gitleaks
を lefthook から pre-commit で実行する構成にしています。

本記事で紹介するのは次の3点です。

 * なぜ git-secrets ではなく gitleaks に寄せたのか
 * ローカルで止める最小構成
 * ローカルで漏れた場合に GitHub Actions でどう拾うか

人の注意に頼る場所を減らして、フローの中で止める形にしてみてます。

gitleaks に寄せた理由
もともとは git-secrets を使っていました。AWS 系の検知が優秀なのですが、それ以外のサービスには標準では対応していません。今回は AWS
以外も最初から広めに見たかったので、gitle]]></description><link>https://tech.anti-pattern.co.jp/ai-ezientodechai-fen-gazeng-etanode-secret-scanning-wo-pre-commit-ci-niji-setemita/</link><guid isPermaLink="false">Ghost__Post__69e7c6da781e37000184e786</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Mon, 11 May 2026 00:27:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです。</p><p>AI エージェントといっしょに作業することが増えてきました。速くて助かる一方で、ローカルの設定値や検証用トークンが、気づかないうちにコミットに紛れ込むリスクは前より意識するようになりました。</p><p>間違ってコミットに含まれてしまうのを避けるため、機密情報はコミット前に機械的に止めるやり方にチャレンジしてみた内容を共有できたらと思っています。今回は、gitleaks を lefthook から pre-commit で実行する構成にしています。</p><p>本記事で紹介するのは次の3点です。</p><ul><li>なぜ git-secrets ではなく gitleaks に寄せたのか</li><li>ローカルで止める最小構成</li><li>ローカルで漏れた場合に GitHub Actions でどう拾うか</li></ul><p>人の注意に頼る場所を減らして、フローの中で止める形にしてみてます。</p><h2 id="gitleaks-%E3%81%AB%E5%AF%84%E3%81%9B%E3%81%9F%E7%90%86%E7%94%B1">gitleaks に寄せた理由</h2><p>もともとは git-secrets を使っていました。AWS 系の検知が優秀なのですが、それ以外のサービスには標準では対応していません。今回は AWS 以外も最初から広めに見たかったので、gitleaks のデフォルトのルールセットで Stripe のシークレットキーや Slack の Webhook URL、Vercel のアクセストークンなど、100 種類以上のサービス固有のパターンに対応していることから選択してみました。</p><p>もうひとつは Windows への導入のしやすさです。チームメンバーで Windows を利用している方も多く、git-secrets だと導入に手こずっている方もいました。gitleaks は Scoop を利用することで導入が簡単にできるので、より良い運用に乗せやすいと判断しました。</p><h2 id="%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E6%AD%A2%E3%82%81%E3%82%8B%E6%9C%80%E5%B0%8F%E6%A7%8B%E6%88%90">ローカルで止める最小構成</h2><p>以下は gitleaks v8 系を前提にした例です。</p><p>まずは gitleaks を入れます。</p><pre><code class="language-bash"># macOS
brew install gitleaks

# Windows
scoop install gitleaks

gitleaks version
</code></pre><p>lefthook はバイナリで入れます。</p><pre><code class="language-bash"># macOS
brew install lefthook

# Windows
scoop install lefthook
</code></pre><p>clone してきたら、一度だけ次のコマンドを実行します。</p><pre><code class="language-bash">lefthook install
</code></pre><p>これはリポジトリごとに一度だけ必要です。<code>.git/hooks/</code> に hook が書き込まれ、以降は自動で動きます。</p><p>全リポジトリにグローバルで適用したい場合は、lefthook を使わず git のグローバル hooks を直接使う方法もあります。</p><pre><code class="language-bash">mkdir -p ~/.git-hooks
cat &gt; ~/.git-hooks/pre-commit &lt;&lt; 'EOF'
#!/bin/sh
gitleaks git --staged --redact --verbose
EOF
chmod +x ~/.git-hooks/pre-commit
git config --global core.hooksPath ~/.git-hooks
</code></pre><p>ただし、グローバル設定は自分のマシンにしか効かないため、チームへの展開には向きません。チームで同じルールを共有するなら、リポジトリに lefthook の設定を置く方式のほうが確実です。</p><p>lefthook の設定は次のようにしています。</p><pre><code class="language-yaml">pre-commit:
  commands:
    gitleaks:
      run: gitleaks git --staged --redact --verbose
</code></pre><p>ここでやりたいのは、コミットの直前に一度ブレーキをかけることです。<code>--redact</code> を付けているのは、検知時の出力に secret をそのまま出さないためです。<code>--verbose</code> は、導入直後に何が起きているか追いやすくするために入れています。</p><h2 id="%E5%88%9D%E5%9B%9E%E5%B0%8E%E5%85%A5%E6%99%82%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8">初回導入時にやっておいたこと</h2><p>pre-commit だけだと、これから入る差分しか止められません。既存の履歴を一度見ておきたいので、初回導入時はリポジトリ全体もスキャンしました。</p><pre><code class="language-bash">gitleaks git --redact --verbose
</code></pre><p>ここで検知が出たら、まずは本物の secret かどうかを確認します。誤検知だけを allowlist に寄せるほうが安全です。</p><h2 id="allowlist-%E3%81%AF%E7%8B%AD%E3%81%8F%E6%9B%B8%E3%81%8F">allowlist は狭く書く</h2><p>gitleaks を使い始めると、サンプル文字列やドキュメントで誤検知が出ることがあります。そこで allowlist を入れますが、ここを雑に広げると後で本物を見逃します。</p><p>例えば、ドキュメント配下の <code>EXAMPLE</code> だけを許可するなら、次のように条件を絞って書きます。</p><pre><code class="language-toml">title = "team gitleaks config"

[extend]
useDefault = true

[[allowlists]]
description = "allow documented placeholders only in docs"
condition = "AND"
paths = ['''^docs/''']
regexTarget = "match"
regexes = ['''\bEXAMPLE\b''']
</code></pre><p>「とりあえず docs を全部通す」のような書き方は避けたほうが安心だと考えてます。</p><h2 id="ci-%E3%81%A7%E3%82%82%E3%81%86%E4%B8%80%E5%BA%A6%E8%A6%8B%E3%82%8B">CI でもう一度見る</h2><p>ここでひとつ大事なのは、CI は GitHub に入る前に止める仕組みではない、という点です。<code>push</code> や <code>pull_request</code> で動かす以上、差分はすでに GitHub にはあります。</p><p>それでも CI を置く意味はあります。ローカルで拾えなかったものを PR で止めることと、デフォルトブランチに流し込まないことです。</p><p>GitHub Actions は次のようにしています。</p><pre><code class="language-yaml">name: gitleaks

on:
  pull_request:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: read

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITLEAKS_CONFIG: .gitleaks.toml
          GITLEAKS_ENABLE_COMMENTS: false
          # Organization リポジトリで使う場合だけ追加
          # GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
</code></pre><p><code>fetch-depth: 0</code> を入れているのは、履歴を見られる状態にするためです。<code>push</code> を <code>main</code> に絞っているのは、不要な実行を増やしすぎないためです。</p><h2 id="%E6%A4%9C%E7%9F%A5%E5%BE%8C%E3%81%AB%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8">検知後にやること</h2><p>検知して終わりにはしません。もし本物の secret が push 済みなら、回収とローテーションまでやれるようになると良いかなと思っていますが今回は割愛します。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>AI エージェントで差分が増えるなら、機密情報対策は「気を付ける」だけでは足りないと考えてます。コミット前に止める。漏れたら CI でもう一度見る。その二段にしておくほうが、実際の運用はかなり楽になります。</p><p>git-secrets は今でも良いツールです。ただ、今回は AWS 以外も広く見たかったことと、Windows を含めて配りやすくしたかったことから、gitleaks に寄せました。</p><p>まずは pre-commit で止めるところから始めて、必要になったら CI と allowlist を育てていく。この順番がいちばん無理なく入れられるんじゃないかなと思います。</p>]]></content:encoded></item><item><title><![CDATA[AIエージェントを安全に動かすサンドボックス環境の作成]]></title><description><![CDATA[Claude Code の Auto Mode や GitHub Copilot CLI の Autopilot
など、AIエージェントを自律的に動かす機能があります。
これらは非常に便利な反面、ホスト環境で直接動かすのは少し不安です。依存パッケージが汚染されたり、意図しないファイルを書き換えられたりするリスクがあります。

そこで今回は、エージェントをコンテナ内に閉じ込めつつ、ホストのプロジェクトディレクトリをシームレスに扱えるサンドボックス環境を作成しました。

https://github.com/yutakahashi114/sandbox


--------------------------------------------------------------------------------

概要
このツールは1つのシェルスクリプト sandbox を実行するだけで、Docker コンテナ上の開発環境に入ることができます。

$ sandbox                     # 現在のディレクトリで新しいセッションを開く
$ sandbox -- <cm]]></description><link>https://tech.anti-pattern.co.jp/aiezientowoan-quan-nidong-kasusandobotukusuhuan-jing-nozuo-cheng/</link><guid isPermaLink="false">Ghost__Post__69e72a29781e37000184e762</guid><category><![CDATA[AI]]></category><category><![CDATA[docker]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 22 Apr 2026 00:30:10 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2026/04/----------2026-04-22-14.32.57.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/04/----------2026-04-22-14.32.57.png" alt="AIエージェントを安全に動かすサンドボックス環境の作成"/><p>Claude Code の Auto Mode や GitHub Copilot CLI の Autopilot など、AIエージェントを自律的に動かす機能があります。<br>
これらは非常に便利な反面、ホスト環境で直接動かすのは少し不安です。依存パッケージが汚染されたり、意図しないファイルを書き換えられたりするリスクがあります。</br></p>
<p>そこで今回は、エージェントをコンテナ内に閉じ込めつつ、ホストのプロジェクトディレクトリをシームレスに扱えるサンドボックス環境を作成しました。</p>
<p><a href="https://github.com/yutakahashi114/sandbox">https://github.com/yutakahashi114/sandbox</a></p>
<hr>
<h2 id="%E6%A6%82%E8%A6%81">概要</h2>
<p>このツールは1つのシェルスクリプト <code>sandbox</code> を実行するだけで、Docker コンテナ上の開発環境に入ることができます。</p>
<pre><code>$ sandbox                     # 現在のディレクトリで新しいセッションを開く
$ sandbox -- &lt;cmd&gt;            # コンテナ内で任意のコマンドを直接起動
$ sandbox --docker            # Docker-in-Docker モードで起動
$ sandbox --browser 6080      # ブラウザ + VNC 付きで起動
</code></pre>
<p>コンテナは Ubuntu 24.04 ベースで、Claude Code や Codex CLI など、自分が使うものをインストールしています。<br>
<code>install.sh</code> を編集して独自のツールを追加できます。</br></p>
<hr>
<h2 id="%E5%B7%A5%E5%A4%AB%E3%81%97%E3%81%9F%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">工夫したポイント</h2>
<h3 id="1-git-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E6%89%B1%E3%81%86">1. Git ディレクトリ構造を正しく扱う</h3>
<p>単純に <code>docker run -v $PWD:/workspace</code> するだけでは、git worktree やサブモジュールを使っている場合に <code>.git</code> が参照できず、エージェントが git 操作に失敗してしまいます。</p>
<p>このツールは起動時に git の構成を自動判定して、最適なマウント戦略を選択します。</p>
<pre><code>通常リポジトリ
  └─ リポジトリルートをまるごとマウント（サブディレクトリ実行時も .git が見える）

Git Worktree
  ├─ 元リポジトリ → 読み取り専用でマウント
  ├─ worktree ディレクトリ → 書き込み可でマウント
  └─ .git/worktrees/ → 書き込み可でマウント（ログ書き込みに必要）

サブモジュール
  ├─ 親リポジトリ → 読み取り専用でマウント
  ├─ サブモジュール作業ディレクトリ → 書き込み可でマウント
  └─ .git/modules/&lt;name&gt; → 書き込み可でマウント
</code></pre>
<p>さらに <code>settings/rw-dirs</code> というファイルに書いたパスは、読み取り専用でマウントされたディレクトリ配下であっても書き込み可にオーバーライドできます。モノレポで一部のサブディレクトリだけ書き込みを許可したい場合などに活用できます。</p>
<h3 id="2-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%87%AA%E5%8B%95%E5%90%8C%E6%9C%9F%E3%81%99%E3%82%8B">2. エージェントの設定を自動同期する</h3>
<p>コンテナ内でエージェントを使うには、ホスト側の認証情報や設定ファイルが必要になります。毎回手動でコピーするのは手間がかかるため、起動時に自動同期するようにしました。</p>
<p>ホストの <code>~/.claude/...</code> や <code>~/.codex/...</code> などから必要なファイルや設定をコピーしています。</p>
<h3 id="3-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BD%BF%E3%81%84%E5%9B%9E%E3%81%99">3. コンテナを使い回す</h3>
<p>同じディレクトリで <code>sandbox</code> を複数回呼んだとき、毎回新しいコンテナを起動するのは時間がかかります。そこで、起動時に <code>docker ps</code> で同じディレクトリのラベルを持つコンテナを探し、既存のコンテナに <code>docker exec</code> で入る設計にしました。</p>
<pre><code class="language-zsh">EXISTING=$(docker ps --filter &quot;label=sandbox.host_pwd=${MOUNT_SOURCE}&quot; -q | head -1)
if [[ -n &quot;$EXISTING&quot; ]]; then
  docker exec ... &quot;$EXISTING&quot; zsh
fi
</code></pre>
<p>コンテナ自体はバックグラウンドで <code>sleep infinity</code> で待機しており、<code>exec</code> セッションが 0 になったら自動停止します。</p>
<h3 id="4-%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E3%83%91%E3%82%B9%E6%A7%8B%E9%80%A0%E3%82%92%E4%BF%9D%E6%8C%81%E3%81%99%E3%82%8B">4. ホームディレクトリのパス構造を保持する</h3>
<p>ホスト側が <code>~/my-project</code> だった場合、コンテナ内でも <code>/home/developer/my-project</code> としてマウントされます。絶対パスをベタ書きしたスクリプトが壊れることなく動作します。</p>
<h3 id="5-%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%93%8D%E4%BD%9C%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B">5. ブラウザ操作に対応する</h3>
<p><code>--browser PORT</code> オプションを指定すると、コンテナ内で仮想ディスプレイ（Xvfb）+ Chromium + VNC サーバが起動し、noVNC 経由でブラウザの GUI 操作ができます。git worktree でフロントのちょっとした修正を確認するために使えます。</p>
<pre><code>$ sandbox --browser 6080
# ブラウザで http://localhost:6080/vnc.html を開く
</code></pre>
<h3 id="6-docker-in-docker-%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B">6. Docker-in-Docker に対応する</h3>
<p><code>--docker</code> オプションを指定すると <code>--privileged</code> で起動し、コンテナ内で Docker デーモンが立ち上がります。エージェントが docker コマンドを使うタスクを実行させる際に利用できます。</p>
<p>今回の主目的ではありませんが、git worktree で開発する際にアプリのポートが被らないので並行して起動できます。</p>
<hr>
<h2 id="%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90">ディレクトリ構成</h2>
<pre><code>sandbox/
├── sandbox          # メインスクリプト（コンテナ起動・接続）
├── Dockerfile       # Ubuntu 24.04 ベースイメージ定義
├── entrypoint.sh    # コンテナ起動時の初期化処理
├── install.sh       # ツール類のインストール（ビルド時に実行）
├── mount/           # ここに置いたファイル/ディレクトリを ~/.xxx にマウント
└── settings/        # 起動時に自動生成される設定ファイル群
    ├── ...
    └── rw-dirs       # 読み取り専用領域内で書き込みを許可するパス一覧
</code></pre>
<p><code>mount/</code> ディレクトリに置いたファイルやディレクトリは、ホームからの相対パスを保ったままコンテナにマウントされます。たとえば <code>mount/.npmrc</code> を置けばコンテナ内の <code>/home/developer/.npmrc</code> になります。</p>
<hr>
<h2 id="%E4%BD%BF%E3%81%84%E6%96%B9">使い方</h2>
<h3 id="%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">セットアップ</h3>
<pre><code class="language-zsh">git clone git@github.com:yutakahashi114/sandbox.git ~/&lt;dir&gt;
echo 'export PATH=&quot;$HOME/&lt;dir&gt;:$PATH&quot;' &gt;&gt; ~/.zshrc
source ~/.zshrc
</code></pre>
<p>初回起動時にイメージが自動ビルドされます（数分かかります）。<br>
<code>install.sh</code> を編集して独自のツールを追加できます。</br></p>
<h3 id="%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9">基本的な使い方</h3>
<pre><code class="language-zsh">cd ~/my-project
sandbox                    # コンテナ内の zsh に入る
sandbox -- claude          # Claude Code を起動
sandbox -- codex           # Codex CLI を起動
</code></pre>
<hr>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>AIエージェントを閉じ込めつつ、設定や作業ディレクトリはシームレスに渡すような Docker サンドボックスを作成しました。</p>
<p>特に git worktree やサブモジュールを多用する環境でも正しく動くよう、マウント戦略を細かく調整しました。</p>
<p>安全性を重視して Git の認証情報等は渡していませんが、やろうと思えばできると思います。</p>
<p>また、コンテナからのネットワーク接続は制限しておらず、エージェントが外部への通信を行う可能性があります。</p>
<p>100%安全とは言えませんが、ホストで直接実行するよりは安心感があって良いです。</p>
<!--kg-card-end: markdown--></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[いまさら理解する「メモリとは？」- Webアプリケーションエンジニアのための低レイヤー入門シリーズ その２]]></title><description><![CDATA[先日、とあるサービスで OOMKilled 
が発生しまして、メモリリミットに引っかかったんですが、「そもそもなんでこんなにメモリ使ってるんだ？」を調査するのに、メモリの基礎知識が改めて大事だなと思いました。

ということで、「低レイヤー入門シリーズ」の第二弾はメモリについて深掘りしていきます！

前回の「スタティックリンクとダイナミックリンク」
[https://tech.anti-pattern.co.jp/imasarali-jie-surusutateitukurinkutodainamitukurinkunituite/]
では、プログラムがどのように実行ファイルになるかを学びました。今回は、その実行ファイルが動くときに欠かせないメモリの仕組み
を、C言語を使って体感していきましょう。


--------------------------------------------------------------------------------

なぜWebエンジニアがメモリを理解すべきか？
普段、Ruby on
RailsやNode.js、Goなどで開発していると、メモ]]></description><link>https://tech.anti-pattern.co.jp/imasarali-jie-suru-sutateitukurinku-to-dainamitukurinku-webapurikesiyonenzinianotamenodi-reiyaru-men-sirizu-sono1/</link><guid isPermaLink="false">Ghost__Post__69c3346171fa390001b3661c</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Wed, 08 Apr 2026 05:35:32 GMT</pubDate><content:encoded><![CDATA[<p>先日、とあるサービスで <code>OOMKilled</code> が発生しまして、メモリリミットに引っかかったんですが、「そもそもなんでこんなにメモリ使ってるんだ？」を調査するのに、メモリの基礎知識が改めて大事だなと思いました。</p><p>ということで、「低レイヤー入門シリーズ」の第二弾は<strong>メモリ</strong>について深掘りしていきます！</p><p><a href="https://tech.anti-pattern.co.jp/imasarali-jie-surusutateitukurinkutodainamitukurinkunituite/">前回の「スタティックリンクとダイナミックリンク」</a>では、プログラムがどのように実行ファイルになるかを学びました。今回は、その実行ファイルが動くときに欠かせない<strong>メモリの仕組み</strong>を、C言語を使って体感していきましょう。</p><hr><h2 id="%E3%81%AA%E3%81%9Cweb%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%81%B9%E3%81%8D%E3%81%8B%EF%BC%9F">なぜWebエンジニアがメモリを理解すべきか？</h2><p>普段、Ruby on RailsやNode.js、Goなどで開発していると、メモリを意識することは少ないかもしれません。しかし、こんな場面に遭遇したことはありませんか？</p><ul><li>「メモリリーク」でアプリケーションが落ちた</li><li>「OutOfMemoryError」に悩まされた</li><li>Dockerのメモリ制限で苦労した</li><li>パフォーマンスチューニングで「ヒープ」「スタック」という言葉が出てきた</li></ul><p>これらを理解するためには、メモリの基礎知識が必要です。C言語は、メモリを<strong>直接操作できる</strong>言語なので、メモリの仕組みを学ぶのに最適なんです。</p><hr><h2 id="%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F">メモリとは何か？</h2><h3 id="%E6%A6%82%E5%BF%B5%E5%9B%B3%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B">概念図で理解する</h3><p>まず、メモリの全体像を把握しましょう。</p><pre><code>┌─────────────────────────────────────────────────────────────────┐
│                        物理メモリ（RAM）                          │
│                                                                 │
│  メモリは「番地（アドレス）がついた巨大なロッカー」のようなもの      │
│                                                                 │
│  ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐      │
│  │ 0x00 │ 0x01 │ 0x02 │ 0x03 │ 0x04 │ 0x05 │ 0x06 │ 0x07 │ ...  │
│  │      │      │      │      │      │      │      │      │      │
│  │ 1byte│ 1byte│ 1byte│ 1byte│ 1byte│ 1byte│ 1byte│ 1byte│      │
│  └──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘      │
│     ↑                                                           │
│  アドレス（16進数で表される）                                     │
└─────────────────────────────────────────────────────────────────┘</code></pre><p>ポイントは3つです。</p><ol><li><strong>メモリには「アドレス」という番地がある</strong></li><li><strong>1つのアドレスには（基本は）1バイト（8ビット）のデータが格納できる</strong></li><li><strong>アドレスは通常、16進数（0x...）で表現される</strong></li></ol><p>駅のコインロッカーを想像してみてください。ロッカー番号がアドレスで、中に入れる荷物がデータです。ただし、1つのロッカーに入る荷物は1バイト分だけ。大きなデータは、複数のロッカーにまたがって入れる必要があります。</p><h3 id="%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E4%BD%BF%E3%81%86%E3%83%A1%E3%83%A2%E3%83%AA%E9%A0%98%E5%9F%9F">プログラムが使うメモリ領域</h3><p>プログラムが実行されると、OSはそのプログラム専用のメモリ空間を割り当てます。このメモリ空間は、いくつかの領域に分かれています。</p><pre><code>┌─────────────────────────────────────────┐  高いアドレス
│              スタック領域                │  ← 関数のローカル変数など
│                  ↓                      │    （自動で確保・解放）
│                  ↓                      │
├─────────────────────────────────────────┤
│                                         │
│              空き領域                    │
│                                         │
├─────────────────────────────────────────┤
│                  ↑                      │
│                  ↑                      │
│              ヒープ領域                  │  ← 動的に確保するメモリ
│                                         │    （mallocなど）
├─────────────────────────────────────────┤
│              BSS領域                     │  ← 初期化されていない
│          (未初期化データ)                 │    グローバル変数
├─────────────────────────────────────────┤
│              データ領域                  │  ← 初期化された
│           (初期化済みデータ)              │    グローバル変数
├─────────────────────────────────────────┤
│              テキスト領域                │  ← プログラムのコード
│            (コード領域)                  │    （機械語）
└─────────────────────────────────────────┘  低いアドレス</code></pre><p>今回は特に<strong>スタック領域</strong>と<strong>ヒープ領域</strong>に注目します。この2つの違いがわかると、「なぜメモリリークが起きるのか」がスッキリ理解できるようになります。</p><hr><h2 id="%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">環境準備</h2><p>前回と同じく、実際にコードを動かしていきましょう。GCCが必要です。GCCが入っていない方は、ご自身の環境に合わせてググってインストールしてください！</p><pre><code class="language-bash"># バージョン確認
gcc --version</code></pre><hr><h2 id="%E5%A4%89%E6%95%B0%E3%81%A8%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9">変数とメモリアドレス</h2><h3 id="%E5%A4%89%E6%95%B0%E3%81%AF%E3%83%A1%E3%83%A2%E3%83%AA%E4%B8%8A%E3%81%AE%E3%81%A9%E3%81%93%E3%81%AB%E3%81%82%E3%82%8B%EF%BC%9F">変数はメモリ上のどこにある？</h3><p>まず、変数がメモリ上のどこに配置されるかを確認してみましょう。</p><p><strong>ファイル名: <code>address.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() {
    int number = 42;
    char letter = 'A';
    double pi = 3.14159;
    
    printf("=== 変数の値とアドレス ===\n\n");
    
    printf("int型変数 number\n");
    printf("  値: %d\n", number);
    printf("  アドレス: %p\n", (void*)&amp;number);
    printf("  サイズ: %zu バイト\n\n", sizeof(number));
    
    printf("char型変数 letter\n");
    printf("  値: %c\n", letter);
    printf("  アドレス: %p\n", (void*)&amp;letter);
    printf("  サイズ: %zu バイト\n\n", sizeof(letter));
    
    printf("double型変数 pi\n");
    printf("  値: %f\n", pi);
    printf("  アドレス: %p\n", (void*)&amp;pi);
    printf("  サイズ: %zu バイト\n", sizeof(pi));
    
    return 0;
}</code></pre><h3 id="%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A8%E5%AE%9F%E8%A1%8C">コンパイルと実行</h3><pre><code class="language-bash">gcc -o address address.c
./address</code></pre><h3 id="%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%81%AE%E4%BE%8B">実行結果の例</h3><pre><code>=== 変数の値とアドレス ===

int型変数 number
  値: 42
  アドレス: 0x7ffd5c8b3a4c
  サイズ: 4 バイト

char型変数 letter
  値: A
  アドレス: 0x7ffd5c8b3a4b
  サイズ: 1 バイト

double型変数 pi
  値: 3.141590
  アドレス: 0x7ffd5c8b3a40
  サイズ: 8 バイト</code></pre><p>ここで注目すべきなのは、<strong>型によってサイズが違う</strong>こと。<code>int</code>は4バイト、<code>char</code>は1バイト、<code>double</code>は8バイト。そしてアドレスを見ると、変数ごとにちゃんと別々の場所が割り当てられているのがわかります。</p><h3 id="%E8%A7%A3%E8%AA%AC">解説</h3><ul><li><strong><code>&amp;</code>演算子</strong>：変数の前に<code>&amp;</code>をつけると、その変数の<strong>メモリアドレス</strong>が取得できます</li><li><strong><code>%p</code></strong>：アドレスを表示するためのフォーマット指定子です</li><li><strong><code>sizeof</code></strong>：変数や型のサイズ（バイト数）を返します</li></ul><pre><code>メモリのイメージ（上記の例の場合）

アドレス        値              変数名
0x7ffd5c8b3a40  [3.14159....]   pi (8バイト)
    :
0x7ffd5c8b3a4b  ['A']           letter (1バイト)
0x7ffd5c8b3a4c  [42......]      number (4バイト)
    ↓
スタック領域（高いアドレスから低いアドレスへ伸びる）</code></pre><blockquote><strong>💡 Webエンジニア向けメモ</strong></blockquote><blockquote>JavaScriptでは<code>typeof</code>で型を調べますが、メモリサイズは完全に隠蔽されています。 C言語では、型によってメモリの使用量が明確に決まります。 これが「型を意識する」ということの本質です。 Goの<code>unsafe.Sizeof()</code>やRustの<code>std::mem::size_of()</code>でも同じようにサイズを確認できます。</blockquote><hr><h2 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E8%B6%85%E5%9F%BA%E7%A4%8E">ポインタの超基礎</h2><h3 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E3%81%AF%EF%BC%9F">ポインタとは？</h3><p>C言語といえばポインタ！…そして、挫折ポイントでもありますよね。でも恐れることはありません。一言でいうと、</p><blockquote><strong>ポインタ = メモリアドレスを格納する変数</strong></blockquote><p>それだけです。「値そのもの」ではなく「値がある場所（住所）」を覚えておく変数、というだけ。</p><pre><code>┌────────────────────────────────────────────────────────────┐
│                                                            │
│   通常の変数                      ポインタ変数              │
│   ┌─────────┐                   ┌─────────────┐            │
│   │   42    │                   │ 0x7ffd...4c │            │
│   └─────────┘                   └──────┬──────┘            │
│   number                               │                   │
│   (int型)                              │ 「ここを見て！」   │
│                                        ↓                   │
│                                   ┌─────────┐              │
│                                   │   42    │              │
│                                   └─────────┘              │
│                                   number                   │
│                                                            │
└────────────────────────────────────────────────────────────┘</code></pre><h3 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86">ポインタを使ってみよう</h3><p><strong>ファイル名: <code>pointer_basic.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() {
    int number = 42;
    int *ptr = &amp;number;  // numberのアドレスをptrに格納
    
    printf("=== ポインタの基本 ===\n\n");
    
    // 元の変数
    printf("number の値: %d\n", number);
    printf("number のアドレス: %p\n\n", (void*)&amp;number);
    
    // ポインタ変数
    printf("ptr の値（= numberのアドレス）: %p\n", (void*)ptr);
    printf("ptr が指す先の値（*ptr）: %d\n", *ptr);
    printf("ptr 自身のアドレス: %p\n\n", (void*)&amp;ptr);
    
    // ポインタを使って値を変更
    printf("--- ポインタ経由で値を変更 ---\n");
    *ptr = 100;  // ポインタを通じてnumberの値を変更
    printf("*ptr = 100 を実行後:\n");
    printf("number の値: %d\n", number);
    printf("*ptr の値: %d\n", *ptr);
    
    return 0;
}</code></pre><h3 id="%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C">実行結果</h3><pre><code class="language-bash">gcc -o pointer_basic pointer_basic.c
./pointer_basic</code></pre><pre><code>=== ポインタの基本 ===

number の値: 42
number のアドレス: 0x7ffd5c8b3a4c

ptr の値（= numberのアドレス）: 0x7ffd5c8b3a4c
ptr が指す先の値（*ptr）: 42
ptr 自身のアドレス: 0x7ffd5c8b3a40

--- ポインタ経由で値を変更 ---
*ptr = 100 を実行後:
number の値: 100
*ptr の値: 100</code></pre><p><code>*ptr = 100</code> しただけなのに、<code>number</code>の値も100に変わっています。同じメモリを指しているから当然なんですが、初めて見るとちょっと不思議ですよね。</p><h3 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E8%A8%98%E5%8F%B7%E3%81%BE%E3%81%A8%E3%82%81">ポインタの記号まとめ</h3><p><code>*</code> が宣言時と使用時で意味が変わるのがハマりポイントです。</p><!--kg-card-begin: html--><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">記号</th><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">意味</th><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">使用例</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">*</code> (宣言時)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">「これはポインタ変数です」</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">int *ptr;</code></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">*</code> (使用時)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">デリファレンス（参照先の値を取得）</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">*ptr = 100;</code></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">&amp;</code></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">アドレスを取得</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">&amp;number</code></td></tr></tbody></table><!--kg-card-end: html--><pre><code>宣言と使用の違い

int *ptr = &amp;number;   ← 宣言時の * は「ポインタ型」を示す
     ↓
*ptr = 100;           ← 使用時の * は「参照先にアクセス」を示す</code></pre><blockquote><strong>💡 Webエンジニア向けメモ</strong></blockquote><blockquote>「ポインタ」って難しそうに聞こえますが、実はJavaScriptやRubyでも似た概念はあります。 オブジェクトを変数に代入すると、値のコピーではなく「参照」が渡される、あれです。 C言語のポインタは、その参照を<strong>明示的に操作できる</strong>というだけの話なんです。</blockquote><hr><h2 id="%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E5%8B%95%E7%9A%84%E7%A2%BA%E4%BF%9D%EF%BC%88malloc-free%EF%BC%89">メモリの動的確保（malloc / free）</h2><h3 id="%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%81%A8%E3%83%92%E3%83%BC%E3%83%97">スタックとヒープ</h3><p>ここまで見てきた変数は、すべて<strong>スタック領域</strong>に確保されていました。スタック領域の変数は、関数が終了すると自動的に解放されます。</p><p>一方、<strong>ヒープ領域</strong>は、プログラマが<strong>明示的に確保・解放</strong>するメモリです。</p><pre><code>┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   スタック領域                    ヒープ領域                 │
│   ─────────────                  ─────────────              │
│                                                             │
│   ✅ 自動で確保・解放              ⚠️  手動で確保・解放       │
│   ✅ 高速                         ⚠️  やや低速               │
│   ❌ サイズはコンパイル時に決定     ✅ サイズを実行時に決定可能 │
│   ❌ 関数内でのみ有効              ✅ 関数をまたいで使える     │
│                                                             │
│   用途: ローカル変数               用途: 可変長データ、        │
│        関数の引数                      長期間保持するデータ   │
│                                                             │
└─────────────────────────────────────────────────────────────┘</code></pre><p>RubyやJavaScriptでは <code>new</code> するだけでヒープにオブジェクトが作られますが、C言語では自分で「これだけのメモリをください！」とOSにお願いする必要があります。それが <code>malloc()</code> です。</p><h3 id="malloc-%E3%81%A8-free">malloc と free</h3><p><strong>ファイル名: <code>malloc_basic.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;  // malloc, free に必要

int main() {
    printf("=== 動的メモリ確保 ===\n\n");
    
    // 整数1つ分のメモリを確保
    // ※C言語ではmallocの戻り値(void*)は暗黙的にキャストされるため、
    //   キャストは省略可能です。ここでは意図を明示するために記載しています。
    //  （C++ではキャストが必須です）
    int *ptr = (int *)malloc(sizeof(int));
    
    // 確保できたか確認（重要！）
    if (ptr == NULL) {
        printf("メモリの確保に失敗しました\n");
        return 1;
    }
    
    printf("メモリを確保しました\n");
    printf("確保したアドレス: %p\n", (void*)ptr);
    printf("確保したサイズ: %zu バイト\n\n", sizeof(int));
    
    // 確保したメモリに値を格納
    *ptr = 12345;
    printf("格納した値: %d\n\n", *ptr);
    
    // メモリを解放
    free(ptr);
    printf("メモリを解放しました\n");
    
    // 解放後のポインタはNULLにするのが安全
    ptr = NULL;
    
    return 0;
}</code></pre><h3 id="%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C-1">実行結果</h3><pre><code class="language-bash">gcc -o malloc_basic malloc_basic.c
./malloc_basic</code></pre><pre><code>=== 動的メモリ確保 ===

メモリを確保しました
確保したアドレス: 0x55a8b6c4a2a0
確保したサイズ: 4 バイト

格納した値: 12345

メモリを解放しました</code></pre><p><code>malloc</code> → 使う → <code>free</code> の3ステップ。これがC言語のメモリ管理の基本です。<code>free</code> を忘れると大変なことになりますが、それは後ほど</p><h3 id="%E9%85%8D%E5%88%97%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B">配列を動的に確保する</h3><p>スタック上の配列は <code>int array[5];</code> のようにサイズをコンパイル時に決める必要がありますが、<code>malloc</code> を使えば<strong>実行時にサイズを決められます</strong>。</p><p><strong>ファイル名: <code>malloc_array.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    int n;
    printf("配列の要素数を入力してください: ");
    scanf("%d", &amp;n);
    
    // n個のint配列を動的に確保
    int *array = (int *)malloc(sizeof(int) * n);
    
    if (array == NULL) {
        printf("メモリの確保に失敗しました\n");
        return 1;
    }
    
    printf("\n%d個のint型配列を確保しました\n", n);
    printf("確保したサイズ: %zu バイト\n", sizeof(int) * n);
    printf("先頭アドレス: %p\n\n", (void*)array);
    
    // 配列に値を格納
    for (int i = 0; i &lt; n; i++) {
        array[i] = i * 10;
    }
    
    // 配列の内容とアドレスを表示
    printf("インデックス | 値   | アドレス\n");
    printf("-------------|------|------------------\n");
    for (int i = 0; i &lt; n; i++) {
        printf("    %d        | %3d  | %p\n", i, array[i], (void*)&amp;array[i]);
    }
    
    // メモリを解放
    free(array);
    array = NULL;
    
    printf("\nメモリを解放しました\n");
    
    return 0;
}</code></pre><p>同様に実行すると？</p><h3 id="%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C-2">実行結果</h3><pre><code>配列の要素数を入力してください: 5

5個のint型配列を確保しました
確保したサイズ: 20 バイト
先頭アドレス: 0x55a8b6c4a2a0

インデックス | 値   | アドレス
-------------|------|------------------
    0        |   0  | 0x55a8b6c4a2a0
    1        |  10  | 0x55a8b6c4a2a4
    2        |  20  | 0x55a8b6c4a2a8
    3        |  30  | 0x55a8b6c4a2ac
    4        |  40  | 0x55a8b6c4a2b0

メモリを解放しました</code></pre><p>アドレスが4バイトずつ増えているのがわかりますか？ これは <code>int</code> 型が4バイトだからです。メモリ上にきれいに並んでいるのが見えると、配列の正体がよくわかりますね。</p><blockquote><strong>💡 Webエンジニア向けメモ</strong></blockquote><blockquote>GoやRustでは <code>make([]int, n)</code> や <code>Vec::with_capacity(n)</code> のように、 動的にサイズを指定して配列やスライスを作ることがよくあります。 裏側では似たようなヒープへのメモリ確保が行われています。</blockquote><hr><h2 id="%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E3%82%92%E4%BD%93%E9%A8%93%E3%81%99%E3%82%8B">メモリリークを体験する</h2><h3 id="%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%EF%BC%9F">メモリリークとは？</h3><p><strong>メモリリーク</strong>とは、確保したメモリを解放し忘れることで、使えるメモリが徐々に減っていく現象です。Webアプリの運用でよくある「なぜかメモリ使用量が右肩上がりで、定期的に再起動しないといけない」の原因、だいたいコレです。</p><p><strong>ファイル名: <code>memory_leak.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

void bad_function() {
    // メモリを確保するが、解放しない（これがメモリリーク！）
    int *ptr = (int *)malloc(sizeof(int) * 1000);
    if (ptr == NULL) return;
    *ptr = 42;
    // free(ptr); ← これがない！
}

void good_function() {
    int *ptr = (int *)malloc(sizeof(int) * 1000);
    if (ptr == NULL) return;
    *ptr = 42;
    free(ptr);  // ちゃんと解放
}

int main() {
    printf("=== メモリリークのデモ ===\n\n");
    
    printf("bad_function を1000回呼び出します...\n");
    for (int i = 0; i &lt; 1000; i++) {
        bad_function();
    }
    printf("完了（約4,000,000バイトがリークしています）\n\n");
    
    printf("good_function を1000回呼び出します...\n");
    for (int i = 0; i &lt; 1000; i++) {
        good_function();
    }
    printf("完了（メモリリークなし）\n");
    
    return 0;
}</code></pre><p><code>bad_function</code> は1回呼ぶたびに <code>sizeof(int) * 1000 = 4,000バイト</code> をリークします。1,000回呼ぶと約4,000,000バイト（約3.8MB）の漏れです。たった数行の <code>free</code> の書き忘れで、これだけのメモリが無駄になるんですね。</p><h3 id="valgrind%E3%81%A7%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E3%82%92%E6%A4%9C%E5%87%BA">Valgrindでメモリリークを検出</h3><p>C言語にはメモリリークを検出する定番ツール <strong>Valgrind</strong> があります。Linuxでは、以下で確認できます！</p><pre><code class="language-bash"># Valgrindのインストール（Ubuntu）
sudo apt install valgrind

# コンパイル（デバッグ情報付き）
gcc -g -o memory_leak memory_leak.c

# Valgrindで実行
valgrind --leak-check=full ./memory_leak</code></pre><h3 id="%E6%A4%9C%E5%87%BA%E7%B5%90%E6%9E%9C">検出結果</h3><pre><code>==12345== LEAK SUMMARY:
==12345==    definitely lost: 4,000,000 bytes in 1,000 blocks
==12345==    indirectly lost: 0 bytes in 0 blocks
==12345==      possibly lost: 0 bytes in 0 blocks
==12345==    still reachable: 0 bytes in 0 blocks
==12345==         suppressed: 0 bytes in 0 blocks</code></pre><p><code>definitely lost: 4,000,000 bytes</code> — バッチリ検出されました！ こんなふうに、C言語ではメモリの問題を直接確認できます。</p><blockquote><strong>💡 Webエンジニア向けメモ</strong></blockquote><blockquote>Node.jsでも同様のメモリリークは起こります。例えば、グローバル変数に配列を追加し続けたり、イベントリスナーを解除し忘れたり、クロージャで大きなオブジェクトを参照し続けたり。原理は同じで、「使わなくなったメモリが解放されない」ことが問題です。</blockquote><blockquote>Node.jsの場合は <code>--inspect</code> フラグをつけて起動し、Chrome DevToolsの「Memory」タブでHeap Snapshotを取ると、Valgrindのようにリークを調査できます。Goなら <code>pprof</code> が同様のツールになります。</blockquote><hr><h2 id="%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%81%A8%E3%83%92%E3%83%BC%E3%83%97%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E5%AE%9F%E6%84%9F%E3%81%99%E3%82%8B">スタックとヒープの違いを実感する</h2><h3 id="%E3%83%80%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E5%8D%B1%E9%99%BA">ダングリングポインタの危険</h3><p>最後に、スタックとヒープの違いが生む典型的なバグを見てみましょう。</p><p><strong>ダングリングポインタ</strong>とは、すでに無効になったメモリを指すポインタのことです。「存在しない住所が書かれたメモ」みたいなものですね。</p><p><strong>ファイル名: <code>dangling.c</code></strong></p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

// ダメな例：スタック上の変数のアドレスを返す
int* bad_get_number() {
    int local = 42;
    return &amp;local;  // ⚠️ 関数終了後、localは無効になる
}

// 良い例：ヒープ上にメモリを確保して返す
int* good_get_number() {
    int *ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL) return NULL;
    *ptr = 42;
    return ptr;  // ✅ ヒープ上なので関数終了後も有効
}

int main() {
    printf("=== ダングリングポインタのデモ ===\n\n");
    
    printf("【危険】スタック上の変数を返す場合:\n");
    int *bad = bad_get_number();
    printf("アドレス: %p\n", (void*)bad);
    // ⚠️ この行は未定義動作です！何が表示されるかわかりません
    // コンパイラの最適化レベルによって挙動が変わります
    printf("値（未定義動作！）: %d\n\n", *bad);
    
    printf("【安全】ヒープ上のメモリを返す場合:\n");
    int *good = good_get_number();
    if (good != NULL) {
        printf("アドレス: %p\n", (void*)good);
        printf("値: %d\n", *good);
        free(good);  // 使い終わったら解放
    }
    
    return 0;
}</code></pre><h3 id="%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E3%81%AE%E8%AD%A6%E5%91%8A">コンパイル時の警告</h3><pre><code class="language-bash"># 最適化なしでコンパイル（未定義動作の挙動を確認するため）
gcc -Wall -O0 -o dangling dangling.c</code></pre><pre><code>dangling.c: In function 'bad_get_number':
dangling.c:7:12: warning: function returns address of local variable [-Wreturn-local-addr]
    7 |     return &amp;local;
      |            ^~~~~~</code></pre><p>コンパイラが警告してくれますね！ <code>-Wall</code> オプションをつけてコンパイルすると、こうした危険なコードを事前にキャッチできます。</p><p>この例がまさに「スタック vs ヒープ」の違いです。スタック上の変数（<code>local</code>）は関数を抜けた瞬間に無効になりますが、ヒープ上のメモリ（<code>malloc</code> で確保したもの）は <code>free</code> するまで有効。だからこそ、ヒープに確保して返すのが正しいパターンなんです。ただし、前述のメモリリークのように、freeを忘れないようにしないといけません！</p><blockquote><strong>💡 Webエンジニア向けメモ</strong></blockquote><blockquote>GoやRustでは、この種のバグはコンパイラが防いでくれます。 Goでは「エスケープ解析」によって、関数外に渡される変数は自動的にヒープに配置されます。 <code>go build -gcflags="-m"</code> で確認できるので、興味のある方はぜひ試してみてください。 Rustではさらに厳密で、所有権とライフタイムの仕組みによって、ダングリングポインタの発生をコンパイル時に完全に防いでいます。</blockquote><hr><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回学んだことを整理しましょう。</p><pre><code>┌─────────────────────────────────────────────────────────────────┐
│                        今回のまとめ                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. メモリにはアドレスがある                                     │
│     → &amp; でアドレスを取得、%p で表示                              │
│                                                                 │
│  2. ポインタ = アドレスを格納する変数                            │
│     → int *ptr = &amp;number;                                       │
│     → *ptr でポインタが指す値にアクセス                          │
│                                                                 │
│  3. 動的メモリ確保                                               │
│     → malloc() で確保、free() で解放                             │
│     → 解放を忘れるとメモリリーク                                 │
│                                                                 │
│  4. スタック vs ヒープ                                           │
│     → スタック：自動管理、関数内で有効                           │
│     → ヒープ：手動管理、プログラム全体で有効                     │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘</code></pre><h3 id="web%E7%B3%BB%E3%81%A3%E3%81%BD%E3%81%84%E8%A8%80%E8%AA%9E%E3%81%A8%E3%81%AE%E5%AF%BE%E5%BF%9C">Web系っぽい言語との対応</h3><p>C言語で学んだ概念は、普段使っている言語にも対応しています。</p><!--kg-card-begin: html--><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">C言語</th><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Web系っぽい言語での対応</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">malloc()</code></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">new Object()</code> / オブジェクト生成</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">free()</code></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">GC（ガベージコレクション）が自動で行う</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">ポインタ</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">参照（Reference）</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">スタック</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">プリミティブ型の値（※言語による）</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">ヒープ</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">オブジェクト / 配列（※言語による）</td></tr></tbody></table><!--kg-card-end: html--><p>※ スタックとヒープの割り当ては言語や実装によって異なります。例えばGoではエスケープ解析によって、見た目はローカル変数でもヒープに配置されることがあります。上記はJavaでの一般的なイメージとして参考にしてください。</p><h3/><p>前回のリンクの話と今回のメモリの話で、だいぶコンピュータの「裏側」が見えてきたのではないでしょうか？ この知識があると、Dockerのリソース制限とかOOMKilledとか、「あ、あれのことね」とピンとくるようになりますよ！</p><p>たぶん！</p><p>こちらからは以上です。</p></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[雇用保険の適用拡大について学ぼう！]]></title><description><![CDATA[こんにちは！
アンチパターン管理部の森口です。

今回は、2024年5月10日に成立した「雇用保険法等の一部を改正する法律」で最も影響が大きい、2028年10月1日施行の「雇用保険の適用拡大」について学びたいと思います。

前提
労働者を1人でも雇用する事業は、原則として雇用保険の「強制適用事業」となり、事業主は、正社員・パート・アルバイトといった雇用形態にかかわらず、加入要件を満たす労働者を雇用保険に加入させる義務があります。
参考：第2章　雇用保険の適用について｜厚生労働省
[https://www.mhlw.go.jp/file/06-Seisakujouhou-11600000-Shokugyouanteikyoku/0000172758.pdf]

雇用保険の適用拡大で何が変わるの？
 * 雇用保険の加入要件の一部が変わる
   週の所定労働時間に関する要件が「週20時間以上」から「週10時間以上」に拡大されます。
   これにより、今まで雇用保険の加入対象外であった「週10時間以上〜20時間未満」の短時間労働者に関しても、雇用保険の強制加入対象となります。
 * 被保険者期]]></description><link>https://tech.anti-pattern.co.jp/expansion_of_employment_insurance_coverage/</link><guid isPermaLink="false">Ghost__Post__69411b6571fa390001b357fa</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 08 Apr 2026 00:59:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは！<br>
アンチパターン管理部の森口です。</br></p>
<p>今回は、2024年5月10日に成立した「雇用保険法等の一部を改正する法律」で最も影響が大きい、2028年10月1日施行の「雇用保険の適用拡大」について学びたいと思います。</p>
<h2 id="%E5%89%8D%E6%8F%90">前提</h2>
<p>労働者を1人でも雇用する事業は、原則として雇用保険の「強制適用事業」となり、事業主は、正社員・パート・アルバイトといった雇用形態にかかわらず、加入要件を満たす労働者を雇用保険に加入させる義務があります。<br>
参考：<a href="https://www.mhlw.go.jp/file/06-Seisakujouhou-11600000-Shokugyouanteikyoku/0000172758.pdf">第2章　雇用保険の適用について｜厚生労働省</a></br></p>
<h2 id="%E9%9B%87%E7%94%A8%E4%BF%9D%E9%99%BA%E3%81%AE%E9%81%A9%E7%94%A8%E6%8B%A1%E5%A4%A7%E3%81%A7%E4%BD%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B%E3%81%AE%EF%BC%9F">雇用保険の適用拡大で何が変わるの？</h2>
<ul>
<li><strong>雇用保険の加入要件の一部が変わる</strong><br>
週の所定労働時間に関する要件が「週20時間以上」から「週10時間以上」に拡大されます。<br>
これにより、今まで雇用保険の加入対象外であった「週10時間以上〜20時間未満」の短時間労働者に関しても、雇用保険の強制加入対象となります。</br></br></li>
<li><strong>被保険者期間の算定基準などが緩和される</strong><br>
失業等給付、育児休業等給付、教育訓練給付などの受給資格を得るために必要な「被保険者期間」の算定基準や、失業認定基準なども「週10時間以上」の短時間労働者に対応して緩和されます。</br></li>
</ul>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-24-23.57.25.png" alt="----------2026-03-24-23.57.25" loading="lazy"><br>
参照元：<a href="https://www.mhlw.go.jp/content/11601000/001542937.pdf">令和6年雇用保険制度改正（令和10年10月1日施行分）について｜厚生労働省</a></br></img></p>
<h2 id="%E9%9B%87%E7%94%A8%E4%BF%9D%E9%99%BA%E3%81%AE%E5%8A%A0%E5%85%A5%E8%A6%81%E4%BB%B6%E3%82%92%E3%81%8A%E3%81%95%E3%82%89%E3%81%84%E3%81%97%E3%82%88%E3%81%86%EF%BC%81">雇用保険の加入要件をおさらいしよう！</h2>
<p/>
<h4 id="%E2%91%A0-%E5%8A%B4%E5%83%8D%E6%99%82%E9%96%93%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A6%81%E4%BB%B6">① 労働時間に関する要件</h4>
<p>〜2028年9月30日<br>
　週の所定労働時間が<strong>20時間以上</strong>であること<br>
2028年10月1日〜<br>
　週の所定労働時間が<strong>10時間以上</strong>であること <strong>（←ここが改正ポイント！）</strong></br></br></br></p>
<h4 id="%E2%91%A1-%E9%9B%87%E7%94%A8%E8%A6%8B%E8%BE%BC%E3%81%BF%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A6%81%E4%BB%B6">② 雇用見込みに関する要件</h4>
<p><strong>31日以上の雇用見込みがあること</strong></p>
<ul>
<li>期間の定めがない契約の場合（無期雇用）は、この要件を満たす</li>
<li>期間の定めがある契約の場合（有期雇用）は、更新条項の有無や、過去の雇用実績から31日以上の雇用が見込まれる場合に要件を満たす</li>
</ul>
<h4 id="%E2%91%A2-%E9%81%A9%E7%94%A8%E9%99%A4%E5%A4%96%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A6%81%E4%BB%B6">③ 適用除外に関する要件</h4>
<p><strong>以下の「適用除外（加入義務がない人）」に該当しないこと</strong></p>
<ul>
<li><strong>昼間学生</strong><br>
ただし、夜間学生・通信制学生・休学中の学生・内定者アルバイト（卒業見込み証明書を有する者に限る）は加入義務あり</br></li>
<li><strong>法人の役員</strong><br>
ただし、労働者としての雇用関係が実態として存在する場合（使用人兼務役員など）は加入義務あり</br></li>
<li><strong>その他、法令で定められた一部の労働者</strong><br>
季節的に雇用される労働者や船員など</br></li>
</ul>
<p>参考：<a href="https://www.mhlw.go.jp/content/11600000/000637955.pdf">第4章 被保険者について｜厚生労働省</a></p>
<h2 id="%E9%9B%87%E7%94%A8%E4%BF%9D%E9%99%BA%E3%81%AB%E5%8A%A0%E5%85%A5%E3%81%99%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">雇用保険に加入するメリット/デメリット</h2>
<h4 id="%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%EF%BC%88%E4%B8%87%E3%81%8C%E4%B8%80%E3%81%AE%E4%BF%9D%E9%9A%9C%E3%81%A8%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E6%94%AF%E6%8F%B4%EF%BC%89">メリット（万が一の保障とスキルアップ支援）</h4>
<ul>
<li>一定の条件を満たすことで、失業時や、育児・介護休業時などに、給付金を受け取ることができる</li>
<li>スキルアップを目的とした「教育訓練給付」などの支援制度を利用できるようになる</li>
</ul>
<h4 id="%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%EF%BC%88%E4%BF%9D%E9%99%BA%E6%96%99%E8%B2%A0%E6%8B%85%E3%81%AB%E3%82%88%E3%82%8B%E6%89%8B%E5%8F%96%E3%82%8A%E9%A1%8D%E3%81%AE%E6%B8%9B%E5%B0%91%EF%BC%89">デメリット（保険料負担による手取り額の減少）</h4>
<ul>
<li>毎月の給与から雇用保険料が差し引かれるため、手取り額が減少する<br>
と言っても、一般の事業の雇用保険料率（労働者負担）は現在0.5％なので、給与支給額が50,000円の場合の雇用保険料は250円です。<br>
参照元：<a href="https://www.mhlw.go.jp/content/001672589.pdf">令和8(2026)年度 雇用保険料率のご案内｜厚生労働省</a></br></br></li>
</ul>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>2028年10月1日施行ですので、まだ先ではありますが、「週10時間以上」という新しい基準を念頭に置き、今後の働き方を考える参考にしていただければ幸いです！</p>
<p>※本記事は2026年3月24日時点の情報を元に作成しています。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[合宿を通じた取り組み]]></title><description><![CDATA[1. はじめに：期初に「全員」で集まる理由
私たちの会社では、半期に一度、新しい期のスタートに合わせて社員全員が参加する、1泊2日の全社合宿、名付けて「AP合宿」なるものを開催しています。

熱海や湯河原などの温泉地に足を運び、日常のオフィスや自宅から離れた環境で、心身ともにリフレッシュしながら議論を深める時間を大切にしています。

現在、私たちはフルリモートワークが可能な環境で業務を行っています。画面越しでも円滑に仕事が進む一方で、全員が同じ場所に集まり、直接顔を合わせる機会は決して多くありません。だからこそ、この合宿は私たちにとって、単なる会議の場としてだけではなく、対面でのコミュニケーションを通じて組織の連携を再確認する貴重な機会でもあるのです。

（なお、「旅」としてのワクワク感を楽しんでもらえるよう、人事として「合宿のしおり」を作成しており、部屋割りの発表なども含めた恒例行事として定着しています。）

本記事では、1日目、2日目とそれぞれの行程を追いながら、今回のAP合宿で具体的にどのような議論が行われ、それが組織にどのような変化をもたらしたのか、人事の視点からそのプロセスを]]></description><link>https://tech.anti-pattern.co.jp/train-camp-2026-winter/</link><guid isPermaLink="false">Ghost__Post__69c2228c71fa390001b363c6</guid><dc:creator><![CDATA[Hina Takahashi]]></dc:creator><pubDate>Wed, 01 Apr 2026 01:42:34 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/--------.png" medium="image"/><content:encoded><![CDATA[<h2 id="1-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB%EF%BC%9A%E6%9C%9F%E5%88%9D%E3%81%AB%E3%80%8C%E5%85%A8%E5%93%A1%E3%80%8D%E3%81%A7%E9%9B%86%E3%81%BE%E3%82%8B%E7%90%86%E7%94%B1">1. はじめに：期初に「全員」で集まる理由</h2><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/--------.png" alt="合宿を通じた取り組み"/><p>私たちの会社では、半期に一度、新しい期のスタートに合わせて社員全員が参加する、1泊2日の全社合宿、名付けて「AP合宿」なるものを開催しています。</p><p>熱海や湯河原などの温泉地に足を運び、日常のオフィスや自宅から離れた環境で、心身ともにリフレッシュしながら議論を深める時間を大切にしています。</p><p>現在、私たちはフルリモートワークが可能な環境で業務を行っています。画面越しでも円滑に仕事が進む一方で、全員が同じ場所に集まり、直接顔を合わせる機会は決して多くありません。だからこそ、この合宿は私たちにとって、単なる会議の場としてだけではなく、対面でのコミュニケーションを通じて組織の連携を再確認する貴重な機会でもあるのです。</p><p>（なお、「旅」としてのワクワク感を楽しんでもらえるよう、人事として「合宿のしおり」を作成しており、部屋割りの発表なども含めた恒例行事として定着しています。）</p><p>本記事では、1日目、2日目とそれぞれの行程を追いながら、今回のAP合宿で具体的にどのような議論が行われ、それが組織にどのような変化をもたらしたのか、人事の視点からそのプロセスを振り返ります。</p><h2 id="2-%E3%80%901%E6%97%A5%E7%9B%AE%E3%80%91%E5%89%8D%E6%9C%9F%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%A8%E3%80%81%E4%BB%8A%E6%9C%9F%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E7%AD%96%E5%AE%9A">2. 【1日目】前期の振り返りと、今期ロードマップの策定</h2><p>合宿の初日は、全員が今の率直な気持ちを話す「チェックイン」からスタートします。その後、代表から経営概況の共有を受け、会社全体の現在地を全員で目線合わせすることから議論が始まります。</p><p>午後のメインセッションは、各事業部ごとのワークです。ここでは単なる活動報告に留まらず、前期に掲げた目標に対してどのような成果を出せたのか、その達成度やプロセスをフラットに評価し合う時間を設けています。</p><p>自分たちの動きを客観的に振り返り、それが会社全体にどのようなインパクトを与えたのかを棚卸しする。期初にこの時間を設けることで、今期の目標やロードマップも、より精度の高い、<strong>自分たちの手で描き出した納得感のあるものへと繋がっていきます。</strong></p><p>一人ひとりがチーム、そして全社における役割と、新期に向けた責任を再確認する、非常に密度の濃い時間となりました。</p><h2 id="3-%E3%80%902%E6%97%A5%E7%9B%AE%E3%80%91%E3%80%8C%E6%9C%AA%E6%9D%A5%E3%80%8D%E3%82%92%E7%B9%8B%E3%81%8E%E3%80%81%E7%B5%84%E7%B9%94%E3%81%AE%E5%A3%81%E3%82%92%E8%B6%8A%E3%81%88%E3%82%8B">3. 【2日目】「未来」を繋ぎ、組織の壁を越える</h2><p>2日目は、自身の専門領域の垣根を越えて、会社全体の連携をさらに深めるための対話を行います。ここで活用しているのが「ワールドカフェ」という形式です。</p><blockquote><strong>ワールドカフェとは？</strong>メンバーを入れ替えながら、リラックスした雰囲気で少人数の対話を重ねる手法です。多くの人と意見を交わすことで、組織全体に知識やアイデアを循環させることができます。</blockquote><p>私たちの組織は、スタートアップでありながら複数事業を並行して展開しているのが大きな特徴です。日々の業務では各メンバーがメインで担当する事業に注力していますが、こうした合宿の場を活かすことで、<strong>小規模な組織ならではの機動力を保ちつつ、事業を横断したシナジーを最大化させていきたいと考えています。</strong></p><p>この日のメインコンテンツは、前日の振り返りを踏まえた「事業ビジョン」「バリュープロポジション」「ロードマップ」の策定です。まずは各チームでこれらを徹底的に考え抜き、自分たちの進むべき方向を言語化します。</p><p>議論の中では、弊社の一事業である<a href="https://saasus.io/">SaaSus Platform</a>に対して個人がどのような想いで向き合っているかを語り合う場面もありました。「日本の国力を上げたい」「開発者への敬意を感じるサービスにしたい」といった、普段の業務連絡ではなかなか出てこない個々の熱い視点に触れられたのは、非常に印象的なシーンでした。</p><p>その上でワールドカフェ形式を取り入れ、あえて担当の異なるメンバーを交えて意見交換を行いました。普段、別の事業に向き合っているメンバーがシャッフルされ、客観的な視点でフィードバックを送り合う。このプロセスを通じて、自分たちだけでは気づけなかった他事業との連携の種や、共通の課題、そして新たな顧客価値のエッセンスが取り込まれていきます。</p><p>こうした他チームからのフィードバックを反映させ、内容を最終化していきます。事業部を超えて会社全体で価値を最大化させるために、<strong>この合宿を通じて拍車をかけていくのです。</strong></p><p>合宿の締めくくりとして行われた各チームの最終発表では、各事業のロードマップが全社的な整合性の取れたものへと磨かれ、組織全体の「共通言語」へと進化していく実感がありました。</p><h2 id="4-%E5%A4%89%E5%8C%96%EF%BC%9A%E5%90%88%E5%AE%BF%E3%81%8C%E3%82%82%E3%81%9F%E3%82%89%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE">4. 変化：合宿がもたらしたもの</h2><p>合宿を経て感じているのは、組織のあちこちで「連携の土台」が着実に整い始めていることです。</p><p>こうした変化は、合宿が終わってすぐに劇的な形になるものばかりではありません。しかし、リアルで膝を突き合わせて議論した経験は、リモート環境に戻った後もじわじわと効いてくる大きな財産になっているように感じます。</p><p>特に感じていることを下記にて挙げてみました。</p><ul><li><strong>他チームへの解像度の向上：</strong> 普段担当していない事業の背景や意図を肌で感じたことで、事業部を跨いだコミュニケーションがよりスムーズになりました。</li><li><strong>チーム内の足並みの強化：</strong> 日頃から活動を共にするメンバー間でも、改めて対面でビジョンを共有したことで、新期に向けた結束力がさらに高まりました。</li><li><strong>会社としての一体感：</strong> 複数の事業が並行して動く中で、全員が「一つの組織」として同じ方向を向いているという感覚を共有できました。</li></ul><p>日常のやり取りにおいても、情報の汲み取りがスムーズになったり、各所でオーナーシップが育まれたりと、小さな変化が積み重なっているように思います。今回の合宿で芽吹いた「共通言語」を大切にしながら、これから生まれてくる事業間のシナジーを丁寧に育てていければと思います。</p><h2 id="5-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">5. おわりに</h2><p>人事として何より価値を感じるのは、こうした場を通じて「個の目標」が「組織の目標」へと昇華されていくプロセスです。</p><p>制度や仕組みを整えるだけでなく、こうした「顔の見える関係性」の中で本質的な対話を積み重ねることが、強い組織を作る大事な基盤になると信じています。合宿で描いたロードマップを胸に、今期もチーム一丸となって取り組んでまいります。</p>]]></content:encoded></item><item><title><![CDATA[SaaSus API が Postman に登場！APIの実行が気軽に行えるようになりました]]></title><description><![CDATA[SaaS 開発の認証やマルチテナント管理を支える SaaSus Platform。 これまで API
の仕様を確認するには、ドキュメントを読み込み、コードを書いて実行する必要がありました。

この度、SaaSus API が Postman パブリックワークスペースに登場しました！ 

Postman
[https://www.postman.com/anti-pattern-inc/saasus-platform?sideView=agentMode]1.
Postman で公開されると何が嬉しいのか？
Postman パブリックワークスペースを利用することで、従来の開発フローにおける「手間」が以下のように解消されます。

 * 認証設定の共通化: API キーなどの認証ヘッダー設定がテンプレート化されているため、設定ミスを防げます。
 * 最新仕様が常に手元に: 公式のワークスペースを Fork すれば、常に最新のエンドポイント定義を同期して利用できます。

2. 最短で API を実行
以下の手順で、すぐに SaaSus API を手元で試せます。

 1. ワークスペースへアク]]></description><link>https://tech.anti-pattern.co.jp/su-bao-saasus-api-ga-postman-nideng-chang-jian-zheng-garai/</link><guid isPermaLink="false">Ghost__Post__69ba0eb771fa390001b361f1</guid><category><![CDATA[SaaSus Platform]]></category><category><![CDATA[Postman]]></category><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Tue, 31 Mar 2026 03:46:15 GMT</pubDate><content:encoded><![CDATA[<p>SaaS 開発の認証やマルチテナント管理を支える SaaSus Platform。 これまで API の仕様を確認するには、ドキュメントを読み込み、コードを書いて実行する必要がありました。</p><p>この度、SaaSus API が Postman パブリックワークスペースに登場しました！ </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.postman.com/anti-pattern-inc/saasus-platform?sideView&#x3D;agentMode"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Postman</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.postman.com/_ar-assets/images/favicon-1-48.png"/></div></div></a></figure><h2 id="1-postman-%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E4%BD%95%E3%81%8C%E5%AC%89%E3%81%97%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F">1. Postman で公開されると何が嬉しいのか？</h2><p>Postman パブリックワークスペースを利用することで、従来の開発フローにおける「手間」が以下のように解消されます。</p><ul><li><strong>認証設定の共通化:</strong> API キーなどの認証ヘッダー設定がテンプレート化されているため、設定ミスを防げます。</li><li><strong>最新仕様が常に手元に:</strong> 公式のワークスペースを Fork すれば、常に最新のエンドポイント定義を同期して利用できます。</li></ul><h2 id="2-%E6%9C%80%E7%9F%AD%E3%81%A7-api-%E3%82%92%E5%AE%9F%E8%A1%8C">2. 最短で API を実行</h2><p>以下の手順で、すぐに SaaSus API を手元で試せます。</p><!--kg-card-begin: markdown--><ol>
<li>
<p><strong>ワークスペースへアクセス:</strong> [<a href="https://www.postman.com/anti-pattern-inc/saasus-platform?sideView=agentMode">SaaSus Postman Public Workspace</a>]を開きます。</p>
</li>
<li>
<p><strong>コレクションを Fork:</strong> 自分のワークスペースにコレクションをFork（複製）します。</p>
</li>
<li>
<p><strong>環境変数の設定:</strong> <code>Environment</code>で<code>SaaSID</code>, <code>APIKey</code>, <code>SecretKey</code> などの必須項目を入力します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/image-10.png" alt="Postmanの環境変数設定画面。SaaSID、APIKey、SecretKeyの入力フィールドが強調されています。" loading="lazy"/></p>
</li>
<li>
<p><strong>Send ボタンをクリック:</strong> 実行したいエンドポイントを選んで（必要に応じてパスパラメーターや Body を入力し）「Send」を押すだけで、レスポンスが返ってきます。</p>
</li>
</ol>
<!--kg-card-end: markdown--><h2 id="3-%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%80%8C%E6%9C%80%E5%88%9D%E3%81%AE%E4%B8%80%E6%AD%A9%E3%80%8D">3. おすすめの「最初の一歩」</h2><p>まずは以下の API から試してみるのがおすすめです。</p><p><strong>Get Basic Configurations [</strong><a href="https://docs.saasus.io/ja/docs/reference/auth-api#tag/basicInfo/operation/GetBasicInfo"><strong>doc</strong></a><strong>]</strong><br>SaaSus Platform に設定されている基本設定情報の取得</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/image.png" class="kg-image" alt="" loading="lazy" width="2000" height="944" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/image.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/image.png 2034w" sizes="(min-width: 720px) 720px"/></figure><p><strong>Get Tenants [<a href="https://docs.saasus.io/ja/docs/reference/auth-api#tag/tenant/operation/GetTenants">doc</a>]</strong><br>SaaSus Platform で管理する、テナント情報の取得</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/image-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="1288" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/image-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/image-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/image-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/image-1.png 2034w" sizes="(min-width: 720px) 720px"/></figure><h2 id="4-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96">4. ワークフローの自動化</h2><p>一連の処理を自動化し、例えば CSV のユーザー一覧を読み込み、「ユーザー一括登録」→「テナントに割り当て」→「役割登録」といった一連の流れを、ボタン一つで実行（Collection Runner）できます。</p><p>これにより、SaaS の初期フェーズにおいて管理画面などを個別に開発する必要がなくなり、手作業による運用負荷を大幅に下げることにつながります。 開発リソースを本質的な機能開発に集中させつつ、複雑な設定変更やデータ投入をミスなく迅速に行えるようになります。</p><h2 id="5-%E3%81%BE%E3%81%A8%E3%82%81">5. まとめ</h2><p>今回の Postman 公開によって、単発の API 検証から複雑なワークフローの構築まで、SaaSus を活用した開発のリードタイムがさらに短縮されます。</p><p>Postman は単なる検証用にとどまらず、「簡易的な運用管理ツール」としても非常に強力です。管理画面が未整備なフェーズでも、Postman を介して柔軟にテナントやユーザー操作を行うことで、運用のアジリティを高めることができます。</p><p>仕様の確認、デバッグ、そして効率的な運用ツールとして、ぜひ Postman パブリックワークスペースをフル活用してください！</p><p/>]]></content:encoded></item><item><title><![CDATA[ネットワーク機器が恋しくて その２]]></title><description><![CDATA[前回でCiscoの機器をいじり放題になったので、
機器をいじりながらプロトコルの勉強をしていきたいと思います。
今回はARP（Address Resolution Protocol）です。

ARPとは、OSI参照モデルの2層目のデータリンク層の通信をする際に利用するプロトコルで、IPアドレスからMACアドレスを取得するために利用します。
通信相手の識別にIPアドレスを利用する事が多いと思います。
例）PC0(192.168.0.1)からPC1(192.168.0.2)への通信など

ですが、実はIPアドレスだけではパケットを届けることはできません。同じネットワーク内にいる機器同士は「MACアドレス」を頼りに通信するからです。

そこで登場するのがARPです。
「このIPアドレスの人は、どのMACアドレスを持ってますかー！？」と聞き回る、ネットワーク界の聞き込み調査員のようなプロトコルです。

さっそく、実際の通信を見ていきましょう。ハブをおいて、PCが複数台つながっているネットワークを用意します。

Cisco Catalyst 2960には特に設定しません。
PCは以下のように設定]]></description><link>https://tech.anti-pattern.co.jp/network-ga-koishikute2/</link><guid isPermaLink="false">Ghost__Post__69bf6a2671fa390001b36297</guid><category><![CDATA[Cisco]]></category><category><![CDATA[Cisco Packet Tracer]]></category><category><![CDATA[GNS3]]></category><category><![CDATA[Simulation]]></category><category><![CDATA[arp]]></category><category><![CDATA[ping]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Sun, 22 Mar 2026 04:56:46 GMT</pubDate><content:encoded><![CDATA[<p>前回でCiscoの機器をいじり放題になったので、<br>機器をいじりながらプロトコルの勉強をしていきたいと思います。<br>今回はARP（Address Resolution Protocol）です。</br></br></p><p>ARPとは、OSI参照モデルの2層目のデータリンク層の通信をする際に利用するプロトコルで、IPアドレスからMACアドレスを取得するために利用します。<br>通信相手の識別にIPアドレスを利用する事が多いと思います。<br>例）PC0(192.168.0.1)からPC1(192.168.0.2)への通信など</br></br></p><p>ですが、実はIPアドレスだけではパケットを届けることはできません。同じネットワーク内にいる機器同士は「MACアドレス」を頼りに通信するからです。</p><p>そこで登場するのがARPです。 「このIPアドレスの人は、どのMACアドレスを持ってますかー！？」と聞き回る、ネットワーク界の聞き込み調査員のようなプロトコルです。</p><p>さっそく、実際の通信を見ていきましょう。ハブをおいて、PCが複数台つながっているネットワークを用意します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.09.54.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.09.54.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-12.09.54.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-12.09.54.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.09.54.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>Cisco Catalyst 2960には特に設定しません。<br>PCは以下のように設定します。<br>PC0<br>　IPv4 Address:192.168.0.1<br>　Subnet Mask:255.255.255.0<br>PC1<br>　IPv4 Address:192.168.0.2<br>　Subnet Mask:255.255.255.0<br>PC2<br>　IPv4 Address:192.168.0.3<br>　Subnet Mask:255.255.255.0<br>※設定方法わからない人は、前回の記事見ていただけるとわかります。<br>　<a href="https://tech.anti-pattern.co.jp/network-ga-koishikute/">https://tech.anti-pattern.co.jp/network-ga-koishikute/</a></br></br></br></br></br></br></br></br></br></br></br></br></p><p>IPアドレスとMACアドレスを確認していきます。<br>コマンドプロンプトを開いて、「ipconfig /all」で確認します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.10.37.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.10.37.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.10.37.png 812w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.11.50.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.11.50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.11.50.png 812w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.12.02.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.12.02.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.12.02.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>PC0からPC1にpingをします。通信の中でIPアドレスからMACアドレス取得が必要となり、ARP通信が発生するのでそれを見ていきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.59.41.png" class="kg-image" alt="" loading="lazy" width="1920" height="1049" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.59.41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-12.59.41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-12.59.41.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.59.41.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>PC0で通信が発生したのが確認できます。通信内容の詳細を見てみます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.26.55.png" class="kg-image" alt="" loading="lazy" width="501" height="635"/></figure><p>メッセージを見ると、ARP Packetと書いてあるので、ARP通信であることが確認できます。<br>送信元は0001.6339.2D43(PC0)、送信先はFFFF.FFFF.FFFF（全員宛の通信）となっています。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.59.50.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-12.59.50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-12.59.50.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-12.59.50.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-12.59.50.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>ARP通信がハブに届きました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.14.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.14.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.14.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.14.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.14.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>ハブからネットワーク全体（PC1とPC2）に通信を送っています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.19.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.19.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.19.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.19.png 2032w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.34.30.png" class="kg-image" alt="" loading="lazy" width="501" height="621"/></figure><p>IPアドレスが一致するPC1だけがARPに応答します。<br>PC2にもパケットが届いていますが、PC2は『自分宛（192.168.0.2）じゃないな』と判断して、このパケットを静かに破棄しています。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.25.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.25.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.25.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.25.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.25.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>PC0にARP通信が帰ってきました。この時点でPC0は、IPアドレス192.168.0.2のMACアドレスが000D.BD02.95E8であることを認識します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.40.54.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.40.54.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.40.54.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>この情報はARPテーブルに保存され、しばらく記憶されます。なので通信のたびにARPが発生するわけではありません。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.31.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.31.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.31.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>この後の通信の流れも見ていきます。<br>ARP通信が終わり、次はpingの通信となります。PC1に届いて、返信がPC1に帰ってきます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.36.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.36.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.36.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.36.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.36.png 2032w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.42.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.42.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.42.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.42.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.42.png 2032w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.48.png" class="kg-image" alt="" loading="lazy" width="2000" height="1143" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.00.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/03/----------2026-03-22-13.00.48.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2026/03/----------2026-03-22-13.00.48.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.00.48.png 2032w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.44.49.png" class="kg-image" alt="" loading="lazy" width="501" height="593"/></figure><p>これがPC0からPC1への通信内容になります。MACアドレスを知っているので、PC1のMACアドレスへの通信となっています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.45.12.png" class="kg-image" alt="" loading="lazy" width="501" height="593"/></figure><p>もう少し通信内容を詳細に見ていきます。<br>pingの通信はICMPを利用するので、通信内容がICMPとなっています。TYPEが0x08となっています。これはICMPのエコー要求（ICMP届いたら返事してね）という意味になります。<br>詳しくはこちら<br><a href="https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-types">https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-types</a></br></br></br></p><p>次はPC1からPC0の通信を見てみます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.52.59.png" class="kg-image" alt="" loading="lazy" width="501" height="593"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.53.04.png" class="kg-image" alt="" loading="lazy" width="501" height="593"/></figure><p>TYPEが0x00となっています。これはICMPのエコー応答（ICMP届いたのでお返事ですよ）という意味になります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.01.19.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/03/----------2026-03-22-13.01.19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/03/----------2026-03-22-13.01.19.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>これらの通信が裏側で実施されることで、上記のpingコマンドが動作することが確認できました。今回はここまでです。</p>]]></content:encoded></item><item><title><![CDATA[Bedrock Prompt Routerによりどれくらいコスト削減ができるのかを検証してみた]]></title><description><![CDATA[こんにちは。APでエンジニアインターンをしている鈴木鴻太です。

今回は、AWS Bedrock の Prompt Router を実装し、実際に複数のLLM
を最適に振り分ける仕組みがどれだけのコスト削減を実現できるのかを、ベンチマーク結果を通じて検証してみました。

Bedrock Prompt Router とは？
概要
Bedrock Prompt Router は、ユーザーのクエリに基づいて複数の LLM の応答品質を自動予測
し、最適なモデルを自動選択する仕組みです。これにより品質を維持しながらコストを削減できます。

AWS の公式ドキュメントはこちら：

 * AWS Bedrock Prompt Router API Reference
   [https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetPromptRouter.html]
 * 詳細解説記事（AWS ブログ）
   [https://aws.amazon.com/jp/blogs/machine-learning/use-amazon]]></description><link>https://tech.anti-pattern.co.jp/bedrock-prompt-routerniyoridorekuraikosutoxue-jian-gadekirunokawojian-zheng-sitemita/</link><guid isPermaLink="false">Ghost__Post__69597e6971fa390001b35dbd</guid><dc:creator><![CDATA[kou135]]></dc:creator><pubDate>Wed, 21 Jan 2026 11:50:36 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。APでエンジニアインターンをしている鈴木鴻太です。</p><p>今回は、AWS Bedrock の <strong>Prompt Router </strong>を実装し、実際に複数のLLM を最適に振り分ける仕組みがどれだけのコスト削減を実現できるのかを、ベンチマーク結果を通じて検証してみました。</p><h2 id="bedrock-prompt-router-%E3%81%A8%E3%81%AF%EF%BC%9F">Bedrock Prompt Router とは？</h2><h2 id="%E6%A6%82%E8%A6%81">概要</h2><p>Bedrock Prompt Router は、ユーザーのクエリに基づいて複数の LLM の応答品質を<strong>自動予測</strong>し、最適なモデルを自動選択する仕組みです。これにより品質を維持しながらコストを削減できます。</p><p>AWS の公式ドキュメントはこちら：</p><ul><li><a href="https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetPromptRouter.html" rel="nofollow noopener">AWS Bedrock Prompt Router API Reference</a></li><li><a href="https://aws.amazon.com/jp/blogs/machine-learning/use-amazon-bedrock-intelligent-prompt-routing-for-cost-and-latency-benefits/" rel="nofollow noopener">詳細解説記事（AWS ブログ）</a></li></ul><h2 id="%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF">ルーティングの仕組み</h2><p>興味深い点として、Prompt Router は LLM そのものではなく、<strong>AWS が独自に開発した機械学習モデル</strong> で動作しています。各プロンプトに対して、複数の候補モデルの仮想的なレスポンス品質を予測してくれます。</p><p>ざっくり言うと以下のようなイメージです：</p><p><code>品質指標 = f(プロンプト内容, モデル特性, 過去トレーニングデータ)</code></p><p>つまり、各プロンプトの複雑度やタスク種別を自動判定し、「このクエリなら安くて軽い Haiku で十分」「こっちは高品質の Sonnet が必要」という判断を<strong>予測スコア</strong>ベースで行うわけです。</p><hr><h2 id="llm-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A8%E3%81%AF%EF%BC%9F">LLM におけるトークンとは？</h2><p>コスト削減の話に入る前に、トークンという概念を整理しておきましょう。</p><h2 id="%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%AE%9A%E7%BE%A9">トークンの定義</h2><p>LLM が処理する最小単位がトークンです。</p><p>LLM は英語や日本語をそのまま処理するのではなく、機械語として処理しています。その最小単位を「トークン」と呼びます。</p><p><strong>トークン化のざっくりした目安：</strong></p><ul><li>英語：1単語 ≈ 1トークン</li><li>日本語：1文字 ≈ 1トークン</li></ul><h2 id="2%E3%81%A4%E3%81%AE%E7%A8%AE%E9%A1%9E">2つの種類</h2><p>LLM のトークン処理は大きく2つに分かれます：</p><ol><li><strong>入力トークン</strong> ：ユーザーのクエリを処理するために必要</li><li><strong>出力トークン</strong> ：LLM が生成する応答に含まれる</li></ol><p>トークン処理量が増えると、それだけ CPU や GPU の演算処理が必要になり、結果として <strong>コストが増加</strong> します。</p><h2 id="%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8C%96%E3%81%AE%E4%BD%93%E9%A8%93">トークン化の体験</h2><p>以下のページで、実際のテキストがどのようにトークン化されるかを体験できます：<br><a href="https://platform.openai.com/tokenizer" rel="nofollow noopener">OpenAI Tokenizer</a></br></p><h2 id="llm-api-%E3%81%AE%E6%96%99%E9%87%91%E4%BD%93%E7%B3%BB">LLM API の料金体系</h2><p>LLM を API として利用する場合、多くの料金形態は 「リクエスト数」ではなく「トークン量」 で設定されていますが、トークンの概念を把握すると納得できるかと思います。そして品質を保ちながらコストを抑えることの重要性が、ここから見えてきます。</p><hr><h2 id="%E6%A4%9C%E8%A8%BC%E6%96%B9%E9%87%9D%EF%BC%9A%E4%BD%95%E3%82%92%E6%B8%AC%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F">検証方針：何を測るのか？</h2><p>「品質を維持しながらコストを削減できる」という Prompt Router の目的のうち、<strong>「コスト削減」</strong> に焦点を当てます。品質は AWS が担保している前提で進めます。</p><h2 id="%E4%BB%8A%E5%9B%9E%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8">今回検証しないこと</h2><ul><li>Router を使用した時の <strong>品質</strong></li></ul><h2 id="%E4%BB%8A%E5%9B%9E%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">今回検証すること</h2><ul><li><strong>コスト削減率</strong></li></ul><hr><h2 id="%E6%A4%9C%E8%A8%BC%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">検証の全体像について</h2><h2 id="0%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99">0:事前準備</h2><p>TypeScript で構築し、以下の2つのモデルを用いる Prompt Router を作成しました：</p><ul><li><strong>Claude 3.5 Sonnet v2</strong>（高品質・高コスト）</li><li><strong>Claude 3 Haiku</strong>（軽量・低コスト）</li></ul><p>Router の作成は、AWS Bedrock コンソールから可能です。</p><p>作成後、以下のように CDK に組み込みます：</p><!--kg-card-begin: markdown--><p><code>const promptRouterArn = new cdk.CfnParameter(this, 'PromptRouterArn', {  type: 'String',  description: 'Bedrock Prompt Router ARN',  default: '作成したARNを貼り付ける'});</code></p>
<!--kg-card-end: markdown--><h2 id="1%E3%83%86%E3%82%B9%E3%83%88%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E6%BA%96%E5%82%99">1:テストプロンプトの準備</h2><p>100個のテストプロンプトを JSON 形式で用意しました。難易度別（easy, medium, hard）、カテゴリ別（general, customer_support, technical）に分散させています：</p><p><code>{"id": "001", "prompt": "今日は何曜日ですか", "category": "general", "difficulty": "easy"},{"id": "002", "prompt": "東京の天気は？", "category": "general", "difficulty": "easy"},{"id": "003", "prompt": "1+1は？", "category": "general", "difficulty": "easy"},... （略）</code></p><p>後半になるにつれ難易度が高くなるように設計しました。</p><h2 id="2%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%AE%E8%A8%88%E6%B8%AC">2:メトリクスの計測</h2><p>Lambda 関数内で、各プロンプトに対して以下を計測：</p><p><code>const result = {  id,</code><br><code>prompt: prompt.substring(0, 50),</code><br><code>category,</code><br><code>difficulty,</code><br><code>selectedModel: response.data.selectedModel,       <em>// どのモデルが選ばれたか</em>  </code><br><code>latency: response.data.metrics.latency,           <em>// レスポンス時間（ms）</em>  inputTokens: response.data.metrics.inputTokens,   <em>// 入力トークン数</em>  outputTokens: response.data.metrics.outputTokens, <em>// 出力トークン数</em>  totalTokens: response.data.metrics.totalTokens,   <em>// 合計</em>};</code></br></br></br></br></br></p><p>結果を JSON ファイルに出力：</p><p><code>{  "id": "001",  "prompt": "今日は何曜日ですか",  "category": "general",  "difficulty": "easy",  "selectedModel": "Haiku",  "latency": 556.494491,  "inputTokens": 32,  "outputTokens": 13,  "totalTokens": 45}... （略）</code></p><h2 id="3%E4%B8%A1%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%A7%E3%81%AE%E6%AF%94%E8%BC%83%E8%A8%88%E7%AE%97">3:両ケースでの比較計算</h2><p><strong>ケース1：Router を使用</strong><br>Haiku と Sonnet が自動振り分けされた結果</br></p><p><strong>ケース2：Sonnet 固定</strong><br>すべてのリクエストを Claude Sonnet で処理した場合</br></p><p><strong>計算対象：</strong></p><ul><li>平均レイテンシ（ms）</li><li>入力トークン × 単価 + 出力トークン × 単価 = 総コスト</li></ul><h2 id="%E6%96%99%E9%87%91%E8%A1%A8%EF%BC%9A%E3%83%A2%E3%83%87%E3%83%AB%E5%88%A5%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8D%98%E4%BE%A1">料金表：モデル別トークン単価</h2><h2 id="claude-35-sonnet">Claude 3.5 Sonnet</h2><!--kg-card-begin: html--><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t" style="box-sizing: border-box; border-width: 1px 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: separate; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; width: 740px; table-layout: auto; text-align: start; margin-top: 1em; margin-bottom: 1em; font-size: 0.875em; line-height: 1.71429; border-spacing: 0px;"><thead class="bg-subtler" style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; background-color: oklch(0.4933 0.019 171.99 / 0.1);"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0px 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">種別</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">100万トークンあたり</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em 0px; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">1トークンあたり</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">入力</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$3.00</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.000003</td></tr><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">出力</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$15.00</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.000015</td></tr></tbody></table><!--kg-card-end: html--><h2 id="claude-3-haiku">Claude 3 Haiku</h2><!--kg-card-begin: html--><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t" style="box-sizing: border-box; border-width: 1px 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: separate; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; width: 740px; table-layout: auto; text-align: start; margin-top: 1em; margin-bottom: 1em; font-size: 0.875em; line-height: 1.71429; border-spacing: 0px;"><thead class="bg-subtler" style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; background-color: oklch(0.4933 0.019 171.99 / 0.1);"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0px 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">種別</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">100万トークンあたり</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em 0px; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">1トークンあたり</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">入力</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.25</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.00000025</td></tr><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">出力</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$1.25</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.00000125</td></tr></tbody></table><!--kg-card-end: html--><hr><h2 id="4%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E7%B5%90%E6%9E%9C">4:ベンチマーク結果</h2><p>100リクエストを処理した結果です。</p><h2 id="router-%E4%BD%BF%E7%94%A8%E6%99%82%EF%BC%885%E5%93%81%E8%B3%AA%E5%A6%A5%E5%8D%94%EF%BC%89">Router 使用時（5%品質妥協）</h2><p><code>✓ 001 [easy ] Haiku | Latency: 556ms | Tokens: 45 ✓ 002 [easy ] Haiku | Latency: 1766ms | Tokens: 185 ✓ 003 [easy ] Haiku | Latency: 585ms | Tokens: 38 ✓ 004 [easy ] Haiku | Latency: 2893ms | Tokens: 305 ✓ 005 [easy ] Haiku | Latency: 2623ms | Tokens: 278 ... （略）</code></p><h2 id="%E9%9B%86%E8%A8%88%E7%B5%90%E6%9E%9C">集計結果</h2><!--kg-card-begin: html--><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t" style="box-sizing: border-box; border-width: 1px 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: separate; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; width: 740px; table-layout: auto; text-align: start; margin-top: 1em; margin-bottom: 1em; font-size: 0.875em; line-height: 1.71429; border-spacing: 0px;"><thead class="bg-subtler" style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; background-color: oklch(0.4933 0.019 171.99 / 0.1);"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0px 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">指標</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Router 使用時</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Sonnet 固定時</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em 0px; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">差分</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">Haiku トークン合計</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">16,509</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">0</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">-16,509</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">Sonnet トークン合計</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">16,997</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">28,272</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">+11,275</td></tr><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">全体トークン合計</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">33,506</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">28,272</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">-5,234 (-15.6%)</strong></td></tr></tbody></table><!--kg-card-end: html--><h2 id="%E3%82%B5%E3%83%9E%E3%83%AA%E3%83%BC">サマリー</h2><p>・モデルの振り分け：Haiku 47件（47%） | Sonnet 53件（53%）<br>・応答速度：平均4,179ms（最速556ms〜最遅17,142ms）</br></p><p>タスクカテゴリ別：<br>├─一般: 35件 | 平均3,687ms | 平均コスト$0.0022<br>├─カスタマーサポート: 31件 | 平均3,870ms | 平均コスト$0.0027<br>└─技術系: 34件 | 平均4,966ms | 平均コスト$0.0035</br></br></br></p><p>タスク難易度別Haikuモデルの使用率<br>├─簡単: 35件 | 平均2,536ms | Haiku 69%<br>├─中級: 32件 | 平均4,992ms | Haiku 44%<br>└─困難: 33件 | 平均5,132ms | Haiku 27%</br></br></br></p><h2 id="sonnet-%E5%9B%BA%E5%AE%9A%E6%99%82%EF%BC%88100%E5%93%81%E8%B3%AA%E4%BF%9D%E8%A8%BC%EF%BC%89">Sonnet 固定時（100%品質保証）</h2><p>すべてのリクエストを Claude Sonnet 3.5 で処理した場合：</p><p><code>✓ 001 [easy ] Sonnet | Latency: 1913ms | Tokens: 102 ✓ 002 [easy ] Sonnet | Latency: 1935ms | Tokens: 101 ✓ 003 [easy ] Sonnet | Latency: 653ms | Tokens: 34 ... （中略）</code></p><h2 id="%E3%82%B5%E3%83%9E%E3%83%AA%E3%83%BC-1">サマリー</h2><p>応答速度：平均4,516ms（最速653ms〜最遅17,405ms）</p><p>タスクカテゴリ別：<br>├─一般: 35件 | 平均3,977ms | 平均コスト$0.0031<br>├─カスタマーサポート: 31件 | 平均3,875ms | 平均コスト$0.0032<br>└─技術系: 34件 | 平均5,655ms | 平均コスト$0.0048</br></br></br></p><p>タスク難易度別：<br>├─簡単: 35件 | 平均2,966ms<br>├─中級: 32件 | 平均5,128ms<br>└─困難: 33件 | 平均5,567ms</br></br></br></p><p>上記から、Router は easy〜medium くらいのタスクをうまく Haikuモデル に逃がしつつ、全体のレイテンシとコストを抑えている一方でSonnet固定は常に安定した品質を出せるが、その分オーバースペックなケースでも高コスト・やや高レイテンシになるといった構図が、結果から読み取れました。詳しいコスト計算については下で行なっています。</p><hr><h2 id="%E8%80%83%E5%AF%9F%EF%BC%9A%E3%82%B3%E3%82%B9%E3%83%88%E3%83%BB%E3%83%AC%E3%82%A4%E3%83%86%E3%83%B3%E3%82%B7%E3%81%AE%E8%A9%B3%E7%B4%B0%E5%88%86%E6%9E%90">考察：コスト・レイテンシの詳細分析</h2><h2 id="%E3%82%B3%E3%82%B9%E3%83%88%E8%A8%88%E7%AE%97">コスト計算</h2><p><strong>Router 使用時：</strong></p><p><code>16,509 × $0.00000125 (Haiku 出力) + 16,997 × $0.000015 (Sonnet 出力) = $0.2807</code></p><p><strong>Sonnet 固定時：</strong></p><p><code>28,272 × $0.000015 (Sonnet 出力) = $0.4241</code></p><h2 id="%E5%89%8A%E6%B8%9B%E7%8E%87">削減率</h2><p><code>$0.4241 ÷ $0.2807 = 1.51倍 → コスト削減率：34% 低減</code></p><h2 id="%E3%83%AC%E3%82%A4%E3%83%86%E3%83%B3%E3%82%B7%E6%AF%94%E8%BC%83">レイテンシ比較</h2><!--kg-card-begin: html--><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t" style="box-sizing: border-box; border-width: 1px 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: separate; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; width: 740px; table-layout: auto; text-align: start; margin-top: 1em; margin-bottom: 1em; font-size: 0.875em; line-height: 1.71429; border-spacing: 0px;"><thead class="bg-subtler" style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; background-color: oklch(0.4933 0.019 171.99 / 0.1);"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0px 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">難易度別</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Router</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Sonnet固定</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">削減</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em 0px; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Router 時の Haiku 比率</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">Easy</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">2,536 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">2,966 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">-430 ms (-14.5%)</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">69%</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">Medium</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">4,992 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">5,128 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">-136 ms (-2.7%)</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">44%</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">Hard</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">5,132 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">5,567 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">-435 ms (-7.8%)</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">27%</td></tr><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">全体平均</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">4,178 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">4,516 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">-338 ms (-7.5%)</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">47%</td></tr></tbody></table><!--kg-card-end: html--><p>Router の方が全体的に 7.5% 速い です。</p><p>これは Easy タスクで Haiku の利用率が高い（69%）ため、Haiku の高速性が効いているからだと思います。Haiku はモデルとして「軽い＝推論が早い」という特性を持ち、Easy 問題では Sonnet との品質差がほぼないため、この高速化が実現されています。</p><hr><h2 id="%E4%BB%AE%E8%AA%AC%E9%95%B7%E6%9C%9F%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%A7%E3%81%AE%E5%89%8A%E6%B8%9B%E9%A1%8D%E8%A9%A6%E7%AE%97">仮説:長期スコープでの削減額試算</h2><p>自分は現在学生でエンジニアインターンとして働かせていただいているので、LLMのユースケースとしては、課題・日々の勉強・コーディング・その他諸々が考えられます。特に、コーディングエージェントのtool use系はトークン処理量が多いことを考えると、以下のようなシナリオが挙げられます。</p><ul><li>1日：10万トークン消費</li><li>1ヶ月：300万トークン</li><li>1年：3600万トークン</li></ul><p><strong>入出力の比率を 1:1</strong> と仮定（実際はプロンプトにより異なる）</p><h2 id="sonnet-%E5%9B%BA%E5%AE%9A%E3%81%AE%E5%A0%B4%E5%90%88">Sonnet 固定の場合</h2><p><code>月間コスト：150万 × $0.000015 + 150万 × $0.000003 = $27</code><br><code>年間コスト：$27 × 12 = $324</code></br></p><h2 id="router-%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AE%E5%A0%B4%E5%90%88">Router 使用時の場合</h2><p><code>削減率：34% ⇒ $324 × 34% ≈ $110削減 </code><br><code>年間実コスト：$324 - $110 = 約 $214</code></br></p><p>つまり、個人利用だけでも年間$110のコストが削減できます。</p><p>企業利用では、ユーザー数や従業員数 × 利用パターンが掛け算されるため、削減額はさらに膨らみます。例えば100人が同じシステムを利用すれば、<strong>年間約21400ドル（約350万円）</strong> の削減が可能になります。</p><hr><h2 id="%E7%B5%90%E8%AB%96">結論</h2><h2 id="router-%E5%B0%8E%E5%85%A5%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">Router 導入のメリット</h2><!--kg-card-begin: html--><table class="border-subtler my-[1em] w-full table-auto border-separate border-spacing-0 border-l border-t" style="box-sizing: border-box; border-width: 1px 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: separate; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; width: 740px; table-layout: auto; text-align: start; margin-top: 1em; margin-bottom: 1em; font-size: 0.875em; line-height: 1.71429; border-spacing: 0px;"><thead class="bg-subtler" style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; background-color: oklch(0.4933 0.019 171.99 / 0.1);"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0px 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">評価項目</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Router使用時</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">Sonnet固定時</th><th class="border-subtler p-sm break-normal border-b border-r text-left align-top" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53); font-weight: 550; vertical-align: top; padding-inline: 0.571429em 0px; overflow-wrap: normal; word-break: normal; padding: 8px; text-align: left;">優位性</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">コスト</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.2807</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">$0.3700</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">Router が<span>&nbsp;</span><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">34% 安い</strong><span>&nbsp;</span>✅</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">レイテンシ</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">4,178 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">4,516 ms</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">Router が<span>&nbsp;</span><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">7.5% 高速</strong><span>&nbsp;</span>✅</td></tr><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;;"><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0px 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;"><strong style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-weight: 475; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; color: oklch(0.9296 0.007 106.53);">品質</strong></td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">95%</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em; min-width: 48px; overflow-wrap: normal; word-break: normal;">100%</td><td class="px-sm border-subtler min-w-[48px] break-normal border-b border-r" style="box-sizing: border-box; border-width: 0px 1px 1px 0px; border-style: solid; border-color: oklch(0.9296 0.007 106.53 / 0.1); scrollbar-color: initial; scrollbar-width: initial; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; font-family: fkGroteskNeue, ui-sans-serif, system-ui, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;, &quot;Hiragino Sans&quot;, &quot;Yu Gothic&quot;, Meiryo, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Microsoft JhengHei&quot;, &quot;Apple SD Gothic Neo&quot;; vertical-align: baseline; padding: 0.571429em 8px; padding-inline: 0.571429em 0px; min-width: 48px; overflow-wrap: normal; word-break: normal;">Sonnet が 5% 高い</td></tr></tbody></table><!--kg-card-end: html--><p><strong>Router の方が、コストも応答速度も優位</strong> です。</p><hr><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>今回の検証を通じて、AWS Bedrock の Prompt Router がいかに<strong>効果的なコスト削減手法</strong>であることが実感できました。</p><p>LLM API の利用が日常化する中、「品質を維持しながらコストを削減する」という課題に対して、このような ルーティング はこれからスタンダードになっていくと考えられます。</p><p>複数の LLM を使い分ける時代では単純にずっと性能が高いモデルを使うのではなく、「タスクに応じた最適なモデルを選択する」という戦略が重要になると思います。例えるなら現代は「燃費悪いガソリン車両で溢れかえっているが、まだ問題視されていない状況」であると思っていて、今後物理的資源の問題GPUなどが重要視されていくにつれ、このコスト削減問題はどんどん一般化していくと思っています。</p><p>Prompt Router は、その戦略を 自動化 し、かつ コスト削減と高速化 まで実現できるソリューション。ぜひ導入を検討してみてください。</p></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する]]></title><description><![CDATA[ryudaiです！今回は初心にかえって、「はじめてWebフロントエンド開発をする」人のためのチュートリアルを考えていきます。

前提として

 * すべての作業はAWS上で完結すること
 * すべてのコードはClaude Codeに書いてもらうこと

とし、実施のハードルをなるべく下げることを意識していきます。

※以下、リージョンは「ap-northeast-1」を想定しています。

①リポジトリを用意する: AWS CodeCommit
まず開発を始めるにあたって、Gitは使っていきたいですよね。

最近CodeCommitがGAに復活した
[https://aws.amazon.com/jp/blogs/news/aws-codecommit-returns-to-general-availability/]
ということで、積極的に使っていきたいと思います。

リポジトリ名は「front-sample」としています。

②AWS CloudShellを用意する
次に、メインの開発環境であるCloudShellを用意していきます。

CloudShellの画面を開き、「Open a]]></description><link>https://tech.anti-pattern.co.jp/cloudshell-claudecode-bedrock/</link><guid isPermaLink="false">Ghost__Post__696d154871fa390001b35fa9</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Wed, 21 Jan 2026 05:48:51 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/cloudshell-claudecode.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/cloudshell-claudecode.png" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する"/><p>ryudaiです！今回は初心にかえって、「はじめてWebフロントエンド開発をする」人のためのチュートリアルを考えていきます。</p><p>前提として</p><ul><li>すべての作業はAWS上で完結すること</li><li>すべてのコードはClaude Codeに書いてもらうこと</li></ul><p>とし、実施のハードルをなるべく下げることを意識していきます。</p><p>※以下、リージョンは「ap-northeast-1」を想定しています。</p><h2 id="%E2%91%A0%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B-aws-codecommit">①リポジトリを用意する: AWS CodeCommit</h2><p>まず開発を始めるにあたって、Gitは使っていきたいですよね。</p><p>最近<a href="https://aws.amazon.com/jp/blogs/news/aws-codecommit-returns-to-general-availability/">CodeCommitがGAに復活した</a>ということで、積極的に使っていきたいと思います。</p><p>リポジトリ名は「front-sample」としています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.25.27.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="843" height="835" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.25.27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.25.27.png 843w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E2%91%A1aws-cloudshell%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B">②AWS CloudShellを用意する</h2><p>次に、メインの開発環境であるCloudShellを用意していきます。</p><p>CloudShellの画面を開き、「Open ap-northeast-1 environment」をクリックして起動します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.28.15.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="945" height="831" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.28.15.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.28.15.png 945w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E2%91%A2%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%81%99%E3%82%8B">③リポジトリをクローンする</h2><p>CloudShellが立ち上がったので、先程作成したCodeCommitのリポジトリをクローンしてきます。</p><p>CodeCommitの「front-sample」リポジトリの「HTTPS(GRC)」タブを開きます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.33.59.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="836" height="409" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.33.59.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.33.59.png 836w" sizes="(min-width: 720px) 720px"/></figure><p>この画面の下部「ステップ2」に書いてあるコマンドをCloudShellで実行します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.34.48.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="776" height="217" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.34.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.34.48.png 776w" sizes="(min-width: 720px) 720px"/></figure><p>実行するコマンドは以下の通りです:</p><pre><code class="language-sh"># git-remote-codecommitというツールでCodeCommitへの認証を行う
pip install git-remote-codecommit

# クローンする
git clone codecommit::ap-northeast-1://front-sample</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.37.33.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="934" height="644" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.37.33.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.37.33.png 934w" sizes="(min-width: 720px) 720px"/></figure><p>また、後ほどコミットの際に必要になってくるので、Gitで使うユーザー名とメールアドレスを設定しておきます。</p><pre><code class="language-sh">git config --global user.name "&lt;ここに名前を入れます&gt;"
git config --global user.email "&lt;ここにメールアドレスを入れます&gt;"</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.43.48.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="938" height="145" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.43.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.43.48.png 938w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E2%91%A3claude-code%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">④Claude Codeをインストールする</h2><p>ここでお待ちかねのClaude Codeの登場です！</p><p>インストールは<a href="https://code.claude.com/docs/ja/setup">公式の手順書</a>通りですが、以下のコマンドを実行します。</p><pre><code class="language-sh">curl -fsSL https://claude.ai/install.sh | bash</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.40.35.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="940" height="309" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.40.35.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.40.35.png 940w" sizes="(min-width: 720px) 720px"/></figure><p>また、Claude CodeのバックエンドとしてBedrockを使う設定は、(こちらも<a href="https://code.claude.com/docs/ja/amazon-bedrock">公式の手順</a>通りですが)以下のコマンドを実行します。</p><pre><code class="language-sh">export CLAUDE_CODE_USE_BEDROCK=1</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.48.50.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="937" height="130" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.48.50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.48.50.png 937w" sizes="(min-width: 720px) 720px"/></figure><hr><p>⚠️お使いのAWSアカウントではじめてBedrockのClaudeを使う場合、以下のようなエラーが出ます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-1.14.59.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="913" height="36" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-1.14.59.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-1.14.59.png 913w" sizes="(min-width: 720px) 720px"/></figure><p>これを解消するには、Bedrockの「モデルカタログ」ページからAnthropicにユースケースを送信する必要があります(1,2分で回答できます)。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-1.15.48.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="628" height="310" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-1.15.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-1.15.48.png 628w"/></figure><p>回答してから反映されるのに数分かかるので、この間にコーヒーを淹れておきましょう☕</p><h3 id="%E2%91%A4html%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">⑤HTMLを作成する</h3><p>まず、忘れずに</p><pre><code class="language-sh">cd front-sample</code></pre><p>を実行しておきましょう。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.44.41.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="941" height="128" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.44.41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.44.41.png 941w" sizes="(min-width: 720px) 720px"/></figure><p>そして「claude」コマンドを実行してカラーテーマの設定などをしていきます。</p><pre><code class="language-sh">claude</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.50.10.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="933" height="677" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.50.10.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.50.10.png 933w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.50.42.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="932" height="546" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.50.42.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.50.42.png 932w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.52.50.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="943" height="356" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.52.50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.52.50.png 943w" sizes="(min-width: 720px) 720px"/></figure><p>準備が整うと以下のような画面になります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.54.16.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="937" height="409" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.54.16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.54.16.png 937w" sizes="(min-width: 720px) 720px"/></figure><p>ここで、HTMLを作成しgit pushまでを行うようにプロンプトに入力してみます。</p><pre><code class="language-txt">HTMLファイル(index.html)を新しく作成してください。
内容は現在時刻を表示するデジタル時計とします。
モダンで落ち着いたテーマで作成してください。
作業後にgit pushまで実施してください。</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.58.35.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="935" height="641" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.58.35.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.58.35.png 935w" sizes="(min-width: 720px) 720px"/></figure><p>私の環境では、以下のように作成が完了したと言っています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.58.47.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="925" height="400" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-2.58.47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-2.58.47.png 925w" sizes="(min-width: 720px) 720px"/></figure><p>実際にCodeCommitを確認すると、確かにindex.htmlが作成されているのがわかります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.00.03.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="847" height="829" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.00.03.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.00.03.png 847w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E2%91%A5aws-amplify-hosting%E3%81%A7html%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B">⑥AWS Amplify HostingでHTMLを公開する</h2><p>作成した画面は確認したくなるものなので、ここではAmplifyを使ってデプロイしていきます。</p><p>Amplifyの画面で「アプリケーションをデプロイ」ボタンをクリックします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.02.19.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="937" height="825" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.02.19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.02.19.png 937w" sizes="(min-width: 720px) 720px"/></figure><p>ソースコードプロバイダーの選択画面では「CodeCommit」を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.03.00.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1254" height="693" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.03.00.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.03.00.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.03.00.png 1254w" sizes="(min-width: 720px) 720px"/></figure><p>リポジトリは「front-sample」、ブランチは「master」になります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.03.32.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1253" height="528" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.03.32.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.03.32.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.03.32.png 1253w" sizes="(min-width: 720px) 720px"/></figure><p>アプリケーションの設定画面ではデフォルトのまま次へ進みます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.04.16.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1255" height="813" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.04.16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.04.16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.04.16.png 1255w" sizes="(min-width: 720px) 720px"/></figure><p>最後に「保存してデプロイ」を押して完了です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.04.38.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1246" height="844" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.04.38.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.04.38.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.04.38.png 1246w" sizes="(min-width: 720px) 720px"/></figure><p>masterブランチが以下のように「デプロイ済み」のステータスになったら、表示されているドメインにアクセスしてみましょう！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.06.48.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1250" height="761" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.06.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.06.48.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.06.48.png 1250w" sizes="(min-width: 720px) 720px"/></figure><p>私の手元では、無事にきれいなブルーのデジタル時計が作成されていました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.08.12.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="836" height="579" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.08.12.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.08.12.png 836w" sizes="(min-width: 720px) 720px"/></figure><h3 id="%E2%91%A6%E3%81%8A%E3%81%BE%E3%81%91-%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E5%A4%89%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B">⑦おまけ: テーマを変えてみる</h3><p>時間に余裕のある方は、ソースコードの更新も体験していきましょう。</p><p>Claude Codeに以下のようなプロンプトを入力します。</p><pre><code class="language-txt">このアプリケーションを暖色系でポップな見た目に変更してください。</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.13.05.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="925" height="390" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.13.05.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.13.05.png 925w" sizes="(min-width: 720px) 720px"/></figure><p>pushまで終わると、Amplifyの方で自動的にデプロイが走ります。便利ですね…！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.12.45.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="1255" height="783" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.12.45.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2026/01/----------2026-01-19-3.12.45.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.12.45.png 1255w" sizes="(min-width: 720px) 720px"/></figure><p>デプロイが確認したら再度アプリケーションの画面を開いてみましょう。可愛らしい見た目になったでしょうか？</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.13.55.png" class="kg-image" alt="AWS CloudShell × Claude Code × Amazon Bedrock でWebフロントエンド開発を体験する" loading="lazy" width="850" height="515" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2026/01/----------2026-01-19-3.13.55.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-19-3.13.55.png 850w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回は以下のことを学びました。</p><ul><li>AWS CloudShell上でClaude Codeを使いWebフロントエンドを開発できた</li><li>Claude Codeの裏でAmazon Bedrockを利用することができた</li><li>AWS CodeCommitでソースコードを管理できた</li><li>AWS Amplify HostingとAWS CodeCommitを連携してフロントエンドを自動デプロイできた</li></ul><hr><p>今回作成したリソースはほとんど料金がかかりませんが、片付ける際には以下を削除しておきましょう:</p><ul><li>CloudShellの環境</li><li>CodeCommitのリポジトリ「front-sample」</li><li>Amplifyのアプリ「front-sample」</li></ul></hr></hr>]]></content:encoded></item><item><title><![CDATA[Figma makeで作ったWebアプリをKiroでリファクタリングした]]></title><description><![CDATA[POSSEでエンジニアインターンをしている吉川唯音です。本記事では、Kiroでリファクタリングしてみて気づいたことについて書いていきたいと思います。


▶︎実際にリファクタリング後にデプロイしたアプリケーション
https://no-vel.link/




はじめに

Figma
makeを使えば、デザインからコードまで一気通貫でWebアプリケーションを作成できます。私もこの便利さに惹かれて、プロトタイプをサクッと作ってみました。

しかし、気づいた時には「保守不能」なコードベースが出来上がっていました。

 * すべての画面がステートで管理され、URLはすべて同じ
 * UIとロジックが混在
 * if文のネストで画面を切り替える実装
 * 使われていない大量のファイル
 * any型だらけ、DOM直接操作



CursorやClaude
Codeでリファクタリングを試みましたが、部分的な修正しかしてくれず、またエラーが出ても問題と判定されず、理想の状態には到達できませんでした。

そこで出会ったのがKiroのスペック駆動開発モードです

CursorとClaude Code]]></description><link>https://tech.anti-pattern.co.jp/untitled-7/</link><guid isPermaLink="false">Ghost__Post__6963928271fa390001b35ec2</guid><dc:creator><![CDATA[Yuito.Yoshikawa]]></dc:creator><pubDate>Sun, 11 Jan 2026 12:49:51 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>POSSEでエンジニアインターンをしている吉川唯音です。本記事では、<strong>Kiroでリファクタリングしてみて気づいたこと</strong>について書いていきたいと思います。</p>
<br>
<p>▶︎実際にリファクタリング後にデプロイしたアプリケーション<br>
<a href="https://no-vel.link/">https://no-vel.link/</a></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.18.22.png" alt="----------2026-01-11-21.18.22" loading="lazy"/></p>
<br>
<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2>
<br>
<p>Figma makeを使えば、デザインからコードまで一気通貫でWebアプリケーションを作成できます。私もこの便利さに惹かれて、プロトタイプをサクッと作ってみました。</p>
<p>しかし、気づいた時には「<strong>保守不能</strong>」なコードベースが出来上がっていました。</p>
<ul>
<li>すべての画面がステートで管理され、URLはすべて同じ</li>
<li>UIとロジックが混在</li>
<li><code>if</code>文のネストで画面を切り替える実装</li>
<li>使われていない大量のファイル</li>
<li><code>any</code>型だらけ、DOM直接操作</li>
</ul>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.10.02.png" alt="----------2026-01-11-21.10.02" loading="lazy"/></p>
<p>CursorやClaude Codeでリファクタリングを試みましたが、部分的な修正しかしてくれず、またエラーが出ても問題と判定されず、理想の状態には到達できませんでした。</p>
<h3 id="%E3%81%9D%E3%81%93%E3%81%A7%E5%87%BA%E4%BC%9A%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8Ckiro%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E3%81%99">そこで出会ったのが<strong>Kiro</strong>のスペック駆動開発モードです</h3>
<br>
<h2 id="cursor%E3%81%A8claude-code">CursorとClaude Code</h2>
<br>
<p>最初のアプローチで直面した問題：</p>
<ul>
<li><strong>全体像を把握してくれない</strong> - 部分的な修正のみで、関連ファイルへの影響を考慮しない</li>
<li><strong>エラーを問題と判定しない</strong> - TypeScriptエラーがあっても「完了です」と返す</li>
<li><strong>理想状態に到達しない</strong> - 部分最適の積み重ねで、結局ぐちゃぐちゃに</li>
<li><strong>作業単位が不明瞭</strong> - 今何をしているのか、次に何をすべきかが見えない</li>
</ul>
<p>時間をかけても動かないコードが量産されるだけでした。</p>
<h2 id="kiro%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%A2%E3%83%BC%E3%83%89">Kiroのスペック駆動開発モード</h2>
<p>Kiroの特徴は、既存のコードベースに対して</p>
<ol>
<li><strong>要件（Requirements）</strong> を明確化</li>
<li><strong>設計（Design）</strong> を文書化</li>
<li><strong>タスク（Task）</strong> を自動生成</li>
</ol>
<p>という流れで進められます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.11.37.png" alt="----------2026-01-11-21.11.37" loading="lazy"/></p>
<p>特にリファクタリングに向いている理由：</p>
<ul>
<li>既存コードの構造を理解した上で要件を整理できる</li>
<li>段階的な変更を計画的に進められる</li>
<li><strong>タスク単位で進捗を確認できる</strong></li>
</ul>
<h2 id="%E5%AE%9F%E8%B7%B5%EF%BC%9A%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%E3%81%BE%E3%81%A7">実践：要件定義から実装まで</h2>
<h3 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E8%A8%88%E7%94%BB">リファクタリングの計画</h3>
<p>Phase 1として、URLベースのルーティングへの移行を設定しました。MainApp内部のルーティングなど、その他の課題も段階的に対応する計画です。</p>
<h3 id="kiro%E3%81%A8%E3%81%AE%E5%AF%BE%E8%A9%B1%E3%81%A7%E8%A6%81%E4%BB%B6%E3%82%92%E6%95%B4%E7%90%86">Kiroとの対話で要件を整理</h3>
<p>現状のコードベースを見せ、対話しながら要件を整理：</p>
<pre><code class="language-markdown">現在のApp.tsxでは、useStateによる状態ベースのルーティングを行っており、
12種類のAppStateをif文で切り替えている。
この実装をReact Router v7に移行し、URLベースのナビゲーションを実現する。
デザインや既存の動作は一切変更せず、内部構造のみをリファクタリングする。
</code></pre>
<p>Kiroはコードベースを分析し、<code>kiro/spec/requirements.md</code>を生成してくれました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.12.41.png" alt="----------2026-01-11-21.12.41" loading="lazy"/></p>
<p>重要だったのは、<strong>私が理想とする状態を明確に伝えること</strong>です。</p>
<h3 id="%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90">設計とタスクの自動生成</h3>
<p>要件が固まると、Kiroは設計書とタスクリストを自動生成します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.13.12.png" alt="----------2026-01-11-21.13.12" loading="lazy"/></p>
<p>Kiroは各タスクを順番に実行し、<strong>タスクごとに確認を求めてくれます</strong>。承認のタイミングは自分で決められ、フェーズごとにbuildチェックも可能です。</p>
<p>メリット：</p>
<ul>
<li><strong>今何をしているかが明確</strong></li>
<li><strong>いちいち細かい指示を出す必要がない</strong></li>
<li><strong>テストコードまで自動生成してくれる</strong></li>
</ul>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.14.11.png" alt="----------2026-01-11-21.14.11" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.14.22.png" alt="----------2026-01-11-21.14.22" loading="lazy"/></p>
<h3 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%90%E6%9E%9C">リファクタリング結果</h3>
<p><strong>Before:</strong></p>
<pre><code class="language-tsx">function App() {
  const [appState, setAppState] = useState&lt;AppState&gt;('landing');

  if (appState === 'landing') {
    return &lt;LandingPage 
      onGetStarted={() =&gt; setAppState('auth')}
      // ...大量のコールバック
    /&gt;;
  }
  // 以下、12種類のif文が続く...
}
</code></pre>
<p><strong>After:</strong></p>
<pre><code class="language-tsx">function App() {
  return (
    &lt;Routes&gt;
      &lt;Route path=&quot;/&quot; element={&lt;LandingPage /&gt;} /&gt;
      &lt;Route path=&quot;/auth&quot; element={&lt;AuthPage /&gt;} /&gt;
      &lt;Route path=&quot;/pricing&quot; element={&lt;PricingPage /&gt;} /&gt;
      &lt;Route path=&quot;/app/*&quot; element={&lt;MainApp /&gt;} /&gt;
      {/* ... */}
    &lt;/Routes&gt;
  );
}
</code></pre>
<p>if文の嵐から解放され、宣言的なルーティングになりました。</p>
<h2 id="%E8%87%AA%E5%88%86%E3%81%A7%E7%90%86%E6%83%B3%E3%82%92%E8%80%83%E3%81%88%E3%81%A6%E3%80%81%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%81%99%E3%82%8B%E9%87%8D%E8%A6%81%E6%80%A7">自分で理想を考えて、ハンドルする重要性</h2>
<p>Kiroは強力ですが、<strong>すべてを任せきりにすると上手くいかない</strong>こともわかりました。</p>
<h3 id="%E7%A7%81%E3%81%8C%E8%87%AA%E5%88%86%E3%81%A7%E5%88%A4%E6%96%AD%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8">私が自分で判断したこと</h3>
<p><strong>1. ディレクトリ構造の理想形</strong></p>
<p><strong>2. 使用するライブラリの選定</strong></p>
<p><strong>3. リファクタリングのフェーズ分け</strong></p>
<p><strong>4. Kiroが出したコードのレビュー</strong></p>
<h3 id="github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E3%81%99%E3%82%8B">GitHubリポジトリを参考にする</h3>
<p>Kiroの便利な機能として、<strong>GitHubのリポジトリを参照できる</strong>点があります。</p>
<p>以前作った綺麗な構造のプロジェクトをKiroに見せると、そのベストプラクティスを踏襲してくれました。過去の良い設計を再利用でき、プロジェクト間の一貫性も保てます。</p>
<h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E4%B8%BB%E8%A6%81%E3%81%AA%E7%AE%87%E6%89%80">リファクタリングした主要な箇所</h2>
<p>Phase 1とその他のタスクで改善できた箇所：</p>
<h3 id="1-%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%94%B9%E5%96%84">1. ルーティング改善</h3>
<p><strong>Before:</strong></p>
<pre><code class="language-tsx">function MainApp() {
  const [currentView, setCurrentView] = useState&lt;'dashboard' | 'settings'&gt;('dashboard');

  if (currentView === 'dashboard') return &lt;Dashboard /&gt;;
  if (currentView === 'settings') return &lt;Settings onBack={() =&gt; setCurrentView('dashboard')} /&gt;;
}
</code></pre>
<p><strong>After:</strong></p>
<pre><code class="language-tsx">function MainApp() {
  return (
    &lt;Routes&gt;
      &lt;Route path=&quot;dashboard&quot; element={&lt;Dashboard /&gt;} /&gt;
      &lt;Route path=&quot;settings&quot; element={&lt;Settings /&gt;} /&gt;
    &lt;/Routes&gt;
  );
}
</code></pre>
<h3 id="2-dom%E7%9B%B4%E6%8E%A5%E6%93%8D%E4%BD%9C%E3%81%AE%E6%8E%92%E9%99%A4">2. DOM直接操作の排除</h3>
<p><strong>Before:</strong> <code>window.location.pathname = &quot;/dashboard&quot;;</code></p>
<p><strong>After:</strong> <code>navigate('/app');</code></p>
<h3 id="3-%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%94%B9%E5%96%84">3. その他の改善</h3>
<ul>
<li><code>any</code>型の削除と型安全性の確保</li>
<li>if文のネスト削減</li>
<li>react-hook-formへの統一</li>
<li>コンポーネントの再利用性向上</li>
<li>UIとロジックの分離</li>
<li>SWRを使用してステート管理を改善</li>
</ul>
<h2 id="%E8%87%AA%E5%8B%95%E3%82%B5%E3%83%9E%E3%83%A9%E3%82%A4%E3%82%BA%E6%A9%9F%E8%83%BD">自動サマライズ機能</h2>
<p>Kiro(Cursorなどもですが)は<strong>コンテキストが上限に達する前に自動的にサマライズ</strong>してくれます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2026/01/----------2026-01-11-21.15.17.png" alt="----------2026-01-11-21.15.17" loading="lazy"/></p>
<p>これにより、作業が途切れることなく継続できました。</p>
<h2 id="%E5%AE%8C%E4%BA%86%EF%BC%9A%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E3%81%A8%E5%AD%A6%E3%81%B3">完了：動作確認と学び</h2>
<p>すべてのタスクが完了し、ビルドも成功しました。</p>
<p>実際にブラウザで確認すると、一部importの忘れなどがありましたが、<strong>CursorやClaude Codeでは到達できなかったゴールに、同じ労力で到達できた</strong>ことに驚きました。</p>
<p><strong>反省点として、テストを早い段階で作成すれば良かった</strong>と思います。Kiroはテストコードも生成してくれるので、最初から書いてもらえば細かいミスは防げたでしょう。</p>
<h3 id="%E8%A6%81%E4%BB%B6%E3%82%84%E4%BA%8B%E5%89%8D%E6%83%85%E5%A0%B1%E3%82%92%E4%BC%9D%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7">要件や事前情報を伝えることの重要性</h3>
<p>Kiroを使って最も学んだのは、<strong>事前に伝える情報の質が、成果物の質を決める</strong>ということです。</p>
<ul>
<li>理想のディレクトリ構造</li>
<li>使用するライブラリとバージョン</li>
<li>ベストプラクティスの参照先</li>
<li>リファクタリングの優先順位</li>
</ul>
<p>これらを明確に伝えることで、Kiroは期待以上の仕事をしてくれました。</p>
<h3 id="%E5%B0%86%E6%9D%A5%E3%81%AE%E5%B1%95%E6%9C%9B">将来の展望</h3>
<p><strong>Figma makeのガードレール作成</strong></p>
<p>今回のリファクタリングで、AIがどのように判断してコードを記述するかが見えました。これを応用して、Figma makeで最初から綺麗に書いてもらうガードレールを作成できそうです。</p>
<p><strong>自動化と学習のバランス</strong></p>
<p>Kiroと一緒にリファクタリングするからこそ、コードへの理解が深まります。タスク単位で確認しながら進めることで、自然と学習できます。完全自動化よりも、<strong>人間とAIの協働</strong>が最も効率的だと感じました。</p>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<h3 id="kiro%E3%81%AE%E5%BC%B7%E3%81%BF">Kiroの強み</h3>
<ul>
<li><strong>ちゃんと動くものを提供してくれる</strong></li>
<li><strong>やりきってくれる</strong> - タスク単位で計画的に進め、最後まで完遂</li>
<li><strong>スペック駆動で安心</strong> - 要件・設計・タスクが明確</li>
<li><strong>テストも自動生成</strong></li>
<li><strong>コンテキストを自動サマライズ</strong></li>
</ul>
<p>Kiroのスペック駆動リファクタリングは、保守性の高いコードベースを維持する強力な味方になってくれそうです。</p>
<!--kg-card-end: markdown--></br></br></br></br></br>]]></content:encoded></item><item><title><![CDATA[Kiroを並列で動かして開発がしたい]]></title><description><![CDATA[

Kiroのspec開発に感動してずっと触っていましたが、少し時間が経過しました。KiroはすばらしいIDEなのですが、だんだん、Kiroを並列で実行して開発が出来れば、もっと早く開発ができるだろうなと思うようになってきました。

kiro-cliも今後spec作成をcliで行う機能を予定しているようですが、現在はありません。また、Kiroのタスクの実行が一つのworkspace内で作業をするので、並列で開発してPRを出すということが出来ません。

いくつか考えたkiroを並列実行して開発する方法は以下でした。

 1. docker containerを立ち上げて、開発してPRまで行うところを1サイクルとして終わったらコンテナが終了する方法
 2. remoteのmicroVMにタスクを投げて開発からPRまでを行う方法
 3. git worktreeを作成して、その中でブランチを作成し、開発してPRまで行う方法



> docker containerを立ち上げて、開発してPRまで行うところを1サイクルとして終わったらコンテナが終了する方法
docker containerは環]]></description><link>https://tech.anti-pattern.co.jp/kiroweenni/</link><guid isPermaLink="false">Ghost__Post__6910b36471fa390001b34ee5</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Thu, 08 Jan 2026 05:02:09 GMT</pubDate><content:encoded><![CDATA[<p/><p>Kiroのspec開発に感動してずっと触っていましたが、少し時間が経過しました。KiroはすばらしいIDEなのですが、だんだん、Kiroを並列で実行して開発が出来れば、もっと早く開発ができるだろうなと思うようになってきました。</p><p>kiro-cliも今後spec作成をcliで行う機能を予定しているようですが、現在はありません。また、Kiroのタスクの実行が一つのworkspace内で作業をするので、並列で開発してPRを出すということが出来ません。</p><p>いくつか考えたkiroを並列実行して開発する方法は以下でした。</p><ol><li>docker containerを立ち上げて、開発してPRまで行うところを1サイクルとして終わったらコンテナが終了する方法</li><li>remoteのmicroVMにタスクを投げて開発からPRまでを行う方法</li><li>git worktreeを作成して、その中でブランチを作成し、開発してPRまで行う方法</li></ol><p/><blockquote>docker containerを立ち上げて、開発してPRまで行うところを1サイクルとして終わったらコンテナが終了する方法</blockquote><p>docker containerは環境を分離しやすいという点では良いのですが、portなどを含めたコンテナの管理が複雑になりそうでした。</p><blockquote>remoteのmicroVMにタスクを投げて開発からPRまでを行う方法</blockquote><p>remoteのmicroVMにタスクを投げて開発からPRまでを行う方法は完全に環境が分離できますが、日頃の小さくインクリメントする開発にはオーバースペック感がありました。</p><p>フロントとapiを合わせて大規模なタスクを一気に開発するなどには向いていると思います。今回はコストもかかるので、やらないことにしました。</p><blockquote>git worktreeを作成して、その中でブランチを作成し、開発してPRまで行う方法</blockquote><p>git worktreeはかなりよく現在も使っている方法です。git worktree単体だと.envなどのコミットしていないファイルが引き継げないのですが、<a href="https://zenn.dev/satococoa/articles/f93f34f0e13696">wtp</a> を使えば可能になります。これでかなり使いやすくはなったのですが、やはりgit worktreeの作成しPRまでをシームレスに実行したくなったり、worktreeの管理も簡単にしたくなってきました。</p><p/><h3 id="%E7%B5%90%E8%AB%96%EF%BC%9Acli%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99">結論：CLIツールを自作しています</h3><p>現在はkiroでspecを作成した後はcliで完結できるようなツールを開発中です。</p><p>このツールの構想は以下の通りです：</p><ol><li>Specを書く: いつも通りKiroでSpecファイルを作成</li><li>コマンド実行: ツールにSpecを渡す</li><li>自動オーケストレーション</li></ol><ul><li>裏でGit Worktreeを自動作成（<code>wtp</code>の機構を活用して<code>.env</code>も同期）</li><li>依存関係（node_modulesなど）のリンクまたは高速セットアップ</li><li>Kiroを実行してコード生成</li><li>テストが通れば <code>gh pr create</code> でPRを作成</li><li>完了後、Worktreeをお掃除</li></ul><p/><h3 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"> おわりに<br/></h3><p>Kiroは今でも非常に完成度が高く、素晴らしいIDEだと感じています。</p><p>一方で、Specを書いたあとに発生する生成・テスト・PR作成といった工程では、どうしても手持ち無沙汰になる時間があり、もっと効率よく開発ができる余地があるのではないかと考えるようになりました。</p><p>まだ開発途中ですが、Spec駆動の開発をどうスケールさせるかを考える中で、ひとつの実践例として形にできたらと思っています。</p><p/>]]></content:encoded></item><item><title><![CDATA[開発環境のMinIOをRustFSに移行した話]]></title><description><![CDATA[こんにちは！いわむらです。

開発環境でS3互換のオブジェクトストレージとしてMinIOを使っていたのですが、2025年10月にMinIOがDockerイメージの無料配布を停止したので、これを機に別のS3互換ストレージに移行してみました。

MinIOのDockerイメージ配布停止
2025年10月15日のセキュリティリリース以降、DockerHubやQuay.ioでの公式イメージ配布が停止され、ユーザー自身でソースからビルドする必要が生じました。しかも事前告知なしだったため、コミュニティで大きな反発がありました。

MinIOが無料のDockerイメージ配布を突然停止、コミュニティからは反発の声 - GIGAZINE
[https://gigazine.net/news/20251023-minio-stops-distributing-free-docker-images]

開発環境でサクッとdocker compose up
するだけで使えていたのに、自前ビルドが必要になるのは面倒だなと思い、他のS3互換ストレージへの移行を検討しました。

移行先の検討
S3互換のオブジェクト]]></description><link>https://tech.anti-pattern.co.jp/kai-fa-huan-jing-nominioworustfsniyi-xing-sitahua/</link><guid isPermaLink="false">Ghost__Post__6958ec7671fa390001b35d95</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Wed, 07 Jan 2026 05:22:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！いわむらです。</p><p>開発環境でS3互換のオブジェクトストレージとしてMinIOを使っていたのですが、2025年10月にMinIOがDockerイメージの無料配布を停止したので、これを機に別のS3互換ストレージに移行してみました。</p><h2 id="minio%E3%81%AEdocker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E9%85%8D%E5%B8%83%E5%81%9C%E6%AD%A2">MinIOのDockerイメージ配布停止</h2><p>2025年10月15日のセキュリティリリース以降、DockerHubやQuay.ioでの公式イメージ配布が停止され、ユーザー自身でソースからビルドする必要が生じました。しかも事前告知なしだったため、コミュニティで大きな反発がありました。</p><p><a href="https://gigazine.net/news/20251023-minio-stops-distributing-free-docker-images">MinIOが無料のDockerイメージ配布を突然停止、コミュニティからは反発の声 - GIGAZINE</a></p><p>開発環境でサクッと<code>docker compose up</code>するだけで使えていたのに、自前ビルドが必要になるのは面倒だなと思い、他のS3互換ストレージへの移行を検討しました。</p><h2 id="%E7%A7%BB%E8%A1%8C%E5%85%88%E3%81%AE%E6%A4%9C%E8%A8%8E">移行先の検討</h2><p>S3互換のオブジェクトストレージとして、以下の3つを候補に挙げて調べてみました。</p><h3 id="seaweedfs">SeaweedFS</h3><p>Go製の分散ストレージ。大規模なファイルストレージ向けで高いスケーラビリティが特徴です。</p><p>Docker Composeでの導入自体は可能なのですが、Master/Volume/Filerという複数コンポーネントの構成が必要で、開発環境にはやや大げさかなという印象でした。</p><h3 id="garage">Garage</h3><p>Rust製の分散オブジェクトストレージ。軽量な設計が特徴です。ただ、分散システム前提の設計でノードの設定が必要になり、開発環境で手軽に使うには少し手間がかかりそうでした。</p><h3 id="rustfs">RustFS</h3><p>Rust製のシンプルなS3互換ストレージ。単一コンテナで動作し、Docker Composeでの導入が最も簡単そうでした。MinIOとほぼ同じ設定で動くため、移行も容易そうです。</p><h3 id="%E6%AF%94%E8%BC%83%E8%A1%A8">比較表</h3><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>項目</th>
<th>SeaweedFS</th>
<th>Garage</th>
<th>RustFS</th>
</tr>
</thead>
<tbody>
<tr>
<td>言語</td>
<td>Go</td>
<td>Rust</td>
<td>Rust</td>
</tr>
<tr>
<td>ライセンス</td>
<td>Apache-2.0</td>
<td>AGPL-3.0</td>
<td>Apache-2.0</td>
</tr>
<tr>
<td>構成</td>
<td>複数コンポーネント</td>
<td>分散ノード</td>
<td>単一コンテナ</td>
</tr>
<tr>
<td>移行の容易さ</td>
<td>△</td>
<td>△</td>
<td>◎</td>
</tr>
<tr>
<td>開発環境向け</td>
<td>△</td>
<td>○</td>
<td>◎</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>開発環境で手軽に使いたいので、今回は<strong>RustFS</strong>を選びました。</p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F">実際に移行してみた</h2><p>移行作業は<code>compose.yml</code>を数行変更するだけでした。</p><h3 id="before%EF%BC%88minio%EF%BC%89">Before（MinIO）</h3><pre><code class="language-yaml">minio:
  image: minio/minio:latest
  environment:
    MINIO_ROOT_USER: sample-user
    MINIO_ROOT_PASSWORD: sample-password
  entrypoint: minio
  command: server /export --address :9000 --console-address :9001
  volumes:
    - ./docker/minio/data:/export
  ports:
    - "9000:9000"
    - "9001:9001"
</code></pre><h3 id="after%EF%BC%88rustfs%EF%BC%89">After（RustFS）</h3><pre><code class="language-yaml">rustfs:
  image: rustfs/rustfs:latest
  environment:
    RUSTFS_ACCESS_KEY: sample-user
    RUSTFS_SECRET_KEY: sample-password
    RUSTFS_CONSOLE_ENABLE: "true"
  command: ["/data"]
  volumes:
    - ./docker/rustfs/data:/data
  ports:
    - "9000:9000"
    - "9001:9001"
</code></pre><p><code>mc</code>（MinIO Client）でバケットを作成する部分も、エンドポイントを<code>minio</code>から<code>rustfs</code>に変えるだけでOKでした。</p><p>アプリケーション側の設定変更は不要で、エンドポイントのコンテナ名を合わせるだけです。</p><pre><code class="language-env">AWS_ENDPOINT=http://rustfs:9000
</code></pre><hr><h2 id="%E7%A7%BB%E8%A1%8C%E5%BE%8C%E3%81%AE%E6%89%80%E6%84%9F">移行後の所感</h2><p>移行後、以下の操作を試してみましたが、すべて問題なく動作しました。</p><ul><li>ファイルのアップロード・ダウンロード</li><li>署名付きURL（Presigned URL）の生成</li><li>Web Consoleでのバケット管理</li><li><code>mc</code>コマンドでの操作</li></ul><p>アプリケーション側のS3クライアント設定もエンドポイントを変えるだけで、コードの変更は不要でした。</p><p>Web Consoleも <a href="http://localhost:9001">http://localhost:9001</a> でアクセスでき、MinIOと同じ感覚で使えます。</p><p>これでフレームワーク依存がなくなりました。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>MinIOのDockerイメージ無料配布停止をきっかけにRustFSへ移行しました。</p><ul><li><strong>移行は簡単</strong>：compose.ymlの数行変更のみ</li><li><strong>問題なく動作</strong>：S3 API互換で既存コードそのまま</li></ul><p>SeaweedFSやGarageも良いツールですが、開発環境でサクッと使いたいなら個人的にはRustFSが移行しやすそうだなと思いました。同じような状況の方の参考になれば！</p></hr>]]></content:encoded></item><item><title><![CDATA[Kiro Powersのパワーは如何に]]></title><description><![CDATA[こんにちは！POSSEでエンジニアインターンをしている井上岳です。

最近CDKを実装する機会が多く、AIを使いながら実装していますが、最新の情報をインプットしたうえでの実装はなかなかやってくれないものです。自分の勉強不足ではあるのですが、AIを使いながら、成果も出しながら、勉強もしながらできないかなぁと思っていたところ、
Kiro Powersというものがあると知ったので試してみました。

Kiro Powersとは
Kiro Powersとは、Kiroの機能を拡張するためのプラグインシステムで、MCP（Model Context
Protocol）サーバー、ステアリングファイル（指示・ルールファイル）、フックなどを1つのパッケージにまとめたものです。

Kiro powers の紹介 | Amazon Web ServicesAI
アシスタントは、フレームワークの専門知識への即座のアクセスを提供し、より速くリリースできるようにすべきです。しかし、今日の AI
エージェントも同じ課題に直面しています。組み込みの知識がなければ、あなたと同じように推測と反復を繰り返します。Kiro po]]></description><link>https://tech.anti-pattern.co.jp/kiro-powers/</link><guid isPermaLink="false">Ghost__Post__69546c8a71fa390001b35b0a</guid><dc:creator><![CDATA[Gaku Inoue]]></dc:creator><pubDate>Wed, 31 Dec 2025 11:34:58 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！POSSEでエンジニアインターンをしている井上岳です。</p><p>最近CDKを実装する機会が多く、AIを使いながら実装していますが、最新の情報をインプットしたうえでの実装はなかなかやってくれないものです。自分の勉強不足ではあるのですが、AIを使いながら、成果も出しながら、勉強もしながらできないかなぁと思っていたところ、<strong>Kiro Powers</strong>というものがあると知ったので試してみました。</p><h2 id="kiro-powers%E3%81%A8%E3%81%AF">Kiro Powersとは</h2><p>Kiro Powersとは、Kiroの機能を拡張するためのプラグインシステムで、MCP（Model Context Protocol）サーバー、ステアリングファイル（指示・ルールファイル）、フックなどを1つのパッケージにまとめたものです。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/blogs/news/introducing-powers/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Kiro powers の紹介 | Amazon Web Services</div><div class="kg-bookmark-description">AI アシスタントは、フレームワークの専門知識への即座のアクセスを提供し、より速くリリースできるようにすべきです。しかし、今日の AI エージェントも同じ課題に直面しています。組み込みの知識がなければ、あなたと同じように推測と反復を繰り返します。Kiro powers は、幅広い開発とデプロイメントのユースケースに対して、その統一されたアプローチを提供します。MCP ツールとフレームワークの専門知識を一緒にパッケージ化し、動的に読み込みます。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/main/images/site/touch-icon-ipad-144-smile.png"><span class="kg-bookmark-author">Amazon Web Services</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://d2908q01vomqb2.cloudfront.net/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f/2025/12/04/introducing-powers.png"/></div></a></figure><p>従来は個別に設定が必要だった外部ツールとの連携やプロジェクトのルール設定を、インストールするだけで一括してセットアップできます。</p><h3 id="%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4%E3%81%A8%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">主な特徴とメリット</h3><ol><li>コンテキスト問題の解消（動的読み込み）：従来のMCPサーバーは全てのツールを事前に読み込むため、AIの記憶領域（コンテキスト）を圧迫する課題がありました。Kiro Powersは、プロンプトに含まれる「キーワード」を検知したときだけ必要な機能を動的に読み込むため、効率的なコンテキストの利用が可能です。</li><li>専門知識の即時活用：汎用的なAIの回答ではなく、FigmaやTerraformといった各サービス固有の最新ベストプラクティスに基づいた、精度の高いコード生成が可能になります。</li><li>セットアップの自動化：インストールすると、必要なディレクトリ構成やMCP設定が自動で行われ、AIエージェントによるオンボーディング（初期設定の自動実行）が開始されます。</li><li>将来的なクロス互換性：現在はKiro IDE専用ですが、将来的にはCursorやClaude Code、Clineといった他の主要なAI開発ツールでも動作する標準規格を目指して開発されています。</li></ol><h2 id="%E4%BB%8A%E5%9B%9E%E4%BD%BF%E3%81%86kiro-powers-%F0%9F%92%AA">今回使うKiro Powers 💪</h2><p>今回はCDKの実装のため、<strong>Build AWS infrastructure with CDK and CloudFormation</strong>を使ってみました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-28-21.41.39.png" class="kg-image" alt="" loading="lazy" width="912" height="896" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-28-21.41.39.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-28-21.41.39.png 912w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">環境構築</h2><p>まず最新のバージョンにアップデートすることをお忘れなく！</p><p>次に、Kiro IDEの左サイドバーからPowes（⚡が付いた可愛いKiroマーク）を選択し、Build AWS infrastructure with CDK and CloudFormationをインストールします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.52.29.png" class="kg-image" alt="" loading="lazy" width="2000" height="947" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-31-9.52.29.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/12/----------2025-12-31-9.52.29.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/12/----------2025-12-31-9.52.29.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.52.29.png 2130w" sizes="(min-width: 720px) 720px"/></figure><p>インストールはすぐに完了します。ノーマルKiroアイコンをクリックしてインストールされたかどうか確認することができます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.56.27.png" class="kg-image" alt="" loading="lazy" width="640" height="723" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-31-9.56.27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.56.27.png 640w"/></figure><p>9個のツールが提供されていることがわかりますね。</p><p>次に、<strong>Try Power</strong>ボタンを押してチュートリアルを開始してみましょう。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.59.55.png" class="kg-image" alt="" loading="lazy" width="807" height="654" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-31-9.59.55.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-9.59.55.png 807w" sizes="(min-width: 720px) 720px"/></figure><p>こんな感じでチュートリアルが始まります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-10.11.48.png" class="kg-image" alt="" loading="lazy" width="742" height="665" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-31-10.11.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-10.11.48.png 742w" sizes="(min-width: 720px) 720px"/></figure><blockquote><strong>概要</strong> <br>aws-infrastructure-as-code パワーは、CDK と CloudFormation を使用して AWS インフラストラクチャを構築し、検証するのに役立ちます。このパワーには以下の機能があります。<br><br><strong>CDK 開発: </strong><br>- 最新の CDK ドキュメントと API リファレンスを検索 <br>- TypeScript、Python、Java、C#、Go で動作するコードサンプルを見つける <br>- セキュリティとアーキテクチャに関する包括的なベストプラクティスを入手する <br>- 完全なコンストラクト ドキュメントを読む <br><br><strong>CloudFormation 検証: </strong><br>- テンプレートの構文とスキーマを検証 (cfn-lint) <br>- AWS Guard ルールに対するセキュリティコンプライアンスをチェック (cfn-guard) <br>- デプロイ前の検証ガイダンスを入手する <br><br><strong>トラブルシューティング: </strong><br>- パターンマッチングによる CloudFormation デプロイの失敗を分析 <br>- 詳細な調査のための CloudTrail ディープリンクを入手する <br>- エラー解決のために CloudFormation ドキュメントを検索する<br><br><strong>オンボーディング</strong> <br>朗報です！ほとんどの機能は AWS クレデンシャルなしで動作します。クレデンシャルが必要なのは、CloudFormation デプロイの失敗をトラブルシューティングする場合のみです。</br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></blockquote><p>これで環境構築は完璧です！！</p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">実際に使ってみる</h2><p>今回は、Step Functionsの実装で使ってみたいと思います。</p><p>なんでStep Functionsをやってみたいかというと、先日あるAIにCDKの実装をお願いしたところ、<strong>ASL(Amazon States Language) </strong>で実装されてしまい複雑なコードになってしまいました。（自分が指示してないのが悪いですが、、）</p><p>これまでStep Functionsでは<strong>ASL</strong>を用いて定義するのが主流だったので、そのデータをたくさん学習していてそうなったのかなと思います。</p><p>AWSのドキュメントでは、Step Functionsでは、ASLではなく<strong>JSONata</strong>の利用が推奨されています。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/transforming-data.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Step Functions での JSONata を使用したデータ変換 - AWS Step Functions</div><div class="kg-bookmark-description">JSONata を使用すると、ステート間でデータを変換できます。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">AWS Step Functions</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/images/compare-jsonpath-jsonata.png"/></div></a></figure><p>Build AWS infrastructure with CDK and CloudFormationを使ったら、指示しなくても<strong>JSONata</strong>で実装してくれるのでは？？と思い試してみることにしました。</p><h3 id="%E3%81%93%E3%82%93%E3%81%AA%E6%8C%87%E7%A4%BA%E3%82%92%E4%B8%8E%E3%81%88%E3%81%A6%E3%81%BF%E3%81%9F">こんな指示を与えてみた</h3><blockquote>I want to create an AWS Step Function using AWS CDK (TypeScript). The workflow should take an input list of 'orders', filter only the orders where 'status' is 'PAID', and then calculate the total sum of all 'price' fields in those paid orders. Please implement this data transformation directly within the Step Function definition without using an external Lambda function.</blockquote><blockquote>AWS CDK (TypeScript) を使用して AWS Step Functions を作成したいと考えています。ワークフローは、「orders」の入力リストを受け取り、「status」が「PAID」の注文のみをフィルタリングし、その後、それらの支払済み注文のすべての「price」フィールドの合計を計算します。このデータ変換を、外部の Lambda 関数を使用せずに、Step Functions の定義内で直接実装してください。</blockquote><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-15.08.48.png" class="kg-image" alt="" loading="lazy" width="1008" height="997" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-31-15.08.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/12/----------2025-12-31-15.08.48.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-31-15.08.48.png 1008w" sizes="(min-width: 720px) 720px"/></figure><p>Kiroの応答を見ると、<strong>search_cdk_documentation</strong> → <strong>search_cdk_samples_and_constructs </strong>→ <strong>read_iac_documentation_page </strong>を実行していることがわかります。</p><h3 id="%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E4%BD%95%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">それぞれ何をしているのか</h3><ol><li><strong>search_cdk_documentation：AWS CDKの公式ドキュメントを検索する。</strong></li></ol><p>検索対象：</p><ul><li>AWS CDK API リファレンス</li><li>AWS CDK ベストプラクティスガイド</li><li>AWS CDK コードサンプル＆パターン</li><li>CDK-NAG バリデーションルール（セキュリティチェック）</li></ul><p>使用例：</p><pre><code>search_cdk_documentation({
  query: "Lambda function with DynamoDB"
})</code></pre><p>返ってくる情報：</p><ul><li>ドキュメントのタイトル</li><li>URL</li><li>関連するコンテンツの抜粋</li><li>ランキング（関連度順）</li></ul><p>いつ使う？</p><ul><li>CDKコンストラクトのAPIや使い方を調べたい時</li><li>特定のAWSサービスの統合方法を知りたい時</li><li>ベストプラクティスを確認したい時</li></ul><hr><p><strong>2. search_cdk_samples_and_constructs：実際に動作するCDKのコードサンプルとコミュニティ製のコンストラクトを検索する。</strong></p><p>検索対象：</p><ul><li>CDKコードサンプル（実装例）</li><li>コミュニティコンストラクト</li><li>実装パターン</li><li>完全なCDKアプリケーション例</li></ul><p>対応言語：</p><ul><li>TypeScript（デフォルト）</li><li>Python</li><li>Java</li><li>C#</li><li>Go</li></ul><p>使用例：</p><pre><code>search_cdk_samples_and_constructs({
  query: "Lambda DynamoDB CRUD",
  language: "typescript"
})</code></pre><p><br>返ってくる情報：</br></p><ul><li>サンプルコードのタイトル</li><li>GitHubなどのURL</li><li>コードの抜粋</li><li>実装パターンの説明</li></ul><p>いつ使う？</p><ul><li>実際のコード例を見たい時</li><li>特定のユースケースの実装方法を知りたい時</li><li>L3コンストラクト（高レベルな抽象化）を探している時</li></ul><hr><p><strong>3. read_iac_documentation_page：AWSドキュメントの特定のページを取得して、マークダウン形式に変換するツール。</strong></p><p>対応URL：</p><ul><li>docs.aws.amazon.com</li><li>aws.amazon.com</li><li>GitHub（aws-samples、awslabs など）</li><li>constructs.dev</li></ul><p>使用例：</p><pre><code>read_iac_documentation_page({
  url: "https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html"
})</code></pre><p>返ってくる情報：</p><ul><li>ページの完全なコンテンツ（マークダウン形式）</li><li>目次（Table of Contents）</li><li>コードブロック</li><li>表やリスト</li></ul><p>特徴：</p><ul><li>長いドキュメントは分割して取得可能</li><li>start_index パラメータで続きを読める</li><li>最大文字数を指定可能</li></ul><p>いつ使う？</p><ul><li>検索結果から特定のページの詳細を読みたい時</li><li>コンストラクトの完全なAPIリファレンスが必要な時</li><li>長いガイドを段階的に読みたい時</li></ul><hr><h3 id="%E4%BB%8A%E5%9B%9E%E3%81%AEstep-functions%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%9F">今回のStep Functions実装では以下のように使われた</h3><ol><li><strong>search_cdk_documentation</strong></li></ol><ul><li>"Step Functions Map state filter transform data" を検索</li><li>JSONataの使い方に関するドキュメントを発見</li></ul><p><strong>2. search_cdk_samples_and_constructs</strong></p><ul><li>"Step Functions JSONata filter array transform" を検索</li><li>TypeScriptでの実装例を探索</li></ul><p><strong>3. read_iac_documentation_page</strong></p><ul><li>https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html を読み込み</li><li>JSONataの詳細な使い方とフィルタリング例を取得</li></ul><p>最終的に実装されたStackは以下です。</p><pre><code class="language-TypeScript">import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as logs from 'aws-cdk-lib/aws-logs';

export class OrderProcessingStepFunctionStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const logGroup = new logs.LogGroup(this, 'StateMachineLogGroup', {
      logGroupName: '/aws/vendedlogs/states/order-processing',
      retention: logs.RetentionDays.ONE_WEEK,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    const filterPaidOrders = new sfn.Pass(this, 'FilterPaidOrders', {
      comment: 'Filter orders to include only those with status=PAID',
      parameters: {
        'paidOrders.$': "$.orders[status='PAID']",
      },
    });

    const calculateTotal = new sfn.Pass(this, 'CalculateTotal', {
      comment: 'Calculate the sum of all paid order prices',
      parameters: {
        'paidOrders.$': '$.paidOrders',
        'totalPrice.$': '$sum($.paidOrders[].price)',
      },
    });

    const formatOutput = new sfn.Pass(this, 'FormatOutput', {
      comment: 'Format the final output with all required fields',
      parameters: {
        'paidOrders.$': '$.paidOrders',
        'totalPrice.$': '$.totalPrice',
        'orderCount.$': '$count($.paidOrders)',
      },
    });

    const definition = filterPaidOrders
      .next(calculateTotal)
      .next(formatOutput);

    const stateMachine = new sfn.StateMachine(this, 'OrderProcessingStateMachine', {
      stateMachineName: 'OrderProcessingStateMachine',
      definitionBody: sfn.DefinitionBody.fromChainable(definition),
      logs: {
        destination: logGroup,
        level: sfn.LogLevel.ALL,
        includeExecutionData: true,
      },
      tracingEnabled: true,
    });

    new cdk.CfnOutput(this, 'StateMachineArn', {
      value: stateMachine.stateMachineArn,
      description: 'ARN of the Order Processing State Machine',
      exportName: 'OrderProcessingStateMachineArn',
    });

    new cdk.CfnOutput(this, 'StateMachineName', {
      value: stateMachine.stateMachineName,
      description: 'Name of the Order Processing State Machine',
      exportName: 'OrderProcessingStateMachineName',
    });
  }
}</code></pre><p/><h2 id="%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC">コード解説</h2><h3 id="fiterpaidorders%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88">FiterPaidOrdersステート</h3><pre><code class="language-TypeScript">const filterPaidOrders = new sfn.Pass(this, 'FilterPaidOrders', {
  comment: 'Filter orders to include only those with status=PAID',
  parameters: {
    'paidOrders.$': "$.orders[status='PAID']",
    //         ↑ .$サフィックス = JSONPath式として評価
  },
});</code></pre><p><strong>JSONPath式: "$.orders[status='PAID']"</strong></p><ul><li>$ = 入力データのルート</li><li>.orders = ordersフィールドにアクセス</li><li>[status='PAID'] = statusが'PAID'の要素のみをフィルタ</li></ul><p><strong>動作</strong></p><pre><code>// 入力
{
  "orders": [
    {"orderId": "1", "status": "PAID", "price": 100},
    {"orderId": "2", "status": "PENDING", "price": 50},
    {"orderId": "3", "status": "PAID", "price": 200}
  ]
}

// 出力
{
  "paidOrders": [
    {"orderId": "1", "status": "PAID", "price": 100},
    {"orderId": "3", "status": "PAID", "price": 200}
  ]
}</code></pre><hr><h3 id="calculatetotal-%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88">CalculateTotal ステート</h3><pre><code class="language-TypeScript">const calculateTotal = new sfn.Pass(this, 'CalculateTotal', {
  comment: 'Calculate the sum of all paid order prices',
  parameters: {
    'paidOrders.$': '$.paidOrders',
    //         ↑ 前のステートの出力を参照
    'totalPrice.$': '$sum($.paidOrders[].price)',
    //         ↑ JSONata集約関数を使用
  },
});</code></pre><p><strong>JSONata式: '$sum($.paidOrders[].price)'</strong></p><ul><li>$sum() = JSONata集約関数（合計を計算）</li><li>$.paidOrders[] = paidOrders配列の全要素</li><li>.price = 各要素のpriceフィールドを抽出</li></ul><p><strong>動作</strong></p><pre><code class="language-TypeScript">// 入力
{
  "paidOrders": [
    {"orderId": "1", "status": "PAID", "price": 100},
    {"orderId": "3", "status": "PAID", "price": 200}
  ]
}

// 出力
{
  "paidOrders": [...],
  "totalPrice": 300  // 100 + 200
}</code></pre><hr><h3 id="formatoutput-%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88">FormatOutput ステート</h3><pre><code class="language-TypeScript">const formatOutput = new sfn.Pass(this, 'FormatOutput', {
  comment: 'Format the final output with all required fields',
  parameters: {
    'paidOrders.$': '$.paidOrders',
    'totalPrice.$': '$.totalPrice',
    'orderCount.$': '$count($.paidOrders)',
    //         ↑ JSONata関数で配列の長さを取得
  },
});</code></pre><p><strong>JSONata式: '$count($.paidOrders)'</strong></p><ul><li>$count() = JSONata関数（配列の要素数を返す）</li><li>$.paidOrders = paidOrders配列を参照</li></ul><p><strong>動作</strong></p><pre><code class="language-TypeScript">// 入力
{
  "paidOrders": [
    {"orderId": "1", "status": "PAID", "price": 100},
    {"orderId": "3", "status": "PAID", "price": 200}
  ],
  "totalPrice": 300
}

// 出力
{
  "paidOrders": [...],
  "totalPrice": 300,
  "orderCount": 2  // 配列の長さ
}</code></pre><p/><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回は、<strong>Build AWS infrastructure with CDK and CloudFormation </strong>というKiro Powersを使ってみました。ベストプラクティスをもとに実装を進めてくれるので、AWS関連のタスクを行うのに最適だなと思いました。また、チャットを見て、Kiro Powersが調査したものをもとに勉強すると、AIを使いながら、成果を出しながら、勉強しながらやっていけるのではないかと思いました。これからもっと使っていきたいと思います！</p></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[SaaSus API MCP Serverで広がるシームレスな開発体験]]></title><description><![CDATA[こんにちは、郡山です。

Model Context Protocol（MCP）に対応したAIアシスタントやコードエディタを利用することで、
SaaSus API MCP Server は、それらの MCP 対応クライアントから SaaSus API を直接操作できるようにする MCP
サーバーとして機能します。
開発者は、API仕様や認証の詳細を意識することなく、自然言語で SaaSus の各種 API にアクセスできます。
本記事では、SaaSus API MCP Server がもたらすシームレスな開発体験と、そのセットアップ方法を紹介します。

1. SaaSus API MCP Serverとは
SaaSus API MCP Serverは、SaaSus Platformが提供する各種APIをMCP経由で利用可能にするサーバー実装です。
開発者は MCP 対応クライアント（Claude Desktop / Cursor / Roo Code）から、SaaSus の API
に直接アクセスできます。
これにより、SaaS開発における操作や確認を、コードベースではなく対話的に行う]]></description><link>https://tech.anti-pattern.co.jp/saasus-api-mcp-serverdeguang-garusimuresunakai-fa-ti-yan/</link><guid isPermaLink="false">Ghost__Post__68f8424671fa390001b3411a</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 03 Dec 2025 02:06:34 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、郡山です。<br><br>Model Context Protocol（MCP）に対応したAIアシスタントやコードエディタを利用することで、<br>SaaSus API MCP Server は、それらの MCP 対応クライアントから SaaSus API を直接操作できるようにする MCP サーバーとして機能します。<br>開発者は、API仕様や認証の詳細を意識することなく、自然言語で SaaSus の各種 API にアクセスできます。<br>本記事では、SaaSus API MCP Server がもたらすシームレスな開発体験と、そのセットアップ方法を紹介します。</br></br></br></br></br></p><h2 id="1-saasus-api-mcp-server%E3%81%A8%E3%81%AF">1. SaaSus API MCP Serverとは</h2><p>SaaSus API MCP Serverは、SaaSus Platformが提供する各種APIをMCP経由で利用可能にするサーバー実装です。<br>開発者は MCP 対応クライアント（Claude Desktop / Cursor / Roo Code）から、SaaSus の API に直接アクセスできます。<br>これにより、SaaS開発における操作や確認を、コードベースではなく対話的に行うことが可能になります。</br></br></p><h2 id="2%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86">2.<strong>インストール手順</strong></h2><p>参考: <a href="https://docs.saasus.io/ja/docs/part-4/mcp-server/setup#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86">SaaSus API MCP Server セットアップガイド</a></p><h3 id="21-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3">2.1. リポジトリをクローン</h3><pre><code>git clone https://github.com/saasus-platform/saasus-api-mcp-server.git
cd saasus-api-mcp-server
</code></pre><h3 id="22-%E4%BE%9D%E5%AD%98%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">2.2. 依存パッケージをインストール</h3><pre><code>npm install
</code></pre><h2 id="3-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%81%AE%E8%A8%AD%E5%AE%9A">3. AIエージェントでの設定</h2><p>Claude Desktop、Cursor、Roo Code などの MCP 対応クライアントに SaaSus API MCP Server を追加します。</p><h3 id="31-node%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E7%A2%BA%E8%AA%8D">3.1. nodeのパスを確認</h3><p>環境変数やシェルで Node.js が利用可能か確認します。</p><pre><code class="language-bash">which node</code></pre><h3 id="32-mcpserverjs%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E7%A2%BA%E8%AA%8D">3.2. mcpServer.jsのパスを確認</h3><p><code>saasus-api-mcp-server</code> ディレクトリ内の <code>mcpServer.js</code> ファイルの絶対パスを取得します。</p><pre><code class="language-bash">realpath mcpServer.js</code></pre><h3 id="33-saasus-platform-%E3%81%AEapi%E3%82%AD%E3%83%BC%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97">3.3. <strong>SaaSus Platform のAPIキー情報の取得</strong></h3><p>SaaSus Platformより以下のキー情報を取得します。</p><ul><li><code>SAASUS_PLATFORM_SAASID</code>: SaaS ID</li><li><code>SAASUS_PLATFORM_APIKEY</code>: API キー</li><li><code>SAASUS_PLATFORM_SECRETKEY</code>: シークレットキー</li></ul><h3 id="34-mcp-server-%E3%81%AE%E8%A8%AD%E5%AE%9A">3.4.  MCP Server の設定</h3><p>ここでは Roo Code を例に設定を行います。</p><p>VS Codeを開き、拡張機能でインストールした Roo Code を起動します。<br>右上の 3点リーダー（⋯）メニュー から 「MCPサーバー」 をクリックします。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-1.png" class="kg-image" alt="" loading="lazy" width="684" height="651" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-1.png 684w"/></figure><p>「MCPサーバーメニュー」が開いたら、「グローバルMCPを編集」 を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-2.png" class="kg-image" alt="" loading="lazy" width="1021" height="817" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-2.png 1021w" sizes="(min-width: 720px) 720px"/></figure><p><br>エディタに表示された mcp_settings.json を以下のように編集します。</br></p><pre><code class="language-json">{
  "mcpServers": {
    "saasusapis": {
      "command": "node",
      "args": ["/path/to/mcpServer.js"],
      "env": {
        "SAASUS_PLATFORM_SAASID": "your_saas_id",
        "SAASUS_PLATFORM_APIKEY": "your_api_key",
        "SAASUS_PLATFORM_SECRETKEY": "your_secret_key"
      }
    }
  }
}</code></pre><p>保存後、「saasusapis」が追加されたことを確認し、完了ボタンをクリックして設定を終了します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-3.png" class="kg-image" alt="" loading="lazy" width="644" height="238" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-3.png 644w"/></figure><h2 id="4-%E5%AE%9F%E8%A1%8C">4. 実行</h2><p>設定が完了したら、AIエージェントで以下のように入力してみてください。<br><code>SaaSus Platformの設定情報を取得してください</code> </br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-4.png" class="kg-image" alt="" loading="lazy" width="643" height="738" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-4.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-4.png 643w"/></figure><p>実行すると、エージェントが自動的に解析を行い、SaaSus API MCP Server 経由で SaaSus Platform API を呼び出して設定情報を取得します。<br>このように、プログラムコードを書かずに自然言語でAPI操作が行えます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-5.png" class="kg-image" alt="" loading="lazy" width="618" height="799" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-5.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-5.png 618w"/></figure><h2 id="5-saasus-platform-%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">5. SaaSus Platform の実行サンプル</h2><p>SaaSus Platform では、MCP Server を利用した各種サンプルプロンプトが提供されています。<br>詳細は以下のドキュメントをご参照ください。<br>🔗 <a href="https://docs.saasus.io/ja/docs/part-4/mcp-server/environment-setup-guide" rel="noopener">環境セットアップガイド</a></br></br></p><p>ユーザーの一括登録、一覧取得、メータリング情報の取得など、<br>従来コードで実装していた処理を自然言語で実行できるのが最大の特長です。</br></p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>SaaSus API MCP Serverを利用することで、SaaSus Platform のAPI群をAIエージェントや開発ツールから直接操作できるようになります。<br>API仕様やトークン設定に煩わされることなく、自然言語による直感的な開発体験を実現します。</br></p><p>ぜひ一度試してみてください。</p>]]></content:encoded></item><item><title><![CDATA[CDKタスクは本当にKiro CLIが有効？Copilot CLIとベンチマーク比較してみた]]></title><description><![CDATA[こんにちは！現在APでインターンをしている学部3年の鈴木鴻太です！

最近、Amazon Q Developerと Kiro CLI が統合されました。そこで今回、性能を測るためにKiro CLI と GitHub Copilot
CLI を同じ条件下でベンチマーク比較してみました。

本記事では、5つの段階的難易度のCDKタスクを両CLIに解かせ、LLM-as-a-Judge（LLMによる自動評価）を用いて定量的・定性的に比較した結果をまとめます。


--------------------------------------------------------------------------------

背景：なぜ比較しようと思ったか
AWS開発では、Q devやKiroが有名ですが、逆に以下の疑問が生まれました。

 * その他のAI CLIツールで同じLLM（Claude Sonnet 4.5など）を使った場合、推論層（RAG・システムプロンプト等）
   の違いだけでどれだけ性能が変わるのか？
 * AWS CDK という「抽象化された IaC」において、どちらのツー]]></description><link>https://tech.anti-pattern.co.jp/cdk-kiro-vs-copilot/</link><guid isPermaLink="false">Ghost__Post__692d6b2271fa390001b357d9</guid><dc:creator><![CDATA[kou135]]></dc:creator><pubDate>Tue, 02 Dec 2025 07:46:29 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！現在APでインターンをしている学部3年の鈴木鴻太です！</p><p>最近、Amazon Q Developerと Kiro CLI が統合されました。そこで今回、性能を測るためにKiro CLI と GitHub Copilot CLI を同じ条件下でベンチマーク比較してみました。</p><p>本記事では、5つの段階的難易度のCDKタスクを両CLIに解かせ、LLM-as-a-Judge（LLMによる自動評価）を用いて定量的・定性的に比較した結果をまとめます。</p><hr><h2 id="%E8%83%8C%E6%99%AF%EF%BC%9A%E3%81%AA%E3%81%9C%E6%AF%94%E8%BC%83%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%8B"><strong>背景：なぜ比較しようと思ったか</strong></h2><p>AWS開発では、Q devやKiroが有名ですが、逆に以下の疑問が生まれました。</p><ul><li>その他のAI CLIツールで同じLLM（Claude Sonnet 4.5など）を使った場合、推論層（RAG・システムプロンプト等） の違いだけでどれだけ性能が変わるのか？</li><li>AWS CDK という「抽象化された IaC」において、どちらのツールが「CDK らしい書き方」を生成するのか？</li></ul><p>Kiro CLI は .kiro/steering/ ディレクトリでプロジェクト固有の規約を注入でき、GitHub Copilot CLI は「カスタムインストラクション」や GitHub Spaces を通じたナレッジ管理が可能です。つまり、モデル性能ではなく、ツール設計の差 を純粋に見たかったのが背景です。</p><hr><h2 id="%E6%A4%9C%E8%A8%BC%E6%89%8B%E6%B3%95"><strong>検証手法</strong></h2><h2 id="1-%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6%EF%BC%9A%E5%90%8C%E4%B8%80%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BD%BF%E7%94%A8"><strong>1. 前提条件：同一モデルの使用</strong></h2><p>公平性を担保するため、両CLIとも Claude Sonnet 4.5 を統一して使用しました。これにより、「学習段階などのモデルの違い」ではなく「推論層の違い」だけを抽出できます。<br/></p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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DXA17Lp98+SpOZ1l3LT6cs/ksww55lqn0jcfylZ2yfPzz1NhHpvcT16ePUpum9BE7p16tqzdO9ccNJfdbrxciWSdJFcrIe98PVQefL+xKoMur/njfL/tmCaPzmwlo8bXkIff7i2vzr1enp8+RO58saWK9+u2KRLMPys8UY4H3muo6vLRLznbdsA9P9l8eIli/sg7F8ikD6+Rax6vIk/O7ijlqxZTaYHLdxsnifnPKS5W62cugz92bL1w082jZcSIEfL888/Lo48+KkOGDpAbx4yS+ISicvWIq9T58y8EZxU4lLY33DhShg0fpPJB3pB/Nud8qNFcj0DKY97G4tNPPzUnS3t0EWBpSYAESIAESIAESIAEQkSACuIQgWY2JEACJEAC3ghEltuwPuNVgdLS0+T3nR8oe6gPR+Uv2Xr0K0kod8JS1nbjWcokKzCUySeKblSrq/ekLpfipQ9nucbW//Ei62XHsaVSuUYpvysWLVxOpR+XX1Yul7Xrfve7btEW8LrrrlNFzszMlLnzZio7DyRAAiRAAiRAAiRAAiRAAr4JhEZB7Dt/+pAACZAACZBAxBCYNOsaefTdC+W/L7eNmDKxICRAAgUTOHokVZIrVJX/3fOAVKpUSUUwf5xPOfBAAiRAAiQQGgLMhQRIgARIIOoIUEEcdU3GApMACZAACQSLQHqJrYItIEqUPRqsLJguCcQMgUiqCD5MN3HiRGnSpIkqVlpamowbN07ZeSABEiABEiABEiABEiABEsifABXE+fOhLwkUdgKsPwmQAAmQAAlEDQF8bG/z5s0ydOhQSUwqETXlZkFJgARIgARIgARIIAIIsAiFmAAVxIW48Vl1EiABEiABEiABEogFAvjgHQQftxt3391SPC4WasU6kECwCDBdEiABEiABEiABEshNgAri3Dx4RgIkQAIkQAKxQYC1IAESIAESIAESIAESIAESIAESIAE/CFBB7AekSA7CspEACZAACZAACZAACZAACZAACZAACcQ+AdaQBEiABIJFgAriYJFluiRAAiRAAiRAAiRAAiRgnQBjkAAJkAAJkAAJkAAJkEBICVBBHFLczIwESIAENAGaJEACJEACJEACJEACJEACJEACJEACsU8g8mtIBXHktxFLSAIkQAIkQAIkQAIkQAIkQAIkEOkEWD4SIAESIAESiFICVBBHacOx2CRAAiRAAiRAAuEhwFxJgARIgARIgARIgARIgARIIJYIUEEcS63JujhJgGmRAAmQAAmQAAmQAAmQAAmQAAmQAAnEPgHWkAQKPQEqiAt9FyAAEiABEiABEiABEiABEigMBFhHEiABEiABEiABEiABbwSoIPZGhW4kQAIkQALRS4AlJwESIAESIAESIAESIAESIAESIAES8JtA1CqI/a4hA5IACZAACZAACZAACZAACZAACZAACUQtARacBEiABEgguASoIA4uX6ZOAiRAAiRAAiRAAiTgHwGGIgESIAESIAESIAESIAESCAMBKojDAJ1ZkkDhJsDakwAJkAAJkAAJkAAJkAAJkAAJkAAJxD4B1jBaCFBBHC0txXKSAAmQAAmQAAmQAAmQAAmQQCQSYJlIgARIgARIgASimgAVxFHdfCw8CZAACZAACYSOAHMiARIgARIgARIgARIgARIgARKIPQJUEMdemwZaI8YnARIgARIgARIgARIgARIgARIgARKIfQKsIQmQAAkoAlQQKww8kAAJkAAJkAAJkAAJkECsEmC9SIAESIAESIAESIAESMA3ASqIfbOhDwmQAAlEFwGWlgRIgARIgARIgARIgARIgARIgARIIPYJOFxDKogdBsrkSIAESIAESIAESIAESIAESIAESMAJAkyDBEiABEiABEJBgAriUFBmHiRAAiRAAiRAAiTgmwB9SIAESIAESIAESIAESIAESCBsBKggDht6Zlz4CLDGJEACJEACJEACJEACJEACJEACJEACsU+ANSSB6CJABXF0tRdLSwIkQAIkQAIkQAIkQAIkECkEWA4SIAESIAESIAESiAECVBDHQCOyCiRAAiRAAsElwNRJgARIgARIgARIgARIgARIgARIIFYJUEGc07K0kQAJkAAJkAAJkAAJkAAJkAAJkAAJxD4B1pAESIAESMBEgApiEwxaSYAESIAESIAESIAEYokA60ICJEACJEACJEACJEACJFAQASqICyJEfxIggcgnwBKSAAmQAAmQAAmQAAmQAAmQAAmQAAnEPgHWMCgEqCAOClYmSgIkQAIkQAIkQAIkQAIkQAIkYJcA45EACZAACZAACYSOABXEoWPNnEiABEiABEiABHIT4BkJkAAJkAAJkAAJkAAJkAAJkECYCVBBHOYGKBzZs5YkQAIkQAIkQAIkQAIkQAIkQAIkQAKxT4A1JAESiEYCVBBHY6uxzCRAAiRAAiRAAiRAAiQQTgLMmwRIgARIgARIgARIIGYIUEEcM03JipAACZCA8wSYIgmQAAmQAAmQAAmQAAmQAAmQAAmQQGwTgII4tmvI2pEACZAACZAACZAACZAACZAACZAACYAAhQRIgARIgATyEKCCOA8SOpAACZAACZAACZBAtBNg+UmABEiABEiABEiABEiABEjAPwJUEPvHiaFIIDIJsFQkQAIkQAIkQAIkQAIkQAIkQAIkQAKxT4A1JIEgEqCCOIhwmTQJkAAJkAAJkAAJkAAJkAAJWCHAsCRAAiRAAiRAAiQQagJUEIeaOPMjARIgARIgAREyIAESIAESIAESIAESIAESIAESIIGIIBB0BfHp06dVRYsUCXpWKp/IOrA0JEACJEACJEACJEACJEACJEACJEACsU/AuRpq/YnWpziXMlMiARIgAe8Egq61PXr0qMo5KSlJmTyQAAmQAAmQAAmQAAmQQNQSYMFJgARIgARIIMgEypUrp3I4dOiQMnkgARIggWATCLqC+MCBA6oOtWrVUiYPJEACJBANBFhGEiABEiABEiABEiABEiABEggHgTp16qhs9+7dq0weSIAEgkuAqYsEXUFcIr6InDhxQsqXLy+pJ0+TOQmQAAmQAAmQAAmQAAmQAAmQAAmEmgDzI4GoIBBfIkkSExNl3759klQ6PirKzEKSAAlEP4GgK4iB6LfffoMhffv2VSYPJEACJEACJEACJBAcAkyVBEiABEiABEiABKKTwL69hwy9yffffx+dlWCpSYAEopJASBTE/2xeL9iLuGLFitK5UzfZsZ2vSURlb4mkQrMsJEACJEACJEACJEACJEACJEACJBAjBIoVTZDrrrtO4uLiZP369XLseEqM1MyBajAJEiCBoBMIiYIYtZg5c6akpqbKGWecIXfccYd07NBVzqxTX6pWOYNCBuwD7APsA+wD7APsA+wD7APsA4W8D/C5gM9F7APsA4WtD9SpXU9at+ogl106QK688kqJj4+Xv//+W35ZuRxqFAoJkAAJhIxAyBTECSWLyRtvvCEbNmxQlatdu7a0b99eunXrRiED9gH2AfaBwtMH2NZsa/YB9gH2AfYB9gH2AfYB9gH2gaw+0KFDB6lXr55SDKekpMjixYtlxY/fKZ0JDyRAAiQQSgJBUhB7r0JyxTLy8y8/yMSJE2XWrFlq8Pv666/lawoZsA+wD7APsA+wD7APsA+wD7APsA+wD7APsA9EYR/4mmW22W8/++wzmT17tvzf//2ffPLpfDlwcLd3ZQpdSYAESCDIBEKqINZ1qVylvKRnnFCD385d/wqFDNgH2AfYB9gH2AfYB9gHIrwPcM7GOSv7APsA+wD7APuAo31g/4FdknbqmCQmldDqEpokQAIkEBYCYVEQh6WmzJQESMAvAgxEAiRAAiRAAiRAAiRAAiRAAiRAAiQQ+wRYQxLQBKgg1iRokgAJkAAJkAAJkAAJkAAJkEDsEWCNSIAESIAESIAESCBfAlQQ54uHniRAAiRAAiQQLQRYThIgARIgARIgARIgARIgARIgARKwToAKYuvMwhuDuZMACZAACZAACZAACZAACZAACZAACcQ+AdaQBEiABEJEgAriEIFmNiRAAiRAAiRAAiRAAiTgjQDdSIAESIAESIAESIAESCCcBKggDid95k0CJFCYCLCuJEACJEACJEACJEACJEACJEACJEACsU8g6mpIBXHUNRkLTAIkQAIkQAIkQAIkQAIkQAIkEH4CLAEJkAAJkAAJxAYBKohjox1ZCxIgARIgARIggWARYLokQAIkQAIkQAIkQAIkQAIkEMMEqCCO4cZl1awRYGgSIAESIAESIAESIAESIAESIAESIIHYJ8AakgAJ5CZABXFuHjwjARIgARIgARIgARIgARKIDQKsBQmQAAmQAAmQAAmQgB8EqCD2AxKDkAAJkAAJRDIBlo0ESIAESIAESIAESIAESIAESIAESMAugehRENutIeORAAmQAAmQAAmQAAmQAAmQAAmQAAlEDwGWlARIgARIIKQEqCAOKW5mRgIkQAIkQAIkQAIkoAnQJAESIAESIAESIAESIAESCD8BKojD3wYsAQnEOgHWjwRIgARIgARIgARIgARIgARIgARIIPYJsIZRSoAK4ihtOBabBEiABEiABEiABEiABEiABMJDgLmSAAmQAAmQAAnEEgEqiGOpNVkXEiABEiABEnCSANMiARIgARIgARIgARIgARIgARKIeQJUEMd8ExdcQYYgARIgARIgARIgARIgARIgARIgARKIfQKsIQmQABYpw90AABAASURBVAl4I0AFsTcqdCMBEiABEiABEiABEiCB6CXAkpMACZAACZAACZAACZCA3wSoIPYbFQOSAAmQQKQRYHlIgARIgARIgARIgARIgARIgARIgARin0Bwa0gFcXD5MnUSIAESIAESIAESIAESIAESIAES8I8AQ5EACZAACZBAGAhQQRwG6MySBEiABEiABEigcBNg7UmABEiABEiABEiABEiABEggUghQQRwpLcFyxCIB1okESIAESIAESIAESIAESIAESIAESCD2CbCGJBDVBKggjurmY+FJgARIgARIgARIgARIgARCR4A5kQAJkAAJkAAJkEDsEaCCOPbalDUiARIgARIIlADjkwAJkAAJkAAJkAAJkAAJkAAJkEAhIVCoFcSFpI1ZTRIgARIgARIgARIgARIgARIgARIo1ARYeRIgARIgAd8EqCD2zYY+JEACJEACJEACJEAC0UWApSUBEiABEiABEiABEiABErBIgApii8AYnARIIBIIsAwkQAIkQAIkQAIkQAIkQAIkQAIkQAKxT4A1DAUBKohDQZl5kAAJkAAJkAAJkAAJkAAJkAAJ+CZAHxIgARIgARIggbARoII4bOiZMQmQAAmQAAkUPgKsMQmQAAmQAAmQAAmQAAmQAAmQQGQRoII4stojVkrDepAACZAACZAACZAACZAACZAACZAACcQ+AdaQBEggBghQQRwDjcgqkAAJkAAJkAAJkAAJkEBwCTB1EiABEiABEiABEiCBWCVABXGstizrRQIkQAJ2CDAOCZAACZAACZAACZAACZAACZAACZBA7BMw1ZAKYhMMWkmABEiABEiABEiABEiABEiABEgglgiwLiRAAiRAAiRQEAEqiAsiRH8SIAESIAESIAESiHwCLCEJkAAJkAAJkAAJkAAJkAAJ2CJABbEtbIxEAuEiwHxJgARIgARIgARIgARIgARIgARIgARinwBrSAKhI0AFcehYMycSIAESIAESIAESIAESIAESyE2AZyRAAiRAAiRAAiQQZgJUEIe5AZg9CZAACZBA4SDAWpIACZAACZAACZAACZAACZAACZBAJBKggtjZVmFqJEACJEACJEACJEACJEACJEACJEACsU+ANSQBEiCBmCFABXHMNCUrQgIkQAIkQAIkQAIk4DwBpkgCJEACJEACJEACJEACsU2ACuLYbl/WjgRIwF8CDEcCJEACJEACJEACJEACJEACJEACJBD7BFjDPASoIM6DhA4kQAIkQAIkQAIkQAIkQAIkQALR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CZAACZBA+AlQQRz+NmAJSIAESCCqCeADMVFdgQIKj4+XfrP0c/lt9c8FhKQ3CeRDgF4kEMUE4ssei+LSs+gkQAIkQAIkQAIkQAIFEaCCuCBC9CcBCwQYlARIgARIgARIgARIgARIgARIgARIIPYJsIYkEEsEqCCOpdZkXUiABEiABEiABEiABEiABJwkwLRIgARIgARIgARIIOYJUEEc803MCpIACZAACRRMgCFIgARIgARIgARIgARIgARIgARIoHASKFwK4sLZxqw1CZAACZAACZAACZAACZAACZAACRQuAqwtCZAACZCA3wSoIPYbFQOSAAmQAAmQAAmQAAlEGgGWhwRIgARIgARIgARIgARIIDACVBAHxo+xSYAEQkOAuZAACZAACZAACZAACZAACZAACZAACcQ+AdYwDASoIA4DdGZJAiRAAiRAAiRAAiRAAiRAAoWbAGtPAiRAAiRAAiQQKQSoII6UlmA5SIAESIAESCAWCbBOJEACJEACJEACJEACJEACJEACEU2ACuKIbp7oKRxLSgIkQAIkQAIkQAIkQAIkQAIkQAIkEPsEWEMSIIHYI0AFcey1KWtEAiRAAiRAAiRAAiRAAoESYHwSIAESIAESIAESIIFCQoAK4kLS0KwmCZAACXgnQFcSIAESIAESIAESIAESIAESIAESIIHYJ+C7hlQQ+2ZDHxIgARIgARIgARIgARIgARIgARKILgIsLQmQAAmQAAlYJEAFsUVgDE4CJEACJEACJEACkUCAZSABEiABEiABEiABEiABEiABJwhQQewERaZBAsEjwJRJgARIgARIgARIgARIgARIgARIgARinwBrSAJhI0AFcdjQM2MSIAESIAESIAESIAESIIHCR4A1JgESIAESIAESIIHIIkAFcWS1B0tDAiRAAiQQKwRYDxIgARIgARIgARIgARIgARIgARKIAgJUEAfYSIxOAiRAAiRAAiRAAiRAAiRAAiRAAiQQ+wRYQxIgARKIVQJUEMdqy7JeJEACJEACJEACJEACdggwDgmQAAmQAAmQAAmQAAkUKgJUEBeq5mZlSYAEcgjQRgIkQAIkQAIkQAIkQAIkQAIkQAIkEPsEWMOCCFBBXBAh+pMACZAACZAACZAACZAACZAACUQ+AZaQBEiABEiABEjAFgEqiG1hYyQSIAESIAESIIFwEWC+JEACJEACJEACJEACJEACJEACzhGggtg5lkzJWQJMjQRIgARIgARIgARIgARIgARIgARIIPYJsIYkQAJhJkAFcZgbgNmTAAmQAAmQAAmQAAmQQOEgwFqSAAmQAAmQAAmQAAlEIgEqiCOxVVgmEiABEohmAiw7CZAACZAACZAACZAACZAACZAACZBA1BCwrSCOmhqyoCRAAiRAAiRAAiRAAiRAAiRAAiRAArYJMCIJkAAJkEBsE6CCOLbbl7UjARIgARIgARIgAX8JMBwJkAAJkAAJkAAJkAAJkEAhJEAFcSFsdFa5sBNg/UmABEiABEiABEiABEiABEiABEiABGKfAGtIAv4RoILYP04MRQIkQAIkQAIkQAIkQAIkQAKRSYClIgESIAESIAESIIEACFBBHAA8RiUBEiABEiCBUBJgXiRAAiRAAiRAAiRAAiRAAiRAAiTgNAEqiJ0mGnh6TIEESIAESIAESIAESIAESIAESIAESCD2CbCGJEACJBARBKggjohmYCFIgARIgARIgARIgARilwBrRgIkQAIkQAIkQAIkQAKRS4AK4shtG5aMBEgg2giwvCRAAiRAAiRAAiRAAiRAAiRAAiRAArFPIMZqSAVxjDUoq0MCJEACJEACJEACJEACJEACJOAMAaZCAiRAAiRAAoWBABXEhaGVWUcSIAESIAESIIH8CNCPBEiABEiABEiABEiABEiABAotASqIC23TF8aKs84kQAIkQAIkQAIkQAIkQAIkQAIkQAKxT4A1JAESsEKACmIrtBiWBEiABEiABEiABEiABEggcgiwJCRAAiRAAiRAAiRAAgEToII4YIRMgARIgARIINgEmD4JkAAJkAAJkAAJkAAJkAAJkAAJkEBwCESSgjg4NWSqJEACJEACJEACJEACJEACJEACJEACkUSAZSEBEiABEoggAlQQR1BjsCgkQAIkQAIkQAIkEFsEWBsSIAESIAESIAESIAESIIFIJ0AFcaS3EMtHAtFAgGUkARIgARIgARIgARIgARIgARIgARKIfQKsYUwSoII4JpuVlSIBEiABEiABEiABEiABEiAB+wQYkwRIgARIgARIoPAQoIK48LQ1a0oCJEACJEACngR4TgIkQAIkQAIkQAIkQAIkQAIkUMgJUEFcKDoAK0kCJEACJEACJEACJEACJEACJEACJBD7BFhDEiABErBOgApi68wY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Fbn22mvV+foNf6i8kdeXXy32GvfV1yap9IcMGSLPP/+8TJgwQW699VYVb+ztN8lPP3/vNZ7ZMTGphIy7726VJ/LSEqyP+pnzpp0ESIAESIAESIAEChEBVpUESIAESIAESIAESIAEooZAVCuI9QffsCJ2/oLZIYeeXLGMbPp7rSxf8a2kZ5zwO/+TqUfUamesRvY7kg7oOiW/rFyuFML7D+zSrjRJgATCQoCZkgAJkAAJkAAJkAAJkAAJkAAJkAAJxD6B2K5hVCuIH3/8cbnvvvvk+uuvj+1WYu1IgARIgARIgARIgARIgARIgASCT4A5kAAJkAAJkEAhJBDVCuJdu7fKP5vXC1bkFsK2Y5VJgARIgARIgARsEmA0EiABEiABEiABEiABEiABEiABN4GoVhC7q8AjCfgkQA8SIAESIAESIAESIAESIAESIAESIIHYJ8AakgAJBECACuIA4DEqCZAACZAACZAACZAACZBAKAkwLxIgARIgARIgARIgAacJUEHsNFGmRwIkQAIkEDgBpkACJEACJEACJEACJEACJEACJEACJBASAmFVEIekhsyEBEiABEiABEiABEiABEiABEiABEggrASYOQmQAAmQQOQSoII4ctuGJSMBEiABEiABEiCBaCPA8pIACZAACZAACZAACZAACUQZASqIo6zBWFwSiAwCLAUJkAAJkAAJkAAJkAAJkAAJkAAJkEDsE2ANCwMBKogLQyuzjiRAAiRAAiRAAiRAAiRAAiSQHwH6kQAJkAAJkAAJFFoCVBAX2qZnxUmABEiABAojAdaZBEiABEiABEiABEiABEiABEiABMwEqCA204gdO2tCAiRAAiRAAiRAAiRAAiRAAiRAAiQQ+wRYQxIgARIImAAVxAEjZAIkQAIkQAIkQAIkI3RLggAAEABJREFUQAIkEGwCTJ8ESIAESIAESIAESIAEgkOACuLgcGWqJEACJGCPAGORAAmQAAmQAAmQAAmQAAmQAAmQAAnEPoEIqiEVxBHUGCwKCZAACZAACZAACZAACZAACZBAbBFgbUiABEiABEgg0glQQRzpLcTykQAJkAAJkAAJRAMBlpEESIAESIAESIAESIAESIAEopIAFcRR2WwsdPgIMGcSIAESIAESIAESIAESIAESIAESIIHYJ8AakkDhIUAFceFpa9aUBEiABEiABEiABEiABEjAkwDPSYAESIAESIAESKCQE6CCuJB3AFafBEiABAoLAdaTBEiABEiABEiABEiABEiABEiABEggL4FYUxDnrSFdSIAESIAESIAESIAESIAESIAESIAEYo0A60MCJEACJOAQASqIHQLJZEiABEiABEiABEiABIJBgGmSAAmQAAmQAAmQAAmQAAkEkwAVxMGky7RJgAT8J8CQJEACJEACJEACJEACJEACJEACJEACsU+ANYw4AlQQR1yTsEAkQAIkQAIkQAIkQAIkQAIkEP0EWAMSIAESIAESIIHoIEAFcXS0E0tJAiRAAiRAApFKgOUiARIgARIgARIgARIgARIgARKIYgJUEEdx44W26MyNBEiABEiABEiABEiABEiABEiABEgg9gmwhiRAAoWNABXEha3FWV8SIAESIAESIAESIAESAAEKCZAACZAACZAACZAACWQRoII4CwL/SYAESCCWCbBuJEACJEACJEACJEACJEACJEACJEACsU/Abg2pILZLjvFIgARIgARIgARIgARIgARIgARIIPQEmCMJkAAJkAAJOEqACmJHcTIxEiABEiABEiABEnCKANMhARIgARIgARIgARIgARIggeAToII4+IyZAwnkT4C+JEACJEACJEACJEACJEACJEACJEACsU+ANSSBCCVABXGENgyLRQIkQAIkQAIkQAIkQAIkEJ0EWGoSIAESIAESIAESiCYCVBBHU2uxrCRAAiRAApFEgGUhARIgARIgARIgARIgARIgARIggagnQAVxgU3IACRAAiRAAiRAAiRAAiRAAiRAAiRAArFPgDUkARIggcJJgAriwtnurDUJkAAJkAAJkAAJFF4CrDkJkAAJkAAJkAAJkAAJkIBBgApiAwUtJEACsUaA9SEBEiABEiABEiABEiABEiABEiABEoh9AqxhYASoIA6MX1TFPrK3mFzX7UMlUVXwQlzYEV2mqfYqcrxaIabAqpMACZAACZAACZAACZCAIsADCZAACZAACZBAEAhQQRwEqJGa5Nj+78mZVVtKucSqkVpElsuDQHxcomqzsVe87+ET3NO44qWkU8dzpVHD5sHNiKmHhEDjRi2kSeOWcuxoWoH5nVmnvkAOHzpRYNhwBShs/dNK+/nTJieOp0u7tp3zSFJieX+ihyiM/WzOqHmW6u/xJZLsJ8KYBoHatc5WPHHdGY602CaA6w/j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AAmQAAmQAAmQAAlEjgBzIgESIAESIAESIAESIAEScJ0AFcSuI2WCJEACoRJgfBIgARIgARIgARIgARIgARIgARIggfgnwBpGBwEqiKOjHVgKEiABEiABEiABEiABEiABEohXAqwXCZAACZAACZBAFBOggjiKG4dFIwESIAESIIHYIsDSkgAJkAAJkAAJkAAJkAAJkAAJxBoBKohjrcWiobwsAwmQAAmQAAmQAAmQAAmQAAmQAAmQQPwTYA1JgARyBAEqiHNEM7OSJEACJEACJEACJEACJOCfAH1IgARIgARIgARIgARyLgEqiHNu27PmJEACOY8Aa0wCJEACJEACJEACJEACJEACJEACJBD/BIKqIRXEQeFiYBIgARIgARIgARIgARIgARIgARKIFgIsBwmQAAmQAAmEToAK4tAZMgUSIAESIAESIAESCC8Bpk4CJEACJEACJEACJEACJEACYSJABXGYwDJZEnBCgHFIgARIgARIgARIgARIgARIgARIgATinwBrSALRRIAK4mhqDZaFBEiABEiABEiABEiABEggngiwLiRAAiRAAiRAAiQQ9QSoII76JmIBSYAESIAEop8AS0gCJEACJEACJEACJEACJEACJEACsUmACuJg2o1hSYAESIAESIAESIAESIAESIAESIAE4p8Aa0gCJEACOYgAFcQ5qLFZVRIgARIgARIgARIgAW8CPCMBEiABEiABEiABEiCBnE6ACuKc3gNYfxLIGQRYSxIgARIgARIgARIgARIgARIgARIggfgnwBo6IEAFsQNojEICJEACJEACJEACJEACJEACJJCdBJg3CZAACZAACZCAWwSoIHaLJNMhARIgARIgARJwnwBTJAESIAESIAESIAESIAESIAESCCsBKojDipeJB0qA4UiABEiABEiABEiABEiABEiABEiABOKfAGtIAiQQfQSoII6+NmGJSIAESIAESIAESIAESCDWCbD8JEACJEACJEACJEACMUKACuIYaSgWkwRIgASikwBLRQIkQAIkQAIkQAIkQAIkQAIkQAIkEMsEAlMQx3INWXYSIAESIAESIAESIAESIAESIAESIIHACDAUCZAACZBAjiNABXGOa3JWmARIgARIgARIgAREyIAESIAESIAESIAESIAESIAEQIAKYlCgkED8EmDNSIAESIAESIAESIAESIAESIAESIAE4p8Aa0gCjglQQewYHSOSAAmQAAmQAAmQAAmQAAmQQKQJMD8SIAESIAESIAEScJcAFcTu8mRqJEACJEACJOAOAaZCAiRAAiRAAiRAAiRAAiRAAiRAAhEgQAVxBCBnlgX9SIAESIAESIAESIAESIAESIAESIAE4p8Aa0gCJEAC0UqACuJobRmWiwRIgARIgARIgARIIBYJsMwkQAIkQAIkQAIkQAIkEFMEqCCOqeZiYUmABKKHAEtCAiRAAiRAAiRAAiRAAiRAAiRAAiQQ/wTiv4ZUEMd/G7OGJEACJEACJEACJEACJEACJEACWRGgPwmQAAmQAAnkUAJUEOfQhme1SYAESIAESCCnEmC9SYAESIAESIAESIAESIAESIAE0glQQZzOgrb4IsDakAAJkAAJkAAJkAAJkAAJkAAJkAAJxD8B1pAESCBEAlQQhwiQ0UmABEiABEiABEiABEiABCJBgHmQAAmQAAmQAAmQAAmEgwAVxOGgyjRJgARIgAScE2BMEiABEiABEiABEiABEiABEiABEiCBiBHINgVxxGrIjEiABEiABEiABEiABEiABEiABEiABLKNADMmARIgARKIbgJUEEd3+7B0JEACJEACJEACJBArBFhOEiABEiABEiABEiABEiCBGCRABXEMNhqLTALZS4C5kwAJkAAJkAAJkAAJkAAJkAAJkAAJxD8B1jCnEKCCOKe0NOtJAiRAAiRAAiRAAiRAAiRAAnYE6EYCJEACJEACJJCjCVBBnKObn5UnARIgARLISQRYVxIgARIgARIgARIgARIgARIgARLwJUAFsS+R2D9nDUiABEiABEiABEiABEiABEiABEiABOKfAGtIAiRAAq4QoILYFYxMhARIgARIgARIgARIgATCRYDpkgAJkAAJkAAJkAAJkED4CFBBHD62TJkESIAEgiPA0CRAAiRAAiRAAiRAAiRAAiRAAiRAAvFPIMpqSAVxlDUIi0MCJEACJEACJEACJEACJEACJBAfBFgLEiABEiABEogFAlQQx0IrsYwkQAIkQAIkQALRTIBlIwESIAESIAESIAESIAESIIGYJUAFccw2HQseeQLMkQRIgARIgARIgARIgARIgARIgARIIP4JsIYkkLMIUEGcs9qbtSUBEiABEiABEiABEiABEtAEaJIACZAACZAACZAACQgVxOwEJEACJEACcU+AFSQBEiABEiABEiABEiABEiABEiABErAnEE8KYvsa0pUESIAESIAESIAESIAESIAESIAESCCeCLAuJEACJEACLhKggthFmEyKBEiABEiABEiABEjATQJMiwRIgARIgARIgARIgARIINwEqCAON2GmTwIkkDUBhiABEiABEiABEiABEiABEiABEiABEoh/AqxhVBKggjgqm4WFIgESIAESIAESIAESIAESIIHYJcCSkwAJkAAJkAAJxA4BKohjp61YUhIgARIga8MYdQAABjJJREFUARKINgIsDwmQAAmQAAmQAAmQAAmQAAmQQIwToII4xhswMsVnLiRAAiRAAiRAAiRAAiRAAiRAAiRAAvFPgDUkARLIiQSoIM6Jrc46kwAJkAAJkAAJkAAJ5GwCrD0JkAAJkAAJkAAJkAAJpBGggjgNBA0SIAESiEcCrBMJkAAJkAAJkAAJkAAJkAAJkAAJkED8EwilhlQQh0KPcUmABEiABEiABEiABEiABEiABEggcgSYEwmQAAmQAAm4ToAKYteRMkESIAESIAESIAESCJUA45MACZAACZAACZAACZAACZBAZAhQQRwZzsyFBOwJ0JUESIAESIAESIAESIAESIAESIAESCD+CbCGJBDFBKggjuLGYdFIgARIgARIgARIgARIgARiiwBLSwIkQAIkQAIkQAKxRoAK4lhrMZaXBEiABEggGgiwDCRAAiRAAiRAAiRAAiRAAiRAAiQQFwSoIM60GelJAiRAAiRAAiRAAiRAAiRAAiRAAiQQ/wRYQxIgARLIuQSoIM65bc+akwAJkAAJkAAJkEDOI8AakwAJkAAJkAAJkAAJkAAJeBGggtgLB09IgATihQDrQQIkQAIkQAIkQAIkQAIkQAIkQAIkEP8EWMPQCVBBHDpDpkACJEACJEACJEACJEACJEACJBBeAkydBEiABEiABEggTASoIA4TWCZLAiRAAiRAAiTghADjkAAJkAAJkAAJkAAJkAAJkAAJRJIAFcSRpM280gnQRgIkQAIkQAIkQAIkQAIkQAIkQAIkEP8EWEMSIIGoJ0AFcdQ3EQtIAiRAAiRAAiRAAiRAAtFPgCUkARIgARIgARIgARKITQJUEMdmu7HUJEACJJBdBJgvCZAACZAACZAACZAACZAACZAACZBAHBHwoyCOoxqyKiRAAiRAAiRAAiRAAiRAAiRAAiRAAn4I0JkESIAESCCnE6CCOKf3ANafBEiABEiABEggZxBgLUmABEiABEiABEiABEiABEjAhgAVxDZQ6EQCsUyAZScBEiABEiABEiABEiABEiABEiABEoh/AqwhCbhFgApit0gyHRIgARIgARIgARIgARIgARJwnwBTJAESIAESIAESIIGwEqCCOKx4mTgJkAAJkAAJBEqA4UiABEiABEiABEiABEiABEiABEgg8gSoII40c+ZHAiRAAv/Pjr3kIAwDMQC9/60RbJAqAW1Rktp9CxCon4zf7EyAAAECBAgQIECAAAECBAgQ6BcISaggDlmUMQkQIECAAAECBAgQIEDgmgKmIkCAAAECyQIK4uTtmZ0AAQIECBCYKeAsAgQIECBAgAABAgQI1AkoiOtWKtD/At5AgAABAgQIECBAgAABAgQI9AtISIDAU0BB/FTwIUCAAAECBAgQIECgV0AyAgQIECBAgACBjwIK4o80LhAgQIBAmoB5CRAgQIAAAQIECBAgQIAAgWMCiQXxsYTuJkCAAAECBAgQIECAAAECBBIFzEyAAAECEwQUxBOQHUGAAAECBAgQIPBNwDUCBAgQIECAAAECBFYJKIhXyTuXwB0FZCZAgAABAgQIECBAgAABAgT6BSSMElAQR63LsAQIECBAgAABAgQIELiOgEkIECBAgACBfAEFcf4OJSBAgAABAqMFvJ8AAQIECBAgQIAAAQIESgUUxKWLPRfLUwQIECBAgAABAgQIECBAgEC/gIQECBB4CyiI3xZ+ESBAgAABAgQIEOgSkIYAAQIECBAgQIDADwEF8Q8glwkQIJAgYEYCBAgQIECAAAECBAgQIECgX2BEQgXxCFXvJECAAAECBAgQIECAAAEC5wU8SYAAAQIEpgkoiKdRO4gAAQIECBAgsBXwnwABAgQIECBAgAABAmsFFMRr/Z1+FwE5CRAgQIAAAQIECBAgQIAAgX4BCQkECiiIA5dmZAIECBAgQIAAAQIE1go4nQABAgQIECDQIqAgbtmkHAQIECAwQsA7CRAgQIAAAQIECBAgQIBAtYCC+LVeXwQIECBAgAABAgQIECBAgEC/gIQECBAgsBVQEG9F/CdAgAABAgQIEMgXkIAAAQIECBAgQIAAgV0CCuJdTG4iQOCqAuYiQIAAAQIECBAgQIAAAQIE+gUkHCfwAAAA//+Ck0TyAAAABklEQVQDAG24Mu4eoXAWAAAAAElFTkSuQmCC" class="kg-image" alt="" loading="lazy"/></figure><p><br/></p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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iIA4QGqESyILASFwpRCQeggBISAEhIAQEAJCQAgIASEgBISAEBAC/34CIqEQEAJC4GIIiAPkYuhJWiEgBISAEBACQkAICAEh8NcRkJKEgBAQAkJACAgBISAEhIAQEAJCoAYExAFSA1gS9UoiIHURAkJACAgBISAEhIAQEAJCQAgIASEgBP79BERCISAEhIAQEAK1JyAOkNqzk5RCQAgIASEgBISAEPhrCUhpQkAICAEhIASEgBAQAkJACAgBISAEhEC1CfxjHSDVllAiCgEhIASEgBAQAkJACAgBISAEhIAQEAL/WAJScSEgBISAEBACQkAI1JaAOEBqS07SCQEhIASEgBD46wlIiUJACAgBISAEhIAQEAJCQAgIASEgBITAv5+ASHiJCIgD5BKBlGyEgBAQAkJACAgBISAEhIAQEAJC4HIQkDyFgBAQAkJACAgBISAEhEDtCIgDpHbcJJUQEAJC4O8hIKUKASEgBISAEBACQkAICAEhIASEgBAQAv9+AiKhEBACl4SAOEAuCUbJRAgIASEgBISAEBACQkAICIHLRUDyFQJCQAgIASEgBISAEBACQkAI1IaAOEBqQ03SCIG/j4CULASEgBAQAkJACAgBISAEhIAQEAJCQAj8+wmIhEJACAgBIXAJCIgD5BJAlCyEgBAQAkJACAgBISAELicByVsICAEhIASEgBAQAkJACAgBISAEhEDNCYgDpObM/t4UUroQEAJCQAgIASEgBISAEBACQkAICAEh8O8nIBIKASEgBISAEBACF01AHCAXjVAyEAJCQAgIASEgBC43AclfCAgBISAEhIAQEAJCQAgIASEgBISAEPj3E7jUEooD5FITlfyEgBAQAkJACAgBISAEhIAQEAJCQAhcPAHJQQgIASEgBISAEBACQuAiCVwyB4jNZoPVaoHFYqZggbl8y8cvso6XJPmJkyk4eCAOZWVlZ83ParXi4OE4FYfjOUJeQd5Z48vBfzeBoqJCpQvZudm4UnT43038vy2dY3zKL8yHjf4uBw3WY8e4xuPdxZSRmGwfK7mfXEw+NUv77419ql0s/0ghU9OOqfHSZDr7/FoboRx9Ijc/pzbJ/9I0FosFjvqqtjzIa43Sv7QOUpgQuFgCxcVFqh9n5WT+resenp9UP6I1e+VtUVHBxYp4Uem5XtzXHYGveXhevVxz9kVV9i9KzO1z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hIAQEAJCQAgIASEgBK4dAmIAuXb6SmoqBITAf42A1EcICAEhIASEgBAQAkJACAgBISAEhIAQuP4JSAuFgBC4ZgmIAeSa7TqpuBAQAkJACAgBISAEhIAQ+PcJSIlCQAgIASEgBISAEBACQkAICIFrhYAYQK6VnpJ6/hcJSJ2EgBAQAkJACAgBISAEhIAQEAJCQAgIgeufgLRQCAgBISAErlECYgC5RjtOqi0EhIAQEAJCQAgIgf8PASlVCAgBISAEhIAQEAJCQAgIASEgBITAtUFADCBX0k+SVggIASEgBISAEBACQkAICAEhIASEgBC4/glIC4WAEBACQkAICIFrkoAYQK7JbpNKCwEhIASEgBD4/xGQkoWAEBACQkAICAEhIASEgBAQAkJACAiB65/A9dBCMYBcD70obRACQkAICAEhIASEgBAQAkJACAiBf5KA5C0EhIAQEAJCQAgIASFwDRIQA8g12GlSZSEgBITA/5eAlC4EhIAQEAJCQAgIASEgBISAEBACQkAIXP8EpIVC4NonIAaQa78PpQVCQAgIASEgBISAEBACQkAI/NMEJH8hIASEgBAQAkJACAgBISAErjkCYgC55rpMKiwE/v8EpAZCQAgIASEgBISAEBACQkAICAEhIASEwPVPQFooBISAELjWCYgB5FrvQam/EBACQkAICAEhIASEwL9BQMoQAkJACAgBISAEhIAQEAJCQAgIgWuMgBhArrEO+29UV2ohBISAEBACQkAICAEhIASEgBAQAkJACFz/BKSFQkAICAEhIASubQJiALm2+09qLwSEgBAQAkJACPxbBKQcISAEhIAQEAJCQAgIASEgBISAEBACQuCaInBZBpBrqoVSWSEgBISAEBACQkAICAEhIASEgBAQAkLgsghIIiEgBISAEBACQkAIXMsExAByLfee1F0ICAEhIAT+TQJSlhAQAkJACAgBISAEhIAQEAJCQAgIASFw/ROQFl5HBMQAch11pjRFCAgBISAEhIAQEAJCQAgIASFwdQlIbkJACAgBISAEhIAQEAJC4NolIAaQa7fvpOZCQAj82wSkPCEgBISAEBACQkAICAEhIASEgBAQAkLg+icgLRQCQuC6ISAGkOumK6UhQkAICAEhIASEgBAQAkLg6hOQHIWAEBACQkAICAEhIASEgBAQAtcqATGAXKs9J/X+fxCQMoWA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f1ylqks2QuBGIiBtFQJCQAgIASEgBISAEBACQkAICIHrjIAYQP7jHcqP8Nm6YzP69RukX+TLL+XlF/p269ZTv8Sbn0GuFBtKrmZDJC8hIASuJgG+m6JfvyG47bZuWLp8MfhdGFcz/8vNi98F88BDU3S9une/C6NHjwe/O+VCj8263LL+jXS+vn544pnH0KNHb3Tr1gNdu3anfU/06tUPK15dpu+U48f2/Bt1qaiM2qXedcTvtagojvgJASEgBISAEBACQkAICIF/l4CUJgSEgBAQAkLg+iYgBpBroH/5HR4soFbklFLXQAukikJACFjn73/F+GHtETaCWOvGe8N/5J0E1vpVdl89sIY2dHBb6tQrOfb3DaxsVhL/RiQgbRYCQkAICAEhIASEgBAQAkJACAgBISAErisCFRpArqsWSmOEgBAQAkLghiSgoG7IdkujhYAQEAJCQAgIASFQGQISVwgIASEgBISAEBAC1zMBMYBcz70rbRMCQkAICIHKEJC4QkAICAEhIASEgBAQAkJACAgBISAEhMD1T0BaeAMREAPIDdTZ0lQhIASEgBAQAkJACAgBISAEhEBZAnImBISAEBACQkAICAEhIASuXwJiALl++1ZaJgSEQGUJSHwhIASEgBAQAkJACAgBISAEhIAQEAJC4PonIC0UAkLghiEgBpAbpquloUJACAgBISAEhIAQEAJC4FwC4iMEhIAQEAJCQAgIASEgBISAELheCYgB5HrtWWnX5RCQNEJACAgBISAEhIAQEAJCQAgIASEgBITA9U9AWigEhIAQEAI3CAExgNwgHS3NFAJCQAgIASEgBIRAxQTEVwgIASEgBISAEBACQkAICAEhIASEwPVJQAwgpftVjoWAEBACQkAICAEhIASEgBAQAkJACAiB65+AtFAICAEhIASEgBC4IQiIAeSG6GZppBAQAkJACAiB8xOQECEgBISAEBACQkAICAEhIASEgBAQAkLg+idwI7ZQDCA3Yq9Lm4WAEBACQkAICAEhIASEgBAQAjc2AWm9EBACQkAICAEhIASEwA1AQAwgN0AnSxOFgBAQAhcmIKFCQAgIASEgBISAEBACQkAICAEhIASEwPVPQFooBG48AmIAufH6XFosBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJC4LonIAaQ676LpYFC4OIEJIYQEAJCQAgIASEgBISAEBACQkAICAEhcP0TkBYKASEgBG40AmIAudF6XNorBISAEBACQkAICAEhwATECQEhIASEgBAQAkJACAgBISAEhMB1TkAMINd5B19a8ySWEBACQkAICAEhIASEgBAQAkJACAgBIXD9E5AWCgEhIASEgBC4sQiIAeTG6m9prRAQAkJACAgBIWAlIHshIASEgBAQAkJACAgBISAEhIAQEAJC4LomoA0g13ULpXFCQAgIASEgBISAEBACQkAICAEhIASEgCYgGyEgBISAEBACQkAI3EgExAByI/W2tFUICAEhIARKE5BjISAEhIAQEAJCQAgIASEgBISAEBACQuD6JyAtvIEJiAHkBu58aboQEAJCQAgIASEgBISAEBACNxoBaa8QEAJCQAgIASEgBISAELhxCIgB5Mbpa2mpEBAC5QnIuRAQAkJACAgBISAEhIAQEAJCQAgIASFw/ROQFgoBIXDDEhADyA3b9dJwISAEhIAQEAJCQAgIgRuRgLRZCAgBISAEhIAQEAJCQAgIASFwoxAQA8iN0tPSzooIiJ8QEAJCQAgIASEgBISAEBACQkAICAEhcP0TkBYKASEgBITADUpADCA3aMdLs4WAEBACQkAICIEblYC0WwgIASEgBISAEBACQkAICAEhIASEwI1B4MY2gNwYfSytFAJCQAgIASEgBISAEBACQkAICAEhcGMTkNYLASEgBISAEBACNyQBMYDckN0ujRYCQkAICIEbmYC0XQgIASEgBISAEBACQkAICAEhIASEgBC4/glICwExgMgo+EcIZGdnITU1BQUFBf9I/tdLppnZmcjMzIDZbL6mmpRfkI+0jDRk52Rfc3W/pkBLZYWAEBACQkAICAEhIASuFgHJRwgIASEgBISAEBACQuAGJHBNGUAKCwuRnJyIo0dCy7jjoaHIz8+/Abvv0ppsxr8rrrPxo02b9ujfbyC8vHzB/XZpNb14rH+7LRevEZCVk4VjNAbLj8vc3JwLJs8iI1G7Nh3QuVNX5OXlXYIhgfuR3fmz5Tyt9agoFhtbjh61zJ8CMmJUFOdifmz8CAyoiju79USLZi1ha2t7CXW/WK5lw9m4cvS4pZ5RZ8LKBtJZbm4uIk+HFa8DXCfyLvMtIONbfGJscRwrl7DI0DJjkserNazMnsrn9JxPmYyv8ORsXPQ5deJyU9NTUWguvMLcLzW5xBMCQkAICAEhIASEgBAQAkJACAgBISAErn8C0kIhIASuGQNIDonJOTk5GDRwGFaufBUff/w+PvnkQ3IfYOniZ+Hs7CZGkHPGsxnHSMQ9diQM6elp54T+Ux4R4dEYNXIkpk2biq633Ub9cini/sVqYwYburgtLBRfLPa/E27G0ROhaNSgCY3BJfjgg3f0ePz00w/x9jsrUb16DZyKjjhvVSKJ04OT78f06dPQtElzbUg5X2Q2/BylfmSXk5NdYTQ2frRp3Y7mx8t4881XtMheOmJmZgZu63I7Xl7xAt6h+nl7+6HgMowgsSTgd+3aFdMenoK7774bjW5qDDYilC7rSo7Z+NGz+1148YXn8dprKzBv1uOIOBVanCUbP+rWbaD9X311BV599SUE+FVBaSMI52Fra49xo+/BW2+/ZlkvqF8++eQ9PLngaUREhoMNc1zvNq3b45VXXsSbb72muTE7dsuWLsH4sRORm5t/DsviylTigO/yOUrG2/snPYgPP3wbPE6saxiX3/32O2FjsoMYQSoBVaIKASEgBISAEKgMAYkrBISAEBACQkAICAEhIASEwA1H4JowgLBI6ejgiMWLFuHBBydj5MhhGD58KIYNG0ZuCMaMGYWnn3oSJ0Mjr/qV6NfyiDhKgvlHH7yPHTu2oGfPPsjI+PeMIEFBQQgJqYMaNYKvSp9wW957613dln69B4DF/v9n37CYfSYmCvdPnIgFC+ZizOhRRWNyOIYOHYoRw4dg0TPPYNyoe5CcmnROVZWyeN188824+ebGqFu3DtLSki2eFWzZ8PPddxvw7bcbcHOjpsghY2D5aGxQ6dy5I82JoboOlvCSO0aiIs/itts667CRI4cjwD+gwnws6c6/TUvOI+NOVTRoUB/16tVBYGAgMrIyzp+gkiFnouJw1109MGLEMO3GjRuD7HQUj6Ow0FPo26c3xo8fQ+FDMXr0SFSn8WYdEwlJ8WSUuhlPPrEQ9913L0YMH059MxzDhg7DsGFDwfm9/ea7OH4sHJGno9GqVUuMGDEUw4cNof0IWl9GajdmzGjcO+kevPP2O1i+fOkVGkHMOHY0DF9//QUmTrxb9wGPk2FFa9ioUcMxY8Z0dLy1I9LTUitJTKILASEgBISAEBACQkAICAEhIASEgBComID4CgEhIARudAL/eQNIQUEBHB2dsOKll0gUvQu1atVAUlIyNm/eivXrv8avv/4KFxcXtG3bGigE+Er5G71TS7e/Xbs26NTpNtSuVQtxiXGlg/7RY766HtQhvL9ar7do29bSljp16iA9I/X/2teJyYkYNnisFq2bN28OGxsb/Pbbb/jqq3VkpNmG9PQMtGnTBk2bNsXZM0nnsLYyOXkyDKGhx3HyZKi+i+mciKU8unTphC5dOqJKlSrIzK7Y4ODu5kZ1sSVno1Nay9EntHFxcYOdnR2F20EpVWxUoKBKfblfeW4WFJj/kTsWPDy84OTkBHt7O3h7e2P69Kk4G3cGXK7JHqhZsyZ8fX1gb29P8VxgMpp0GBtL27Rqj/nz56Fbt24ICqqGmJgYbNz4LTZsWI8DB/6Aj48POnRop9trzoPOw4EMrDY2tjruoUOHcezYMWRn55ARrxbNn/YYNGgAFi9+Sj/qTCes5IYNeKtXf4w77+yOatWqISUlBXv27NHjZc+eH8B3tdSv3xhBwUFIoLFVyewluhAQAkJACFwaAYklBISAEBACQkAICAEhIASEgBAQAjcYgatiACEdlYTUHBTkxSA/NxSFBXwFM1kjrgJMfkl0UFBNEiw7kFBph6NHj+LZZ5diwYIFeGTGdDz//DK89NIr2Lp1O5zdjVD0z1osX6WflpaCo0cs7xLgfVJKYoXCOb+vIS7hLDIz08HpuFyOb3UsvFrzte75qveY2NPgx3NxmuTkhOKy+O4A8wWe58/i8akzYcXxuZy8vFxr1ufdl68XpytdNz5OS0vF6ZgInYfl3SgFJOaFMcVCAAAQAElEQVRmI4c089MxkTgTE4kU4qIjlNtwXyYmx5epV0ZGerlYJadmUtiZKdeDnbXckhiXf8Rt4cddWfO0toXvfkiMy8DpaEtbUlMrvnOCHyUUfqqk7/mdEjnneXxUZWqZk5ODZk2aY+LE8QgODsaZM2fw2WersGTJc5j68BQ89dQzePHFFdi+fTsyMjJgJMHemj/z4nGTlBSvvVaseBlLaQz//vuvcLR31H7WDY+RRBpT1vbzeX5+IY3RTMRGJ+NMUV9mZWVak+ixy2WwK/YsdcD+7Ng4ZfVmTsyQ71ThMqz+1j3789zg/rD6ld8nxKYVj5no2FPlgyt9znW0OOg2jR07EimJOfpumvsnPoDq1auSwcN6d0uhntOKxmI6zd/69eqjRYsWZOSxGKWeffZ5zJ03F4/OnIlly17U6wUbHayV4nKoFMqvED/s24enn34GL7zwou7Dt956G0Yyrvj4eOP222+DmaaoJb419cX3VqadOnWiyEobyrgeS5YswZSpU2ncLNF1WrfuCxw/dhy+Xr4Ur+w3Pz8PoRGhxYyPkcHMmm/ZmJazHBrnsfHR+s4cri+7yNMl6a3jjw1GMXGnwY8M43FgSV12y3nxWONxaybSZUPNZJiKLq4XrwGcZ9k4JWcFBfng96ok05zl8cT14jHO6djx+1lKYsuREBACQkAICAEhIASEgBAQAldOQHIQAkJACAgBIXBjE7hiAwgbOyIPh0LZNUTV+pNRu9liuAf2IbEyBnlZoUTXKlLS4WV8+XE4zz37DIxGI2JjEzB//hMkTL6C2LizWrDcs/d7PPLITBIQVyDAtyqUUrqUrJws/ciZzp3u0O9l2LVrC4nUH6DPXf3BjxPSkYo2bPyoX78RJk64D7d2uA3Hjoahbq36+r0BP/ywEytWLCNhMhwsrhYl0cJih7YdMWXydNShuJymT++B+PrrNdi2bRMeemAa5RMOztuaxro/dSYCJ45HYMa0ufjmm7UU/1sq43kYDbZaSDSfIzICeXl5OqxB3UZ4+eUXsGPHJuzcuRX8Lgd+lA+LhywoOjg4ocedvTDtoZl48skFcHBwIE756NixPWbOnI6HH5yBh6fMBD9G6kx0tLVKes8GhiPUl4P6Dwdfrb579za8995baNWyLXT+5Qw6hQUF1MYwYtoP69atIiPURl0uZ8Z14f3lOk5vTwaBO+/oqfN84okFcHKytKVdu9aYPXsG+T+Kh6md/fsNxqnTZ8oUdTbuDI4fDcdjsx7H5s0bNOMXnluMqoFBui1lIlfyJCsrHYGBVdG4cWNtWDp8+DDuf+gB7PtxD0wmE8LCT+LJpxdhMQnc33zzDYKrVtMlsNibQ8YTHjdDh4zC5Mn3w9bWFgZlsNTfMnR13AJi6+7mieEU7+EHHyVR/nHtb6AZ279/H8ya9QimUl9OmzILbdt0QEpKmg6v7KawsAB2tnbo3as/BhJHF2c3cNnWfNj4MaDfED03cnMKaSwVWoOK9oVITEjC2LGjsHHj19i+/Ts8MGmqZlxAYndRpMvaKaWQnJxMZRZo3pxJXEwKmjRprA1PcXFx2hjE/uwys9NxU4PGmDBhLHi9CA0NxcKFT+K111aCDaF5eTnYumMLpkyZhpVvvomatatzsmJnpvGdmpKCtWu/xlaaw8tffh4PTbsPv/zyG+VngpurO/r06UV9nlWc5lIO2EA4deqDlr6mDpw2bQb15xL8dehP8jPq/TO0xj319NP4ef/P+o43a75mMurw3MvKzMMT85/Epk3r9Xh+btFivYbEJcRaoxbvc8j40bRJC9w/6SG0b9ORDGVR4PVp1iOPYe/eXVi/fi0GDxqh+6hVq3Z46P7p6ETrnlHZoLwRJC4hDg3q30xr1Rx06diV7EQGWp0sazqvbUePhOmxsXbt53o9WvnmK6hVs57Om+uOUh8eD36+VTB+zEQ91goLoevVr89Aatc3ek1bOO9JnbZUMjkUAleXgOQmBISAEBACQkAICAEhIASEgBAQAkJACFz/BEq1kOTUUmeVPMzJCIVX1bswcOpX6HTXXNRr3AtBddujabsx6DX+W9zceSXiT4XBbM6pZM5lo990U0OwOJ9AYtwXX6xF3Xoh+upuFjn58Vh8HnP2NAwGo07IVzPXqlGbhMKNeP31l9G3b2/9OKLevXvj+eefxd9/HygjsoWFnsY4EnDnzZtDxpRp2L9/L1at+hQDBvRDs2bNMH78WBw69Adq1ahbLH6eijhLBoVHyM3QYvzBgwfwwgvPoVu329GuXRvym6kFYU8PH2280BWjDV+FzQaGpKQYTJ/+MLp27arvbhk3bgKVu4/KfxjRMaeImUVkpCTguyAcHR11fqtWfYJx48ZRGe30Y7+GDh2MuLhoLF/+vDbS9KE2PvbYHF3+tGlT4eXlpdnxFfH8WKBZsx7FbHL33z8JNUNqkdidz0Vo487JE5GIiDgGftRPr1690Lp1awwePFAbWb744hNtUGDBnBOwuHmcjDh79+6gdi+ldnfDrbfeqnn8SIYAT093ikYKJ20v55uUkoC7evbE/PlzMXv2TGI1VT+6iMcB9wn3lW7L7EfxwAP3kxGqDvKLBPejR0LJcDAaZ85Ektg9mYw/HTXjiRMn4ssvV+GNN14t0/+VqR+3340ME0OHDiJR3KgfmcRj0tXFEfx4KSMZ6mzJoFC3TghOnjyGE+RMJhtdRGp6Cnrd1RcLFswjxk9j0aKn9X7JkmcwaeIkJCYl6Hi8YQPZxIn3YO7cWbr9U6c+pI17SinccccdeOyxuWQEeRRz5szEmDGj4enhwcnOcWYS9dmYxI4DzSjbJylpSahfvyGWLl1MZc3GhLvHUZ0jOKp2/PiueXPn6PKmTZuC46Hh2p83pM2DH6e1cOFcMkq+gK5du+hxOXv2LJw48TcJ9JHF44vjX47jev/66wHwo66WLVuis/CkMW0wKJw+fQoZGWyMMGj/rOxcONg7oXbt2mCD4dmzZ2nObNLrhYkMU9w3Lk4u+vz0mSj92CydsNRGKcsa4uzsgqCqNeDh6okffviB1hYDHGgONmvWFEkp8aVSXPwwIS4NtWrV1HlwbEdHJ/gHuIMNT7xm2dvZo2ZwCFJSkpBDhlulLJYwbvuxE2F4/PHHaM36Aw8++AA6d+6MTp064d57J4LXkDYt24Pv3uF8rS487AytEaOoP2fh4YenYOFjTyM6Oorm0MNo0aKZ7qf58x/Du+++ScbS7uB+fe21FejV6y7ExZ+1ZqPvbGvZrJXOY+bMGejfvx+tf5l6beKxzOsm14Hn4p133kl93wb8vpUvv/wcr776kjZucBusGSYkxdEa0QELF86jPB/CozMexe+//4Tnlz5Lc7SDXqMfIkPinj3bL3t+WsuSvRAQAkJACAgBISAEhEAJATkSAkJACAgBISAEhMCNTMBweY03I+lsKOq1eQ5NO0yCs5sfDDZ2UEYbEvmMMBptYWPngCrBTdBtzGoY7GrCXMhCZeVKYxEzMDCAEhlJGMzBjz/+SMcVf41Gkw5ggdzP2x/33/8AbrutMxxJtOR3AGzfvp0MBXFwcLDXAumJE4fKiGy2trZg16BBPfB7GwoKCrBjxw4SDqO1+Fq7dk0sWfIUIsKjdTm84fcT8Lsf2rZti3r16iA2NhZ79+4lITNFp+natbN+CXPoySiODr6avnOH7iQ8vkViuStYHORH8Wzbtk0Liyy6PvvsInS+tXuxqMlXc9ev0xAvLn+JjAy3w9nZWee/Zcs2bNu2E/y4KzY21KwZosv4448/8f33e8iY8iv+/PNPZGVlQSmFxMRE/PTTfn01O1/R/scff+HIkcO6v/hK7rSUTG0w4Dsb+N0LBw78ia++Wk8Cf7Sua79+/fDhB+/i+LEIAGYtbn711WqwkYQ5JCYmgBknJCShefNb4Ofnp9tHkS/r6+Lkhj//+gu7du22tIXqm5mZWdyWn3/+pbgtBw78gUN/H4LRYER6eir69euDefPmwdfXS/c/j5t9+/ZRfQq0QWjEiCF46+3XyvT/pVaysNBM48QeNWvSmCYLQGpqOhlU3oKvt7/Owkx+Vmciw4exaFxyoCOJ83///TcZ0w4T+yMIDT2hDXk8Jm1tbZCfn8vRtKtW3ZfG0g8kvv+o23/w4EHtzxt+5Ja1/fv3/4qDBw8hNq5EuOY4Vsf9dfxYOPWbxXChYNAMUfTJLyikMUDivoODHrN2NA/K2Uhg72AHe3t7arcdkF+UkHbcTn4/R9Wq1aju+eAxefToURqjjggKCsKxY39rIwhFvewvz6+ZM2fTvHVCz549MH78aDQnI8Tx46HE8CjVvSTr3GzoR2MpZaT5k6rHB4wl4aWP+J0hpc/LH3Pb8vPzwI+c47HM53wHSXR0NI0pl/LRL3juX8UTv/32O40/yx00r7++AjHRyXoO8WOq+M6yvLxcaktJ33B5icnxmDVjhjY+ubi40BqRpefY999/r/NyJiPNhg1fIfpMIgpovSpdCV7L2NWuHUIGwkk0H310+iNHjtAcSYerqzPc3d3x3XebwOuWq6sHGRh9aTzagcvmvLhurVq1QqtWzXXdcglwZES0Noykp2ST8SlJrw1czi+//ELGpo1klGE/FzLQ3INnnnmyeNxxfnnE00iGKDsy+Pj5+WLYsEG4+eabqbxCmguhYIMVrz1ubm4c/Z9ykq8QEAJCQAgIASEgBISAEBACQkAICAEhcP0TkBYKgWIChuKjShzk50ajcef5CKrTFkopErDMpImTI2Hcko1Z+5kLC+DpWwM3tZpAmqoPxSmlnloiXnCbnJqIgQMHUpxCLfCdPBkOdy97Oj//Nz7xLAmlPdGnT08tEm7YsBEhIfXQvXtvBAXVJqPGTp3Yz88fQ4YMIgNCij7nDQt/RqORDAjfI6BaIO68sw+Cg+uAjRQmEu6cnFzRpMnNJPbmcXRLG0nw5rC3335Xl9OlS3dMn/4oib/HSEy0hYeHJ+rUrUn1zwdfTb969SeUPl8Lfm5uPmSk6abL8faugsOHj+o8X3xxKfIK8nWa8Igz6Nu3L7p06aKvav/kk89QpUowtbEPpbuLhM3qmDp1Oo4ePUaGKAP+OngAo0aNw623dkGbNh0RHx9P9bDDypVvUx53oGPH29ChQ2eMHDmWxGLLo5n4Su69e3bC29uTyiyA0ehAho32xH4oQkLq45NPPtftvaNbVzIszAK/R4Q9evbsqdvCon5gYIhmXL16iOallOIol+1YVP3774MYM2YCbuW2tL2VBNI43Zb33vsQnTvfXtyW4cNHUT9V12Px9Kl4LFw4V7cFULotHTty3NvBjz6KioqCk5MzagSHoF271sS0xOiAS/iYzYX6MVfe3l66r5TicW9JaKaxwKJ5bm6OFol5n5eXp+NxDBbzwyNOYsCAIbjlltZo3LiFNlBRsuI4HI+do6Mztu/YTH0/ULezVasOejyz0D1nzvzi9rdv3wnzHp9Fhh1PTlbs+PCKNAAAEABJREFUDAYD5cll59O+xPXufRcZMmyL4+kDagLX3eIq6DeqIIfRBNbRSzZm4mskQ8QR6qdxekzefHNzLF36gmbk6emOF154FvzulZI0lT/i+ZeTk6kND23atEVgYHWaP2E0x05AqaL6UhtokUH9+vWpgELk5uYiIiKCRP3KiOmcVyGlB42LPDK6OKJD2y4YNKi/nhdsgFu7bh1caB3QkS5x407GhXfeeR/Jyck6RbVq1WneZOKPP/bj0elz0KxpS1QJqKoNFGzA5Uhs+Lz5plvAd3+w3/79v9GYDtRzrGvXHmTA8NbzobCwEH/99SsZmtgwySktjvurkIx1zmQkKaQ4AwYM1um5f3x8Amn8tcLatevw2WeryQAST2MkT98B0qJZKz12Ob0iY5mHhxcZOdxx8uRJ7Ny5G75+rogMiyYj3gE9jlJS0sg45or27bvQmjsIVauGYPv2nZQfaEyMwNixI8ngkobijx5LhZTWjuayLRmD36e2+KBBgyZ6fVbKDm+++Q78A70gHyEgBISAEBACQuBqEZB8hIAQEAJCQAgIASEgBITAjUvAUNmmm835sHNpDhf36iRy2pDQZb5gFgUFefD1r4OaNw9EHhlOLhi5XGBiXAYaNWqoy2ARLzQsDM6OruVilZyyaOfm4kFCnw/VzQ5RUaex94cf4OZpqx97w4/KuuOOu7SYyWL01KmTceZ0yWOHWEvlcr7btAX5edBpXCntF198SUKrEXZ2NuDHceXklDzSSyml85s06QEdv069Gvjoo0/x999HABIQ3d3dUL16dcTEncb48WNILHTQ7y34+ONPcdddd2LgoH7a8d0isbExWhAPDq4Jg8GIjKxM9L6rB1q2bEYMCkgw/Qvvf/Ahqgf567Lq1gvR+89Wf4yFT85GYECwFhat/qCPUpZL4B0dHWDnBB3fGq6U0le49x/QR4ucbMj59NPP0aNHNwwcaKlXz7u6U30zwOKtr68v/P39kZ5cgCefXKgFeWYxe/Zj4DsWOF++4v7nn39GQkIClFJUg8v/shGE82THuZCmzzsSpu3h6eOEOsS6bhEDpRSJynl6vDg4OFL/m7Bly3Z4+7mgdp1g3e533/1Q3zXDfdy4cSNq552Ijj2t87zUDem3MBoVnJ2dqf0FyMsrMaCw8W3I4OF4cPLDePCBqbSfion33IuwyLDi7G1sbHRd6tUP0X5KKb2vaOPo6Kzjchs5XCmlmfKY8g1wLw4LJtEZUCj/OXs2GjExp4tddPQZMvil0Vgyl496mecKSinNdMOG73R9gmtUweeff06idzr4Sv6OHTsABZeZPSWj7GkLbNu6g8aeLxnuhlIbksmwd5b62KDDSm9q1gzR7cvLKyADSCQc7BxKBwMXODMaDahZs7Z+LNnUKdOw6JnFWLduNfWzWRtUwmj9iYmOo/43XiCXc4N4XapZq5oW+E+fPq3Z8KPUbrrpJv0Ys7VrVuGVV17CuLETyBjgDr5T4mx8NDp36kTz2YHaGo91X32FXr17gNeLQWSQ6dS5A86cOUXjLw916tQ5t9AiH6PRSEaol7B1x7eoU7eG7iMeT9k56di5a5uOdeLECZrfKahXrzb8yTCcnZONHHK3kzH31lvbEs8CnDp1Bq+++gaMNrYYPnwIGRFdNYeVK1eiR89uul4DaS3r3v12yiuR+iiNDLXV4OnphSwyXumCSm0MNJl3796LaY88DGbDdWLHdVz15Wdwc3ErFVsOhYAQEAJCQAgIASEgBISAEBACQkAIVJKARBcCQkAIFBE4V0EsCjjfrrAgDT5VmsLHvzYJg4Xni1bGX5lMMJhIMDZ7kX/lxNf8/BL11JbEY7P5/GWysO3l5YsqVapQOYX6kVdLn38evt4BdF7yTUiI1+KdlzfXp8RfKaWF+6zMLEpjEeBMRhsog9KRbGzswEaA7Nwsfc4bpRRY1ORjdgqKdwD5A4UkFDrB3c1dGw06d+6kmbEIPmLEMCxa9AweX7hQu+XLl6Fu3bok6prAn8Y33YKU1AT4kNGhatWqOh0/xmorifos8HMcq/N099LGD+t5ZfYxZ8+CH3Pj4GCnDTmdO3cEv5Pi8cct9Xp2ySL9zgB+1wPIoGNvbxGUb7qpvi6GmW/cuAks1rNHSHBVfPjRx0hKSiEEir3+NZdFBqOWLVuQaGxLZRvx9dfrqZ9NYLHVWons7AxkZGRoAwY/VigrrXLjUedjVtQfnE5ROSVTKDEuE5Mm3Y1p06Zj+vQptJ+CyZPvQ17JcNHJ/40N90u3bj1Rv8FNaNaspXZVqlTH3r37yFCUf1WqwEM8LS1N37lgsrdkaTSaUFCYj0OHDsNI4rvBYBnPltDL2Sqd6LPPV1F+Bn3XAIvxa9euh4nEeJT78B0y7MV35tjo9YL7iX0u7NiwxY7fYzJz5qN46KEHtYEyOzsH/Iion376CT179gML9BfOqeJQk8kGITWrIji4Dj755DPwo8JCQ8PJOBVDxpU8Mqw2wiOPTMPQIUP0PMxOB1q0aEHjLI+Mky5kHBmNRc88pdeKhQsX4OUVK1CtWjU9tpVSZDhxhvUdONYaKKW08TI2LlZzU8rCksOZDa8jNUICsXLlm7RWJpC3Ea1btyLORqSkJVH+1cmgeJN+nBgbWygCok/Fo337djCZDLqegwYNwJLFi3W9eC3jdyy1bNmSyrPh6Lrutrb2dFzSD0opMtzk0hqRgNTkLMrLEpci0XxSYvxgEOKEgBAQAleZgGQnBISAEBACQkAICAEhIASEgBC4UQmUqLeXSMBsziKB2Rk2fDtB8SOvLpKYlEVbOwfYOwUCFzBglM+Fr3L/5ZdftSjGIja/SDiZhLny8aznLPq6uboiIMBXe7EYSlosiYRGfW7dJCdbxHlHB0erl94rpbQ4nklCusFkEW4NUPofRzAYoIU9zpfP2SmlSMhL4sMyThWdsQhsMlnKr1OnVpEvSGS0IXHQCU5ODto5OzuSKJinjSmnTkVQmCuJl2Yt1Ht4uOuwnJyrr6TnZwPBQUGwt2eR0lI9NgxY68XP5FdKaRE4MjJcX73OsSxGJupO6ls+tzoTcfvrz0NaHAUMVu9/ZZ+clogaNYJhMdZAvyvFqErqYLQH9W8WCfbZNIZttatsxQiFFvjT0lLBY9JIwnbpPP788yB+/fVnnDgRqvssLy+vdPC/eszvefHycoejk512XHhOTg6J6oV8eMVOKRbYM/WYcLC30fkpReJ2bj4SE+OhlCJnFb6tex2t0puExAQ9N/gRY9HR0fr9NEaDKsmn6JAfBaeU0vM0mMZCRlZ6SZwLHFESmGks86Oe9u/fT334K3766Wfs3Pk9lixZCn60HRs/lCoq6AJ5nS/Ihgw2fJfD/fc/RIaF5qhduz7eeONN/W6jhIQE8PuK7ryzG25u1ERnERISTH1l1sdssHB2dtZrBc9NXi+ys7P1XW78WLeGDW+CudASVyegjVKK+iEJGekZsNdGCPIs97W1tcO+fT8jgforNzcbvXr1hA0ZsVyc3FC/fj0yTtiBea9a9aW+84yTc714nvOxUorWqpJ1jNcLXodjYmKpbhE0B/L1XTiElqMXu0wyMicknLtuFkeQAyEgBISAEBACQkAICAEhIASEwJURkNRCQAgIASEgBDQBg95WemMm00dZse1iWRgUFWWwiKQXi2sNd3Fywdtvv0enBhLiTGjQoB4yUgpwoU8hKW0FBeXrVvZcKYuIyUJd+bzYz1xYSMKtJU75cJL8z/HiNOd4lvKwls6P5WFvFqHnzXsMS5cuK+Oef345li17Cc8/v4wE2P3w8nQmUbNQi6BcZaXOVyfOtWJnTUFYKo5Avvn5+WDxl0VNflfIs88uPadeL7zwIl54YTm+Xr+eUgCcRh+UM3JYy1HKWrIl1tXcWsson6fBYNSGF24LhxnIYlXIB1ZHHaGU0n3LcdhZgy51r2gcc9vj4hKhlIJVg+cxwOJ279790bx5a3z77Xfg8vF//hhJzLY6ropSinflHIEp53Opp0opzYFXBGsaRVPdaLTOdTqhgMsvgRLTNyI8HPwejW+/3Yzt27eTTwVfI3Ds2HEKMGiDXt06dcCP0SOPS/qayTi7ceNGtGzZVvchv0OnZ88++OTzD8B9q5S6pHwuFonzYlerdhCeWvwUOnfupt+jwmOIjQ4B/v46Cx5nSrERIxHz5z9eZk7y2qHXi+W0Zix/CUePHQYbSXTCog0lJeNUpn6sntFIcIr8y+/Ylr192059p4e/fxXUq3eTfs8KPwovPz9X3xW3YcO3cCgyGHO9zGal1+RZs+dWXK9ly2kdW46tW7eAy1aqhJ1SCjk5eWSgTIWNQ/nayLkQEAL/DAHJVQgIASEgBISAEBACQkAICAEhIASEwI1JwKJOVqLtJHuRIJ+PwoILGyLKZ5mXm4287ASQWopL/ZhMNiTMF1L0An21foMGDei44i+Llyw4Jycl6SvFOZatrS0aNWqAPBL4+RxFG19fH2pDIYmD57s6vESsK0pyVXaHDh2i5itd9qefrsKnqz7E6i8+Pcd9+tlHsHewhb2tgxYl4+PjSdy0Lb6zoaLKkKZYkTcZqizezKaiLnNyM+L48RNaJAUM+O233/HqqyvPqRPX87PPP0ZExEmdYXh4pN6TjUHvrYah3Nwc3H77bVRfI/kXkrv6X24L93f5nN1dPMF3AGRnW97LUbVqVRBsimaR3wtyAFdXV/BV6nz1PDtqMoVf+pfLzszMxB9//AE+5vdczJw5HbHxZ3QmLGzzgZ2dLe/+Ecflms2WNl1pATxuOC++q4nztbcvqTf7Xyh/DndxcdHv+khPsTxWq5CMCPZ2DggI8KO5S2aRonoqqAtlddGw7JxMLHn+afTrNwivrXwZNo7nJrGxA+Lj4yigQPfxhd6NYaZ6UsRzvpbHNUEbPLgv2Xl5+JwTr7IeRAK5pd4Xw+nZMFAzOIQPcTY2DtnZlsdBqaJJdfTocT3G2ODw0Uef4rPVH507L1fT+vHl5/Dx8dL5lN+YiT87XIB/tSpBmDdvAXhcm80FuHfS3bAx2SIoKAjJSSn4+edfABP0R9HwOHLkGBlAeY4ZsHrVmvOuY599/hESk+K1AUQnLrMp1OOjqKllQuRECAgBISAEhIAQEAJCQAhcFQKSiRAQAkJACAgBISAEiICBXKW+yuiC5MRwpCaeglKXmJxUVnNhLsz5UVTWJaahmNbv9u279NXG/v7+mD9/Do4eCdXiGYfzI4b4PCzsNKgYEhLP4NSp0xRkQJUq/hg+fBhCT3C5AIvzFAAWbVnwjYrieOzzzzs3TzusXv2FFgPZMPPGG68gITYd7u6exc7BwRFnY5K1Y9HSzs4O4REROHbsBFicZkHy7rvH4uix0OIKczxu/5HDobr9xQFFB0qxUF6IwMAq4MddFXkX73y9/LF582YSX6l/SPzkd1dwoLu7R3G9nJ1ddJ24bhkZ6fDzd9OPBlJK6XpNnz4Vx/VsxCUAABAASURBVELDwJ+I8GgMHNgfXl4+xX3E/lfH8dgpREBAAJLis1Bs3SnK3MHBAV+u+QI8JljIHTiwL2Kik8gGUqgdR+O+Z67Jycn6ynY3D1LNOeASHfdDZnYm9uzZQyJwHgnPPujYsSNSEnP1uTUbFq2tx1d7HxwcjLiYlKuSLYvwXNfMzCw4ONjDz8+vON9jR8Pw2GOz9dwr9ix1QNo6pXHQxgbuCx6LfBfDkSNHUKtWLeqHXGRkZJRKcfmHzL1qQJA2TPh4ldSxdI7Ojg40/8/ixx/3a4NpcHB1TJ06udx6kavP4+NTaXz+MwY6lPuYCU5hgUJIcG1ddnpmieGVmXF0WxsTrQ0mvUbx2sR+O3fuojlt0ka7pUsXI/5sWvGcdHf3hJ09tZfXizOJHP2yHY8BTsyPbeO70zp16oS7755AXgpp6al49rnFqEksyQNBtI7wXWDczzzHPv30Q72OeXiUrGNOTs7F60VuLhtKOGUF7spsYhVkKF4XIiBhQkAICAEhIASEgBAQAkJACAgBISAEhMD1T0BaeC4BVpTP9b2Aj8Fgj7io7UiIi4D1SuULRCeB3IjkxNM4e/pXGE1uF4paYVhAVW+88uprlI9BC4Hjxo3B008/ARZnWfgPPRmFnTs3Y//Pe3H8WATyCvJw5swZErfj4O3tja5du+DOHndo4TEs9DT++GM/5WXUj0p67rkXUDWoYjG1wspcgaerszu2bt0BvqrbgYT6Xr16YdGiJ8FtsDpPDx8yRmzEDz/sQFZOlq7nX4cO4ODBQ/oOjWASvidNmoR+fXoXp2MOe/fuwHvvvQ02gpSvotlcSMJ8Pnr06KGDrGXxnoVWW1s7Ku8n/QgeviOiXbt2+PSzDyn/MHKh2oWFR+Hdd98kYfl7DBs6UhsT3nzzbeTkZOu7Uu65526YSefkPAcPHoB27dqQkcmJBGazLvNqbVhwLSjIR/fut+vHoXHbuUx27G8wGJGTXYBTp0+RQScbjRo1wksvvaDHxfFj4Zg58xF069aVuBpw6NBhrN+wAd4ele9/RxKef/n1V+zatQf29o5o27Y1PvvsI5wkQxvXhdvbrFnTovaXTLG8vFzNk+NY+8rMVgRKkJKSguSE7OLw0MhQ8i37ZdHZZDKhX7/eOoDzsToO056V3Nja2CGdjBT8ngd+R0W1atXQp89duh633NIYI0eO1H1srWfZ7M16LPTt24sE83F6TobTHNu1axdxsUNiYhJWrVoNL1/nssn+oTNbWweEh5/Axo3fkuEA2phz770T8cgjD+u6MauYmET88ssP2LB+DfmF/0M1KZttbk4O6tSujddffxl//fULGtZrpPlyfXgMP//8s2jVqpU22oSFhdPalUBGRnf89NNPiIgIJaOHOwYM6IdZsx4pTsdpq1erAZ7727d/q/3Lllq5s0BaZ1977Q09b/gOqV69eujj06dPkxExsdgIZkdG2e937cXhw0f1usLvLOF28XjmOrErLDSTsfdT7Nu3C23btNNrV+VqI7GFgBAQAkJACAgBIXBVCEgmQkAICAEhIASEgBAQAkIAJersJcNQsCPR98SfnyPuzFEYi5/1f24GShmQl5OJs+H7kRy9FQaj47mRLuLD7wHZs2e7fv+Era0NAgMD8cAD9+Ls2dOIjT2FuLjTaN26NVi45aw83Lzwzcb12LJlG2xs7NGwYUN8+MF7ZBQJQ0zMKdStW1eLebt37yaDxDY4OThxsmKnlCo+rvigdHjp44pjsy/HMtMmoKoXZsyYScJ4IXx9vXHfffchOjoCp0+HUt0iyfjxLW69tT1q1AhBftGV024u7nj/g/exfftOEpXtcdNNDfDWW2/oNNHRUZrBLbfcQvn5clFlnQH46qsN4KuwXVycNCtmFh8fQ+LqXtjbOWpDUEjNqrhn4r3gR23ZkcDZ666exDeqqIxwnI0+jUGDBoAfKeTh4YHs3GzACCxdupwYO4GvtI+NjaK2hOO1117W8QzFz7ZRAH1xpR8TsH79NySmZpNxxYWMDzt02+Pjz5Cg/SOxcaa25COoRhXMmT0XaWlpup/HjBml2Z4+HUYC8gx4eHjSeQyJs/vw18GDOk5lq2ZjY4tTpyLw3nvv488//4SbmwfuuquH5nv2bJRmx8YXZmAwWIxAbPyoWbMutm3bRAJ3tK47x+UXXxcUFOCZZ57WfjyeT548jMVPLkF5I8iqVV8Qbwf9aCKOx32ZmBiDNWtWwWAgQJVtCMV3pLn858ED4HdrGAz82KMaePvtlboNmzdvQmCgP41XSxsoeoVfHx8fPPfcYmJyUqdr2LA+9UUBzbkYMkC9Ai8y7FWY8Cp7KqXg7OKKVas/Az8yys7OluZSDcydO0vXi3lFhB/HzTffjCpVqpSUru+SKjm92kf5hQVwcHTUdy7VrVsPn3zyoe5r6xp2993j4OVleYTVN2S82ffTXjL2uiMi8iQZTd4ENQv8OLeZM2fQHIvQ85LHzrq1X6BFixaoXj3owlXW8+/CUZycXfDFF2torcjR/e3s7Iz09HS8//5H2hhTklohOCQQQ4eOQGZmBtXTFcOHD6U5FanrxevZ/p9/Qc+ed+q7gJxdXMhQkleSvNTRJVSrVGw5FAJCQAgIASEgBISAEBACQkAICAEhIAQuTkBiCAEhUJ6AobzHpZyzUGooPIO9G6biTMSfMBhNMBiMJNSxpKVob4DRZIucrFT8tudNRB5+F0ajM2WtyFXuq5SCm5snHpk1E7PnPIakpCR97uvrCx8fP3h7+8HW1kYL/XZkyzAajSTgFWLYsFEkgn4IvmLey8uXxMeq+opwOzsXLFv2IoaPGoxatUuEQ45nNNqTwGxDdTUWV5INFxwGmKgcW2qngdpnaYeNDce1pzJsi+NbDzgMsKX8jFBkDKBUcHV2w55928mYMBQHDhygdnjA378KibGBVLcAEkH9SODPwgcffETlGMkZKL0NCZEpJLD3JTF0JXJycuDp6UNpqlFaf2IQoIXIt956G1Wr+aL0p07tGnji6cfw9NOLkZycRKx8Kb4/leNLx56UP7MyUxm2KEQuWrVthS+/XAsnJ1cyqARQGYFURiDF9aO4Buzc+T0ZYnaAH0FUp1YNPPPsk1iwYB7syJDi4+Ov43LdvvtuM8LCIiiNPTlDMa/SdavscZ2aNfDU4oW6LQkJ8VQnz6K2+NOxN4wGbgtgb2ePqDMRxLMaoqKiSKD1oOMAaktVuLt7IyIiCvMeW4i33n4DtSjPytbDGt/e3gG79+zEvffdj++++w6Ojg5UDz/i5q+do6Mbdu/ei7oN6qEGGZgKCwvh6OBA7L2o//x13X19A8hw46jHFQvgzNDb2x/+/v6UlyfyMlH8qV0nGOMn3UMGpldRSIK6t7evzsPDw4+MOh5Q9I8j81i1IyMWOz4v8taHvLGGg8YmHytlgIOdA1atWoWNGzdQO1yojj7UhgDi5YLZsx9DXl4ejXEHGAwGWD88vm1sHEmQjyZj0o80BuzIWFKd0vnr4717f0CzFq0QUrMalFLWZJe8t7Ex6nxsbEyo6GOkqihl0uxAc5PbwvFMtBbl5+dh1LhxWL58hX4El7u7l66Xdb0wmYy0NnwKkwOnoNS0Ztja2haVZ7R4XsUtG5m+/GItduzYQWtTAfHlvvOjOvlSH/rRGPUkY9EZMtQ8hieemA8XJ2fN2sXFDSvffhX33/8Qjh8/Dncav/5F64Wvrz/l46ffEfTSS6/A04cWv1J15vbw3XrMxaAM4HWsVPA5hwpK+23Zsl0zZeMxe7z11rt6neJjq7OztUN+QSbq1qut1wQXF8+iOcbrRRUauz7aALZhw0b8/vvvcHQsqZuuj8Fel6GoXqWGlDV72QsBISAEhIAQuHoEJCchIASEgBAQAkJACAgBISAEbngChssloJQtnF2c8PvW8Vi3cgDCjuxBdna6FviS4sLxw6YVePvZ25F6djOUwQ60weV+DAYDaofUwMuvLSOhjQVVEzp27IyhQ4dDkQhqMDhg/Ph7EFStBp0rEmttULtOEEaNGkdCmzP5mTBixEja25BTmDbtUXh5+MNIwifXiV903LNnPwozIji4DjZ8+zUZK1w5CN6evnjvw7coTJERJQhvvPWKNgBwmlq1GpC/AU2aNCcxMETH5w2H9e7dn8IUhbXE3r3fw8HBkYPg6x2A/b/8iObN21I4lxeCkSPHoHXrdvqcBe1Zj82Fs7MLnVtESRsbW2pPMO6770ESQX3J30RGlCHo128gHRtJCK2Cn/f/QIYLZ12GdaOUgp9PIJa//CyJkoEUl9tvor0BNWvWR0ZmKrEy6eguTi4khDtSvsMo3KTdiBGjyfDSSx87Orqjf//BiIwK0wYTpRSCiffTS57W4fXrN0Dv3n30Mbe9Tp0GdKxw992TYEv1V8rSFl3YZWyUUvDzrkJj4AUSjnkM2FH+XE8D9VktpGeklGlLCBkdgqkveXx06XIbhgwZSvGNCAmpg683rKH+cKLzy6+TUgp29vZkAIjCnXf2Ao9BLut/7J0FYFX1F8e/9711b/QGCxpppLtBQBQQAUEkBAlJQQXpsMFAUbC7/nZ3Y3eRG2PEWLDu+p/zG29sMBDGQDa+2/u9W7845/OL+7vnvHvvFVeMhRqILcuGnj37itPD0+jvKo6Z337/WdpDW1iWJUFl16B1orroUrftUo/+uOqqKSXalPaB+qGhYgyfJQZlf0nviG+hV69+yMvPNvFHjhwLmxiYNTRsHAYpqYh2o8Z1cfHFw6BOQMuysOWbL6UsL+kjLoiLj8HgwVp/NlxyyaUICqotPD2xSQzw3t5VYFk2XHPNTFOG5nPllZNhWXaEhDRA1669RSY/9O3bH/36DYBluaJnz/6oVzdY2opzUfknu6L5d+7cE6qDj081afshsm4vkTykdl0sX71Y2n4tKc/Cu++/DV9vXxPHyUn6f91Q088DAmrKcSfR7WJp26PMuk3GixVrlqNeSF2jz9Sp18p+NynDXdrrDLPPZFROX5ZloWGjMGE/Qtj7SllO6N69JyZPvhqdOnWV7UKO92+6W8a3QJGjUFet86oy/rzy+ou44IJWJl6bNm3NeNGsWUuzXVX6xNPPPW7GJIe4yq9Pn4vkuA2NGzfDF19/dsydbo64xZeabty4CZLOVYKTOGeCjNyWZRWPZtZ9fPzgIY7S3r37S1ybBGcZY8ebNqD9QNvMxIlTkJSUAMc4G1QzGHfefavEtZm8V669CcFBdU1+/CIBEiABEiABEiABEiABEiCBikaA8pIACZAACVQMArbTE9MOF4+6YqwHtn43Hx8/2Rdvb+6Cb94chZSYt9C4SV1YNm8AxxrQcIp/lmWhdq0QY5xsJIbdPVHh+HrLZ6jXIPjwPimrWDk2m93sb9y4ronz2ZefmKUa+TTYDzs/HGLoPkfw8fJx7DZLNUI6jundD2anfDn26VI2S3x0nyM4nB+OCF6Sv+OY3Qn49IuPcTBsJPvlAAAQAElEQVR2nzE26v6GdUUX0dcRX5c2cQLpMQ1qTP3m+6/w08/fSppQo6enp5dGOyZYloU6gWEmjqYtHpycpPBiKZydnYvi6R0HyuyPP38VA3RhGZpWnTGOJJZloX5YoRE5OycDauBX2TRe8WBZp1//WqZlWQgqagOF5TrKOVYXF6OLtsHw3Tvx9bdfCqtCDgF+VWBZpy+TBUsM2m6mHJVD2+KXX32KOiG1i/a5OLuo6Ca4ihNE451sMImKfRVvA0fnYbMVGs2L71f5iiU3q8WPF28zjrpXx+Gvv/0Ed4/CthAWXJKzyUS+iufjWN8RvhU7dv5TpPvRdSLJTvrjyFOXDt2OTqxOED2uweH8cMSxFe8vMl78+dev0D6jd31p/HqhdR1Ri+TV/RqKDpTjimVZReVoH4naG4F33n8TB2KiitplUM0QWJZVolTLssRZW60obWJSHD77/GOkZyYXpSs+JjkSqx6O4HnUY/4ccUpbOtI4lpZVUp7iabRtO+LVl3FYx4udu7aKXEfGC/tR42yQOEEcaej8KE6T6yRQ4QlQARIgARIgARIgARIgARIgARIgARI4JwnYykUqywnOrnXh5lsXHv514epZFza7Dw6/37lciiiZiQVXVzd4enpDH3lT8ljJLX17gcbROxx0WfJoeW+den5qeFbZCu8aOL6xsXjOlmXBy8ML+mgZy7IVP1Ru62pAVrnUeaPr/5axOkY0rmWdnA7/ll95Hdc2qI/FUl6WdWZl0/Zl2uRRjqXy0uVs5GOz2aH16OR06ndu6KO03Nzcz4aYp1SGBcvopG3AfpRB/pQyKqfIlmXBVcYvX28/uLm4wbKsk87ZxcVVHM7e5q4iy7JOOt2ZjmgXT66OF1r/1hkak860DsyfBEiABEiABEiABEiABE6NAGOTAAmQAAmQAAlUBAK2iiAkZSQBEiABEiABEjiHCVA0EiABEiABEiABEiABEiABEiABEiCByk+gAmpIB0gFrDSKTAIkQAIkQAIkQAIkQAIkQAIk8N8SYOkkQAIkQAIkQAIkQALnPgE6QM79OqKEJEACJHCuE6B8JEACJEACJEACJEACJEACJEACJEAClZ8ANSSBCkeADpAKV2UUmARIgARIgARIgARIgARI4L8nQAlIgARIgARIgARIgARIgATOdQJ0gJzrNUT5SKAiEKCMJEACJEACJEACJEACJEACJEACJEAClZ8ANSQBEiCBCkaADpAKVmEUlwRIgARIgARIgARI4NwgQClIgARIgARIgARIgARIgARIgATObQJ0gJzb9VNRpKOcJEACJEACJEACJEACJEACJEACJEAClZ8ANSQBEiABEiCBCkWADpAKVV0UlgRIgARIgARI4NwhQElIgARIgARIgARIgARIgARIgARIgATOZQLl4wA5lzWkbCRAAiRAAiRAAiRAAiRAAiRAAiRAAuVDgLmQAAmQAAmQAAmQQAUiQAdIBaosikoCJEACJHBuEaA0JEACJEACJEACJEACJEACJEACJEAClZ8ANay4BOgAqbh1R8lJgARIgARIgARIgARIgARI4GwTYHkkQAIkQAIkQAIkQAIkUGEI0AFSYaqKgpIACZx7BCgRCZAACZAACZAACZAACZAACZAACZBA5SdADUmABCoqATpAKmrNUW4SIAESIAESIAESIAES+C8IsEwSIAESIAESIAESIAESIAESqCAE6ACpIBVFMc9NApSKBEiABEiABEiABEiABEiABEiABEig8hOghiRAAiRAAhWTAB0gFbPeKDUJkAAJkAAJkAAJ/FcEWC4JkAAJkAAJkAAJkAAJkAAJkAAJVAgCdICcVjUxMQmQAAmQAAmQAAmQAAmQAAmQAAmQQOUnQA1JgARIgARIgAQqIgE6QCpirVFmEiABEiABEvgvCbBsEiABEiABEiABEiABEiABEiABEiCByk+gEmhIB0glqESqQAIkQAIkQAIkQAIkQAIkQAIkcGYJMHcSIAESIAESIAESIIGKR4AOkIpXZ5SYBEiABP5rAiyfBEiABEiABEiABEiABEiABEiABEig8hOghiRQ4QnQAVLhq5AKkAAJkAAJkAAJkAAJkAAJnHkCLIEESIAESIAESIAESIAESKCiEaADpKLVGOUlgXOBAGUgARIgARIgARIgARIgARIgARIgARKo/ASoIQmQAAlUcAJ0gFTwCqT4JEACJEACJEACJEACZ4cASyEBEiABEiABEiABEiABEiABEqhYBOgAqVj1da5ISzlIgARIgARIgARIgARIgARIgARIgAQqPwFqSAIkQAIkQAIVmgAdIBW6+ig8CZAACZAACZDA2SPAkkiABEiABEiABEiABEiABEiABEiABCoSgbI5QCqShpSVBEiABEiABEiABEiABEiABEiABEigbASYigRIgARIgARIgAQqMAE6QCpw5VF0EiABEiCBs0uApZEACZAACZAACZAACZAACZAACZAACVR+AtSw8hCgA6Ty1CU1IQESIAESIAESIAESIAESIIHyJsD8SIAESIAESIAESIAESKDCEqADpMJWHQUnARI4+wRYIgmQAAmQAAmQAAmQAAmQAAmQAAmQQOUnQA1JgAQqCwE6QCpLTVIPEiABEiABEiABEiABEjgTBJgnCZAACZAACZAACZAACZAACVRQAnSAnOWKKygoQEpaSomQlZUJ3X+WRWFxZSDAJCRAAiRAAiRAAiRAAiRAAiRAAiRAApWfADUkARIgARKoHAQqvAMkMTkRe/ZFICkp4ZyvEXVyODu7YtDAIRjQ7yITLuo/CG1at4ObqzudIOd8DVJAEiABEiABEjgvCVBpEiABEiABEiABEiABEiABEiABEqiQBCq0AyQ2/iBGjxyD5TetxrixVyEjI/0MV8LpZZ+emY6WLVph9qwZuHbmdMycMQ3Tp1+D8eOvRLPmzZGZmXF6BTA1CZAACZAACZAACZAACZAACZAACZBAORBgFiRAAiRAAiRAApWBQIV1gOTl5cLHKwDDhg3FuHFj0Lx5UySlJKBA/s/lirHb7UhPT0daWhpsNgu1awchLCwYQYGBUAfJuSw7ZSMBEiABEjhPCVBtEiABEiABEiABEiABEiABEiABEiCByk+gEmpYYR0gO3fswZzZsxEYGARnZxd8+ukX8Pb0hSX/52o9ebh74KuvvsRdd23AHXesk/VvzGOv8vPzoeFclZtykQAJkAAJkAAJkAAJkAAJkMD5RoD6kgAJkAAJkAAJkAAJVHwCZXaApKenISklSQgUSDi7n/z8PHh5u6BZswvg4+ON3377Db//8TtcXd2MQyE1NQVpaalQGbdtDYeG7OwsI+S+A5Fme1/0HrN99Je+pyM5OdHE0XS794YjKyvz6Gglti3LQoqw0PgadoSHI7OUNOqccXa145vvvsabb76LpORkkbdEVtwgARIggXORAGUiARIgARIgARIgARIgARIgARIgARKo/ASoIQlUOgJlcoAkJiZg4IDBGH7JZeIoiMB2Mfjn5eWdNTjheyKxdMly1K5dGzabDR98+DGiY/abdVdXV1w0cDB69uiDNq3b49FHN+Ohhx5A7aBQkTUcNyxYjNdffxk3XLfIbBcXOj09Fdu3RWDoxcNMupdffg4rblqD+vUaHRPXkU713vrPLinzYmzatAGvvPI87rz1djRu2NSkUYeKI64uLVhwd3OHmxdgE8eJ7mMgARIgARIgARIgARIgARI41whQHhIgARIgARIgARIgARIggYpOoEwOkIPRCWjTpjUWLJiLn37agtvX3oKdOyKNwT8vL/eMMlGHQl4mUL9+Xfj7++H33//Cn3/+CRcnZ+hdHg3qN8LChddhyZJFuO22Nejduwf69u2F9etvx7fffoUxY8agdesWGD16FF588WkjswqcmBiPdm074ZNP3sN1181Dnz490aFDe1x++XDcc886PPXUY0VxNb6GzOxMo/cPP3yNG264DgMHDpA07cx7Se65507cf/+92LEzAiqzxmcggQpLgIKTAAmQAAmQAAmQAAmQAAmQAAmQAAlUfgLUkARIgAQqGQFbWfVxc3OBn58fgoICMWrUZYiM3I4333xZHAJ7jKMgOmYfcnNzyv3dFnsP7MbKlUvRpElj2O12fPPNN/j628+gd37oezTsTnZ4eXmZR2Pp8bS0dPOOkFq1aiIkpDZSU1ORl5cPT09PNGzY0Kifk5OD0NCGuOaaq9G4cSPjWImM3CN5fw/LsqFKlSro1q0znn/+SaObJsoVR09k+H789tv3hoGfnx927NiJzz77AklJyQgICMCllw7BbbfcbO4q0TQMJEACJEACJEACJEACFYcAJSUBEiABEiABEiABEiABEiABEqjYBMrkAGnU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TfF1JycnBPhVQf3QUIkfUhgahMDZybl4NK6TAAmQAAmQAAmQAAmQAAmQAAmcQQLMmgRIgARIgARIgARIoPIRsJ3LKqlTYdy4SRg6dAQ6dOiCho3CTkpcdXpocES2LEscH3ZYlgXHnx7XYMFy7DJLy7Jgs2xwFceGt7cv7OK80Hg4wZ9lWbDZ7OYuDy9xlHi6e8q6k+yzwbIs/NufZVkmrubhCOAfCZAACfx3BFgyCZAACZAACZAACZAACZAACZAACZBA5SdADUmg0hOwncsaqjMAVjYyslKN88Oy/t2ZcC7rQ9lIgARIgARIgARIgARIgATOVQKUiwRIgARIgARIgARIgARIoLIROKcdIApbnSD6vhHLovNDeTCQwFkhwEJIgARIgARIgARIgARIgARIgARIgAQqPwFqSAIkQAKVnMA57wCp5PypHgmQAAmQAAmQAAmQwDlCgGKQAAmQAAmQAAmQAAmQAAmQAAlULgJ0gFSu+iwvbZgPCZAACZAACZAACZAACZAACZAACZBA5SdADUmABEiABEigUhOgA6RSVy+VIwESIAESIAESOHkCjEkCJEACJEACJEACJEACJEACJEACJFCZCJTuAKlMGlIXEiABEiABEiABEiABEiABEiABEiCB0glwLwmQAAmQAAmQAAlUYgJ0gFTiyqVqJEACJEACp0aAsUmABEiABEiABEiABEiABEiABEiABCo/AWp4/hCgA+T8qWtqSgIkQAIkQAIkQAIkQAIkQAJHE+A2CZAACZAACZAACZAACVRaAnSAVNqqpWIkQAKnToApSIAESIAESIAESIAESIAESIAESIAEKj8BakgCJHC+EKAD5HypaepJAiRAAiRAAiRAAiRAAqUR4D4SIAESIAESIAESIAESIAESqKQE6ACppBVLtcpGgKlIgARIgARIgARIgARIgARIgARIgAQqPwFqSAIkQAIkcH4QoAPk/KhnakkCJEACJEACJEACxyPA/SRAAiRAAiRAAiRAAiRAAiRAAiRQKQnQAVKiWrlBAiRAAiRAAiRAAiRAAiRAAiRAAiRQ+QlQQxIgARIgARIggfOBAB0g50MtU0cSIAESIAESOBEBHiMBEiABEiABEiABEiABEiABEiABEqj8BM5DDekAOQ8rnSqTAAmQAAmQAAmQAAmQAAmQwPlOgPqTAAmQAAmQAAmQAAlUfgJ0gFT+OqaGJEACJPBvBHicBEiABEiABEiABEiABEiABEiABEig8hOghiRw3hGgA+S8q3IqTAIkQAIkQAIkQAIkQAIkAJABCZAACZAACZAACZAACZBAZSdAB0hlr2HqRwInQ4BxSIAESIAESIAESIAESIAESIAESIAEKj8BakgCJEAC5xkBOkDOswqnuiRAAiRAAiRAAiRAAoUE+E0CJEACJEACJEACJEACJEACJFC5CdABUrnr92S1YzwSIAESIAESIAESIAESIAESIAESIIHKT4AakgAJkAAJkMB5RYAOkPOquqksCZAACZAACZDAEQJcIwESIAESIAESIAESIAESIAESIAESqMwECh0glVlD6kYCJEACJEACJEACJEACJEACJEACJFBIgN8kQAIkQAIkQAIkcB4RoAPkPKpsqkoCJEACJFCSALdIgARIgARIgARIgARIgARIgARIgAQqPwFqeP4SoAPk/K17ak4CJEACJEACJEACJEACJHD+EaDGJEACJEACJEACJEACJHDeEKAD5LypaipKAiRwLAHuIQESIAESIAESIAESIAESIAESIAESqPwEqCEJkMD5SoAOkPO15qk3CZAACZAACZAACZDA+UmAWpMACZAACZAACZAACZAACZDAeUKADpDzpKKpZukEuJcESIAESIAESIAESIAESIAESIAESKDyE6CGJEACJEAC5ycBOkDOz3qn1iRAAiRAAiRAAucvAWpOAiRAAiRAAiRAAiRAAiRAAiRAAucFgfPcAXJe1DGVJAESIAESIAESIAESIAESIAESIIHznADVJwESIAESIAESOB8J0AFyntR6VnYWsrKyRNsCCfxUFAIFKEBGRjqSU5OLQmp6KvLz846rQkFBAVKLxde0mZkZkib/uGnK84CWn5aRJu0tU7I9vfaWnZ1t9M/PPzuyi8D8kMD5QYBakgAJkAAJkAAJkAAJkAAJkAAJkAAJVH4C1BAVxgGiBtDk5ERs3xWObVsLQ9T+COTkZJ9n1XjqBuVscX40b9YSLVq0El65wuvU85BE/JxlAur8yM/LR5fO3XBR/0EY2O8iDJRl75594esbIA6NY50g6nzIyyvARQOHFMaXNJq2fbuO8PDwkjRn1pGg5dtsNvTo2hOtWrZBnsgPceKUBZ06Pxo3vsDo7+XpfcZlL4uMTEMCJEACJEACJEACJFBxCFBS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bDa7OXa8L9thGbUMja/BsqwS0S3LEkbOcBUngZ+Pv3Fk+Hj5wlW2j+blSKjyqt7KWdu05m9ZFjT/4+nvSHsyS81D81QHjZO0Q3XSVPGvBk9PL8PAso7ooM4PF3GIjB19Fe6//14MHToUXl5e2L59J/7860/UCPQ/mSJPOo5lWSKDixmLalQLNPWhMipr1V/XLeuIfDbLJnFc4Co89ZFdQTVDzB09hX3MCZZlobQ/y7KkXpzgKul8fPxMvfh6+8FVtpWPZR2bzi7tuDQZSsuf+0iABEigMhOgbiRAAiRAAiRAAiRAAiRAAiRAAuc3AVulU19sgTYxCFqWHWqItMm2bFY6NU9RIUYngUpPIDMzA40aNsK9996PGTOmo3r1qoiJicG7776HBzZuhjp1Kj0EKkgCJEACJEACJEACJEACJHC+E6D+JEACJEACJEACxQjYiq1XilUfTz9j9Pzzz9+xdetWREfHwNerfH/5XSlAUQkSqGQE9I6LpOQk/P33r/j115/x3XffYcOGjZg/fyEaNa5bybSlOiRAAidHgLFIgARIgARIgARIgARIgARIgARIgAQqP4Hja1jpHCDe3r54481X0bz5hejdeyD+9/IL0MfGHB8Bj5AACVQGAi4uLggP34mmTVujdesO6N69LzZsXEfnR2WoXOpAAiRAAiRAAiRAAiRw8gQYkwRIgARIgARIgARIoIhApXOAqGbqBNFffGug80OJMJDA+UFAnSDa7x2hVo0654fi1PK4BHiABEiABEiABEiABEiABEiABEiABEig8hOghiRwPAKV0gFyPGW5nwRIgARIgARIgARIgARIgAQqOQGqRwIkQAIkQAIkQAIkQAIkcJgAHSCHQXBBAiRQGQlQJxIgARIgARIgARIgARIgARIgARIggcpPgBqSAAmQQOkE6AApnQv3kgAJkAAJkAAJkAAJkEDFJECpSYAESIAESIAESIAESIAESIAEDAE6QAwGflVWAtSLBEiABEiABEiABEiABEiABEiABEig8hOghiRAAiRAAiRQGgE6QEqjwn0kQAIkQAIkQAIkUHEJUHISIAESIAESIAESIAESIAESIAESIAEhUMkdIKIhPyRAAiRAAiRAAiRAAiRAAiRAAiRAApWcANUjARIgARIgARIggWMJ0AFyLBPuIQESIAESIIGKTYDSkwAJkAAJkAAJkAAJkAAJkAAJkAAJVH4C1PBfCdAB8q+IGIEESIAESIAESIAESIAESIAESOBcJ0D5SIAESIAESIAESIAESOBoAnSAHE2E2yRAAiRQ8QlQAxIgARIgARIgARIgARIgARIgARIggcpPgBqSAAn8CwE6QP4FEA+TAAmQAAmQAAmQAAmQAAlUBAKUkQRIgARIgARIgARIgARIgARKEqADpCQPbpFA5SBALUiABEiABEiABEiABEiABEiABEiABCo/AWpIAiRAAiRwQgJ0gJwQDw+SAAmQAAmQAAmQAAlUFAKUkwRIgARIgARIgARIgARIgARIgASKE6ADpDiNyrNOTUiABEiABEiABEiABEiABEiABEiABCo/AWpIAiRAAiRAAiRwAgJ0gJwADg+RAAmQAAmQAAlUJAKUlQRIgARIgARIgARIgARIgARIgARIoPITOHkN6QA5eVaMSQIkQAIkQAIkQAIkQAIkQAIkQALnFgFKQwIkQAIkQAIkQAIkcFwCdIAcFw0PkAAJkAAJVDQClJcESIAESIAESIAESIAESIAESIAESKDyE6CGJHCyBOgAOVlSjEcCJEACJEACJEACJEACJEAC5x4BSkQCJEACJEACJEACJEACJHAcAnSAHAcMd5MACVREApSZBEiABEiABEiABEiABEiABEiABEig8hOghiRAAiRwcgToADk5ToxFAiRAAiRAAiRAAiRAAucmAUpFAiRAAiRAAiRAAiRAAiRAAiRQKgE6QErFwp0VlQDlJgESIAESIAESIAESIAESIAESIAESqPwEqCEJkAAJkAAJnAwBOkBOhhLjkAAJkAAJkAAJkMC5S4CSkQAJkAAJkAAJkAAJkAAJkAAJkAAJlEKgkjlAStGQu0iABEiABEiABEiABEiABEiABEiABCoZAapDAiRAAiRAAiRAAv9OgA6Qf2fEGCRAAiRAAiRwbhOgdCRAAiRAAiRAAiRAAiRAAiRAAiRAApWfADU8ZQJ0gJwyMiYgARIgARIgARIgARIgARIgARL4rwmwfBIgARIgARIgARIgARL4NwJ0gPwbIR4nARIggXOfACUkARIgARIgARIgARIgARIgARIgARKo/ASoIQmQwCkSOOcdILm5OcjJOTbk5+efoqqMXhYCBQUFcNRBbm4udLss+QAFpdaj1m3Z8yybJExFAiRAAiRAAiRAAiRQGQhQBxIg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QAIkQAIkQAIkQAIkUPkJUEMSKC8CdICUF0nmQwIkQAIkQAIkQAIkQAIkQALlT4A5kgAJkAAJkAAJkAAJkAAJlJEAHSBlBMdkJEAC/wUBlkkCJEACJEACJEACJEACJEACJEACJFD5CVBDEiABEigfAnSAlA9H5kICJEACJEACJEACJEACZ4YAcyUBEiABEiABEiABEiABEiABEigTATpAyoSNif4rAiyXBEiABEiABEiABEiABEiABEiABEig8hOghiRAAiRAAiRQHgToACkPisyDBEiABEiABEiABM4cAeZMAiRAAiRAAiRAAiRAAiRAAiRAAiRQBgIVzAFSBg2ZhARIgARIgARIgARIgARIgARIgARIoIIRoLgkQAIkQAIkQAIkcPoE6AA5fYbMgQRIgARIgATOLAHmTgIkQAIkQAIkQAIkQAIkQAIkQAIkUPkJUMNyJ0AHSLkjZYYkQAIkQAIkQAIkQAIkQAIkQAKnS4DpSYAESIAESIAESIAESOB0CdABcroEmZ4ESIAEzjwBlkACJEACJEACJEACJEACJEACJEACJFD5CVBDEiCBciZAB0g5A2V2JEACJEACJEACJEACJEAC5UGAeZAACZAACZAACZAACZAACZDA6RGgA+T0+DE1CZwdAiyFBEiABEiABEiABEiABEiABEiABEig8hOghiRAAiRAAuVKgA6QcsXJzEiABEiABEiABEiABMqLAPMhARIgARIgARIgARIgARIgARIggdMhQAfI6dA7e2lZEgmQAAmQAAmQAAmQAAmQAAmQAAmQQOUnQA1JgARIgARIgATKkQAdIOUIk1mRAAmQAAmQAAmUJwHmRQIkQAIkQAIkQAIkQAIkQAIkQAIkUPkJnDkN6QA5c2yZMwmQAAmQAAmQAAmQAAmQAAmQAAmcGgHGJgESIAESIAESIAESKDcCdICUG0pmRAIkQAIkUN4EmB8JkAAJkAAJkAAJkAAJkAAJkAAJkEDlJ0ANSeBMEaAD5EyRZb4kQAIkQAIkQAIkQAIkQAIkcOoEmIIESIAESIAESIAESIAESKCcCNABUk4gmQ0JkMCZIMA8SYAESIAESIAESIAESIAESIAESIAEKj8BakgCJEACZ4YAHSBnhitzJQESIAESIAESIAESIIGyEWAqEiABEiABEiABEiABEiABEiCBciFAB0i5YGQmZ4oA8yUB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ISAEhMDNRUCsFQJCQAgIASEgBISAEBACQkAICAEhIATKPwHx8LIJiABy2agkoxAQAkJACAgBISAEhIAQEAJCQAjcaATEHiEgBISAEBACQkAICAEhcCECIoBciIwcFwJCQAjcfATEYiEgBISAEBACQkAICAEhIASEgBAQAkKg/BMQD4WAELhMAiKAXCYoySYEhIAQEAJCQAgIASEgBITAjUhAbBICQkAICAEhIASEgBAQAkJACJRMQASQkrnIUSFwcxIQq4WAEBACQkAICAEhIASEgBAQAkJACAiB8k9APBQCQkAICIHLIiACyGVhkkxCQAgIASEgBISAEBACNyoBsUsICAEhIASEgBAQAkJACAgBISAEhEBJBEQAKYnKzXtMLBcCQkAICAEhIASEgBAQAkJACAgBISAEyj8B8VAICAEhIASEgBC4DAIigFwGJMkiBISAEBACQkAI3MgExDYhIASEgBAQAkJACAgBISAEhIAQEAJCoPwTuHIPRQC5cmZSQggIASEgBISAEBACQkAICAEhIASEwH9LQFoXAkJACAgBISAEhIAQuCQBEUAuiUgyCAEhIASEwI1OQOwTAkJACAgBISAEhIAQEAJCQAgIASEgBMo/AfFQCFwpARFArpSY5BcCQkAICAEhIASEgBAQAkJACPz3BMQCISAEhIAQEAJCQAgIASEgBC5BQASQSwCS00JACNwMBMRGISAEhIAQEAJCQAgIASEgBISAEBACQqD8ExAPhYAQEAJXRkAEkCvjJbmFgBAQAkJACAgBISAEhMCNQUCsEAJCQAgIASEgBISAEBACQkAICIGLEhAB5KJ45OTNQkDsFAJCQAgIASEgBISAEBACQkAICAEhIATKPwHxUAgIASEgBITAlRAQAeRKaEleISAEhIAQEAJCQAjcOATEEiEgBISAEBACQkAICAEhIASEgBAQAkLgIgTKiQByEQ/llBAQAkJACAgBISAEhIAQEAJCQAgIASFQTgiIG0JACAgBISAEhIAQuHwCIoBcPivJKQSEgBAQAkLgxiIg1ggBISAEhIAQEAJCQAgIASEgBISAEBAC5Z+AeFhqAiKAlBqdFBQCQkAICAEhIASEgBAQAkJACAiB601A2hMCQkAICAEhIASEgBAQApdLQASQyyUl+YSAEBACNx4BsUgICAEhIASEgBAQAkJACAgBISAEhIAQ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" class="kg-image" alt="" loading="lazy"/></figure><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="146"><col width="250"><col width="206"/></col></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">項目</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Kiro CLI</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Copilot CLI</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">バックエンドモデル</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Claude Sonnet 4.5</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Claude Sonnet 4.5</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">プロンプト強化</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#188038;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.kiro/steering/*.md</span><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> で規約注入</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">カスタムインストラクション</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RAG機能</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">MCP（Model Context Protocol）</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GitHub Spaces</span></p></td></tr></tbody></table><!--kg-card-end: html--><h2 id="2-%E8%A9%95%E4%BE%A1%E6%96%B9%E6%B3%95%EF%BC%9Allm-as-a-judge"><strong>2. 評価方法：LLM-as-a-Judge</strong></h2><p>生成されたコードの品質を人間が一つずつレビューするのは時間がかかるため、LLM-as-a-Judge（LLMによる自動評価）を採用しました。</p><h2 id="judge%E6%A7%8B%E6%88%90"><strong>Judge構成</strong></h2><ul><li>プライマリJudge: Gemini 3.0</li><li>セカンダリJudge: GPT-5.1</li></ul><p>単一のJudgeだと評価観点にバイアスが出るため、2つの異なるモデルで評価し、結果の一貫性を確認しました。</p><h2 id="%E8%A9%95%E4%BE%A1%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%884%E8%BB%B8%EF%BC%89"><strong>評価フレームワーク（4軸）</strong></h2><p>各コードを以下の4軸で採点しました。</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="149"><col width="64"><col width="388"/></col></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">評価軸</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">配点</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">評価内容</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">機能的正確性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0〜35点</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#188038;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">cdk synth</span><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> 成功、テスト通過率、要件達成度</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWSベストプラクティス</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0〜25点</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">IAM最小権限、RemovalPolicy、LogRetention、セキュリティ設定</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">コード品質</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0〜20点</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">可読性、エラーハンドリング、型定義の厳密性、保守性</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">完全性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0〜20点</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">要件漏れ、監視・アラーム設定、ユニットテスト有無</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>総合スコア計算式：</p><p>Total = (機能的正確性 × 0.35) + (AWSベストプラクティス × 0.25)</p><p>+ (コード品質 × 0.20) + (完全性 × 0.20)<br/></p><h2 id="chain-of-thought%EF%BC%88cot%EF%BC%89%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%AC%E6%98%8E%E5%8F%AF%E8%83%BD%E6%80%A7"><strong>Chain-of-Thought（CoT）による説明可能性</strong></h2><p>CoTと呼ばれるLLMに思考過程を明示させる推論手法があるのですが、今回それも用いました。</p><p>各Judgeには、スコアだけでなく 「なぜその点数なのか」という理由 も出力させます。これにより、単なる数値比較ではなく、「どこが強くてどこが弱いか」という定性的な傾向も把握できます。</p><h2 id="3-%E8%A7%A3%E3%81%8B%E3%81%9B%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%EF%BC%885%E6%AE%B5%E9%9A%8E%E3%81%AE%E9%9B%A3%E6%98%93%E5%BA%A6%E8%A8%AD%E5%AE%9A%EF%BC%89"><strong>3. 解かせたタスク（5段階の難易度設定）</strong></h2><p>AWS CDK（TypeScript）で、以下の5つのタスクを設計しました。</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="50"><col width="84"><col width="467"/></col></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">難易度</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">概要</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク1</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">簡単</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">API Gateway + Lambda の基本構成（GET /hello でJSON返却）</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク2</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">中級</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">To-Doアプリバックエンド（API Gateway + Lambda + DynamoDB）</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク3</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">中上級</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">セキュアなDB接続（VPC + Aurora Serverless v2 + Lambda + Secrets Manager）</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク4</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">上級</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">イベント駆動型注文処理（EventBridge + Lambda + DynamoDB Stream + SQS DLQ）</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">タスク5</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">エキスパート</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">本番CI/CD + 監視（CDK Pipeline + CloudWatch Dashboard + Alarm + SNS）</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>各タスクには明確な「要件」「成功基準」「セキュリティ要件」を定義し、両CLIに同じプロンプトを投入しました。</p><hr><h2 id="%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C"><strong>検証結果</strong></h2><h2 id="%E7%B7%8F%E5%90%88%E3%82%B9%E3%82%B3%E3%82%A2%E6%AF%94%E8%BC%83"><strong>総合スコア比較</strong></h2><p>両Judge（Gemini 3.0 / GPT-5.1）による評価結果の平均は以下の通りです。</p><h2 id="gemini-30-%E3%81%AB%E3%82%88%E3%82%8B%E8%A9%95%E4%BE%A1"><strong>Gemini 3.0 による評価</strong></h2><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="63"><col width="98"><col width="195"><col width="98"><col width="67"><col width="82"/></col></col></col></col></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">CLI</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">機能正確性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWSベストプラクティス</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">コード品質</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">完全性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">総合平均</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Copilot</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">35.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">24.2</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">19.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">26.22</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Kiro</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">35.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">23.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">19.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">25.95</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">差分</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+0.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+0.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+0.27</span></p></td></tr></tbody></table><!--kg-card-end: html--><h2 id="gpt-51-%E3%81%AB%E3%82%88%E3%82%8B%E8%A9%95%E4%BE%A1"><strong>GPT-5.1 による評価</strong></h2><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="63"><col width="98"><col width="195"><col width="98"><col width="67"><col width="82"/></col></col></col></col></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">CLI</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">機能正確性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWSベストプラクティス</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">コード品質</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">完全性</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">総合平均</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Copilot</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">35.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">19.4</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">18.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">18.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">24.54</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Kiro</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">32.8</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">18.4</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">16.6</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">16.8</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">22.76</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">差分</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+2.2</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+1.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+2.0</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+1.8</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">+1.78</span></p></td></tr></tbody></table><!--kg-card-end: html--><h2 id="%E7%B5%90%E6%9E%9C%E3%81%AE%E8%A7%A3%E9%87%88"><strong>結果の解釈</strong></h2><ul><li>両Judgeともに Copilot がやや優位（Gemini: +0.27点、GPT-5.1: +1.78点）</li><li>Gemini 3.0 は「ほぼ互角」と評価し、GPT-5.1 は「Copilot が明確に上」と評価</li><li>Judge間の評価傾向の違いは、後述の「気づき・学び」で詳しく考察します</li></ul><hr><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%94%E3%81%A8%E3%81%AE%E7%89%B9%E5%BE%B4%E3%81%A8%E5%82%BE%E5%90%91"><strong>タスクごとの特徴と傾向</strong></h2><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF1%EF%BC%9Aapi-gateway-lambda%EF%BC%88%E7%B0%A1%E5%8D%98%EF%BC%89"><strong>タスク1：API Gateway + Lambda（簡単）</strong></h2><p>要件: GET /hello で {"message": "Hello from CDK"} を返すAPI</p><p>評価傾向:</p><ul><li>Kiro: シンプルで動作確実だが、API URL の出力やレスポンスヘッダー設定が省略</li><li>Copilot: CfnOutput でAPI URLを出力し、レスポンスヘッダー（Content-Type）も明示。開発者体験（DX）が高い</li></ul><p>コメント: 基本タスクでは両者ともほぼ満点だが、Copilot は「使いやすさ」まで配慮している印象。</p><hr><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF2%EF%BC%9Ato-do%E3%82%A2%E3%83%97%E3%83%AA%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%EF%BC%88%E4%B8%AD%E7%B4%9A%EF%BC%89"><strong>タスク2：To-Doアプリバックエンド（中級）</strong></h2><p>要件: POST /todos でアイテム作成、GET /todos/{id} で取得</p><p>評価傾向:</p><ul><li>Kiro: AWS SDK（v2）の低レベルAPIを使用。エラーハンドリングは最小限</li><li>Copilot: AWS SDK v3（@aws-sdk/lib-dynamodb）を使用し、DocumentClient でモダンな実装。エラーログ・ID自動生成も実装</li></ul><p>コメント: Copilot は「実務で使える」レベルまで仕上げる傾向。Kiro はシンプルだが、エラーケースの考慮がやや薄い。</p><hr><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF3%EF%BC%9A%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AAdb%E6%8E%A5%E7%B6%9A%EF%BC%88%E4%B8%AD%E4%B8%8A%E7%B4%9A%EF%BC%89%E6%9C%80%E3%82%82%E5%B7%AE%E3%81%8C%E5%87%BA%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF"><strong>タスク3：セキュアなDB接続（中上級）最も差が出たタスク</strong></h2><p>要件: VPC + Aurora Serverless v2 + Lambda、Secrets Manager でDB認証情報管理</p><p>評価傾向:</p><ul><li>Kiro: CDKネイティブな書き方（抽象化）</li><li>.connections.allowFrom() で1行でSG設定完了</li><li>Credentials.fromGeneratedSecret() でSecretsを自動生成＆紐付け</li><li>コード行数: 約40行</li><li>Copilot: Terraform的な書き方（明示的）</li><li>SecurityGroup を個別に定義し、addIngressRule() で手動設定</li><li>Secrets Manager を先に作成し、RDSに渡す</li><li>コード行数: 約90行</li></ul><p>具体例（コード比較）:</p><h2 id="kiro-%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%88%E6%8A%9C%E7%B2%8B%EF%BC%89"><strong>Kiro のコード（抜粋）</strong></h2><p>typescript</p><p><em>// Lambda から RDS への接続許可（1行で完結）</em></p><p>dbCluster.connections.allowFrom(lambdaFn, ec2.Port.tcp(5432));<br/></p><p><em>// シークレット自動生成＆紐付け</em></p><p>credentials: rds.Credentials.fromGeneratedSecret('dbadmin'),<br/></p><h2 id="copilot-%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%88%E6%8A%9C%E7%B2%8B%EF%BC%89"><strong>Copilot のコード（抜粋）</strong></h2><p>typescript</p><p><em>// SecurityGroup を個別に作成</em></p><p>const lambdaSg = new ec2.SecurityGroup(this, 'LambdaSecurityGroup', { vpc, ... });</p><p>const dbSg = new ec2.SecurityGroup(this, 'DatabaseSecurityGroup', { vpc, ... });<br/></p><p><em>// Ingress Rule を手動で追加</em></p><p>dbSg.addIngressRule(lambdaSg, ec2.Port.tcp(5432), 'Allow Lambda access');<br/></p><p><em>// Secrets Manager を先に定義</em></p><p>const dbCredentials = new secretsmanager.Secret(this, 'DatabaseCredentials', { ... });</p><p>credentials: rds.Credentials.fromSecret(dbCredentials),<br/></p><p>コメント:<br>Kiro は 「CDKを使うメリット（抽象化による記述量削減）」 をフル活用。Copilot は 「丁寧で明示的だが、Terraform的」 な実装。どちらも動作するが、CDKの思想に沿っているのは Kiro。</br></p><hr><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF4%EF%BC%9A%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E6%B3%A8%E6%96%87%E5%87%A6%E7%90%86%EF%BC%88%E4%B8%8A%E7%B4%9A%EF%BC%89"><strong>タスク4：イベント駆動型注文処理（上級）</strong></h2><p>要件: EventBridge → Lambda A → DynamoDB → Stream → Lambda B → DLQ（SQS）</p><p>評価傾向:</p><ul><li>Kiro: インフラ構成は正確だが、Lambda A が DynamoDB に書き込むロジックが未実装（要件未達）</li><li>Copilot: イベント受信→DB書き込み→Stream処理まで、アプリケーションロジックも実装</li></ul><p>コメント: Copilot は「指示以上のこと」をしてくれる一方、Kiro はインフラ構成に特化。実務では「どこまで書くか」の判断が分かれる。</p><hr><h2 id="%E3%82%BF%E3%82%B9%E3%82%AF5%EF%BC%9A%E6%9C%AC%E7%95%AAcicd-%E7%9B%A3%E8%A6%96%EF%BC%88%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%EF%BC%89"><strong>タスク5：本番CI/CD + 監視（エキスパート）</strong></h2><p>要件: CDK Pipeline + GitHub連携 + CloudWatch Dashboard + Alarm</p><p>評価傾向:</p><ul><li>Kiro: 要件は満たすが、アラーム設定（EvaluationPeriods: 1）が誤検知を起こしやすい設定</li><li>Copilot: treatMissingData や詳細メトリクス有効化など、運用視点の設定が充実。Dashboard URLも出力</li></ul><p>コメント: 本番運用を見据えた設定の丁寧さでは Copilot が優位。</p><hr><h2 id="%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E5%82%BE%E5%90%91%E3%81%BE%E3%81%A8%E3%82%81"><strong>全体的な傾向まとめ</strong></h2><h2 id="copilot-%E3%81%AE%E7%89%B9%E5%BE%B4%EF%BC%9A%E3%81%AA%E3%82%93%E3%81%A7%E3%82%82%E3%83%BB%E5%BC%B5%E3%82%8A%E5%88%87%E3%82%8A%E5%B1%8B"><strong>Copilot の特徴：なんでも・張り切り屋</strong></h2><ul><li>エラーハンドリング、ログ出力、ID自動生成など、「実際に動かす」ために必要な周辺実装まで含める</li><li>CfnOutput でエンドポイントURLやARNを出力し、運用者の利便性を考慮</li><li>指示以上のことをしてくれるが、コード行数が増える傾向</li></ul><h2 id="kiro-%E3%81%AE%E7%89%B9%E5%BE%B4%EF%BC%9A%E7%B0%A1%E6%BD%94%E3%83%BBaws%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E8%A8%AD%E8%A8%88%E8%80%85%E5%90%91%E3%81%91"><strong>Kiro の特徴：簡潔・AWSネイティブ・インフラ設計者向け</strong></h2><ul><li>CDKの抽象化機能（.connections, fromGeneratedSecret）を最大限活用</li><li>記述量が少なく、「意図」だけを書くコードスタイル</li><li>インフラ構成に特化し、アプリロジックは最小限</li></ul><hr><h2 id="%E6%B0%97%E3%81%A5%E3%81%8D%E3%83%BB%E5%AD%A6%E3%81%B3"><strong>気づき・学び</strong></h2><h2 id="1-llm-as-a-judge-%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95"><strong>1. LLM-as-a-Judge の難しさ</strong></h2><p>今回、評価自動化のためにLLM-as-a-Judgeを採用しましたが、以下の課題に直面しました。</p><h2 id="%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E8%A8%AD%E8%A8%88%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95"><strong>データセット設計の難しさ</strong></h2><ul><li>「何が正解か」を定義するのが難しい（特にコード品質や完全性）</li><li>タスクが適切に性能を測れる設計になっているか、事前検証が必要</li><li>今回は簡単に5タスクだけだったが、より大規模なベンチマークには数十〜数百のタスクが必要</li></ul><h2 id="llm%E3%81%AE%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9"><strong>LLMのバイアス</strong></h2><ul><li>位置バイアス: 「最初に出てきたコードを優遇する」傾向がある</li><li>長さバイアス: コード行数が多い方を「丁寧」と評価しがち</li></ul><p>今回は、2つの異なるJudge（Gemini / GPT-5.1） を置くことで、単一Judgeの評価観点バイアスを軽減しました。</p><h2 id="2-%E8%A9%95%E4%BE%A1%E8%A6%B3%E7%82%B9%E3%81%AE%E9%81%95%E3%81%84%EF%BC%9Agemini-vs-gpt-51"><strong>2. 評価観点の違い：Gemini vs GPT-5.1</strong></h2><p>同じコードに対して、2つのJudgeは異なる観点で評価していました。</p><ul><li>Gemini 3.0: 「CDKの抽象化をどれだけ使っているか」を重視<br>→ タスク3で Kiro を高く評価</br></li><li>GPT-5.1: 「実運用で使えるか（エラーハンドリング、出力情報、監視）」を重視<br>→ 全タスクで Copilot を高く評価</br></li></ul><p>この違いは、「何をもって良いコードとするか」という価値観の違い を反映しています。</p><h2 id="3-%E3%82%B9%E3%82%B3%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%9F%E8%A3%85%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%A8%E5%AD%A6%E3%81%B3"><strong>3. スコアリング実装の失敗と学び</strong></h2><p>実は当初、Judgeに「総合スコアも計算して出力してほしい」と指示していましたが、</p><ul><li>Gemini 3.0 は重み付けを無視して「素点の合計」を出力</li><li>GPT-5.1 は計算式と理由テキストが矛盾</li></ul><p>という事態が発生しました。</p><p>対策: Judgeには 軸スコアだけ を出力させ、総合スコア計算は自前のスクリプトで実行する方針に切り替えました。</p><p>これは 「LLMに任せすぎると、検証できない数値が混入する」 という重要な教訓です。</p><h2 id="4-kiro-vs-copilot-%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91"><strong>4. Kiro vs Copilot の使い分け</strong></h2><p>今回の検証から、以下の使い分けが見えました。</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup><col width="500"><col width="102"/></col></colgroup><tbody><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">用途</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;vertical-align:top;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">推奨CLI</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">インフラ設計・CDK抽象の活用</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Kiro</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">簡単なアプリ開発・エラーハンドリング重視</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Copilot</span></p></td></tr><tr style="height:30.75pt"><td style="border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">シンプルで保守しやすいコード</span></p></td><td style="border-left:solid #000000 0.75pt;border-right:solid #000000 0.75pt;border-bottom:solid #000000 0.75pt;border-top:solid #000000 0.75pt;vertical-align:middle;padding:6pt 6pt 6pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:2.057148;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:10.5pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Kiro</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>個人的には、より実務レベルの複雑なタスクになると、「指示以上のことを勝手にしてしまう」Copilot よりも、「意図だけを簡潔に表現する」Kiro の方が扱いやすい と感じました。</p><hr><h2 id="%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85"><strong>注意事項</strong></h2><p>本検証結果は、以下の条件下での結果であり、今後変わる可能性があります。</p><ul><li>使用モデル: Claude Sonnet 4.5</li><li>タスク: 比較的シンプルなCDKタスク5問</li><li>評価方法: LLM-as-a-Judge（Gemini 3.0 / GPT-5.1）</li></ul><p>より大規模で実務的なタスク、あるいは異なるモデル・バージョンでは結果が変わる可能性があります。</p><hr><h2 id="%E3%81%BE%E3%81%A8%E3%82%81"><strong>まとめ</strong></h2><p>Kiro CLI と Copilot CLI を、同一モデル（Claude Sonnet 4.5）・同一タスクで比較した結果、</p><ul><li>総合スコアだけでは Copilot がやや優位（特に実務的な完成度で評価）</li><li>Kiro は CDK抽象を活用した簡潔なコードで優位</li><li>用途によって使い分けが重要</li></ul><p>という結論に至りました。</p><p>また、LLM-as-a-Judge を用いた自動評価には多くの課題（データセット設計、バイアス、スコア計算の信頼性）があり、複数Judge + 軸スコア分離 + 自前集計 という設計が重要であることも学びました。</p><p>今後も、AI開発ツールの進化に合わせて、継続的にベンチマークを更新していきたいと思います。</p></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[SlackからAWSの使用状況を確認してみる]]></title><description><![CDATA[POSSEでエンジニアインターンをしている吉川唯音です。本記事では「AWSの料金や利用状況をSlackから簡単に確認する方法」について書いていこうと思います。

こちらの記事で作成したアプリケーションの料金状況について、実際に確認してみます。

NotionデータベースをAIに渡して振り返りをしてみる
POSSEでエンジニアインターンをしている吉川唯音です。普段から「コードレビューでいただいた内容をNotionデータベースに入れて振り返る」ということをしているのですが、より効率的で、面白い振り返りを実現したいと考え、今回のアプリケーションを作成しました。
現状の課題感 1. 振り返りの内容に偏りがある 2. 副産物的な学習が少ない 3. ぱっと振り返れない内容のものがある これらの課題を、Amazon
Bedrockを活用したWebアプリで解決しました。 アプリケーションのイメージ： * ユーザーが振り返りボタンを押す *
Notionデータベースの内容を取得する *…Anti-Pattern Inc. Engineering BlogGhost
[https://tech.anti-]]></description><link>https://tech.anti-pattern.co.jp/yuitoon-aws-slack/</link><guid isPermaLink="false">Ghost__Post__691db0f071fa390001b35012</guid><dc:creator><![CDATA[Yuito.Yoshikawa]]></dc:creator><pubDate>Mon, 01 Dec 2025 09:30:14 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>POSSEでエンジニアインターンをしている吉川唯音です。本記事では「<strong>AWSの料金や利用状況をSlackから簡単に確認する方法</strong>」について書いていこうと思います。</p>
<p>こちらの記事で作成したアプリケーションの料金状況について、実際に確認してみます。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/notion-database-ai-retrospect/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">NotionデータベースをAIに渡して振り返りをしてみる</div><div class="kg-bookmark-description">POSSEでエンジニアインターンをしている吉川唯音です。普段から「コードレビューでいただいた内容をNotionデータベースに入れて振り返る」ということをしているのですが、より効率的で、面白い振り返りを実現したいと考え、今回のアプリケーションを作成しました。 現状の課題感 1. 振り返りの内容に偏りがある 2. 副産物的な学習が少ない 3. ぱっと振り返れない内容のものがある これらの課題を、Amazon Bedrockを活用したWebアプリで解決しました。 アプリケーションのイメージ： * ユーザーが振り返りボタンを押す * Notionデータベースの内容を取得する *…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Ghost</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><p/><p/><h2 id="aws%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B">AWSサービスを利用する</h2><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What is Amazon Q Developer in chat applications? - Amazon Q Developer in chat applications</div><div class="kg-bookmark-description">Use Amazon Q Developer in chat applications to send AWS service notifications to chat channels in Slack, Microsoft Teams, and Amazon Chime.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">Amazon Q Developer in chat applications</span></img></div></div></a></figure><p/><p>こちらのサービスを利用することで、簡単に「<strong>SlackからAmazon Q Developerに質問する仕組み</strong>」をセットアップすることができます。</p><p/><p/><p/><h2 id="%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95">セットアップ方法</h2><p/><p>以下の3ステップで簡単に設定できます。</p><p/><ul><li><strong>クライアントを設定する（Slack連携）</strong></li><li><strong>チャンネル設定を作成する</strong></li><li><strong>AIMロールを設定する</strong></li></ul><p/><p/><h3 id="%E2%91%A0%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">①クライアントを設定する</h3><p/><p>サービスを検索します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.31.28.png" class="kg-image" alt="" loading="lazy" width="1854" height="794" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.31.28.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.31.28.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.31.28.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.31.28.png 1854w" sizes="(min-width: 720px) 720px"/></figure><p/><p/><p>チャットクライアントを<strong>Slack</strong>に設定した後、「<strong>クライアントを設定</strong>」をクリックします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.33.18.png" class="kg-image" alt="" loading="lazy" width="2000" height="911" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.33.18.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.33.18.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.33.18.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.33.18.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><p/><p>以下のページに進むため、Amazon Q Developerを追加したいSlackワークスペースのURLを入力します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.33.54.png" class="kg-image" alt="" loading="lazy" width="2000" height="1132" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.33.54.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.33.54.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.33.54.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.33.54.png 2400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.35.31.png" class="kg-image" alt="" loading="lazy" width="2000" height="1113" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.35.31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.35.31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.35.31.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.35.31.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><p/><p><strong>コンソールにワークスペースが追加され</strong>たら、Slack連携は完了です。Slackにも自動で<strong>アプリ</strong>として追加されます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.36.28.png" class="kg-image" alt="" loading="lazy" width="2000" height="1013" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.36.28.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.36.28.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.36.28.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.36.28.png 2400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-20.08.19.png" class="kg-image" alt="" loading="lazy" width="566" height="458"/></figure><p/><p/><h3 id="%E2%91%A1%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">②チャンネル設定を作成する</h3><p/><p>設定済みのチャンネルの欄から「<strong>新しいチャンネルを設定</strong>」をクリックします。そして設定の名前を入力します。また、Q devを追加したいチャンネルを選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.38.34.png" class="kg-image" alt="" loading="lazy" width="2000" height="917" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.38.34.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.38.34.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.38.34.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.38.34.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><p>下にスクロールして、詳細な許可を設定します。<strong>IAMロール</strong>もこの画面から新規作成します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.40.21.png" class="kg-image" alt="" loading="lazy" width="2000" height="906" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.40.21.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.40.21.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.40.21.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.40.21.png 2400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.40.29.png" class="kg-image" alt="" loading="lazy" width="2000" height="717" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.40.29.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.40.29.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.40.29.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.40.29.png 2400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.40.36-2.png" class="kg-image" alt="" loading="lazy" width="2000" height="932" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.40.36-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.40.36-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.40.36-2.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.40.36-2.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><p/><h3 id="%E2%91%A2iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">③IAMロールを設定する</h3><p/><p>最後に、Q devが料金状況にアクセスできるよう<strong>AIMロールにポリシーをアタッチする</strong>必要があります。IAMロールから、その場で作成したtest-qdevを見つけます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.43.53-3.png" class="kg-image" alt="" loading="lazy" width="2000" height="737" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.43.53-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.43.53-3.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.43.53-3.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.43.53-3.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><p>そしてポリシーをアタッチを選択し、<strong>請求</strong>を追加します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.44.16.png" class="kg-image" alt="" loading="lazy" width="1982" height="744" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.44.16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.44.16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.44.16.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.44.16.png 1982w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-19-19.44.48-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="868" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-19-19.44.48-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-19-19.44.48-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-19-19.44.48-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/----------2025-11-19-19.44.48-1.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p/><h3 id="%E3%81%93%E3%82%8C%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%AF%E5%AE%8C%E4%BA%86%E3%81%A7%E3%81%99%EF%BC%81">これで設定は完了です！</h3><p/><p/><p/><p/><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%ABslack%E3%81%8B%E3%82%89%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">実際にSlackから確認してみる</h2><p/><p/><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.19.57.png" class="kg-image" alt="" loading="lazy" width="1156" height="130" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-28-0.19.57.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-28-0.19.57.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.19.57.png 1156w" sizes="(min-width: 720px) 720px"/></figure><p/><p>Slackで対象のチャンネルにて@Amazon Qを使用すると、コンテンツを元にQ devがAWSの情報を取得・計算を始めます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.20.16.png" class="kg-image" alt="" loading="lazy" width="1186" height="1034" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-28-0.20.16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-28-0.20.16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.20.16.png 1186w" sizes="(min-width: 720px) 720px"/></figure><p/><p>また以下のような詳細なデータが返却されました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.21.10.png" class="kg-image" alt="" loading="lazy" width="1130" height="1052" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-28-0.21.10.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-28-0.21.10.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.21.10.png 1130w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.21.43.png" class="kg-image" alt="" loading="lazy" width="1156" height="432" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-28-0.21.43.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-28-0.21.43.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.21.43.png 1156w" sizes="(min-width: 720px) 720px"/></figure><p/><p>また、マネージメントコンソール上の該当月の金額とも一致していることが確認できました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.25.19.png" class="kg-image" alt="" loading="lazy" width="818" height="636" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-28-0.25.19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-28-0.25.19.png 818w" sizes="(min-width: 720px) 720px"/></figure><p/><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p/><p>今回はSlackからAWSの料金情報を確認してみましたが、権限によっては他のリソースの状況取得や、起動や停止まで行うことができます。そのため、例えば「STGへのデプロイをSlackから指示できる」ように、より<strong>簡単にAWSを操作できる仕組み</strong>を構築できると思います。</p><p/><p>難しいことをシンプルに、面白いサービスだなと感じました！</p><p/><p/><p/>]]></content:encoded></item><item><title><![CDATA[Kiro × Slackで仕様のすり合わせを簡単に]]></title><description><![CDATA[

はじめに
プロダクト開発では、PO・エンジニア・デザイナーなど複数のステークホルダー間で仕様の認識を揃えることが不可欠です。認識が揃っていないまま開発が進むと、手戻りによるスケジュール遅延や、考慮漏れによる品質低下につながります。しかし、多忙なチームではミーティングの頻度を上げることが難しく、週に一度程度しか全員が揃わないケースも珍しくありません。そうした環境では、ミーティング後に仕様の抜け漏れに気づいても、すぐに追加のミーティングを設定できず、Slack
上で補足の議論を行うことになります。

そこで、なるべくミーティング中に仕様の認識を揃えられるよう、Slack のスレッド内で /kiro
コマンドを実行するだけで、スレッドの文脈から構造化された仕様書の叩き台を自動生成できる Bot
を考案しました。本記事では、技術選定や実装の詳細について説明します。

概要
アーキテクチャ
各コンポーネントの役割
1. Slack App
 * /kiro Slash Command を設定し、ALB のエンドポイントへ POST
 * スレッドでコマンドを実行すると Slack が自動で ]]></description><link>https://tech.anti-pattern.co.jp/kiro-x-slackdeshi-yang-nosurihe-wasewojian-dan-ni/</link><guid isPermaLink="false">Ghost__Post__692ccaae71fa390001b355dc</guid><dc:creator><![CDATA[Gaku Inoue]]></dc:creator><pubDate>Mon, 01 Dec 2025 09:29:39 GMT</pubDate><content:encoded><![CDATA[<p/><h1 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h1><p>プロダクト開発では、PO・エンジニア・デザイナーなど複数のステークホルダー間で仕様の認識を揃えることが不可欠です。認識が揃っていないまま開発が進むと、手戻りによるスケジュール遅延や、考慮漏れによる品質低下につながります。しかし、多忙なチームではミーティングの頻度を上げることが難しく、週に一度程度しか全員が揃わないケースも珍しくありません。そうした環境では、ミーティング後に仕様の抜け漏れに気づいても、すぐに追加のミーティングを設定できず、Slack 上で補足の議論を行うことになります。</p><p>そこで、なるべくミーティング中に仕様の認識を揃えられるよう、Slack のスレッド内で <code>/kiro</code>コマンドを実行するだけで、スレッドの文脈から構造化された仕様書の叩き台を自動生成できる Bot を考案しました。本記事では、技術選定や実装の詳細について説明します。</p><h1 id="%E6%A6%82%E8%A6%81">概要</h1><h2 id="%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3">アーキテクチャ</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-15.png" class="kg-image" alt="" loading="lazy" width="2000" height="1005" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-15.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-15.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/image-15.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/11/image-15.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E5%90%84%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%BD%B9%E5%89%B2">各コンポーネントの役割</h2><h3 id="1-slack-app">1. Slack App</h3><ul><li><code>/kiro</code> Slash Command を設定し、ALB のエンドポイントへ POST</li><li>スレッドでコマンドを実行すると Slack が自動で <code>thread_ts</code>を付与</li></ul><h3 id="2-internet-gateway-application-load-balancer"> 2. Internet Gateway + Application Load Balancer</h3><ul><li>Internet Gateway: VPC とインターネット間の通信を可能にする</li><li>ALB: Public Subnet に配置されインターネットからのリクエストを受け付ける</li><li>受信したリクエストを Private Subnet の Fargate タスクへ転送</li></ul><h3 id="3-fargate">3. Fargate</h3><ul><li>Hono + Node.js サーバーを常駐</li><li>Slash Command の処理から Kiro CLI 呼び出し、Slack API への返信までを同期的に実行</li></ul><h3 id="4-amazon-efs">4. Amazon EFS</h3><ul><li><code>/root/.kiro</code> をマウントし、Kiro CLI の認証情報を永続化</li><li>タスク再起動後もログインが不要</li></ul><h3 id="5-nat-gateway">5. NAT Gateway</h3><ul><li>Private Subnet の Fargate から **アウトバウンド通信** を可能にする</li><li>Slack Web API (`conversations.replies`, `chat.postMessage`) へのアクセスに使用</li></ul><h3 id="6-kiro-cli">6. Kiro CLI</h3><ul><li><code>kiro-cli-chat</code> を <code>--no-interactive</code>オプションで起動</li><li>スレッドの文脈 + 追加指示を含むプロンプトを渡して仕様書を生成</li></ul><h3 id="7-slack-web-api">7. Slack Web API</h3><ul><li><code>conversations.replies</code>でスレッドの文脈を取得</li><li>生成された仕様書を <code>chat.postMessage</code>で同じスレッドに返信</li></ul><h1 id="%E5%AE%9F%E8%A3%85">実装</h1><h2 id="slash-command-%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9">Slash Command ハンドラ</h2><pre><code class="language-TypeScript">app.post('/slack/commands', async (req, res) =&gt; {
  const payload = parseSlackPayload(req.body);

  if (!payload.thread_ts) {
    return res.json({
      response_type: 'ephemeral',
      text: 'このコマンドはスレッド内で実行してください'
    });
  }

  // スレッドの文脈を取得
  const slackClient = new WebClient(process.env.SLACK_BOT_TOKEN);
  const messages = await fetchThreadMessages(
    slackClient,
    payload.channel_id,
    payload.thread_ts
  );

  // Kiro CLI 用のプロンプトを構築
  const context = formatThreadContext(messages);
  const prompt = buildSpecificationPrompt(context, payload.text);

  // Kiro CLI で仕様書を生成（同期処理）
  const spec = await generateSpecification(prompt);

  // 同じスレッドに返信
  await slackClient.chat.postMessage({
    channel: payload.channel_id,
    thread_ts: payload.thread_ts,
    text: spec,
    mrkdwn: true,
  });

  // 処理完了後に 200 を返す
  res.json({
    response_type: 'ephemeral',
    text: '仕様書を生成しました'
  });
});</code></pre><ul><li>Fargate 上で常駐するため、Slash Command のレスポンス前に仕様生成まで完了できる</li><li><code>thread_ts</code>が無い場合はエラーを返し、運用ルールとして「スレッドで <code>/kiro</code> を実行する」ことを徹底</li></ul><h2 id="kiro-cli-%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97">Kiro CLI 呼び出し</h2><pre><code class="language-TypeScript">async function generateSpecification(prompt: string): Promise&lt;string&gt; {
  return new Promise((resolve, reject) =&gt; {
    const cli = spawn('/usr/local/bin/kiro-cli-chat', [
      'chat',
      '--no-interactive',
      '--wrap=never',
      prompt,
    ], {
      env: { ...process.env, HOME: '/root' },
    });

    let output = '';
    cli.stdout.on('data', (data) =&gt; {
      output += data.toString();
    });

    cli.on('close', (code) =&gt; {
      if (code === 0) {
        const cleanOutput = stripAnsiCodes(output);
        const spec = extractSpecification(cleanOutput);
        resolve(spec);
      } else {
        reject(new Error(`Kiro CLI failed with code ${code}`));
      }
    });
  });
}</code></pre><ul><li><code>HOME</code>を EFS のマウント先に設定し、認証状態を共有</li><li>CLI からの出力は ANSI コードを削除してから Slack へ投稿</li></ul><h2 id="efs-%E3%81%B8%E3%81%AE%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88">EFS への認証情報マウント</h2><h3 id="cloudformation%E8%A8%AD%E5%AE%9A">CloudFormation設定</h3><pre><code class="language-yaml">MountPoints:
  - SourceVolume: kiro-auth
    ContainerPath: /root/.kiro
    ReadOnly: false

Volumes:
  - Name: kiro-auth
    EFSVolumeConfiguration:
      FilesystemId: !Ref KiroAuthFileSystem
      TransitEncryption: ENABLED
      AuthorizationConfig:
        AccessPointId: !Ref KiroAuthAccessPoint</code></pre><h3 id="%E5%88%9D%E5%9B%9E%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3">初回ログイン</h3><pre><code class="language-bash"># ECS Exec でコンテナに接続
aws ecs execute-command \
  --cluster slack-spec-bot-fargate \
  --task &lt;task-id&gt; \
  --container app \
  --interactive \
  --command "/bin/bash"

# Kiro CLI にログイン
kiro-cli-chat login --use-device-flow</code></pre><p>初回のみ <code>kiro-cli-chat login --use-device-flow</code>を実行すれば、その後は再ログインが不要になります。</p><h1 id="%E3%81%A4%E3%81%BE%E3%81%A5%E3%81%84%E3%81%9F%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">つまづいたポイント</h1><h2 id="bad-file-descriptor%E3%82%A8%E3%83%A9%E3%83%BC-efs-%C3%97-flock">Bad file descriptorエラー: EFS × flock</h2><p>最大のハマりどころは Kiro CLI が設定ファイルを <code>flock</code> しようとして EFS で失敗する点でした。</p><h3 id="%E7%94%A8%E8%AA%9E">用語</h3><ul><li>Bad file descriptor: ファイルの扱い方が間違っているというエラーメッセージ。</li><li>EFS (Amazon Elastic File System): AWS が提供する、ネットワーク経由で使えるファイルストレージ。複数のサーバーから同じファイルにアクセスできる便利なサービス。</li><li>flock（ファイルロック）: 複数のプログラムが同時に同じファイルを書き換えないようにする仕組み。「今このファイルは自分が使っているから、他の人は待ってね」という札を立てるイメージ。</li></ul><h3 id="%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%9F%E3%81%AE%E3%81%8B">何が起きたのか</h3><p>「EBADF error (Bad file descriptor) 」が発生しました。これは、Kiro CLI（コマンドラインツール）が Amazon EFS 上でファイルをロック（占有）しようとした時に起きる問題です。</p><h3 id="%E3%81%AA%E3%81%9C%E8%B5%B7%E3%81%8D%E3%81%9F%E3%81%AE%E3%81%8B">なぜ起きたのか</h3><ul><li>flockはLinuxのファイルロック機能で、BSDロックと呼ばれる方式。プロセスAがflockを呼び、カーネルがファイルにロック済みマークをつけると、プロセスBはプロセスAがファイルを閉じるかロックを解除するまで待たなければならない。この仕組みは<strong>ローカルのカーネル内で完結</strong>する。</li><li>NFS（Network File System) はネットワーク越しにファイルを共有する仕組み。複数のサーバーが同じファイルにアクセスできる。</li></ul><p>Amazon EFS は <strong>NFSv4.1</strong> ベースで、POSIX 的な <code>fcntl</code>ロック（byte-range locks）はサポートしますが、Linux カーネル側での flock() の扱いはローカル FS と同一とは限りません。今回の環境では、ローカルディスク上では問題なく動いていた同じコードが、EFS 上のファイルに対してだけ flock(fd, LOCK_EX) で EBADF を返す挙動になっていました。</p><p>内部実装までは追いきれていませんが、少なくとも「EFS 上の設定ファイルを直接 flock する」前提では Kiro CLI を安定稼働させられない、ということがわかりました。</p><h3 id="%E5%AF%BE%E5%87%A6%E6%B3%95">対処法</h3><p>対処法は「flockを使わないよう CLI を修正する」か「対象ファイルを NFS 以外（tmpfs やローカル）へ移す」のどちらかです。今回は後者を選択し、EFS → <code>/tmp</code>へコピーして CLI を実行しています。</p><p>Node.js サービス内で次のような仕組みを入れ、CLI からは常にローカルファイルシステムを参照させています。</p><pre><code class="language-TypeScript">// 起動時
await initializeKiroHome(); // /root/.kiro → /tmp/kiro-local をコピー
process.env.KIRO_HOME = '/tmp/kiro-local';

// CLI 実行後
await syncKiroHomeToPersistent(); // /tmp → /root/.kiro を再同期</code></pre><p>これで <code>flock</code>の対象が EFS からローカルに変わり、Bad file descriptor が消えました。</p><h1 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%8B%95%E4%BD%9C">実際の動作</h1><p>Slack内での仕様の相談をイメージして実演してみました。</p><h2 id="slack%E3%81%B8%E3%81%AE%E6%8A%95%E7%A8%BF">Slackへの投稿</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/image.png" class="kg-image" alt="" loading="lazy" width="2000" height="248" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/12/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/12/image.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/12/image.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E4%BC%9A%E8%A9%B1">スレッドで会話</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-01-16.37.02.png" class="kg-image" alt="" loading="lazy" width="1332" height="764" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-01-16.37.02.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/12/----------2025-12-01-16.37.02.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-01-16.37.02.png 1332w" sizes="(min-width: 720px) 720px"/></figure><h2 id="kiro%E3%82%92%E5%AE%9F%E8%A1%8C">/kiroを実行</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-01-16.38.47.png" class="kg-image" alt="" loading="lazy" width="1332" height="1082" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/12/----------2025-12-01-16.38.47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/12/----------2025-12-01-16.38.47.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/----------2025-12-01-16.38.47.png 1332w" sizes="(min-width: 720px) 720px"/></figure><h3 id="kiro%E3%81%AB%E3%82%88%E3%82%8B%E4%BB%95%E6%A7%98%E6%9B%B8%E3%81%AE%E5%8F%A9%E3%81%8D%E5%85%A8%E6%96%87">Kiroによる仕様書の叩き全文</h3><pre><code class="language-Markdown"># リアルタイム分析ダッシュボード 仕様書

## 機能概要
スプリント中のチームがKPIをリアルタイムで追跡できる分析ダッシュボードを管理画面に追加します。カード型ウィジェットで主要指標を可視化し、チーム・リージョン・期間でフィルタリング可能。閾値超過時にはSlack通知を送信します。

## ゴール / 非ゴール

### ゴール
- チームメンバーがスプリント中にKPIを一目で把握できる
- 1分以内の遅延でリアルタイムにデータを更新する
- チーム/リージョン/期間の組み合わせでフィルタリングし、検索条件を保存できる
- エラー率などの重要指標が閾値を超えた際に自動でSlack通知を送る
- 将来的に新しいKPIを追加しやすい拡張可能な設計にする

### 非ゴール
- 過去データの詳細分析やレポート出力機能（既存の分析ツールで対応）
- ダッシュボードのカスタマイズ機能（ウィジェットの並び替えや追加/削除）
- リアルタイム通知以外のアラート手段（メール、SMS等）

## ユーザーストーリー
- **As a** プロダクトマネージャー, I want スプリント中のKPIをリアルタイムで確認できる, so that 迅速に意思決定し、問題に早期対応できる
- **As a** 開発チームリーダー, I want 自分のチームだけのデータにフィルタリングできる, so that チーム固有のパフォーマンスを追跡できる
- **As a** βテスター, I want よく使うフィルタ条件を保存できる, so that 毎回同じ条件を入力する手間を省ける
- **As a** オペレーションチーム, I want エラー率が閾値を超えたらSlackで通知を受け取る, so that 即座に障害対応を開始できる

## 画面・フロー

### 画面構成
管理画面
└── Analytics タブ（新規追加）
    ├── フィルタエリア
    │   ├── チーム選択（ドロップダウン）
    │   ├── リージョン選択（ドロップダウン）
    │   ├── 期間選択（日付ピッカー）
    │   └── 保存ボタン / 保存済み条件ロード
    └── KPIカードエリア（グリッドレイアウト）
        ├── DAU カード
        ├── セッション長 カード
        ├── エラー率 カード（閾値超過時バッジ表示）
        └── 完了率 カード

### 操作フロー
1. ユーザーが管理画面の「Analytics」タブをクリック
2. デフォルトで全チーム・全リージョン・直近24時間のKPIが表示される
3. フィルタを変更すると、リアルタイムでカードが更新される
4. 「保存」ボタンでフィルタ条件を保存（ローカルストレージまたはユーザー設定API）
5. 次回訪問時に保存済み条件をロード可能
6. エラー率が閾値を超えると、カードにバッジが表示され、Slack通知が送信される

## API / データモデル

### APIエンドポイント
GET /api/analytics/kpis
  Query params: team_id, region, start_date, end_date
  Response: { dau, avg_session_length, error_rate, completion_rate, last_updated }
GET /api/analytics/filters
  Response: { saved_filters: [...] }
POST /api/analytics/filters
  Body: { name, team_id, region, date_range }
  Response: { filter_id }
WebSocket /ws/analytics
  Subscribe: { team_id, region }
  Push: KPI更新イベント

### データフロー
Kafka イベント → Redis（キャッシュ） → API → WebSocket → フロントエンド（SWR）
                                      ↓
                                  閾値チェック → Slack Webhook

### データモデル（Redis）
Key: analytics:{team_id}:{region}:{date}
Value: {
  dau: number,
  avg_session_length: number,
  error_rate: number,
  completion_rate: number,
  updated_at: timestamp
}

### 設定管理（config）
yaml
thresholds:
  error_rate: 5.0  # パーセント
  completion_rate: 80.0
slack:
  webhook_url: &lt;WEBHOOK_URL&gt;
  channel: "#alerts"

## オープンな論点
1. フィルタ条件の保存先: ユーザー設定をローカルストレージに保存するか、バックエンドのユーザープロファイルAPIで管理するか？複数デバイス間での同期が必要か？
2. KPIの優先順位と初期表示: 4つのKPI（DAU、セッション長、エラー率、完了率）以外に初期リリースで追加すべき指標はあるか？カードの表示順序に優先度はあるか？
3. 閾値の設定権限: エラー率などの閾値は誰が設定・変更できるべきか？管理者のみか、チームリーダーも変更可能にするか？UI上で変更可能にするか、config管理のみか？
4. Slack通知の頻度制御: 同じ閾値超過が継続する場合、通知を何分おきに送るか？通知の重複を防ぐクールダウン期間は必要か？
5. リージョンとチームの定義: 「リージョン」と「チーム」の具体的な値はどこから取得するか？既存のユーザー管理システムやプロジェクト管理ツールと連携するか、新規にマスタデータを作成するか？</code></pre><h1 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h1><p>今回は、Slack と Kiro を組み合わせ、Slack のスレッド内で <code>/kiro</code> コマンドを実行するだけで、そのスレッドの文脈から構造化された仕様書の叩き台を自動生成できる Bot を設計しました。<br>この仕組みにより、Slack 上の議論から即座に仕様化へ移行できる体験を実現できました。<br>一方で、Kiro を継続的に利用するためには Fargate・ALB・EFS・NAT Gateway などの常駐インフラが必要となり、運用コストが高くなる点が懸念として残ります。今後は、より軽量かつ低コストで運用できるアーキテクチャ（API Key ベースの認証提供や、Lambda での実行が可能になる構成）を検討していきたいと思います。</br></br></p>]]></content:encoded></item><item><title><![CDATA[Kiro CLI は Web 検索が使えます]]></title><description><![CDATA[どうも、ryudaiです！kiro-cli、使ってますか？

わたしはAmazon Q Developerの頃から使っていたのですが、あるとき突然こんなお知らせが。

q updateを打つと、Kiroちゃんに進化し、大変可愛くなりました！qでもkiro-cliでも認識するようです。

Kiro CLIはAmazon Q Developerの機能を引き継いでおり、従来通り様々な用途で使えることでしょう。

AWSアカウント上での作業を任せたり、Webアプリを開発したり、日常の質問をしたり…

そんな中、私が個人的に嬉しかったアップデートは、Web検索機能の追加でした。

Web検索機能なかったっけ？
そうなんです、実はAmazon Q Developer時代には、Web検索機能が標準で搭載されていませんでした。

素の実力が高いということなのか、AWS CLIの操作などは自力で頑張ってくれるものの、以下のようなときに歯痒い思いをしていました。

 * 最近リリースされたサービスについて調べて欲しいとき
 * インストールしたいライブラリなどの最新バージョンを知りたい時
 * エラー文に]]></description><link>https://tech.anti-pattern.co.jp/kiro-cli-web-search/</link><guid isPermaLink="false">Ghost__Post__692c1b4271fa390001b355b9</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Mon, 01 Dec 2025 09:29:14 GMT</pubDate><content:encoded><![CDATA[<p>どうも、ryudaiです！<code>kiro-cli</code>、使ってますか？</p><p>わたしはAmazon Q Developerの頃から使っていたのですが、あるとき突然こんなお知らせが。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/---------_2025-11-18_22.59.11.png" class="kg-image" alt="" loading="lazy" width="1146" height="328" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/---------_2025-11-18_22.59.11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/---------_2025-11-18_22.59.11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/---------_2025-11-18_22.59.11.png 1146w" sizes="(min-width: 720px) 720px"/></figure><p><code>q update</code>を打つと、Kiroちゃんに進化し、大変可愛くなりました！<code>q</code>でも<code>kiro-cli</code>でも認識するようです。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/---------_2025-11-18_23.01.06.png" class="kg-image" alt="" loading="lazy" width="1160" height="600" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/---------_2025-11-18_23.01.06.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/---------_2025-11-18_23.01.06.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/---------_2025-11-18_23.01.06.png 1160w" sizes="(min-width: 720px) 720px"/></figure><p>Kiro CLIはAmazon Q Developerの機能を引き継いでおり、従来通り様々な用途で使えることでしょう。</p><p>AWSアカウント上での作業を任せたり、Webアプリを開発したり、日常の質問をしたり…</p><p>そんな中、私が個人的に嬉しかったアップデートは、<strong>Web検索機能の追加</strong>でした。</p><h2 id="web%E6%A4%9C%E7%B4%A2%E6%A9%9F%E8%83%BD%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A3%E3%81%91%EF%BC%9F">Web検索機能なかったっけ？</h2><p>そうなんです、実はAmazon Q Developer時代には、Web検索機能が標準で搭載されていませんでした。</p><p>素の実力が高いということなのか、AWS CLIの操作などは自力で頑張ってくれるものの、以下のようなときに歯痒い思いをしていました。</p><ul><li>最近リリースされたサービスについて調べて欲しいとき</li><li>インストールしたいライブラリなどの最新バージョンを知りたい時</li><li>エラー文に参考のリンクが含まれており、そこに解決策が書かれているとき</li></ul><p>ちょっとしたことなのですが、そのためにMCPサーバーを立てたりするのは面倒だなーと正直思っていました。</p><h2 id="web%E6%A4%9C%E7%B4%A2-powered-kiro-cli">Web検索 Powered Kiro CLI</h2><p><code>kiro-cli</code> に、以下のように聞いてみます。</p><blockquote>最近発表されたAWSのアップデートで気になるものをピックアップしてください。</blockquote><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-08-06.png" class="kg-image" alt="" loading="lazy" width="1370" height="614" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-30-19-08-06.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/2025-11-30-19-08-06.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-08-06.png 1370w" sizes="(min-width: 720px) 720px"/></figure><p>そうすると、以下のように返してきてくれます。</p><pre><code class="language-md">最近のAWSアップデートで注目すべきものをピックアップしました：

Lambda関連の大型アップデート（11月中旬）
- **Rust言語の正式サポート** - Lambda関数でRustが一般提供開始。ランタイムインターフェースクライ
アントがバージョン1.0.0に昇格
- **Java 25のサポート** - Lambda関数の効率性が向上
- **Swift用の実験的ランタイムインターフェースクライアント** - Swiftでのサーバーレス開発が可能に
- **SQSイベントソースマッピングのProvisioned Mode** - トラフィックスパイクへの対応とスループット
最適化が可能に

セキュリティ・アクセス管理
- **S3バケット向けABAC（属性ベースアクセス制御）** - タグベースのポリシーで権限を自動管理。IAMポ
リシーの頻繁な更新が不要に
- **IAM Outbound Identity Federation** - 外部サービスへの認証に短期間のJWTを使用可能。APIキーや
パスワードの保存が不要に
- **VPC暗号化コントロール** - VPC内およびVPC間のトラフィック暗号化を監査・強制可能に

インフラ・ネットワーク
- **Route 53 Accelerated Recovery** - バージニア北部リージョンでの障害時に60分のRTOを提供。重要
なDNS変更が継続可能
- **Network Load BalancerがQUICプロトコルをサポート** - モバイルアプリケーションのレイテンシを25
-30%削減
- **Application Load BalancerがJWT検証をサポート** - マシン間通信のセキュリティ実装が簡素化

開発者ツール
- **Kiro（AIコーディングツール）が一般提供開始** - プロパティベーステスト、チェックポイント機能
、Kiro CLI、エンタープライズチームプランを追加
- **Step Functionsのローカルテスト機能強化** - モック対応、個別ステートテスト、AWSデプロイ不要で
のテストが可能に
- **Amazon ECS Express Mode** - 単一コマンドでコンテナアプリケーションのデプロイを自動化

その他
- **Amazon DCV for EC2 Mac** - 4K解像度・60FPSでのリモートデスクトップアクセス
- **Amazon Linux 2023の最新版** - Mountpoint for S3、Swift 6.2.1、Node.js 24を含む
- **EventBridge拡張ビジュアルルールビルダー** - イベント駆動アプリケーション開発を簡素化
</code></pre><p>いいですね、実際に最近あったニュースが並んでいます。<br>re:Inventが始まって沢山ニュースが出るとまとめるのも大変なので、Kiro CLIに今日のまとめをしてもらうのもいいかもしれないですね！</br></p><p>ところで私はAWS LambdaとRustが大好きです。ということで、Kiro CLIに作ってもらいましょう。</p><blockquote>Lambda関数をRustで作成したいです。最新の実装方法を調べ、デプロイまで行ってください。</blockquote><p>ここが筆者激推しポイントなのですが、今までは最新の実装方法やライブラリのバージョンは、人間が調べるか他のAIサービスで検索して渡していたところを、Kiro CLIで完結できるのがかなり楽です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-18-41.png" class="kg-image" alt="" loading="lazy" width="1156" height="550" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-30-19-18-41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/2025-11-30-19-18-41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-18-41.png 1156w" sizes="(min-width: 720px) 720px"/></figure><p>ものの3分後、Kiro CLIはこのように告げて実装を終えました。</p><pre><code class="language-md">## デプロイについて

AWS認証情報が設定されていないため、実際のデプロイは実行できませんでしたが、以下のコマンドでデプ
ロイ可能です：

bash
cd rust-hello
cargo lambda deploy
</code></pre><p>実際に<code>cargo lambda deploy</code>を実行すると、以下のように無事Lambda関数が作成されています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-17-50-1.png" class="kg-image" alt="" loading="lazy" width="1334" height="600" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-30-19-17-50-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/2025-11-30-19-17-50-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-17-50-1.png 1334w" sizes="(min-width: 720px) 720px"/></figure><p>また、試しに関数URLを作成してブラウザで確認したところ、正しくレスポンスを返すことができました。素晴らしい！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-19-21.png" class="kg-image" alt="" loading="lazy" width="838" height="74" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-30-19-19-21.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-30-19-19-21.png 838w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E6%84%9F%E6%83%B3">感想</h2><p>今までは、「堅実なAmazon Q Developer」というイメージでいました。</p><p>これからは、「新しいことでも壁打ちしながら実現できる、秘書的なKiro CLI」みたいなイメージでしょうか。</p><p>Web検索という1つの話で膨らませすぎましたが、鮮度の高いコンテキストを渡せることのインパクトは小さくないなーと思いました。</p>]]></content:encoded></item><item><title><![CDATA[Kiro CLI (旧Amazon Q Developer CLI)を実運用で使う方法]]></title><description><![CDATA[

今回はKiro CLIを使ってみてとても感動したので、ユースケースと一緒にKiro CLIの良さを紹介していきたいと思います。

Kiro CLI (旧Amazon Q Developer CLI)とは

コマンドラインベースのAIエージェントツールです。似たものとしてはGemini CLI, Claude Code,
Codexがあります。特徴としてはシームレスな認証ができることやAWS関連の情報がMCPを設定しなくても分かってくれることです。

Kiro CLI の紹介：Kiro エージェントをあなたのターミナルへ | Amazon Web Services深夜 2
時、本番サーバーに接続してバグをデバッグしています。この一週間、IDEでAIエージェントを使って効率よく開発を進めてきたあなたなら、こんな時こそAIの力を借りたいと思うでしょう。しかし、コンテキストを切り替えるとすると、ターミナルセッションが切れ、SSH
接続も失われ、作業の流れが途切れてしまいます。結局、手動でログを確認し、構文を検索して、一人で格闘することになります。AI が使える IDE
で作業するか、実用的]]></description><link>https://tech.anti-pattern.co.jp/amazon-q-developerwo/</link><guid isPermaLink="false">Ghost__Post__6910b38a71fa390001b34eef</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Sun, 30 Nov 2025 05:12:33 GMT</pubDate><content:encoded><![CDATA[<p/><p>今回はKiro CLIを使ってみてとても感動したので、ユースケースと一緒にKiro CLIの良さを紹介していきたいと思います。</p><p>Kiro CLI (旧Amazon Q Developer CLI)とは</p><p>コマンドラインベースのAIエージェントツールです。似たものとしてはGemini CLI, Claude Code, Codexがあります。特徴としてはシームレスな認証ができることやAWS関連の情報がMCPを設定しなくても分かってくれることです。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/blogs/news/introducing-kiro-cli/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Kiro CLI の紹介：Kiro エージェントをあなたのターミナルへ | Amazon Web Services</div><div class="kg-bookmark-description">深夜 2 時、本番サーバーに接続してバグをデバッグしています。この一週間、IDEでAIエージェントを使って効率よく開発を進めてきたあなたなら、こんな時こそAIの力を借りたいと思うでしょう。しかし、コンテキストを切り替えるとすると、ターミナルセッションが切れ、SSH 接続も失われ、作業の流れが途切れてしまいます。結局、手動でログを確認し、構文を検索して、一人で格闘することになります。AI が使える IDE で作業するか、実用的だけれど AI サポートのないターミナルで作業するか。本来なら、こんな選択を迫られる必要はないはずです。今回、私たちはそのギャップを解決しました。Kiro CLI なら、A…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/main/images/site/touch-icon-ipad-144-smile.png"><span class="kg-bookmark-author">Amazon Web Services</span><span class="kg-bookmark-publisher">稲田大陸</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://d2908q01vomqb2.cloudfront.net/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f/2025/11/17/kBP3tFk5.jpeg"/></div></a></figure><p>Kiro CLI (旧Amazon Q Developer CLI)の権限は？</p><p>個人的にKiro CLIの一番使いやすい点が権限設定だと思っています。Kiro CLIの権限はAWS CLIを使う時と変わらず使用することができます。</p><!--kg-card-begin: markdown--><ol>
<li>環境変数から取得</li>
<li>AWS IAM Identity Centerでの認証</li>
</ol>
<!--kg-card-end: markdown--><h3 id="%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97">環境変数から取得</h3><p>ターミナルでAWS認証情報を環境変数にexportした後、kiro-cliでログインをしてAWS認証情報を聞いてみました。この認証情報はexportした認証情報と同じになりました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.20.19.png" class="kg-image" alt="" loading="lazy" width="1624" height="490" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-29-17.20.19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-29-17.20.19.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-29-17.20.19.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.20.19.png 1624w" sizes="(min-width: 720px) 720px"/></figure><p>Kiro CLIもAWS CLIと同じく <code>環境変数 &gt; aws configureのデフォルト設定</code> の順番で認証情報を探してくれます。</p><p>また、Kiro CLIとのチャット中に認証情報を変えてもらうことも可能です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.28.54.png" class="kg-image" alt="" loading="lazy" width="2000" height="577" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-29-17.28.54.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-29-17.28.54.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-29-17.28.54.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.28.54.png 2010w" sizes="(min-width: 720px) 720px"/></figure><h3 id="aws-iam-identity-center%E3%81%A7%E3%81%AE%E8%AA%8D%E8%A8%BC">AWS IAM Identity Centerでの認証</h3><p>チャットで以下のようにお願いしてみます。</p><pre><code>&lt;AWSアカウントID&gt;のAWSアカウントの認証情報を取得してください</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.40.20.png" class="kg-image" alt="" loading="lazy" width="1722" height="1370" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-29-17.40.20.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-29-17.40.20.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-29-17.40.20.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-29-17.40.20.png 1722w" sizes="(min-width: 720px) 720px"/></figure><p>いつも通り、aws sso loginでログイン画面で認証をすることで認証情報を取得することができました。次は具体的なユースケースをいくつか紹介したいと思います。</p><h2 id="%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B91%EF%BC%9Acodebuild%E3%81%AE%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%82%82%E3%82%89%E3%81%86">ユースケース1：Codebuildの実行結果をレポートしてもらう</h2><p>簡略した実行結果は以下です。</p><pre><code class="language-Terminal">&gt; 今日codebuildで失敗したbuildのテナントIDを環境変数から確認して教えて

...

今日失敗したCodebuidのテナントIDは以下の2つです：
1. xxxxxxxxxxxx
2. yyyyyyyyyyyy</code></pre><p>実際にはcodebuildの対象プロジェクトを確認して、以下のようなコマンドを実行してまとめてくれています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.17.05-3.png" class="kg-image" alt="" loading="lazy" width="2000" height="165" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-10-22.17.05-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-10-22.17.05-3.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-10-22.17.05-3.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.17.05-3.png 2056w" sizes="(min-width: 720px) 720px"/></figure><p>統計データも出してくれます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.44.26.png" class="kg-image" alt="" loading="lazy" width="1078" height="46" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-10-22.44.26.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-10-22.44.26.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.44.26.png 1078w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.43.53.png" class="kg-image" alt="" loading="lazy" width="666" height="172" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-10-22.43.53.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-22.43.53.png 666w"/></figure><h2 id="%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B92%EF%BC%9Alambda%E3%81%AE%E4%BF%AE%E6%AD%A3">ユースケース2：Lambdaの修正</h2><p>Cloudwatchのログ確認、コード修正、CDKのデプロイまでをまとめて実行してくれます。profileを設定する場合やコンテキストの注入も問題なくやってくれました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-23.13.54-3.png" class="kg-image" alt="" loading="lazy" width="1216" height="524" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-10-23.13.54-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-10-23.13.54-3.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-23.13.54-3.png 1216w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B93-aws%E3%81%8B%E3%82%89%E3%81%AEaction-required%E3%81%AE%E5%AF%BE%E5%BF%9C%E8%AA%BF%E6%9F%BB">ユースケース3: AWSからのAction Requiredの対応調査</h2><p>AWSから定期的にくる <code><em>[Action Required]</em></code><em> </em>([要対応])メールの対応調査をする際にも非常に役に立ちました。特にlambdaのruntimeバージョンアップなどはcdkのソースコード上では全量把握できず、aws cliやコンソールから確認する必要がありましたが、Kiro CLIではまとめて行ってくれます。また、CDKによって自動で作ってくれるlambdaのruntimeバージョンアップもcdkのバージョンを確認して行ってくれます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-12.36.04.png" class="kg-image" alt="" loading="lazy" width="1876" height="390" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/----------2025-11-10-12.36.04.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/----------2025-11-10-12.36.04.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/----------2025-11-10-12.36.04.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/----------2025-11-10-12.36.04.png 1876w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回紹介したユースケースは全て開発環境で行っているものですが、権限さえ適切にKiro CLIに渡してあげれば他の環境でも利用できると思います。CLI上からAWSの環境が非常に簡単に確認できる体験は開発や運用の負荷を劇的に改善するものになるので、ぜひ使ってみてください！</p>]]></content:encoded></item><item><title><![CDATA[チューリングマシン入門 〜Rustでつくる「2進数加算器」〜]]></title><description><![CDATA[どうも、ryudaiです！

みなさんはチューリングマシンというのを聞いたことがありますか？

文脈によって「チューリング完全」などでチューリングさんのお名前を見聞きすることはあれど、チューリングマシンの実態は掴めていませんでした。

今回「任意の2進数に1を足すチューリングマシンを再現する」という課題をもらったので、それを解きながら理解を深めていこうと思います！言語は何でも良いですが、今回は訓練中のRustにします。

「チューリングマシンを再現する」とは
まずは課題のレギュレーションを把握したいところです。

「2進数に1を足すプログラム」は簡単ですが、それをチューリングマシンとして実装すると…？となります。

調べてみると、チューリングマシンは

 * 無限の長さを持つ「テープ」がある
 * テープに文字を読み書きできる「ヘッド」が存在する
 * ヘッドは左右に動き、テープの文字を1文字ずつスキャンできる
 * マシンは、事前に定義された有限個の状態を持つことができる
 * ヘッドがスキャンした文字と現在のマシンの状態の組み合わせによって、移動方向や書き込む文字を条件分岐できる
]]></description><link>https://tech.anti-pattern.co.jp/turing-machine-rust/</link><guid isPermaLink="false">Ghost__Post__692b737171fa390001b35590</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Sat, 29 Nov 2025 23:46:41 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/image-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/12/image-1.png" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜"/><p>どうも、ryudaiです！</p><p>みなさんはチューリングマシンというのを聞いたことがありますか？</p><p>文脈によって「チューリング完全」などでチューリングさんのお名前を見聞きすることはあれど、チューリングマシンの実態は掴めていませんでした。</p><p>今回「任意の2進数に1を足すチューリングマシンを再現する」という課題をもらったので、それを解きながら理解を深めていこうと思います！言語は何でも良いですが、今回は訓練中のRustにします。</p><h2 id="%E3%80%8C%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B%E3%80%8D%E3%81%A8%E3%81%AF">「チューリングマシンを再現する」とは</h2><p>まずは課題のレギュレーションを把握したいところです。</p><p>「2進数に1を足すプログラム」は簡単ですが、それをチューリングマシンとして実装すると…？となります。</p><p>調べてみると、チューリングマシンは</p><ul><li>無限の長さを持つ「<strong>テープ</strong>」がある</li><li>テープに文字を読み書きできる「<strong>ヘッド</strong>」が存在する</li><li>ヘッドは左右に動き、テープの文字を1文字ずつスキャンできる</li><li>マシンは、事前に定義された有限個の<strong>状態</strong>を持つことができる</li><li>ヘッドがスキャンした文字と現在のマシンの状態の組み合わせによって、移動方向や書き込む文字を条件分岐できる</li></ul><p>というようなことでした(※正確な定義ではないですが、簡単のため)。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-21-22-27.png" class="kg-image" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜" loading="lazy" width="1670" height="716" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-29-21-22-27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/2025-11-29-21-22-27.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/2025-11-29-21-22-27.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-21-22-27.png 1670w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/images/2025-11-29-21-22-27.png" class="kg-image" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜" loading="lazy"/></figure><h2 id="2%E9%80%B2%E6%95%B0%E3%81%AB1%E3%82%92%E8%B6%B3%E3%81%99%E3%81%AB%E3%81%AF">2進数に1を足すには</h2><p>次はこれをRustで再現するには…という話になるのですが、私は以下の変数を用意することにしました。</p><ul><li><strong>tape</strong>: テープに書かれた文字を保持する (char型のVec)</li><li><strong>index</strong>: 現在のヘッドの位置を表す (usize)</li><li><strong>state</strong>: 現在のマシンの状態を表す (enum Stateを用意して使う)</li></ul><p>実装の大雑把な理解はこうです。</p><p>まず、tapeの初期値として、任意の2進数を書き込んでおきます (例: <code>10101</code>)。</p><p>初期状態では、ヘッドはこの2進数の一番右まで移動します。</p><p>次に足し算のフェーズです。ヘッドがスキャンした数が0だったら1を書き込んで実行終了。スキャンした数が1だったら繰り上がりでヘッドは左に進む。</p><p>この単純な作業を反復すればうまくいきそうです。実際にコードを書いていきます。</p><h2 id="%E6%AD%A6%E5%99%A8%E3%82%92%E6%8F%83%E3%81%88%E3%82%8B">武器を揃える</h2><p>まず大元の<code>Machine</code>という構造体を用意しました。チューリングマシン全体をイメージしています。</p><pre><code class="language-rust">struct Machine {
    tape: Vec&lt;char&gt;,
    state: State,
    index: usize,
}
</code></pre><p>状態は以下の4つとしました。<br>Printは、最後に結果を表示するためだけの状態なので、必要ないかもしれません。</br></p><pre><code class="language-rust">enum State {
    Init,
    Add,
    End,
    Print,
}
</code></pre><p>この<code>Machine</code>に対していろんなメソッドをimpl(実装)していきます。</p><p>左右に動くメソッド:</p><pre><code class="language-rust">fn move_right(&amp;mut self) {
    self.index += 1;
}

fn move_left(&amp;mut self) {
    self.index -= 1;
}
</code></pre><p>文字を書き込むメソッド:</p><pre><code class="language-rust">fn write_char(&amp;mut self, char: char) {
    self.tape[self.index] = char;
}
</code></pre><p>状態を変更するメソッド:</p><pre><code class="language-rust">fn change_state(&amp;mut self, state: State) {
    self.state = state;
}
</code></pre><h2 id="%E3%82%B3%E3%82%A2%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AE%E5%AE%9F%E8%A3%85">コアロジックの実装</h2><p>問題はこの先、状態による条件分岐です。Rustでは<code>match</code>式を使うと便利に書けそうなところです。</p><p>今回は<code>run</code>というメソッドを用意し、実装していきます。</p><pre><code class="language-rust">fn run(&amp;mut self) {
    let char = self.tape[self.index];
    match self.state {
        State::Add =&gt; match char {
            '1' =&gt; {
                self.write_char('0');
                self.move_left();
            }
            '0' | 'B' | _ =&gt; {
                self.write_char('1');
                self.change_state(State::End);
            }
        },
        _ =&gt; todo!(),
    }
    self.run();
}
</code></pre><p>上は、状態が<code>Add</code>のときの実装です。</p><ul><li>もし読み取った数値が1だったら、(繰り上がりなので)0を書き込み左に進む</li><li>0もしくは<code>B</code>(ブランク/空白)の場合、1を書き込み、繰り上がりはないので終了</li></ul><p>突然<code>B</code>が出てきてびっくりしますが、チューリングマシンでは無限に続くテープを想定するため、2進数の外側はブランクとして定義しています。今回の場合、繰り上がりを続けて<strong>桁が1つ増えた時に限り</strong>、ブランクに書き込むことになります。</p><p>実装上無限にブランクを用意するのは大変だったので、<code>Machine</code>を<code>new</code>するときに2進数を受け取り、その左右に2つずつブランクをくっつけるようにしています。</p><pre><code class="language-rust">fn new(num: &amp;str) -&gt; Self {
    Self {
        tape: format!("BB{num}BB").chars().collect(),
        state: State::Init,
        index: 2,
    }
}
</code></pre><p><code>index: 2</code>の部分は、初期状態(Init)の実装の都合で恣意的に決めています。「ヘッドを2進数の一番左の文字にセットしてから始める」という意味合いになりますが、他にうまいやり方はありそうです。</p><p>そんなこんなで、他の状態も作成したら完成です。コード全体は最後に載せたので興味のある方はそちらを！</p><h2 id="%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">実行してみる</h2><p>まず、<code>100</code>で実行してみます。</p><pre><code class="language-rust">fn main() {
    let mut machine = Machine::new("100");
    machine.run();
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-20-57-02.png" class="kg-image" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜" loading="lazy" width="366" height="84"/></figure><p>1桁目が1になり、<code>101</code>と返ってきました。</p><p>では繰り上がりの場合はどうでしょうか？以下のように、<code>11111</code>で始めてみます。</p><pre><code class="language-rust">fn main() {
    let mut machine = Machine::new("11111");
    machine.run();
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-20-57-46.png" class="kg-image" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜" loading="lazy" width="366" height="86"/></figure><p>正しく、<code>100000</code>が返ってきました！</p><h2 id="%E6%84%9F%E6%83%B3">感想</h2><p>今回チューリングマシンを再現する中で、「数字を足す」という概念を「有限個の状態の条件分岐によって、数字を書き換える操作」と捉え直すことができました。</p><p>この状態数を増やしていけば、たしかに0と1でなんでも表現できそうな気がしてきます。</p><p>今回扱った状態とその条件分岐を表にするとこうなります。ソースコードと照らし合わせて見てみてください。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-21-01-52.png" class="kg-image" alt="チューリングマシン入門 〜Rustでつくる「2進数加算器」〜" loading="lazy" width="1036" height="790" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/2025-11-29-21-01-52.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/2025-11-29-21-01-52.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/2025-11-29-21-01-52.png 1036w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%82%B3%E3%83%BC%E3%83%89%E5%85%A8%E4%BD%93">コード全体</h2><p>以下が今回書いたコード全体です。</p><pre><code class="language-rust">#[derive(Debug, PartialEq)]
enum State {
    Init,
    Add,
    End,
    Print,
}

#[derive(Debug)]
struct Machine {
    tape: Vec&lt;char&gt;,
    state: State,
    index: usize,
}

impl Machine {
    fn new(num: &amp;str) -&gt; Self {
        Self {
            tape: format!("BB{num}BB").chars().collect(),
            state: State::Init,
            index: 2,
        }
    }

    fn move_right(&amp;mut self) {
        self.index += 1;
    }

    fn move_left(&amp;mut self) {
        self.index -= 1;
    }

    fn write_char(&amp;mut self, char: char) {
        self.tape[self.index] = char;
    }

    fn change_state(&amp;mut self, state: State) {
        self.state = state;
    }

    fn run(&amp;mut self) {
        let char = self.tape[self.index];
        match self.state {
            State::Init =&gt; {
                if char == 'B' {
                    self.move_left();
                    self.change_state(State::Add);
                } else {
                    self.move_right();
                }
            }
            State::Add =&gt; match char {
                '1' =&gt; {
                    self.write_char('0');
                    self.move_left();
                }
                '0' | 'B' | _ =&gt; {
                    self.write_char('1');
                    self.change_state(State::End);
                }
            },
            State::End =&gt; {
                if char == 'B' {
                    self.move_right();
                    self.change_state(State::Print);
                } else {
                    self.move_left();
                }
            }
            State::Print =&gt; {
                if char == 'B' {
                    return;
                } else {
                    print!("{}", char);
                    self.move_right();
                }
            }
        }
        self.run();
    }
}

fn main() {
    let mut machine = Machine::new("11111");
    machine.run();
}
</code></pre>]]></content:encoded></item><item><title><![CDATA[生成AIでE2Eテスト自動生成に挑戦した話]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。
弊社の開発チームでは、生成AIを積極的に活用しています。開発ツールとしてVSCodeを使用しており、開発時はRoo CodeやGitHub
Copilotを活用しています。

Roo
CodeはVSCode上で動作するAIコーディングアシスタントで、コード生成やリファクタリング、テストコードの自動生成などを支援してくれるツールです。今回は、このRoo
Codeを使ってE2Eテストを自動生成する検証を行った際の経験を共有します。

トークン上限エラーとの遭遇
今回、E2Eテストを生成するために、oapi-codegenで生成した以下のファイルをRoo Codeに読み込ませました

 * client.gen.go: 15,475行
 * types.gen.go: 1,345行

テスト対象となるメソッドは160以上。これらすべてに対してE2Eテストを自動生成しようとしたところ、プロンプトのトークン数がmax値を超えてエラーが発生してしまいました。読み込ませるファイルが大きすぎたのです。

解決策:AIにAI用のツールを作ってもらう
そこ]]></description><link>https://tech.anti-pattern.co.jp/sheng-cheng-aidee2etesutozi-dong-sheng-cheng-nitiao-zhan-sitahua/</link><guid isPermaLink="false">Ghost__Post__6919cc5871fa390001b34f6d</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 17 Nov 2025 15:01:13 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、Anti-Patternの塚本です。<br>
弊社の開発チームでは、生成AIを積極的に活用しています。開発ツールとしてVSCodeを使用しており、開発時はRoo CodeやGitHub Copilotを活用しています。</br></p>
<p>Roo CodeはVSCode上で動作するAIコーディングアシスタントで、コード生成やリファクタリング、テストコードの自動生成などを支援してくれるツールです。今回は、このRoo Codeを使ってE2Eテストを自動生成する検証を行った際の経験を共有します。</p>
<h2 id="%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E4%B8%8A%E9%99%90%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E3%81%AE%E9%81%AD%E9%81%87">トークン上限エラーとの遭遇</h2>
<p>今回、E2Eテストを生成するために、oapi-codegenで生成した以下のファイルをRoo Codeに読み込ませました</p>
<ul>
<li><code>client.gen.go</code>: 15,475行</li>
<li><code>types.gen.go</code>: 1,345行</li>
</ul>
<p>テスト対象となるメソッドは160以上。これらすべてに対してE2Eテストを自動生成しようとしたところ、プロンプトのトークン数がmax値を超えてエラーが発生してしまいました。読み込ませるファイルが大きすぎたのです。</p>
<h2 id="%E8%A7%A3%E6%B1%BA%E7%AD%96ai%E3%81%ABai%E7%94%A8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%82%82%E3%82%89%E3%81%86">解決策:AIにAI用のツールを作ってもらう</h2>
<p>そこで、読み込ませるファイルを適切に分割するシェルスクリプトを、生成AI自身に作ってもらうことにしました。</p>
<p>私が投げたプロンプトは、シンプルにこれだけです</p>
<blockquote>
<p>意味ある単位で分割するシェルを作ってください</p>
</blockquote>
<p>かなり曖昧な指示でしたが、生成AIはしっかりとしたシェルスクリプトを作成してくれました。何度か修正を重ねる必要はありましたが、最終的に期待通りの動作をするツールが完成しました。</p>
<h3 id="%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88">生成されたシェルスクリプト</h3>
<p>生成AIが作成してくれたシェルスクリプトは以下のような仕組みになっています</p>
<ul>
<li>特定のパターン(構造体定義、インターフェース定義、関数定義など)を検出</li>
<li>各セクションの開始行を特定</li>
<li>意味のある単位でファイルを分割</li>
</ul>
<pre><code class="language-bash">#!/bin/bash

# 使用法: ./split_client_gen.sh &lt;入力ファイル.go&gt;

input_file=&quot;$1&quot;
output_dir=&quot;client_gen_split_output&quot;

# パターン定義
P_CLIENT_STRUCT_START='^type Client struct'
P_CLIENT_INTERFACE_START='^type ClientInterface interface'
P_CLIENT_METHODS_START='^func \(c \*Client\) GetAuthInfo\('
P_REQUEST_BUILDERS_START='^func NewGetAuthInfoRequest\('
P_APPLY_EDITORS_START='^func \(c \*Client\) applyEditors\('
P_CLIENT_WITH_RESPONSES_STRUCT_START='^type ClientWithResponses struct'
P_CLIENT_WITH_RESPONSES_INTERFACE_START='^type ClientWithResponsesInterface interface'
P_CLIENT_WITH_RESPONSES_METHODS_START='^func \(c \*ClientWithResponses\) GetAuthInfoWithResponse\('
P_RESPONSE_STRUCTS_START='^type GetAuthInfoResponse struct'
P_PARSE_FUNCTIONS_START='^func ParseGetAuthInfoResponse\('

# 各セクションの行番号を検出し、チャンクに分割
# ... (詳細は省略)
</code></pre>
<p>完全なスクリプトは記事末尾に掲載しています。</p>
<h3 id="%E5%88%86%E5%89%B2%E7%B5%90%E6%9E%9C">分割結果</h3>
<p>シェルスクリプトは、<code>client.gen.go</code>を意味のある単位で以下の11ファイルに分割してくれました</p>
<ol>
<li><code>01_preamble.go</code> - パッケージ宣言とインポート</li>
<li><code>02_client_definition.go</code> - Clientの構造体定義</li>
<li><code>03_client_interface.go</code> - Clientのインターフェース定義</li>
<li><code>04_client_methods.go</code> - Clientのメソッド実装</li>
<li><code>05_request_builders.go</code> - リクエストビルダー関数群</li>
<li><code>06_apply_editors.go</code> - エディター適用関数</li>
<li><code>07_client_with_responses_definition.go</code> - ClientWithResponsesの構造体定義</li>
<li><code>08_client_with_responses_interface.go</code> - ClientWithResponsesのインターフェース定義</li>
<li><code>09_response_structs.go</code> - レスポンス構造体群</li>
<li><code>10_client_with_responses_methods.go</code> - ClientWithResponsesのメソッド実装</li>
<li><code>11_parse_functions.go</code> - パース関数群</li>
</ol>
<p>今回生成するE2Eテストは、<code>08_client_with_responses_interface.go</code>に定義されている160以上のinterfaceメソッド全てが対象です。</p>
<h2 id="%E7%B5%90%E6%9E%9C">結果</h2>
<p>ファイルを分割することで、トークン数の上限を超えることなく、スムーズにE2Eテストの自動生成ができるようになりました！</p>
<h2 id="ai%E6%99%82%E4%BB%A3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E8%A8%88%E7%99%BA%E8%A6%8B%E3%81%A8%E6%B0%97%E3%81%A5%E3%81%8D">AI時代のコード設計:発見と気づき</h2>
<p>この経験を通じて、個人的にいくつかの気づきがありました</p>
<h3 id="%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%95%B0%E3%81%AF%E5%A4%9A%E3%81%8F%E3%81%A6%E3%82%821%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%8F">ファイル数は多くても1ファイルは小さく</h3>
<p>ファイル数が増えることを恐れず、1ファイルあたりのサイズは小さく保つ方が良いと感じました。AIがコンテキストを理解しやすいようです。</p>
<h3 id="%E5%86%97%E9%95%B7%E6%80%A7%E3%82%88%E3%82%8A%E3%82%82%E6%98%8E%E7%A2%BA%E6%80%A7">冗長性よりも明確性</h3>
<p>人間の視点では「共通化すべき」と思える部分も、あえて冗長なままにしておく方が、AIには理解しやすいようです。</p>
<h2 id="%E3%80%8C%E4%BA%BA%E9%96%93%E3%81%8C%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%80%8D%E3%81%8B%E3%82%89%E3%80%8Cai%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%80%8D%E3%81%B8">「人間が読みやすいコード」から「AIが理解しやすいコード」へ</h2>
<p>これまでの時代、当然ながら人間がコードを書いていたので、「人間が読みやすいコード」を書くことが重要視されてきました。</p>
<p>しかし、AI時代の今、AIにコードを書いてもらうという前提で考えると、むしろ「AIが理解しやすいコード構造」を意識する必要があるのかもしれません。</p>
<p>これは、コード設計の考え方そのものが変わりつつあることを示唆しているように思います。もちろん、最終的には人間がメンテナンスすることも考慮すべきですが、AIとの協働を前提とした新しいベストプラクティスが生まれつつあるのかもしれません。</p>
<h2 id="%E7%94%9F%E6%88%90ai%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%95%E3%81%9B%E3%82%8B%E9%9A%9B%E3%81%AE%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9">生成AIにコードを解析させる際のその他の注意点</h2>
<p>最後に今回の経験を踏まえて、生成AI(Claude)にプログラムを解析させる際に気をつけるべき点を聞いてみました。多くは一般的なプログラミングのベストプラクティスと重なりますが、4、9、10はAI活用において重要なポイントだと感じました。</p>
<h3 id="1-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AA%E6%8F%90%E4%BE%9B">1. コンテキストの明示的な提供</h3>
<ul>
<li>ファイル間の依存関係を明示する</li>
<li>使用しているフレームワークやライブラリのバージョンを伝える</li>
<li>プロジェクト全体の構造を簡潔に説明する</li>
</ul>
<h3 id="2-%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87%E3%81%AE%E4%B8%80%E8%B2%AB%E6%80%A7">2. 命名規則の一貫性</h3>
<ul>
<li>変数名、関数名、型名などの命名を一貫させる</li>
<li>AIが理解しやすい説明的な名前を使う</li>
<li>略語よりも完全な単語を使う方がAIには理解しやすい</li>
</ul>
<h3 id="3-%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E6%B4%BB%E7%94%A8">3. コメントの活用</h3>
<ul>
<li>重要なロジックには日本語/英語でコメントを残す</li>
<li>AIがコードの意図を理解しやすくなる</li>
<li>特にビジネスロジックや複雑なアルゴリズムには必須</li>
</ul>
<h3 id="4-%E5%9E%8B%E6%83%85%E5%A0%B1%E3%81%AE%E6%98%8E%E7%A4%BA">4. 型情報の明示</h3>
<ul>
<li>TypeScriptやGoなど、型のある言語では型を明示的に書く</li>
<li>AIが型推論に頼らず、確実に理解できるようにする</li>
</ul>
<h3 id="5-%E5%BE%AA%E7%92%B0%E5%8F%82%E7%85%A7%E3%81%AE%E5%9B%9E%E9%81%BF">5. 循環参照の回避</h3>
<ul>
<li>ファイル間の循環参照はAIが混乱しやすい</li>
<li>できるだけ一方向の依存関係にする</li>
</ul>
<h3 id="6-%E9%81%A9%E5%88%87%E3%81%AA%E7%B2%92%E5%BA%A6%E3%81%A7%E3%81%AE%E5%88%86%E5%89%B2">6. 適切な粒度での分割</h3>
<ul>
<li>1つの関数/メソッドは1つの責務に</li>
<li>長すぎる関数はAIも人間も理解しにくい</li>
<li>100行を超える関数は分割を検討</li>
</ul>
<h3 id="7-%E6%A8%99%E6%BA%96%E7%9A%84%E3%81%AA%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E4%BD%BF%E7%94%A8">7. 標準的なパターンの使用</h3>
<ul>
<li>一般的なデザインパターンを使う</li>
<li>AIは学習データから標準的なパターンを理解している</li>
<li>独自の特殊な実装よりも、広く知られたパターンの方が理解されやすい</li>
</ul>
<h3 id="8-%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%98%8E%E7%A4%BA">8. エラーハンドリングの明示</h3>
<ul>
<li>エラーケースを明確に記述</li>
<li>エッジケースの処理を明示的に</li>
</ul>
<h3 id="9-%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%B4%BB%E7%94%A8">9. テストコードの活用</h3>
<ul>
<li>既存のテストコードがあれば一緒に読み込ませる</li>
<li>テストコードは「仕様書」としてAIの理解を助ける</li>
</ul>
<h3 id="10-%E6%AE%B5%E9%9A%8E%E7%9A%84%E3%81%AA%E8%A7%A3%E6%9E%90">10. 段階的な解析</h3>
<ul>
<li>一度に全てを解析させず、段階的に情報を提供</li>
<li>まず構造を理解させ、次に詳細を解析させる</li>
</ul>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>今回の経験を通じて気づいたのは、人もAIも、コードを理解するために必要な情報は本質的に同じだということです。明確な命名、適切なコメント、一貫した構造――これらは従来から「良いコード」とされてきた要素そのものです。AIは、それらを人間よりも高速に解釈できるという点で優れているに過ぎません。</p>
<p>つまり、「AIが理解しやすいコード」を書くことは、結局のところ「人間が理解しやすい良いコード」を書くことと同義なのかもしれません。AI時代だからといって特別なことをする必要はなく、基本に忠実であることが最も重要だと感じました。</p>
<hr>
<h3 id="%E5%8F%82%E8%80%83%EF%BC%89%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88">参考）生成されたシェルスクリプト</h3>
<pre><code class="language-bash">#!/bin/bash

# 使用法: ./split_client_gen.sh &lt;入力ファイル.go&gt;
# 例: ./split_client_gen.sh client.gen.go

input_file=&quot;$1&quot;
output_dir=&quot;client_gen_split_output&quot;

if [[ -z &quot;$input_file&quot; ]]; then
    echo &quot;エラー: 入力ファイル名を指定してください。&quot;
    echo &quot;使用法: $0 &lt;入力ファイル.go&gt;&quot;
    exit 1
fi

if [[ ! -f &quot;$input_file&quot; ]]; then
    echo &quot;エラー: 入力ファイル '$input_file' が見つかりません。&quot;
    exit 1
fi

mkdir -p &quot;$output_dir&quot;
rm -f &quot;$output_dir&quot;/*
echo &quot;出力先ディレクトリ: $output_dir&quot;

get_line_num() {
    local pattern=&quot;$1&quot;
    grep -E -n -m 1 -- &quot;$pattern&quot; &quot;$input_file&quot; | cut -d: -f1
}

extract_chunk() {
    local start_line=&quot;$1&quot;
    local end_line_exclusive=&quot;$2&quot;
    local out_file=&quot;$3&quot;
    local actual_end_line

    if [[ -z &quot;$start_line&quot; ]]; then
        echo &quot;情報: セクション '$out_file' の開始点が見つかりません。空ファイルを作成します。&quot;
        touch &quot;$output_dir/$out_file&quot;
        return
    fi

    if [[ -z &quot;$end_line_exclusive&quot; || &quot;$start_line&quot; -ge &quot;$end_line_exclusive&quot; ]]; then
        actual_end_line=&quot;$L_EOF&quot;
    else
        actual_end_line=$((end_line_exclusive - 1))
    fi

    if [[ &quot;$actual_end_line&quot; -lt &quot;$start_line&quot; ]]; then
         echo &quot;情報: セクション '$out_file' の範囲が無効です。空ファイルを作成します。&quot;
         touch &quot;$output_dir/$out_file&quot;
         return
    fi

    echo &quot;抽出中: $output_dir/$out_file (行: $start_line - $actual_end_line)&quot;
    sed -n &quot;${start_line},${actual_end_line}p&quot; &quot;$input_file&quot; &gt; &quot;$output_dir/$out_file&quot;
}

L_EOF=$(wc -l &lt; &quot;$input_file&quot; | xargs)

# --- 各セクションの開始を定義するパターン ---
P_CLIENT_STRUCT_START='^type Client struct'
P_CLIENT_INTERFACE_START='^type ClientInterface interface'
P_CLIENT_METHODS_START='^func \(c \*Client\) GetAuthInfo\('
P_REQUEST_BUILDERS_START='^func NewGetAuthInfoRequest\('
P_APPLY_EDITORS_START='^func \(c \*Client\) applyEditors\('
P_CLIENT_WITH_RESPONSES_STRUCT_START='^type ClientWithResponses struct'
P_CLIENT_WITH_RESPONSES_INTERFACE_START='^type ClientWithResponsesInterface interface'
P_CLIENT_WITH_RESPONSES_METHODS_START='^func \(c \*ClientWithResponses\) GetAuthInfoWithResponse\('
P_RESPONSE_STRUCTS_START='^type GetAuthInfoResponse struct'
P_PARSE_FUNCTIONS_START='^func ParseGetAuthInfoResponse\('

L_CLIENT_STRUCT_START=$(get_line_num &quot;$P_CLIENT_STRUCT_START&quot;)
L_CLIENT_INTERFACE_START=$(get_line_num &quot;$P_CLIENT_INTERFACE_START&quot;)
L_CLIENT_METHODS_START=$(get_line_num &quot;$P_CLIENT_METHODS_START&quot;)
L_REQUEST_BUILDERS_START=$(get_line_num &quot;$P_REQUEST_BUILDERS_START&quot;)
L_APPLY_EDITORS_START=$(get_line_num &quot;$P_APPLY_EDITORS_START&quot;)
L_CLIENT_WITH_RESPONSES_STRUCT_START=$(get_line_num &quot;$P_CLIENT_WITH_RESPONSES_STRUCT_START&quot;)
L_CLIENT_WITH_RESPONSES_INTERFACE_START=$(get_line_num &quot;$P_CLIENT_WITH_RESPONSES_INTERFACE_START&quot;)
L_CLIENT_WITH_RESPONSES_METHODS_START=$(get_line_num &quot;$P_CLIENT_WITH_RESPONSES_METHODS_START&quot;)
L_RESPONSE_STRUCTS_START=$(get_line_num &quot;$P_RESPONSE_STRUCTS_START&quot;)
L_PARSE_FUNCTIONS_START=$(get_line_num &quot;$P_PARSE_FUNCTIONS_START&quot;)

# --- チャンク抽出 ---
extract_chunk 1 &quot;$L_CLIENT_STRUCT_START&quot; &quot;01_preamble.go&quot;
extract_chunk &quot;$L_CLIENT_STRUCT_START&quot; &quot;$L_CLIENT_INTERFACE_START&quot; &quot;02_client_definition.go&quot;
extract_chunk &quot;$L_CLIENT_INTERFACE_START&quot; &quot;$L_CLIENT_METHODS_START&quot; &quot;03_client_interface.go&quot;
extract_chunk &quot;$L_CLIENT_METHODS_START&quot; &quot;$L_REQUEST_BUILDERS_START&quot; &quot;04_client_methods.go&quot;
extract_chunk &quot;$L_REQUEST_BUILDERS_START&quot; &quot;$L_APPLY_EDITORS_START&quot; &quot;05_request_builders.go&quot;
extract_chunk &quot;$L_APPLY_EDITORS_START&quot; &quot;$L_CLIENT_WITH_RESPONSES_STRUCT_START&quot; &quot;06_apply_editors.go&quot;
extract_chunk &quot;$L_CLIENT_WITH_RESPONSES_STRUCT_START&quot; &quot;$L_CLIENT_WITH_RESPONSES_INTERFACE_START&quot; &quot;07_client_with_responses_definition.go&quot;
extract_chunk &quot;$L_CLIENT_WITH_RESPONSES_INTERFACE_START&quot; &quot;$L_RESPONSE_STRUCTS_START&quot; &quot;08_client_with_responses_interface.go&quot;
extract_chunk &quot;$L_RESPONSE_STRUCTS_START&quot; &quot;$L_CLIENT_WITH_RESPONSES_METHODS_START&quot; &quot;09_response_structs.go&quot;
extract_chunk &quot;$L_CLIENT_WITH_RESPONSES_METHODS_START&quot; &quot;$L_PARSE_FUNCTIONS_START&quot; &quot;10_client_with_responses_methods.go&quot;
extract_chunk &quot;$L_PARSE_FUNCTIONS_START&quot; &quot;$((L_EOF + 1))&quot; &quot;11_parse_functions.go&quot;

echo &quot;---&quot;
echo &quot;ファイルの分割処理が完了しました。'$output_dir' ディレクトリを確認してください。&quot;
</code></pre>
<!--kg-card-end: markdown--></hr>]]></content:encoded></item><item><title><![CDATA[B2B SaaSにおけるテナントとは？]]></title><description><![CDATA[

おはようございます。信田です。
今回は、B2B
SaaSにおけるテナントについて考えてみようと思います。私は、2002年に社会人になり、SIerでキャリアを始めて、コンサルティングファームで働き、その後、SaaS企業で働いているため、これまでほぼ全てのキャリアを、ITにささげてきました。

その中でも、エンタープライズ企業のご支援をすることが多かったため、今でこそ、B2B
SaaSに向き合う日々を過ごしていますが、キャリアの前半では、SIとして、1社の企業のシステム作りに携わることが多かったです。その際には、『テナント』という言葉に触れることはなかったです。世の中でも多くのソフトウェアに関わる方が、『テナント』という言葉に馴染みが少ないのではないかと思います。

本題に入りますが、B2B
SaaSにおける『テナント』とは、SaaSアプリケーションを利用する個々の顧客企業や組織のことを指します。『テナント』という言葉を聞いて、一番馴染み深いのは、商業ビルなどではないでしょうか？商業ビルでは、一つ一つの入居者のことを『テナント』と呼びますが、想像しやすいので、まずはそちらと比較して考え]]></description><link>https://tech.anti-pattern.co.jp/b2b-saasniokerutenantotoha/</link><guid isPermaLink="false">Ghost__Post__690aa02871fa390001b34b8d</guid><category><![CDATA[SaaS]]></category><category><![CDATA[SaaSus Platform]]></category><dc:creator><![CDATA[kenji.shinoda]]></dc:creator><pubDate>Mon, 17 Nov 2025 01:14:49 GMT</pubDate><content:encoded><![CDATA[<p/><p>おはようございます。信田です。<br>今回は、B2B SaaSにおけるテナントについて考えてみようと思います。私は、2002年に社会人になり、SIerでキャリアを始めて、コンサルティングファームで働き、その後、SaaS企業で働いているため、これまでほぼ全てのキャリアを、ITにささげてきました。</br></p><p>その中でも、エンタープライズ企業のご支援をすることが多かったため、今でこそ、B2B SaaSに向き合う日々を過ごしていますが、キャリアの前半では、SIとして、1社の企業のシステム作りに携わることが多かったです。その際には、『テナント』という言葉に触れることはなかったです。世の中でも多くのソフトウェアに関わる方が、『テナント』という言葉に馴染みが少ないのではないかと思います。</p><p>本題に入りますが、B2B SaaSにおける『テナント』とは、SaaSアプリケーションを利用する個々の顧客企業や組織のことを指します。『テナント』という言葉を聞いて、一番馴染み深いのは、商業ビルなどではないでしょうか？商業ビルでは、一つ一つの入居者のことを『テナント』と呼びますが、想像しやすいので、まずはそちらと比較して考えてみましょう。</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:left">比較項目</th>
<th style="text-align:left">商業ビル</th>
<th style="text-align:left">B2B SaaS</th>
<th style="text-align:left">解説</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">全体</td>
<td style="text-align:left">ビルの建物全体</td>
<td style="text-align:left">SaaSアプリケーション全体</td>
<td style="text-align:left">アプリケーション全体がビル全体に相当します</td>
</tr>
<tr>
<td style="text-align:left">オーナー</td>
<td style="text-align:left">ビルオーナー、管理会社</td>
<td style="text-align:left">SaaS提供事業者</td>
<td style="text-align:left">建物の維持管理や改修を行うように、SaaS事業者はシステムのアップデートや保守を行います</td>
</tr>
<tr>
<td style="text-align:left">テナント</td>
<td style="text-align:left">入居者企業</td>
<td style="text-align:left">利用企業</td>
<td style="text-align:left">ビルの一区画を借りる企業が、SaaSの利用契約を結んだ顧客企業にあたります</td>
</tr>
<tr>
<td style="text-align:left">共用部分</td>
<td style="text-align:left">エレベーター、水道、電気、警備</td>
<td style="text-align:left">サーバー、データベース、アプリケーション基盤</td>
<td style="text-align:left">ビルのインフラを共有するように、SaaSも基盤となるITリソースを複数のテナントで共有しています</td>
</tr>
<tr>
<td style="text-align:left">占有部分</td>
<td style="text-align:left">机、PC、書類、社員</td>
<td style="text-align:left">顧客データ、設定、ユーザーアカウント</td>
<td style="text-align:left">各テナントが保有するデータは、他のテナントからは一切見ることができません。</td>
</tr>
<tr>
<td style="text-align:left">カスタマイズ</td>
<td style="text-align:left">オフィス内の内装、レイアウト変更</td>
<td style="text-align:left">機能の有効/無効、ロゴ設定、権限管理</td>
<td style="text-align:left">テナントは、自社のルールに合わせて許された範囲で環境をカスタマイズできます。</td>
</tr>
<tr>
<td style="text-align:left">利用料金</td>
<td style="text-align:left">賃料、共益費</td>
<td style="text-align:left">月額・年額の利用料 (サブスクリプション)</td>
<td style="text-align:left">利用するスペースの広さや機能に応じて料金を支払います。</td>
</tr>
<tr>
<td style="text-align:left">メンテナンス</td>
<td style="text-align:left">ビル全体の清掃、設備点検</td>
<td style="text-align:left">システムのアップデート、セキュリティパッチ</td>
<td style="text-align:left">アップデートはSaaS提供者が一括で行うため、全テナントが常に最新の機能や安全性を享受できます。</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>いかがでしたでしょうか？？</p><p>比較して考えてみるとわかりやすかったのではないでしょうか？B2B SaaSにおいても、商業ビルと同様に、複数の企業に対して、汎用的にサービスを提供しており、SaaSアプリケーションの契約の単位を『テナント』と言い換えることができるかもしれません。</p><p>商業ビルとB2B SaaSにおいて、両方に言えることですが、『テナント』という概念を使うことによって、利用企業や組織を個別に捉えるのではなく、『仮想の想定顧客組織』と捉えることによって、”汎用的なサービス”が効率的に提供できるようになります。</p><p>では、ここからは、B2B SaaSにおける『テナント』について考えていきます。</p><p>B2B SaaSを提供する企業において、『テナント』という概念にどのように向き合っていくべきかについて取り扱います。</p><h2 id="%E3%80%8E%E6%83%B3%E5%AE%9A%E3%81%AE%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E5%8D%98%E4%BD%8D%E3%80%8F%E3%82%92%E8%80%83%E3%81%88%E3%82%8B">『想定のテナント単位』を考える</h2><p/><p>前述しましたが、『テナント』とは、SaaSアプリケーションの契約の単位となります。つまり、『テナント』の単位をSaaS提供事業者側で考えたとしても、本来、それは利用者側で決めることなので、コントロールできるものではありません。そういった意味で、『”想定の”テナント単位』と書きましたが、提供事業者としては、プロダクトを企画する上で、ペルソナが誰かを捉える意味でも、どんな単位で契約をされるのかを想定していくことが重要と考えています。</p><p>例えば、小売の店舗向けの業務をSaaSとして提供する場合に、店舗単体の業務にフォーカスする(想定のテナントは店舗)のか？店舗を横断的に管理することにフォーカスする(想定のテナントは店舗を複数管理する企業)のか？によって、プロダクトの機能提供スコープが変わってくるため、このあたりを考えていくことが肝要と考えます。</p><h2 id="%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E5%85%B1%E9%80%9A%E7%9A%84%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8F%90%E4%BE%9B%E5%86%85%E5%AE%B9%E3%82%92%E8%80%83%E3%81%88%E3%82%8B">テナントへの共通的なサービス提供内容を考える</h2><p/><p>B2B SaaSでは、顧客を『テナント』と捉えるとお伝えしましたが、その大きな意味合いとして、特定の顧客へのサービスではなく、将来顧客となりうる対象(=テナントとなりうる対象)に対して、どのようなサービスを提供すべきなのかを考えます。ここが、SIのビジネスとの大きな違いになるかなぁと思います。特定の顧客へのサービスであれば、その顧客のやりたいことをヒアリングして、それを、その顧客に最適化して実現すれば良いのですが、『将来顧客となりうる対象』に対してサービスを考える場合、それは、その業務領域における「ベストプラクティス」を考えていく必要が出てきます。つまり、特定の機能を定義する際に、いくつかある選択肢の中から、『将来顧客となりうる対象』に対して汎用的にベストなものを選びつつ、検討を進めていく必要があります。これは非常に負荷がかかることですが、『テナント』を意識してサービス設計しておくことで、ビジネスを効率的に拡大させる可能性(スケーラビリティ)を持つことができます。</p><h2 id="%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E6%88%A6%E7%95%A5%E3%81%AE%E6%B1%BA%E5%AE%9A">テナント戦略の決定<br/></h2><p>B2B SaaSを提供する際に、必ず出てくる言葉が、「マルチテナント」です。</p><p>マルチテナントにおけるテナント戦略とは、「1つのシステム基盤を複数の顧客企業（テナント）で共有する」という前提のもとで、事業の収益性、拡張性、運用効率を最大化するための計画と言えます。特に、技術的な設計（アーキテクチャ）の話になりがちですが、「どの顧客に、どのような価値を、どうやって届け、いかにして収益を上げるか」というビジネスモデルそのものを支える経営戦略と捉え、ビジネスも技術も総合的に考えていくことが重要となります。<br/></p><h3 id="a-%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AA%E8%80%83%E6%85%AE">a.  技術的な考慮</h3><p/><p>「マルチテナント」という言葉が出てくる際に、「シングルテナント」との対比として、アーキテクチャのデプロイモデルのプールモデルとサイロモデルがイメージされることが多いですが、我々、アンチパターン社では、プールモデルでもサイロモデルでも、「テナント」を意識して効率的に運用できるように考慮されたアーキテクチャを「マルチテナント」と呼ぶことが多いです。</p><p>マルチテナントアプリケーションの設計における、代表的な部分では、デプロイモデルを決めることです。</p><p>サーバーやストレージのリソースを複数テナントで共有するプールモデルなどを採用していくことで、テナント数の増加に伴う、開発・運用負荷を高めすぎない状態を作り出し、事業の拡大に寄与できます。</p><p>一方で、プールモデルを選択すると、ノイジーネイバーと呼ばれる特定の激しい利用をする「テナント」の影響を別の「テナント」が受けてしまう問題にぶつかる可能性があります。同一リソースで複数の「テナント」を運用するわけですから、リソースをうまく配分できない可能性などが発生します。</p><p>つまり、提供する業務の特性や利用者としての「テナント」の特性などを考慮して、デプロイモデルを決めます。<br/></p><h3 id="b-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E7%9A%84%E3%81%AA%E8%80%83%E6%85%AE">b.  ビジネス的な考慮</h3><p/><p>さて、「テナント」という言葉は、ビジネス面においても、顧客を特定してその顧客に独自に個別のサービスを提供しないということを意識していく上で、重要な概念になってくると考えます。</p><p>特定の顧客を意識しないとするならば、明らかに属性が違う顧客へのサービス提供をどのように対処すべきなのでしょうか？SaaSでは、この明らかに属性が違う顧客を「ティア（階層）」の考え方を使って、顧客をいくつかもまとまりで捉えることによって、あくまでも、特定の顧客へのサービス提供ではなく、同じ階層の「テナント」にまとめてサービス提供することを実現していきます。</p><p>その場合、「ティア（階層）」毎に、アーキテクチャや料金プランや提供機能への差分が出てくることになりますが、その際には、どの「テナント」が、どの「ティア（階層）」に所属するのかを紐付けながら、それらを機械的に管理することによって、スケーラビリティーを担保しつつ、ビジネスターゲットを広げていくことができます。</p><p>さらに、同じ階層であっても、利用状況に応じて課金したいなどの際には、各「テナント」がどのくらいの利用量かを把握していくためのメータリングなどの考え方も必要となってきます。このメータリングについても「テナント」毎に実施していく必要があります。</p><p>また、オプションという概念を準備しておくことで、特定の「テナント」に対してのみ提供するサービス内容を準備することもあります。</p><p>このようにビジネス面においても、あくまで「テナント」に対してサービス提供していく意識で、ビジネス展開を考えていく必要があります。<br/></p><h3 id="c-%E9%81%8B%E7%94%A8%E7%9A%84%E3%81%AA%E8%80%83%E6%85%AE">c.  運用的な考慮</h3><p/><p>テナント戦略を考える際には、運用の視点においても、「テナント」の意識は必要となってきます。まず最初に、「テナントオンボーディング・オフボーディング」の概念となります。アーキテクチャで仮にサイロモデルを選択した場合には、新規「テナント」の契約開始が発生した場合に、その契約に対応して新しいリソースを準備していく必要があります。どの階層の「テナント」が契約開始した場合には、どんなアーキテクチャを準備するべきかを管理していく必要があります。また、それを自動化しておくことによって、新規契約が発生した際の、負荷やリードタイムを軽減し、顧客体験をスムーズにします。</p><p>次に、「テナント」毎のモニタリングも必要になってきます。各テナントがどんな利用状況なのか？などの情報を取得することによって、それ以降の「ティア（階層）」設計におけるプライシングや機能開発への有益な判断材料とすることができます。</p><h3 id="d-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E7%9A%84%E3%81%AA%E8%80%83%E6%85%AE">d.  セキュリティ的な考慮</h3><p/><p>SaaSのテナント戦略において、最も重要な点ともいえますが、セキュリティへの考慮が必要となります。「マルチテナント」で設計していく際には、「テナント」を同一リソースで集約していくことを考慮しますが、その際に、確実にそれぞれの「テナント」を分離していく必要性があります。テナント分離には、「データベースレベル分離」、「スキーマレベル分離」、「行レベル分離」など、さまざまな手法がありますが、どの手法を選択するにせよ、「テナント」と「テナント」の境界線をクリアに設計していく必要があります。境界線がどのように担保されているのかを意識した設計をすることで、「テナント」を跨いで情報が参照できてしまうなどのセキュリティ事故を防いでおく必要があります。</p><h2 id="%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%80%83%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F">テナントコンテキストを考えておく</h2><p/><p>ここまで、考えてきたように、「テナント」として汎用的にソフトウェアサービスを提供していくとはいえ、「テナント」によって、若干振る舞いを変えながら、動作していく状態を作る必要があります。例えば、契約している「料金プラン」によって、使える機能が違ったり、特定の「テナントID」を持つテナントに対しては、パフォーマンスの高い特別なリソースで準備してサービスを提供する必要があるかもしれません。</p><p>汎用的にソフトウェアサービスを作りながら、若干の振る舞いを変えていくためのパラメータに当たる部分をテナントコンテキストと呼びます。</p><p>・料金プラン</p><p>・所属するテナントのID</p><p>・利用者の役割</p><p>・利用者の属性</p><p><br>などです。</br></p><p><br>汎用的にソフトウェアを開発しながらも、何によって、アプリケーションの振る舞いを変える必要があるのかを考えて、現在利用しているユーザーには、一体、どのようにサービスを提供（アプリケーションの振る舞い）が必要なのかをコントロールする要素を、一元的に管理しておくことが重要になります。</br></p><p>さて、ここまでさまざまな視点で「テナント」という概念を中心に、B2B SaaSに向き合ってきましたが、「テナント」という概念の重要性について感じていただくことができましたでしょうか？？</p><p>この記事で、「テナント」が何か？ということの解像度が少しでも上がっていたら嬉しいです。</p><p>ここからは宣伝となります。</p><p>我々、株式会社アンチパターンは、B2B SaaSにフォーカスして事業推進する会社です。さまざまな、コンテンツを準備しておりますので、こちらもぜひご参照頂けますと幸いです。</p><p>・SaaS開発ガイド【テナント編】</p><p><a href="https://saasus.io/resource/e-book/saas-dev-guide-tenant">https://saasus.io/resource/e-book/saas-dev-guide-tenant</a></p><p>-&gt; SaaSについてまとまったドキュメントがなかったのでまとめてみました。</p><p>・SaaS開発運用を支援するSaaSus Platform</p><p><a href="https://saasus.io/">https://saasus.io/</a></p><p>-&gt; 上記で触れた、テナントコンテキストなどを効率的に管理できたりします。</p><p/><p>B2B SaaSに向き合う、多くの方と、何かしらの関わりを持っていけたら嬉しいなと考えているので、我々、株式会社アンチパターンにお気軽にコンタクトしてもらえるとさらに嬉しいです。</p>]]></content:encoded></item><item><title><![CDATA[Google Workspace Flowsにはどんな機能がある？GA時期は？]]></title><description><![CDATA[2025年4月のGoogle Cloud Next '25で発表された新機能、Google Workspace
Flowsが、一部のユーザー向けに利用可能になりました。
現在はα版としての提供となり、利用には以下の条件があります。

 * Google Workspace の BusinessエディションまたはEnterpriseエディション を契約している企業
 * 組織のWorkspace管理者が管理コンソールから本機能を有効化する必要がある

Google Workspace Flowsとは
Google Workspace
Flowsは、Gmail、Drive、Spreadsheet、ChatといったGoogleのアプリ同士の連携を自動化するツールです。
最大の特徴は、Gemini（AI）をフローに組み込める点です。
「返信が必要なメールかどうか判断する」などといった、臨機応変な動きを設定することができます。

実際にフローを作成する
実際にフローを作成します。
チェックするべきメールが届いたらSlackにお知らせする
というフローを作成します。

Step1でメールが届いたタ]]></description><link>https://tech.anti-pattern.co.jp/google-workspace-flowsde/</link><guid isPermaLink="false">Ghost__Post__690db61971fa390001b34dc7</guid><category><![CDATA[google]]></category><category><![CDATA[google workspace]]></category><category><![CDATA[google workspace flows]]></category><category><![CDATA[gemini]]></category><category><![CDATA[AI]]></category><category><![CDATA[GoogleWorkspace]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Mon, 10 Nov 2025 04:52:42 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1634245482486-01004231a957?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGZsb3djaGFydHxlbnwwfHx8fDE3NjI3NTAzMTV8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1634245482486-01004231a957?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGZsb3djaGFydHxlbnwwfHx8fDE3NjI3NTAzMTV8MA&ixlib=rb-4.1.0&q=80&w=2000" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？"/><p>2025年4月のGoogle Cloud Next '25で発表された新機能、Google Workspace Flowsが、一部のユーザー向けに利用可能になりました。<br>現在はα版としての提供となり、利用には以下の条件があります。</br></p><ul><li>Google Workspace の BusinessエディションまたはEnterpriseエディション を契約している企業</li><li>組織のWorkspace管理者が管理コンソールから本機能を有効化する必要がある</li></ul><h2 id="google-workspace-flows%E3%81%A8%E3%81%AF">Google Workspace Flowsとは</h2><p>Google Workspace Flowsは、Gmail、Drive、Spreadsheet、ChatといったGoogleのアプリ同士の連携を自動化するツールです。<br>最大の特徴は、Gemini（AI）をフローに組み込める点です。<br>「返信が必要なメールかどうか判断する」などといった、臨機応変な動きを設定することができます。</br></br></p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">実際にフローを作成する</h2><p>実際にフローを作成します。<br>チェックするべきメールが届いたらSlackにお知らせする<br>というフローを作成します。</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-6.png" class="kg-image" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？" loading="lazy" width="2000" height="1360" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-6.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-6.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/11/image-6.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-6.png 2112w" sizes="(min-width: 720px) 720px"/></figure><p>Step1でメールが届いたタイミングをトリガーにします。<br>Step2: Decideで届いたメールが要チェックかどうかを確認します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-7.png" class="kg-image" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？" loading="lazy" width="1208" height="852" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-7.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-7.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-7.png 1208w" sizes="(min-width: 720px) 720px"/></figure><p>Step3でチェックすべきメールだった場合の処理を追加します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-14.png" class="kg-image" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？" loading="lazy" width="591" height="1102"/></figure><p>※協力：穴田竜大さん</p><p>step5でSlackに通知するWebhookを設定しています。<br>とっても簡単ですよね！</br></p><h2 id="%E6%A9%9F%E8%83%BD">機能</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-11.png" class="kg-image" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？" loading="lazy" width="1118" height="1346" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-11.png 1118w" sizes="(min-width: 720px) 720px"/></figure><p><strong>現在あるStarter</strong></p><ul><li><strong>On a schedule：</strong>スケジュール実行</li><li><strong>When I get an email：</strong>メールを受信した時</li><li><strong>When someone joins a space：</strong>誰かがChatスペースに参加した時</li><li><strong>When I'm mentioned：</strong>Chatで自分がメンションされた時</li><li><strong>When someone posts in a space：</strong>誰かがChatスペースに投稿した時</li><li><strong>When an emoji reaction is added：</strong>Chatで絵文字リアクションが追加された時</li><li><strong>When a sheet changes：</strong>スプレッドシートが変更された時</li><li><strong>When a file is edited：</strong>ドライブのファイルが編集された時</li><li><strong>When an item is added to a folder：</strong>ドライブのアイテムがフォルダに追加された時</li><li><strong>When an item in a folder is edited：</strong>フォルダ内のアイテムが編集された時</li><li><strong>Based on a meeting：</strong>カレンダーの会議前や会議後</li><li><strong>When a form response comes in：</strong>Googleフォームの回答が来た時</li></ul><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-12.png" class="kg-image" alt="Google Workspace Flowsにはどんな機能がある？GA時期は？" loading="lazy" width="1100" height="714" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/11/image-12.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/11/image-12.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/image-12.png 1100w" sizes="(min-width: 720px) 720px"/></figure><p><strong>AI agent機能</strong></p><p>・<strong>Ask Gemini</strong>：Geminiに聞く<br>・<strong>Ask Gem</strong>：Gemに聞く</br></p><p>・<strong>Recap unread emails</strong>：未読メールを分類して要約する<br>・<strong>Extract</strong>：入力したテキスト（またはURL）から必要な部分を抽出する<br>・<strong>Decide</strong>：入力からtrue/falseを判断する<br>・<strong>Summarize</strong>：入力したテキストを要約する</br></br></br></p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>作成したワークフローにAIをかますことができるのが、活用の範囲が広がってとてもわくわくしますよね！<br>まだアルファ版でGA時期はまだ公開されていないようですが、これからどんな機能が追加されていくのか、一般公開が楽しみです。</br></p>]]></content:encoded></item><item><title><![CDATA[timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -]]></title><description><![CDATA[
この記事で分かること
Codexの Terminal で timeout docker compose exec 
が正常に動作するのに、ローカルのTerminalでは同じコマンドが途中で停止してしまう。この現象の背後には、プロセスグループ、TTY制御、そして実行ハーネス
という、コンピュータサイエンスが隠れています。

環境情報
 * Docker Compose: version 3.8
 * Go: 1.23
 * timeout コマンド: GNU coreutils


--------------------------------------------------------------------------------

結論：3つのオプションで解決できる
先に結論を示します。ローカル環境で Codexと同じ安定性を得るには、次の3つのオプションを組み合わせます。

timeout --foreground 5 \
  docker compose exec -T \
  go-app bash -lc "go run main.go" \
  < /dev/nu]]></description><link>https://tech.anti-pattern.co.jp/codex-docker-timeout/</link><guid isPermaLink="false">Ghost__Post__69036d5971fa390001b3484d</guid><category><![CDATA[docker]]></category><category><![CDATA[codex]]></category><category><![CDATA[CS]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Sun, 09 Nov 2025 06:45:32 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/unnamed.jpg" medium="image"/><content:encoded><![CDATA[<h1/><h2 id="%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8B%E3%81%93%E3%81%A8">この記事で分かること</h2><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/11/unnamed.jpg" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"/><p>Codexの Terminal で <code>timeout docker compose exec</code> が正常に動作するのに、ローカルのTerminalでは同じコマンドが途中で停止してしまう。この現象の背後には、<strong>プロセスグループ、TTY制御、そして実行ハーネス</strong>という、コンピュータサイエンスが隠れています。</p><h2 id="%E7%92%B0%E5%A2%83%E6%83%85%E5%A0%B1">環境情報</h2><ul><li>Docker Compose: version 3.8</li><li>Go: 1.23</li><li>timeout コマンド: GNU coreutils</li></ul><hr><h2 id="%E7%B5%90%E8%AB%96%EF%BC%9A3%E3%81%A4%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%82%8B">結論：3つのオプションで解決できる</h2><p>先に結論を示します。ローカル環境で Codexと同じ安定性を得るには、次の3つのオプションを組み合わせます。</p><pre><code class="language-bash">timeout --foreground 5 \
  docker compose exec -T \
  go-app bash -lc "go run main.go" \
  &lt; /dev/null
</code></pre><p>各オプションの役割は以下の通りです。</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: left">オプション</th>
<th style="text-align: left">効果</th>
<th style="text-align: left">解決する問題</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><code>--foreground</code></td>
<td style="text-align: left">同一プロセスグループで実行</td>
<td style="text-align: left">SIGTTIN による停止を防止</td>
</tr>
<tr>
<td style="text-align: left"><code>-T</code></td>
<td style="text-align: left">TTY を無効化（非対話モード）</td>
<td style="text-align: left">標準入力の読み込み試行を防止</td>
</tr>
<tr>
<td style="text-align: left"><code>&lt; /dev/null</code></td>
<td style="text-align: left">標準入力を閉鎖</td>
<td style="text-align: left">入力待ちによるブロックを防止</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p/><hr><h2 id="%E7%8F%BE%E8%B1%A1%EF%BC%9Acodex-%E3%81%A7%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%AB%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E3%81%AF%E6%AD%A2%E3%81%BE%E3%82%8B">現象：Codex では動くのにローカルでは止まる</h2><p>まず、問題の現象を確認しましょう。以下のコマンドを実行したとします。</p><pre><code class="language-bash">timeout 5 docker compose exec app bash -c "go run main.go"
</code></pre><p>Codex の Terminal では、このコマンドは正常に動作します。しかし、ローカルのTerminalで同じコマンドを実行すると、プロセスが途中で停止してしまいます。別のTerminalから <code>ps</code> コマンドで確認すると、次のように表示されます。</p><pre><code>bash   T
</code></pre><p>この <strong>"T"</strong> は、プロセスが <strong>SIGTTIN シグナル</strong>を受け取って停止していることを意味します。</p><hr><h2 id="timeout-%E3%81%8C%E4%BD%9C%E3%82%8B%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E6%A7%8B%E9%80%A0">timeout が作るプロセス構造</h2><p>この問題を理解するには、<code>timeout</code> コマンドがどのようにプロセスを管理しているかを知る必要があります。<code>timeout</code> は、指定した時間を超えた場合に子プロセスを確実に終了させるため、<strong>子プロセスを別のプロセスグループ</strong>で起動します。</p><p>プロセス構造を図示すると、以下のようになります。</p><pre><code>[Terminal / Shell]  ← 前景プロセスグループ (PGID=1000)
    │
    └── timeout 5 ...          ← 新しいプロセスグループ (PGID=2000)
          │
          └── docker compose exec ...
                │
                └── bash -lc "go run main.go"
                      └── go (ユーザープログラム)
</code></pre><p>この構造により、<code>timeout</code> は <code>SIGTERM</code> をプロセスグループ全体に送信できるようになります。しかし、同時に新しい問題が発生します。それが <strong>SIGTTIN</strong> です。</p><hr><h2 id="sigttin-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F">SIGTTIN とは何か？</h2><p>SIGTTIN は、UNIX 系 OS におけるジョブ制御の仕組みの一部です。TTY（端末）には、「<strong>前景プロセスグループのみが標準入力を読み取れる</strong>」というルールがあります。バックグラウンドプロセスが <code>read()</code> システムコールを呼び出すと、カーネルがそれを検知し、<strong>SIGTTIN シグナル</strong>を送信してプロセスを停止させます。</p><p><code>timeout</code> によって作られた新しいプロセスグループは、シェルから見るとバックグラウンド扱いです。このため、<code>docker compose exec</code> が（たとえ意図せずとも）TTY から標準入力を読み込もうとすると、カーネルが介入してプロセスを停止させてしまうのです。</p><p>SIGTTIN 発生の流れを図示すると、以下のようになります。</p><pre><code>┌──────────────────────────────┐
│ timeout が子を別PGで起動    │
└──────────────────────────────┘
                │
                ▼
 docker exec が TTYを読もうとする
                │
                ▼
 カーネル「前景じゃない！」 → SIGTTIN送信
                │
                ▼
 子プロセスが停止 (T状態)
</code></pre><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="http://curiousthing.org/sigttin-sigttou-deep-dive-linux"><div class="kg-bookmark-content"><div class="kg-bookmark-title">A Deep Dive into the SIGTTIN / SIGTTOU Terminal Access Control Mechanism in Linux • A Curious Thing</div><div class="kg-bookmark-description">From an end-user perspective, the TTY system in Linux (or any POSIX-like OS) is both functional and intuitive. For example, the input you type in usually goes to the process you expect it to go to, CTRL+Z usually suspends the process you expect to... | A Curious Thing | Avid learner. Enthusiast Prog…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://lightning.svbtle.com/cargo/apple-touch-icon-8ed2bd858a30400ead0535543ffb8ad2ab3e036a2f0adb797dc641458d00a41a.png" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"><span class="kg-bookmark-author">A Curious Thing on Svbtle</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://svbtleusercontent.com/uIH2S8rxfQOoscWp526XxkaiwbM_large.jpg" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"/></div></a></figure><p/><hr><h2 id="-foreground-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%8A%B9%E6%9E%9C">--foreground オプションの効果</h2><p>この問題を解決する最初の鍵が、<code>timeout --foreground</code> オプションです。このオプションを使うと、<code>timeout</code> は子プロセスを<strong>同じプロセスグループ</strong>で実行します。</p><p>プロセス構造は以下のように変化します。</p><pre><code class="language-sh">[Terminal / Shell] (PGID=1000)
    │
    └── timeout --foreground 5 ... (同一PGID)
          │
          └── docker compose exec ...
                └── bash -lc "go run main.go"
</code></pre><p>同じ前景プロセスグループ内で実行されるため、SIGTTIN が発生せず、プロセスは停止しません。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://man7.org/linux/man-pages/man1/timeout.1.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">timeout(1) - Linux manual page</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Linux manual page</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://man7.org/tlpi/cover/TLPI-front-cover-vsmall.png" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"/></div></a></figure><hr><h2 id="codex-%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%81%A8%E3%81%AF%EF%BC%9F">Codex の実行ハーネスとは？</h2><p>ここまでの説明で、ローカル環境での問題の原因は理解できました。では、なぜ Codex の環境では同じ問題が発生しないのでしょう？</p><p>Codex は、見た目は普通の bash ですが、実際には<strong>安全な AI 実行ハーネス（sandbox harness）<strong>の上で動作しています。実行ハーネスとは、プログラムを安全かつ再現性高く実行するための</strong>外側の制御構造</strong>のことです。</p><p>Codexの実行ハーネスの構造を図示すると、以下のようになります。</p><pre><code>Claude Code 実行ハーネス:

  LLM Agent (OpenAI Responses API)
       ↓
  ToolOrchestrator (承認・サンドボックス選択)
       ↓
  UnifiedExecRuntime
       ↓
  UnifiedExecSessionManager
       ├─ 承認チェック (approval/bypass/cache)
       ├─ サンドボックス変換 (ExecEnv)
       └─ セッション再利用
       ↓
  PTY (Pseudo-TTY) System
     ├─ portable_pty (クロスプラットフォーム)
     ├─ Master/Slave ペア
     ├─ Reader Thread (stdout/stderr)
     ├─ Writer Thread (stdin)
     └─ Wait Thread (exit code)
       ↓
  Sandboxed Process
     ├─ Linux: Landlock + Seccomp
     ├─ macOS: Seatbelt
     └─ 環境変数: CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR
       ↓
  bash -lc "docker compose exec ... go run main.go"
     ├─ 対話的シェル (bash -i) または
     └─ ワンショットコマンド
</code></pre><p>Codex では、以下の理由で SIGTTIN の発生条件がそもそも満たされません。</p><ul><li><strong>stdin が閉じている</strong>: すべてのコマンドの標準入力は、デフォルトで <code>/dev/null</code> に接続されています。これにより、プロセスが入力待ちでブロックされることがありません。</li></ul><p>これが、「Codex では動くのにローカルで止まる」現象の真相です。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/openai/codex/blob/main/codex-rs/core/src/spawn.rs#L94"><div class="kg-bookmark-content"><div class="kg-bookmark-title">codex/codex-rs/core/src/spawn.rs at main · openai/codex</div><div class="kg-bookmark-description">Lightweight coding agent that runs in your terminal - openai/codex</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">openai</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/e35c9159b2fc6bf35d7ff0458ca26783c2afdfef36f5281a14a3b22761bc552d/openai/codex" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"/></div></a></figure><hr><h2 id="%E5%AE%9F%E9%A8%93%E7%92%B0%E5%A2%83%EF%BC%9Adocker-compose-%E3%81%A7%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B">実験環境：Docker Compose で再現する</h2><p>ここからは、実際に問題の挙動を再現し、対策の効果を確認できる最小構成の Docker Compose 環境を紹介します。</p><h3 id="docker-composeyml">docker-compose.yml</h3><p>以下の設定ファイルを作成します。</p><pre><code class="language-yaml">version: "3.8"

services:
  go-app:
    image: golang:1.23
    working_dir: /work
    volumes:
      - .:/work:cached
    tty: false
    stdin_open: false
    environment:
      - CGO_ENABLED=0
</code></pre><p><strong>ポイント</strong>: <code>tty: false</code> と <code>stdin_open: false</code> で非対話化しています。</p><h3 id="%E5%AE%9F%E8%A1%8C%E7%94%A8%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88">実行用スクリプト</h3><p>次に、実行用のスクリプト <code>bin/go-run.sh</code> を作成します。</p><pre><code class="language-bash">#!/usr/bin/env bash
set -euo pipefail

TARGET="${1:-.}"
TIMEOUT="${TIMEOUT:-120}"

timeout --foreground "${TIMEOUT}" \
  docker compose exec -T \
  go-app bash -lc "go run ${TARGET}" \
  &lt; /dev/null
</code></pre><p>このスクリプトは、前述の3つの対策をすべて盛り込んだ「安定版」です。</p><h3 id="%E7%92%B0%E5%A2%83%E3%81%AE%E8%B5%B7%E5%8B%95">環境の起動</h3><p>以下のコマンドで、実行権限を付与し、Docker コンテナを起動します。</p><pre><code class="language-bash">chmod +x bin/go-run.sh
docker compose up -d
</code></pre><hr><h2 id="%E5%AE%9F%E9%A8%931%EF%BC%9A%E6%AD%A3%E5%B8%B8%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">実験1：正常動作を確認する</h2><p>まず、対策を施したスクリプトが正常に動作することを確認します。簡単な Go プログラム（例: <code>cmd/foo/main.go</code>）を作成し、以下のように実行します。</p><pre><code class="language-bash">bin/go-run.sh ./cmd/foo
</code></pre><p><strong>期待される結果</strong>:</p><pre><code>hello from go run
</code></pre><p>このように、プログラムが正常に実行され、出力が表示されます。</p><hr><h2 id="%E5%AE%9F%E9%A8%932%EF%BC%9Asigttin-%E3%82%92%E3%82%8F%E3%81%96%E3%81%A8%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%82%8B">実験2：SIGTTIN をわざと発生させる</h2><p>次に、対策を施さないコマンドを実行して、SIGTTIN を意図的に発生させます。</p><pre><code class="language-bash">timeout 5 docker compose exec -it go-app bash -lc 'read -p "input: " X; echo $X'
</code></pre><p>別のTerminalから以下のコマンドでプロセスの状態を確認します。</p><pre><code class="language-bash">ps aux | grep bash
# → 状態が「T」になっている（SIGTTINで停止中）
</code></pre><p>プロセスが停止状態（T）になっていることが確認できます。これが、SIGTTIN による停止です。</p><hr><h2 id="%E5%AE%9F%E9%A8%933%EF%BC%9A%E5%AF%BE%E7%AD%96%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">実験3：対策の効果を確認する</h2><p>最後に、3つの対策を適用したコマンドを実行します。</p><pre><code class="language-bash">timeout --foreground 5 \
  docker compose exec -T \
  go-app bash -lc 'read X || echo "no stdin"; echo ok' \
  &lt; /dev/null
</code></pre><p><strong>期待される結果</strong>:</p><pre><code>no stdin
ok
</code></pre><p>TTY を無効化し、stdin を閉じることで、プロセスが停止せずに完全に安定して実行できることが確認できます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.docker.com/reference/cli/docker/compose/exec/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">docker compose exec</div><div class="kg-bookmark-description">″”</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.docker.com/assets/images/favicon.svg" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"><span class="kg-bookmark-author">Docker Documentation</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.docker.com/images/thumbnail.webp" alt="timeout docker compose exec から学ぶCS - Codex では動くのにTerminalからでは止まる -"/></div></a></figure><hr><p>この環境は、自動化スクリプトや CI/CD パイプラインの設計において、使える考えとなります。</p><hr><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>Codex とローカル環境の挙動の違いは、OS の基本的なプロセス管理と I/O 制御の仕組みに起因します。</p><p>Codexは、 stdin を閉じた実行ハーネス上で動いているため、SIGTTIN が発生しません。ローカルでは TTY と stdin が開いており、timeout が子を別グループにすると停止します。<code>--foreground -T &lt; /dev/null</code> の3点セットで、どちらの環境でも安定したハーネス実行が可能になります。</p><p>この知識は、自動化スクリプトや CI/CD パイプラインを構築する上で、非常に役立つはずです。</p></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[【AWS Kiro体験記】開発スタイルが変わる！AI IDEの「仕様駆動開発」がもたらす衝撃]]></title><description><![CDATA[先日、アマゾンウェブサービス（AWS）のオフィスで開催された「Kiro ハッカソンイベント」に参加しました。

Kiroは、開発者のための新しいAI IDEとしてプレビュー公開されているツールです。AIと協働しながら、ただコードを書くだけでなく、
仕様策定から実装までを一気通貫で進められる点が大きな特徴です。

当日は座学やハンズオンを通じてKiroの基本と活用方法を学んだ後、午後は実際にアプリケーションの開発に取り組みました。

この記事では、イベント当日の様子やKiroの強力な機能、そして実際に触れてみて感じた、未来の開発スタイルについてお伝えします。

イベント概要：Kiroを徹底的に学ぶ一日
このイベントは、AWSが提供するAI IDE「Kiro」を実践的に学ぶことを目的に開催されました。会場はAWSオフィスで、座学とハンズオン形式で進められました。

当日のタイムスケジュール

 * 10:00 ~ 10:30 座学 + ハンズオン導入
 * 10:30 ~ 12:00 Kiro ハンズオントレーニング
 * 12:00 ~ 13:00 昼食
 * 13:00 ~ 18:00]]></description><link>https://tech.anti-pattern.co.jp/aws-kiroti-yan-ji-kai-fa-sutairugabian-waru-ai-ideno-shi-yang-qu-dong-kai-fa-gamotarasuchong-ji/</link><guid isPermaLink="false">Ghost__Post__68fe04fa71fa390001b341b9</guid><dc:creator><![CDATA[Akira Yasuzawa]]></dc:creator><pubDate>Tue, 04 Nov 2025 06:37:36 GMT</pubDate><content:encoded><![CDATA[<p>先日、アマゾンウェブサービス（AWS）のオフィスで開催された「Kiro ハッカソンイベント」に参加しました。</p><p>Kiroは、開発者のための新しいAI IDEとしてプレビュー公開されているツールです。AIと協働しながら、ただコードを書くだけでなく、<strong>仕様策定から実装までを一気通貫で進められる</strong>点が大きな特徴です。</p><p>当日は座学やハンズオンを通じてKiroの基本と活用方法を学んだ後、午後は実際にアプリケーションの開発に取り組みました。</p><p>この記事では、イベント当日の様子やKiroの強力な機能、そして実際に触れてみて感じた、未来の開発スタイルについてお伝えします。</p><h2 id="%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E6%A6%82%E8%A6%81%EF%BC%9Akiro%E3%82%92%E5%BE%B9%E5%BA%95%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6%E4%B8%80%E6%97%A5">イベント概要：Kiroを徹底的に学ぶ一日</h2><p>このイベントは、AWSが提供するAI IDE「Kiro」を実践的に学ぶことを目的に開催されました。会場はAWSオフィスで、座学とハンズオン形式で進められました。</p><p><strong>当日のタイムスケジュール</strong></p><ul><li>10:00 ~ 10:30 座学 + ハンズオン導入</li><li>10:30 ~ 12:00 Kiro ハンズオントレーニング</li><li>12:00 ~ 13:00 昼食</li><li>13:00 ~ 18:00 Kiro ハッカソン</li></ul><p>Kiro ハンズオントレーニングで触れたワークショップは公開されています。興味のある方は、以下のURLから同じ内容を体験可能です。<br><a href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP">https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP</a></br></p><h2 id="kiro-%E3%81%A8%E3%81%AF%EF%BC%9F%E2%80%94%E3%80%8C%E4%BB%95%E6%A7%98%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%80%8D">Kiro とは？—「仕様駆動開発」</h2><p>Kiroは、AWSが提供するAIコーディングエージェントであり、IDEを直接操作しながらコード生成、テスト、デバッグ、ドキュメント生成まで自律的に実行できる革新的な開発環境です。</p><p>Kiroの核心にあるのが「<strong>仕様駆動開発 (Specification-Driven Development)</strong>」です。これは、要件、設計、タスクを最初に明確なドキュメントとして整理し、それを基にAIが実装を進める開発スタイルです。</p><h3 id="spec%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A8%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B3%E3%81%A4%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88">Specモードと生成される3つのドキュメント</h3><p>KiroにはVibeモードとSpecモードの2種類のモードがありますが、仕様駆動開発を可能にするのが<strong>Specモード</strong>です。Specモードを使用すると、以下の3つのドキュメントが自動的に生成・整理されます。</p><ol><li><code>requirements.md</code>：要件定義（ユーザーストーリー、受け入れ基準など）</li><li><code>design.md</code>：技術設計（データフロー 、API仕様など）</li><li><code>tasks.md</code>：実装タスク計画（進行管理も可能）</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/Screenshot-2025-10-26-at-21.13.45--2-.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/Screenshot-2025-10-26-at-21.13.45--2-.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/Screenshot-2025-10-26-at-21.13.45--2-.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/Screenshot-2025-10-26-at-21.13.45--2-.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/Screenshot-2025-10-26-at-21.13.45--2-.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Kiroの画面と実際に生成されたdesign.mdファイル</figcaption></img></figure><p><code>tasks.md</code>が生成された後は、順番にタスクの実行を依頼するだけで、AIが仕様に沿って実装を進めてくれます（画面上の「Start task」を押すだけで実行可能です）。プロジェクト全体の見通しが最初から立つため、迷うことなく開発を進められるのが大きな利点です。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/Screenshot-2025-10-29-at-21.10.33.png" class="kg-image" alt="" loading="lazy" width="848" height="513" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/Screenshot-2025-10-29-at-21.10.33.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/Screenshot-2025-10-29-at-21.10.33.png 848w" sizes="(min-width: 720px) 720px"><figcaption>実行途中のtasks.md</figcaption></img></figure><h2 id="%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE%EF%BC%9A5%E6%99%82%E9%96%93%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E5%AE%8C%E6%88%90%EF%BC%81">ハッカソンで作ったもの：5時間で動くアプリが完成！</h2><p>午後のハッカソンは個人開発形式で取り組み、私は<strong>GitHubのIssueに関するスクラム支援ツール</strong>を作成しました。</p><p>具体的には、</p><ol><li>GitHub APIを使ってリポジトリ内のIssueを取得する。</li><li>取得したIssueの内容がスクラムのベストプラクティスに沿っているかをClaudeにチェックしてもらう。</li><li>Claudeからの指摘内容をWeb画面上に表示する。</li></ol><p>というアプリケーションです。開発者がIssueを改善しやすくするためのフィードバック機能を想定しました。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/Screenshot-2025-10-26-at-21.55.31.png" class="kg-image" alt="" loading="lazy" width="2000" height="1131" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/Screenshot-2025-10-26-at-21.55.31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/Screenshot-2025-10-26-at-21.55.31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/Screenshot-2025-10-26-at-21.55.31.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/Screenshot-2025-10-26-at-21.55.31.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Next.jsで作成したWebアプリケーション</figcaption></img></figure><h3 id="kiro%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E4%BD%93%E9%A8%93">Kiroによる開発体験</h3><p>この実装は、KiroのSpecモードを使い、要件整理から設計、タスク分解までAIエージェントと協働で進めました。</p><p>初期設定だけ行えば、AIが仕様に沿ったコンポーネント、API呼び出し、画面表示まで自律的に生成してくれたため、<strong>わずか5時間という短時間でも一つのアプリケーションとして形にすることができました</strong>。</p><p>もしこれを自力で実装していたら、GitHub APIの選定やUIコンポーネントの設計で数日はかかっていたかもしれません。AIがプロジェクトの設計・管理まで担ってくれることで、開発スピードが劇的に向上することを実感しました。</p><h2 id="%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%A6%E6%84%9F%E3%81%98%E3%81%9F%E3%81%93%E3%81%A8%EF%BC%9A%E6%97%A2%E5%AD%98%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84">参加して感じたこと：既存ツールとの違い</h2><p>普段はRoo CodeやGitHub Copilotを利用して開発を行なっており、Kiroを使うのは今回が初めてでした。</p><ol><li><strong>タスク管理の視認性の高さ</strong><br>Specモードで仕様の整理から始めると、その後の実装が驚くほどスムーズでした。特に、tasks.mdとして実装タスクが整理される点が既存のコーディング支援ツールとの大きな違いです。</br></li><li><strong>未知の機能への期待</strong><br>今回はSpecモードが中心でしたが、IDEの特定イベントに対して事前定義したAIアクションを実行できるHooks機能や、チーム標準やプロジェクト固有の情報に基づいてエージェントの挙動を制御できるSteering機能など、他にも試してみたい機能が紹介されました。これらを活用すれば、さらにチーム開発の効率が上がりそうです。</br></li></ol><h2 id="%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E6%A7%98%E5%AD%90">イベントの様子</h2><p>素晴らしい環境と機会を提供してくださったAWSスタッフの皆様、本当にありがとうございました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/IMG_8499.jpg" class="kg-image" alt="" loading="lazy" width="2000" height="1125" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/IMG_8499.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/IMG_8499.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/IMG_8499.jpg 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/IMG_8499.jpg 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB%EF%BC%9A%E4%BB%8A%E3%81%99%E3%81%90kiro%E3%82%92%E8%A9%A6%E3%81%99%E3%83%81%E3%83%A3%E3%83%B3%E3%82%B9%EF%BC%81">終わりに：今すぐKiroを試すチャンス！</h2><p>今回のハッカソンを通じて、Kiroは単なるコード補完ツールではなく、<strong>開発プロセス全体を加速させるAIエージェント</strong>だと強く感じました。</p><p>嬉しいことに、Kiroを試すためのハードルが下がっています。</p><ul><li><strong>ウェイトリスト廃止:</strong> 2025/10/16でKiroのウェイトリストは廃止されたようです。</li><li><strong>無料クレジット:</strong> 2025/10/1以降にKiroに初めてアクセスすると、<strong>14日間使用できる無料のクレジットを500もらえる</strong>とのことです。</li></ul><p><strong>出典：</strong></p><ul><li><a href="https://aws.amazon.com/jp/blogs/news/waitlist-is-over/">AWS ブログ「ウェイトリストは終了、今日から Kiro を始めましょう」</a></li><li><a href="https://aws.amazon.com/jp/blogs/news/new-pricing-plans-and-auto/">AWS ブログ「新しい料金プランと新エージェント「Auto」の発表」</a></li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/Screenshot-2025-10-29-at-21.57.32.png" class="kg-image" alt="" loading="lazy" width="596" height="329"><figcaption>Kiroから確認できるクレジット</figcaption></img></figure><p>今回のハッカソンでは約5時間Kiroを使い続けましたが、消費したクレジットは100程度でした。無料のクレジットでも十分にKiroを試すことができそうですし、私のアカウントではいつの間にか1000クレジットに増えていたので、ぜひ気軽に試してみてはいかがでしょうか！</p>]]></content:encoded></item><item><title><![CDATA[Kiro + MCP で実装とテストを自動化する]]></title><description><![CDATA[Kiro + MCP で実装とテストを自動化する
はじめまして！APでエンジニアインターンをしている鈴木鴻太です。

今回は、AWSで開催されたkiroの仕様書駆動体験1dayハッカソンに参加し、そこで得た「未来の開発のあり方」について考察し、実際に検証した過程をご紹介します。


--------------------------------------------------------------------------------

僕が考察する今後レギュラーになってくる開発手法
僕はkiroを使った仕様書駆動開発を体験したことで、「これからの時代は“仕様書”と“受け入れ基準・テスト条件”の2つを起点にし、LLMに“テスト基準を越えるまで”実装を繰り返させる――そんな開発スタイルが主流になっていくのでは？」と感じました。

以下V字のうち、システムテストまでAIに自動化させるといったイメージです。

この考えをもとに、kiroに加えてPlaywright MCPとChrome DevTools
MCPという2つのツールを組み合わせ、実際に「仕様書とテスト要件を一体化した開発」]]></description><link>https://tech.anti-pattern.co.jp/kiro-mcp-deshi-zhuang-totesutowozi-dong-hua-suru/</link><guid isPermaLink="false">Ghost__Post__69044fb671fa390001b34af5</guid><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Fri, 31 Oct 2025 08:26:12 GMT</pubDate><content:encoded><![CDATA[<h2 id="kiro-mcp-%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B"><strong>Kiro + MCP で実装とテストを自動化する</strong></h2><p>はじめまして！APでエンジニアインターンをしている鈴木鴻太です。</p><p>今回は、AWSで開催されたkiroの仕様書駆動体験1dayハッカソンに参加し、そこで得た「未来の開発のあり方」について考察し、実際に検証した過程をご紹介します。</p><hr><h2 id="%E5%83%95%E3%81%8C%E8%80%83%E5%AF%9F%E3%81%99%E3%82%8B%E4%BB%8A%E5%BE%8C%E3%83%AC%E3%82%AE%E3%83%A5%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95"><strong>僕が考察する今後レギュラーになってくる開発手法</strong></h2><p>僕はkiroを使った仕様書駆動開発を体験したことで、「これからの時代は“仕様書”と“受け入れ基準・テスト条件”の2つを起点にし、LLMに“テスト基準を越えるまで”実装を繰り返させる――そんな開発スタイルが主流になっていくのでは？」と感じました。</p><p>以下V字のうち、システムテストまでAIに自動化させるといったイメージです。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-4.png" class="kg-image" alt="" loading="lazy" width="1024" height="624" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/image-4.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/image-4.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-4.png 1024w" sizes="(min-width: 720px) 720px"/></figure><p>この考えをもとに、kiroに加えてPlaywright MCPとChrome DevTools MCPという2つのツールを組み合わせ、実際に「仕様書とテスト要件を一体化した開発」がどこまで自動化できるのかを検証しました。</p><hr><h2 id="%E6%A4%9C%E8%A8%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA"><strong>検証フェーズ</strong></h2><h2 id="%E6%A4%9C%E8%A8%BC%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F"><strong>検証の全体像</strong></h2><p>今回の検証では、以下の構成でテスト自動化を組み立てました：</p><ul><li>AIエージェント：Kiro</li><li>テストツール：Playwright MCP ＋ Chrome DevTools MCP</li><li>テスト対象：カウンターボタン（ボタンをクリックするたびに数字が増えるシンプルなWebアプリ）</li><li>↓以下画像</li></ul><figure class="kg-card kg-image-card"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAAQAElEQVR4AbT8idZlUXKch0X0e5oaaKEBdDcaljXRlPxktmzDtjxbtkjN80QNL1H6InKf8Z5zqwA1d2VmZEQOe5/bALHWv3rxN3/2b/wPP/7sf/s//viO9LRvYfK/s//3c9e/8Q1TW/6v/wKm59X/ux9/1to3TO3v6P9wze34T7gP7R/+kx+//dcH/yy18B3/yY8/K/9T4H/747fs+rN/eMXfbvx/Ex3/hqn9sv83P37b3jMm/zv6P1hzr/hf//htav/gCaP9if1f+6+4LzsXlpM/4J//g6Wnhv85/tuTb/w7/pc/pn7G//LHb/+18Af8V5d+wz//xlPb/b/40d5/9YzJ/0T+r6w9O/7n3If2r5ww+T81/89+/Hl3nzH58n/5FzA9v+B/0Z7/9MefL9z4X/zL0f7TH38n/JfW3Af+J7PvXwJTW/jnxWj/lPx//R//+IvccUG08hdM7Zf9P/rxF+39hqm9+L+49G+Y2u7/4Y+/aP4NU/v0v/wXr9ob3/Ti/+o/+PFTpOcv8L/EfxXTG9/6k4//+z9+julZ/te/gOl59X/vx1+29g1T+zv6H9fcjv8u96H98YSphe9Irfx/Hv6uO/7xj79c+Mj/6h//+N0f//GPv/yG1Fr/JfxHP35H3+/+avAvFw7/R9zzj6h/8T+s2i/jv/Pjd+n9wzdM7U/kv///cx+7LohWvjD5n8z/fz9+111nTP7iv1s6+Pvfk4O/W7jx30fDn/Hf/jH6Gf/tH7/7Xfiv4+9v/Rv//V/OngP/v9yH9pcnTP5Pzf8/P37f3Qv/InjyjX/D1H7Z/98/ft/eMyb/Rf/z1fcNU8P/8Bf0/vn/68fvyX8P/mFh8vgf0P7k+Nv/54/s/cPC3xfRFpYn/zv7/+NHd//2G6b24n+29G+Y2of/33/8odoTRvsT+b/wf+Medn3D1B78r27axr/jv/Vj6t/w3/rxh38hdfB/+Yx/ddaTL//Dwtab/19/TP4NU/tF//urb/DHX33g/4X76Pn7J0xP+I7Uyv8U+H/mDdmz8J9/QrTqC5PH//6NR/up/82Pv2rP3/z448I7/+M//zf0/A31v/nEf+5vRv+G1P4K/yP+V//c/+nHHx/wjxc9PX8i/2f/j9zHrguilS9M/ifz/8OPP3bXE6L9M/g/e/KNf8PUXv3f/PHH1s6Y/NP/+p+5ao/87/2bP6q/4v/+x19T++PfA7MviJf/LfCv6Y1vc8njd/7Xf+9/x33cteH/Ihz/hqn9Hf03stXzFelpfWHy3ZluvhAQbYWFV+5Fv6EZN30WAfsJUqZJeYbIg5uLBAOMZ90Togmn0VIy/BumtpwBTIxq0DuKY8Mt2QkbevGgBIkNikOvgYiD0gWl4RLYygemIo6dOr4jIt0xJVBSaheUVK45yZMVCZjSsGMSy7akw91cHOOCPSASliJ1KeHKrVn7hJZk2bhwUBybfCGQCi586RL5i2+zdFiSbfXfA1IVMk6HJZIYblxKsDgETCJgN6xC6Yxe/AEtjpV7pQNJlTM6mXGsPPnuJJhSCIqQ/BVZklrght55i8OsG3rxE+Y+3DbNlu0TJg1fKFFXT9qSBOk4dMTyouUPNNpyhpvtqKn5hMl/wRnELFaJmAULwwz38EZLRXFMBhAdwHdcSXYi68Ap2CDWAmg3aDi58Gg7SiqXDtQcWif5Ej9mM4SjW5ZAAmblH0G24diOkiLh4kQGNOhPTFHoO5rMSxncIiIGs05IXr4w+e5W7rVfUNHxB1RmJE1VnGSCj4tjPLYjM+XfkJrNBG7fkWk0TCJQBTUHgkkN0uCFSCNKF0zP8kBqD+hNt9R0YfI4z5FIigRM2vgFZ9BeSE0cv6JasTgETBkNJgnallMOktgWhgdPvvV8w9TilrDdxTHMC4GyC8+lUXdcXWmqDqeGSQQMxFLHMUitwXKxoSlBOUFTNeTsUNREBVP6QCmSclon2ZEEUx52w0gSYhPLtnLsG2rxHdOlxW7IbLsviFK+MPnyLLEtDH9ACR2XXpAZSYmWFvodvXrAZqDTbXGsvEOW3jHF1BcqaKIjPqA4RgeIDoAFcPiwxk3YcSV9EB3Bb06LUi9usyHaZW3yQq0z1Ku8kF2TJVra+I5Iin5CapWQN6wULqm5VCQWLf65LNk4jZ7sFLeehQ7i3zA1XBzbwnBLMYht2YZb+SfyA6Xh0o6SrDk/RXa1c6GdCXyhvfId6W5+xuTLgevlmV8iqU7F0vJkJrNE3NzJHdYA21CCxAaRQ/KsA61yLYRgUjnawk9eheoZk784Sy3JtizJtizJtizJ9qtTkCXZlsXZUYsvlE68nfBv6FUH2ZnpQlSLQ8C08eTL27dyylJC+DdM7dXF6YLBe/rB3U3iIWaimCR8R5JykB77J0hPbLqk4OZhk3t0dlmSbVmSbfXfjkszmEowtQtSKwclURZUg95RpkYAVhw+8VOtHjndF6RSvpA8d9EmOyT6FSkgxqLjwtMrzh1TQ9aOej/32fLZ7cyHL7etSFpowyUoGNu5ehalXrrQcqkf0BJD1vGPFIObEtmYRZuIKpram8tqj85IXr4wOS4aLcn9J04ylVk5Fi1JvqCl2Gq0S2S/oDjUqIombagcCJZs9zvXTEgbsqv5K0pKLYtuaCNiWh4qzhl/A7/ajx/DL4hWvjB5XOG0JydVEBq5EK1Jgu7l1fbjATMYPcjcuQMplUgHsr/6wuTL29ec7iBCngnrewYbuSgIpIdVk01kFGXqJHQkpnbDaezuVH7kMpILopUXW5xF4dDT8Nyzdg5Jw9nvxRtn51rOEDWs/BumtjlT+73RQl6wV6W+/P5rbfyC7MK+PInuNLA8kN+GlP6lc1d+SxildhSTRZ/np8pIehFaA2NbHhx+9Jb3MmYvSE95kC5yLE3cfeNQro1Rr61AgUvZQBKDAHc+zaltTtNsI0HD2lMciVhpx9R2J8H60GB2fWAEvB+VLeSB9J7weGvFW3U9gR2d/obU8p7+50XzBVmdMpCWQJG2YoTmJIPzqsRPPuoW88LsLk8zXxDOqmN3dLz6EzIzlmI3JiCFdzPrzgilmphGuibd4l3Y+I4r6YMYCp49u8N3XD3A8VEh+FpF9sW2poWn3fmq2UkNfThfRd7rJ5xbek/KSZ6xWyifkf3sGiXxcBqvFVqx3nnH9iLm3jiD9EW4v3n2U6Ql9TPvFvQzMh+K00385BUJ/Z9tMLsHMoEfD2J48Wik7d2wQwl4NGA9hrmQuz81RfshfQyiY10E5qvPLUgtVYPkebmtuHOmyNNYneb55ugpgGide8VMj6elUwSsYjC7B7MPGWHnyfH8brvWC6d303eklr7tLmjSANjKO+aeVHfMGDMYr8oVAAQrKdKzISnjifQNDKcBu4k0RDw70gyQRAfO/EFKx9FCA3a8DYKF95PS2ITfrsiL7pgeltJBpN74hkdXruk96WfnwekpR4klf0NmKfcFd4zIpgDOgvSSAcQz/9LVNuoX5NvKF5LnbpbyOSHcEKFpQwSagWkiiY6TrQLZG6e02day8yXkvmhPGG3zx56IvGKtyhOjZCS4+ZT5LSo8IR0MtbIje7MwpQ2prTRFfjMgdTyrV7k6lWJ2jp6sagJrwscjZMXGNt6dCXh2AN35jGyIpXFHNpaD3DjDLYZxDflatrKwX/RtYmHuyWQR7QMpRqPUdxSjLQfmUSSpAVd+iJMljufr+BgmzjxK+EJSLGTWQrArj4DnmSkUCVh35/8e5K7g1Mv4HIamo7tHTcez08rMqs0ofJLZTa2XsumM5K0H15JO7Zy56gvJp35wpBqbi0clnSdnZ2uR8lVPGO3Nsz21HSHYZWf2vvo+SNJBcKysAQ5il7XD+cIkfAdGPRwB0t8wo+TAy2/PSIo4U8ThyeMRgmxdX5AsPQvZnWzuIqOZyF0zSZkcBZ0kluEDp627E9J2xSpIZ2QfShZtatY88mlIaWu5IQ1YH/SEuScfsSPj5SdMDXpcUvIScklKC0+7qpSTgfnKriYPzm/MLR88+6I/YbdQ+IapjfcewlyRd7D3xEdHo8TS+dnIo9OGsSecbKyE9IRl4fRmSXmSN859KeO9B2QkkfvZk2wV+htFCt+RpBw89TIcxvJNH/o9rt7tAXfMPdF2zDZmMC6q9V748VZ6ykGsowsvfwDMHwp1+vPgwcnQLUtBvKjwSHeUWkIWJ+2AntFyisQDXZaoPQvDvZQLopUvTP7hVu63b6hwHFRqIl+oIjuFppwNhaIeN+rgS2BUOfYI9gnJbThuD2ohTJNLweGaU0J6wQu5F5UdBEnpw3NPctBFcaxJB5PHaRkdeeck1b8htQzaM+iNF1tpVt3h+MIUSJXRQU+OYInc+B2jLdcdV68km5okS3VxtjwIRTcu3Mqxn9CyTdlg4Geo1QeKYzwGWlasoSlBOWdMfvfVEzkLLkitfGHy3Ukw2ZpPgGA7l2W7g3ZQi59QS99RPaNqqQvZUf2GtqcveHHmyhdKsqfX3hBNQselG64ePWG0w5kUK1XF4ljh0g2NgiOrdfIdFUL9EY1qqXFDcZID1QcTBY/pfI7WUXsx6RmTvzmtSg2017KF9uLUYhu7ouUUiUVmTK5XFCUTYgvTmxQXDtXm4jTf0VPTCZO/ulZloZ8QDV2c3kUeZFB2iG7oxUE5ReKGkpiBHSipXHpFrWOvzoV2OH7G5Lsz2HwhoJ2H4IwTpRum7SxO2bRZanxAJFMbc9qSXhE5YveTX5BCuBdm0C6TbUk+/sEtLX7G5MtpwESrntFLPyHNtllg2YdDZHGiAdpRGn2hNFwCW3lHdrTrhtq51DxrohUlvaE4qaXhDVN7deZbE5EFmHJATIixE1p5VsI7mn7TYkmWbUmWbeXYN0SMEidV8HAvvpBZ02R79CL5GZNbso3fUBpN+kAZjcBYYsigdEMv/oAWx8oOaUMyq6c6+YEhlCI0bYggxqWE1HYUhx6ioinnzqMt30rQpt0V4pl+4LYl3A4mPaFECS6dUD1pTzJVadCPGDUuhoJ2Y4eaOalTxhdqoam9+dbzgEiYd2cL+UQrx+UiWjkWz0ryBS3F0rijZRvdO5IMFyc1IJoXBsKLX0Mn6Fh42iWhlZ9RUrRKCdKdp6yUcHHKd7SGn1BOlfiEWvpCWhzFZ05evjD57lbusxcqiL9idqR+wvRKxKuLw9rRDcHsSewzWrZTHSS34TgmxNigOIhUJQL2iTqO01TqRpUnX86uajuKQw1TeoO/6F2xzYAHnwX2QmrZ7eJk4hwcghlPy3e0Zu0Zk4+naE9ug+y07yhZErKK0gN6aTdkKIptiQ7bibItyQrYgyGkkZMOimN9cnGiq4F4wjL4CUUejxpUj9X7kjsB/0AErI1PKMQu+UQbjZVKjyR74+rZ2BUtr2qRmU9Eqb6QXLgdLlLjg+IsuRq0aJLRLScnvqNbbWToipqaz0gOF4d2bS4028JwS7UG0jN68aA4P0PRr57skH0+HQAAEABJREFUnqRRtrekaMMxCtKOJNWDkppLRXHCgYOH4LQTb7aJlluZKFgzdplcO66KT0hN4TtKw6Uzpvyb/rVQHP4syB8J+QtiIl4+2J5wPPn8ZZG/ppZnJH1nzL5wkL9Wpg2WUYTMAWedvPUT0gXL3pWxpFmkVM6YfHe6mn/D1JZ3F/kr3l6W3TwfIFLruwYj9LchuWB68PwA1clfkdnpI0kfwNNiXBLjZixZxLw8LeVJmGn+DVPDO5td5N21MHk89PKW9FKofsEU2NYCSC1v6DeSRyknH0NhhBg5Uq4pJsmazL4jkxSn55azpfqOXJFefpvR4cl3Z775wlMvMs+JjqNnsjvIgxRjyKnTXf0J20KI9cPzupAbsgclhWRFdgY3773pYU20lk886dVpxPrQG3Y2Yfm2+4rckno/KwvgvWAhEhYyKr3D5wtyb/dVpxI8+VZPzzirWl+47mWS1tlJuXcNolEkUmeGSvMNaSp/RWZSy44bZiFSoM5KMI0zU97QGyLCUr/xquhFPuiMkcMvSE95VpJgXAyJDjk/6mc5I50F8/sC7GEHyc7JY0vlNcPK2Z+vyY5XpKf1YtYzGTvxpmhZvuVBujOKzHbqRHjjgVN9jvtMNzHzgOnZnd3Nz5i8IvOT97fhgbDRuJ0kkQui8hu1DmJME1sabAyfSvehDTLPLFVWUievfkIKlNPXIfKFwNRIGG3hBVm3mtLArrweMVl2PCMb6WnrhLQiYrNmcabLb8hMvgWVvjYULzw9ce5ZHTD2E5GI5BSwNRueDQsp9I4dqTE42k/y/CLpBVl+uSuE6QDOcnrCgYMzyysYTZ3qE0fLW2iK0Z4+tlQPHj594eyrNURgDuDmtQROLfzs7KRA46oFUge5dUpUlwRHpZadM/rEaaA4b0v9xFlUfcespM4do8OTL+89ybPvFecOIu3E9H44e6vdsDvRdsx8+BfM2/F2ZSf5vD0z+ZYzzmLaaI8e3pSApcBI55+Q3XwUscUdmcTYxzqSxkdkrMUdV8K9zcDsj88bUJe28StyS+sLWd76BSFY2ujizRAim0mONzejKZgdwb4jvUsnRaLCcHsekVuqB2+9LOjcN0xtd3Y0X5i94WAVEONNfArW3QhB2tBLfh3ZQXNGWc/bn3i05b2nOfeAw8n5vViAkWfbmSffvUP0YdU+eeR9BUn5BeeO7e55dSI6zcnmm8K5h9mxxdPTtCGtJ2c68tZTjLacRbkXxkzjDbkvM/2s1OGZCY9n9wVXz3kmOc5ijDp57oRgWTAaJMYF4bOU6nAo18bgMSo1AjUmiEunaziRu6KuxUD68aUPhDMeQsp4R56RBoxFsQzRWwE+SFK938gSXjGcnISYPsbIloUkBac7O9rFm7DRI0C694bR4p1btfAZmZ0HZx0PoY07V60ZOuLnDD3VXzC13dcOlvS+YrRcCOaeagnDkbAz5x6UfksQj9Ju7rkie1NnfHQ4+WpjRUi0wbyJdlqH07DycDzFYziDU0fvLArCxPY1bch09v0UM4d330+R29ozmIugvCa8LFfC+YW4mEhOjQhtHG1Fhpu9IrOpMZz3kc7+8qca21pLoJ4bGUKFJOIXvt4cSO8dWROJkQB3j5C3RCgiDc5umrCKO5LM/ciTM83S0HLogSH4FEliJSQHNmMHizHu5v3ZkezAlOiMpfcRZ23KnaNnw98ofwakfsX++RB1YXp2jxxdjIDibPCIlmkRMSuKyjHKhiYx3J+IZCpj1iAwKQmWfHcr99gL9YRo1Rcm3519zc+YfLkXao5tuiXbyrEfEM1Gx+0bzpBQJWqDpOJAMBLpwCMTx6cKVGIHAbMkHPvA9Jz15G9+2pGx866dpwc3nvrgZOJcuNWuBNKSK1rdS8CoD7cHU7STj4tjk3/D1F59zWrhaRcjsqPjoBQkkmNJ9IHiWEsHxQkHVGwgPSE1owj/QIvTUOx99MVEGC6RqietF4dgSmNQBEwXjICnRznkgD2o9ErE4RPDJcTYCb34CbMHrxLEhdueuTNKlCxLshODuATHJUU93IufMflydjTbMfMoPmFq4TtSg2cxkjYXmicQTVMs6MUXllkqimMygOjAGUdQ7khpQ+06CaYUdiQpB4VvefC8ZOcRcVqJP7GtydksdYeLlh8wUvQnVE9XkD2jNfoJRb5cCz+VVXEQ/4ap7W7lPnuhgjioaCJfqCK7haacDYWiHjfq4EtYIHsy+4xe+kJqtllidKnBUjCgBukZvxalDqVnee6JBroojjXpYPI4bPQkOCMnbpXrCS1VX0heXpxMHO9czSwOAVN2D1qOjLAjiW1hePCL32fLJYtDwJoHUciNC7dyTHbBXIpmG9myvRCQNfSOWjoojg+3rFhD0wYpImkx+ZvvPeJAMBK1XZwPjoCJh2IK6swhdgXZwbTcUHeunlG1qgvZUf2GtqevSL4jc8n9gpIoi7Ke0bKEG3/D1CzRMTus4MY/0Ci48PZdMCT1hW2CX9AwIxoUx3jMHzzqxb3YjivpQ6gFv/rWI9nn2TNXz14uk6bbX9A0mbpPSIoyFh2exUl3jDYuzpI16AdEE04DMdnJtfIXdHQcFIcV9EtBcWw3ty3FipZtuJV/Ij9QGi7tqFaV4wT8jkg1+1qxw/FXZCw1WvSElJXaA6Zdp+K0JY67tURL5MbHHEq6oQSJDSKHBIpJ8N5HwGQbFyeIC0fTQpjsxCqyhBsPfnGv2o6emW1XcLkW2vTgw6ULimMJa3hEiXorL+ilg7kHpoUFOQsksBxKGvpzT2P6LxgBf1wmDrXGQdJaGQHTsc5J4Se0JHZjCxEgNijLtiTLtnLsO0pRljy5tNBXpMmSbMuSbKv/XnH1+IzJl0tiVJRJYtZwh8j8E+eKYV7qDUOZyQ7tSFZ9IXnrxQRJEZIu3DgFjILw1MS5Y2rI2lHv5zTLRumJR8NtOnA7mNYHlM4rlJP2Ay2HEM/oCx+WiIyRWe+Y2ptnKrUHRMIsG5e5wIn4IAK5OHeupYNWDysWjmCfkNRukH3DTEVbSFU0qQe9vIRwIfDaJr4gOyRqO4oTLtRBpZZ0R0nl6omcZNA64+W/AZim/GWQvyli/TPhA9KVPyVS7l9FofnDZAHtESPiGWPhau/fMaPCMxj+gEip0ISVgGyZlARL/uZ0597zjrx7eOLhbKKbJxFZR5IagA1PBwTb+UpyBzI/3wi5Y+cpLq++cpq5ia5wIDwwItmsIvlmW9MZky8PZOE3TO3Nc3Vq4DwTguWX2Hn24/NrJbahCmMPGDUbQFqxkmdkH4X8br2PMHl0ClkR7QHze6Zjc1p4S68qDk812guyu9Ud11Tb8wY4NYw2OLTLU8cx9Ig4BFucDFtkisThKWweMfnCpgSsvUVqr0gBy2/RdyWEXzAC3o9gV2pAfmcAo9a4IQQb1lfAFrKj+jeklvd0P80XZFM4Mi2J7AUwOHnqF5/fPLE9vH1D2sqmttRA1G9ILU+krXdesCTvSNMLpmc5XTxjYroh2J0jbXYv9SEUz5ie8GDuaQ4J0jqPJtk5eYyWwHffmvKr0bnt4J4q8Cvmq5ipNXD9hsxjjBDpQ05y5WyrfkKaYNxIQpx8i+yptpBZjDvTiwbBrhzhuDMkfQvZleZsf8bsbZVkQ+ZhMbYEdv/gx8XTc+F0h1+ctvKFQJ4YeMUWt8DOpmdMfnOW9Wsik49BsG28KSHPaZ38AxFav+A05n+P80v1ntTx7B4+leHJx+88u7uNgPEf0UzPbmZoSB6niNG1NMjcGN7FMxuRLoZrqUR6wXZSP2Py8d5LNdZtkUPOmHzz3LLlwY3viIhddmXfq++DJAxiJB3/GbaV32ZW89uMwM+WJDzIqvSwbL4V3gFw06nFphs9BL9y9qGxvNPZ1To7UhlOhtg8SCdlRk46O6qBlGPU152dSWFxUiaJ4RTJhieGBxHZEtauJugXpFK+MPnyvJXxKUQL+cAIeB6e69LzFVt8DtuOb5ja7qxpnifyBmh/MLBvB7fnpO1El8xvERE20zfO0CiJdNQaZqJpw8FDl2c1K6jlfTjZ8DS88PTgU+2GskfOmna8IoVYLqWxvwm8vxGYr2qeG+hB4prGA1Nj9tdszW4z7OzcBekpD1JNTtp33JHytuqOGeOR6cD7JUUCdvDJErM8EyckxSLOegh25RHw3kfAeCr70NJYznR/24VUp2e9JK3VyjNFgo1+5chsSUTPctLZfedsTB1vvdhm7l4IZFnuOWPknZdsoZ2QMyZ/8cj7IgjGMA9tHIz25h+zNPIdHdwwPbtnLz0AX088rCoBq1gkYLMuKjuHr+lwPD9Yf0PuuSKjqTM7ejheTsCy793nnonMsSv57CL74FkYHexbQJbTxnCtAekFW8kkg2kJP5zN6GcOpTsx3ee0WlqTnDH57iRYfr+ZheyPJe/sDaeRytLJfsXa3d10gwcnK19Iniv6G1dK4OuizygxvNCnJ1vljIYu3H6xQabQk49DsOSr0qvgYBUQu9yRe+IMYlRrDS+cfVSyhC7eFg6gPfPUxntP0mnMijCedhKSbo3Bs6c7/BumFs+e4MU38QW7m9qOGQ7niXxfrI+OlJ4iPRsmJQfa1qlyfiPw8t8AdLr486Bl6RVTSv0J1cPoF7RM1USDKvo9enV8w9Re3cp7bGeRnH/kQS20w0zdsnJ8Qy3+gFYPKxaOYJ8w+XIb/eRJlYBczJbwYgKeGqANk+++iWdMbtotddegZbg4g1781KJKlnaUdKnLKtcZLZUvTL5cHDfXisGTe+WvaOU++4zJl+uO7EuvOAudFKc1tvtIqQrtBdnR6itKooadUFLW4djk4kAwtZZwEClcORG/eErpvSBz5VeslIclATGJgGlHWbYlWbYlWbYlWbaVYzlA3LAU/oDMpMv21Bfaw23w4pId7QUl6rj0gsxKSrR0QXG8lKCSc9cVxaFqoHWQfLXpE1MU+kI9IVp1J0orvqOO45XuuJI+hFow0gUR4DZIixbaz/wma3Ut9BVpdnaiGle5dSCpLGQRQ2STmRRUMflySUte6E+UhKrpa6Yjrpo0mg9sVk4GitMd5EGo7BDd0IuDcorEDSUxAztQ5p84G5Iu88IN7KU8IrXoF2ey/AWR1+VKW6hYExzuRc9oykb3JyKZypj1iMjVT5i74hkI2hYmKYi/YjuoPmG0m3vxHT2zc5ls+HIIZgZ8oDipA4jyBTVcGqSIKefAyTwdRFM+3F75jpTpiilhlZM+ujjpAVpPKCdgCn9xVxfHuGDgWAhcSkD6gtY8/Yym3+iWZNmWZNlWjm2ZxE7U5NJP0FNnxpJsy5Jsq//OmDyeilfPBaNJlGOiVZR3HnLwZkhn9OIPaHGs7JQ2JLN6qidfbpNgekNRTO0Vs5aeQHqKEzZ1mKbaXZLA1p8QrfUnlCgxGUtdgqtn0Ru3TNVEg1rohWJo8hU3vuNMQNUOw795ulIHx6xtVmaW4OWiYOVYDhA/cGzkX7cAABAASURBVATROh0fHCG2GuwQWhfa4YeT6csy/fx0A20Lsx923UkN3bJiIlfSV5Smrp60JRm0PjBFoe9oMj8qiBg164Tk5QuT727lPnuhFpaTl58xO8JPmB7lLJ3UeOwD2Vv9ES3bImAbSpDYoDj0UFXEQc2BYJMnljTAzpj8xSOLgOkNU8N5RlvSFi9vIo61cduLL9QZBQt/QoliTDntImCKOOiksgdJMPLwJ5emLr2jJEsv7qVbObbhOKhkIEy2JVkDC7XQVHCopn7i4lDDJIInEH1wWAlofMuDVs5EpdaUgCnnCaPtToIpD9uRBG6Dwhfa5N05aC+Mhg9TJpTzyJmpfkGU8oXJl2eZbWG4sxbU4dLk0gtalnDjGyZfzuKVUSfz6gGbgZhoU05wc1GwEyR7oZ7QqE7TYOPGxTEKQHTg5FlbugoHPwlJt0Lwm2dZ6hcMwbMH2GzoRO1vM5k4C9nV7BUl2wRsR0mR8A9ESJsXrv8GIH8K5K+H/E2QPxASyfPnwvkL8Z2nJf1PKE76Af40mTV0ZRXCSU9teYpUgMYHZAOLsKnlagi2OHMf2n0mPctzL8Owmf/gzEabF9MTjueOaJ0NR9g46fxWS08PnuHRue2Vd0laM8zNiwMhTKLHcsnC1FIEuz959t9wZjM33l7SXgZu/DrKFLX0VGfn9EVvgdJPMDPLASyz6+2MYuwIx7kEg68eCLZ4tJ94tjNA18ys32TuiMod0eKI+RYgUzi1yyz9J051dkbDIdjq2fksDqUYy9iBuYULmRq9PCziQrRkacj7nnBb2Hvoj01f7j979oazkbRzGcK7+44sqv6KvYWFC9mJhTCBnH1A7hk99x5ePT2vzqrWXpDdlHvXYHbTi7Lz5Jsj0sG1jc+Ynt3Z1fyMyXNxkD18WH+jHaOV9FYu+YLsmSpJ5oBwxtme0QhghcGkvIm2xRHKv2PfmG3pBd/4KrO7TbmGp/A2aMRmNL0itfYVM0pnn5Zw50dt2hfn1oOjlS9MHqch31A1eTX23zG1XF2ke8/prXbH9Hx6v6m7qYHD1+z+2zRJlYQ+9pPQyqUkeS9w5fRU/yVkmr5eAGJ5AL70FHpV7kZ74FQoJNLIgmQ8iM4nzmp6KNKS+p0zjUwxlmIx35MxBHh6xnfOwvZ8YDtQF7KbSXaE4yxFgkddHKG7dqSWvl/x/BLpe8A8gk0BPMu5b7IV4cwS+55XpCfvoylGG1tZF0IJjpUHSbDUuASDYFQw5lBaO2PyzU8L0105gR0bJ2VXjYAagTnshdNA8fiGE2d39R2zgp3r9wSooJEwxdOP2sHRsp/O7PrbObszy7KZCz95d8IvyH3lC5Nvnl3JwU6B7QKH50NQuI+PiUU+IYVY+ndMfwl9N+QuROLSycK3pai5EI/BsGRtS5J7FrYUvjy/R3b9rZBd088LsqecgA3Nt0B4QDkBJaze+5It/c6z++pzD+20somPmDx6fNMWnnZ3zxOPFmcRlozd7EqW/XeMhverGMDoR4hBeg+IiFV8x1nCDSTM0M3FvB3K0Ojk1YP0AO0J5i4Ilg7mUn/x9raNEGtfRkM2zA42U8OS5Bk3pJ+XdV8QZ5qIzhAboInhpKk0bWAftaTpLdKz5/da+Mm764Fvel6aXWdMLTx4rz3xaA/Ow7Hjbkgsjz+Qe0L4rNG5cwylRqCHLdRj4WELubfqDbNz9AzTi0WbNggWPj4991p5H9NmWl8wPXheBWD01RpOfN0j8bR2D9LG8tji1Li8//OyMPmjdyX9r7hq8wruWDx79xm08oXJ45kJXjxPTN8Zk29+1BjHFicb42Ozr4RaEE/Ghr7vijwydcZGh2c+HM9vQnnmThwh7UBF8k/s7Axn6fSSkSQCzJBNZAU5YiYg8+LhdORNqQTx6l8wd8dnhF1dQeCONZYVlFctGWXYSYfRTEx1fOOvmKczkV3pKUbb/F4LP3luyRyYh1ABGrtgsokUYvmiG7YVPZgHLESZ34R57sjQr/L0xtmWZWzC2DGcPHYjQxPx9r4gte5+xFyXuTNyWSR85sLzTSC/W74JRumH1n8D0FL+LKiFyXeX1FwqikMbcae6cC/6Dc246bMI2E+QMk3KM0Qe3FwkGGA8654QTTiNlpLh3zC15QxgYlSD3lEcG27JTtjQiwclSGxQHHoNRByULigNl8BWPjAVcezU8R0R6Y4pgZJSu6Ckcs1JnqxIwJSGHZNYtiUd7ubiGBfsAZGwFKlLCVduzdontCTLxoWD4tjkC4FUcOFLl8hffJulw5Jsq/8ekKqQcToskcRw41KCxSFgEgG7YRVKZ/TiD2hxrNwrHUiqnNHJjGPlyXcnwZRCUITkr8iS1AI39M5bHGbd0IufMPfhtmm2bJ8wafhCibp60pYkSMehI5YXLX+g0ZYz3GxHTc0nTP4LziBmsUrELFgYZriHN1oqimMygOgAvuNKshNZB07BBrEWQLtBw8mFR9tRUrl0oObQOsmX+DGbIRzdsgQSMCv/CLINx3aUFAkXJzKgQX9iikLf0WReyuAWETGYdULy8oXJd7dyr/2Cio4/oDIjaariJBN8XBzjsR2ZKf+G1GwmcPuOTKNhEoEqqDkQTGqQBi9EGlG6YHqWB1J7QG+6paYLk8d5jkRSJGDSxi84g/ZCauL4FdWKxSFgymgwSdC2nHKQxLYwPHjyrecbpha3hO0ujmFeCJRdeC6NuuPqSlN1ODVMImAgljqOQWoNlosNTQnKCZqqIWeHoiYqmNIHSpGU0zrJjiSY8rAbRpIQm1i2lWPfUIvvmC4tdkNm231BlPKFyZdniW1h+ANK6Lj0gsxISrS00O/o1QM2A51ui2PlHbL0jimmvlBBEx3xAcUxOkB0ACyAw4c1bsKOK+mD6Ah+c1qU+gVDtMuyera2EsLcZJlcxCJNJh9uwDCfkBRlLDqcmXLohpXCJTWXisSixT+XJRun0ZOd4taz0EH8G6aGi2NbGG4pBrEt23Ar/0R+oDRc2lGSNeenyK52LrQzgS+0V74j3c3PmHw5cL0880sk1alYWp7MZJaImzu5wxpgG0qQ2CBySJ51oFWuhRBMKkdb+MmrUD1j8hdnqSXZliXZliXZliXZfnUKsiTbsjg7avGF0om3E/4NveogOzNdiGpxCJg2nnx5+1ZOWUoI/4apvbo4XTB4Tz+4u0k8xEwUk4TvSFIO0mP/BOmJTZcU3Dxsco/OLkuyLUuyrf7bcWkGUwmmdkFq5aAkyoJq0DvK1AjAisMnfqrVI6f7glTKF5LnLtpkh0S/IgXEWHRceHrFuWNqyNpR7+c+Wz67nfnw5bYVSQttuAQFYztXz6LUSxdaLvUDWmLIOv6RYnBTIhuzaBNRRVN7c1nt0RnJyxcmx0WjJbn/xEmmMivHoiXJF7QUW412iewXFIcaVdGkDZUDwZLtfueaCWlDdjV/RUmpZdENbURMy0PFuaI1/IRyuojmD4D5qyJ/FeTPgeJviBh/NowWrx452kIgcgE5eOdXOX9rTNcZ0xEe5Mq1IErST2SeVizNfWqeF28/hf5VM4gQPTsOLGM2CKSHlZNNZBRl6iR0JKZ2w2nsG1LJvR/IxdWLVMEuBDsOorJ83VcRZUPSwzbxBbsrteWBXPYNU9s8FyXfEYLxuFrD4r0qu5ev1zPZBtQHRMLOa+ibkdHZkoTlgfywpPQvne78ljBK7Sgmi86mdOCMEKsjBgGU6OPDsyl8OvYdvRS9SM+OTJFjKXL3jUNzSbcRMPoi4hA2kcQgwJ1Pc2qb05SFgWDkHRHLbxhtdxKsDw3usxCs983HkFa4LYNmBjjeCsEeu9lV/RtSy3v6W9N8wexFA9ISKEbKWITmJIPzqsRPPuoW+cC1CyXNfNe+s5yOIF79CZkZS5H+IcRw9pKNCidPDOe5WOrA2abhUDa+40r6INqCZ+eOftSOqwcYnWStSAvsJ3Zrzl0ZBPt6sN8DDoeRt2XCXMuayLnsO3YLbWdkmF2jJB5O47VCK9Y779hexNwfZ5C+CPc3z36KtKR+5t2CfkbmQ3G6iZ+8IqH/sw1m90Am8ONBDC8ejbS9G3YoAY8GrMcwF3L3p6Zom6c/+cKkWQjmq5OmEkSaO5LgeV5qxZ0zRZ7G6gzON0dPAUTr3CtmejwtnSJgFYPZPZh9yAg7T47nd9u1Xji9m74jtfRtd0GTBsBW3jH3pLpjxpjBeFWuACBYSZGeDUkZT6RvYDgN2E2kIeLZkWaAJDpw5g9SOo4WGrDjbRAsvJ+Uxib8dkVedMf0sJQOIvXGNzy6ck3vST87D05POUos+RsyS7kvuGNENgVwFqSXDCCe+ZeutlG/IN9WvpA8d7OUzwnhhghNGyLQDEwTSXScbBXI3jilzbaWnS8h90V7wmibP/ZE5BVrVZ4YJSPBzafMb1HhCelgqJUd2ZuFKW1IbaUp8psBqeNZvcrVqRSzc/RkVRNYEz4eISs2tvHuTMCzA+jOZ2RDLI07srEc5MYZbjGMa8jXspWF/aJvEwtzTyaLaB9IMRqlvqMYbTkwjyJJDbjyQ5wscTxfx8cwceZRwheSYiGzFoJdeQQ8z0yhSMC6O//3IHcFp17G5zA0Hd09ajqenVZmVm1G4ZPMbmq9lE1nJG89uJZ0aufMVV9IPvWDI9XYXDwq6Tw5O1uLlK96wmhvnu2p7QjBLjuz99X3QZIOgmNlDXAQu6wdzhcm4Tsw6uEIkP6GGSUHXn57RlLEmSIOTx6PEGTr+oJk6VnI7mRzFxnNRO6aScrkKOgksQwfOG3dnZC2K1ZBOiP7ULJoU7PmkU9DSlvLDWnA+qAnzD35iB0ZLz9hatDjkpKXkEtSWnjaVaWcDMxXdjV5cH5jbvng2Rf9CbuFwjdMbbz3EOaKvIO9Jz46GiWWzs9GHp02jD3hZGMlpCcsC6c3S8qTvHHuSxnvPSAjidzPnmSr0N8oUviOJOXgqZfhMJZv+tDvcfVuD7hj7om2Y7Yxg3FRrffCj7fSUw5iHd2R34RaBkeHUysHL/8NQPM3QfHnQtsqKpj0jlJLyOKkHdAzWk6ReKDLErVnYbiXckG08oXJP9zK/fYNFY6DSk3kC1Vkp9CUs6FQ1ONGHXwJjCrHHsE+IbkNx+1BLYRpcik4XHNKSC94IfeisoMgKX147kkOuiiONelg8jgtoyPvnKT6N6SWQXsGvfFiK82qOxxfmAKpMjroyREskRu/Y7TluuPqlWRTk2SpLs6WB6HoxoVbOfYTWrYpGwz8DLX6QHGMx0DLijU0JSjnjMnvvnoiZ8EFqZUvTL47CSbejymoM5dlV5AdTMsNtfiO6hlVS13Ijuo3tD19wYszV75Qkj299oZoEjou3XD16AmjHc6kWKkqFscKl25oFBxZrZPvqBDqj2hUS40bipMcqD6YKHhM53O0jtqLSc+Y/M1pVWqgvZYttBenFtvYFS2nSCwyY3K9oiiZEFuY3qS4cKg2F6f5jp6aTpit5QOKAAAQAElEQVT81bUqC/2EaOji9C7yIIOyQ3RDLw7KKRI3lMQM7EBJ5dIrah17dS60w/EzJt+dweYLAe08BGecKN0wbWdxyqbNUuMDIpnamNOW9IrIEbuf/IIUwr0wg3aZbEvy8Q9uafEzJl9OAyZa9Yxe+glpts0Cyz4cIosTDdCO0ugLpeES2Mo7sqNdN9TOpeZZE60o6Q3FSS0Nb5jaqzPfmogswJQDYkKMndDKsxLe0fSbFkuybEuybCvHviFilDipgod78YXMmibboxfJz5jckm38htJo0gfKaATGEkMGpRt68Qe0OFZ2SBuSWT3VyQ8MoRShaUMEMS4lpLajOPQQFU05dx5t+VaCNu2uEM/0A7ct4XYw6QklSnDphOpJe5KpSoN+xKhxMRS0GzvUzEmdMr5QC03tzbeeB0TCvDtbyCdaOS4X0cqxeFaSL2gplsYdLdvo3pFkuDipAdG8MBBe/Bo6QcfC0y4JrfyMkqJVSpDuPGWlhItTvqM1/IRyqsQn1NIX0uIoPnPy8oXJd7dyn71QQfwVsyP1E6ZXIl5dHNaObghmT2Kf0bKd6iC5DccxIcYGxUGkKhGwT9RxnKZSN6o8+XJ2VdtRHGqY0hv8Re+KbQY8+CywF1LLbhcnE+fgEMx4Wr6jNWvPmHw8RXtyG2SnfUfJkpBVlB7QS7shQ1FsS3TYTpRtSVbAHgwhjZx0UBzrk4sTXQ3EE5bBTyjyeNSgeqzel9wJ+AciYG18QiF2ySfaaKxUeiTZG1fPxq5oeVWLzHwiSvWF5MLtcJEaHxRnydWgRZOMbjk58R3daiNDV9TUfEZyuDi0a3Oh2RaGW6o1kJ7RiwfF+RmKfvVk9ySNsr0lRRuOUZB2JKkelNRcKooTDhw8BKedeLNNtNzKRMGascvk2nFVfEJqCt9RGi59IELaUtgw6KXP/x+A+dMgPn9R5C+E5Pkr43D+Vlh+RkGw+18W33j+oomzuYPBzXtPatxRjR0fGG13qs2/YWrLL7vRPjjfEW17WXY3J2D5DZB4ZiK9vBP5ytHSh4jR943PMH0k6QO4PsbyWOYPMS8OS6XITPNvmBreWdb1MnDeyBbyXEgLq+gqX0ih+gXbwJqF1Bj85NFpYRO1diREXTx3U00Pl2DoTzzai7Mt30F1ZrsyjKtYyGo6yKPXVw21ta0HpLx20FM+2P3hOMay6HRDsAdeiRDjllrD3No0gT0o0wUnz13hm+885da5F4y1J/rFIRgf0vIZt7eOxt0jQDuwkLHqJ5zLiPSNUawR2NMnnTDzeJXgybkEo7JrWRG+kF35Zq6ZvnJqO67evIYmWLLDszfsFdmVWmZvyIWx3VlDnsaZKW+YWynCUr/xquhFHn7GyOEXpKf8uCe7aYvwt3NWdRbM7wjMPMnOyWNzZd4+rDy/SS7+htRyR/cx9ISrhbux9gwSM8oN3Bs9Gc0w9MYo777PdBMzD5ie3dnZ/IzJKzI/+XwDeW5e76EI47cpP2FSPEYpMH1k3fOB7G3jQvL2nTB3xZH4oLytSwhYRKS5hASjqdaweNrK28hdQcRk3f3ImaCnpQlpRcSyF0854iMyk2/JHUGmaC0rlqcnzgLWJcNXBQGjNxzfes5IQ3Yj0cdukuG/kPfnow9keO7NvnLuQ4GuOHxKUeHcRWQ0nD1PHC3voSlGe/rYUj14+PSFs6/WEIE5gJesJXBq4WdnJwUaVy2QOsitU6K6JDgqteyc0SdOA8V5W+onzqLqO2Ylde4YHZ58ee9Jnn2vOHcQaSem98PZW+2G3Ym2Y+bDv2DejrcrO8nn7ZnJt5xxFtNGe/TwpgQsBUY6/4Ts5qOILe7IJMY+1pE0PiJjLe64Eu5tBmZ/fN6AurSNX5FbWl/I8tYvCMHSRhdvhhDZTHK8uRlNwewI9h3pXTopEhWG2/OI3FI9eOtlQee+YWq7s6P5wuwNB6uAGG/iU7DuRgjShl7y68gOmjPKet7+xKMt7z3NuQccTs7vxQKMPNvOPPnuHaIPq/bJI+8rSMovOHdsd8+rE9FpTjbfFM49zI4tnp6mDWk9OdORt55itOUsyr0wZhpvyH2Z6WelDs9MeDy7L7h6zjPJcRZj1MlzJwTLgtEgMS4In6VUh0O5NgaPUakRqDFBXDpdw4ncFXUtBtKPL30gnPEQUsY78ow0YCyKZYjeCvBBkur9RpbwiuHkJMT0MUa2LCQpON3Z0a4fP5KOHoE3du8No8XTHNydC5tfkHXlwbkvcdYnQ8/+9oTj5S+Y2u5rlmW9txgty0C+klaemcJwJOzMuQeFJiJ648IMh+/I3vIT0rrKrAihFiHpQgq5HK94ILtae8B8D5swZhKzC9ysKtpPkZ7c0X3k3zFP4/dgafu4jJG8LivCinQcOOr0EFvbkOHyV7zeR9vs7f1PNba1lkA99zCECknEL5zHpSfwhKxJiZEAd49wfDs8lga8+gMyOPfTOznr0geUXzAETy9vIsNKLliFHSzG+K70wpNl52BKdMaoTUvIWZ+1KXeO8o4M9JtumN3R578B2D8JWipKG9po4mzwiJZpEXHaTSbOGb34AyI5ExaxASSflARLvruVe+yFekK06guT786+5mdMvtwLNcc23ZJt5dgPiGaj4/YNZ0ioErVBUnEgGIl04JGJ41MFKrGDgFkSjn1ges568jc/7cjYedfO04MbT31wMnEu3GpXAmnJFa3uJWDUh9uDKdrJx8Wxyb9haq++ZrXwtIsR2dFxUAoSybEk+kBxrKWD4oQDKjaQnpCaUYR/oMVpKPY++mIiDJdI1ZPWi0MwpTEoAqYLRsDToxxywB5UeiXi8InhEmLshF78hNmDVwniwm3P3BklSpYl2YlBXILjkqIe7sXPmHw5O5rtmHkUnzC18B2pwbMYSZsLzROIpikW9OILyywVxTEZQHTgjCMod6S0oXadBFMKO5KUg8K3PHhesvOIOK3En9jW5GyWusNFyw8YKfoTqqcryJ7RGv2EIl+uhZ/KqjiIf8PUdrdyn71QQRxUNJEvVJHdQlPOhkJRjxt18CUskD2ZfUYvfSE12ywxutRgKRhQg/SMX4tSh9KzPPdEA10Ux5p0MHkcNnoSnJETt8r1hJaqLyQvL04mjneuZhaHgCm7By1HRtiRxLYwPPjF77PlksUhYM2DKOTGhVs5JrtgLkWzjWzZXgjIGnpHLR0Ux4dbVqyhaYMUkbSY/M33HnEgGInaLs4HR8DEQzEFdeYQu4LsYFpuqDtXz6ha1YXsqH5D29NXJN+RueR+QUmURVnPaFnCjb9hapbomB1WcOMfaBRcePsuGJL6wjbBL2iYEQ2KYzzmDx714l5sx5X0IdSCX33rkezrrL1x9QyVlrrQX9A0m7pPSIoyFh2exUl3jDYuzpI16AdEE04DMdnJtfIXdHQcFIcV9EtBcWw3ty3FipZtuJV/Ij9QGi7tqFaV4wT8jkg1+1qxw/FXZCw1WvSElJXaA6Zdp+K0JY67tURL5MbHHEq6oQSJDSKHBIpJ8N5HwGQbFyeIC0fTQpjsxCqyhBsPfnGv2o6emW1XcLkW2vTgw6ULimMJa3hEiXorL+ilg7kHpoUFOQsksBxKGvpzT2P6LxgBf1wmDrXGQdJaGQHTsc5J4Se0JHZjCxEgNijLtiTLtnLsO0pRljy5tNBXpMmSbMuSbKv/XnH1+IzJl0tiVJRJYtZwh8j8E+eKYV7qDUOZyQ7tSFZ9IXnrxQRJEZIu3DgFjILw1MS5Y2rI2lHv5zTLRumJR8NtOnA7mNYHlM4rlJP2Ay2HEM/oCx+WiIyRWe+Y2ptnKrUHRMIsG5e5wIn4IAK5OHeupYNWDysWjmCfkNRukH3DTEVbSFU0qQe9vIRwIfDaJr4gOyRqO4oTLtRBpZZ0R0nl6omcZND6QJmyif7A+W8A8tfB/MWQvynWmvNXxPyFkInRSPoXxidEi009f1ssy1aScJbBkmXZBSmVX5Cu8o7Pc8KfPHujg2Ns4yHELglujpCWLmXkhKlAsdFPfAmspIq+ku23KUZb/sEzldoFQ/C1m+yLbU1nTL48kK/6hqm9eW5ODZxnQjC+tL97cPP8jskHJ2OM2ztwwqipg5SwkmdkG4X8br2fMHl0ClkR7QHzwHRsTgtv6FXF4alGe0F2t7rjmmp73gCnhtEGh3Z56jiGHhGHYIuTYYtMkTg8hc0jJl/YlIC1t0jtFSlg+S36roTwC0bA+xHsSg3I7wxg1Bo3hGDD+grYQnZU/4bU8p7up/mCbApHpiWRvQAGJ0/94vObJ7aHt29IW9nUlhqI+g2p5Ym09c4LluQdaXrB9Cyni2dMTDcEu3Okze6lPoTiGdMTHsw9zSFBWufRJDsnj9ES+O5bU341Orcd3FMFfsV8FTO1Bq7fkHmMESJ9yEmunG3VT0gTjBtJiJNvkT3VFjKLcWd60SDYlSMcd4akbyG70pztz5i9rZJsyDwsxpbA7h/8uHh6Lpzu8IvTVr4QyBMDr9jiFtjZ9IzJP71fEzmLwXJwG29KyHPaQv6BCK1fcBrzv8f5pbo3dTy7h09lePLxO8/ubiNg/Ec007ObGRqSxylidC0NMjeGd/HMRqSL4VoqkV6wndTPmHy891KNdVvkkDMm3zy3bHlw4zsiYpdd2ffq+yAJgxhJx3+GbeW3mdX8NiPwsyUJD7IqPSybb4V3ANx0arHpRg/Br5x9aCzvdHa1zo5UhpMhNg/SSZmRk86OaiDlGPV1Z2dSWJyUSWI4RbLhieFBRLaEtasJ+gWplC9MvjxvZXwK0UI+MAKeh+e69HzFFp/DtuMbprY7a5rnibwB2h8M7NvB7TlpO9El81tEhM30jTM0SiIdtYaZaNpw8NDlWc0KankfTjY8DS88PfhUu6HskbOmHa9IIZZLaexvAu9vBOarmucGepC4pvHA1Jj9NVuz2ww7O3dBesqDVJOT9h13pLytumPGeGQ68H5JkYAdfLLELM/ECUmxiLMegl15BLz3ETCeyj60NJYz3d92IdXpWS9Ja7XyTJFgo185MlsS0bOcdHbfORtTx1svtpm7FwJZlnvOGHnnJVtoJ+SMyV888r4IgjHMQxsHo735xyyNfEcHN0zP7tlLD8DXEw+rSsAqFgnYrIvKzuFrOhzPD9bfkHuuyGjqzI4ejpcTsOx797lnInPsSj67yD54FkYH+xaQ5bQxXGtAesFWMslgWsIPZzP6mUPpTkz3Oa2W1iRnTL47CZbfb2Yh+2PJO3vDaaSydLJfsXZ3N93gwcnKF5Lniv7GlRL4uugzSgwv9OnJVjmjoQu3X2yQKfTk4xAs+ar0KjhYBcQud+SeOIMY1VrDC2cflSyhi7eFA2jPPLXx3pN0GrMijKedhKRbY/Ds6Q7/hqnFsyd48U18we6mtmOGw3ki3xfroyOlp0jPhknJgbZ1qpzfaMMUWVRaTEadvP8NQPO3QfFnw0GRmoChKemO6glN8ozOCD6olYU94bDnXQAAEABJREFUulfHN0zt1a28w3YWyflHHtRCO8zULSvHN9TiD2j1sGLhCPYJky+30U+eVAnIxWwJLybgqQHaMPnum3jG5KbdUncNWoaLM+jFTy2qZGlHSZe6rHKd0VL5wuTLxXFzrRg8uVf+ilbus8+YfLnuyL70irPQSXFaY7uPlKrQXpAdrb6iJGrYCSVlHY5NLg4EU2sJB5HClRPxi6eU3gsyV37FSnlYEhCTCNiBsmxLsmzrE6soh46A3KhntKvbg1poD7fBi7On/AWlrJAl0aZP9GhES40biuOlBJU8Sy4oDlUD1UHy1aZPTFHoC/WEaNWdKK34jjqOV7rjSvoQasFIF0SA2yAtWmg/85us1bXQV6TZ2YlqXOXWgaSykEUMkU1mUlDF5MslLXmhP1ESqqavmY64atJoPrBZORkoTneQB6GyQ3RDLw7KKRI3lMQM7ECZf+JsSLrMCzewl/KI1KJfnMnyF0RelyttoWJNcLgXPaMpG92fiGQqY9YjIlc/Ye6KZyBoW5ikIP6K7aD6hNFu7sV39MzOZbLhyyGYGfCB4qQOIMoX1HBpkCKmnAMn83QQTflwe+U7UqYrpoRVTvro4qQHaD2hnIAp/MVdXRzjgoFjIXApAekLWvP0M5p+o1uSZVuSZVs5tmUSO1GTSz9BT50ZS7ItS7Kt/jtj8ngqXj0XjCZRjolWUd55yMGbIZ3Riz+gxbGyU9qQzOqpnny5TYLpDUUxtVfMWnoC6SlO2NRhmmp3SQJbf0K01p9QosRkLHUJrp5Fb9wyVRMNaqEXiqHJV9z4jjMBVTsM/+bpSh0cs7ZZmVmCl4uClWM5QPzAEUTrdHxwhNhqsENoXWiHH06mL8v089MNtC3Mfth1JzV0y4qJXElfUZq6etKWZND6wBSFvqPJ/KggYtSsE5KXL0y+u5X77IVaWE5efsbsCD9hepSzdFLjsQ9kb/VHtGyLgG0oQWKD4tBDVREHNQeCTZ5Y0gA7Y/IXjywCpjdMDecZbUlbvLyJONbGbS++UGcULPwJJYox5bSLgCnioJPKHiTByMOfXJq69I6SLL24l27l2IbjoJKBMNmWZA0s1EJTwaGa+omLQw2TCJ5A9MFhJaDxLQ9aOROVWlMCppwnjLY7CaY8bEcSuA0KX2iTd+egvTAaPkyZUM4jZ6b6BVHKFyZfnmW2heHOWlCHS5NLL2hZwo1vmHw5i1dGncyrB2wGYqJNOcHNRcFOkOyFekKjOk2DjRsXxygA0YGTZ23pKhz8JCTdCsFvnmWpXzAEzx5gs6ETtb/NZOIsZFezV5RsE7AdJUXCPxBh2qxgGoOw8qKO2P8G4PylmL8I7n9h5C+EsQ8uTvoA/nqY8vNfHOlJHc+fJctofkY2pLbuI2WEzp2f87fe9CznznwPbPZ8cHZE4xOmJxzPfdF4AGlnoUWkImMLmRzxFzhb6MV6SXYzlFXwGEqtAR1kJJVAvqX5LCBNHYfziuHk3VlkamFnp5U+jHz6pidtqEgUIO3PC8h3/YlHWw5gvCQryJaxMxtwdmHw1QPBFo/2E2dh3kXXzPTpYWt3+OZ5A8uBTOFbD/3Vr0h1dqaGQ7DVs/Msj3ZGJucS7iCpNSxOPxnLiOiNC7M3/IbpZesA9djOZzQUh2BpnBWQJHh+p9FHK2fRd2QlPXwdMXPhsEkh+ZbwE667uveUh396VjCbfe298VnN3dFxMtoS8ymD50iRbdQanzE9u7Oz+RmT5+Ige9bbuKb7CFhFpJ8he6aLZHaxlXlodMab8YYdo4WD+b3aXF6B8Wds7yxJZIy+ZJkFt/qi1CvyijsyRxOv7V0fSC3D3ddWOhZmWfRpqZhWfPXQ0NoFqZUvTB6nsbu2vMiT7tg+9CI7eu03TO3TeWQ2A9TISBKB8NNvhMoVEVoj+Y7rXTRhTH7lbKPOFfkg+q8csZaQtmB7CRuf1yauu6hlUZRPZEMG25pw50whd+6E/c8lnN2Tpy/CIJGRxhuyPzP5rCAj7SpS4y2ka2ZxhLlj40yk71c896TvAbkeY1dqZGMnHp1Zbu17XpGevI+mGG3s4M0hlOBYeZAES227L0gFYy7kPhRt81Mt3ZUT2LlxUnbVCKgRmMNeOA0Uj284cXZX3zEr2Ln/NvDkm2dP8gvSX74w+S87+9t7xuTL+y7yC3JP+cLkm2dXcrBTYLvA4X18/+NJWHLSlMH8NqQpJC2y4Q25iyFim3dkA8Yc15E0FmkrATGkxmKzdU93rrz/+ZD/ErJ8+rKyG7MKNTzAmyovzN6+Gg6mudnS7zy7r569TLBz9PCz32rc0b5vmFo8b8je5ux8w/Tg/bptBqSd5+f+cQhGI7W8AYLd+CzJKBcy98TRmCKmZWXsjNC9mS5nPvji7c1462sXfNMHs4PN9GBJeDPAHQdnqHwhOduIcJrYAE0MJ02laQP7qCVNb5GePb/Xwk/eXQ9803lqvoO1c094ahvmnuTfMLUHZyF23A2J5fEHsjsk9w+S1RrWSxghG0MnYSuTRO5t9YbZNXramMGiTRsECx+fnnutnLvaA+Z3mp0dRl5IrXoQiVeFwkpOuO4BGEYn4RKMfqZ+aGHy8fbRkLsfvSvofcVV4zZew7rFs3OfQStfmDyemeDF88T0nTH55keNcWxxsjFekX0l1IJ4Mjb0fVfkkakzNjo88+F4fhPKM3fiCGkHKpJ/YmdnOEunl4wkEWCGbCIryBEzAZkXD6cjb0oliFf/grk7PiPs6goCd6yxrKC8askow046jGZiquMbf8U8nYnsSk8x2ub3WvjJc0vmwDyECtDYBZNNpBDLF92wrejBPGAhyvwmzHNHhn6VpzfOtixjE8aO4eSxGxmaiLf3Bal19yPmusydkcsi4TMXnm8C+d3yTTBKbShuvJie5b/hj4HS/IlwUBzjWGRAunAv+g0t0WV8zKGkL4hMUb2PPLh5xMmdVESVi8xZa9m48OLSpCj4E0Zb7jt6Ztgljg23ZCds6MWDEiQ2KA69BiIOSheUhktgKx+Yijh26viOiHTHlEBJqV1QUrnmJE9WJGBKw45JLNuSDndzcYwL9oBIWIrUpYQrt2btE1qSZePCQXFs8oVAKrjwpUvkL77N0mFJttV/D0hVyDgdlkhiuHEpweIQMImA3bAKpTN68Qe0OFbulQ4kVc7oZMax8uS7k2BKIShC8ldkSWqBG3rnLQ6zbujFT5j7cNs0W7ZPmDR8oURdPWlLEqTj0BHLi5Y/0GjLGW62o6bmEyb/BWcQs1glYhYsDDPcwxstFcUxGUB0AN9xJdmJrAOnYINYC6DdoOHkwqPtKKlcOlBzaJ3kS/yYzRCOblkCCZiVfwTZhmM7SoqEixMZ0KA/MUWh72gyL2Vwi4gYzDohefnC5Ltbudd+QUXHH1CZkTRVcZIJPi6O8diOzJR/Q2o2E7h9R6bRMIlAFdQcCCY1SIMXIo0oXTA9ywOpPaA33VLThcnjPEciKRIwaeMXnEF7ITVx/IpqxeIQMGU0mCRoW045SGJbGB48+dbzDVOLW8J2F8cwLwTKLjyXRt1xdaWpOpwaJhEwEEsdxyC1BsvFhqYE5QRN1ZCzQ1ETFUzpA6VIymmdZEcSTHnYDSNJiE0s28qxb6jFd0yXFrshs+2+IEr5wuTLs8S2MPwBJXRcekFmJCVaWuh39OoBm4FOt8Wx8g5ZescUU1+ooImO+IDiGB0gOgAWwOHDGjdhx5X0QXQEvzktSv2CIdpl3VZqHSuJV3khuyZLtLTxHZEU/YTUKiFvWClcUnOpSCxa/HNZsnEaPdkpbj0LHcS/YWq4OLaF4ZZiENuyDbfyT+QHSsOlHSVZc36K7GrnQjsT+EJ75TvS3fyMyZcD18szv0RSnYql5clMZom4uZM7rAG2oQSJDSKH5FkHWuVaCMGkcrSFn7wK1TMmf3GWWpJtWZJtWZJtWZLtV6cgS7Iti7OjFl8onXg74d/Qqw6yM9OFqBaHgGnjyZe3b+WUpYTwb5jaq4vTBYP39IO7m8RDzEQxSfiOJOUgPfZPkJ7YdEnBzcMm9+jssiTbsiTb6r8dl2YwlWBqF6RWDkqiLKgGvaNMjQCsOHzip1o9crovSKV8IXnuok12SPQrUkCMRceFp1ecO6aGrB31fu6z5bPbmQ9fbluRtNCGS1AwtnP1LEq9dKHlUj+gJYas4x8pBjclsjGLNhFVNLU3l9UenZG8fGFyXDRakvtPnGQqs3IsWpJ8QUux1WiXyH5BcahRFU3aUDkQLNnud66ZkDZkV/NXlJRaFt3QRsS0PFScK1rDTyini/iEWvrgb/hDYP60iAvPXwyDOJY/SALojfwlceFAR1OcqfxtMYVglA1vHZRSyfCBzFVfmHx5+5rTHUTIu2B9z2AjFwWB9LBqsomMokydhI7E1G44jd2dSv6a+oE8oHqRKtiFYMdBVJav+yqibEh62Ca+YHeltjyQy75hapvnouQ7QjAeV2tYvFdl9/L1eibbgPqASNh5DX0zMjpbkrA8kB+WlP6l053fEkapHcVk0dmUDpwRYnXEIIASfXx4NoVPx76jl6IX6dmRKXIsRe6+cWgu6TYCRl9EHMImkhgEuPNpTm1zmrIwEIy8I2L5DaPtToL1ocF9FoL1vvkY0gq3ZdDMAMdbIdhjN7uqf0NqeU9/a5ovmL1oQFoCxUgZi9CcZHBelfjJR90iH7h2oaSZ79p3ltMRxKs/ITNjKdI/hBjOXrJR4eSJ4TwXSx042zQcysZ3XEkfRFvw7NzRj9px9QCjk6wVaYH9xG7NuSuDYF8P9nvA4TDytkyYa1kTOZd9x26h7YwMs2uUxMNpvFZoxXrnHduLmPvjDNIX4f7m2U+RltTPvFvQz8h8KE438ZNXJPR/tsHsHsgEfjyI4cWjkbZ3ww4l4NGA9RjmQu7+1BRt8/QnX9iUUGtIobt/JEPqfWCeV4k82nB+q3CEg0eIvpBa516x102VEWz/CSKeeX7P4exnaTkXBzN0rm38AzOHb7tXGkDKhrznBbmr1R0zRi82Ojy18B2jLQe4JDHtJ2QAu4nUI54d6XkBBfowkuc1KexvohHLb9N16BgdiE34fYusumMH0HdkDGOSGL2wV0dnX2R2lV+QWjmVWPI3ZAfl7r5jRDYFcBaklwwgnvmXrrZRvyDfVL6QPHezlJ8vhBsiNG2IQDMwTSTRcbJVIHvjlDbbWna+hNwX7Qmjbf7YE5FXrFV5YpSMBDefMr9FhSekg6FWdmRvFqa0IbWVpshvBqSOZ/UqV6dSzM7Rk1VNYE34eISs2NjGuzMBzw6gO5+RDbE07sjGcpAbZ7jFMK4hX8tWFvaLvk0szD2ZLKJ9IMVolPqOYrTlwDyKJDXgyg9xssTxfB0fw8SZRwlfSIqFzFoIduUR8DwzhSIB6+78v825Kzj1Mj6Hoeno7lHT8ey0MrNqMwqfZHZT66VsOiN568G1pFM7Z676QvKpHxypxubiUUnnybo+d3gAABAASURBVNnZWqR81RNGe/NsT21HCHbZmb2vvg+SdBAcK2uAg9hl7XC+MAnfgVEPR4D0N8woOfDy2zOSIs4UcXjyeIQgW9cXJEvPQnYnm7vIaCZy10xSJkdBJ4ll+MBp6+6EtF2xCtIZ2YeSRZuaNY98GlLaWm5IA9YHPWHuyUfsyHj5CVODHpeUvIRcktLC064q5WRgvrKryYPzG3PLB8++6E/YLRS+YWrjvYcwV+Qd7D3x0dEosXR+NvLotGHsCScbKyE9YVk4vVlSnuSNc1/KeO8BGUnkfvYkW4X+RpHCdyQpB0+9DIexfNOHfo+rd3vAHXNPtB2zjRmMi2q9F368lZ5yEOvojvwm1DI4Opxa+Y5piB68VvrfALT5S2FsRybLQSwyoGe0nCLxQJclas/CcC/lgmjlC5N/uJX77RsqHAeVmsgXqshOoSlnQ6Gox406+BIYVY49gn1CchuO24NaCNPkUnC45pSQXvBC7kVlB0FS+vDckxx0URxr0sHkcVpGR945SfVvSC2D9gx648VWmlV3OL4wBVJldNCTI1giN37HaMt1x9UryaYmyVJdnC0PQtGNC7dy7Ce0bFM2GPgZavWB4hiPgZYVa2hKUM4Zk9999UTOggtSK1+YfHcSTLwfU1BnDrEryA6mZdBeqDuqZ1St6kJmqt/Q9vQFL85c+UJJ9vTaG6JJ6Lh0w9WjJ4x2OJNipapYHCtcuqFRcGS1Tr6jQqg/olEtNW4oTnKg+mCi4DGdz9E6ai8mPWPyN6dVqYH2WrbQXpxabGNXtJwisciMyfWKomRCbGF6k+LCodpcnOY7emo6YfJX16os9BOioYvTu8iDDMoO0Q29OCinSNxQEjOwAyWVS6+odezVudAOx8+YfHcGmy8EtPMQnHGidMO0ncUpmzZLjQ+IZGpjTlvSKyJH7H7yC1II98IM2mWyLcnHP7ilxc+YfDkNmGjVM3rpJ6TZNgss+3CILE40QDtKoy+UhktgK+/IjnbdUDuXmmdNtKKkNxQntTS8YWqvznxrIrIAUw6ICTF2QivPSnhH029aLMmyLcmyrRz7hohR4qQKHu7FFzJrmmyPXiQ/Y3JLtvEbSqNJHyijERhLDBmUbujFH9DiWNkhbUhm9VQnPzCEUoSmDRHEuJSQ2o7i0ENUNOXcebTlWwnatLtCPNMP3LaE28GkJ5QowaUTqiftSaYqDfoRo8bFUNBu7FAzJ3XK+EItNLU333oeEAnz7mwhn2jluFxEK8fiWUm+oKVYGne0bKN7R5Lh4qQGRPPCQHjxa+gEHQtPuyS08jNKilYpQbrzlJUSLk75jtbwE8qpEp9QS19Ii6P4zMnLFybf3cp99kIF8VfMjtRPmF6JeHVxWDu6IZg9iX1Gy3aqg+Q2HMeEGBsUB5GqRMA+UcdxmkrdqPLky9lVbUdxqGFKb/AXvSu2GfDgs8BeSC27XZxMnINDMONp+Y7WrD1j8vEU7cltkJ32HSVLQlZRekAv7YYMRbEt0WE7UbYlWQF7MIQ0ctJBcaxPLk50NRBPWAY/ocjjUYPqsXpfcifgH4iAtfEJhdgln2ijsVLpkWRvXD0bu6LlVS0y84ko1ReSC7fDRWp8UJwlV4MWTTK65eTEd3SrjQxdUVPzGcnh4tCuzYVmWxhuqdZAekYvHhTnZyj61ZPdkzTK9pYUbThGQdqRpHpQUnOpKE44cPAQnHbizTbRcisTBWvGLpNrx1XxCakpfEdpuPSBCGlL4Yw+68llVZMWG+x/A3D7S+OByp8J+4fIJPtfFvsHRP6SeMf8RROn0sHg5lnSnCWD3Rh5JthFaXhzun6K6VmeLSyAsaPxhuu+7WXZ3ZyA5ZuROgN9xuzHKWJ0k2cOgt34LEEnSR/AE2N5CJj+Q8yLw1pMwkzzb5ga3lnW9TJw3sQSci6qnEArK+mOTqH8gimkvpAaA4zeeHQkOqm1IyHq4rmbanq4BEN/4tFenG35Dqoz25VhXMVCVtNBHr2+aqitbT0g5bWDnvLB7g/HMZZFpxuCPfBKhBi31Brm1qYJ7EGZLjh57grffOcpt869YKw90S8OwfiQls+4vXU07h4B2oGFjFU/4VxGpG+MYo3Anj7phJnHqwRPziUYlV3LivCF7Mo3c830lVPbcfXmNTTBkh2evWGvyK7UMntDLoztzhryNM5MecPcShGW+o1XRS/y8DNGDr8gPeXHPdlNW4S/nbOqs2B+R2DmSXZOHpsr8/Zh5flNcvE3pJY7uo+hJ1wt3I21Z5CYUW7g3ujJaIahN0Z5932mm5h5wPTszs7mZ0xekfnJ5xvIc/N6D0UYv035CZPiMUqB6SPrng9kbxsXkrfvhLkrjsQH5W1dQsAiIs0lJBhNtYbF01beRu4KIibr7kfOBD0tTUgrIpa9eMoRH5GZfEvuCDJFa1mxPD1xFrAuGb4qCBi94fjWc0YashuJPnaTDP+FvD8ffSDDc2/2lXMfCnTF4VOKCucuIqPh7HniaHkPTTHa08eW6sHDpy+cfbWGCMwBvGQtgVMLPzs7KdC4aoHUQW6dEtUlwVGpZeeMPnEaKM7bUj9xFlXfMSupc8fo8OTLe0/y7HvFuYNIOzG9H87eajfsTrQdMx/+BfN2vF3ZST5vz0y+5YyzmDbao4c3JWApMNL5J2Q3H0VscUcmMfaxjqTxERlrcceVcG8zMPvj8wbUpW38itzS+kKWt35BCJY2ungzhMhmkuPNzWgKZkew70jv0kmRqDDcnkfklurBWy8LOvcNU9udHc0XZm84WAXEeBOfgnU3QpA29JJfR3bQnFHW8/YnHm1572nOPeBwcn4vFmDk2XbmyXfvEH1YtU8eeV9BUn7BuWO7e16diE5zsvmmcO5hdmzx9DRtSOvJmY689RSjLWdR7oUx03hD7stMPyt1eGbC49l9wdVznkmOsxijTp47IVgWjAaJcUH4LKU6HMq1MXiMSo1AjQni0ukaTuSuqGsxkH586QPhjIeQMt6RZ6QBY1EsQ/RWgA+SVO83soRXDCcnIaaPMbJlIUnB6c6OdvEmbPQIkO798YMWhMWjxRExdmw6F0anc/Ry1u1Ib3Juv/YsPXtS+4ap7c7u5mdM3kuyiXeEc1utoToBC8/dJ6wKD7KbaXZsnL3VT0hptU0fnCRjAAQjKR9EyECcXdUeML9jbplBYvtHSWRLxEx+x8zh3fdTzCp+D5a3n4sY6R1Bqn0uHQemhw5GGlvbMobKX5GNqTGc+0hnb/lTjW2tJVDPPQyhQhLxC+dx6Qk8IWtSYiTA3SPkLRGKSIOzmyas4o4kcz/y5EyzNLQcemAIPkWSWAnJgc3YwWKMu3l/diQ7MCU6Y+l9xFmbcufo2ZGd/bYb5o5dT21zZqfGvWi/YbX4k6By5i+I0hXzd0NxQAMy/+5oBKP7E5FMZcwaBCYlwZLvbuV+e6GeEK36wuS7s6/5GZMv90LNsU23ZFs59gOi2ei4fcMZEqpEbZBUHAhGIh14ZOL4VIFK7CBgloRjH5ies578zU87MnbetfP04MZTH5xMnAu32pVAWnJFq3sJGPXh9mCKdvJxcWzyb5jaq69ZLTztYkR2dByUgkRyLIk+UBxr6aA44YCKDaQnpGYU4R9ocRqKvY++mAjDJVL1pPXiEExpDIqA6YIR8PQohxywB5VeiTh8YriEGDuhFz9h9uBVgrhw2zN3RomSZUl2YhCX4LikqId78TMmX86OZjtmHsUnTC18R2rwLEbS5kLzBKJpigW9+MIyS0VxTAYQHTjjCModKW2oXSfBlMKOJOWg8C0PnpfsPCJOK/EntjU5m6XucNHyA0aK/oTq6QqyZ7RGP6HIl2vhp7IqDuLfMLXdrdxnL1QQBxVN5AtVZLfQlLOhUNTjRh18CQtkT2af0UtfSM02S4wuNVgKBtQgPePXotSh9CzPPdFAF8WxJh1MHoeNngRn5MStcj2hpeoLycuLk4njnauZxSFgyu5By5ERdiSxLQwPfvH7bLlkcQhY8yAKuXHhVo7JLphL0WwjW7YXArKG3lFLB8Xx4ZYVa2jaIEUkLSZ/871HHAhGoraL88ERMPFQTEGdOcSuIDuYlhvqztUzqlZ1ITuq39D29BXJd2QuuV9QEmVR1jNalnDjb5iaJTpmhxXc+AcaBRfevguGpL6wTfALGmZEg+IYj/mDR724F9txJX0IteBX33ok+zprb1w9N6qpeuETWmLI8glJy09IT6Udqc2IcpasQT8gmnAaiMlOrpW/oKPjoDisoF8KimO7uW0pVrRsw638E/mB0nBpR7WqHCfgd0Sq2deKHY6/ImOp0aInpKzUHjDtOhWnLXHcrSVaIjc+5lDSDSVIbBA5JFBMgvc+AibbuDhBXDiaFsJkJ1aRJdx48It71Xb0zGy7gsu10KYHHy5dUBxLWMMjStRbeUEvHcw9MC0syFkggeVQ0tCfexrTf8EI+OMycag1DpLWygiYjnVOCj+hJbEbW4gAsUFZtiVZtpVj31GKsuTJpYW+Ik2WZFuWZFv994qrx2dMvlwSo6JMErOGO0TmnzhXDPNSbxjKTHZoR7LqC8lbLyZIipB04cYpYBSEpybOHVND1o56P6dZNkpPPBpu04HbwbQ+oHReoZy0H2g5hHhGX/iwRGSMzHrH1N48U6k9IBJm2bjMBU7EBxHIxblzLR20elixcAT7hKR2g+wbZiraQqqiST3o5SWEC4HXNvEF2SFR21GccKEOKrWkO0oqV0/kJIPWB8qUTfQDaukLaXEUD58/APJXQXH6F8YnRItNPX8/LOPvhxtmQfQHREolzQfy18fqzAe/OYO595glQyB2SXBzBLrZSWQlSSoANjwdEGznK2ElKvWVzF9PF4+2vPrK+1fYTIVfMARfu8m+2NZ0xuTLA3xPjNfUGs568jfPzamB80wIlh077/L8Vils2A6mnrBypxIy9Y7soyG/W+8jTB6dAqvKH3D7fdMVpyXX7D58KmwLpXbj3Ncv2DFtdLdtITWMNviUyUnowSaHsjy2OBVsEaolC5NvjjRTJGhYZy44JWJLV6QRy28xayBYG3dMgvcjMk0O5HcFsMVnwYrdQO2G7Gj3N6SW93Q/zRdkYzgyLYnsBzA4eeoXn988sT28bkPayqa21EDUb0gtT6Std16wJO9I0wumZzldPGNiuiHYnSNtdi/1IRTPmJ7wYO5pDgnSOo8m2Tl5jJbAd9+a8qvRue3gnirwK+armKk1cP2GzGOMEOlDTnLlbKt+Qppg3EhCnHyL7Km2kFmMO9OLBsGuHOG4MyR9C9mV5mx/xuxtlWRD5mExtgR2/+DHxdNz4XSHX5y28oVAnhh4xRa3wM6mZ0z+6f2ayFkMHpwF5QvJhedZbSXfkaT6Bach/3ucX6p7U8fZSEx9KsOTj995dqf7wLUtAs25Y/P+5xcdj1ZOzyeuu1iMpYM3FR5wOubWzIUf3nsyFekNU9s812x5cOM7ImK5KeuKTSL5EahOAAAQAElEQVQ++T5IQh0jmbEkX3hL/Fazni8cgZ8rSXiQVelh13wrvAPgplOLTTd6CH7l7ENjeaezq3V2pDKcDLF5kE7KjJx0dlQDKceorzs7k8LipEwSwymSDU8MDyKyJaxdTdAvSKV8YfLleSvjU4gW8oER8Dw816XnK7b4HLYd3zC13VnTPE/kDdD+YGDfDm7PSduJLpnfIiJspm+coVES6ag1zETThoOHLs9qVlDL+3Cy4Wl44enBp9oNZY+cNe14RQqxXEpjfxN4fyMwX9U8N9CDxDWNB6bG7K/Zmt1m2Nm5C9JTHqSanLTvuCPlbdUdM8Yj04H3S4oE7OCTJWZ5Jk5IikWc9RDsyiPgvY+A8VT2oaWxnOn+tgupTs96SVqrlWeKBBv9ypHZkoie5aSz+87ZmDreerHN3L0QyLLcc8bIOy/ZQjshZ0z+4pH3RRCMYR7aOBjtzT9maeQ7OrhhenbPXnoAvp54WFUCVrFIwGZdVHYOX9PheH6w/obcc0VGU2d29HC8nIBl37vPPROZY1fy2UX2wbMwOti3gCynjeFaA9ILtpJJBtMSfjib0c8cSndius9ptbQmOWPy3Umw/H4zC9kfS97ZG04jlaWT/Yq1u7vpBg9OVr6QPFf0N66UwNdFn1FieKFPT7bKGQ1duP1ig0yhJx+HYMlXpVfBwSogdrkj98QZxKjWGl44+6hkCV28LRxAe+apjfeepNOYFWE87SQk3RqDZ093+DdMLZ49wYtv4gt2N7UdMxzOE/m+WB8dKT1FejZMSg60rVPl/EYbpsii0mIy6uQpJbvj1vEb/hgou38OBNOmn6BlCTcuTvCLW/RZc8ULmp5X98zOAsFkN3ao2YWLExXQhiJTjxt18CWwQjn2CPYJky+30U+eVAnIxVmSKEUT545Ih92L4ePOguxeODyTVqUJOrWMTll4dUnFnXu4zmipfGHy5eK4uVYMntwrf0Ur99tnTL5cd2RfesVZ6KQ4rbHdR0pVaC/IjlZfURI17ISSsg7HJhcHgqm1hINI4cqJ+MVTSu8FmSu/YqU8LAmISQTsQFm2JVm2JVm2JVm2lWNZVwyTrDkXZCbc9tQX2sNt8OKSHe0FJeq49ILMSkq0dEFxvJSgknPXFcWhaqB1kHy16RNTFPpCPSFadSdKK76jjuOV7riSPoRaMNIFEeA2SIsW2s/8Jmt1LfQVaXZ2ohpXuXUgqSxkEUNkk5kUVDH5cklLXuhPlISq6WumI66aNJoPbPY/UXZu264jO44F+v//uXoCpGRJltfOE4skCPASYWd2Pnh0VZWTgeJ0B3kQKjtED/RyUE6ReKAkZmAflPkT50DSNS8eYK/yitSi35zJ8h+IvJcrbaFiTXC4l17RlI3ub0QylTHrFZGrXzB3xTMQtC1MUhD/ie2g+obRHu7lJ3pm5zLZ8HUIZgb8QXFSBxDlG2q4NEgRU84HJ/N0EE354/bmJ1KmK6aELSd9dXHSA7SeUE7AFP7DXV0c44KBYyFwKQHpD7Tm6Vc0/Ua3JMu2JMu2cmzLJHaiJpf+gZ46M5ZkW5ZkW/27YvJ4Kt6eG0aTKMdEqyifPOTDmyFd0ctf0OJY2SkdSGb1VE++bpNg+oWimNpPzFp6AukpTjjUYZpqd0kCW39DtNbfUKLEZCx1Ca6epQ9umaqJBrXoRTE0+caDnzgTULXD8L88XamDY9YxKzNL8LooWDmWA8QvHEG0TscXR4htgx1C66Id/nEy/bFM/z7dQNti9sPuO6mhW1ZM5Er6E6WpqydtSQatL0xR6CeazK8KIkbNuiB5+WLy063cZy9qsZy8/IrZEX7B9ChndVLjsS9kb/VXtGyLgB0oQWKD4tBDVREHNQeCTZ5Y0gC7YvIfHlkETL8wNZxntCVt8fIm4lgHt718UVcULPwNJYox5bSLgCnioJPKHiTByMPfXJq69BslWfrhXt3KsQ3HQSUDYbItyRpY1KKp4FBN/cLFoYZJBE8g+sNhJaDxIw9aOROVWlMCppw3jHY6CaY87EQSuA0KX7TJu3PQXoyGD1MmlPPKmal+Q5TyxeTrWWZbGO6sBfVxaXLpB1qWcOMHJl9n8WbUybw9YDMQE23KCR4uCnaCZC/qDY3qNA02HlwcowBEBy6etaVb+PCLkPQoBP/yLEv9hiF49gCHDZ2o820mE2eRXc1+omSbgJ0oKRL+hQjTZgXTGISVF3WN7ZClVe/4+N8BKA6/F+bnQX49zA+S77840pM6np8ly2h+Rzakxs78Yk3KCJ0nv+a/etOzzp3d8xPZkdp8Eu4Kx3NfNB5Aip4YPXsHGRs9PTgEo488d0KwJ+9S9EUghC6WxshqDVwBpocs0L3JuSPdmT2Ql5HSnxreXmh7wINTog9DS2040+Hsnr7wCP8BM7MOYJlhP9larkkKbo1LsQdP7R/OlryPrpnlSxnOfSycF5NXB08tEwcnr35HqrMzNRyCbc/JZ3EoxVjGPsj7xnhJLYEdFRfJk2Uwb3/DY2HvoT82fbn/6tkfzkbSzmUI7+4nsqj6T+wtLFxkJxbCBHL2Abln9Nz78erp+emsau0Hspty7xrMbnpRTp78cEQ6uLbxHdNzOruaXzF5Lg6yhw/W7+jEaCW9lUv+QPZMlSRzQDjjbM9oBLDCYFLeRNtyhPK/sW/MtvSCv/iW2d2mXMNTeBs0YjOafiK19hUzSmeflvDkn9q0L+fWD0crX0wepyGfoWryaux/Ymq5ukj3mdNb7Ynp+fZ+pu6mBg7f2fO7aZIqCX3sJ6GVS0nyXuDO6an+n5Bp+noBiOUB+Oop9KrcjfbCqVBIpJEFyXgQnW+c1fRQpCX1J2camWIsxWI+T8YQ4OkZPzkL2/OF7UBdZDeT7AjHWYoEj7ocobtOpJa+/+L5JtL3gnkEmwJ4lnPfZBvhzBL7np9IT95HU4w2trIuhBIcKw+SYKlxCQbBqGDMobR2xeSHXxamu3ICOw5Oyq4aATUCc9gPTgPFz2e4cHZXPzEr2LnfJ0AFjYQpnv6pfTha9tOZXf+bszuzLJu58It3J/yG3Fe+mPzw7EoOdgpsFzg8HwSF+/gwscgXpBBL/4npL6HvgdyFSFydLPxYipoL8RgMS9a2JLlnsaXw9Xwf2fU/IbumnxdkTzkBG5rPAuEB5QSUsHrvS7b6k2f33ece2mllEx9i8ujxQ1u87O6eNx4tziIsGbvZlSz7nxgN76diAKMfIQbpPSAiVvE3zhJuIGGGbi7m7VCGRievHqQHaE8wd0GwdDCX+g9vb9sIsfZlNOTA7GAzNSxJnvFA+nlZ9wVxponoDLEBmhhOmkrTBvZRS5reIj1n/qyFX7y7Xvih56XZdcXUwoPP2huP9uI8HPvcDYnl8R/knhA+1ujcOYZSI9DDFuqx8LBF7q36wOwcPcP0YtGmDYKFj0/Ps1bex7SZ1h+YHjyvAjD6ag0XvvcALEMn4RKMpzJNe3WE/LsSXw6k/uJdgf4Tt8Zts3557jhn0MoXk8czE7x5npq+KyY//FNjHFtONsYrsq+EWhBPxoZ+zjvyyNQZGx2e+XB8viMqaLTNPDoJIlYd4QU7O0NZygh9ZCSJwPCJ7IrKnvIbopQvkjOM/ea5Oz7X8+nbSuCOHWc+d26Nxuo3TA2PdjhNVX4iO1PjqtxPOveUv9XYRtP0kueecDCDVZ6cWvTW2cvWpPlkiyjVgyQxdtBAveR/RgayjJvZsruisQ0dLfYgQxNxZs43Z8uVk3fXK7K++hW5bFZGzOgH2d3vcpEC9dyMs4eYysezJ+wH/j+uEj8NKie/JAqSXwv/xnR4Or2dfyE1mtX95MHDI07upCKqXGSe3bbDZAdXkxRm6QWjrdOAiVEN+kRxbLglO+FALw9KkNigOPQaiDgo3VAaLoGtfGEq4tip4yci0h1TAiWldkNJ5ZqTPFmRgCkNJyaxbEv6uJuLY1ywF0TCUqQuJdy5NWvf0JIsGxcOimOTLwKp4MJXl8h/+DFLhyXZVv9ekKqQcToskcRw41KCxSFgEgF7YBVKV/TyF7Q4Vu6VPkiqnNHJjGPlyU8nwZRCUITkP5ElqQUe6JO3OMx6oJdfMPfhtmm2bF8wafiiRF09aUsSpOOjI5YXLX+h0dYZbnaipuYLJv8PziBmsUrELFgMM9zDGy0VxTEZQHQAP3GT7ETWB6dgg1gLoN2g4eTCo50oqVz6oObQOskf8Ws2Qzi6ZQkkYFb+CLINx06UFAkXJzKgQX9jikI/0WReZfCIiBjMuiB5+WLy063ca/9ARcdfUJmRNFVxkgk+Lo7x2InMlP+F1GwmcPuJTKNhEoEqqDkQTGqQBm9EGlG6YXrWA6m9oA/dUtPF5HGeI5EUCZh08BvOoL1ITRz/RLVicQiYMhpMErQtpxwksS0MD1786PkLU4tbwk4XxzAvAmU3nkujnrhdaaoOp4ZJBAzEUscxSK3BcrGhKUE5QVM15OpQ1EQFU/pCKZJyWic5kQRTHvbASBJiE8u2cuwHavmJ6dKyBzLb7huilC8mX88S28LwF5TQcekHMiMp0dKif6O3B2wGOt0Wx8o7ZOk3ppj6ooImOuILimN0gOgAWACHD2s8hBM36YPoCP7ltCj1G4bolPVYqT0je8uL7LJMh9EtHfxEJEW/ILVKyAdWCpfUXCoSixZ/Lks2TqMnu8SjZ9FB/C9MDRfHtjDcUgxiW7bhVv5E/kFpuHSiJGvOP5Fd7Vy0M4Ev2pufSHfzKyZfB+6XZ35FUl2KpeXJTGaJeLiTO6wBdqAEiQ0ih+RZH7TKtQjBpHK0xW9eheoVk/9wllqSbVmSbVmSbVmS7Z9OQZZkWxbnRC1flC68nfC/0FsH2ZnpQlSLQ8B08OTr7ducspQQ/hem9tPF6YLBZ/rF3U3iIWaimCT8RJJykB77H0hPbLqk4OFhk3t0dlmSbVmSbfXvxNUMphJM7YbUykFJlAXVoE+UqRGAjcMnfqvVI6f7hlTKF8lzF22yQ6LfkQJiLDouPL3iPDE1ZJ2o3+c5Wz67nfnwdduKpEUbLkHB2MnVs5R66aLlUr+gJYaszx8pBjclsjGLNhFVNLVfLqs9uiJ5+WJyXDRakvsnTjKVWTkWLUn+QEuxbbRLZP9AcahRFU06UDkQLNnpT66ZkA5kV/OfKCm1LHqgjYhpPVScO1rDLyini/iGWn2RFiwEXUoIz87g/ADIr4Pi8AMiMb8pFvjdMJjfFJ+YgejB9F+QNJUMf5D56ovJ19vXnO4gQt4B45fN2X384hmBlnTg7CK+8akkZv6BGUDKHQArR8gdJ6dYXkQFuYpledVygOHKExBmFcnVDvEHZncXpI5jXFRreOPRDs9VyU+EYG+zvepy134aJjtA5QWRsLd19GeULWlgeaDfSZLwIF35LumiVKGYLDob0oHninQFx6c2efqHHz2jnDu4r/UiPSeikmMsiv7g0FzebQSMvog4hAmSGAR48mlO7XCasjAQMWfx6gAAEABJREFUjHwiYvkDo51OgvElzepzFhGrOB+GtMJjGTQzwOetEOy1m13V/0JqeU+/a5pvmL1oQFoCxUgZi9CcZHBelfjNRz0iH3B3oaSZz3XuLKcjiFd/Q2bGUqR/CDGcvWSjwskTw3kuljpwtWn4KAc/cZM+iLbg1bmjH+rE7QFGJ9kVaYH9wx7NuSuDYF8P9vOAw2HkbZkw17Imci77G7uFtisyzK5REj9O471CK9Y7n9hexNwfZ5C+CM83z36KtKR+5d2CfkXmQ3G6id+8IqH/boPZPZAJ/PMghpdHI23vgR1KwKMB+xjmQp7+1hTt8PQnX2xKqDWk0N2wYu+D5Hkp/h95tOF8V+EIHx4h+iK1zv3EzzVp6RQBayGY3YPsZVm+15NTDM/3dmr0HPwLqaXvuAuaNAC28hu5K4/qfelqOwEbnTXpCT8x2jrAWGLaL8gA9hCpR7w60vsCCvRhJO9rUjjfRCOW76br0DE6EJvwPRdZ9cQOoJ/IGMYkMXrhrI7OvsjsKr8htXIqseS/kB2Uu/uJEdkUwFmQXjKAeOV/dLWN+g35TOWL5LmbpXx9IdwQoWlDBJqBaSKJjpNtgewXp3TY0XLyFXJftDeMdvhrT0ResavyxCgZCR4+Zb6LCm9IB0OtnMjeLEzpQGqbpsh3BqSOZ/WWq1MpZufoyaomsCZ8PEJWHOzg3ZmAZwfQne/IhlgaT2RjOciNM9xiGNeQ77LNwv6jHxOLuSeTRbQvpBiNUt9RjLYOzKNIUgPu/CNOljieT8eHYeLKo4QvkmIhsxaC3XkEPM9MoUjAujv/rcxdwamX8XEYmo7uHjUd704rM1ubUfgks5taL2XTFclbD+6STp2cueqL5FP/cKQam4ufSjovzs7WIuVTvWG0X57tqZ0IwW47s/enn4MkHQTHyhrgIHZbO5xPmITPgVEPR4D0O8woOfDju2ckRZwp4vDk8QhBtu4nSJaeRXYnm7vIaCZy10xSJkdBJ4ll+IPT1t0JabtjFaQrsg8liw41a175NKR0tDyQBqwPesPckw9xIuPlF0wN+rmk5EfIJSktXnZVKScD8ym7mjw43zG3fPHsi/6G3ULhL0xtvPcQ5oq8g70XPjoaJZbO10YenTaMPeFkYyWkFywLpzdLypP84tyXMt57QEYSuZ89ybbQ7yhS+Ikk5eCll+Ewlh/60L/j9h4PeGLuiXZitjGDcVGt98I/b6WnHMQ6eiLfCbUMjg6nVn5iGqIH75W0jBodBsGOJ6g/AObXQEp6R8spEj/oskSdWRjuVW6IVr6Y/Mut3G8/UOE4qNREvqgiO4WmnAOFoh436sNXYFQ59gj2BcltOG4PahGmyaXgcM0pIb3hjTyLyg6CpPThuSc56KI41qSDyeO0jI58cpLqfyG1DNoz6IMXW2lW3eH4YgqkyuigJ0ewRG78idHW9cTtlWRTk2SpLs6RB6HoxoVbOfYbWrYpGwz8C7V9oDjGY6BlxRqaEpRzxeRP357IWXBDauWLyU8nwcT7MQV15RC7guxgWh6o5YvD6NOcG2dH+QNtz3Tw5pJNzYvScOmC5BIclx5oWcKNPzHax1t1o7hSkvWKpoILb/2KFam/olEtNR4oTnKg+mCi4DFdz6d11D6A9IrJfzmtSg20d9mivZxa7GB3tJwisciMyfUTRcmE2GJ6k+LCoTpcnOYnemq6YPKfrq0s+g3R0MXpXeRBBmWH6IFeDsopEg+UxAzsg5LKpZ+oPfZ2Ltrh+BWTn85g80VAJw/BGSdKD0zbVZyyabPU+IJIpjbmtCW9I3LE7ie/IYVwL2bQLpNtSf78wS0tv2LydRow0ap39OoXpNk2Cyz74xBZnGiATpRGX5SGS2Arv5Ed7XqgTi41z5poRUm/UJzU0vALU/vpzLcmIgsw5YCYEGMXtPKshN9o+k2LJVm2JVm2lWM/EDFKnFTBj3v5IrOmyfboRfIrJrdkG3+gNJr0hTIagbHEkEHpgV7+ghbHyg7pQDKrpzr5B0MoRWjaEEGMSwmpnSgOPURFU86TR1s/StCm3RXimX7htiXcDia9oEQJLl1QPWlPMlVp0K8YNS6GgnZjh5o5qVPGF7Voar/86HlBJMyns4V8opXjchGtHItnJfkDLcXSeKJlG90nkgwXJzUgmhcD4cU/QyfoWLzsktDKrygpWqUE6clTVkq4OOUnWsMvKKdKfEOtvkiLo/jKycsXk59u5T57UUH8J2ZH6hdMr0S8uzisHd0QzJ7EvqJlO9VBchuOY0KMDYqDSFUiYN+oz3GaSt2o8uTr7Kp2ojjUMKU3+B+9K44Z8MNngb1ILbtdnEycD4dgxtPyN1qz9orJx1O0J7dBdtpPlCwJWUXpBb3aAxmKYluiw3aibEuyAvZgCGnkpIPiWN9cnOhqIF6wDH5BkcejBtVj9b7kTsC/EAFr4xsKsUu+0UZjpdIjyT64eg52R8tbLTLzjSjVF8mF2+EiNT4ozsrVoEWTjG45OfE3utVGhu6oqfmK5HBxaNfhQrMtDLdUayC9opcHxfkXin71ZPckjbJ9JEUbjlGQTiSpHpTUXCqKEw58eAhOO/Fhh2i5lYmCNWOXyXXiVnxBago/URoufSFC2lK4oq968tPbCftgeyU0MgfxRX4A5JfD/CTIr5bnL4xPTi2/H9KpA5PH81NiML9mDm4HO06e/HTU5n9hauvc/dmN9sX3vuNl2d2cgM0sPfPheC4NqwPDqaUPglH/i88QfSTpA3hSjEtimf+IeXFYKkVmmv+FqeGdZV0vA+eNbCHPhbSwiq7yRQrVb9gG1ixSY/CbR6eFTdTakRB1ee6mmh4uwdDfeLQfzrZ8Dqoz25VhXMVCVtNBHr2+NdTWjh6Q8u6gp3yw+8NxjGXR6YZgL7wSIcYttYa5tWkCe1CmC06eu8IPP3nKrXMvGGtP9JtDMD5Iy1c83joad48A7cAiY9UvOJcR6RujWCOwp0+6YObxKsGLcwlG5dSyInyRXfnMXDN95dRO3N68hiZYso9nb9hPZFdqmX0gF8ZOZw15GmemvGFupQhL/cGrohd5+BUjh9+QnvLPPdlNW4T/zVnVWTDfIzDzJCcnj82Vefuw8nwnufgvpJY7uo+hN9wW7sbaM0jMKDdwb/RkNMPQG6P89nOmm5h5wfSczs7mV0xekfnJ5zOQ5+Z9D0UY3035BZPiMUqB6SPrni9kbxsXydt3wdwVR+ID5W1dQsAiIs0lJBhNtYblaStvI3cFEZN19ytngp6WJqQVEctePOWIr8hMPkvuCDJFa1mxPD1xFrAuGb4VBIzecPzouSIN2Y1EH7tJhv+HvF8ffSDDc2/2lXMfCnTj8ClFhXMXkdFw9rxxtLyHphjt6WNL9eDHpy+cfbWGCMwBvGSXwKmFX52dFGjcWiB1kFunRHUlOCq17JzRN04DxXlb6hfOouonZiV17hgdnny99yTPvp84dxBpJ6b3y9lb7YHdiXZi5sP/wLwdb1d2ks/bM5PPcsVZTBvt0cObErAUGOn8G7KbD0Vs8UQmMfaxjqTxFRlr8cRNuLcZmP3xeQPqage/I7e0vsjy1m8IwdJGF2+GENlM8nlzM5qC2RHsO9K7OikSFYbb84rcUj346GVB5/7C1E5nR/PF7A0Hq4AYb+KjYN2NEKQNveS/Iztozijrefsbj7bee5pzDzicnO+LBRh5tl158tM7RB9W7ZtHPleQlN9w7jjunlcnotOcbD5TOPcwO7Y8PU0b0npxpiMfPcVo6yzKvTBmGh/IfZnpx0odnpnweHbfcHuuM8lxFmPUyXMnBMuC0SAxLgifpVSHQ7k2Bo9RqRGoMUFcna7hRO6KuouB9OOrD4QzHkLKeEfekQaMRbEM0VsBPkhSvZ+RJbxiODkJMX2Mka2FJAWnOzvaxZuw0SNAuveB0eL6v/9jlB1bnxE4F6c+nHXlwa1x+9SWZ7494Xj5D0ztdHY2v2LyLANzDxflLaRYyOgQLJx7yPggRHjjIrvbfSJ7U0/5QPItsyKEnghJFylkDV7xg+xo7QX7ZlbRPDG7mk1gE6W8HU7tJ6eWO7qP/G/MSnayrH2zOq/LirAiHR8cdXqIrR2Y+5L/xPt9tM3e3v9WY3trCdQvuzNIFWikGORx6Qm8IWtSyr2DI3w+OzyWBrz6C3Lp3Efv5GxLH1B+wxA8vbyJDCu5YRV2sBjLZ0GBJ8vOwZSi/4WzltE0ZfSD3N/P9MDsPvXUDu9VVP/ErmdC+f8BaH4Z5AHE8xfG0PATTeZVHmiNfkO0comisvfjXr6oN0Srvpj89KyMfsXk617UHNtMSraVY78gmo2O2w+cIaFK1AZJxYFgJNIHP5k4vlSgEjsImCXh2Bem56on/+WXHRm77jp5enDjqQ9OJs6NW+1KIC25o9W9BIz6cHswRTv5uDg2+V+Y2k/fWS1edjEiOzoOSkEiOZZEXyiOtTooTjigYgPpBakZRfgXWpyGYu+jLybCcIlUPWm9OQRTGoMiYLphBDw9yiEH7EGlVyIOnxguIcYu6OUXzB68ShAXbnvmrihRsizJTgziEhyXFPXjXn7F5OvsaHZi5lF8wdTCT6QGz2IkHS40TyCapljQyxfLLBXFMRlAdOCKIyh3pHSgTp0EUwonkpSDwo88eF1y8og4rcR/2NHkbJa6w0XLLxgp+huqpyvI3tEa/YIiX9fit7IVB/G/MLXTrdxnLyqIg4om8kUV2S005RwoFPW4UR++woLsyewrevVFarZZYnSpwVIwoAbpHf8sSh1Kz3ruiQa6KI416WDyOGz0JDgjF26V6w0tVV8kLy9OJo5PrmYWh4ApuwctR0Y4kcS2MDz4hz9nyyWLQ8CaB1HIjQu3ckx2w1yKZhvZsr0IyBr6RK0OiuOPW1asoWmDFJG0mPyXnz3iQDAStV2cL46AiYdiCurKIXYF2cG0PFBPrp5RtdVFdlR/oO3pK5KfyFxy/0BJlEVZ72hZwo3/wtQs0TE7rODBv9AouPD23TAk9cU2wW9omBENimM85i8e9eZeduImfQi14J9+9Ej2fdY+uHoeVFP1H2jJpm6JYctg7IHUWjqRnrTg4qysQb8gmnAaiMkurs1/oKPjoDisoF8KimO7uW0pVrRsw638ifyD0nDpRLWqHCfgT0Sq2feKHY7/RMZSo0VvSFmpvWDadSlOW+K4W0u0RG58zKGkB0qQ2CBySKCYBO99BEy2cXGCuHA0LcJkJ1aRJdx48A/31k70zBy7gutatOnBh0s3FMcS1vCKEvVWfqBXB3MPTIsFOQsksBxKGvpvT2P6bxgBf10mDrXGQdJaGQHTZ52Twi9oSezGFhEgNijLtiTLtnLsJ0pRVp5cWvQdabIk27Ik2+rfT9weXzH5uiRGRZkkZg13iMyfOHcM86oPDGUmO3QiWfVF8taLCZIiJF08OAWMgvDUxHliasg6Ub/PZZaN0huPhtt04HYwrS8oXVcoJ+0ftBxCvHuYAdIAABAASURBVKJvfFgiMkZm/cbUfnmmUntBJMyycZkLnIgPIpCL8+RaHbR6WLE4gn1BUrtB9gMzFW2RqmhSD3p5CeFG4LVD/IHskKidKE64UAeVWtITJZWrJ3KSQesLZcom+gW1+iItjuIrJy//xv8nDj8WEudXQWJ/GbxjOvhVsZUHUoqS0geZrs7a4F/OYH75/MySIRC7JHg4At3sJLKSJBUAG54OCHbyTViJSn2T+fV0ebT16pvnp9iOh2f6xBC8RfBPO5qumHw9wOeJ8Zpaw1VP/stzd2rgPA+CZcfJuzzfVQoHtoOpN6zcqYRM/Ub20ZDvrfcRJo9OgVXlL3h8v+mK05JrTh8+FbaFUntw7usnODFtdLdtkRpGG3zK5CT0YJNDWR5bTgVbQrVkMfnhSDNFgoZ15oZTIrZ0RxqxfBezBoK18cQkeD9EpsmBfK8AtnwWbOwGag9kR7v/Qmp5T/fTfEM2hiPTksh+AIOTp37z+c4T28PrDqStbGqrBqL+hdTyRNp65w1L8o40/cD0rNPFMyamG4I9OdJhz1IfQvGK6QkP5p7mkCCt82iSk5PHaAn87UdTvjU6jx3cUwV+x3wqZmoNXH8g8xgjRPqQk9w526pfkCYYN5IQJz8ie6otMotxZ3rRINidI3zuDEnfIrvSnO3vmL2tkhzIPCzGlsDpX/xz8fTcON3hN6etfBHIEwM/scUjsLPpFZN/ez9N5CwGP5wF5YvkbXlDCnluvpEPTmP+33F1ej44GZtR0xf+8dE/PDvT9cG+kn9UUemjkHviiBj6ahDuYGM48OHMlS+SM0V841OZW1MP/3jvzS2RfmFqh+eWIw8e/ERELDdlXbFJxDc/B0moYyQzluQP3hLfzaznE47A15QkPMiq9LBrPiu8A+ChU4tNN3oIfufsQ2N5p7OrdXakMpwMsXmQTsqMXHR2VAMpx6jvnZ1JYTkpk8RwimTDE8ODiGwJa1cT9BtSKV9Mvp63Mj6FaCFfGAHPw3Ndev7EFt/DseMvTO101jTPE3kDtF8Y2LeDx3PSdqEr811EhM30gzM0SiIdtYaZaNrw4aHrWc0KankfTjY8DT94evCpdkPZK2dNO34ihVgupbHfCbzfEZhP1Tw30IPENY0fTI3Z/2Y7e8yws3M3pKc8SDU5ad/xRMrHqidmjEemA+8nKRKwD58sMcszcUFSLOKsh2B3HgHvfQSMp7IPLY3lTPe7XaQ6PfuStFYrzxQJNvqdI7MlET3LSWf3k7Mxdbz1Ypu5exHIstxzxcgnLzlCOyFXTP7DI5+LIBjDPLRxMNov/5qlkc/RwQPTc3r20gPw6Ykfq0rAKhYJ2KyLys7hOx2O5wvrd8g9d2Q0dWZHD8fLCVj2/fa5ZyJz7Eo+u8i+eBZGB/sWkOW0MVxrQPqBrWSSwbSEf5zN6FcOpTsx3de0WlqTXDH56SRYvr+ZhZyPJe/sA6eRyupk/8Xa3d10gx9OVr5Iniv6HVdK4NNFn1FieKFPT7bljIYuHt/YIFPoycchWPKt9Co4WAXEbnfknjiDGNVaww/OPipZQhdvCwfQ3nlq470n6TRmRRhPuwhJj8bg1dMd/hemFs+e4M0P8Qd2N7UTMxzOE/l8sT46UnqK9ByYlBxoW6fK+Y4OTJFFpcVk1MlTSvbEoyMtzQlY77hifwCcXxylQcsSblyc4B9u0WdllviOpuene2ZmgWCyGzvU7MbFiQroQJGpx4368BVYoRx7BPuCyddt9IsnVQJycZYkStHEeSLSx57F8HFnQXYvDs+kVWmCLi2jUxZeXVLx5B6uK1oqX0y+Lo6ba2Pw4t78J1q5375i8nU9kX3pFWfRSXFaY6ePlKrQfiA7Wv2JkqhhF5SUdTg2uTgQTK0lfIgUrpyIf3hK6b0hc+V3rJSHJQExiYB9UJZtSZZtSZZtSZZt5VgOEA8shUvJRtVwZsJtv3Ib/ebMlf9ASZRlSe9oWcKN31GcqIeLDtvSDcWxKmvRUvkrRkx9UW+IVt2J0sbfqM/xpidu0gdRC0a6IQLcBmnRov3OH7K2a9F3pNnZiWpc5dYHSWUhixgim8ykoIrJ1yWtvOhvlISq6WumT9yaNJo/2KycDBSnO8iDUNkheqCXg3KKxAMlMQP7oMyfOAeSrnnxAHuVV6QW/eZMlv9A5L1caQsVa4LDvfSKpmx0fyOSqYxZr4hc/YK5K56BoG1hkoL4T2wH1TeM9nAvP9EzO5fJhq9DMDPgD4qTOoAo31DDpUGKmHI+OJmng2jKH7c3P5EyXTElbDnpq4uTHqD1hHICpvAf7uriGBcMHAuBSwlIf6A1T7+i6Te6JVm2JVm2lWNbJrETNbn0D/TUmbEk27Ik2+rfFZPHU/H23DCaRDkmWkX55CEf3gzpil7+ghbHyk7pQDKrp3rydZsE0y8UxdR+YtbSE0hPccKhDtNUu0sS2PoborX+hhIlJmOpS3D1LH1wy1RNNKhFL4qhyTce/MSZgKodhv/l6UodHLOOWZlZgtdFwcqxHCB+4QiidTq+OEJsG+wQWhft8I+T6Y9l+vfpBtoWsx9230kN3bJiIlfSnyhNXT1pSzJofWGKQj/RZH5VEDFq1gXJyxeTn27lPntRi+Xk5VfMjvALpkc5q5Maj30he6u/omVbBOxACRIbFIceqoo4qDkQbPLEkgbYFZP/8MgiYPqFqeE8oy1pi5c3Ecc6uO3li7qiYOFvKFGMKaddBEwRB51U9iAJRh7+5tLUpd8oydIP9+pWjm04DioZCJNtSdbAohZNBYdq6hcuDjVMIngC0R8OKwGNH3nQypmo1JoSMOW8YbTTSTDlYSeSwG1Q+KJN3p2D9mI0fJgyoZxXzkz1G6KULyZfzzLbwnBnLaiPS5NLP9CyhBs/MPk6izejTubtAZuBmGhTTvBwUbATJHtRb2hUp2mw8eDiGAUgOnDxrC3dwodfhKRHIfiXZ1nqNwzBswc4bOhEnW8zmTiL7Gr2EyXbBOxESZHwL0SYNiuYxiCsvKhrbAfKO84sNeOSnpwfAPn9MD8J8lNhfqDsL5DJ1/OTIR1A4wsywSA2NXbll+sPZ+5Le86kZz33MgybfV+c2WhazO7kJ2aSGjuQZ0dq4SfSU/5fkC30YlnKzcuBEDagx7J8MbUUwXwXUXlIGCl9qbFwZuHkqbcXmnxaIDF8eFYwVb5IYebCW2D8H5iZdQDLLE8jW2NHOM7bMPj2QLDl0f7hLMz76JqZfoSw3R1+OM+eXmqZi85l6R6d7MLbFb7OBdj2oEFitEXrsuWVCLFc+kT6uT/NyaZKH1reUZ79F57e0bkHPXbyGQ3FIVj6ZwUkCd7dT2RR9Z/ISmpza3aFwyaFzCfofcjFvaN7L3n4t2cFO7KvvQ/OTuS+YHB7UU6e/HBEOnhG4zum5/THfX1HtFwcZE+1hOEsxcKpcS+E+IuzZ6ok9NPGloxcOArvQUCnASNBxKL/R893mx2dJfnFs47ytEFyXcgHyar/QGrtL84bmzY8+XzmvGXKy/OdZH0R7YrJ4wx07siL7H9i+9CL7Mre5of2xPR8ez9Td1MDh+/sfmGsJksdoCfva8Z9P5Fa+/4TsoU+VufiPKF4cEgtIW3B1ggHn9cl8lrEZFn0jmygh3Fa0v/kTCFTjKVYzOfJGAI8PeMnZ2F7vrAdqIvsZpId4ThLkeBRlyN014nU0vdfvF8n/S+YR6TCWlJiLQr3ojDSd5Rx10+klvfRHKONHewKoQTHyoMkWGq5gk7E3gSGUXwOpfHwSy3dlRMydiL7yoN0kee+GX3jNFD8fIYLZ2f1E/NMdnQ1fcGrZ0/4DekvX0z+n33v46q8g7F8lI/3XfTckHvKF5MfzoKqYKfAO+/juz+BctqSLuYhpCkkLbLhF3JvhunIEKxDuWQ5KWoiQq152pJk7yISdWI0PN9Hd5P/Z2TXzGUVu8oJWNagZlXYIGLefnjE5qs/eXbfnY3p5arRw6/OtmuN76J9f2Fq8WNvc3b+wu7nI2HdXZ7ATHfkDeH/Adkxn5kks8AXR2MbcfZvspAKzixVRjcPf3jeykeiLT2BN8ybWc0sloSdAIMfzlz5IjnbiHCa2ABNDCdNpWkD+6glTW+RnjN/1sIv3l0v/NB5aj4na+ee8NQOzD3J/8LUXpyF2OduSCyP/yC7Q3L/IFmtYV/CCNkYOglbmSRyb6sPzK7R08YMFm3aIFj4+PQ8a+Xc1R4w39Ps7DDyIrXqQSReFQorueDeAzCMTsIlGP1M0V4dIXfFnzzaxbujvKvY8YWr0Tnrl+eOsxetfDF5PDPBm+ep6bti8sM/Ncax5WRjvCL7SqgF8WRs4ONSD6dnOI8svyA1LOXpZyTfAW0nJ7nU2wC/Y2dmiOW8oEuT0ldYJI+V0fONKNUXyXN/95O/YbT4XJ+78zzmuYiRjI/TUP6KmcNTO5zmKj9x7qHMfjq5cvLo8UO7YvL13MMALM1hs4eMhJjKeDn7aUyaT7aIUj1IEmMnDdRL/mdkIMu4ny27Kxrb0NFiDzI0EWcmr56ZB6dW/RVZX/2KXDYrImb0g7ww/9xzV5AC9bIPpufw7En+F6Z2OruaD/IDoGXeI+IHk3kUb+UvpEaz8uuiyIOHiwQDjM+ucl05eXlwe6Qo+BtGW/cTPTO5RJIN96BOtGxHBKWE0KI4EKr6cFJxEDES6YOTeZUDjw7bUmonioOGqbqk1MJPlFSuOcmTFQmY0nBiEsu2pI+7uTjGBXtBJCxF6lLCnVuz9g0tybJx4aA4NvkikAoufHWJ/Icfs3RYkm317wWpChmnwxJJDDcuJVgcAiYRsAdWoXRFL39Bi2PlXumDpMoZncw4Vp78dBJMKQRFSP4TWZJa4IE+eYvDrAd6+QVzH26bZsv2BZOGL0rU1ZO2JEE6PjpiedHyFxptneFmJ2pqvmDy/+AMYharRMyCxTDDPbzRUlEckwFEB/ATN8lOZH1wCjaItQDaDRpOLjzaiZLKpQ9qDq2T/BG/ZjOEo1uWQAJm5Y8g23DsREmRcHEiAxr0N6Yo9BNN5lUGj4iIwawLkpcvJj/dyr32D1R0/AWVGUlTFSeZ4OPiGI+dyEz5X0jNZgK3n8g0GiYRqIKaA8GkBmnwRqQRpRumZz2Q2gv60C01XUwe5zkSSZGASQe/4Qzai9TE8U9UKxaHgCmjwSRB23LKQRLbwvDgxY+evzC1uCXsdHEM8yJQduO5NOqJ25Wm6nBqmETAQCx1HIPUGiwXG5oSlBM0VUOuDkVNVDClL5QiKad1khNJMOVhD4wkITaxbCvHfqCWn5guLXsgs+2+IUr5YvL1LLEtDH9BCR2XfiAzkhItLfo3envAZqDTbXGsvEOWfmOKqS8qaKIjvqA4RgeIDoAFcPiwxkM4cZM+iI7gX06LUr9hiE5Zj5XaM7K3vMiuyRItHbwYjqQHUquEfGClcEnNpSKxaPHnsmTjNHqySzx6Fh3E/8LUcHFsC8NMoaNfAAAQAElEQVQtxSC2ZRtu5U/kH5SGSydKsub8E9nVzkU7E/iivfmJdDe/YvJ14H555lck1aVYWp7MZJaIhzu5wxpgB0qQ2CBySJ71QatcixBMKkdb/OZVqF4x+Q9nqSXZliXZliXZliXZ/ukUZEm2ZXFO1PJF6cLbCf8LvXWQnZkuRLU4BEwHT77evs0pSwnhf2FqP12cLhh8pl/c3SQeYiaKScJPJCkH6bH/gfTEpksKHh42uUdnlyXZliXZVv9OXM1gKsHUbkitHJREWVAN+kSZGgHYOHzit1o9crpvSKV8kTx30SY7JPodKSDGouPC0yvOE1ND1on6fZ6z5bPbmQ9ft61IWrThEhSMnVw9S6mXLlou9QtaYsj6/JFicFMiG7NoE1FFU/vlstqjK5KXLybHRaMluX/iJFOZlWPRkuQPtBTbRrtE9g8UhxpV0aQDlQPBkp3+5JoJ6UB2Nf+JklLLogfaiJjWQ8W5ozX8gnK6iG+o1RdpwULQpYTw7AyWk5QXrckH+QGQXwKVc0V+IsyvivizEqmdtHyQrvLF5Ovtb053EGF+EL1ycnR+4kzEw9nVrL+Bkn34ZImpPZA7ouSOwRHm11T6U8DLi3SBvQBsN4ia5soTUFoEb3aIP7C7UlsPZOFfmNrhuSv5iRCMx9Ualveq7F4/vsX2MH/wGzKLteUd6U6B5YH+M0oSHuSufJd0UapQTBada9OB54p0BcenNnn6hx89o5w7uK/1Ij0nopJjLIr+4NBc3m0EjL6IOIQJkhgEePJpTu1wmrIwEIx8ImL5A6OdToLxJc3qcxYRqzgfhrTCYxk0M8DnrRDstZtd1f9CanlPv2uab5i9aEBaAsVIGYvQnGRwXpX4zUc9Ih9wd6Gkmc917iynI4hXf0NmxlKkfwgxnL1ko8LJE8N5LpY6cLVp+CgHP3GTPoi24NW5ox/qxO0BRifZFWmB/cMezbkrg2BfD/bzgMNh5G2ZMNeyJnIu+xu7hbYrMsyuURI/TuO9QivWO5/YXsTcH2eQvgjPN89+irSkfuXdgn5F5kNxuonfvCKh/26D2T2QCfzzIIaXRyNt74EdSsCjAfsY5kKe/tYU7fD0J19sSqg1pNDdsGLvg+R5KRZPzndFnsb/OzFJ9MUuaEfGYdGvPPk4xdj5FYSkO3cOspct+V5PTjE8Q6dGz8G/kFr6jt3QpAGwld/IXXlp70tX2wnY6KxJT/iJ0dYBxhLTfkEGsIdIPeLVkd4XUKAPI3lfk8L5JhqxfDddh47RgdiE77nIqid2AP1ExjAmidELZ3V09kVmV/kNqZVTiSX/heyg3N1PjMimAM6C9JIBxCv/o6tt1G/IZypfJM/dLOXrC+GGCE0bItAMTBNJdJxsC2S/OKXDjpaTr5D7or1htMNfeyLyil2VJ0bJSPDwKfNdVHhDOhhq5UT2ZmFKB1LbNEW+MyB1PKu3XJ1KMTtHT1Y1gTXh4xGy4mAH784EPDuA7nxHNsTSeCIby0FunOEWw7iGfJdtFvYf/ZhYzD2ZLKJ9IcVolPqOYrR1YB5Fkhpw5x9xssTxfDo+DBNXHiV8kRQLmbUQ7M4j4HlmCkUC1t35b2XuCk69jI/D0HR096jpeHdamdnajMInmd3UeimbrkjeenCXdOrkzFVfJJ/6hyPV2Fz8VNJ5cXa2Fimf6g2j/fJsT+1ECHbbmb0//Rwk6SA4VtYAB7Hb2uF8wiR8Dox6OAKk32FGyYEf3z0jKeJMEYcnj0cIsnU/QbL0LLI72dxFRjORu2aSMjkKOkkswx+ctu5OSNsdqyBdkX0oWXSoWfPKpyGlo+WBNGB90BvmnnyIExkvv2Bq0M8lJT9CLklp8bKrSjkZmE/Z1eTB+Y655YtnX/Q37BYKf2Fq472HMFfkHey98NHRKLF0vjby6LRh7AknGyshvWBZOL1ZUp7kF+e+lPHeAzKSyP3sSbaFfkeRwk8kKQcvvQyHsfzQh/4dt/d4wBNzT7QTs40ZjItqvRf+eSs95SDW0RP5TqhlcHQ4tfIT0xA9eK+kZdToMAh2PKHiledNuedAfgDkl0DmpCsmHx998kavckO08sXkX25df3m0lyuIg4om8kUV2Sk05RwoFPW4UR++AqPKsUewL0huw3F7UIswTS4Fh2tOCekNb+RZVHYQJKUPzz3JQRfFsSYdTB6nZXTkk5NU/wupZdCeQR+82Eqz6g7HF1MgVUYHPTmCJXLjT4y2ridurySbmiRLdXGOPAhFNy7cyrHf0LJN2WDgX6jtA8UxHgMtK9bQlKCcKyZ/+vZEzoIbUitfTH46CSbejymoK4fYFWQH0/JALT9RPaNqVamcHW9oe/qCN2e+fFGSPb32gWgSOi49cHv0htE+zqRYqSoWxwqXHmgUHFmtk5+oEOqvaFRLjQeKkxyoPpgoeEzX82kdtReTXjH5L6dVqYH2Llu0l1OLHeyOllMkFpkxuX6iKJkQW0xvUlw4VIeL0/xET00XTP7TtZVFvyEauji9izzIoOwQPdDLQTlF4oGSmIF9UFK59BO1x97ORTscv2Ly0xlsvgjo5CE440TpgWm7ilM2bZYaXxDJ1MactqR3RI7Y/eQ3pBDuxQzaZbItyZ8/uKXlV0y+TgMmWvWOXv2CNNtmgWV/HCKLEw3QidLoi9JwCWzlN7KjXQ/UyaXmWROtKOkXipNaGn5haj+d+dZEZAGmHBATYuyCVp6V8BtNv2mxJMu2JMu2cuwHIkaJkyr4cS9fZNY02R69SH7F5JZs4w+URpO+UEYjMJYYMig90Mtf0OJY2SEdSGb1VCf/YAilCE0bIohxKSG1E8Whh6hoynnyaOtHCdq0u0I80y/ctoTbwaQXlCjBpQuqJ+1JpioN+hWjxsVQ0G7sUDMndcr4ohZN7ZcfPS+IhPl0tpBPtHJcLqKVY/GsJH+gpVgaT7Rso/tEkuHipAZE82IgvPhn6AQdi5ddElr5FSVFq5QgPXnKSgkXp/xEa/gF5VSJb6jVF2lxFF85efli8tOt3GcvKoj/xOxI/YLplYh3F4e1oxuC2ZPYV7RspzpIbsNxTIixQXEQqUoE7Bv1OU5TqRtVnnydXdVOFIcapvQG/6N3xTEDfvgssBepZbeLk4nz4RDMeFr+RmvWXjH5eIr25DbITvuJkiUhqyi9oFd7IENRbEt02E6UbUlWwB4MIY2cdFAc65uLE10NxAuWwS8o8njUoHqs3pfcCfgXImBtfEMhdsk32misVHok2QdXz8HuaHmrRWa+EaX6IrlwO1ykxgfFWbkatGiS0S0nJ/5Gt9rI0B01NV+RHC4O7TpcaLaF4ZZqDaRX9PKgOP9C0a+e7J6kUbaPpGjDMQrSiSTVg5KaS0VxwoEPD8FpJz7sEC23MlGwZuwyuU7cii9ITeEnSsOlL0RIWwpX9FVPfno7YT/Q0XFLpMrOO3o0Cpj4AfD4ZfGOw/jtkJ8Lm5+YHxVRUuKXUOT5tTG8vjUKGLU3Hm29O8h/4t6nxdzRnID1l8xFoPd9IQ9JH0UsC7gPDYI9+Ayjk9BDNRfzuvCkKFiyiGyiEKuIHMSZhWDkbbxganhnKxNiaGk9PDQPuSHF8hsyXL5IzsWMPnh0pNybHcGV6M0En4MCBqeaXgj24Kn9cBbmu6Y6M10Zxn4WsZIO8uj1raG2dvSAlHcHPeWD3R+OYyyLTjcEe+GVCDFuqTXMrU0T2IMyXXDy3BV++MlTbp17wVh7ot8cgvFBWr7i8dbRuHsEaAcWGat+wbmMSN8YxRqBPX3SBTOPVwlenEswKqeWFeGL7Mpn5prpK6d24vbmNTTBkn08e8N+IrtSy+wDuTB2OmvI0zgz5Q1zK0VY6g9eFb3Iw68YOfyG9JR/7slu2iL8b86qzoL5HoGZJzk5eWyuzNuHlec7ycV/IbXc0X0MveG2cDfWnkFiRrmBe6MnoxmG3hjlt58z3cTMC6bndHY2v2LyisxPPp+BPDfveyjC+G7KL5gUj1EKTB9Z93whe9u4SN6+C+auOBIfKG/rEgIWEWkuIcFoqjUsT1t5G7kriJisu185E/S0NCGtiFj24ilHfEVm8llyR5ApWsuK5emJs4B1yfCtIGD0huNHzxVpyG4k+thNMvw/5P366AMZnnuzr5z7UKAbh08pKpy7iIyGs+eNo+U9NMVoTx9bqgc/Pn3h7Ks1RGAO4CW7BE4t/OrspEDj1gKpg9w6JaorwVGpZeeMvnEaKM7bUr9wFlU/MSupc8fo8OTrvSd59v3EuYNIOzG9X87eag/sTrQTMx/+B+bteLuyk3zenpl8livOYtpojx7elIClwEjn35DdfChiiycyibGPdSSNr8hYiyduwr3NwOyPzxtQVzv4Hbml9UWWt35DCJY2ungzhMhmks+bm9EUzI5g35He1UmRqDDcnlfklurBRy8LOvcXpnY6O5ovZm84WAXEeBMfBetuhCBt6CX/HdlBc0ZZz9vfeLT13tOce8Dh5HxfLMDIs+3Kk5/eIfqwat888rmCpPyGc8dx97w6EZ3mZPOZwrmH2bHl6WnakNaLMx356ClGW2dR7oUx0/hA7stMP1bq8MyEx7P7httznUmOsxijTp47IVgWjAaJcUH4LKU6HMq1MXiMSo1AjQni6nQNJ3JX1F0MpB9ffSCc8RBSxjvyjjRgLIpliN4K8EGS6v2MLOEVw8lJiOljjGwtJCk43dnRLt6EjR4B0r0PjBbv3NbCZ6Q7KR3IOh5CG3eu1gwd8XuGnuo/MLXTdwdLen8xWi4Ec0+1hOFI2JVzDwoPJqI3LnJPp05kb+opH0i+ZVaE0BMh6SKFrMErfpAdrb1gPg+bMGYSsws8rCraP5Ge3NF95H9jnsb3wdL2cRkjeV1WhBXp+OCo00Ns7UCGy3/i/T7aZm/vf6uxrbUE6rmHIVRIIn7jPC49gTdkTUqMBLh7hM9nh8fSgFd/QQbnfnonZ136gPIbhuDp5U1kWMkNq7CDxRifK73wZNk5mBKdMWrTEnLVZ23KnaN8IgP9TA/M7lNP7XBmp8b+aK+cWvUg3cm5HOPa8I/zAyC/CMq80ER/I5KpjFmDwKQkWPLTrfyyaC/qDdGqLyY/nX3Nr5h83YuaY5tuybZy7BdEs9Fx+4EzJFSJ2iCpOBCMRPrgJxPHlwpUYgcBsyQc+8L0XPXkv/yyI2PXXSdPD2489cHJxLlxq10JpCV3tLqXgFEfbg+maCcfF8cm/wtT++k7q8XLLkZkR8dBKUgkx5LoC8WxVgfFCQdUbCC9IDWjCP9Ci9NQ7H30xUQYLpGqJ603h2BKY1AETDeMgKdHOeSAPaj0SsThE8MlxNgFvfyC2YNXCeLCbc/cFSVKliXZiUFcguOSon7cy6+YfJ0dzU7MPIovmFr4idTgWYykw4XmCUTTFAt6+WKZpaI4JgOIDlxxBOWOlA7UqZNgSuFEknJQ+JEHr0tOHhGnlfgPO5qczVJ3uGj5BSNFf0P1dAXZO1qj2ivZKQAAEABJREFUX1Dk61r8VrbiIP4Xpna6lfvsRQVxUNFEvqgiu4WmnAOFoh436sNXWJA9mX1Fr75IzTZLjC41WAoG1CC9459FqUPpWc890UAXxbEmHUweh42eBGfkwq1yvaGl6ovk5cXJxPHJ1cziEDBl96DlyAgnktgWhgf/8OdsuWRxCFjzIAq5ceFWjslumEvRbCNbthcBWUOfqNVBcfxxy4o1NG2QIpIWk//ys0ccCEaitovzxREw8VBMQV05xK4gO5iWB+rJ1TOqtrrIjuoPtD19RfITmUvuHyiJsijrHS1LuPFfmJolOmaHFTz4FxoFF96+G4akvtgm+A0NM6JBcYzH/MWj3tzLTtykD6EW/NOPHsm+z9oHV8+Daqr+Ay0xZPmCpOUXpKfSidRmRDkra9AviCacBmKyi2vzH+joOCgOK+iXguLYbm5bihUt23ArfyL/oDRcOlGtKscJ+BORava9YofjP5Gx1GjRG1JWai+Ydl2K05Y47tYSLZEbH3Mo6YESJDaIHBIoJsF7HwGTbVycIC4cTYsw2YlVZAk3HvzDvbUTPTPHruC6Fm168OHSDcWxhDW8okS9lR/o1cHcA9NiQc4CCSyHkob+29OY/htGwF+XiUOtcZC0VkbA9FnnpPALWhK7sUUEiA3Ksi3Jsq0c+4lSlJUnlxZ9R5osybYsybb69xO3x1dMvi6JUVEmiVnDHSLzJ84dw7zqA0OZyQ6dSFZ9kbz1YoKkCEkXD04BoyA8NXGemBqyTtTvc5llo/TGo+E2HbgdTOsLStcVykn7By2HEK/oGx+WiIyRWb8xtV+eqdReEAmzbFzmAifigwjk4jy5VgetHlYsjmBfkNRukP3ATEVbpCqa1INeXkK4EXjtEH8gOyRqJ4oTLtRBpZb0REnl6omcZND6QpmyiX5Brb5Ii6P4ysnL39DKffYVk4/zAyC/BvJLIr8VEvmpsPGCpOlAxkpAuiclwZL/crr7yyM4xjYEYgeDhyOkRd8YBRnjGuKFr8DK0TeZX0/pC7949SvPVPgNQ/DdTfaHHU1XTL4eyKf6C1P75bk5NXCeCcH4ZPyai5jd6/keq5dPNh0dQD0wauogElbyjmylkO+t9xMmj04hK6K9YB6YjsNp4Q29qjg81Wg/kN2tnrhTbc8b4NQw2uDQLk8dx9Aj4hBsORm2ZIrE4SkcHjH5YlMC1t4itZ9IAct30XclhN8wAt4Pwa7UgHzPAEat8UAINqyvgC2yo/pfSC3v6X6ab8imcGRaEtkLYHDy1G8+33lie3j7gbSVTW3VQNS/kFqeSFvvvGFJ3pGmH5iedbp4xsR0Q7AnRzrsWepDKF4xPeHB3NMcEqR1Hk1ycvIYLYG//WjKt0bnsYN7qsDvmE/FTK2B6w9kHmOESB9ykjtnW/UL0gTjRhLi5EdkT7VFZjHuTC8aBLtzhM+dIelbZFeas/0ds7dVkgOZh8XYEjj9i38unp4bpzv85rSVLwJ5YuAntngEdja9YvJv76eJnMXgh7OgfJG8LW9IIc/NN/LB/5Oqz0D3huNsJEbvRCg8+XiEVE8nwfKPZvq4ZHgiM+Hracp/O27YhfOC6uXMXZF8tq1+41PZDbwh/OO9DzXW6ZRCrpj8cHanfPrBT6QRu+06m1N4+jlIQg0j6fi/sK18d7OeTzgCX1OS8CCr0sOy+azwDoCHTi023egh+J2zD43lnc6u1tmRynAyxOZBOikzctHZUQ2kHKO+d3YmheWkTBLDKZINTwwPIrIlrF1N0G9IpXwx+XreyvgUooV8YQQ8D8916fkTW3wPx46/MLXTWdM8T+QN0H5hYN8OHs9J24WuzHcRETbTD87QKIl01BpmomnDh4euZzUrqOV9ONnwNPzg6cGn2g1lr5w17fiJFGK5lMZ+J/B+R2A+VfPcQA8S1zR+MDVm/5vt7DHDzs7dkJ7yINXkpH3HEykfq56YMR6ZDryfpEjAPnyyxCzPxAVJsYizHoLdeQS89xEwnso+tDSWM93vdpHq9OxL0lqtPFMk2Oh3jsyWRPQsJ53dT87G1PHWi23m7kUgy3LPFSOfvOQI7YRcMfkPj3wugmAM89DGwWi//GuWRj5HBw9Mz+nZSw/Apyd+rCoBq1gkYLMuKjuH73Q4ni+s3yH33JHR1JkdPRwvJ2DZ99vnnonMsSv57CL74lkYHexbQJbTxnCtAekHtpJJBtMS/nE2o185lO7EdF/TamlNcsXkp5Ng+f5mFnI+lryzD5xGKquT/Rdrd3fTDX44Wfkiea7od1wpgU8XfUaJ4YU+PdmWMxq6eHxjg0yhJx+HYMm30qvgYBUQu92Re+IMYlRrDT84+6hkCV28LRxAe+epjfeepNOYFWE87SIkPRqDV093+F+YWjx7gjc/xB/Y3dROzHA4T+TzxfroSOkp0nNgUnKgbZ0q5zs6MEUWlRaTUSdPKdkTj460NCdgveOOTCPk37U+j4DRF1H5HwG2/vyzpv4XpvbTLX58xJ1Fcv4Qglq0w0zdsnL8QC1/QauHFYsj2BdMvm6jXzypEpCL2RJeTMBTA3Rg8tMP8YrJTbul7hq0DBdn0MsvLapk6URJt7qscl3RUvli8nVx3Fwbgxf35j/Ryn32FZOv64nsS684i06K0xo7faRUhfYD2dHqT5REDbugpKzDscnFgWBqLeFDpHDlRPzDU0rvDZkrv2OlPCwJiEkE7IOybEuybEuybEuybCvHcoB4YCn8BZlJl+2pL9rDbfDmkh3tB0rUcekHMisp0dINxfEqQSXnrjuKQ9VA6yD5tukbUxT6ot4QrboTpY2/UZ/jTU/cpA+hFox0QwS4DdKiRfudP2Rt16LvSLOzE9W4yq0PkspCFjFENplJQRWTr0taedHfKAlV09dMn7g1aTR/sFk5GShOd5AHobJD9EAvB+UUiQdKYgb2QZk/cQ4kXfPiAfYqr0gt+s2ZLP+ByHu50hYq1gSHe+kVTdno/kYkUxmzXhG5+gVzVzwDQdvCJAXxn9gOqm8Y7eFefqJndi6TDV+HYGbAHxQndQBRvqGGS4MUMeV8cDJPB9GUP25vfiJlumJK2HLSVxcnPUDrCeUETOE/3NXFMS4YOBYClxKQ/kBrnn5F0290S7JsS7JsK8e2TGInanLpH+ipM2NJtmVJttW/KyaPp+LtuWE0iXJMtIryyUM+vBnSFb38BS2OlZ3SgWRWT/Xk6zYJpl8oiqn9xKylJ5Ce4oRDHaapdpcksPU3RGv9DSVKTMZSl+DqWfrglqmaaFCLXhRDk288+IkzAVU7DP/L05U6OGYdszKzBK+LgpVjOUD8whFE63R8cYTYNtghtC7a4R8n0x/L9O/TDbQtZj/svpMaumXFRK6kP1GaunrSlmTQ+sIUhX6iyfyqIGLUrAuSly8mP93KffaiFsvJy6+YHeEXTI9yVic1HvtC9lZ/Rcu2CNiBEiQ2KA49VBVxUHMg2OSJJQ2wKyb/4ZFFwPQLU8N5RlvSFi9vIo51cNvLF3VFwcLfUKIYU067CJgiDjqp7EESjDz8zaWpS79RkqUf7tWtHNtwHFQyECbbkqyBRS2aCg7V1C9cHGqYRPAEoj8cVgIaP/KglTNRqTUlYMp5w2ink2DKw04kgdug8EWbvDsH7cVo+DBlQjmvnJnqN0QpX0y+nmW2heHOWlAflyaXfqBlCTd+YPJ1Fm9GnczbAzYDMdGmnODhomAnSPai3tCoTtNg48HFMQpAdODiWVu6hQ+/CEmPQvAvz7LUbxiCZw9w2NCJOt9mMnEW2dXsJ0q2CdiJkiLhX4gwbVYwjUFYeVHX2A6UH+jo+ANnZ3SrOQEj/3BZ/ADIz4H8RthfBN+R3yzTkx8MX5Gpn7VjNj3r/GTZXyN/IjOpaTG7k5/InnKERZ7V9zO2SM+I/4F3CX2LQEi3E9iUh7C6ZDA9ZIF8lmmgHi33Ls4sejS8vdDsnxZIDB/OxvZdkMLMsY1a7io/9DeMtg5gme1kAhzgToynbI3d2IOn9g9nW95D18z26WG5YzFanAunl1rmqqUH53Li7iCDtwvsDEgRm1o0SIy2aF22vBIhlkufSD/3pznZVOlD694XTG/70kY9dvJop5Ng6c+Tg4d3N+INWVT+E3sLH26R3VgIE8jZB+SO0flE0darb557vp1Vrf9AdlPuXYPZTy/KyZMfjkgH1za+Y3pOZ1fzKybPxUH28MHybq7oPgJWEelfyJ7pIpldbGUeGp3xZrzhxGjh4NzbhLG/sb2zJJE76E+WXeBRX0q9Iq94InM08dre+YXUMtx9baVjMcuiT0vFtOLbQ0NrN6RWvpg8TmN3HXmRJz2xfehFdvTavzC1b+eR2QxQIyNJBMIv3xEqV0RojeRv3HfRhDH5J2cbda7IB6L/zhFrCWkLtpdw8Hlt4t5FLYuifCMbMtjWhCdnCrlzF+w/l3B2T56+CINERhofyP7M5GMFGWlXkRpvId2Z5Qhzx8GZSN9/8dyTvhfkeoxdqZGNXXh0Zrm17/mJ9OR9NMVoYwdvDqEEx8qDJFhqx31BKhhzIc+haIdfaumunMDOg5Oyq0ZAjcAc9oPTQPHzGS6c3dVPzAp2nt8NPPnh2ZP8hvSXLyb/z87+9l4x+XrfRX5D7ilfTH54diUHOwW2Cxzex/cfT8LKSVMG892QppC0yIZfyF0MEdt8Ihsw5riOpLFIWwmIITUWm+093bl5//mQ/ydk+fRlZTdmFWp4gDdVXszevhoOprnZ6k+e3XfPXibYOXr41R817mjfX5haPG/I3ubs/IXpwfvpjhmQdp6f+8chGI3U8gYI9uCzJKNcyNwbR2OKmJbN2BmhezNdznzwh7c3463vLvihD2YHm+nBkvBmgDs+nKHyRXK2EeE0sQGaGE6aStMG9lFLmt4iPWf+rIVfvLte+KHz1HwO1s494akdmHuS/4WpvTgLsc/dkFge/0F2h+T+QbJaw76EEbIxdBK2Mknk3lYfmF2jp40ZLNq0QbDw8el51sq5qz1gvqfZ2WHkRWrVg0i8KhRWcsG9B2AYnYRLMPqZor06Qu6KP3m0m3cFs3fs7vaRde2B2f3Vy3z1xeTxzARvnqem74rJD//UGMeWk43xmuwroRbEk7GBj0s9nJ7hPLb8gtSwlKefkXxW2k5Ocqm3AX7HzswQy3lBlyalr7BIHiuj5xtRqi+S5/7uJ3/DaPG5PnfnecxzESMZH6eh/BUzh6d2OM1VfuLcQ5n9dHLl5NHjh3bF5Ou5hwFYmsNmDxkJMZXxcvbTmDSfbBGlepAkxk4aqJf8z8hAlnE/W3ZXNLaho8UeZGgizkxePTMPTq36K7K++hW5bFZEzOgHeWH+ueeuIAXqZR9Mz+HZk/wvTO10djW/YvJ3/3/5FdATiBYBeyAUUfkFUeTBw0WCAcYz/oZowmm0lAz/C1NbZwAToxr0ieLYcEt2woFeHpQgsUFx6DUQcVC6oTRcAlv5wlTEsVPHT0SkO+Fns4sAABAASURBVKYESkrthpLKNSd5siIBUxpOTGLZlvRxNxfHuGAviISlSF1KuHNr1r6hJVk2LhwUxyZfBFLBha8ukf/wY5YOS7Kt/r0gVSHjdFgiieHGpQSLQ8AkAvbAKpSu6OUvaHGs3Ct9kFQ5o5MZx8qTn06CKYWgCMl/IktSCzzQJ29xmPVAL79g7sNt02zZvmDS8EWJunrSliRIx0dHLC9a/kKjrTPc7ERNzRdM/h+cQcxilYhZsBhmuIc3WiqKYzKA6AB+4ibZiawPTsEGsRZAu0HDyYVHO1FSufRBzaF1kj/i12yGcHTLEkjArPwRZBuOnSgpEi5OZECD/sYUhX6iybzK4BERMZh1QfLyxeSnW7nX/oGKjr+gMiNpquIkE3xcHOOxE5kp/wup2Uzg9hOZRsMkAlVQcyCY1CAN3og0onTD9KwHUntBH7qlpovJ4zxHIikSMOngN5xBe5GaOP6JasXiEDBlNJgkaFtOOUhiWxgevPjR8xemFreEnS6OYV4Eym48l0Y9cbvSVB1ODZMIGIiljmOQWoPlYkNTgnKCpmrI1aGoiQqm9IVSJOW0TnIiCaY87IGRJMQmlm3l2A/U8hPTpWUPZLbdN0QpX0y+niW2heEvKKHj0g9kRlKipUX/Rm8P2Ax0ui2OlXfI0m9MMfVFBU10xBcUx+gA0QGwAA4f1ngIJ27SB9ER/MtpUeo3DNEp67FSe0b2lhfZNVmipYOfiKToF/RyoCWQdsXFCSItd5H4QZXJXtQVtWzRQfwvTA0Xx7Yw3FIMYlu24Vb+RP5Babh0oiRrzj+RXe1ctDOBL9qbn0h38ysmXwful2d+RVJdiqXlyUxmiXi4kzusAXagBIkNIofkWR+0yrUIwaRytMVvXoXqFZP/cJZakm1Zkm1Zkm1Zku2fTkGWZFsW50QtX5QuvJ3wv9BbB9mZ6UJUi0PAdPDk6+3bnLKUEP4XpvbTxemCwWf6xd1N4iFmopgk/ESScpAe+x9IT2y6pODhYZN7dHZZkm1Zkm3178TVDKYSTO2G1MpBSZQF1aBPlKkRgI3DJ36r1SOn+4ZUyhfJcxdtskOi35ECYiw6Ljy94jwxNWSdqN/nOVs+u5358HXbiqRFGy5BwdjJ1bOUeumi5VK/oCWGrM8fKQY3JbIxizYRVTS1Xy6rPboiefliclw0WpL7J04ylVk5Fi1J/kBLsW20S2T/QHGoURVNOlA5ECzZ6U+umZAOZFfznygptSx6oI2IaT1UnDtawy8op4v4hlp9kRYsBF1KCM/OYDlJedGafFHBix988f+Jw2+DxP4WmZDfGx9IOb8qAhT5pZJyOP7hbIETp05hfhhFISF2iJZU8Fn2xqeSyMjA9sMzgMZKYvgI82vqcorlRdrALgDbDaKmufIElBbBmx3iD+yu1NYDWfgXpnZ47kp+IgTjcbWG5b0qu9f7nWauPJ1thF2QFEsRnWYIduFsicDyQP7hkVJfnal8lzBK7Sgmi87GdOCMEKsjBgGU6OPDsyl8Os4dvRS9SM+JTJFjKXL3g0NzSbcRMPoi4hA2kcQgwJNPc2qH05SFgWDkExHLHxjtdBKsDw2esxCs982HIa3wWAbNDPB5KwR77WZX9b+QWt7T75rmG2YvGpCWQDFSxiI0JxmcVyV+81GPyAfcXShp5nOdO8vpCOLV35CZsRTpH0IMZy/ZqHDyxHCei6UOXG0aPsrBT9ykD6IteHXu6Ic6cXuA0Ul2RVpg/7BHc+7KINjXg/084HAYeVsmzLWsiZzL/sZuoe2KDLNrlMSP03iv0Ir1zie2FzH3xxmkL8LzzbOfIi2pX3m3oF+R+VCcbuI3r0jov9tgdg9kAv88iOHl0Ujbe2CHEvBowD6GuZCnvzVFOzz9yRebEmoNKXQ3rNj7IHleisWT812Rp7E6zfOZo6fwf/o/tM79xEyPp6VTBKxiMLsH2cuy3HFyiuH53k6NnoN/IbX0HXdBkwbAVn4jd+VRvS9dbSdgo7MmPeEnRlsHGEtM+wUZwB4i9YhXR3pfQIE+jOR9TQrnm2jE8t10HTpGB2ITvuciq57YAfQTGcOYJEYvnNXR2ReZXeU3pFZOJZb8F7KDcnc/MSKbAjgL0ksGEK/8j662Ub8hn6l8kTx3s5SvL4QbIjRtiEAzME0k0XGyLZD94pQOO1pOvkLui/aG0Q5/7YnIK3ZVnhglI8HDp8x3UeEN6WColRPZm4UpHUht0xT5zoDU8azecnUqxewcPVnVBNaEj0fIioMdvDsT8OwAuvMd2RBL44lsLAe5cYZbDOMa8l22Wdh/9GNiMfdksoj2hRSjUeo7itHWgXkUSWrAnX/EyRLH8+n4MExceZTwRVIsZNZCsDuPgOeZKRQJWHfnv5W5Kzj1Mj4OQ9PR3aOm491pZWZrMwqfZHZT66VsuiJ568Fd0qmTM1d9kXzqH45UY3PxU0nnxdnZWqR8qjeM9suzPbUTIdhtZ/b+9HOQpIPgWFkDHMRua4fzCZPwOTDq4QiQfocZJQd+fPeMpIgzRRyePB4hyNb9BMnSs8juZHMXGc1E7ppJyuQo6CSxDH9w2ro7IW13rIJ0RfahZNGhZs0rn4aUjpYH0oD1QW+Ye/IhTmS8/IKpQT+XlPwIuSSlxcuuKuVkYD5lV5MH5zvmli+efdHfsFso/IWpjfcewlyRd7D3wkdHo8TS+drIo9OGsSecbKyE9IJl4fRmSXmSX5z7UsZ7D8hIIvezJ9kW+h1FCj+RpBy89DIcxvJDH/p33N7jAU/MPdFOzDZmMC6q9V745630lINYR0/kO6GWwdHh1MpPTEP04L2SllGjwyDY8YSKV5435Z4T+SwfPne0hp4l/ADIr4P5NfBwa7IbopUvJv9y6/bLIwQTquzGDje7cWRFFedAoajHjfrwFVihHHsE+4LkNhy3B7UI0+RScLjmlJDe8EaeRWUHQVL68NyTHHRRHGvSweRxWkZHPjlJ9b+QWgbtGfTBi600q+5wfDEFUmV00JMjWCI3/sRo63ri9kqyqUmyVBfnyINQdOPCrRz7DS3blA0G/oXaPlAc4zHQsmINTQnKuWLyp29P5Cy4IbXyxeSnk2Di/ZiCunKIXUF2MC0P1PIT1TOqVl1kR/ULhtuevuDNmStflGRPr30gmoSOSw/cHr1htI8zKVaqisWxwqUHGgVHVuvkJyqE+isa1VLjgeIkB6oPJgoe0/V8WkftxaRXTP7LaVVqoL3LFu3l1GIHu6PlFIlFZkyunyhKJsQW05sUFw7V4eI0P9FT0wWT/3RtZdFviIYuTu8iDzIoO0QP9HJQTpF4oCRmYB+UVC79RO2xt3PRDsevmPx0BpsvAjp5CM44UXpg2q7ilE2bpcYXRDK1Mact6R2RI3Y/+Q0phHsxg3aZbEvy5w9uafkVk6/TgIlWvaNXvyDNtllg2R+HyOJEA3SiNPqiNFwCW/mN7GjXA3VyqXnWRCtK+oXipJaGX5jaT2e+NRFZgCkHxIQYu6CVZyX8RtNvWizJsi3Jsq0c+4GIUeKkCn7cyxeZNU22Ry+SXzG5Jdv4A6XRpC+U0QiMJYYMSg/08he0OFZ2SAeSWT3VyT8YQilC04YIYlxKSO1EceghKppynjza+lGCNu2uEM/0C7ct4XYw6QUlSnDpgupJe5KpSoN+xahxMRS0GzvUzEmdMr6oRVP75UfPCyJhPp0t5BOtHJeLaOVYPCvJH2gplsYTLdvoPpFkuDipAdG8GAgv/hk6QcfiZZeEVn5FSdEqJUhPnrJSwsUpP9EafkE5VeIbavVFWhzFV05evpj8dCv32YsK4j8xO1K/YHol4t3FYe3ohmD2JPYVLdupDpLbcBwTYmxQHESqEgH7Rn2O01TqRpUnX2dXtRPFoYYpvcH/6F1xzIAfPgvsRWrZ7eJk4nw4BDOelr/RmrVXTD6eoj25DbLTfqJkScgqSi/o1R7IUBTbEh22E2VbkhWwB0NIIycdFMf65uJEVwPxgmXwC4o8HjWoHqv3JXcC/oUIWBvfUIhd8o02GiuVHkn2wdVzsDta3mqRmW9Eqb5ILtwOF6nxQXFWrgYtmmR0y8mJv9GtNjJ0R03NVySHi0O7DheabWG4pVoD6RW9PCjOv1D0qye7J2mU7SMp2nCMgnQiSfWgpOZSUZxw4MNDcNqJDztEy61MFKwZu0yuE7fiC1JT+InScOkLEdKWwhV91ZOf3k7YD3R0/Cdauce2MPyK5MIpELvk/+VXwP4uyM+Eg/lRkYyfFYkpPxw1tfT/xPSs80vj8YvjO+59WszO5gRsZqhxH5S30EASHRhOrfy/4AwxR5J+gCfGuCTGfixZRD5FOvCKyEGcWQhG3sYLpoZ3tjIhhpbWw0PzkBtSLL8hw+WL5FzM6INHR8q92RFcid5M5GOgpocGDP2NR/vhLMx3TXVmuzKM/SxkNR3k0etbQ23t6AEp7w56yge7PxzHWBadbgj2wisRYtxSa5hbmyawB2W64OS5K/zwk6fcOveCsfZEvzkE44O0fMXjraNx9wjQDiwyVv2CcxmRvjGKNQJ7+qQLZh6vErw4l2BUTi0rwhfZlc/MNdNXTu3E7c1raIIl+3j2hv1EdqWW2QdyYex01pCncWbKG+ZWirDUH7wqepGHXzFy+A3pKf/ck920RfjfnFWdBfM9AjNPcnLy2FyZtw8rz3eSi/9Carmj+xh6w23hbqw9g8SMcgP3Rk9GMwy9McpvP2e6iZkXTM/p7Gx+xeQVmZ98PgN5bt73UITx3ZRfMCkeoxSYPrLu+UL2tnGRvH0XzF1xJD5Q3tYlBCwi0lxCgtFUa1ietvI2clcQMVl3v3Im6GlpQloRsezFU474iszks+SOIFO0lhXL0xNnAeuS4VtBwOgNx4+eK9KQ3Uj0sZtk+H/I+/XRBzI892ZfOfehQDcOn1JUOHcRGQ1nzxtHy3toitGePrZUD358+sLZV2uIwBzAS3YJnFr41dlJgcatBVIHuXVKVFeCo1LLzhl94zRQnLelfuEsqn5iVlLnjtHhydd7T/Ls+4lzB5F2Ynq/nL3VHtidaCdmPvwPzNvxdmUn+bw9M/ksV5zFtNEePbwpAUuBkc6/Ibv5UMQWT2QSYx/rSBpfkbEWT9yEe5uB2R+fN6CudvA7ckvriyxv/YYQLG108WYIkc0knzc3oymYHcG+I72rkyJRYbg9r8gt1YOPXhZ07i9M7XR2NF/M3nCwCojxJj4K1t0IQdrQS/47soPmjLKet7/xaOu9pzn3gMPJ+b5YgJFn25UnP71D9GHVvnnkcwVJ+Q3njuPueXUiOs3J5jOFcw+zY8vT07QhrRdnOvLRU4y2zqLcC2Om8YHcl5l+rNThmQmPZ/cNt+c6kxxnMUadPHdCsCwYDRLjgvBZSnU4lGtj8BiVGoEaE8TV6RpO5K6ouxhIP776QDjjIaSMd+QdacBYFMsQvRXggyTV+xlZwiuGk5MQ08cY2VpIUnC6s6MAI6ZUAAAQAElEQVRdvAkbPQKkex8YLd65rYXPyOz8cNbxENq48//w8GfPlZPTTGR94x1TO51dza+YPBeC3Ea586QYL6w1LJ87aBreSD2Y4Ruyt/yCtG4bK0KoRUi6SCGPwSt+kF2tvWC+PzZhzCRmF3hYVbR/Ij25o/vI/8Y8je+Dpe3jMkbyuqwIK9LxwVGnh9jagQyX/8T7fbTN3t7/VmNbawnUcw9DqJBE/MZ5XHoCb8ialBgJcPcIn88Oj6UBr/6CDM799E7OuvQB5TcMwdPLm8iwkhtWYQeLMT5XeuHJsnMwJTpj1KYl5KrP2pQ7R/lEBvqZHpjdp57a4cxOjf3RXjm16kG6k3M5xrXhf3h3Ul/8f/wgiFkE7EDopCRY8tMtfkDEF/WGaNUXk5/OvuZXTL7uRc2xTbdkWzn2C6LZ6Lj9wBkSqkRtkFQcCEYiffCTieNLBSqxg4BZEo59YXquevJfftmRseuuk6cHN5764GTi3LjVrgTSkjta3UvAqA+3B1O0k4+LY5P/han99J3V4mUXI7Kj46AUJJJjSfSF4lirg+KEAyo2kF6QmlGEf6HFaSj2PvpiIgyXSNWT1ptDMKUxKAKmG0bA06MccsAeVHol4vCJ4RJi7IJefsHswasEceG2Z+6KEiXLkuzEIC7BcUlRP+7lV0y+zo5mJ2YexRdMLfxEavAsRtLhQvMEommKBb18scxSURyTAUQHrjiCckdKB+rUSTClcCJJOSj8yIPXJSePiNNK/IcdTc5mqTtctPyCkaK/oXq6guwdrdEvKPJ1LX4rW3EQ/wtTO93KffaigjioaCJfVJHdQlPOgUJRjxv14SssyJ7MvqJXX6RmmyVGlxosBQNqkN7xz6LUofSs555ooIviWJMOJo/DRk+CM3LhVrne0FL1RfLy4mTi+ORqZnEImLJ70HJkhBNJbAvDg3/4c7ZcsjgErHkQhdy4cCvHZDfMpWi2kS3bi4CsoU/U6qA4/rhlxRqaNkgRSYvJf/nZIw4EI1HbxfniCJh4KKagrhxiV5AdTMsD9eTqGVVbXWRH9Qfanr4i+YnMJfcPlERZlPWOliXc+C9MzRIds8MKHvwLjYILb98NQ1JfbBP8hoYZ0aA4xmP+4lFv7mUnbtKHUAv+6UePZN9n7YOr50E1Vf+BlhiyfEHS8gvSU6mIPu0KFSeIVG7xZyVqdIO4cARisotvr7TaAx2Og+Kwgj4pKI7t5ralWNGyDbfyJ/IPSsOlE9WqcpyAPxGpZt8rdjj+ExlLjRa9IWWl9oJp16U4bYnjbi3RErnxMYeSHihBYoPIIYFiErz3ETDZxsUJ4sLRtAiTnVhFlnDjwT/cWzvRM3PsCq5r0aYHHy7dUBxLWMMrStRb+YFeHcw9MC0W5CyQwHIoaei/PY3pv2EE/HWZONQaB0lrZQRMn3VOCr+gJbEbW0SA2KAs25Is28qxnyhFWXlyadF3pMmSbMuSbKt/P3F7fMXk65IYFWWSmDXcITJ/4twxzKs+MJSZ7NCJZNUXyVsvJkiKkHTx4BQwCsJTE+eJqSHrRP0+l1k2Sm88Gm7TgdvBtL6gdF2hnLR/0HII8Yq+8WGJyBiZ9RtT++WZSu0FkTDLxmUucCI+iEAuzpNrddDqYcXiCPYFSe0G2Q/MVLRFqqJJPejlJYQbgdcO8QeyQ6J2ojjhQh1UaklPlFSunshJBq0vlCmb6BfU6ou0OIqvnLz8Da3cZ18x+bqemB1okmzn/wowvyLya+BYfkoMxyclwZL/cgb7yyM4xq+LCMQOBg9HSIu+MQoyxjXEC1+BlaNvMr+e0hd+8epXnqnwG4bgu5vsDzuarph8PZBP9Rem9stzc2rgPBOC8cn4NRcxu9fzPVYvn2w6OoB6YNTUQSSs5B3ZSiHfW+8nTB6dQlZEe8E8MB2H08IbelVxeKrRfiC7Wz1xp9qeN8CpYbTBoV2eOo6h/39K3gVZdmXHsQRy/nN+tQBSCilC2ueWH5IgwI+74mZ3m21rexFxCLacDFsyReLwFA6PmHyxKQFrb5HaK1LA8lv0XQnhN4yA9yPYlRqQ3xnAqDUeCMGG9RWwRXZU/wup5T3dT/MN2RSOTEsiewEMTp76zec3T2wPbz+QtrKprRqI+hdSyxNp6503LMk70vSC6Vmni2dMTDcE++ZIh32X+hCKV0xPeDD3NIcEaZ1Hk5ycPEZL4G8/mvKr0Xns4J4q8Dvmq5ipNXD9gcxjjBDpQ05y52yrfkGaYNxIQpz8iOyptsgsxp3pRYNgd47wuTMkfYvsSnO2P2P2tkpyIPOwGFsCp//wz8XTc+N0h9+ctvJFIE8MvGKLR2Bn0ysm//V+TeQsBj+cBeWL5G15Qgp5bn6RD05j/p/j6vSc2JWpjwLdanjYYDrqBCz/aaaPS4Yn0hu+nqbeeeVZGX5D5soXyWfbE59Kf5v2hX+89+Vlkd4wtcPZkbbTD34ijVhfcuDZHOHbz0ESahhJx/+FbeW3mfV84Qj8jEnCg6xKD8vmW+EdAA+dWmy60UPwO2cfGss7nV2tsyOV4WSIzYN0UmbkorOjGkg5Rn3v7EwKy0mZJIZTJBueGB5EZEtYu5qg35BK+WLy9byV8SlEC/nBCHgenuvS8ye2+ByOHX9haqezpnmeyBug/cHAvh08npO2C12Z3yIibKa/OEOjJNJRa5iJpg0fHrqe1ayglvfhZMPT8MLTg0+1G8oeOWva8YoUYrmUxv4m8P5GYL6qeW6gB4lrGj+YGrP/zXb2mGFn525IT3mQanLSvuMbKR+rvjFjPDIdeL+kSMA+fLLELM/EBUmxiLMegt15BLz3ETCeyj60NJYz3d92ker07EvSWq08UyTY6HeOzJZE9Cwnnd3fnI2p460X28zdi0CW5Z4rRj55yRHaCbli8hePfC6CYAzz0MbBaG/+M0sj39HBA9NzevbSA/D1xI9VJWAViwRs1kVl5/CdDsfzg/U35J47Mpo6s6OH4+UELPvefe6ZyBy7ks8ush+ehdHBvgVkOW0M1xqQXrCVTDKYlvCPsxn9yqF0J6b7mlZLa5IrJj+dBMvvN7OQ87Hknf3CaaSyOtl/sXZ3N93gh5OVL5Lniv7GlRL4uugzSgwv9OnJtpzR0MXjFxtkCj35OARLvpVeBQergNjtjtwTZxCjWmt44eyjkiV08bZwAO2Zpzbee5JOY1aE8bSLkPRoDF493eF/YWrx7Ane/BBfsLupnZjhcJ7I98X66EjpKdJzYFJyoG2dKuc3OjBFFpUWk1EnTynZNx4daWlOwHrHHZlGyP+t9XkEjL6IfU1zuiCNN/w//gio/D3wT7TU+iN6a6YpZjguQ0zEGSYuF6fsgqJPPW7Uh6/ACuXYI9gXTL5uo188qRKQi7MkUYomzjcifey7GD7uLMjuxeGZtCpN0KVldMrCq0sqntzDdUVL5YvJ18Vxc20MXtybv6KV++0rJl/XN7IvveIsOilOa+z0kVIV2guyo9VXlEQNu6CkrMOxycWBYGot4UOkcOVE/MNTSu8NmSu/Y6U8LAmISQTsg7JsS7JsS7JsS7JsK8dygHhgKfwBmUmX7akv2sNt8OaSHe0FJeq49ILMSkq0dENxvEpQybnrjuJQNdA6SL5t+sUUhb6oJ0Sr7kRp4zvqc7zpiZv0IdSCkW6IALdBWrRoP/MvWdu16DvS7OxENa5y64OkspBFDJFNZlJQxeTrklZe9C9KQtX0NdMnbk0azR9sVk4GitMd5EGo7BB9oZeDcorEAyUxA/ugzD9xDiRd8+IB9iqPSC36zZksf0HkvVxpCxVrgsO99IqmbHT/IpKpjFmPiFz9grkrnoGgbWGSgvgrtoPqE0b7ci8/0TM7l8mGr0MwM+APipM6gCjfUMOlQYqYcj44maeDaMoftzc/kTJdMSVsOemji5MeoPWEcgKm8Bd3dXGMCwaOhcClBKQ/0JqnX9H0G92SLNuSLNvKsS2T2ImaXPoHeurMWJJtWZJt9d8Vk8dT8fbcMJpEOSZaRfnkIR/eDOmKXv6AFsfKTulAMqunevJ1mwTTG4piaq+YtfQE0lOccKjDNNXukgS2/oRorT+hRInJWOoSXD1Lv7hlqiYa1KIXxdDkGw9+4kxA1Q7D//J0pQ6OWceszCzB66Jg5VgOEH9wBNE6HT8cIbYNdgiti3b4x8n0xzL9+3QDbYvZD7vvpIZuWTGRK+krSlNXT9qSDFo/mKLQTzSZHxVEjJp1QfLyxeSnW7nPXtRiOXn5FbMj/ILpUc7qpMZjP8je6o9o2RYBO1CCxAbFoYeqIg5qDgSbPLGkAXbF5C8eWQRMb5gazjPakrZ4eRNxrIPbXr6oKwoW/oQSxZhy2kXAFHHQSWUPkmDk4U8uTV16R0mWXtyrWzm24TioZCBMtiVZA4taNBUcqqlfuDjUMIngCUR/OKwENH7kQStnolJrSsCU84TRTifBlIedSAK3QeGLNnl3DtqL0fBhyoRyHjkz1W+IUr6YfD3LbAvDnbWgPi5NLr2gZQk3fmDydRZvRp3M2wM2AzHRppzg4aJgJ0j2op7QqE7TYOPBxTEKQHTg4llbuoUPvwhJj0LwL8+y1G8YgmcPcNjQiTrfZjJxFtnV7BUl2wTsREmR8B9EmDYrmMYgrLyoa2wHygs6Ov6KVvcTMNkfLmfOssdJRBbxxP87/lr4jvzVMH9MpAGbvyb+8PSs8yfL/jXyFfkDZGpazK7kJ7KnHGHxuJex3k/AqFPIXRDsjXcJ9UUghO48gJVktYbh6SELdH9y7poB+pb3pdHX29syIVadKfIdKYncN0SnMHNsmwKlFP7gmVkHsPSymmyNHeE4OzH49kCw5dH+4SzM++iaGX6U4bs7/HCefdYyF53LPrNkF86G2RkNh2Dbc/IuQb8ik9zFFRhJrWE5O8gylIxuGPXE7H3A9LYvbdRjJ492OgmW/lkFSYLn20cfrZxFf2Nv4eMWMxp24nxB91aH713de8nDf5297XlBdlLmlanjZMNzz/Joh1OkwnManzE9p7Oj+RWT5+Ige/Kt9HBF9xGwikj/QvZMF8nsYivz0OiMN8t+kvw+yLRQiEX/j95ZduxygAUPPOtOGdKuG6KUvyA1lmOp56nzXb0/EnVs659aNT7uF+mpvpg8TmN2Vk1ejfu+MbXzXrrPnN5b7eDp+XUenM0ANTKSRCCcXyy7ALZUL6JFyjtfkZ7W/xOyhb5eAGJckw9aPQUoIu9Ce+Dz2kQaWZAszc/IJnq65hGZYk3nL5jvSTvTlNIzfnIWtucH24G6yE4m2RGOsxQJHnU5QnedSC19/8X5iTr7gHkEmwJ4lnPfZBvh3EHse16RntxBU4w2trIuhBIcKw+SYKlxCQbBqGDMobR2xeSHXxamu3ICOw5Oyq4aATUCc9gLp4Hi5xsunN3VT8wKdu7vCVBBI2GKp39qH46W/XRm1/+fszuzLJu58It3J/yG3Fe+mPzw7EoOdgpsFzg8QqWHnwAAEABJREFUH4LCfXxMLPIFKcTSf2L6S+j7Qu5CJK5OFn4sRc2FeAyGJWtbktyz2FL4en6P7Pr/QnZNPy/InnICNjTfAuEB5QSUsHrvS7b6N8/uu889tNPKJj5i8ujxQ1u87O6eJx4tziIsGbvZlSz7vzEa3q9iAKMfIQbpPSAiVvEdZwk3kDBDNxfzdihDo5NXD9IDtCeYuyBYOphL/cXb2zZCrH0ZDTkwO9hMDUuSZ3wh/bys+4I400R0htgATQwnTaVpA/uoJU1vkZ4z/66FX7y7Hvih56XZdcXUwoPftSce7cF5OPa5GxLL4z/IPSF81ujcOYZSI9DDFuqx8LBF7q36hdk5eobpxaJNGwQLH5+e71p5H9NmWl8wPXheBWD01RoufO8BWIZOwiUYT2Wa9uoI+b+V+DePdvOuYPYVt8Zt/5NYtzx3nDNo5YvJ45kJ3jxPTd8Vkx/+qTGOLScb4yOzr4RaEE/Ghr7vjjwydcZGh2c+HM9vQXnmLhwh7UBF8l/s7Axn6fSSkSQCzJBNZAU5YiYg8+LhdORNqQTx6n9g7o7PCLu6gsAdO5YVlLeWjDLsosNoJqY6fvBXzNOZyK70FKMd/l0Lv3huyRyYh1ABGrtgsokUYvmiL2wrejAPWESZ34R57sjQf+XpjbMty9iEsWM4eeyLDE3E2/uC1Lr7EXNd5q7IZZHwmQvPN4H8bvkmGKU2FA9eTM/htFT7C1M7ne7mV0z+Hz338p10913zvwFoHo7zh0Lxp0EFDw+Z3ElFVLnInHbLxoUXV5Oi4E8Ybd3f6Jlhlzg23JKdcKCXByVIbFAceg1EHJRuKA2XwFZ+MBVx7NTxExHpjimBklK7oaRyzUmerEjAlIYTk1i2JX3czcUxLtgDImEpUpcS7tyatU9oSZaNCwfFsckXgVRw4atL5C9+zNJhSbbVfw9IVcg4HZZIYrhxKcHiEDCJgH1hFUpX9PIHtDhW7pU+SKqc0cmMY+XJTyfBlEJQhOSvyJLUAl/ok7c4zPpCL79g7sNt02zZvmDS8EWJunrSliRIx0dHLC9a/kGjrTPc7ERNzRdM/h+cQcxilYhZsBhmuIc3WiqKYzKA6AB+4ibZiawPTsEGsRZAu0HDyYVHO1FSufRBzaF1kj/iz2yGcHTLEkjArPwjyDYcO1FSJFycyIAG/YspCv1Ek3mVwSMiYjDrguTli8lPt3Kv/YKKjj+gMiNpquIkE3xcHOOxE5kp/wup2Uzg9jcyjYZJBKqg5kAwqUEavBFpROmG6VkPpPaAPnRLTReTx3mORFIkYNLBbziD9iI1cfyKasXiEDBlNJgkaFtOOUhiWxgevPjR8xemFreEnS6OYV4Eym48l0Y9cbvSVB1ODZMIGIiljmOQWoPlYkNTgnKCpmrI1aGoiQqm9INSJOW0TnIiCaY87AsjSYhNLNvKsb9Qy09Ml5Z9IbPtviFK+WLy9SyxLQx/QAkdl16QGUmJlhb9jt4esBnodFscK++QpXdMMfVFBU10xAcUx+gA0QGwAA4f1ngIJ27SB9ER/MtpUeo3DNEp62ul9ozsLS+ya7JESwc/EUnRL0itEvKBlaye5mRB0RD0FZPHKVRPfnonYIsO4n9harg4toXhlmIQ27INt/JP5B+UhksnSrLm/BPZ1c5FOxP4or35iXQ3v2LydeB+eeZXJNWlWFqezGSWiIc7ucMaYAdKkNggckie9UGrXIsQTCpHW/zlVaheMfmLs9SSbMuSbMuSbMuSbL86BVmSbVmcE7V8UbrwdsL/Qm8dZGemC1EtDgHTwZOvt29zylJC+F+Y2quL0wWD3+kPdzeJh5iJYpLwE0nKQXrsfyA9semSgoeHTe7R2WVJtmVJttV/J65mMJVgajekVg5KoiyoBn2iTI0AbBw+8VetHjndN6RSvkieu2iTHRL9jhQQY9Fx4ekV5xtTQ9aJej/fs+Wz25kPX7etSFq04RIUjJ1cPUuply5aLvUDWmLI+vwjxeCmRDZm0Saiiqb25rLaoyuSly8mx0WjJbn/xEmmMivHoiXJH2gpto12iewXFIcaVdGkA5UDwZKd/s01E9KB7Gr+ipJSy6IvtBExrYeKc0dr+AXldBGfUKsv0oKFoEsJ4dkZLCcpL1qTLyp48YOfyEoGLMm2LN38//iDYIw/b9Ya+AMhfx0k5S+NKQ7nb4Zw4tQoVC9W7QAtUXBxoiPDok+GjA2PAsFOvkl2I3PXCPmr6skplhdRQa5g2dzHECKG3umGcPzHvotfnB0sZio6jpX/hakdzmTfdiIF7GlHr2pzGvItwXOQyvBURoWPPa2jny6WYtR3CoINZ5aEnys1vAUUMKX+xlnBpvIT6UGPjX7l7KEwEZ1d0N7xQarVg6jkWJrp++JQro1Rr22gwOVsIIlBgG8+zakdTtNsI0HD2lMciVjpxNROJ8H60GB2/WAEvB+VLeSB9F7w89aKX9V9Ajs6/RdSy3v634vmG7I6ZSAtgSJtxQjNSQbnVYm/fNQj5oXZXZ5mviCcVZ/d0fHqT8jMWIrdmIAU3s2suyKUamIa6Zr0iN/CwU/cpA9iKHj17A4/cXuAz0eF4LuK7A87mhYvu/NVs5Ma+nC+irzXT7i29J6Ukzxjt1C+IvvZNUrix2m8V2jFeuc3thcx98YZpC/C95tnP0VaUr/ybkG/IvOhON3EX16R0P/bBrN7IBP450EML49G2t4DO5SARwP2McyFfPtTU7TD0598sSmh1pBCd8OKvQ+S56VYPDm/FXkaq9M83xw9BRCtc9948kyPR+oUAasYzO7B7ENGOHlyPL/bqfXC6T30E6ml77gLmjQAtvKOuSfVEzPGDMarcgUAwUqK9BxIyngifQPDacC+RBoiXh1pBkiiA1f+IKXj00ID9nkbBAvvJ6WxCb9dkRd9Y3pYSgeReuMbfrpyTe9JPzs/nJ5ylFjyN2SWcl/wjRHZFMBZkF4ygHjlf3S1jfoN+bbyRfLczVI+J4QbIjRtiEAzME0k0XGyLZC9cUqHHS0nXyH3RXvCaIc/9kTkFbsqT4ySkeDhU+a3qPCEdDDUyonszcKUDqS2aYr8ZkDqeFZvuTqVYnaOnqxqAmvCxyNkxcEO3p0JeHYA3fmMbIil8UQ2loPcOMMthnEN+S7bLOw/+jGxmHsyWUT7QYrRKPUdxWjrwDyKJDXgzj/iZInj+To+hokrjxK+SIqFzFoIducR8DwzhSIB6+78fw9yV3DqZXwOQ9PR3aOm49lpZWZrMwqfZHZT66VsuiJ568Fd0qmTM1d9kXzqH45UY3PxU0nnxdnZWqR81RNGe/NsT+1ECHbbmb2vfg6SdBAcK2uAg9ht7XC+MAnfgVEPR4D0N8woOfDy2zOSIs4UcXjyeIQgW/cLkqVnkd3J5i4ymoncNZOUyVHQSWIZ/uC0dXdC2u5YBemK7EPJokPNmkc+DSkdLV9IA9YHPWHuyUecyHj5BVODfi4peQm5JKXFy64q5WRgvrKryYPzG3PLD8++6E/YLRT+wtTGew9hrsg72Hvho6NRYun8bOTRacPYE042VkJ6wbJwerOkPMkb576U8d4DMpLI/exJtoX+RpHCTyQpBy+9DIex/NCH/h2393jAN+aeaCdmGzMYF9V6L/zzVnrKQayjJ/KbUMvg6HBq5SemIXrwXknLqNFhEOx4QsUrz5tyz4l8y4fPHa2hZ8nMRs/uxaR4bP83ACX+OKj+dZDQ/Aet0b9Q4TgoGpotDme3oopzoFDU40Z9+AqsUI49gn1BchuO24NahGlyKThcc0pIb3gj30VlB0FS+vDckxx0URxr0sHkcVpGRz45SfW/kFoG7Rn0wYutNKvucHwxBVJldNCTI1giN/6N0db1jdsryaYmyVJdnCMPQtGNC7dy7Ce0bFM2GPgXavtAcYzHQMuKNTQlKOeKyb99eyJnwQ2plS8mP50EE+/HFNSVQ+wKsoNp+UItP1E9o2rVRXZU/0Lb0xdct9HM3BUl2ZYl2ZYlAXpHT41oqfGDXj7YqhuVnc3gP4jW+hMqYicSYFfu4Y2WiuIkBx44Ugof/7SO1oeQXjH5m9Oq1EB7ly3ay6nFDnZHyykSi8yYXK8oSibEFtObFBcO1eHiND/RU9MFk7+6trLoJ0RDF6d3kQcZlB2iL/RyUE6ReKAkZmAflFQuvaL22Nu5aIfjV0x+OoPNFwGdPARnnCh9Ydqu4pRNm6XGB0QytTGnLekdkSN2P/kNKYR7MYN2mWxL8ucf3NLyKyZfpwETrXpGr35Bmm2zwLI/DpHFiQboRGn0RWm4BLbyjuxo1xfq5FLzrIlWlPSG4qSWhjdM7dWZb01EFmDKATEhxi5o5VkJ72j6TYslWbYlWbaVY38hYpQ4qYIf9/JFZk2T7dGL5FdMbsk2/oXSaNIPymgExhJDBqUv9PIHtDhWdkgHklk91ck/GEIpQtOGCGJcSkjtRHHoISqacr55tPWjBG3aXSGe6QduW8LtYNILSpTg0gXVk/YkU5UG/YhR42IoaDd2qJmTOmV8UYum9uZHzwMiYT6dLeQTrRyXi2jlWDwryR9oKZbGEy3b6D6RZLg4qQHRvBgIL/4ZOkHH4mWXhFZ+RUnRKiVI3zxlpYSLU36iNfyCcqrEJ9Tqi7Q4iq+cvHwx+elW7rMXFcRfMTtSv2B6JeLdxWHt6IZg9iT2FS3bqQ6S23AcE2JsUBxEqhIB+0V9jtNU6kaVJ19nV7UTxaGGKb3B/+hdccyAHz4L7EVq2e3iZOJ8OAQznpa/0Zq1V0w+nqI9uQ2y0/5GyZKQVZQe0Kt9IUNRbEt02E6UbUlWwB4MIY2cdFAc65eLE10NxAuWwS8o8njUoHqs3pfcCfgPImBtfEIhdskv2misVHok2QdXz8HuaHmrRWZ+EaX6IrlwO1ykxgfFWbkatGiS0S0nJ76jW21k6I6amq9IDheHdh0uNNvCcEu1BtIrenlQnH+h6FdPdk/SKNtHUrThGAXpRJLqQUnNpaI44cCHh+C0E7/sEC23MlGwZuwyuU7cii9ITeEnSsOlH0RIWwpX9FVPfno7YS/o6PgrWrnH/kUbTfiiitmFJs7yQw/u/wYgf2jkT4WfvySG89fCak8YbZ2/NB5/cXxGdqWH+5nIHyVh0RCwmYHn8uUAfVxOkjoEg9PzT84MzbEs7V0JTMNjZFiy0UuYWuSOqYXjTzwanu/Jjl7W1oRdlRRPjVZW0h3OQPkNU0h9kRoDjH7x6Eh0UmtHQtTluZtqergEQ3/i0V6cbfmNqc5sV4ZxFQtZTQd59PrWUFs7ekDKu4Oe8sHuD8cxlkWnG4I98EqEGLfUGubWpgnsQZkuOHnuCj/85Cm3zr1grD3Rbw7B+JCWr3i8dTTuHgHagUXGql9wLiPSN0axRmBPn3TBzONVghfnEozKqWVF+CK78s1cM33l1E7c3ryGJliyj2dv2CuyK7XMfiEXxk5nDXkaZ6a8YW6lCEv9i1dFL7PzJC8AABAASURBVPLwK0YOvyE95Z97spu2CP9/zqrOgvkdgZknOTl5bK7M24eV5zfJxX8htdzRfQw94bZwN9aeQWJGuYF7oyejGYbeGOXdz5luYuYB03M6O5tfMXlF5iefbyDPzfseijB+m/ILJsVjlALTR9Y9P8jeNi6St++CuSuOxAflbV1CwCIizSUkGE21huVpK28jdwURk3X3I2eCnpYmpBURy1485YiPyEy+JXcEmaK1rFienjgLWJcM3woCRm84fvRckYbsRqKP3STD/0Pen48+kOG5N/vKuQ8FunH4lKLCuYvIaDh7njha3kNTjPb0saV68OPTF86+WkME5gBeskvg1MKvzk4KNG4tkDrIrVOiuhIclVp2zugTp4HivC31C2dR9ROzkjp3jA5Pvt57kmffK84dRNqJ6f1x9lb7wu5EOzHz4X9g3o63KzvJ5+2ZybdccRbTRnv08KYELAVGOv+E7OajiC2eyCTGPtaRND4iYy2euAn3NgOzPz5vQF3t4HfkltYXWd76DSFY2ujizRAim0k+b25GUzA7gn1HelcnRaLCcHsekVuqB796WdC5vzC109nRfDF7w8EqIMab+BSsuxGCtKGX/HdkB80ZZT1vf+LR1ntPc+4Bh5Pze7EAI8+2K09+eofow6r98sjnCpLyG84dx93z6kR0mpPNN4VzD7Njy9PTtCGtF2c68tFTjLbOotwLY6bxC7kvM/2s1OGZCY9n9w235zqTHGcxRp08d0KwLBgNEuOC8FlKdTiUa2PwGJUagRoTxNXpGk7krqi7GEg/vvpAOOMhpIx35BlpwFgUyxC9FeCDJNX7jSzhFcPJSYjpY4xsLSQpON3Z0S7ehI0eAdK9Xxgt3rmthc/I7Pxw1vEQ2rhza83QEXcG5eD0VH/B1E7fGZb0vmK0XAiylVaemcJwJOzKuQeFJiJ642KGw09kb/kFad0yK0KoRUi6SCGX4xU/yK7WHjDfwyaMmcTsAg+rivZPpCd3dB/535in8XuwtH1cxkhelxVhRTo+OOr0EFs7kOHyV7zfR9vs7f1PNba1lkA99zCECknEb5zHpSfwhKxJiZEAd4/w+XZ4LA149QdkcO6nd3LWpQ8ov2EInl7eRIaV3LAKO1iM8V3phSfLzsGU6IxRm5aQqz5rU+4c5RMZ6Dd9YXafemqHMzs19kd75NSqB+lOzuUY14b/4d1J/cTdkU9gAatmB5xE5/8GIH8czB8Ecf5aaH1QVmu6Inn5YvLTmW1+xeTrXtQc23RLtpVjPyCajY7bXzhDQpWoDZKKA8FIpA9+MnF8qUAldhAwS8KxH0zPVU/+5pcdGbvuOnl6cOOpD04mzo1b7UogLbmj1b0EjPpwezBFO/m4ODb5X5jaq++sFi+7GJEdHQelIJEcS6IfFMdaHRQnHFCxgfSC1Iwi/ActTkOx99EXE2G4RKqetN4cgimNQREw3TACnh7lkAP2oNIrEYdPDJcQYxf08gtmD14liAu3PXNXlChZlmQnBnEJjkuK+nEvv2LydXY0OzHzKL5gauEnUoNnMZIOF5onEE1TLOjli2WWiuKYDCA6cMURlDtSOlCnToIphRNJykHhRx68Ljl5RJxW4j/saHI2S93houUHjBT9CdXTFWTPaI1+QZGva/FX2YqD+F+Y2ulW7rMXFcRBRRP5oorsFppyDhSKetyoD19hQfZk9hW9+iI12ywxutRgKRhQg/SMfxalDqVnPfdEA10Ux5p0MHkcNnoSnJELt8r1hJaqL5KXFycTxydXM4tDwJTdg5YjI5xIYlsYHvzDv2fLJYtDwJoHUciNC7dyTHbDXIpmG9myvQjIGvqNWh0Uxx+3rFhD0wYpImkx+ZufPeJAMBK1XZwfjoCJh2IK6sohdgXZwbR8ob65ekbVVhfZUf0LbU9fkfxE5pL7BSVRFmU9o2UJN/6GqVmiY3ZYwYP/oFFw4e27YUjqi22C39AwIxoUx3jMPzzqzb3sxE36EGrBP/3okez7rH1w9XxRTdV/oCWGLF+QtPyC9FQ6kdqMKGdkadAPiCacBmKyizNX9oKOjoPisIJuKSiO7ea2pVjRsg238k/kH5SGSyeqVeU4Af9GpJp9r9jh+CsylhotekLKSu0B065LcdoSx91aoiVy42MOJT1QgsQGkUMCxSR47yNgso2LE8SFo2kRJjuxiizhxoN/uLd2omfm2BVc16JNDz5cuqE4lrCGR5Sot/KCXh3MPTAtFuQskMByKGnovz2N6b9hBPxxmTjUGgdJa2UETJ91Tgq/oCWxG1tEgNigLNuSLNvKsb9RirLy5NKi70iTJdmWJdlW/73i9viKydclMSrKJDFruENk/olzxzCv+oWhzGSHTiSrvkjeejFBUoSkiwengFEQnpo435gask7U+7nMslF64tFwmw7cDqb1AaXrCuWk/YOWQ4hX9I0PS0TGyKx3TO3NM5XaAyJhlo3LXOBEfBCBXJxvrtVBq4cViyPYFyS1G2R/YaaiLVIVTepBLy8h3Ai8dogvyA6J2onihAt1UKklPVFSuXoiJxm0flCmbKIfUKsv0uIovnLy8ie0cp99xeTr+sbsQJNkL+obqWnO/G8A8mdB/jiYPwj+ev+SyF8RwTH+ukgzETHx4whpYXM0AMbqJGSFX9wGVrZh/mrKphXKk6//8EyldsMQfHeT/WFH0xWTrwfy6r8wtTfPzamB80wIxhf2tw4ePr9aYhu49Q1ZhrVKwLriGdlHIb9b7ydMHp1C9kR7wDwwHYfTwpt6VXF4qtFekN2tnrhTbc8b4NQw2uDQLk8dx9Aj4hBsORm2ZIrE4SkcHjH5YlMC1t4itVekgOW36LsSwm8YAe9HsCs1IL8zgFFrPBCCDesrYIvsqP4XUst7up/mG7IpHJmWRPYCGJw89ZvPb57YHt5+IG1lU1s1EPUvpJYn0tY7b1iSd6TpBdOzThfPmJhuCPbNkQ77LvUhFK+YnvBg7mkOCdI6jyY5OXmMlsDffjTlV6Pz2ME9VeB3zFcxU2vg+gOZxxgh0oec5M7ZVv2CNMG4kYQ4+RHZU22RWYw704sGwe4c4XNnSPoW2ZXmbH/G7G2V5EDmYTG2BE7/4Z+Lp+fG6Q6/OW3li0CeGHjFFo/AzqZXTP7r/ZrIWQx+OAvKF8nb8oQU8tz8Ih+cxvw/x9Xp+eBkbEZNX7j0P4Rhd56d0T/YV/KfKiq9FHJPHBFDXw3CHVk8Mx/OHHKKdCdL+oLTsRvoC/9470WNdWtKIVdMfnhuOfLgwU9ExG67su/Vz0ESBjGSjv8L28pvNav5whH4mZKEB1mVHpbNt8I7AB46tdh0o4fgd84+NJZ3OrtaZ0cqw8kQmwfppMzIRWdHNZByjPre2ZkUlpMySQynSDY8MTyIyJawdjVBvyGV8sXk63kr41OIFvKDEfA8PNel509s8TkcO/7C1E5nTfM8kTdA+4OBfTt4PCdtF7oyv0VE2Ex/cYZGSaSj1jATTRs+PHQ9q1lBLe/DyYan4YWnB59qN5Q9cta04xUpxHIpjf1N4P2NwHxV89xADxLXNH4wNWb/m+3sMcPOzt2QnvIg1eSkfcc3Uj5WfWPGeGQ68H5JkYB9+GSJWZ6JC5JiEWc9BLvzCHjvI2A8lX1oaSxnur/tItXp2ZektVp5pkiw0e8cmS2J6FlOOru/ORtTx1svtpm7F4Esyz1XjHzykiO0E3LF5C8e+VwEwRjmoY2D0d78Z5ZGvqODB6bn9OylB+DriR+rSsAqFgnYrIvKzuE7HY7nB+tvyD13ZDR1ZkcPx8sJWPa9+9wzkTl2JZ9dZD88C6ODfQvIctoYrjUgvWArmWQwLeEfZzP6lUPpTkz3Na2W1iRXTH46CZbfb2Yh52PJO/uF00hldbL/Yu3ubrrBDycrXyTPFf2NKyXwddFnlBhe6NOTbTmjoYvHLzbIFHrycQiWfCu9Cg5WAbHbHbknziBGtdbwwtlHJUvo4m3hANozT2289ySdxqwI42kXIenRGLx6usP/wtTi2RO8+SG+YHdTOzHD4TyR74v10ZHSU6TnwKTkQNs6Vc5vdGCKLCotJqNOnlKybzw60tKcgPWOOzKNkP9b6/MIGH0R+5rmdEEaf5FL6OYJW29GwOZ/A9ASfyx8ca9ummKG4zLERJxh4nJxyi4o+tTjRn34CqxQjj2CfcHk6zb6xZMqAbk4SxKlaOJ8I9LHvovh486C7F4cnkmr0gRdWkanLLy6pOLJPVxXtFS+mHxdHDfXxuDFvfkrWrnfvmLydX0j+9IrzqKT4rTGTh8pVaG9IDtafUVJ1LALSso6HJtcHAim1hI+RApXTsQ/PKX03pC58jtWysOSgJhEwD4oy7Yky7Yky7Yky7ZyLAeIB5bCH5CZdNme+qI93AZvLtmW/YISdVx6QcsSbvyO4kQ9XHTYlm4ojlVZi5bKHzFi6ot6QrTqTpQ2vqM+x5ueuEkfRC0Y6YYIcBukRYv2M/+StV2LviPNzk5U4yq3PkgqC1nEENlkJgVVTL4uaeVF/6IkVE1fM33i1qTR/MFm5WSgON1BHoTKDtEXejkop0g8UBIzsA/K/BPnQNI1Lx5gr/KI1KLfnMnyF0Tey5W2ULEmONxLr2jKRvcvIpnKmPWIyNUvmLviGQjaFiYpiL9iO6g+YbQv9/ITPbNzmWz4OgQzA/6gOKkDiPINNVwapIgp54OTeTqIpvxxe/MTKdMVU8KWkz66OOkBWk8oJ2AKf3FXF8e4YOBYCFxKQPoDrXn6FU2/0S3Jsi3Jsq0c2zKJnajJpX+gp86MJdmWJdlW/10xeTwVb88No0mUY6JVlE8e8uHNkK7o5Q9ocazslA4ks3qqJ1+3STC9oSim9opZS08gPcUJhzpMU+0uSWDrT4jW+hNKlJiMpS7B1bP0i1umaqJBLXpRDE2+8eAnzgRU7TD8L09X6uCYdczKzBK8LgpWjuUA8QdHEK3T8cMRYttgh9C6aId/nEx/LNO/TzfQtpj9sPtOauiWFRO5kr6iNHX1pC3JoPWDKQr9RJP5UUHEqFkXJC9fTH66lfvsRS2Wk5dfMTvCL5ge5axOajz2g+yt/oiWbRGwAyVIbFAceqgq4qDmQLDJE0saYFdM/uKRRcD0hqnhPKMtaYuXNxHHOrjt5Yu6omDhTyhRjCmnXQRMEQedVPYgCUYe/uTS1KV3lGTpxb26lWMbjoNKBsJkW5I1sKhFU8GhmvqFi0MNkwieQPSHw0pA40cetHImKrWmBEw5TxjtdBJMediJJHAbFL5ok3fnoL0YDR+mTCjnkTNT/YYo5YvJ17PMtjDcWQvq49Lk0gtalnDjByZfZ/Fm1Mm8PWAzEBNtygkeLgp2gmQv6gmN6jQNNh5cHKMARAcunrWlW/jwi5D0KAT/8ixL/YYhePYAhw2dqPNtJhNnkV3NXlGyTcBOlBQJ/0GEabOCaQzCyou6xnagvKCj469odT8BI/9wOXOWbcVJBIt4QUnJiRLzAAAQAElEQVSu+kFJ1pz/e/rL4vEXxg/yl0NIe/PXxOSvyB8gU2M/U/x1MhznT5AYPGp42CDrqjO2SM+I/4HnovQvAgxlFctj3FNrQAfTQxbIN6UrM9/IViT6b29hqjyl1ILRDmQKOfvShkqKADnu+ifyNrY0EjBYVpCtsTOb8e59w8z9w1mY99DFzsTdlU/K7uDhecOpXXvJq9+RTbMzNRyCbc/JszzaFZnkLp6GkdQaltNPxjIieuNi9oZ/YXrZOkA9dvIZDcUhWBpnBSQJnt9p9NHKWfQ3spIevo6YuXDYpJB8S/gF967uveThv54VzGZfe7/4rObu6DgZbYn5lMFrpMg2ao3PmJ7T2dn8islzcZA9+zau6T4CVhHpX8ie6SKZXWxlHhqd8Wa84cRo4WB+rzaXV2D8Gds7SxIZoy9ZZsGjvpR6RV7xjczRxGt71w9Sy3D3tZWOxSyLPi0V04pvDw2t3ZBa+WLyOI3ddeRFnvSN7UMvsqPX/oWp/TqPzGaAGhlJIhB++Y1QuSJCayR/476LJozJPznbqHNFPoj+O0esJaQt2F7Cwee1iXsXtSyK8otsyGBbE745U8idu2D/u4Sze/L0RRgkMtL4hezPTD4ryEi7itR4C+nOLEeYOw7ORPr+i+ee9D0g12PsSo1s7MKjM8utfc8r0pP30RSjjR28OYQSHCsPkmCpHfcFqWDMhXwPRTv8Ukt35QR2HpyUXTUCagTmsBdOA8XPN1w4u6ufmBXsPH8bePLDsyf5DekvX0z+n5397b1i8vW+i/yG3FO+mPzw7EoOdgpsFzi8j+9/noSVk6YM5rchTSFpkQ1vyF0MEdt8Ihsw5riOpLFIWwmIITUWm+093bl5//uQ/ydk+fRlZTdmFWp4gDdVXszevhoOprnZ6t88u++evUywc/Twq3/VuKN9f2Fq8bwhe5uz8w3Tg/frjhmQdp6f+8chGI3U8gYI9sVnSUa5kLknjsYUMS2bsTNC92a6nPngi7c3463vLvihD2YHm+nBkvBmgDs+nKHyRXK2EeE0sQGaGE6aStMG9lFLmt4iPWf+XQu/eHc98EPnqfkO1s494akdmHuS/4WpPTgLsc/dkFge/0F2h+T+QbJaw76EEbIxdBK2Mknk3la/MLtGTxszWLRpg2Dh49PzXSvnrvaA+Z1mZ4eRF6lVDyLxqlBYyQX3HoBhdBIuwehnivbqCLkr/s2j3bwrmH3FrXHbrF+eO86Z/3FNdDz64Zk58hPz1PRdMfnhnxrj2HKyMV6RXSXUgngyNvQdd+SRqTM2Ojzz4Xh+C8ozd+EIaQcqkv9iZ2c4S6eXjCQRYIZsIivIETMBmRcPpyNvSiWIV/8Dc3d8RtjVFQTu2LGsoLy1ZJRhFx1GMzHV8YO/Yp7ORHalpxjt8O9a+MVzS+bAPIQK0NgFk02kEMsXfWFb0YN5wCLK/CbMc0eG/itPb5xtWcYmjB3DyWNfZGgi3t4XpNbdj5jrMndFLouEz1x4vgnkd8s3wSi1oXjwYnoOp6XaX5ja6XQ3v2Ly/+i5l++ke98138XKD+czwoH8bwBa/IEQX9QTolUPKhn+F6a27m/0zOZSSTbcgzrRsh0RlBJCi+JAqOrDScVBxEikD07mVQ48OmxLqZ0oDhqm6pJSCz9RUrnmJE9WJGBKw4lJLNuSPu7m4hgX7AGRsBSpSwl3bs3aJ7Qky8aFg+LY5ItAKrjw1SXyFz9m6bAk2+q/B6QqZJwOSyQx3LiUYHEImETAvrAKpSt6+QNaHCv3Sh8kVc7oZMax8uSnk2BKIShC8ldkSWqBL/TJWxxmfaGXXzD34bZptmxfMGn4okRdPWlLEqTjoyOWFy3/oNHWGW52oqbmCyb/D84gZrFKxCxYDDPcwxstFcUxGUB0AD9xk+xE1genYINYC6DdoOHkwqOdKKlc+qDm0DrJH/FnNkM4umUJJGBW/hFkG46dKCkSLk5kQIP+xRSFfqLJvMrgERExmHVB8vLF5Kdbudd+QUXHH1CZkTRVcZIJPi6O8diJzJT/hdRsJnD7G5lGwyQCVVBzIJjUIA3eiDSidMP0rAdSe0AfuqWmi8njPEciKRIw6eA3nEF7kZo4fkW1YnEImDIaTBK0LaccJLEtDA9e/Oj5C1OLW8JOF8cwLwJlN55Lo564XWmqDqeGSQQMxFLHMUitwXKxoSlBOUFTNeTqUNREBVP6QSmSclonOZEEUx72hZEkxCaWbeXYX6jlJ6ZLy76Q2XbfEKV8Mfl6ltgWhj+ghI5LL8iMpERLi35Hbw/YDHS6LY6Vd8jSO6aY+qKCJjriA4pjdIDoAFgAhw9rPIQTN+mD6Aj+5bQo9RuG6JT1tVJ7RvaWF9k1WaKlg5+IpOgXpFYJ+cBK4ZKaS0Wi7MZy6/KPxgvbyvZKwx3E/8LUcHFsC8MtxSC2ZRtu5Z/IPygNl06UZM35J7KrnYt2JvBFe/MT6W5+xeTrwP3yzK9IqkuxtDyZySwRD3dyhzXADpQgsUHkkDzrg1a5FiGYVI62+MurUL1i8hdnqSXZliXZliXZliXZfnUKsiTbsjgnavmidOHthP+F3jrIzkwXolocAqaDJ19v3+aUpYTwvzC1VxenCwa/0x/ubhIPMRPFJOEnkpSD9Nj/QHpi0yUFDw+b3KOzy5Jsy5Jsq/9OXM1gKsHUbkitHJREWVAN+kSZGgHYOHzir1o9crpvSKV8kTx30SY7JPodKSDGouPC0yvON6aGrBP1fr5ny2e3Mx++bluRtGjDJSgYO7l6llIvXbRc6ge0xJD1+UeKwU2JbMyiTUQVTe3NZbVHVyQvX0yOi0ZLcv+Jk0xlVo5FS5I/0FJsG+0S2S8oDjWqokkHKgeCJTv9m2smpAPZ1fwVJaWWRV9oI2JaDxXnjtbwC8rpIj6hVl+kBQtBlxLCszNYTlJetCZfVPDiBz+RlQxYkm1Z+s8uzuV/A5C/GfJnQSJ/KeSvhv1L4oFVIUEgNYYnm8goytRJ6EhM7QunsXekkr+m/mD+gomnKRDsQkjHwcxEH172uWzpQDtIX7C7UlsP5LK/MLXD2Zz2wCAFrI/5wl7VphTyWwUzORhl2IWTYk/ruqm/QRpYHrjxEZCyGaen+8GUzt+eTeUn9rq0okyeegS2rDbKuYOdrRfpOhGVHGNR9C8OzcJuI2D0RcQhTJDEIMA3n+bUDqcpCwPByCciln9htNNJMH60WX3OImIV52NIK3wtg2YG+LwVgj12s6v6X0gt7+lvTfMNsxcNSEugGCljEZqTDM6rEn/5qEfkA3cXSpr5rnNnOR1BvPoTMjOWIv1DiOHsJRsVTp4YznOx1IGrTcNHOfiJm/RBtAWvzh39qBO3BxidZFekBfYP+2rOXRkE+3qw3wMOh5G3ZcJcy5rIuexv7Bbarsgwu0ZJ/DiN9wqtWO/8xvYi5v44g/RF+H7z7KdIS+pX3i3oV2Q+FKeb+MsrEvp/22B2D2QC/zyI4eXRSNt7YIcS8GjAPoa5kG9/aop2ePqTLzYl1BpS6G5YsfdB8rwUiyfntyJPY3Wa55ujpwCide4VMz2elv/RnF2Z/ubZHf2GNIfnd7vWDv6D2Y8fuzcNIGVD3vKC3NXqiRmjFxsdnlr4idHWAS5JTPsFGcC+ROoRr470vIACfRjJ85oUzjfRiOW36Tp0jA7EJvx3K7LqGzuAfiJjGJPE6IWzOjr7IrOr/IbUyqnEkr8hOyh39zdGZFMAZ0F6yQDilf/R1TbqN+SbyhfJczdL+flCuCFC04YINAPTRBIdJ9sC2RundNjRcvIVcl+0J4x2+GNPRF6xq/LEKBkJHj5lfosKT0gHQ62cyN4sTOlAapumyG8GpI5n9ZarUylm5+jJqiawJnw8QlYc7ODdmYBnB9Cdz8iGWBpPZGM5yI0z3GIY15Dvss3C/qMfE4u5J5NFtB+kGI1S31GMtg7Mo0hSA+78I06WOJ6v42OYuPIo4YukWMishWB3HgHPM1MoErDuzv+7OXcFp17G5zA0Hd09ajqenVZmtjaj8ElmN7VeyqYrkrce3CWdOjlz1RfJp/7hSDU2Fz+VdF6cna1Fylc9YbQ3z/bUToRgt53Z++rnIEkHwbGyBjiI3dYO5wuT8B0Y9XAESH/DjJIDL789IyniTBGHJ49HCLJ1vyBZehbZnWzuIqOZyF0zSZkcBZ0kluEPTlt3J6TtjlWQrsg+lCw61Kx55NOQ0tHyhTRgfdAT5p58xImMl18wNejnkpKXkEtSWrzsqlJOBuYru5o8OL8xt/zw7Iv+hN1C4S9Mbbz3EOaKvIO9Fz46GiWWzs9GHp02jD3hZGMlpBcsC6c3S8qTvHHuSxnvPSAjidzPnmRb6G8UKfxEknLw0stwGMsPfejfcXuPB3xj7ol2YrYxg3FRrffCP2+lpxzEOnoivwm1DI4Op1Z+YhqiB++VtIwaHQbBjidUvPK8KfecyLd8+NzRGnqWzGz07F5MisdS/wsv/xuAFn9AxL9Q4TgoGpotDpeqKSdZUGjqcaM+fAVWKMcewb4guQ3H7UEtwjS5FByuOSWkN7yR76KygyApfXjuSQ66KI416WDyOC2jI5+cpPpfSC2D9gz64MVWmlV3OL6YAqkyOujJESyRG//GaOv6xu2VZFOTZKkuzpEHoejGhVs59hNatikbDPwLtX2gOMZjoGXFGpoSlHPF5N++PZGz4IbUyheTn06CifdjCurKIXYF2cG0fKGWn6ieUbXqIjuqf6Ht6QvenLnyRUn29NoHUpMElSXd0bKEG//GaB9v1Y3KjmbwH0Rr/QkVsRMJsCv38EZLRXGSAw8cKYWPf1pH60NIr5j8zWlVaqC9yxbt5dRiB7uj5RSJRWZMrlcUJRNii+lNiguH6nBxmp/oqemCyV9dW1n0E6Khi9O7yIMMyg7RF3o5KKdIPFASM7APSiqXXlF77O1ctMPxKyY/ncHmi4BOHoIzTpS+MG1XccqmzVLjAyKZ2pjTlvSOyBG7n/yGFMK9mEG7TLYl+fMPbmn5FZOv04CJVj2jV78gzbZZYNkfh8jiRAN0ojT6ojRcAlt5R3a06wt1cql51kQrSnpDcVJLwxum9urMtyYiCzDlgJgQYxe08qyEdzT9psWSLNuSLNvKsb8QMUqcVMGPe/kis6bJ9uhF8ismt2Qb/0JpNOkHZTQCY4khg9IXevkDWhwrO6QDyaye6uQfDKEUoWlDBDEuJaR2ojj0EBVNOd882vpRgjbtrhDP9AO3LeF2MOkFJUpw6YLqSXuSqUqDfsSocTEUtBs71MxJnTK+qEVTe/Oj5wGRMJ/OFvKJVo7LRbRyLJ6V5A+0FEvjiZZtdJ9IMlyc1IBoXgyEF/8MnaBj8bJLQiu/oqRolRKkb56yUsLFKT/RGn5BOVXiE2r1RVocxVdOXr6Y/HQr99mLCuKvmB2pXzC9EvHu4rB2dEMwexL7ipbtVAfJbTiOCTE2KA4iVYmA/aI+x2kqEEBpVQAAEABJREFUdaPKk6+zq9qJ4lDDlN7gf/SuOGbAD58F9iK17HZxMnE+HIIZT8vfaM3aKyYfT9Ge3AbZaX+jZEnIKkoP6NW+kKEotiU6bCfKtiQrYA+GkEZOOiiO9cvFia4G4gXL4BcUeTxqUD1W70vuBPwHEbA2PqEQu+QXbTRWKj2S7IOr52B3tLzVIjO/iFJ9kVy4HS5S44PirFwNWjTJ6JaTE9/RrTYydEdNzVckh4tDuw4Xmm1huKVaA+kVvTwozr9Q9KsnuydplO0jKdpwjIJ0Ikn1oKTmUlGccODDQ3DaiV92iJZbmShYM3aZXCduxRekpvATpeHSDyKkLYUr+qonP72dsBd0dPwVrdxjPyGa8NRAFSUbTZw3TAmPOQE/8OV/A5C/JPJnx+MvjX9j/ohJP0sTGcvfJutI/JEyKj0pIGQXUP1EatX/C84Q8yTpB3JZ/9JJ6G0gN66V0LXIzBTC8SceDT93kfeOxeTx0DzkhhTKb8g95YvkeUO/mbz3HEhLeHYEkWO5ppikNQIGpSszEGx5tBdnS+6lOr35ZRhkxYdHOz2dfS2T4KWXlp2hB53qcPLcAYkhp0539SdsCyHGS2oN3HlF9qBMFzp57wGjxU+eMjpX5sKUPpja6SRYH/qFnU1YP3bfkdWpZ/uB3AslsnCMphoh30CVXkrDyXN/K+TZf3j1m5YROhluT1fBb0hPeZBaevOaA5Mfnt3JX5EdqWX2C+dtqY+zBimN4YsjEsN5CxlNxAsvgxd5+BUjh9+QnvLPPdlJW4T/P2dVZ8H8nsDMk5ycPDZX5huGlec3ycV/IbXc0X0MPeG2cDfWnkFiRrmBe6MnoxmG3hjl3c+ZbmLmAdNzOjubXzF5ReYnn28gz837HoowfpvyCybFY5QC00fWPT/I3jYukrfvgrkrjsQH5W1dQsAiIs0lJBhNtYblaStvI3cFEZN19yNngp6WJqQVEctePOWIj8hMviV3BJmitaxYnp44C1iXDN8KAkZvOH70XJGG7Eaij90kw/9D3p+PPpDhuTf7yrkPBbpx+JSiwrmLyGg4e544Wt5DU4z29LGlevDj0xfOvlpDBOYAXrJL4NTCr85OCjRuLZA6yK1ToroSHJVads7oE6eB4rwt9QtnUfUTs5I6d4wOT77ee5Jn3yvOHUTaien9cfZW+8LuRDsx8+F/YN6Otys7yeftmcm3XHEW00Z79PCmBCwFRjr/hOzmo4gtnsgkxj7WkTQ+ImMtnrgJ9zYDsz8+b0Bd7eB35JbWF1ne+g0hWNro4s0QIptJPm9uRlMwO4J9R3pXJ0WiwnB7HpFbqge/elnQub8wtdPZ0Xwxe8PBKiDGm/gUrLsRgrShl/x3ZAfNGWU9b3/i0dZ7T3PuAYeT83uxACPPtitPfnqH6MOq/fLI5wqS8hvOHcfd8+pEdJqTzTeFcw+zY8vT07QhrRdnOvLRU4y2zqLcC2Om8Qu5LzP9rNThmQmPZ/cNt+c6kxxnMUadPHdCsCwYDRLjgvBZSnU4lGtj8BiVGoEaE8TV6RpO5K6ouxhIP776QDjjIaSMd+QZacBYFMsQvRXggyTV+40s4RXDyUmI6WOMbC0kKTjd2dEu3oSNHgHSvV8YLd65rYXPyOz8cNbxENq4c2vN0BF/Z+ipXmzn7Fqe2um7gyXtKUbLhWCmqyUMR8KunL0o/ZYgHqXd3HNH9qbO+Ohw8m1jRUi0wbyJdlqH07B5OJ7iZziDU0fvLArCxPY1bch09v0TM4d33z+R29ozmIugvCa8LFfC+YW4mEhOjQhtHG0jw81ekdnUGM77SGd/+VONba0lUM+NDKFCEvEb3zcH0vuNrInESIC7R8hbIhSRBmc3TVjFE0nmfuTJmWZpaDn0gyH4FEliJSQfbMYOFmPczfuzI9kHU6Izlt5HnLUpd46eE9nZb/vC3HHqqR3O7NS4N9ojp1Y9SHdyLse4NvwP707qJ+6OfAILWDU74CR0USePDiBNNm+X/s/in5Uo/oAo5x/JDaOdvr3SKsGL+5OLY5s+ybZy7AdEs9Fx+wtnSKgStUFScSAYifTBTyaOLxWoxA4CZkk49oPpuerJ3/yyI2PXXSdPD2489cHJxLlxq10JpCV3tLqXgFEfbg+maCcfF8cm/wtTe/Wd1eJlFyOyo+OgFCSSY0n0g+JYq4PihAMqNpBekJpRhP+gxWko9j76YiIMl0jVk9abQzClMSgCphtGwNOjHHLAHlR6JeLwieESYuyCXn7B7MGrBHHhtmfuihIly5LsxCAuwXFJUT/u5VdMvs6OZidmHsUXTC38RGrwLEbS4ULzBKJpigW9fLHMUlEckwFEB644gnJHSgfq1EkwpXAiSTko/MiD1yUnj4jTSvyHHU3OZqk7XLT8gJGiP6F6uoLsGa3RLyjydS3+KltxEP8LUzvdyn32ooI4qGgiX1SR3UJTzoFCUY8b9eErLMiezL6iV1+kZpslRpcaLAUDapCe8c+i1KH0rOeeaKCL4liTDiaPw0ZPgjNy4Va5ntBS9UXy8uJk4vjkamZxCJiye9ByZIQTSWwLw4N/+PdsuWRxCFjzIAq5ceFWjslumEvRbCNbthcBWUO/UauD4vjjlhVraNogRSQtJn/zs0ccCEaitovzwxEw8VBMQV05xK4gO5iWL9Q3V8+o2uoiO6p/oe3pK5KfyFxyv6AkyqKsZ7Qs4cbfMDVLdMwOK3jwHzQKLrx9NwxJfbFN8BsaZkSD4hiP+YdHvbmXnbhJH0It+KcfPZJ9n7UPrp4vqqn6D7TEkOULkpZfkJ5KJ1KbEeWsrEF/YTgunAZisotr8xd0dBwUhxX0S0FxbDe3LcWKlm24lX8i/6A0XDpRrSrHCfg3ItXse8UOx1+RsdRo0RNSVmoPmHZditOWOO7WEi2RGx9zKOmBEiQ2iBwSKCbBex8Bk21cnCAuHE2LMNmJVWQJNx78w721Ez0zx67guhZtevDh0g3FsYQ1PKJEvZUX9Opg7oFpsSBngQSWQ0lD/+1pTP8NI+CPy8Sh1jhIWisjYPqsc1L4BS2J3dgiAsQGZdmWZNlWjv2NUpSVJ5cWfUeaLMm2LMm2+u8Vt8dXTL4uiVFRJolZwx0i80+cO4Z51S8MZSY7dCJZ9UXy1osJkiIkXTw4BYyC8NTE+cbUkHWi3s9llo3SE4+G23TgdjCtDyhdVygn7R+0HEK8om98WCIyRma9Y2pvnqnUHhAJs2xc5gIn4oMI5OJ8c60OWj2sWBzBviCp3SD7CzMVbZGqaFIPenkJ4UbgtUN8QXZI1E4UJ1yog0ot6YmSytUTOcmg9YMyZRP9gFp9kRZH8ZWTlz+hlfvsKyZf1zdmB5oke1HfSE1zDBxOKjtMJ/5f/5bIHwWD+XNhMH8dDPLnQqRk4/lbIq36xSjI2NQvfAX+OEkVfZPcEaEYbf2HT1NihhcHeNwmf8E+4GwOv3jS1P7C1N48V6cG5hN4ZC3h5NmP51esTk47cQZHn8roieEgLVjJMzJNIb9b7yNMHp1CVkR7wPnv29W8hQYsE4dD0cPS84LsbvXEnWp73gCnhtEGh7KUnIQebHJo9A8nw27F9KTp5hHbSAJinbnhlIgt3ZFGLL9F1yaE3zAC3o/INDmQ3xnAlmfmZA9XUcs97WbXK1JrX5E9V2RH7s1sEJrW3rxtk1NoD+wNaWk1/1Xi3NRd/0QW5i6Gp//KK3ZDAizFpBdEjRJH5RkTwyHYN0c67LvUh1C8YnrCg7mrOSRI6zya5OTkMVoCf/vRNL/YuYt7qrDzjvkqZmoNjBw4NzHS5BnZRnu3HEg3KjeSECc/YjtRF5nBuDO9aBDszhE+d4ekbzGbKGZ7hn4xe6uSHMg8LMaWwOk/nN0tPiLd0W9Od/kikCcGXrHFI7Cz6RWT/3q/JnIWgx/OgvJF8rY8IYU8N7/IB6dx/p/fbF1OLxuJ4Z0IhScfj5Dq6SRY/tNMH5cMT2QmfD1NvfPKuzBvIIkOZFGnCViUSC84HbuBvvCP9z7UGK+pNaQlYvDqueWJH/oxc8Xkr34OkrAYI+kT/oVt5TeZ1XzhCPyMScKDrEoPy+Zb4R0AD51abLrRQ/A7Zx8ayzudXa2zI5XhZIjNg3RSZuSis6MaSDlGfe/sTArLSZkkhlMkG54YHkRkS1i7mqDfkEr5YvL1vJXxKUQL+cEIeB6e69LzJ7b4HI4df2Fqp7OmeZ7IG6D9wcC+HTyek7YLXZnfIiJspr84Q6Mk0lFrmImmDR8eup7VrKCW9+Fkw9PwwtODT7Ubyh45a9rxihRiuZTG/ibw/kZgvqp5bqAHiWsaP5gas//NdvaYYWfnbkhPeZBqctK+4xspH6u+MWM8Mh14v6RIwD58ssQsz8QFSbGIsx6C3XkEvPcRMJ7KPrQ0ljPd33aR6vTsS9JarTxTJNjod47MlkT0LCed3d+cjanjrRfbzN2LQJblnitGPnnJEdoJuWLyF498LoJgDPPQxsFob/4zSyPf0cED03N69tID8PXEj1UlYBWLBGzWRWXn8J0Ox/OD9Tfknjsymjqzo4fj5QQs+9597pnIHLuSzy6yH56F0cG+BWQ5bQzXGpBesJVMMpiW8I+zGf3KoXQnpvuaVktrkismP50Ey+83s5DzseSd/cJppLI62X+xdnc33eCHk5UvkueK/saVEvi66DNKDC/06cm2nNHQxeMXG2QKPfk4BEu+lV4FB6uA2O2O3BNnEKNaa3jh7KOSJXTxtnAA7ZmnNt57kk5jVoTxtIuQ9GgMXj3d4X9havHsCd78EF+wu6mdmOFwnsj3xfroSOkp0nNgUnKgbZ0q5zc6MEUWlRaTUSdPKdk3Hh1paU7AescdmUbI/631eQSMvoh9TXO6II2/yCV084StNyNgozNCHjs6Dvw/2/w1ULgJMTcnQhLx9MjLxXHYBbX8Aa0eViyOYF8w+bqNfvGkSkAuZkt4MQFPDdCByU8/xCsmN+2WumvQMlycQS+/tKiSpRMl3eqyynVFS+WLydfFcXNtDF7cm7+ilfvsKyZf1zeyL73iLDopTmvs9JFSFdoLsqPVV5REDbugpKzDscnFgWBqLeFDpHDlRPzDU0rvDZkrv2OlPCwJiEkE7IOybEuybEuybEuybCvHcoB4YCn8AZlJl+2pL9rDbfDmkh3tGS1Rx6UXtCzhxu8oTtTDRYdt6YbiWJW1aKn8ESOmvqgnRKvuRGnjO+pzvOmJm/RB1IKRbogAt0FatGg/8y9Z27XoO9Ls7EQ1rnLrg6SykEUMkU1mUlDF5OuSVl70L0pC1fQ10yduTRrNH2xWTgaK0x3kQajsEH2hl4NyisQDJTED+6DMP3EOJF3z4gH2Ko9ILfrNmSx/QeS9XGkLFWuCw730iqZsdP8ikqmMWY+IXP2CuSuegaBtYZKC+Cu2g+oTRvtyLz/RMzuXyYavQzAz4A+KkzqAKN9Qw6VBiphyPjiZp4Noyh+3Nz+RMl0xJSMMFBgAABAASURBVGw56aOLkx6g9YRyAqbwF3d1cYwLBo6FwKUEpD/Qmqdf0fQb3ZIs25Is28qxLZPYiZpc+gd66sxYkm1Zkm313xWTx1Px9twwmkQ5JlpF+eQhH94M6Ype/oAWx8pO6UAyq6d68nWbBNMbimJqr5i19ATSU5xwqMM01e6SBLb+hGitP6FEiclY6hJcPUu/uGWqJhrUohfF0OQbD37iTEDVDsP/8nSlDo5Zx6zMLMHromDlWA4Qf3AE0TodPxwhtg12CK2LdvjHyfTHMv37dANti9kPu++khm5ZMZEr6StKU1dP2pIMWj+YotBPNJkfFUSMmnVB8vLF5Kdbuc9e1GI5efkVsyP8gulRzuqkxmM/yN7qj2jZFgE7UILEBsWhh6oiDmoOBJs8saQBdsXkLx5ZBExvmBrOM9qStnh5E3Gsg9tevqgrChb+hBLFmHLaRcAUcdBJZQ+SYOThTy5NXXpHSZZe3KtbObbhOKhkIEy2JVkDi1o0FRyqqV+4ONQwieAJRH84rAQ0fuRBK2eiUmtKwJTzhNFOJ8GUh51IArdB4Ys2eXcO2ovR8GHKhHIeOTPVb4hSvph8PctsC8OdtaA+Lk0uvaBlCTd+YPJ1Fm9GnczbAzYDMdGmnODhomAnSPaintCoTtNg48HFMQpAdODiWVu6hQ+/CEmPQvAvz7LUbxiCZw9w2NCJOt9mMnEW2dXsFSXbBOxESZHwH0SYNiuYxiCsvKhrbAfKCzo6/opW9xMw8g+XM2fZ4yQii3iixUkd0IHk1R9xKpapSvu/AcjfA/mzY/8Kmb8mJn/F/DWRfsYTaaUTjT81YvvXyvCwwfY0DKcJo46WOyHYG89F3ESZpt71QfZFoUZHCAzCSAnY/aiZqcadB84M/dHw9kLbCx6c0jECMkUtPdXZPX3RW6D0D8zMOoBlltVka+wIx7kEg28PBFse7R/OwryPrpnZ36QvZFExWhwyvdybuWqd3Fnyzgy2K3ydJmxq2QOJ0Raty5ZXIsRy6TfSz/1pTjZV+tC69wHT2760UY+dPNrpJFj6eTYtkCR4d38ji6q/Iiuo8XXE7AqHTQqZL+h9yMW9o3svefivZwU7sq+9X5ydyNwdHScbvjPhV6dIhWc0PmN6Tmdn8ysmz8VB9uzbuKb7CFhFpH8he6aLZHaxlXlodMab8YYTo4WD+b3aXF6B8Wds7yxJZIy+ZJkFj/pS6hV5xTcyRxOv7V0/SC3D3ddWOhazLPq0VEwrvj00tHZDauWLyeM0dteRF3nSN7YPvciOXvsXpvbrPDKbAWpkJIlA+OU3QuWKCK2R/I37LpowJv/kbKPOFfkg+u8csZaQtmB7CQef1ybuXdSyKMovsiGDbU345kwhd+6C/e8Szu7J0xdhkMhI4xeyPzP5rCAj7SpS4y2kO7McYe44OBPp+y+ee9L3gFyPsSs1srELj84st/Y9r0hP3kdTjDZ28OYQSnCsPEiCpXbcF6SCMRfyPRTt8Est3ZUT2HlwUnbVCKgRmMNeOA0UP99w4eyufmJWsPP8beDJD8+e5Dekv3wx+X929rf3isnX+y7yG3JP+WLyw7MrOdgpsF3g8D6+/3kSVk6aMpjfhjSFpEU2vCF3MURs84lswJjjOpLGIm0lIIbUWGy293Tn5v3vQ/6fkOXTl5XdmFWo4QHeVHkxe/tqOJjmZqt/8+y+e/Yywc7Rw6/+VeOO9v2FqcXzhuxtzs43TA/erztmQNp5fu4fh2A0UssbINgXnyUZ5ULmnjgaU8S0bMbOCN2b6XLmgy/e3oy3vrvghz6YHWymB0vCmwHu+HCGyhfJ2UaE08QGaGI4aSpNG9hHLWl6i/Sc+Xct/OLd9cAPnafmO1g794SndmDuSf4XpvbgLMQ+d0NiefwH2R2S+wfJag37EkbIxtBJ2MokkXtb/cLsGj1tzGDRpg2ChY9Pz3etnLvaA+Z3mp0dRl6kVj2IxKtCYSUX3HsAhtFJuASjnynaqyPkrvg3j3bzrmD2FbfGbbN+ee44Z9DKF5PH9T+u/9JYMvfnyakFr35oaUTPvU0bwhDpIWM5Eb1xkXtpoHRwHpl66IH0YGmbPmp5E+WTk1zqbYDfsTMzxCW8qUuT0ldYJI+V0fOLKNUXyXN/95M/YbT4XJ+78zzmuYiRjI/TUP6ImcNTO5zmKq8491BmP51cOXn0+KFdMfl67mEAluaw2UNGQkxlvJz9NCbNly2iVA+SxNhJA/WS/29kIMu4ny27Kxrb0NFiX2RoIs5MXj0zX5xa9UdkffUrctmsiJjRD/LC/HfPXUEK1Ms+mJ7Dsyf5X5ja6exqfsXk/9F7F70n8kK+j5X7Pvh8HpH8Uotw/Saqx/8GoPl7IL5/QSSDC0/2hNHW/Y1mDo1d4thwS3bCgV4elCCxQXHoNRBxULqhNFwCW/nBVMSxU8dPRKQ7pgRKSu2Gkso1J3myIgFTGk5MYtmW9HE3F8e4YA+IhKVIXUq4c2vWPqElWTYuHBTHJl8EUsGFry6Rv/gxS4cl2Vb/PSBVIeN0WCKJ4calBItDwCQC9oVVKF3Ryx/Q4li5V/ogqXJGJzOOlSc/nQRTCkERkr8iS1ILfKFP3uIw6wu9/IK5D7dNs2X7gknDFyXq6klbkiAdHx2xvGj5B422znCzEzU1XzD5f3AGMYtVImbBYpjhHt5oqSiOyQCiA/iJm2Qnsj44BRvEWgDtBg0nFx7tREnl0gc1h9ZJ/og/sxnC0S1LIAGz8o8g23DsREmRcHEiAxr0L6Yo9BNN5lUGj4iIwawLkpcvJj/dyr32Cyo6/oDKjKSpipNM8HFxjMdOZKb8L6RmM4Hb38g0GiYRqIKaA8GkBmnwRqQRpRumZz2Q2gP60C01XUwe5zkSSZGASQe/4Qzai9TE8SuqFYtDwJTRYJKgbTnlIIltYXjw4kfPX5ha3BJ2ujiGeREou/FcGvXE7UpTdTg1TCJgIJY6jkFqDZaLDU0JygmaqiFXh6ImKpjSD0qRlNM6yYkkmPKwL4wkITaxbCvH/kItPzFdWvaFzLb7hijli8nXs8S2MPwBJXRcekFmJCVaWvQ7envAZqDTbXGsvEOW3jHF1BcVNNERH1AcowNEB8ACOHxY4yGcuEkfREfwL6dFqd8wRKesr5XaM7K3vMiuyRItHfxEJEW/ILVKyAdWCpfUXCoSixb/XJZs3B68xaNn0UH8L0wNF8e2MNxSDGJbtuFW/on8g9Jw6URJ1px/IrvauWhnAl+0Nz+R7uZXTL4O3C/P/IqkuhRLy5OZzBLxcCd3WAPsQAkSG0QOybM+aJVrEYJJ5WiLv7wK1Ssmf3GWWpJtWZJtWZJtWZLtV6cgS7Iti3Oili9KF95O+F/orYPszHQhqsUhYDp48vX2bU5ZSgj/C1N7dXG6YPA7/eHuJvEQM1FMEn4iSTlIj/0PpCc2XVLw8LDJPTq7LMm2LMm2+u/E1QymEkzthtTKQUmUBdWgT5SpEYCNwyf+qtUjp/uGVMoXyXMXbbJDot+RAmIsOi48veJ8Y2rIOlHv53u2fHY78+HrthVJizZcgoKxk6tnKfXSRculfkBLDFmff6QY3JTIxizaRFTR1N5cVnt0RfLyxeS4aLQk9584yVRm5Vi0JPkDLcW20S6R/YLiUKMqmnSgciBYstO/uWZCOpBdzV9RUmpZ9IU2Iqb1UHHuaA2/oJwu4hNq9UVasBB0KSE8O4PlJOVFa/JFBS9+8BNZyYAl2Zal/+zi2J5+ECrbgE/c/w3A+Ysif0Lk74r5u2A4fbD+ZXFxKtGTvWAGKPGHRyJ9m8xfHpejlRdpA7kixULegXrhZfDFG+yFM0nli2d3a9FxrIv+wtQOZ2PHT6SAPe3oVW1OQ37D4DlIZXgqo8LHntbRTxdLMeo7BcGGM0vCz5Ua3gIKmFJ/46xgU/mJ9KDHRr9y9lCYiM4uaO/4INXqQVRyLM30fXEo18ao1zZQ4HI2kMQgwDef5tQOp2m2kaBh7SmORKx0Ymqnk2B9aDC7fjAC3o/KFvJAei/4eWvFr+o+gR2d/gup5T3970XzDVmdMpCWQJG2YoTmJIPzqsRfPuoR88LsLk8zXxDOqs/u6Hj1J2RmLMVuTEAK72bWXRFKNTGNdE16xG/h4Cdu0gcxFLx6doefuD3A56NC8F1F9ocdTYuX3fmq2UkNfThfRd7rJ1xbek/KSZ6xWyhfkf3sGiXx4zTeK7RivfMb24uYe+MM0hfh+82znyItqV95t6BfkflQnG7iL69I6P9tg9k9kAn88yCGl0cjbe+BHUrAowH7GOZCvv2pKdrh6U++2JRQa0ihu2HF3gfJ81IsnpzfijyN1Wmeb46eAojWuVfM9HhaOkXAKgaz+38sye7h2UuZQjUwv9u1dvAfzB78uGvTAFI2sJcswtxy4bmHWu6s2nYCdvL0hJ/IpnIwlvwHEbHsSOmOKRyeavIX/KOUifwWPJ/1NGJXnudSwFqgFAz9wi5AP7Gbl0W/8q9fkEu67Yb0lFOJJX9DVlPuXd8YkU0BnAXpJQOIV/5HV9uo35BvKl8kz90snd8ITkIxBsGSpT4YAe/QvCaxtSbUblgy4SgNY2SFY9cTRjs8c8lvGPJZNe+88CmvzG9R/oS8hd2tnMieTKZ0ILVNU5yfKnU8q7dcPQ3D2UqdmFG8pDgavKwTZN20GC0cTBtpdgJ7x1WnIZaGE7mhHMzG5Iu0XIejZu3/h3cD/YvdHRqOl19xa0h9fDHaOnA+IrUf/hEnSxzP1/ExTFx5lPBFUixkroFgdx4B79PpKhKw7s7/uzJ3BTMY/PAqTF0x+a+z7PMTcN/wSbLzw9neyxfJWw9OU+/Lsk4TsF5YpKdIwGAfY+OSoxK8OHd8FqFjPzzam2d7aidCsNuOvj7ik5+DJKkDa2UNCCB2WzucL0zCd2DUwxEg/Q0zSg7w86GT/OhosamyApI8TrqvZy8kMfqJ7G4OZjIwnGYmywkYZSozzFuok2PotYZfXiWbGEhLOHtQDhZsES3VGx/hKh2tizRgfdATsrO1Exnrx1wwNejnkpKXkEtSWrzsqlJOBuYru5o8ePvv1hYCq1IG5pkkd94tUbPiBdMznqZmrA5+8+ymdLurWsX8AkyRE0MYL7ljWfR2vbwJuX3BrmqSuyZp5B3sSbqF/kaRwk8kKQcvvQyHsfzQh/4dt5e3Td8Xzz2pnZguejAuqvVe+Oet9JSDWEdP5DeilsHR4dTKT0xD9OC9kpZRo8Mg2PGEileeN+WeE/mWD587WkPPkpmNnt2LSfFY6n9iltOQnQArZ2L4/+7/fwDyZ0Hxt0HZjSKRJdy4OAdq+QNaPaxYHMG+ILkNx+1BLcI0uRQcrjklpDe8ke+isoMgKX147kkOuiiONelg8jgtoyOfnKT6X0gtg/YM+uDFVppVdzi+mAKpMjroyREskRv/xmjr+sbtlWRTk2SpLs6RB6HoxoVbOfYTWrYpGwz8C7WS/bAyAAAQAElEQVR9oDjGY6BlxRqaEpRzxeTfvj2Rs+CG1MoXk59Ogon3YwrqyiF2BdnBtHyhlp+onlG16iI7qn+h7ekL3py58kVJ9vTaB6JJgsqS7mhZwo1/Y7SPt+pGZUcz+A+itf6EitiJBNiVe3ijpaI4yYEHjpTCxz+to/UhpFdM/ua0KjXQ3mWL9nJqsYPd0XKKxCIzJtcripIJscX0JsWFQ3W4OM1P9NR0weSvrq0s+gnR0MXpXeRBBmWH6Au9HJRTJB4oiRnYByWVS6+oPfZ2Ltrh+BWTn85g80VAJw/BGSdKX5i2qzhl02ap8QGRTG3MaUt6R+SI3U9+QwrhXsygXSbbkvz5B7e0/IrJ12nARKue0atfkGbbLLDsj0NkcaIBOlEafVEaLoGtvCM72vWFOrnUPGuiFSW9oTippeENU3t15lsTkQWYckBMiLELWnlWwjuaftNiSZZtSZZt5dhfiBglTqrgx718kVnTZHv0IvkVk1uyjX+hNJr0gzIagbHEkEHpC738AS2OlR3SgWRWT3XyD4ZQitC0IYIYlxJSO1EceoiKppxvHm39KEGbdleIZ/qB25ZwO5j0ghIluHRB9aQ9yVSlQT9i1LgYCtqNHWrmpE4ZX9Siqb350fOASJhPZwv5RCvH5SJaORbPSvIHWoql8UTLNrpPJBkuTmpANC8Gwot/hk7QsXjZJaGVX1FStEoJ0jdPWSnh4pSfaA2/oJwq8Qm1+iItjuIrJy9fTH66lfvsRQXxV8yO1C+YXol4d3FYO7ohmD2JfUXLdqqD5DYcx4QYGxQHkapEwH5Rn+M0lbpR5cnX2VXtRHGoYUpv8D96Vxwz4IfPAnuRWna7OJk4Hw7BjKflb7Rm7RWTj6doT26D7LS/UbIkZBWlB/RqX8hQFNsSHbYTZVuSFbAHQ0gjJx0Ux/rl4kRXA/GCZfALijweNageq/cldwL+gwhYG59QiF3yizYaK5UeSfbB1XOwO1reapGZX0Spvkgu3A4XqfFBcVauBi2aZHTLyYnv6FYbGbqjpuYrksPFoV2HC822MNxSrYH0il4eFOdfKPrVk92TNMr2kRRtOEZBOpGkelBSc6koTjjw4SE47cQvO0TLrUwUrBm7TK4Tt+ILUlP4idJw6QcR0pbCFX3Vk5/eTtgLOjr+ilbusZ8QTXhqoIrZhSbO8kM/MSU85gT8RGagtI5iX9G6/f8BmL8K5m+Md8wfMaMu8gdELH+fVM70UvvrL43U0sefHzGm/+KzlD6S9AG5jCkuiZFhyUYvoWuRmamF4088Gt6voqWXgfPGXVWenC7y9DASIekXtgF9MQ/Duy+I501sCsDIaCUuB8qzFjU5l2Hd+YvpefFsZ4DqzHZlWO5YjHb6oS12dnpp2R3U0FGHk/fbinT9E5nkm3gaRlJr+OLcg0I3kXoiu8MP773osWgth6T9wOSnk2A8PO04BAvvbML6sfuOGcnABXNPPjtICaNYI+QbUrzgsb/96PDcEZ93XLWsCF/sKvgNqZUHqfEAYlZxQ7MP5q6wV2RHatnxhVmIFKizBkzjzJQ3zJ0UYal/8aroRR5+xcjhN6Sn/HNPdtMW4f/PWdVZsL83+MOj4XNl3g7hsnJ+gCp/IbXs7H6GnnBbeDvWnkFiRntbe5KR5M7sKUZ78+xK7S9M7XQ2Nr9i8oq8ZfLcDclmAI2MJJEnh/Mb9Z0gxjSxpcHG8Kl0H9og88xSZSV18uoXpEA5fR0iXwSmRsJoCy/Ium1KA7vyesRk2fGMbKSnrRPSiojNmuVMl38hM/kWVPraULzx9MS5Zztg7CciEckpYDsbng2LFHrHidQYHO0feX6R9IIsv90VwnQAZzk94cCHM8srGE2d6hNHy1toitGePrZUD358+sLZV2uIwBzAzbsETi386uykQOPWAqmD3DolqivBUall54w+cRoozttSv3AWVT8xK6lzx+jw5Ou9J3n2veLcQaSdmN4fZ2+1L+xOtBMzH/4H5u14u7KTfN6emXzLFWcxbbRHD29KwFJgpPNPyG4+itjiiUxi7GMdSeMjMtbiiZtwbzMw++PzBtTVDn5Hbml9keWt3xCCpY0u3gwhspnk8+ZmNAWzI9h3pHd1UiQqDLfnEbmlevCrlwWd+wtTO50dzRezNxysAmK8iU/BuhshSBt6yX9HdtCcUdbz9icebb33NOcecDg5vxcLMPJsu/Lkp3eIPqzaL498riApv+Hccdw9r05EpznZfFM49zA7tjw9TRvSenGmIx89xWjrLMq9MGYav5D7MtPPSh2emfB4dt9we64zyXEWY9TJcycEy4LRIDEuCJ+lVIdDuTYGj1GpEagxQVydruFE7oq6i4H046sPhDMeQsp4R56RBoxFsQzRWwE+SFK938gSXjGcnISYPsbI1kKSgtOdHe3iTdjoESDd+4XR4p3bWviMzM4PZx0PoY07t9YMHfF3hp7qL5ja//7H1anvDpb0vmK0XAjmnmoJw5GwK2cPCguJ6I2L3NWpE9mbesoHkm+ZFSH0REi6SCFr8IofZEdrD5jvYRPGTGJ2gYdVRfsn0pM7uo/8b8zT+D1Y2j4uYySvy4qwIh0fHHV6iK0dyHD5K97vo2329v6nGttaS6CeexhChSTiN87j0hN4QtakxEiAu0f4fDs8lga8+gMyOPfTOznr0geU3zAETy9vIsNKbliFHSzG+K70wpNl52BKdMaoTUvIVZ+1KXeO8okM9Ju+MLtPPbXDmZ0a+6M9cmrVg3Qn53KMa8P/8O6kfuLuyCewgFWzA05CF3Xy6ADSZPN2aswQV2dvON46+H/W9z+tcsXk617UHNv0S7aV8/8oORdd23Vcx5L1///cPUg5iZOZrLOvtySK1MPOrLpoYKHQ9gui2ei4/cAZEqpEbZBUHAhGIl14ZeJ4q0AldhAwS8KxH0zPrif/8m1HxvZdJ08Pbjz1wcnEuXGrXQmkJXe0upeAUR9uD6ZoJx8Xxyb/C1P79DWrhdsuRmRHx0EpSCTHkugHxbGWDooTDqjYQLohNaMI/0GL01DsffTFRBgukaonrTeHYEpjUARMN4yAp0c55IA9qPRKxOETwyXE2IZefMPswasEceG2Z25HiZJlSXZiEJfguKSol3vxHZMvZ0ezEzOP4g1TCz+RGjyLkXS40DyBaJpiQS++sMxSURyTAUQHdhxBuSOlA3XqJJhSOJGkHBR+5MF9yckj4rQS/8OOJmez1B0uWn7BSNHfUD1dQfaO1ugbiny5Fv4qq+Ig/hemdrqV++yFCuKgool8oYrsFppyDhSKetyoiy9hgezJ7B299IXUbLPE6FKDpWBADdI7/lmUOpSe5bknGuiiONakg8njsNGT4Ixs3CrXG1qqvpC8vDiZOD65mlkcAqbsHrQcGeFEEtvC8OAf/pwtlywOAWseRCE3LtzKMdkNcymabWTL9kJA1tAnaumgOL7csmINTRukiKTF5F9+9ogDwUjUdnF+OAImHoopqJ1D7Aqyg2l5oJ5cPaNqVReyo/oDbU9fkfxE5pL7AyVRFmW9o2UJN/6FqVmiY3ZYwYP/oFFw4e27YUjqC9sEv6FhRjQojvGYf3jUm3uxE1fSh1AL/ulHj2TfZ+2Dq+dBNVX/gZYYsrwhafmG9FQ6kdqMKGfJGvQLogmngZhM1pFp8Q90dBwUhxX0S0FxbDe3LcWKlm24lX8iv1AaLp2oVpXjBPyJSDX7XrHD8U9kLDVa9IaUldoLpl1bcdoSx91aoiVy42MOJT1QgsQGkUMCxSR47yNgso2LE8SFo2khTHZiFVnCjQf/cK/aiZ6ZY1dwuRba9ODDpRuKYwlreEWJeisf6KWDuQemhQU5CySwHEoa+t+exvTfMAL+ukwcao2DpLUyAqZrnZPCN7QkdmMLESA2KMu2JMu2cuwnSlGWPLm00HekyZJsy5Jsq/8+cfV4x+TLJTEqyiQxa7hDZP6Jc8cwL/WBocxkh04kq76QvPVigqQISRcenAJGQXhq4jwxNWSdqO+zzbJReuPRcJsO3A6m9QWlfYVy0n6h5RDijr7xYYnIGJn1jal9eaZSe0EkzLJxmQuciA8ikIvz5Fo6aPWwYuEI9oakdoPsB2Yq2kKqokk96OUlhBuB1w7xA9khUTtRnHChDiq1pCdKKldP5CSD1g/KlE30C2rpC2lxFO+cvPwNrdxn75h8uZ6YHWiS7IV6IjXNMXA4qewwPdCLL6THdprW/wKQvyPyt0H1L4XEX4zSAp0PnD848hfGpfNXxWT9CyNJMdryH07PNhz2e9moH3E94PayaMsDqf2FqX15bk0NzCf0ceX8YgurcQdKupqR/IGpzhRNsZJj3R3ZipDfrfcTJo9OgVXlL5jfNR2H09K77jws138g97V64mwpZVuRgNHGm6ZMTsJKbHIo7bHFqWCLUC1ZmPxwpJkiQcM6c8MpEVu6I41YfotZA8HaeGISvB+RaXIgvyuALT4LVuwGag9kR7v/Qmp5T/fTfEM2hiPTksh+AIOTp37z+c0T28PrDqStbGpLDUT9C6nlibT1zhuW5B1p+sD0LKeLZ0xMNwR7cqTDnqU+hOKO6QkP5p7mkCCt82iSk5PHaAn87UdTfjU6jx3cUwV+x3wVM7UGrj+QeYwRIn3ISe6cbdU3pAnGjSTEyY/InmoLmcW4M71oEOzOEa47Q9K3kF1pzvZ3zN5WSQ5kHhZjS+D0H35dPD03Tnf4zWkrXwjkiYFPbPEI7Gy6Y/Jf79dEzmLw4iwoX0jeljekkOfmF7lwGvN/x9XpuXAyNqOmL/zy0S+enem6sK/U/4tAc+44vP/5RcejldPzi7OfB8TS8Qfm9vTvmHy892Q69AtTOzy3HXnw4CciYrkx64pNIr75OUhCHSOZsSR/8Jb4rWY9v+sI/FxJwoOsSg+75lvhHQAPnVpsutFD8DtnHxrLO51drbMjleFkiM2DdFJmZNPZUQ2kHKO+7uxMCouTMkkMp0g2PDE8iMiWsHY1Qb8hlfKFyZfnrYxPIVrID0bA8/Bcl54/scX3cOz4C1M7nTXN80TeAO0PBvbt4PGctG10yfwWEWEz/eAMjZJIR61hJpo2XDx0eVazglreh5MNT8MHTw8+1W4oe+WsaccnUojlUhr7m8D7G4H5qua5gR4krmm8MDVm/83W7DHDzs7dkJ7yINXkpH3HEykfq56YMR6ZDrxfUiRgF58sMcszsSEpFnHWQ7A7j4D3PgLGU9mHlsZypvvbLqQ6Peslaa1WnikSbPQ7R2ZLInqWk87uJ2dj6njrxTZz90Igy3LPjpFPXnKEdkJ2TP7hkc9FEIxhHto4GO3Lf2Zp5Ds6eGB6Ts9eegC+nnhZVQJWsUjAZl1Udg5f0+F4frD+htxzR0ZTZ3b0cLycgGXft889E5ljV/LZRfbDszA62LeALKeN4VoD0ge2kkkG0xJ+OZvRdw6lOzHde1otrUl2TH46CZbfb2Yh52PJO/vAaaSyC8CRhgAAEABJREFUdLJ/sXZ3N93gxcnKF5Lniv7GlRL4uugzSgwv9OnJVjmjoQuPX2yQKfTk4xAs+ar0KjhYBcRud+SeOIMY1VrDB2cflSyhi7eFA2jvPLXx3pN0GrMijKdtQtKjMbh7usP/wtTi2RO8+SF+YHdTOzHD4TyR74v10ZHSU6TnwKTkQNs6Vc5vdGCKLCotJqNOnlKyJx4daWlOwHrHHZlGyH/X+jwCRl/EvqY5XZDGX+QSunnCqjcjYKMzQh47Ok7MZRRyP9C72l399f8PwLRZDhAHRaaeH76E/EExDfYI9obJl9vomydVAnJxliRK0cR5ItJlz2L4uLMguxcOz6RVaYK2ltEpC68uqXhyD9eOlsoXJl8ujptrxeDmXvknWrnf3jH5cj2RfekVZ6GT4rTGTh8pVaF9IDta/URJ1LANJWUdjk0uDgRTawkXkcKVE/EPTym9N2Su/I6V8rAkICYRsAtl2ZZk2ZZk2ZZk2VaO5QDxwFL4CzKTLttTX2gPt8GbS3a0D5So49INLS1uWcKN31GcqIeLDtvSDcWxKmuhpfJXjJj6Qr0hWnUnSit+o67jlZ64kj6IWjDSDRHgNkiLFtrv/CFrdS30HWl2dqIaV7l1IaksZBFDZJOZFFQx+XJJS17oX5SEqulrpiuumjSaL2xWTgaK0x3kQajsED3Qi4NyisQDJTEDu1DmnzgHki7zwgPspbwiteg3Z7L8A5HX5UpbqFgTHO5FdzRlo/sXkUxlzHpF5Oob5q54BoK2hUkK4p/YDqpvGO3hXvxEz+xcJhu+HIKZAV8oTuoAonxDDZcGKWLKuXAyTwfRlC+3V34iZbpiSljlpK8uTnqA1hPKCZjCP9zVxTEuGDgWApcSkP5Aa56+o+k3uiVZtiVZtpVjWyaxEzW59B/oqTNjSbZlSbbVfzsmj6fi1XPDaBLlmGgV5ZOHXLwZ0o5e/AUtjpWd0oFkVk/15MttEkxfKIqpfWLW0hNIT3HCoQ7TVLtLEtj6G6K1/oYSJSZjqUtw9Sz64JapmmhQC71QDE2+4sFPnAmo2mH4X56u1MEx65iVmSV4uShYOZYDxB8cQbROxw9HiK0GO4TWhXb45WT6Y5n++3QDbQuzH3bfSQ3dsmIiV9JPlKaunrQlGbR+MEWhn2gyvyqIGDVrQ/LyhclPt3KfvVALy8nLd8yO8A3To5ylkxqP/SB7q7+iZVsE7EAJEhsUhx6qijioORBs8sSSBtiOyT88sgiYvjA1nGe0JW3x8ibiWAe3vfhC7ShY+BtKFGPKaRcBU8RBJ5U9SIKRh7+5NHXpGyVZ+nAv3cqxDcdBJQNhsi3JGliohaaCQzX1jYtDDZMInkD0xWEloPEjD1o5E5VaUwKmnDeMdjoJpjzsRBK4DQpfaJN356C9MBo+TJlQzitnpvoNUcoXJl+eZbaF4c5aUJdLk0sfaFnCjR+YfDmLV0adzKsHbAZiok05wcNFwU6Q7IV6Q6M6TYONBxfHKADRgc2ztnQVLr4JSY9C8C/PstRvGIJnD3DY0Ik632YycRayq9knSrYJ2ImSIuE/iDBtVjCNQVh5UXtsB8oHOjr+iVb3EzDyi8uZs+xxEpFF3FBS6uIcKMnQ2C+OYjll2W+IVt3rfwHIXwPzF8P8lTB/UWyu/J2QDAHjL4fheHsHaUFfPej8obKcgDGFlp0Q7IuzpX0LAZqziktimXtgeqaDVurJ2ZEuBKpocF6GNHn0eUvK0VI6MFp4kCnk6Yeze+ait0DpPzAzywEss+wnW8aOcDzvZF3uIEVfvZDRwv9wFrbvxLWTp48OTx4/7kme/mDuSf6CmeyO1HAeh11vgcRoi9Zli1cixHLpE+nnzjQnmyp9aLmvPPdtPL2jcw967OQzGopDsPTPCkgSvLufyKLqn8hKanNrdoXDJoXMF/Q+5OK6o3u3PPzXs4Id2dfeB2cncl8wuHpRTp78cEQ6eEbjO6bn9Md9fUe0XBxkT7WE4SzFwqlxL4T4xdkzVRL6aWNLRjaOwnsQ0GnASBCx6P/o+W2zo7MkXzzrKE8bJNeFXEhW/QOptb84b2za8OTzzXnLlBfPb5L1RbQdk8cZ6NyRF9n/xPahF9mVvc0P7Ynp+fV+U3dTA4ev2fWDsZosdYCevK8Z930itfb9E7KFPlbn4jyheHBILSFtwdYIB5/XJfJaxGRZ9I5soIdxWtL/5EwhU4ylWMz3ZAwBnp7xk7OwPT/YDtSF7GaSHeE4S5HgURdH6K4TqaXvX7w/J/0vmEekwlpSYi0K96Iw0neUcdcnUsv7aI7Rxg52hVCCY+VBEiy1XEEnYm8Cwyg+h9J4+FZLd+WEjJ3IvvIgXeS5b0bfOA0Ur2/YODurn5hnsqOr6Qvunj3hN6S/fGHyf/Z1H1flHYzlUy7vu+i5IfeUL0x+OAuqgp0C77yP7/4EymlLujAPIU0haZENX8i9GaYjQ7AO5ZLFSVETEWrN05YkexciUSdGw/N7dDf5PyO7Zi6r2FVOwLIGNavCBhHz9sMjNl/6k2f33dmYXq4aPXx3tu01fov2/YWpxY+9zdn5hd3PJ2HdXZ7ATHfkDeH/gOyYbybJLPDD0dhGnP0rWZAKzixVRlce/vC8lU+iLT2BN8ybWc0sloSdAIMXZ658ITnbiHCa2ABNDCdNpWkD+6glTW+RnjN/1sI3764Xfug8Nd/J2rknPLUDc0/yvzC1F2chdt0NieXxF7I7JPcPktUa1ksYIRtDJ2Erk0TubfWB2TV62pjBok0bBAsfn55nrZy72gPmd5qdHUZeSK16EIlXhcJKNlz3AAyjk3AJRj9TtFdHyF3xJ492865g9hNXjdtm/eK545xBK1+YPJ6Z4M3z1P+XZ+HpD9/90Littji7xiKilSwkT8aW7rwjj0ydsdHhfU8QhZzyzNGT3yYcgSLWegshN29vmtMDDs9e+gsLyWNl9P4iSvWF5Lm/+8jfMFqca2nl6ztK4CJG0NZTaSh/xczhqR1Oc5VPzF46uCr303bdddP2nuTLcw9DsCwKYz6sw8NXpBDLFz2wo+jBzC1EyZvS/H/FzMTZlmVswvrOIB6bYjI8bw5ExNv7gdS6+xVzXeZ2zN7wIPdQnnl4fhv2oCK1UDx4MT2H01LtL0ztdLqb75j8Hz33bu9j1XpfvocdfEI1MJb/nMqZOTidnTmRWvoQMbo3/j/+Fij3nxotgZsjYMofDActS7ITB5Pa8FjRUyfH0gSXEiwO4h2l4Qul4RLYyg+mIo6dOn4iIt0xJVBSajeUVK45yZMVCZjScGISy7aky91cHOOCvSASliJ1KeHOrVn7hpZk2bhwUBybfCGQCi586RL5hx+zdFiSbfXfC1IVMk6HJZIYblxKsDgETCJgD6xCaUcv/oIWx8q90oWkyhmdzDhWnvx0EkwpBEVI/oksSS3wQJ+8xWHWA734hrkPt02zZXvDpOELJerqSVuSIB2XjlhetPyDRlvOcLMTNTVvmPwfnEHMYpWIWbAwzHAPb7RUFMdkANEB/MSVZCeyLpyCDWItgHaDhpMLj3aipHLpQs2hdZI/4s9shnB0yxJIwKz8I8g2HDtRUiRcnMiABv2LKQr9RJN5KYNHRMRg1obk5QuTn27lXvsDFR1/QWVG0lTFSSb4uDjGYycyU/4XUrOZwO0nMo2GSQSqoOZAMKlBGrwRaUTphulZHkjtBX3olpouTB7nORJJkYBJB7/hDNoLqYnjT1QrFoeAKaPBJEHbcspBEtvC8ODmR89fmFrcEna6OIZ5IVB247k06omrK03V4dQwiYCBWOo4Bqk1WC42NCUoJ2iqhuwORU1UMKUflCIpp3WSE0kw5WEPjCQhNrFsK8d+oBY/MV1a7IHMtvuGKOULky/PEtvC8BeU0HHpA5mRlGhpob/RqwdsBjrdFsfKO2TpG1NMfaGCJjriC4pjdIDoAFgAhw9rPIQTV9IH0RH8y2lR6jcM0SnrsVLrjOxVXsiuyRItHfxEJEXfkFol5AMrhUtqLhWJRYt/Lks2TqMn22J6oi50EP8LU8PFsS0MtxSD2JZtuJV/Ir9QGi6dKMma85/IrnYutDOBL7RXfiLdzXdMvhy4X575JZJqK5aWJzOZJeLhTu6wBtiBEiQ2iBySZ11olWshBJPK0Rb+8ipUd0z+4Sy1JNuyJNuyJNuyJNufTkGWZFsW50QtvlDaeDvhf6FXHWRnpgtRLQ4B08GTL2/fyilLCeF/YWqfLk4XDD7TH+5uEg8xE8Uk4SeSlIP02P+B9MSmSwoeHja5R2eXJdmWJdlW/524NIOpBFO7IbVyUBJlQTXoE2VqBGDF4RN/1eqR031DKuULyXMXbbJDot+RAmIsOi48veI8MTVknajv85wtn93OfPhy24qkhTZcgoKxk6tnUeqlCy2X+gUtMWRd/0gxuCmRjVm0iaiiqX25rPZoR/Lyhclx0WhJ7j9xkqnMyrFoSfIHWoqtRrtE9geKQ42qaNKByoFgyU5/cs2EdCC7mn+ipNSy6IE2IqbloeLc0Rq+oZwu4htq6QtpwULQpYTw7AyWk5QXrckXKrj5wU9kJQOWZFuW/tnFsT39IFS2Ad8RzbYQYzf8H38PzN8ccXHmL4wki+dviGEbZgCJPyIS0VfSvzCiFNEurEjjYMepw9DWfRVRDiS97BA/sLtSWx7I6//C1A7PRclPhGA8rtaweK/K7uXr9Uy2AfUFkbB9DX0zMjpbkrA8wJ9oY/Qvne78ljD0dhSTRWdTOnBGiNURgwBK9PHh2RQ+HecO7m+9SM+JqOQYQ9EfHJpLuo2A0RcRhzBBEoMATz7NqR1OUxYGgpFPRCx/YLTTSTB+pFl9ziJiFedjSCs8lkEzA1xvhWCv3eyq/hdSy3v6W9N8w+xFA9ISKEbKWITmJIPzqsRfPuoR+cC1CyXNfNe5s5yOIF79DZkZS5H+IcRw9pKNCidPDOe5WOrAbtNwKQc/cSV9EG3B3bmjH3Xi6gFGJ1kr0gL7D3s0564Mgn092O8Bh8PI2zJhrmVN5Fz2N3YLbTsyzK5REi+n8V6hFeudT2wvYu6PM0hfhOebZz9FWlLfebeg78h8KE438ZdXJPS/22B2D2QCvx7E8OLRSNt7YIcS8GjAegxzIU9/a4p2ePqTL2xKqDWk0N2wYu+D5HkpFk/Ob0Wexuo0zzdHTwFE69wnZno8LZ0iYBWD2T2YfcgIJ0+O53c7tV44vYd+IrX0HXdBkwbAVr4x96R6YsaYwXhVrgAgWEmRngNJGU+kb2A4DdhDpCHi7kgzQBId2PmLlI6rhQbsehsEC+8npbEJv12RFz0xPSylg0i98QuvrlzTe9LPzovTU44SS/6FzFLuC54YkU0BnAXpJQOIO/+jq23Ub8i3lS8kz90s5XNCuCFC04YINAPTRBIdJ1sFsi9O6bCj5eRLyH3R3jDa4a89EXnFWpUnRslI8PAp81tUeEM6GGrlRPZmYUoHUltpir9F/l8AABAASURBVPxmQOp4Vq9ydSrF7Bw9WdUE1oSPR8iKgx28OxPw7AC68x3ZEEvjiWwsB7lxhlsM4xrytWxlYf/ox8TC3JPJItoPUoxGqe8oRlsOzKNIUgPu/BInSxzP1/ExTOw8SvhCUixk1kKwO4+A55kpFAlYd+f/PchdwamX8TkMTUd3j5qOd6eVmVWbUfgks5taL2XTjuStB9eSTp2cueoLyad+caQam4tXJZ2bs7O1SPmqN4z25dme2okQ7LYzez/9HCTpIDhW1gAHsdva4XxhEr4Dox6OAOlvmFFy4OO3ZyRFnCni8OTxCEG2ri9Ilp6F7E42d5HRTOSumaRMjoJOEsvwhdPW3Qlpu2MVpB3Zh5JFh5o1r3waUjpaHkgD1ge9Ye7JR5zIePmGqUGvS0o+Qi5JaeG2q0o5GZiv7Gry4PzG3PLDsy/6G3YLhb8wtfHeQ5gr8g72bnx0NEosnZ+NPDptGHvCycZKSDcsC6c3S8qTfHHuSxnvPSAjidzPnmSr0N8oUviJJOXg1stwGMsPfejfcfUeD3hi7ol2YrYxg3FRrffCr7fSUw5iHT2R34RaBkeHUys/MQ3Rg/dKWkaNDoNgxxMq7jxvyj0n8i0XnztaQ8+SmY2e3QuT4rHU/8QspyE7AVbOxHD2tb4jXdHSBt7+F4CS+aceN+qXr0L+oCiOPYK9IbkNx+1BLYRpcik4XHNKSG94I8+isoMgKX147kkOuiiONelg8jgtoyOfnKT6X0gtg/YM+uDFVppVdzi+MAVSZXTQkyNYIjf+xGjL9cTVK8mmJslSXZwjD0LRjQu3cuw3tGxTNhj4L9TqA8UxHgMtK9bQlKCcHZM/ffVEzoIbUitfmPx0Eky8H1NQO4fYFWQH0/JALX6iekbVUheyo/oDbU9f8ObMlS+UZE+vfSCahI5LD7Qsyf33xFGP2KobxWpJ1iuaCi689R0rUn9Fo1pqPFCc5ED1wUTBY9rP1TpqH0C6Y/Ivp1WpgfZattBenFrsYHe0nCKxyIzJ9YmiZEJsYXqT4sKhOlyc5id6atow+adrVRb6DdHQxeld5EEGZYfogV4clFMkHiiJGdiFksqlT9Q69upcaIfjOyY/ncHmCwGdPARnnCg9MG27OGXTZqnxBZFMbcxpS3pH5IjdT35DCuFemEG7TLYl+foHt7T4jsmX04CJVr2jl74hzbZZYNmXQ2RxogE6URp9oTRcAlv5Rna064E6udQ8a6IVJX2hOKml4QtT+3TmWxORBZhyQEyIsQ2tPCvhG02/abEky7Yky7Zy7AciRomTKni5F1/IrGmyPXqRfMfklmzjD5RGk35QRiMwlhgyKD3Qi7+gxbGyQzqQzOqpTn5hCKUITRsiiHEpIbUTxaGHqGjKefJoy48StGl3hXimX7htCbeDSTeUKMGlDdWT9iRTlQb9ilHjYihoN3aomZM6ZXyhFpralx89L4iE+XS2kE+0clwuopVj8awkf6ClWBpPtGyj+0SS4eKkBkTzwkB48c/QCToWbrsktPIdJUWrlCA9ecpKCRen/ERr+IZyqsQ31NIX0uIo3jl5+cLkp1u5z16oIP6J2ZH6humViHcXh7WjG4LZk9g7WrZTHSS34TgmxNigOIhUJQL2i7qO01TqRpUnX86uaieKQw1TeoP/6F1xzIAXnwX2QmrZ7eJk4lwcghlPy99ozdodk4+naE9ug+y0nyhZErKK0gt6aQ9kKIptiQ7bibItyQrYgyGkkZMOimP9cnGiq4G4YRl8Q5HHowbVY/W+5E7AfxABa+MbCrFLftFGY6XSI8k+uHoOdkfLq1pk5hdRqi8kF26Hi9T4oDhLrgYtmmR0y8mJ3+hWGxm6o6bmHcnh4tCuw4VmWxhuqdZAuqMXD4rzXyj61ZPdkzTK9pEUbThGQTqRpHpQUnOpKE44cPEQnHbiww7RcisTBWvGLpPrxFXxhtQUfqI0XPpBhLSlsKN3Pfnp7YR9oKPjn2jlHvsN0YSnBqqYXWjiLH7oJ6aExyzphsyUv6JZYcreMNQSJmZu/wtA/k7IXxD7R838fVI5+Uvi/LEwkRp/NTz0E9HSl+H/xBlKa5bNPazG4DEyLFmKeVNGypNwV/O/MDW8s9lF3l0Lk8dD85AbUii/YZfQupBa3tBvJe89B9ISnh1B5BizmeADKGBwqumFYA+e2oezLfdSnZmuDGM/i1hJB3n0+qqhtnb0gJTXDnrKB7s/HMdYFp1uCPbCKxFi3FJrmFubJrAHZbrg5Lkr/PCTp9w694Kx9kS/OQTjQ1re8XjraNw9ArQDCxmrvuFcRqRvjGKNwJ4+acPM41WCm3MJRuXUsiJ8IbvyzVwzfeXUTly9eQ1NsGSXZ2/YJ7Irtcw+kAtjp7OGPI0zU94wt1KEpf7gVdGLPHzHyOE3pKf8uie7aYvwf3NWdRbM7wjMPMnJyWNzZd4+rDy/SS7+C6nlju5j6A1XC3dj7RkkZpQbuDd6Mpph6I1Rvv2c6SZmXjA9p7Oz+Y7JKzI/+XwDeW5e76EI47cp3zApHqMUmD6y7vlB9rZxIXn7NsxdcSQ+KG/rEgIWEWkuIcFoqjUsnrbyNnJXEDFZd79yJuhpaUJaEbHsxVOO+IrM5FtyR5ApWsuK5emJs4B1yfBVQcDoDcePnh1pyG4k+thNMvwf8v589IEMz73ZV859KNAVh08pKpy7iIyGs+eNo+U9NMVoTx9bqgcvn75w9tUaIjAH8JK1BE4tfHd2UqBx1QKpg9w6JapLgqNSy84ZfeM0UJy3pb5xFlU/MSupc8fo8OTLe0/y7PvEuYNIOzG9P87eag/sTrQTMx/+B+bteLuyk3zenpl8y46zmDbao4c3JWApMNL5N2Q3H0Vs8UQmMfaxjqTxFRlr8cSVcG8zMPvj8wbUpR38jtzS+kKWt35DCJY2ungzhMhmkuvNzWgKZkew70jv0kmRqDDcnlfklurBRy8LOvcXpnY6O5ovzN5wsAqI8SY+BetuhCBt6CX/juygOaOs5+1vPNry3tOce8Dh5PxeLMDIs23nyU/vEH1YtV8e+VxBUn7DueO4e16diE5zsvmmcO5hdmzx9DRtSOvmTEc+eorRlrMo98KYaXwg92Wmn5U6PDPh8ey+4erZZ5LjLMaok+dOCJYFo0FiXBA+S6kOh3JtDB6jUiNQY4K4dLqGE7kr6loMpB9f+kA44yGkjHfkHWnAWBTLEL0V4IMk1fuNLOEVw8lJiOljjGxZSFJwurOjXbwJGz0CpHsfGC3euVULn5HZeXHW8RDauHPVmqEj/s7QU/0DUzt97WBJ7/t/ypPqXIFlx/RAsDTCycbC6SlZSJ6sXdxzRz4kdcZGh5OvNu4NiTaYN9FO63AaVh6Op3gNZ3Dq6J1FQZjYvqYNmc6+/8TM4d33n8ht7RnMRVBeE16WK+H8QlxMJKdGhDaOtiLDzT6R2dQYzvtIZ3/5W41trSVQz40MoUIS8Rtfbw6k94msicRIgLtHyFsiFJEGZzdNWMUTSeZ+5MmZZmloOfTCEHyKJLESkgubsYPFGHfz/uxIdmFKdMbS+4qzNuXO0XMiO/ttD8wdp57a4cxOjXujvXJq1YN0J+dyjGvD//DupH7i2pFPYAGrZgechC7q5NEBpMnm7dSYIS6dveF466/IluqD638BKPUPgpL4o6COXBzbw0GobAfuiGaj4/YD042GKoY0SCoOBCPR6BJ4V4yiHjeKXRL5ieKEA9XB1JB0cinpq0dcvRlr45OnBzee+uBk4ty41a4E0pI7Wr2HgFEfbg+maCcfF8cm/wtT+/Q1q4XbLkZkR8dBKUgkx5LoB8Wxlg6KEw6o2EC6ITWjCP9Bi9NQ7H30xUQYLpGqJ603h2BKY1AETDeMgKdHOeSAPaj0SsThE8MlxNiGXnzD7MGrBHHhtmduR4mSZUl2YhCX4LikqJd78R2TL2dHsxMzj+INUws/kRo8i5F0uNA8gWiaYkEvvrDMUlEckwFEB3YcQbkjpQN16iSYUjiRpBwUfuTBfcnJI+K0Ev/DjiZns9QdLlp+wUjR31A9XUH2jtboG4p8uRb+KqviIP4Xpna6lfvshQrioKKJfKGK7Baacg4UinrcqIsvYYHsyewdvfSF1GyzxOhSg6VgQA3SO/5ZlDqUnuW5JxroojjWpIPJ47DRk+CMbNwq1xtaqr6QvLw4mTg+uZpZHAKm7B60HBnhRBLbwvDgH/6cLZcsDgFrHkQhNy7cyjHZDXMpmm1ky/ZCQNbQJ2rpoDi+3LJiDU0bpIikxeRffvaIA8FI1HZxfjgCJh6KKaidQ+wKsoNpeaCeXD2jalUXsqP6A21PX5H8ROaS+wMlURZlvaNlCTf+halZomN2WMGD/6BRcOHtu2FI6gvbBL+hYUY0KI7xmH941Jt7sRNX0odQC/7pR49k32ftg6vnQTVV/4GWGLK8IWn5hvRUOpHajChnyRr0C6IJp4GYbHOt/MAHOhwHxWEF/VJQHNvNbUuxomUbbuWfyC+UhksnqlXlOAF/IlLNvlfscPwTGUuNFr0hZaX2gmnXVpy2xHG3lmiJ3PiYQ0kPlCCxQeSQQDEJ3vsImGzj4gRx4WhaCJOdWEWWcOPBP9yrdqJn5tgVXK6FNj34cOmG4ljCGl5Rot7KB3rpYO6BaWFBzgIJLIeShv63pzH9N4yAvy4Th1rjIGmtjIDpWuek8A0tid3YQgSIDcqyLcmyrRz7iVKUJU8uLfQdabIk27Ik2+q/T1w93jH5ckmMijJJzBruEJl/4twxzEt9YCgz2aETyaovJG+9mCApQtKFB6eAURCemjhPTA1ZJ+r7bLNslN54NNymA7eDaX1BaV+hnLRfaDmEuKNvfFgiMkZmfWNqX56p1F4QCbNsXOYCJ+KDCOTiPLmWDlo9rFg4gr0hqd0g+4GZiraQqmhSD3p5CeFG4LVD/EB2SNROFCdcqINKLemJksrVEznJoPWDMmUT/YJa+kJaHMU7Jy9/Qyv32TsmX64nZgeaJHuhnkhNcwwcTio7TA/04gvpsZ0mdCkh9A37vwAUZ/6umL8lQrCTr4Q/GqJSX0n/wohSjLb8h9PDnycTM7xwoH/eXOk3rAeczeGbJ03tL0zty3NxamA+gUfWEk6e/Th/X01XM5I/MNVsANmNlbwjWynkd+t9hMmjU8iKaC+Y3zUdh9PCm3pVcXiq0T6Q3a2euKbanjfAqWG0waFdnjqOoUfEIdjiZNgiUyQOT+HwiMkXNiVg7S1S+0QKWH6Lvish/IYR8H4Eu1ID8jsDGLXGAyHYsL4CtpAd1f9CanlP99N8QzaFI9OSyF4Ag5OnfvP5zRPbw9sPpK1saksNRP0LqeWJtPXOG5bkHWn6wPQsp4tnTEw3BHtypMOepT6E4o7pCQ/mnuaQIK3zaJKTk8doCfztR1N+NTqPHdxTBX7HfBUztQauP5B5jBEifchJ7pxt1TekCcaNJMTJj8ieaguZxbgzvWgo/JlZAAAQAElEQVQQ7M4RrjtD0reQXWnO9nfM3lZJDmQeFmNL4PQffl08PTdOd/jNaStfCOSJgU9s8QjsbLpj8l/v10TOYvDiLChfSN6WN6SQ5+YXuXAa83/H1em5cDI2o6Yv/PLRL56d6bqwr+Q/qqj0Ucg9cUT9P/gNu3BmqpcztyP5bFv6jU9lbVhvjjbee1FjnY4csmPyw9md8ukHP5FG7LbrbE7h6ecgCTWMpOP/hW3t70UniCXhZ0qFLx5hcVYevO/ZOWNYpoBVpR6Cj84+cpa1nt+tOjtTGU6G2DxIJ2VGNp0d1UDKMerrrs6ksDgpk8RwimTDE8ODiGwJa1cT9BtSKV+YfHneyvgUooX8YAQ8D8916fkTW3wPx46/MLXTWdM8T+QN0P5gYN8OHs9J20aXzG8RETbTD87QKIl01BpmomnDxUOXZzUrqOV9ONnwNHzw9OBT7YayV86adnwihVgupbG/Cby/EZivap4b6EHimsYLU2P232zNHjPs7NwN6SkPUk1O2nc8kfKx6okZ45HpwPslRQJ28ckSszwTG5JiEWc9BLvzCHjvI2A8lX1oaSxnur/tQqrTs16S1mrlmSLBRr9zZLYkomc56ex+cjamjrdebDN3LwSyLPfsGPnkJUdoJ2TH5B8e+VwEwRjmoY2D0b78Z5ZGvqODB6bn9OylB+DriZdVJWAViwRs1kVl5/A1HY7nB+tvyD13ZDR1ZkcPx8sJWPZ9+9wzkTl2JZ9dZD88C6ODfQvIctoYrjUgfWArmWQwLeGXsxl951C6E9O9p9XSmmTH5KeTYPn9ZhZyPpa8sw+cRipLJ/sXa3d30w1enKx8IXmu6G9cKYGviz6jxPBCn55slTMauvD4xQaZQk8+DsGSr0qvgoNVQOx2R+6JM4hRrTV8cPZRyRK6eFs4gPbOUxvvPUmnMSvCeNomJD0ag7unO/wvTC2ePcGbH+IHdje1EzMczhP5vlgfHSk9RXoOTEoOtK1T5fxGB6bIotJiMurkKSV74tGRluYErHfckWmE/HetzyNg9EXsa5rTBWn8RS6hmyesejMCNjoj5LGj48RcRiH3A72r3dXpyoLkH9j/BWAG+XthQD+4hP4FkQ57BHvD5Mtt9M2TKgG5yI4LQ/DUAB2Y/PRD3DG5abeU3Rp0URxr0oVA+RtK2lZIssq1o6XyhcmXi+PmWjG4uVf+iVbus3dMvlxPZF96xVnopDitsdNHSlVoH8iOVj9REjVsQ0lZh2OTiwPB1FrCRaRw5UT8w1NK7w2ZK79jpTwsCYhJBOxCWbYlWbYlWbYlWbaVYzlAPLAU/oLMpMv21Bfaw23w5pId7QMl6rj0gcxKSrQkNxsuzvCJSo277igOdQOtg+SrTb+YotAX6g3RqjtRWvEbdR2v9MSV9CHUgpFuiAC3QVq00H7nD1mra6HvSLOzE9W4yq0LSWUhixgim8ykoIrJl0ta8kL/oiRUTV8zXXHVpNF8YbNyMlCc7iAPQmWH6IFeHJRTJB4oiRnYhTL/xDmQdJkXHmAv5RWpRb85k+UfiLwuV9pCxZrgcC+6oykb3b+IZCpj1isiV98wd8UzELQtTFIQ/8R2UH3DaA/34id6Zucy2fDlEMwM+EJxUgcQ5RtquDRIEVPOhZN5OoimfLm98hMp0xVTwionfXVx0gO0nlBOwBT+4a4ujnHBwLEQuJSA9Ada8/QdTb/RLcmyLcmyrRzbMomdqMml/0BPnRlLsi1Lsq3+2zF5PBWvnhtGkyjHRKsonzzk4s2QdvTiL2hxrOyUDiSzeqonX26TYPpCUUztE7OWnkB6ihMOdZim2l2SwNbfEK31N5QoMRlLXYKrZ9EHt0zVRINa6IViaPIVD37iTEDVDsP/8nSlDo5Zx6zMLMHLRcHKsRwg/uAIonU6fjhCbDXYIbQutMMvJ9Mfy/TfpxtoW5j9sPtOauiWFRO5kn6iNHX1pC3JoPWDKQr9RJP5VUHEqFkbkpcvTH66lfvshVpYTl6+Y3aEb5ge5Syd1HjsB9lb/RUt2yJgB0qQ2KA49FBVxEHNgWCTJ5Y0wHZM/uGRRcD0hanhPKMtaYuXNxHHOrjtxRdqR8HC31CiGFNOuwiYIg46qexBEow8/M2lqUvfKMnSh3vpVo5tOA4qGQiTbUnWwEItNBUcqqlvXBxqmETwBKIvDisBjR950MqZqNSaEjDlvGG000kw5WEnksBtUPhCm7w7B+2F0fBhyoRyXjkz1W+IUr4w+fIssy0Md9aCulyaXPpAyxJu/MDky1m8MupkXj1gMxATbcoJHi4KdoJkL9QbGtVpGmw8uDhGAYgObJ61patw8U1IehSCf3mWpX7DEDx7gMOGTtT5NpOJs5BdzT5Rsk3ATpQUCf9BhGmzgmkMwsqL2mM7UD7Q0fFPtLqfgJFfXM6cZY+TiCzihpJSF+fApHjMCfiBlmEiLmRGHHvn5OXWgCVMIQ/83+8fB/mrofgbYgoLk/YvjPwVcZCeEecvjuTfepfQtxAIYRWXxMhqDeffQlOZVnTUzFTjrgN5BSn1aPi8gSnyGUltWoZPLeXsK1KYObZV+AfMzHIAywz3kC3L+qTgqrEbe/DU/sPZkvfRNbP9hDDuYyFfSAd5dfDU9h7y6neke3amhkOw1XPyWRxKMZaxC3M7j2Bq9PKwiAvRkqUh3/KGx8LeQ39s+nL/7tkbzkbSzmUI7+4nsqj6J/YWFi5kJxbCBHL2Abln9Nx7efX0fDqrWvtAdlPuXYPZTS/KyZMfjkgH1za+Y3pOZ1fzHZPn4iB7+LD+RidGK+mtXPIHsmeqJJkDwhlne0YjgBUGk/Im2hZHKP8b+8ZsSy/4xVeZ3W3KNTyFt0EjNqPpE6m1r5hROvu0hCe/atO+OLdeHK18YfI4DfmGqsmrsf+JqeXqIt1nTm+1J6bn1/tN3U0NHL5mz9+mSaok9LGfhFYuJcl7gTunp/o/IdP09QIQywPwpafQq3I32gunQiGRRhYk40F0vnFW00ORltSfnGlkirEUi/mejCHA0zN+cha25wfbgbqQ3UyyIxxnKRI86uII3XUitfT9i+eXSN8L5hFsCuBZzn2TrQhnltj3fCI9eR9NMdrYyroQSnCsPEiCpcYlGASjgjGH0tqOyQ/fFqa7cgI7Dk7KrhoBNQJz2AengeL1DRtnd/UTs4Kd6/cEqKCRMMXTr9rF0bKfzuz6vzm7M8uymQvfvDvhN+S+8oXJD8+u5GCnwHaBw/MhKNzHx8Qib0ghlv4T019C3wO5C5G4dLLwYylqLsRjMCxZ25LknoUthS/P75Fd/ydk1/TzguwpJ2BD8y0QHlBOQAmr975kS3/y7L773EM7rWziIyaPHj+0hdvu7nnj0eIswpKxm13Jsv+J0fB+FQMY/QgxSO8BEbGK3zhLuIGEGbq5mLdDGRqdvHqQHqA9wdwFwdLBXOof3t62EWLty2jIgdnBZmpYkjzjgfTzsu4L4kwT0RliAzQxnDSVpg3so5Y0vUV6zvxZC9+8u174oeel2bVjauHBZ+2NR3txHo5dd0NiefyF3BPCZ43OnWMoNQI9bKEeCw9byL1VH5ido2eYXizatEGw8PHpedbK+5g20/qB6cHzKgCjr9aw8XUPwDJ0Ei7BeCrTtFdHyH9X4k8e7eZdwewnrhq3zfrFc8c5g1a+MHk8M8Gb56np2zF5nedeNcaxxcnGeEX2lVAL4snY0Pk78sjUGRsdnvlwPL8F5ZnbOELagYrkv9jZGc7S6SUjSQSYIZvICnLETEDmxcPpyJtSCeLV/8DcHZ8RdnUFgTvWWFZQXrVklGGbDqOZmOr4wT8xT2ciu9JTjHb4sxa+eW7JHJiHUAEau2CyiRRi+aIHthU9mAcsRJnfhHnuyNC/8vTG2ZZlbMLYMZw89iBDE/H2fiC17n7FXJe5HbksEj5z4fkmkN8t3wSj1IbiwYvpOZyWan9haqfT3XzH5P/ouZfvpHu9a76LlRfnM8KBS2Pm4ExUP5FavhkRY/LGmSp/x//9/lHQMr12omQbH5QPtGyHgFJCaFEcCFVdnFQcRIxEunAyL+XAo8O2lNqJ4qBhqi4ptfATJZVrTvJkRQKmNJyYxLIt6XI3F8e4YC+IhKVIXUq4c2vWvqElWTYuHBTHJl8IpIILX7pE/uHHLB2WZFv994JUhYzTYYkkhhuXEiwOAZMI2AOrUNrRi7+gxbFyr3QhqXJGJzOOlSc/nQRTCkERkn8iS1ILPNAnb3GY9UAvvmHuw23TbNneMGn4Qom6etKWJEjHpSOWFy3/oNGWM9zsRE3NGyb/B2cQs1glYhYsDDPcwxstFcUxGUB0AD9xJdmJrAunYINYC6DdoOHkwqOdKKlculBzaJ3kj/gzmyEc3bIEEjAr/wiyDcdOlBQJFycyoEH/YopCP9FkXsrgERExmLUhefnC5Kdbudf+QEXHX1CZkTRVcZIJPi6O8diJzJT/hdRsJnD7iUyjYRKBKqg5EExqkAZvRBpRumF6lgdSe0EfuqWmC5PHeY5EUiRg0sFvOIP2Qmri+BPVisUhYMpoMEnQtpxykMS2MDy4+dHzF6YWt4SdLo5hXgiU3XgujXri6kpTdTg1TCJgIJY6jkFqDZaLDU0JygmaqiG7Q1ETFUzpB6VIymmd5EQSTHnYAyNJiE0s28qxH6jFT0yXFnsgs+2+IUr5wuTLs8S2MPwFJXRc+kBmJCVaWuhv9OoBm4FOt8Wx8g5Z+sYUU1+ooImO+ILiGB0gOgAWwOHDGg/hxJX0QXQE/3JalPoNQ3TKeqzUOiN7lReya7JESwc/EUnRN6RWCfnASuGSmktFYtHin8uSjdPoybZ49Cx0EC9+YGq4OLaF4ZZiENuyDbfyT+QXSsOlEyVZc/4T2dXOhXYm8IX2yk+ku/mOyZcD98szv0RSbcXS8mQms0Q83Mkd1gA7UILEBpFD8qwLrXIthGBSOdrCX16F6o7JP5yllmRblmRblmRblmT70ynIkmzL4pyoxRdKG28n/C/0qoPszHQhqsUhYDp48uXtWzllKSH8L0zt08XpgsFn+sPdTeIhZqKYJPxEknKQHvs/kJ7YdEnBw8Mm9+jssiTbsiTb6r8Tl2YwlWBqN6RWDkqiLKgGfaJMjQCsOHzir1o9crpvSKV8IXnuok12SPQ7UkCMRceFp1ecJ6aGrBP1fZ6z5bPbmQ9fbluRtNCGS1AwdnL1LEq9dKHlUr+gJYas6x8pBjclsjGLNhFVNLUvl9Ue7UhevjA5Lhotyf0nTjKVWTkWLUn+QEux1WiXyP5AcahRFU06UDkQLNnpT66ZkA5kV/NPlJRaFj3QRsS0PFScO1rDN5TTRXxDLX0hLVgIupQQnp3BcpLyojX5QgU3P/iJrGTAkmzL0j+7OLanH4TKNuA7otkWYuyO4qQE6AV///8A5A+I6eWPhoH5iyJZ/8J4IMXyYsX8MRLP3zUXBxjm750ka+cQ+M2exQfnDhYzMEb9fAAAEABJREFUER3Hyv/C1A5n8rw3WsgH9qrUl6+vYUMHUF8QCfvjSWxJA8sD/U2ShAezNflCLqOFGZL+xsHUbtjrUAazJh4hk8mD5ez+RarVg1TJMZa9cMpcH6NeW4ECFzFBEoMATz7NqR1O02wjQcPaUxyJWOnE1E4nwfiRVg8EKzkxCd6PyhbywH4v/HorBHvtYkf1v5Ba3tP/vGi+YfaiAWkJFCNlLEJzksF5VeIvH/WI+ebsKE8z3xfOqt5xIrXqb8jMWIrdmIAU3s2s2RFKNTGNdE16xKdw8BNX0gcxFNw9u8NPXD3A9VEh+FpF9ocdTQu33fmq2UkNfThfRd7rJ+wtvSflJO/YLZR3ZD+7Rkm8nMZ7hVasdz6xvYi5N84gfRGeb579FGlJfefdgr4j86E43cRfXpHQ/26D2T2QCfx6EMOLRyNt74EdSsCjAesxzIU8/a0p2uHpT76wKaHWkEJ3w4q9D5LnpVg8Ob8VeRqr0zzfHD0FEK1zn5jp8bR0ioBVDGb3YPYhI5w8OZ7f7dRyIVr4oZ9IbXT2kMfKSWZ79FF+ODtbPZGh49HgyMxiuQ8p7Zev9kBrSdIbcmC08BNTODxi8g/8o5SJ6000Yjvv23NvE768yNOfmB6W0UGk3viFV1euy32/SA93ELsk//2B0opC841zV2svmGcxEcAZTA8ZQNz5H11to35DnlW+kDxvYGnfGCShGEtxbqyecDWngNNDTHchPU0OvWTCU+ouSn9haofT2rfdMITbj90LMzKViSPzW5S+IR0MtXIie/M9KR1IbaUp9jmV6Mnq5iTBNASz88TU1oLq5MH2rtqsGhWJjkQ6ptA7o2TnHWmIpXAie8rBbEq+kJbb0vIs/Gc/JhZ2N8NFtB9cNUr9iGK05UCeFnjHDKSabxnkA0jCU7s8CgXWREsXOBaCTvWNo6XYp5MUCVgH+n+/1afxzrN6bk6cjmi/zrLrJ0gjQnYB6CMMZ1MvX0hePTjNvIbk5HNXxNnyy+musbG4OsgzsTk7W4t0LoRgp578y9mYscAgjdg5WzHCl2cytR2Td8MKcFqw8jvyhRH4Dox6OAKkv2FGyYHHb55W+ihMhJPHwg+/OHshiVNLxgy7k81dZBSJ3EUz306ZHAWdJMYQVg5OG50kaFjFC5tR35F9KGk8VKax6EBrg7k/2SaVXpwNWB/2hmnsEopFxp+YHuS8p/BnYE/rC7ddVcrJwH4N6fG2+Y25hVquvHgXti1Zyhd2C/QvTG28ewnZEYUUI+MdxN5BWmRpsb0VeVu6ydNLipXcsSx6u1jzX5i9tGG5CziF4zfoQyiUs7r8RJIMxulp7RUj/pezqy0f2DuonZjm8A1Ti7SQn6PfE9ouahfy25RvmCJDlYvJqJOnlOyOYb2iod0E7Ifn98s7TmTnxbMZRyAy28jPOUhC93YXae/4C9lFmdHpzL0XZ2/rO1KNlnYw8Nel/+OPgkwofxxUTv6QeMfpsDckt+G4PaiFME0uBYdrTgnpDW/kWVR2ECSlD889yUEXxbEmHUwep2V05JOTVP8LqWXQnkEfvNhKs+oOxxemQKqMDnpyBEvkxp8YbbmeuHol2dQkWaqLc+RBKLpx4VaO/YaWbcoGA/+FWn2gOMZjoGXFGpoSlLNj8qevnshZcENq5QuTn06CifdjCmrnELuC7GBaHqjFT1TPqFrqQnZUf6Dt6QvenLnyhZLs6bUPRJPQcemBq0e/GGV3JsVKVbM4Vrj0QKPgyGqd/ESFUH9Fo1pqPFCc5ED1wUTBY9rP1TpqLybdMfmX06rUQHstW2gvTi12sDtaTpFYZMbk+kRRMiG2ML1JceFQHS5O8xM9NW2Y/NO1Kgv9hmjo4vQu8iCDskP0QC8OyikSD5TEDOxCSeXSJ2ode3UutMPxHZOfzmDzhYBOHoIzTpQemLZdnLJps9T4gkimNua0Jb0jcsTuJ78hhXAvzKBdJtuSfP2DW1p8x+TLacBEq97RS9+QZtsssOzLIbI40QCdKI2+UBouga18Izva9UCdXGqeNdGKkr5QnNTS8IWpfTrzrYnIAkw5ICbE2IZWnpXwjabftFiSZVuSZVs59gMRo8RJFbzciy9k1jTZHr1IvmNyS7bxB0qjST8ooxEYSwwZlB7oxV/Q4ljZIR1IZvVUJ78whFKEpg0RxLiUkNqJ4tBDVDTlPHm05UcJ2rS7QjzTL9y2hNvBpBtKlODShupJe5KpSoN+xahxMRS0GzvUzEmdMr5QC03ty4+eF0TCfDpbyCdaOS4X0cqxeFaSP9BSLI0nWrbRfSLJcHFSA6J5YSC8+GfoBB0Lt10SWvmOkqJVSpCePGWlhItTfqI1fEM5VeIbaukLaXEU75y8fGHy063cZy9UEP/E7Eh9w/RKxLuLw9rRDcHsSewdLdupDpLbcBwTYmxQHESqEgH7RV3HaSp1o8qTL2dXtRPFoYYpvcF/9K44ZsCLzwJ7IbXsdnEycS4OwYyn5W+0Zu2OycdTtCe3QXbaT5QsCVlF6QW9tAcyFMW2RIftRNmWZAXswRDSyEkHxbF+uTjR1UDcsAy+ocjjUYPqsXpfcifgP4iAtfENhdglv2ijsVLpkWQfXD0Hu6PlVS0y84so1ReSC7fDRWp8UJwlV4MWTTK65eTEb3SrjQzdUVPzjuRwcWjX4UKzLQy3VGsg3dGLB8X5LxT96snuSRpl+0iKNhyjIJ1IUj0oqblUFCccuHgITjvxYYdouZWJgjVjl8l14qp4Q2oKP1EaLv0gQtpS2NG7nvz0dsI+0NHxT7Ryj/2GaMJTA1XMLjRxFj/0E1PCY07AT2QGSqv1i176jnRlxoNJaZIWV07yhf/LXxTzV8JgtFfMXxJx/gyJ0U3evjecJfSRpA7kL5BM8RfRGBmWbPQSuhYyM7Vw/I1Hw/m7Z1t7WVsT1qqkeGq00kd3OJeW3zCF1BdSY4DRB4+ORCe1diREXTx3U00Pl2Dobzzah7Mtvy3Vme3KMK5iIavpII9eXzXU1o4ekPLaQU/5YPeH4xjLotMNwV54JUKMW2oNc2vTBPagTBecPHeFH37ylFvnXjDWnug3h2B8SMs7Hm8djbtHgHZgIWPVN5zLiPSNUawR2NMnbZh5vEpwcy7BqJxaVoQvZFe+mWumr5zaias3r6EJluzy7A37RHalltkHcmHsdNaQp3FmyhvmVoqw1B+8KnqRh+8YOfyG9JRf92Q3bRH+b86qzoL5HYGZJzk5eWyuzNuHlec3ycV/IbXc0X0MveFq4W6sPYPEjHID90ZPRjMMvTHKt58z3cTMC6bndHY23zF5ReYnn28gz83rPRRh/DblGybFY5QC00fWPT/I3jYuJG/fhrkrjsQH5W1dQsAiIs0lJBhNtYbF01beRu4KIibr7lfOBD0tTUgrIpa9eMoRX5GZfEvuCDJFa1mxPD1xFrAuGb4qCBi94fjRsyMN2Y1EH7tJhv9D3p+PPpDhuTf7yrkPBbri8ClFhXMXkdFw9rxxtLyHphjt6WNL9eDl0xfOvlpDBOYAXrKWwKmF785OCjSuWiB1kFunRHVJcFRq2Tmjb5wGivO21DfOouonZiV17hgdnnx570mefZ84dxBpJ6b3x9lb7YHdiXZi5sP/wLwdb1d2ks/bM5Nv2XEW00Z79PCmBCwFRjr/huzmo4gtnsgkxj7WkTS+ImMtnrgS7m0GZn983oC6tIPfkVtaX8jy1m8IwdJGF2+GENlMcr25GU3B7Aj2HeldOikSFYbb84rcUj346GVB5/7C1E5nR/OF2RsOVgEx3sSnYN2NEKQNveTfkR00Z5T1vP2NR1vee5pzDzicnN+LBRh5tu08+ekdog+r9ssjnytIym84dxx3z6sT0WlONt8Uzj3Mji2enqYNad2c6chHTzHachblXhgzjQ/kvsz0s1KHZyY8nt03XD37THKcxRh18twJwbJgNEiMC8JnKdXhUK6NwWNUagRqTBCXTtdwIndFXYuB9ONLHwhnPISU8Y68Iw0Yi2IZorcCfJCker+RJbxiODkJMX2MkS0LSQpOd3a0izdho0eAdO8Do8U7t2rhMzI7L846HkIbd65aM3TE3xl6qn9gaqevHSzpfcVouRDMPdX+X0jYC3IPlX5LEI+Sxuy8I3tTZ+focHKeE8qKkGiDnSel0PogQgbi7Kr2gp1l1QwS21+hgS0RM/k3Zg7vvv/ErOLrWd5+bmKkdwSp9rl0XJgeOhhpbO3IGCr/RDamxnDuI5295W81trWWQD33MIQKScRvnMelJ/CGrEmJkQB3j5C3RCgiDc5umrCKJ5LM/ciTM83S0HLohSH4FEliJSQXNmMHizHu5v3ZkezClOiMpfcVZ23KnaPnRHb22x6YO049tcOZnRr3Rnvl1KoH6U7O5RjXhv/h3Un9xLUjn8ACVs0OOAld1MmjA0iTzdupMUNcOnvD8dZfkS3VPxC5ly78n+31x0FHkv2CaDY6bj8wU2ioYliDpOJAMBKNLoF3xSjqcaPYJZGfKE44UB1MDUknl5K+esTVm7E2Pnl6cOOpD04mzo1b7UogLbmj1XsIGPXh9mCKdvJxcWzyvzC1T1+zWrjtYkR2dByUgkRyLIl+UBxr6aA44YCKDaQbUjOK8B+0OA3F3kdfTIThEql60npzCKY0BkXAdMMIeHqUQw7Yg0qvRBw+MVxCjG3oxTfMHrxKEBdue+Z2lChZlmQnBnEJjkuKerkX3zH5cnY0OzHzKN4wtfATqcGzGEmHC80TiKYpFvTiC8ssFcUxGUB0YMcRlDtSOlCnToIphRNJykHhRx7cl5w8Ik4r8T/saHI2S93houUXjBT9DdXTFWTvaI2+ociXa+GvsioO4n9haqdbuc9eqCAOKprIF6rIbqEp50ChqMeNuvgSFsiezN7RS19IzTZLjC41WAoG1CC9459FqUPpWZ57ooEuimNNOpg8Dhs9Cc7Ixq1yvaGl6gvJy4uTieOTq5nFIWDK7kHLkRFOJLEtDA/+4c/ZcsniELDmQRRy48KtHJPdMJei2Ua2bC8EZA19opYOiuPLLSvW0LRBikhaTP7lZ484EIxEbRfnhyNg4qGYgto5xK4gO5iWB+rJ1TOqVnUhO6o/0Pb0FclPZC65P1ASZVHWO1qWcONfmJolOmaHFTz4DxoFF96+G4akvrBN8BsaZkSD4hiP+YdHvbkXO3ElfQi14J9+9Ej2fdY+uHoeVFP1H2iJIcsbkpZvSE+lE6nNiHKWrEG/IJpwGojJNtfKP9DRcauHFfRLQXFsN7ctxYqWbbiVfyK/UBounahWleME/IlINftescPxT2QsNVr0hpSV2gumXVtx2hLH3VqiJXLjYw4lPVCCxAaRQwLFJHjvI2CyjYsTxIWjaSFMdmIVWcKNB/9wr9qJnpljV3C5Ftr04MOlG4pjCWt4RYl6Kx/opYO5B6aFBTkLJLAcShr6357G9N8wAv66TBxqjYOktTICpmudk2b/2Y8AABAASURBVMI3tCR2YwsRIDYoy7Yky7Zy7CdKUZY8ubTQd6TJkmzLkmyr/z5x9XjH5MslMSrKJDFruENk/olzxzAv9YGhzGSHTiSrvpC89WKCpAhJFx6cAkZBeGriPDE1ZJ2o77PNslF649Fwmw7cDqb1BaV9hXLSfqHlEOKOvvFhicgYmfWNqX15plJ7QSTMsnGZC5yIDyKQi/PkWjpo9bBi4Qj2hqR2g+wHZiraQqqiST3o5SWEG4HXDvED2SFRO1GccKEOKrWkJ0oqV0/kJIPWD8qUTfQLaukLaXEU75y8/A2t3GfvmHy5npgdaJLshXoiNc0xcDip7DA90IsvpMd2mtClhNBXFCetgDYMDf8ffyxsfuHLXyBTXH785ZE/SfKHSf4imenUbhiCzyqSv+xo2jH58kD+ZPkXpvbluTo1cJ4JwXh8PyF4+HxNYhu49QtZhrVKwLriHdlHIb9b7ydMHp1C9kR7wTwwHYfTwpt6VXF4qtE+kN2tnrim2p43wKlhtMGhXZ46jqFHxCHY4mTYIlMkDk/h8IjJFzYlYO0tUvtEClh+i74rIfyGEfB+BLtSA/I7Axi1xgMh2LC+AraQHdX/Qmp5T/fTfEM2hSPTksheAIOTp37z+c0T28PbD6StbGpLDUT9C6nlibT1zhuW5B1p+sD0LKeLZ0xMNwR7cqTDnqU+hOKO6QkP5p7mkCCt82iSk5PHaAn87UdTfjU6jx3cUwV+x3wVM7UGrj+QeYwRIn3ISe6cbdU3pAnGjSTEyY/InmoLmcW4M71oEOzOEa47Q9K3kF1pzvZ3zN5WSQ5kHhZjS+D0H35dPD03Tnf4zWkrXwjkiYFPbPEI7Gy6Y/Jf79dEzmLw4iwoX0jeljekkOfmF7lwGvN/x9XpuXAyNqOmL/zy0S+enem6sK/kP6qo9FHIPXFEDH1pEO5gYzhwcebKF5IzRXzjU5lbUw+/vPfmlkhfmNrhueXIgwc/ERHLTVlXbBLxzc9BEuoYyYwl+YO3xG8z6/nCEfiZkoQHWZUeds23wjsAHjq12HSjh+B3zj40lnc6u1pnRyrDyRCbB+mkzMims6MaSDlGfd3ZmRQWJ2WSGE6RbHhieBCRLWHtaoJ+QyrlC5Mvz1sZn0K0kB+MgOfhuS49f2KL7+HY8RemdjprmueJvAHaHwzs28HjOWnb6JL5LSLCZvrBGRolkY5aw0w0bbh46PKsZgW1vA8nG56GD54efKrdUPbKWdOOT6QQy6U09jeB9zcC81XNcwM9SFzTeGFqzP6brdljhp2duyE95UGqyUn7jidSPlY9MWM8Mh14v6RIwC4+WWKWZ2JDUizirIdgdx4B730EjKeyDy2N5Uz3t11IdXrWS9JarTxTJNjod47MlkT0LCed3U/OxtTx1ott5u6FQJblnh0jn7zkCO2E7Jj8wyOfiyAYwzy0cTDal//M0sh3dPDA9JyevfQAfD3xsqoErGKRgM26qOwcvqbD8fxg/Q25546Mps7s6OF4OQHLvm+feyYyx67ks4vsh2dhdLBvAVlOG8O1BqQPbCWTDKYl/HI2o+8cSndiuve0WlqT7Jj8dBIsv9/MQs7Hknf2gdNIZelk/2Lt7m66wYuTlS8kzxX9jSsl8HXRZ5QYXujTk61yRkMXHr/YIFPoycchWPJV6VVwsAqI3e7IPXEGMaq1hg/OPipZQhdvCwfQ3nlq470n6TRmRRhP24SkR2Nw93SH/4WpxbMnePND/MDupnZihsN5It8X66MjpadIz4FJyYG2daqc3+jAFFlUWkxGnTylZE88OtLSnID1jjsyjZD/rvV5BIy+iH1Nc7ogjb/IJXTzhFVvRsBGZ4Q8dnScmMso5H6gd7W7Ol1ZkPwLO5SApwfgOYld87/+5RB6IX8mLN8wxeU2+uZJlYBcZPbCEDw1QAcmP/0Qd0xu2i1ltwZdFMeadCFQ/oaSthWSrHLtaKl8YfLl4ri5Vgxu7pV/opX77B2TL9cT2ZdecRY6KU5r7PSRUhXaB7Kj1U+URA3bUFLW4djk4kAwtZZwESlcORH/8JTSe0Pmyu9YKQ9LAmISAbtQlm1Jlm1Jlm1Jlm3lWA4QDyyFvyAz6bI99YX2cBu8uWRH+0CJOi59ILOSEi3dUBwvJajk3HVHcagaaB0kX236xRSFvlBviFbdidKK36jreKUnrqQPoRaMdEMEuA3SooX2O3/IWl0LfUeanZ2oxlVuXUgqC1nEENlkJgVVTL5c0pIX+hcloWr6mumKqyaN5gublZOB4nQHeRAqO0QP9OKgnCLxQEnMwC6U+SfOgaTLvPAAeymvSC36zZks/0DkdbnSFirWBId70R1N2ej+RSRTGbNeEbn6hrkrnoGgbWGSgvgntoPqG0Z7uBc/0TM7l8mGL4dgZsAXipM6gCjfUMOlQYqYci6czNNBNOXL7ZWfSJmumBJWOemri5MeoPWEcgKm8A93dXGMCwaOhcClBKQ/0Jqn72j6jW5Jlm1Jlm3l2JZJ7ERNLv0HeurMWJJtWZJt9d+OyeOpePXcMJpEOSZaRfnkIRdvhrSjF39Bi2Nlp3QgmdVTPflymwTTF4piap+YtfQE0lOccKjDNNXukgS2/oZorb+hRInJWOoSXD2LPrhlqiYa1EIvFEOTr3jwE2cCqnYY/penK3VwzDpmZWYJXi4KVo7lAPEHRxCt0/HDEWKrwQ6hdaEdfjmZ/lim/z7dQNvC7Ifdd1JDt6yYyJX0E6WpqydtSQatH0xR6CeazK8KIkbN2pC8fGHy063cZy/UwnLy8h2zI3zD9Chn6aTGYz/I3uqvaNkWATtQgsQGxaGHqiIOag4EmzyxpAG2Y/IPjywCpi9MDecZbUlbvLyJONbBbS++UDsKFv6GEsWYctpFwBRx0EllD5Jg5OFvLk1d+kZJlj7cS7dybMNxUMlAmGxLsgYWaqGp4FBNfePiUMMkgicQfXFYCWj8yINWzkSl1pSAKecNo51OgikPO5EEboPCF9rk3TloL4yGD1MmlPPKmal+Q5TyhcmXZ5ltYbizFtTl0uTSB1qWcOMHJl/O4pVRJ/PqAZuBmGhTTvBwUbATJHuh3tCoTtNg48HFMQpAdGDzrC1dhYtvQtKjEPzLsyz1G4bg2QMcNnSizreZTJyF7Gr2iZJtAnaipEj4DyJMmxVMYxBWXtQe24HygY6Of6LV/QSM/OJy5ix7nERkETeUlLo4BybFY07AL5zMMqpkD9o7kpebutRg6RXFSQ3QC/4vf1nsHxAb+KNgMX9Z5M+F5KnzZ0fsi7O5fQsBmuePjBlJ9sT0RAe7Pzk7uB2jeXFeMTw1vL0tE2Joq5U+DK1370jDzLEt/Qf/C1NbDmCZZT/ZslyTFFw1dmMPntp/OFvyPrpmdv0m8wlRc+9yxOkNXzUuTTY62cbbFb6cC7DVgwaJ0RatFy9eiRDLpU+kn3enOdlU6UPLO8qzf+PpHZ170GMnn9FQHIKlf1ZAkuDd/UQWVf9EVlKbW7MrHDYpZL6g9yEX1x3du+Xhv54V7Mi+9j44O5H7gsHVi3Ly5Icj0sEzGt8xPac/7us7ouXiIHuqJQxnKRZOjXshxC/OnqmS0E8bWzKycRTeg4BOA0aCiEX/R89vmx2dJfniWUd52iC5LuRCsuofSK39xXlj04Ynn2/OW6a8eH6TrC+i7Zg8zkDnjrzI/ie2D73IruxtfmhPTM+v95u6mxo4fM2uH4zVZKkD9OR9zbjvE6m175+QLfSxOhfnCcWDQ2oJaQu2Rjj4vC6R1yImy6J3ZAM9jNOS/idnCpliLMVividjCPD0jJ+che35wXagLmQ3k+wIx1mKBI+6OEJ3nUgtff/i/Tnpf8E8IhXWkhJrUbgXhZG+o4y7PpFa3kdzjDZ2sCuEEhwrD5JgqeUKOhF7ExhG8TmUxsO3WrorJ2TsRPaVB+kiz30z+sZpoHh9w8bZWf3EPJMdXU1fcPfsCb8h/eULk/+zr/u4Ku9gLJ9yed9Fzw25p3xh8sNZUBXsFHjnfXz3J1BOW9KFeQhpCkmLbPhC7s0wHRmCdSiXLE6KmohQa562JNm7EIk6MRqe36O7yf8Z2TVzWcWucgKWNahZFTaImLcfHrH50p88u+/OxvRy1ejhu7Ntr/FbtO8vTC1+7G3Ozi/sfj4J6+7yBGa6I28I/wdkx3wzSWaBH47GNuLsX8mCVHBmqTK68vCH5618Em3pCbxh3sxqZrEk7AQYvDhz5QvJ2UaE08QGaGI4aSpNG9hHLWl6i/Sc+bMWvnl3vfBD56n5TtbOPeGpHZh7kv+Fqb04C7Hrbkgsj7+Q3SG5f5Cs1rBewgjZGDoJW5kkcm+rD8yu0dPGDBZt2iBY+Pj0PGvl3NUeML/T7Oww8kJq1YNIvCoUVrLhugdgGJ2ESzD6maK9OkLuij95tJt3BbOfuGrcNusXzx3nDFr5wuTxzARvnqemb8fkh181xrHyIgHjFdlH1m8L4nTlNUjUw+lhIxy5fENqWMrU6Y9F2JDCVm8Bfsf8jogYeu8Ick92FYZPpA0te8vpuZCsfCF5+/7A3B3nWlr5+o4SuGONoefOVaOx+g1Tw6MdTlOVT2RnalyV+0nnnvK3Gttoml7y3BMOZrDKk1OL3jp72Zo0X7YQpXqQJMYOGqiX/J+RgSzjZrasXdHYho4We5ChiTgz55uzZefk3fWKrK++I5fNyogZvZDd/S0XUqCem3H2EFO5PHvC/sLUTmdD8x2T/6P3LnpP5IV914bzecRNoydCvg2133QiteqvyFT1D0TmKVg+qhsTUIf/z7Yw3FJsiOwSUEoILYoDoaqLk4qDiJFIF07mpRx4dNiWUjtRHDRM1SWlFn6ipHLNSZ6sSMCUhhOTWLYlXe7m4hgX7AWRsBSpSwl3bs3aN7Qky8aFg+LY5AuBVHDhS5fIP/yYpcOSbKv/XpCqkHE6LJHEcONSgsUhYBIBe2AVSjt68Re0OFbulS4kVc7oZMax8uSnk2BKIShC8k9kSWqBB/rkLQ6zHujFN8x9uG2aLdsbJg1fKFFXT9qSBOm4dMTyouUfNNpyhpudqKl5w+T/4AxiFqtEzIKFYYZ7eKOlojgmA4gO4CeuJDuRdeEUbBBrAbQbNJxceLQTJZVLF2oOrZP8EX9mM4SjW5ZAAmblH0G24diJkiLh4kQGNOhfTFHoJ5rMSxk8IiIGszYkL1+Y/HQr99ofqOj4CyozkqYqTjLBx8UxHjuRmfK/kJrNBG4/kWk0TCJQBTUHgkkN0uCNSCNKN0zP8kBqL+hDt9R0YfI4z5FIigRMOvgNZ9BeSE0cf6JasTgETBkNJgnallMOktgWhgc3P3r+wtTilrDTxTHMC4GyG8+lUU9cXWmqDqeGSQQMxFLHMUitwXKxoSlBOUFTNWR3KGqigin9oBRJOa2TnEiCKQ97YCQJsYllWzn2A7X4ienSYg9ktt03RClfmHx5ltgWhr+ghI5LH8iMpERLC/0U0kyNAAAQAElEQVSNXj1gM9DptjhW3iFL35hi6gsVNNERX1AcowNEB8ACOHxY4yGcuJI+iI7gX06LUr9hiE5Zj5VaZ2Sv8kJ2TZZo6eAnIin6htQqIR9YKVxSc6lILFr8c1mycRo92RaPnoUO4n+hpy6ObWG4pRjEtmzDrfwT+YXScOlESdac/0R2tXOhnQl8ob3yE+luvmPy5cD98swvkVRbsbQ8mcksEQ93coc1wA6UILFB5JA860KrXAshmFSOtvCXV6G6Y/IPZ6kl2ZYl2ZYl2ZYl2f50CrIk27I4J2rxhdLG2wn/C73qIDszXYhqcQiYDp58eftWTllKCP8LU/t0cbpg8Jn+cHeTeIiZKCYJP5GkHKTH/g+kJzZdUvDwsMk9OrssybYsybb678SlGUwlmNoNqZWDkigLqkGfKFMjACsOn/irVo+c7htSKV9Inrtokx0S/Y4UEGPRceHpFeeJqSHrRH2f52z57Hbmw5fbViQttOESFIydXD2LUi9daLnUL2iJIev6R4rBTYlszKJNRBVN7ctltUc7kpcvTI6LRkty/4mTTGVWjkVLkj/QUmw12iWyP1AcalRFkw5UDgRLdvqTayakA9nV/BMlpZZFD7QRMS0PFeeO1vAN5XQR31BLX0gLFoIuJYRnZ7CcpLxoTb5Qwc0PfiIrGbAk27L0zy6O7ekHobIN+I5otoUYu6M4KQH6QmpexSJc4ZL6vwAE118c+eMgf02EYPkLIX/JBCAU6KIWWg4NDg/BS8CbHeIHsnMtZ4oerPwvTO1wpvjzZmLHGlKL+MBeFX05Xzdz5ZnsAGxDUixFdNoh2MbZEoHlgf4mScKDTOWvt3RRqlBMFp2N6cCzMl3B8alNnv7hR88o5w7ua71Iz4mo5BiLoj84NJd3GwGjLyIOYYIkBgGefJpTO5ymLAwEI5+IWP7AaKeTYPxIs/qcRcQqzseQVngsg2YGuN4KwV672VX9L6SW9/S3pvmG2YsGpCVQjJSxCM1JBudVib981CPygWsXSpr5rnNnOR1BvPobMjOWIv1DiOHsJRsVTp4YznOx1IHdpuFSDn7iSvog2oK7c0c/6sTVA4xOslakBfYf9mjOXRkE+3qw3wMOh5G3ZcJcy5rIuexv7BbadmSYXaMkXk7jvUIr1juf2F7E3B9nkL4IzzfPfoq0pL7zbkHfkflQnG7iL69I6H+3weweyAR+PYjhxaORtvfADiXg0YD1GOZCnv7WFO3w9Cdf2JRQa0ihu2HF3gfJ81IsnpzfijyN1Wmeb46eAojWuU/M9HhaOkXAKgazezD7kBFOnhzP73ZqvXB6D/1Eauk77oImDYCtfGPuSfXEjDGD8apcAUCwkiI9B5IynkjfwHAasIdIQ8TdkWaAJDqw8xcpHVcLDdj1NggW3k9KYxN+uyIvemJ6WEoHkXrjF15duab3pJ+dF6enHCWW/AuZpdwXPDEimwI4C9JLBhB3/kdX26jfkG8rX0ieu1nK54RwQ4SmDRFoBqaJJDpOtgpkX5zSYUfLyZeQ+6K9YbTDX3si8oq1Kk+MkpHg4VPmt6jwhnQw1MqJ7M3ClA6kttIU+c2A1PGsXuXqVIrZOXqyqgmsCR+PkBUHO3h3JuDZAXTnO7IhlsYT2VgOcuMMtxjGNeRr2crC/tGPiYW5J5NFtB+kGI1S31GMthyYR5GkBtz5JU6WOJ6v42OY2HmU8IWkWMishWB3HgHPM1MoErDuzv97kLuCUy/jcxiaju4eNR3vTiszqzaj8ElmN7VeyqYdyVsPriWdOjlz1ReST/3iSDU2F69KOjdnZ2uR8lVvGO3Lsz21EyHYbWf2fvo5SNJBcKysAQ5it7XD+cIkfAdGPRwB0t8wo+TAx2/PSIo4U8ThyeMRgmxdX5AsPQvZnWzuIqOZyF0zSZkcBZ0kluELp627E9J2xypIO7IPJYsONWte+TSkdLQ8kAasD3rD3JOPOJHx8g1Tg16XlHyEXJLSwm1XlXIyMF/Z1eTB+Y255YdnX/Q37BYKf2Fq472HMFfkHezd+OholFg6Pxt5dNow9oSTjZWQblgWTm+WlCf54tyXMt57QEYSuZ89yVahv1Gk8BNJysGtl+Ewlh/60L/j6j0e8MTcE+3EbGMG46Ja74Vfb6WnHMQ6eiK/CbUMjg6nVn5iGqIH75W0jBodBsGOJ1Tced6Ue07kWy4+d7SGniUzGz27FybFY6n/iVlOQ3YCrJyJ4exrfUe6oqUNDOQpqP2WV6xIeGnu/wKQkmwHBsltOG4PUlAcVlQSaoHm4pQ88VW8mtihLkgffnDQ0S0OodagyHFamt+QQvlfSC2DNvvIjZcXr6y6w/GFaSFVRgc9OYIlcuNPjLZcT1y9kmxqkizVxTnyIBTduHArx35DyzZlg4H/Qq0+UBzjMdCyYg1NCcrZMfnTV0/kLLghtfKFyU8nwcT7MQW1c4hdQXYwLQ/U4ieqZ1QtdSE7qj/Q9vQFb85c+UJJ9vTaB6JJ6Lj0wNWjN4x2OZNipapYHJdLDzQKjqz0i/zEEuqvaFRLjQeKkxyoPpgoeEz7uVpH7cWkOyb/clqVGmivZQvtxanFDnZHyykSi8yYXJ8oSibEFqY3KS4cqsPFaX6ip6YNk3+6VmWh3xANXZzeRR5kUHaIHujFQTlF4oGSmIFdKKlc+kStY6/OhXY4vmPy0xlsvhDQyUNwxonSA9O2i1M2bZYaXxDJ1MactqR3RI7Y/eQ3pBDuhRm0y2Rbkq9/cEuL75h8OQ2YaNU7eukb0mybBZZ9OUQWJxqgE6XRF0rDJbCVb2RHux6ok0vNsyZaUdIXipNaGr4wtU9nvjURWYApB8SEGNvQyrMSvtH0mxZLsmxLsmwrx34gYpQ4qYKXe/GFzJom26MXyXdMbsk2/kBpNOkHZTQCY4khg9IDvfgLWhwrO6QDyaye6uQXhlCK0LQhghiXElI7URx6iIqmnCePtvwoQZt2V4hn+oXblnA7mHRDiRJc2lA9aU8yVWnQrxg1LoaCdmOHmjmpU8YXaqGpffnR84JImE9nC/lEK8flIlo5Fs9K8gdaiqXxRMs2uk8kGS5OakA0LwyEF/8MnaBj4bZLQivfUVK0SgnSk6eslHBxyk+0hm8op0p8Qy19IS2O4p2Tly9MfrqV++yFCuKfmB2pb5heiXh3cVg7uiGYPYm9o2U71UFyG45jQowNioNIVSJgv6jrOE2lblR58uXsqnaiONQwpTf4j94Vxwx48VlgL6SW3S5OJs7FIZjxtPyN1qzdMfl4ivbkNshO+4mSJSGrKL2gl/ZAhqLYluiwnSjbkqyAPRhCGjnpoDjWLxcnuhqIG5bBNxR5PGpQPVbvS+4E/AcRsDa+oRC75BdtNFYqPZLsg6vnYHe0vKpFZn4RpfpCcuF2uEiND4qz5GrQoklGt5yc+I1utZGhO2pq3pEcLg7tOlxotoXhlmoNpDt68aA4/4WiXz3ZPUmjbB9J0YZjFKQTSaoHJTWXiuKEAxcPwWknPuwQLbcyUbBm7DK5TlwVb0hN4SdK/5+Sc8GVXcl1LFnzn3P3IiU77Ux7n/viSKJIfSKcVQ8NbBR6uPSDCGlL4Yq+6slPbyfsBR0df0Ur99hPiCY8NVDF7EITZ/mhn5gSHnMCfiIzUFpHsa/o6tIVJaXHUjBpUMuVk/wV78X5XwDmL4k4f37E+DMhef8C+YRZXJ0kCOQvkEz1L5D8rbLYgFienjQFmZkaxWhPPBre2bYRYmgZOTyUB8dYSTc9JMNpar2YQuqLaNP3xaMj0dkdwZWW8wEsxeBU0wvBvnhqL87C/LZUZ6Yrw3gRi1hJB3n0+tZQWzt6QMq7g57ywe4PxzGWRacbgj3wSoQYt9Qa5tamCexBmS44ee4KP/zkKbfOvWCsPdFvDsH4kJaveLx1NO4eAdqBRcaqX3AuI9I3RrFGYE+fdMHM41WCF+cSjMqpZUX4IrvyzVwzfeXUTtzevIYmWLKPZ2/YK7Irtcx+IRfGTmcNeRpnprxhbqUIS/2LV0Uv8vArRg6/IT3ln3uym7YI/zdnVWfB/I7AzJOcnDw2V+btw8rzm+Tiv5Ba7ug+hp5wW7gba88gMaPcwL3Rk9EMQ2+M8u7nTDcx84DpOZ2dza+YvCLzk883kOfmfQ9FGL9N+QWT4jFKgekj654fZG8bF8nbd8HcFUfig/K2LiFgEZHmEhKMplrD8rSVt5G7gojJuvuRM0FPSxPSiohlL55yxEdkJt+SO4JM0VpWLE9PnAWsS4ZvBQGjNxw/eq5IQ3Yj0cdukuH/Ie/PRx/I8NybfeXchwLdOHxKUeHcRWQ0nD1PHC3voSlGe/rYUj348ekLZ1+tIQJzAC/ZJXBq4VdnJwUatxZIHeTWKVFdCY5KLTtn9InTQHHelvqFs6j6iVlJnTtGhydf7z3Js+8V5w4i7cT0/jh7q31hd6KdmPnwPzBvx9uVneTz9szkW644i2mjPXp4UwKWAiOdf0J281HEFk9kEmMf60gaH5GxFk/chHubgdkfnzegrnbwO3JL64ssb/2GECxtdPFmCJHNJJ83N6MpmB3BviO9q5MiUWG4PY/ILdWDX70s6NxfmNrp7Gi+mL3hYBUQ4018CtbdCEHa0Ev+O7KD5oyynrc/8Wjrvac594DDyfm9WICRZ9uVJz+9Q/Rh1X555HMFSfkN547j7nl1IjrNyeabwrmH2bHl6WnakNaLMx356ClGW2dR7oUx0/iF3JeZflbq8MyEx7P7httznUmOsxijTp47IVgWjAaJcUH4LKU6HMq1MXiMSo1AjQni6nQNJ3JX1F0MpB9ffSCc8RBSxjvyjDRgLIpliN4K8EGS6v1GlvCK4eQkxPQxRrYWkhSc7uxoF2/CRo8A6d4vjBbv3NbCZ2R2fjjreAht3Lm1ZuiIvzP0VH/B1E7fHSzpfcVouRDMPdUShiNhJ0fkHpR+SxCPQgGJvnDuG87e8gvSsuXph5OkHYBgJOWDCBmIs6vaA+Z7cssMEts/SiJbImbyb8wc3n3/xKzi61nefi5ipHcEqfa5dHwwPXQw0tjakTFU/opsTI3h3Ec6e8ufamxrLYF67mEIFZKI3ziPS0/gCVmTEiMB7h4hb4lQRBqc3TRhFU8kmfuRJ2eapaHl0A+G4FMkiZWQfLAZO1iMcTfvz45kH0yJzlh6H3HWptw5ek5kZ7/tC3PHqad2OLNT495oj5xa9SDdybkc49rwP7w7qZ+4O/IJLGDV7ICT0EWdPDqANNm8nRozxNXZG463/ohsqf6CyL10kY1ZD+NebEiS8flfAPJnRJu/DOL2FzIqNFR9kFQcRIxE+uAnE8eXClRiFwGzJBz7wfRc9eRvftmRseuuk6cHN5764GTi3LjVrgTSkjta3UvAqA+3B1O0k4+LY5P/ham9+s5q8bKLEdnRcVAKEsmxJPpBcazVQXHCARUbSC9IzSjCf9DiNBR7H30xEYZLpOpJ680hmNIYFAHTYXytGgAAEABJREFUDSPg6VEOOWAPKr0ScfjEcAkxdkEvv2D24FWCuHDbM3dFiZJlSXZiEJfguKSoH/fyKyZfZ0ezEzOP4gumFn4iNXgWI+lwoXkC0TTFgl6+WGapKI7JAKIDVxxBuSOlA3XqJJhSOJGkHBR+5MHrkpNHxGkl/sOOJmez1B0uWn7ASNGfUD1dQfaM1ugXFPm6Fn+VrTiI/4WpnW7lPntRQRxUNJEvqshuoSnnQKGox4368BUWZE9mX9GrL1KzzRKjSw2WggE1SM/4Z1HqUHrWc0800EVxrEkHk8dhoyfBGblwq1xPaKn6Inl5cTJxfHI1szgETNk9aDkywokktoXhwT/8e7ZcsjgErHkQhdy4cCvHZDfMpWi2kS3bi4Csod+o1UFx/HHLijU0bZAikhaTv/nZIw4EI1HbxfnhCJh4KKagrhxiV5AdTMsX6purZ1RtdZEd1b/Q9vQVyU9kLrlfUBJlUdYzWpZw42+YmiU6ZocVPPgPGgUX3r4bhqS+2Cb4DQ0zokFxjMf8w6Pe3MtO3KQPoRb8048eyb7P2gdXzxfVVP0HWmLI8gVJyy9IT6UTqc2IclbWoB8QTTgNxGQX1+Yv6Og4KA4r6JeC4thubluKFS3bcCv/RP5Babh0olpVjhPwb0Sq2feKHY6/ImOp0aInpKzUHjDtuhSnLXHcrSVaIjc+5lDSAyVIbBA5JFBMgvc+AibbuDhBXDiaFmGyE6vIEm48+Id7ayd6Zo5dwXUt2vTgw6UbimMJa3hEiXorL+jVwdwD02JBzgIJLIeShv7b05j+G0bAH5eJQ61xkLRWRsD0Week8AtaEruxRQSIDcqyLcmyrRz7G6UoK08uLfqONFmSbVmSbfXfK26Pr5h8XRKjokwSs4Y7ROafOHcM86pfGMpMduhEsuqL5K0XEyRFSLp4cAoYBeGpifONqSHrRL2fyywbpSceDbfpwO1gWh9Quq5QTto/aDmEeEXf+LBEZIzMesfU3jxTqT0gEmbZuMwFTsQHEcjF+eZaHbR6WLE4gn1BUrtB9hdmKtoiVdGkHvTyEsKNwGuH+ILskKidKE64UAeVWtITJZWrJ3KSQesHZcom+gG1+iItjuIrJy9/Qiv32VdMvq5vzA40SfaivpGa5hg4nFR2mL7QyxfpsZ0mdCkh9BHFSSugC4YORzzIidHGz/8FIH+C5I+D/L2Qvy4eeTB/Jwx2NrUkFUkOJH23o+mKydcD+ZPlX5jam+fi1MB5HgTjY/bZIeN8Xbq4Lbwd8CesTB9IK5amF85WGvIX295PmDw6hayI9oB5YDoOp6V33HlYrn9Bdrd64mwpZVuRgNHGm6ZMTsJKbHIo7bHlVLAlVEsWkx+ONFMkaFhnbjglYkt3pBHLbzFrIFgbT0yC9yMyTQ7kdwaw5bNgYzdQ+0J2tPsvpJb3dD/NN2RjODItiewHMDh56jef3zyxPbzuQNrKprZqIOpfSC1PpK133rAk70jTC6ZnnS6eMTHdEOybIx32XepDKF4xPeHB3NMcEqR1Hk1ycvIYLYG//WjKr0bnsYN7qsDvmK9iptbA9QcyjzFCpA85yZ2zrfoFaYJxIwlx8iOyp9oisxh3phcNgt05wufOkPQtsivN2f6M2dsqyYHMw2JsCZz+wz8XT8+N0x1+c9rKF4E8MfCKLR6BnU2vmPzX+zWRsxj8cBaUL5K35Qkp5Ln5RT44jfm/4+r0fHAyNqOmL/zjo394dqbrg30l/1FFpY9C7okjYuirQbiDjeHAhzNXLv2/IM4UcXWyD59sbk09/OO9N7dEesPUDmd32k4/+Ik0YrmpPQ0R3vwcJKEHI+n4v7Ct/DZzBV84Aj9TkvAgq9LDsvlWeAfAQ6cWm270EPzO2YfG8k5nV+vsSGU4GWLzIJ2UGbno7KgGUo5R3zs7k8JyUiaJ4RTJhieGBxHZEtauJug3pFK+mHw9b2V8CtFCfjACnofnuvT8iS0+h2PHX5ja6axpnifyBmh/MLBvB4/npO1CV+a3iAib6S/O0CiJdNQaZqJpw4eHrmc1K6jlfTjZ8DS88PTgU+2GskfOmna8IoVYLqWxvwm8vxGYr2qeG+hB4prGD6bG7H+znT1m2Nm5G9JTHqSanLTv+EbKx6pvzBiPTAfeLykSsA+fLDHLM3FBUizirIdgdx4B730EjKeyDy2N5Uz3t12kOj37krRWK88UCTb6nSOzJRE9y0ln9zdnY+p468U2c/cikGW554qRT15yhHZCrpj8xSOfiyAYwzy0cTDam//M0sh3dPDA9JyevfQAfD3xY1UJWMUiAZt1Udk5fKfD8fxg/Q25546Mps7s6OF4OQHLvnefeyYyx67ks4vsh2dhdLBvAVlOG8O1BqQXbCWTDKYl/ONsRr9yKN2J6b6m1dKa5IrJTyfB8vvNLOR8LHlnv3AaqaxO9l+s3d1NN/jhZOWL5Lmiv3GlBL4u+owSwwt9erItZzR08fjFBplCTz4OwZJvpVfBwSogdrsj98QZxKjWGl44+6hkCV28LRxAe+apjfeepNOYFWE87SIkPRqDV093+F+YWjx7gjc/xBfsbmonZjicJ/J9sT46UnqK9ByYlBxoW6fK+Y0OTJFFpcVk1MlTSvaNR0damhOw3nFHphHy37U+j4DRF7GvaU4XpPEXuYRunrD1ZgRsdEbIY0fHibmMQu4Hele7q9OVBcnfsEMJeHoAnpPYNRvgj0Wd/wtA5U+MuM1fBi+edGrsKLkieYyRgA4sOcIhXjG5abfUnYOW4eIMevmlRZUsnSjpVpdVritaKl9Mvi6Om2tj8OLe/BWt3GdfMfm6vpF96RVn0UlxWmOnj5Sq0F6QHa2+oiRq2AUlZR2OTS4OBFNrCR8ihSsn4h+eUnpvyFz5HSvlYUlATCJgH5RlW5JlW5JlW5JlWzmWA8QDS+EPyEy6bE990R5ugzeX7GgvKFHHpRdkVlKipRuK41WCSs5dVyytLg5dLqg6+S9GFPVFPSFadSdKG99Rn+NNT9ykD6EWjHRDBLgN0qJF+5l/ydquRd+RZmcnqnGVWx8klYUsYohsMpOCKiZfl7Tyon9REqqmr5k+cWvSaP5gs3IyUJzuIA9CZYfoC70clFMkHiiJGdgHZf6JcyDpmhcPsFd5RGrRb85k+Qsi7+VKW6hYExzupVc0ZaP7F5FMZcx6ROTqF8xd8QwEbQuTFMRfsR1UnzDal3v5iZ7ZuUw2fB2CmQF/UJzUAUT5hhouDVLElPPByTwdRFP+uL35iZTpiilhy0kfXZz0AK0nlBMwhb+4q4tjXDBwLAQuJSD9gdY8/Yqm3+iWZNmWZNlWjm2ZxE7U5NI/0FNnxpJsy5Jsq/+umDyeirfnhtEkyjHRKsonD/nwZkhX9PIHtDhWdkoHklk91ZOv2ySY3lAUU3vFrKUnkJ7ihEMdpql2lySw9SdEa/0JJUpMxlKX4OpZ+sUtUzXRoBa9KIYm33jwE2cCqnYY/penK3VwzDpmZWYJXhcFK8dygPiDI4jW6fjhCLFtsENoXbTDP06mP5bp36cbaFvMfth9JzV0y4qJXElfUZq6etKWZND6wRSFfqLJ/KggYtSsC5KXLyY/3cp99qIWy8nLr5gd4RdMj3JWJzUe+0H2Vn9Ey7YI2IESJDYoDj1UFXFQcyDY5IklDbArJn/xyCJgesPUcJ7RlrTFy5uIYx3c9vJFXVGw8CeUKMaU0y4CpoiDTip7kAQjD39yaerSO0qy9OJe3cqxDcdBJQNhsi3JGljUoqngUE39wsWhhkkETyD6w2EloPEjD1o5E5VaUwKmnCeMdjoJpjzsRBK4DQpftMm7c9BejIYPUyaU88iZqX5DlPLF5OtZZlsY7qwF9XFpcukFLUu48QOTr7N4M+pk3h6wGYiJNuUEDxcFO0GyF/WERnWaBhsPLo5RAKIDF8/a0i18+EVIehSCf3mWpX7DEDx7gMOGTtT5NpOJs8iuZq8o2SZgJ0qKhP8gwrRZwTQGYeVFXWM7UF7Q0fFXtLqfgJF/uJw5yx4nEVnEC0pKXZwDk+IxJ+AfnMwyqmQ/IVp1ayBcohmXbigOZaL0iIhYiwcqp0Tn/wKwf4HkL42/SHP1RYA/U84fGfmjIn+j7B8Zb5ie6aCVpuTsmMYPnxl4avjczTD5jKTGFDB8aimzOBYBpAGx8zT+E9OzDmC8JCvI1tjJvdneveSPmLl/OAvzHrrYmbi7jt3Bw/OG3FN+7SWvfkc2zc7UcAi2PSfPsmhXZJK7eBpGUmtYTj8Zy4jojYvZG/6F6WXrAPXYyWc0FIdgaZwVkCR4fqfRRytn0d/ISnr4OmLmwmGTQvIt4Rfcu7r3kof/elYwm33t/eKzmruj42S0JeZTBq+RItuoNT5jek5nZ/MrJs/FQfbs27im+whYRaR/IXumi2R2sZV5aHTGm/GGE6OFg/m92lxegfFnbO8sSWSMvmSZBY/6UuoVecU3MkcTr+1dP0gtw93XVjoWsyz6tFRMK749NLR2Q2rli8njNHbXkRd50je2D73Ijl77F6b26zwymwFqZCSJQPjlN0LligitkfyN+y6aMCb/5GyjzhX5IPrvHLGWkLZgewkHn9cm7l3UsijKL7Ihg21N+OZMIXfugv3PJZzdk6cvwiCRkcYvZH9m8llBRtpVpMZbSHdmOcLccXAm0vdfPPek7wG5HmNXamRjFx6dWW7te16RnryPphht7ODNIZTgWHmQBEvtuC9IBWMu5Hso2uGXWrorJ7Dz4KTsqhFQIzCHvXAaKH6+4cLZXf3ErGDn+dvAkx+ePclvSH/5YvL/7Oxv7xWTr/dd5DfknvLF5IdnV3KwU2C7wOF9fP/jSVg5acpgfhvSFJIW2fCG3MUQsc0nsgFjjutIGou0lYAYUmOx2d7TnZv3Px/y/4Qsn76s7MasQg0P8KbKi9nbV8PBNDdb/Ztn992zlwl2jh5+9a8ad7TvL0wtnjdkb3N2vmF68H7dMQPSzvNz/zgEo5Fa3gDBvvgsySgXMvfE0ZgipmUzdkbo3kyXMx988fZmvPXdBT/0wexgMz1YEt4McMeHM1S+SM42IpwmNkATw0lTadrAPmpJ01uk58y/a+EX764Hfug8Nd/B2rknPLUDc0/yvzC1B2ch9rkbEsvjP8jukNw/SFZr2JcwQjaGTsJWJonc2+oXZtfoaWMGizZtECx8fHq+a+Xc1R4wv9Ps7DDyIrXqQSReFQorueDeAzCMTsIlGP1M0V4dIXfFv3m0m3cFs6+4NW6b9ctzxzmDVr6YPJ6Z4M3z1PRdMfnhnxrj2HKyMV6RfSX/jwhvXKTGJj774Dwy9dAD6cHSNn3U8ptQPjnJpd4G+B07M0NckndSJ+ssOHXGyGOtcvEvolRfJM+OzpM/YbT4XJ+7uYfe3jNrsoLy1pJFv2FqeLTD2VHlFeceyuynMztvfmhXTL6eexiGZVHY7CEjIaYyXs5uGpPyaejlKCeSxNhJA2RToMoAABAASURBVH0l/2dkoEuZLmZXtOFl6MEqJLyFmJ4WuL/KE6Klb/7zouvGmS6/Iou5JvLMhWcOzC9EAUaJpi9ePdrhtFT7C1M7ne7mV0z+Hz33Xt7Hqr7zhnxGOHCrHZxfovqJ2YcjYkySf35LpspfEJknYZnrxgTUKyeng+WjJ1//3/EXxhNpEaR/HzxRGr4oDZfAVn4wFXHs1PETEemOKYGSUruhpHLNSZ6sSMCUhhOTWLYlfdzNxTEu2AMiYSlSlxLu3Jq1T2hJlo0LB8WxyReBVHDhq0vkL37M0mFJttV/D0hVyDgdlkhiuHEpweIQMImAfWEVSlf08ge0OFbulT5IqpzRyYxj5clPJ8GUQlCE5K/IktQCX+iTtzjM+kIvv2Duw23TbNm+YNLwRYm6etKWJEjHR0csL1r+QaOtM9zsRE3NF0z+H5xBzGKViFmwGGa4hzdaKopjMoDoAH7iJtmJrA9OwQaxFkC7QcPJhUc7UVK59EHNoXWSP+LPbIZwdMsSSMCs/CPINhw7UVIkXJzIgAb9iykK/USTeZXBIyJiMOuC5OWLyU+3cq/9goqOP6AyI2mq4iQTfFwc47ETmSn/C6nZTOD2NzKNhkkEqqDmQDCpQRq8EWlE6YbpWQ+k9oA+dEtNF5PHeY5EUiRg0sFvOIP2IjVx/IpqxeIQMGU0mCRoW045SGJbGB68+NHzF6YWt4SdLo5hXgTKbjyXRj1xu9JUHU4NkwgYiKWOY5Bag+ViQ1OCcoKmasjVoaiJCqb0g1Ik5bROciIJpjzsCyNJiE0s28qxv1DLT0yXln0hs+2+IUr5YvL1LLEtDH9ACR2XXpAZSYmWFv2O3h6wGeh0Wxwr75Cld0wx9UUFTXTEBxTH6ADRAbAADh/WeAgnbtIH0RH8y2lR6jcM0Snra6X2jOwtL7JrskRLBz8RSdEvSK0S8oGVwiU1l4rEosU/lyUbp9GTXeLRs+gg/hemhotjWxhuySraLhJEFvGCklIX58CkeMwJ+CsyQ1nZIY6dTnzR3vzENknIqiapuVQUJxwYDsEUcqByHIXEp7uK7xzq6BaxAZQSYINJ8DynOrkgmCSrSMAkheOLv7wK1Ssmf3GWWpJtWZJtWZJtWZLtV6cgS7Iti3Oili9KF95O+F/orYPszHQhqsUhYDp48vX2bU5ZSgj/C1N7dXG6YPA7/eHuJvEQM1FMEn4iSTlIj/0PpCc2XVLw8LDJPTq7LMm2LMm2+u/E1QymEkzthtTKQUmUBdWgT5SpEYCNwyf+qtUjp/uGVMoXyXMXbbJDot+RAmIsOi48veJ8Y2rIOlHv53u2fHY78+HrthVJizZcgoKxk6tnKfXSRculfkBLDFmff6QY3JTIxizaRFTR1N5cVnt0RfLyxeS4aLQk9584yVRm5Vi0JPkDLcW20S6R/YLiUKMqmnSgciBYstO/uWZCOpBdzV9RUmpZ9IU2Iqb1UHHuaA2/oJwu4hNq9UVasBB0KSE8O4PlJOVFa/JFBS9+8BNZyYAl2Zal/+zi2J5+ECrbgO+IZluIsTuKkxKgN6TmLRbhCpeIlohv/j/+uMhfDPkLIZa/EAaCyqE4PAQvAW92iC/IDi5gInUcK/8LUzucyf6x8kQK2NOOXtXmNPAX3ebnICx6Ji9IikWkTi8Eu3D2RGB5IL8NKfXVmcpfa2GU2lFMFp2N6cAZIVZHDAIo0ceHZ1P4dJw7eil6kZ4TmSLHUuTuLw7NJd1GwOiLiEPYRBKDAN98mlM7nKYsDAQjn4hY/oXRTifB+tDgOQvBet98DGmFr2XQzACft0Kwx252Vf8LqeU9/a1pvmH2ogFpCRQjZSxCc5LBeVXiLx/1iHzg7kJJM9917iynI4hXf0JmxlKkfwgxnL1ko8LJE8N5LpY6cLVp+CgHP3GTPoi24NW5ox914vYAo5PsirTA/mFfzbkrg2BfD/Z7wOEw8rZMmGtZEzmX/Y3dQtsVGWbXKIkfp/FeoRXrnd/YXsTcH2eQvgjfb579FGlJ/cq7Bf2KzIfidBN/eUVC/7sNZvdAJvDPgxheHo20vQd2KAGPBuxjmAv59qemaIenP/liU0KtIYXuhhV7HyTPS7F4cn4r8jRWp3m+OXoKIFrnXjHT42npFAGrGMzuwexDRjh5cjy/26n1wuk99BOppe+4C5pUItkJeDt+MfdEPZEheIxX5QqAWaykSM+BpNNLEg0YDsEYjoKXLCY/HGkGSKIBV/4gpePTQgP2eRsEC+8npbEJv0SRF31jelhKB5F64xt+unJN70k/Oz+cnnKUWPI3ZJZyX/CNEdkUwFmQXjKAeOV/dLWN+g35tvJF8tzNUj4nhBsiNG2IQDMwTSTRcbItkL1xSocdLSdfIfdFe8Johz/2ROQVuypPjJKR4OFT5reo8IR0MNTKiezNwpQOpLZpivxmQOp4Vm+5OpVido6erGoCa8LHI2TFwQ7enQl4dgDd+YxsiKXxRDaWg9w4wy2GcQ35Ltss7D/6MbGYezJZRPtBitEo9R3FaOvAPIokNeDOP+JkieP5Oj6GiSuPEr5IioXMWgh25xHwPDOFIgHr7vy/B7krOPUyPoeh6ejuUdPx7LQys7UZhU8yu6n1UjZdkbz14C7p1MmZq75IPvUPR6qxufippPPi7GwtUr7qCaO9ebandiIEu+3M3lc/B0k6CI6VNcBB7LZ2OF+YhO/AqIcjQPobZpQcePntGUkRZ4o4PHk8QpCt+wXJ0rPI7mRzFxnNRO6aScrkKOgksQx/cNq6OyFtd6yCdEX2oWTRoWbNI5+GlI6WL6QB64OeMPfkI05kvPyCqUE/l5S8hFyS0uJlV5VyMjBf2dXkwfmNueWHZ1/0J+wWCn9hauO9hzBX5B3svfDR0SixdH428ui0YewJJxsrIb1gWTi9WVKe5I1zX8p47wEZSeR+9iTbQn+jSOEnkpSDl16Gw1h+6EP/jtt7POAbc0+0E7ONGYyLar0X/nkrPeUg1tET+U2oZXB0OLXyE9MQPXivpGXU6DAIdjyh4pXnTbnnRL7lw+eO1tCzZGajZ/diUjyW+p+Y5TRkJ8DKmRjOvtavSFe0tIGBPAW13/KIFQmvzSk8+/9s/kJ4cZhULgWHa04J6Q1v5Luo7CBISh+e3clBF8WxJh1MHqdldOSTk1T/C6ll0J5BH7zYSrPqDscXUyBVRgc9OYIlcuPfGG1d37i9kmxqkizVxTnyIBTduHArx35CyzZlg4F/obYPFMd4DLSsWENTgnKumPzbtydyFtyQWvli8tNJMPF+TEFdOcSuIDuYli/U8hPVM6pWXWRH9S+0PX3BmzNXvijJnl77QDQJHZe+cHv0hNE+zqRYqSoWxwqXBk80GY6s1slPVAj1RzSqpcYDxUkOVB9MFDym6/m0jtqLSa+Y/M1pVWqgvcsW7eXUYge7o+UUiUVmTK5XFCUTYovpTYoLh+pwcZqf6KnpgslfXVtZ9BOioYvTu8iDDMoO0Rd6OSinSDxQEjOwD0oql15Re+ztXLTD8SsmP53B5ouATh6CM06UvjBtV3HKps1S4wMimdqY05b0jsgRu5/8hhTCvZhBu0y2JfnzD25p+RWTr9OAiVY9o1e/IM22WWDZH4fI4kQDdKI0+qI0XAJbeUd2tOsLdXKpedZEK0p6Q3FSS8MbpvbqzLcmIgsw5YCYEGMXtPKshHc0/abFkizbkizbyrG/EDFKnFTBj3v5IrOmyfboRfIrJrdkG/9CaTTpB2U0AmOJIYPSF3r5A1ocKzukA8msnurkHwyhFKFpQwQxLiWkdqI49BAVTTnfPNr6UYI27a4Qz/QDty3hdjDpBSVKcOmC6kl7kqlKg37EqHExFLQbO9TMSZ0yvqhFU3vzo+cBkTCfzhbyiVaOy0W0ciyeleQPtBRL44mWbXSfSDJcnNSAaF4MhBf/DJ2gY/GyS0Irv6KkaJUSpG+eslLCxSk/0Rp+QTlV4hNq9UVaHMVXTl6+mPx0K/fZiwrir5gdqV8wvRLx7uKwdnRDMHsS+4qW7VQHyW04jgkxNigOIlWJgP2iPsdpKnWjypOvs6vaieJQw5Te4H/0rjhmwA+fBfYitex2cTJxPhyCGU/L32jN2ismH0/RntwG2Wl/o2RJyCpKD+jVvpChKLYlOmwnyrYkK2APhpBGTjoojvXLxYmuBuIFy+AXFHk8alA9Vu9L7gT8BxGwNj6hELvkF200Vio9kuyDq+dgd7S81SIzv4hSfZFcuB0uUuOD4qxcDVo0yeiWkxPf0a02MnRHTc1XJIeLQ7sOF5ptYbilWgPpFb08KM6/UPSrJ7snaZTtIynacIyCdCJJ9aCk5lJRnHDgw0Nw2olfdoiWW5koWDN2mVwnbsUXpKbwE6Xh0g8ipC2FK/qqJz+9nbAXdHT8Fa3cYz8hmvDUQBWzC02c5Yd+Ykp4zAn4icxAaR3FvqJXvyLd6bFEMaYGS0VxkgN6xCcx2rP/r3+JzF8acf48OX9sJMf4iyN/mcxF/PEQg8fIsGRp3g66KiIH8VnwzFPDO0tr7u0utODhoandkGL5DbuE1kVqXPzLo9OSe7MjuBK9mchnoKaHBgz9iUd7cRbmN6U6s10Zxn4WspoO8uj1raG2dvSAlHcHPeWD3R+OYyyLTjcEe+CVCDFuqTXMrU0T2IMyXXDy3BV++MlTbp17wVh7ot8cgvEhLV/xeOto3D0CtAOLjFW/4FxGpG+MYo3Anj7pgpnHqwQvziUYlVPLivBFduWbuWb6yqmduL15DU2wZB/P3rBXZFdqmf1CLoydzhryNM5MecPcShGW+hevil7k4VeMHH5Deso/92Q3bRH+b86qzoL5HYGZJzk5eWyuzNuHlec3ycV/IbXc0X0MPeG2cDfWnkFiRrmBe6MnoxmG3hjl3c+ZbmLmAdNzOjubXzF5ReYnn28gz837HoowfpvyCybFY5QC00fWPT/I3jYukrfvgrkrjsQH5W1dQsAiIs0lJBhNtYblaStvI3cFEZN19yNngp6WJqQVEctePOWIj8hMviV3BJmitaxYnp44C1iXDN8KAkZvOH70XJGG7Eaij90kw/9D3p+PPpDhuTf7yrkPBbpx+JSiwrmLyGg4e544Wt5DU4z29LGlevDj0xfOvlpDBOYAXrJL4NTCr85OCjRuLZA6yK1ToroSHJVads7oE6eB4rwt9QtnUfUTs5I6d4wOT77ee5Jn3yvOHUTaien9cfZW+8LuRDsx8+F/YN6Otys7yeftmcm3XHEW00Z79PCmBCwFRjr/hOzmo4gtnsgkxj7WkTQ+ImMtnrgJ9zYDsz8+b0Bd7eB35JbWF1ne+g0hWNro4s0QIptJPm9uRlMwO4J9R3pXJ0WiwnB7HpFbqge/elnQub8wtdPZ0Xwxe8PBKiDGm/gUrLsRgrShl/x3ZAfNGWU9b3/i0dZ7T3PuAYeT83uxACPPtitPfnqH6MOq/fLI5wqS8hvOHcfd8+pEdJpduXbwAAAQAElEQVSTzTeFcw+zY8vT07QhrRdnOvLRU4y2zqLcC2Om8Qu5LzP9rNThmQmPZ/cNt+c6kxxnMUadPHdCsCwYDRLjgvBZSnU4lGtj8BiVGoEaE8TV6RpO5K6ouxhIP776QDjjIaSMd+QZacBYFMsQvRXggyTV+40s4RXDyUmI6WOMbC0kKTjd2dEu3oSNHgHSvV8YLd65rYXPyOz8cNbxENq4c2vN0BF/Z+ip/oKpnb47WNL7itFyIZh7qiUMR8KunHtQ+i1B/P/p/3VBdnaK+waRU2f85ORbZkUIPRGSLlJIO17xg+xq7QHnbnalBnw4BGNT9/wT+wa+8T9hVqZ3kGv6vNyRcdTl28PbWrshtXKQISIzjQ/IxvSwJN9HSk+0w5m71T6cK7BwnCyDzVgSHN4vSJWk6h3ZjZDWADhC3hKhiDTIPLtpwiqeSNIHpzw50xC6qsMuWAYPtoPkF6uwo40gt5MmUjl5pPC/cNYzkqY+L6GcX6bf9oW9pQ3NUh3vVWh/Yq+hP7i97MK4NvwPZyrvoWN683QGue6HI9DNHenBY5n9RbaxI52tk78j062/IHIvXWRz1sJ4ITYkyYuzuz2L/8vfBcVfHO8oDV+UhktgKxKZOF7UgexqfqI41pQXUyOtGPzLM5g6mLFz5srJo/uGo4gzuqg6AZQSYA9o9R4CRn24PZiinXxcHJv8L0zt1XdWi5ddjMiOjoNSkEiOJdEPimOtDooTDqjYQHpBakYR/oMWp6HY++iLiTBcIlVPWm8OwZTGoAiYbhgBT49yyAF7UOmViMMnhkuIsQt6+QWzB68SxIXbnrkrSpQsS7ITg7gExyVF/biXXzH5OjuanZh5FF8wtfATqcGzGEmHC80TiKYpFvTyxTJLRXFMBhAduOIIyh0pHahTJ8GUwokk5aDwIw9el5w8Ik4r8R92NDmbpe5w0fIDRor+hOrpCrJntEa/oMjXtfirbMVB/C9M7XQr99mLCuKgool8UUV2C005BwpFPW7Uh6+wIHsy+4pefZGabZYYXWqwFAyoQXrGP4tSh9KznnuigS6KY006mDwOGz0JzsiFW+V6QkvVF8nLi5OJ45OrmcUhYMruQcuREU4ksS0MD/7h37PlksUhYM2DKOTGhVs5JrthLkWzjWzZXgRkDf1GrQ6K449bVqyhaYMUkbSY/M3PHnEgGInaLs4PR8DEQzEFdeUQu4LsYFq+UN9cPaNqq4vsqP6FtqevSH4ic8n9gpIoi7Ke0bKEG3/D1CzRMTus4MF/0Ci48PbdMCT1xTbBb2iYEQ2KYzzmHx715l524iZ9CLXgn370SPZ91j64er6opuo/0BJDli9IWn5BeiqdSG1GlLOyBv2AaMJpICa7uDZ/QUfHQXFYQb8UFMd2c9tSrGjZhhvJXyiJHtQPyvxTjxv1w7XHvnfY4fgrMpgaLXpCykrtAdOuS3HaEsfdWqIlcuNjDiU9UILEBpFDAsUkeO8jYLKNixPEhaNpESY7sYos4caDf7i3dqJn5tgVXNeiTQ8+XLqhOJawhkeUqLfygl4dzD0wLRbkLJDAcihp6L89jem/YQT8cZk41BoHSWtlBEyfdU4Kv6AlsRtbRIDYoCzbkizbyrG/UYqy8uTSou9IkyXZliXZVv+94vb4isnXJTEqyiQxa7hDZP6Jc8cwr/qFocxkh04kq75I3noxQVKEpIsHp4BREJ6aON+YGrJO1Pu5zLJReuLRcJsO3A6m9QGl6wrlpP2DlkOIV/SND0tExsisd0ztzTOV2gMiYZaNy1zgRHwQgVycb67VQauHFYsj2BcktRtkf2Gmoi1SFU3qQS8vIdwIvHaIL8gOidqJ4oQLdVCpJT1RUrl6IicZtH5QpmyiH1CrL9LiKL5y8vIntHKffcXk6/rG7ECTZC/qG6lpjoHDSWWH6Qu9fJEe22lClxJCH1GctAK6YOhwxIOcGO3FI88g3db/8nfC/CVTOf2rIEnFC5K+23dz+MWT5k+Wf2Fqb56LUwPneRAsf8U8efbj/Wvoie1g6gkr0wmyC0vTC2crDfmLbe8jTB6dQlZEe8D8ruk4nJbecedhuf4F2d3qibOllG1FAkYbb5oyOQkrscmhtMeWU8GWUC1ZTH440kyRoGGdueGUiC3dkUYsv8WsgWBtPDEJ3o/INDmQ3xnAls+Cjd1A7QvZ0e6/kFre0/0035CN4ci0JLIfwODkqd98fvPE9vC6A2krm9qqgah/IbU8kbbeecOSvCNNL5iedbp4xsR0Q7BvjnTYd6kPoXjF9IQHc09zSJDWeTTJycljtAT+9qMpvxqdxw7uqQK/Y76KmVoD1x/IPMYIkT7kJHfOtuoXpAnGjSTEyY/InmqLzGLcmV40CHbnCJ87Q9K3yK40Z/szZm+rJAcyD4uxJXD6D/9cPD03Tnf4zWkrXwTyxMArtngEdja9YvJf79dEzmLww1lQvkjeliekkOfmF/ngNOb/jqvT88HJ2IyavvCPj/7h2ZmuD/aV/EcVlT4KuSeOiKGvBuEONoYDH85c+SI5U8QLLwufytx68GjjvTe3hL5haodn75EHD34iIpabsq7YJOKTn4Mk1DGSGUvyB2+J32bW84Uj8DMlCQ+yKj3smm+FdwA8dGqx6UYPwe+cfWgs73R2tc6OVIaTITYP0kmZkYvOjmog5Rj1vbMzKSwnZZIYTpFseGJ4EJEtYe1qgn5DKuWLydfzVsanEC3kByPgeXiuS8+f2OJzOHb8hamdzprmeSJvgPYHA/t28HhO2i50ZX6LiLCZ/uIMjZJIR61hJpo2fHjoelazglreh5MNT8MLTw8+1W4oe+SsaccrUojlUhr7m8D7G4H5qua5gR4krmn8YGrM/jfb2WOGnZ27IT3lQarJSfuOb6R8rPrGjPHIdOD9kiIB+/DJErM8ExckxSLOegh25xHw3kfAeCr70NJYznR/20Wq07MvSWu18kyRYKPfOTJbEtGznHR2f3M2po63Xmwzdy8CWZZ7rhj55CVHaCfkislfPPK5CIIxzEMbB6O9+c8sjXxHBw9Mz+nZSw/A1xM/VpWAVSwSsFkXlZ3Ddzoczw/W35B77sho6syOHo6XE7Dse/e5ZyJz7Eo+u8h+eBZGB/sWkOW0MVxrQHrBVjLJYFrCP85m9CuH0p2Y7mtaLa1Jrpj8dBIsv9/MQs7Hknf2C6eRyupk/8Xa3d10gx9OVr5Iniv6G1dK4OuizygxvNCnJ9tyRkMXj19skCn05OMQLPlWehUcrAJitztyT5xBjGqt4YWzj0qW0MXbwgG0Z57aeO9JOo1ZEcbTLkLSozF49XSH/4WpxbMnePNDfMHupnZihsN5It8X66MjpadIz4FJyYG2daqc3+jAFFlUWkxGnTylZN94dKSlOQHrHXdkGiH/XevzCBh9Efua5nRBGn+RS+jmCVtvRsBGZ4Q8dnScmMso5H6gd7W7Ol1ZkPwNO5SApwfgOYldswH+WFw9tcORLgv+d/zlMX8UVAkNJ5LH+ldDkgNJP3aIV0xu5Z+6ywpaBsUZ9PJLiypZOlHSrS6rXFe0VL6YfF0cN9fG4MW9+Stauc++YvJ1fSP70ivOopPitMZOHylVob0gO1p9RUnUsAtKyjocm1wcCKbWEj5ECldOxD88pfTekLnyO1bKw5KAmETAPijLtiTLtiTLtiTLtnIsB4gHlsIfkJl02Z76oj3cBm8u2dFeUKKOSy/IrKRESzcUx6sElZy77igOVQOtg5a2Tb9IYyyFoBqIVyRHET3JpInvqM/5aV2BXW0KRrohAtwG07RoP/Mv+et1Xr5Is7MT1bjKrQ+SykIWMUQ2mUlBFZOvS1p50b8oCVXT10yfuDVpNH+wWTkZKE53kAehskP0hV4OyikSD5TEDOyDMv/EOZB0zYsH2Ks8IrXoN2ey/AWR93KlLVSsCQ730iuastH9i0imMmY9InL1C+aueAaCtoVJCuKv2A6qTxjty738RM/sXCYbvg7BzIA/KE7qAKJ8Qw2XBiliyvngZJ4Ooil/3N78RMp0xZSw5aSPLk56gNYTygmYwl/c1cUxLhg4FgKXEpD+QGuefkXTb3RLsmxLsmwrx7ZMYidqcukf6KkzY0m2ZUm21X9XTB5Pxdtzw2gS5ZhoFeWTh3x4M6QrevkDWhwrO6UDyaye6snXbRJMbyiKqb1i1tITSE9xwqEO01S7SxLY+hOitf6EEiUmY6lLcPUs/eKWqZpoUIteFEOTbzz4iTMBVTsM/8vTlTo4Zh2zMrMEr4uClWM5QPzBEUTrdPxwhNg22CG0LtrhHyfTH8v079MNtC1mP+y+kxq6ZcVErqSvKE1dPWlLMmj9YIpCP9FkflQQMWrWBcnLF5OfbuU+e1GL5eTlV8yO8AumRzmrkxqP/SB7qz+iZVsE7EAJEhsUhx6qijioORBs8sSSBtgVk794ZBEwvWFqOM9oS9ri5U3EsQ5ue/mirihY+BNKFGPKaRcBU8RBJ5U9SIKRhz+5NHXpHSVZenGvbuXYhuOgkoEw2ZZkDSxq0VRwqKZ+4eJQwySCJxD94bAS0PiRB62ciUqtKQFTzhNGO50EUx52IgncBoUv2uTdOWgvRsOHKRPKeeTMVL8hSvli8vUssy0Md9aC+rg0ufSCliXc+IHJ11m8GXUybw/YDMREm3KCh4uCnSDZi3pCozpNg40HF8coANGBi2dt6RY+/CIkPQrBvzzLUr9hCJ49wGFDJ+p8m8nEWWRXs1eUbBOwEyVFwn8QYdqsYBqDsPKirrEdKC/o6PgrWt1PwMg/XM6cZY+TiCziBSWlLs6BSfGYE/APTmYZVbKfEK26qUsNlq6og4uTHKj2gxQxpXigckpIguNOD4oWw/+XPz7yZ8kYf0zkL5LiIObvhflDYRXIDWmheSK9zR9wZjI83r+CkvYy8OD3Uaaopac6j5i+6C1Q+gdmZh3AMptXMjfGjnCcSzD49kCw5dH+4dnOAF0zw6+S93LNh0eLI561zFXr5PaSX3bxutGj4RBse07eJehXZJK7uAIjqTUsZwdZhpLRDaOemL0PmN72pY167OTRTifB0j+rIEnwfPvoo5Wz6G/sLXzcYkbDTpwv6N7q8L2rey95+K+ztz0vyE7KvDJ1nGx47lke7XCKVHhO4zOm53R2NL9i8lwcZE++lR6u6D4CVhHpX8ie6SKZXWxlHhqd8WbZT5LfB5kWCrHo/9E7y45dDrDggWfdKUPadUOU8hekxnIs9Tx1vqv3R6KObf1Tq8bH/SI91ReTx2nMzqrJq3HfN6Z23kv3mdN7qx08Pb/Og7MZoEZGkgiE84tlF8CW6kW0SHnnK9LT+n9CttDXC0CMa/JBq6cAReRdaA98XptIIwuSpfkZ2URP1zwiU6zp/AXzPWlnmlJ6xk/Owvb8YDtQF9nJJDvCcZYiwaMuR+iuE6ml7784P1FnHzCPYFMAz3Lum2wjnDuIfc8r0pM7aIrRxlbWhVCCsBaAVAAAEABJREFUY+VBEiw1LsEgGBWMOZTWrpj88MvCdFdOYMfBSdlVI6BGYA574TRQ/HzDhbO7+olZwc79PQEqaCRM8fRP7cPRsp/O7Pq/Obszy7KZC794d8JvyH3li8kPz67kYKfAdoHD8yEo3MfHxCJfkEIs/Semv4S+L+QuROLqZOHHUtRciMdgWLK2Jck9iy2Fr+f3yK7/E7Jr+nlB9pQTsKH5FggPKCeghNV7X7LVv3l2333uoZ1WNvERk0ePH9riZXf3PPFocRZhydjNrmTZ/43R8H4VAxj9CDFI7wERsYrvOEu4gYQZurmYt0MZGp28epAeoD3B3AXB0sFc6i/e3rYRYu3LaMiB2cFmaliSPOML6edl3RfEmSaiM8QGaGI4aSpNG9hHLWl6i/Sc+Xct/OLd9cAPPS/NriumFh78rj3xaA/Ow7HP3ZBYHv9B7gnhs0bnzjGUGoEetlCPhYctcm/VL8zO0TNMLxZt2iBY+Pj0fNfK+5g20/qC6cHzKgCjr9Zw4XsPwDJ0Ei7BeCrTtFdHyH9X4t882s27gtlX3Bq3zfrlueOcQStfTB7PTPDmeWr6rpj88E+NcWw52RivyL4SakE8GRv4XOr6fxfkkalHPjDz4Xh+C+Tpv3CErAMqkv9iZ2eYS3gBe0mml2TqUPIYGyD0lVyRCrNVgjgXY6s/8OyOz/VMtpXA7m1nnutoKH/EzOGpHU5zlVdkZ2pclftJ557ypxrbaJpe8twTDmawyjenFr119rI1ab5sEaV6kCTGDhqol/yfkYEs42a27K5obENHi32RoYk4M+ebs+XKybvrEVlf/YpcNisjZvSD7O5vuUiBem7G2UNM5ePZE/YXpnY6G5pfMfl/9N5F74m8sO+64Hwe8aLREyHfhtpvOpFa9UdkqvoLIvMULB/VjQmoV05OB5eOnvxwdncAzFdVTmAk/H9mJH8QvCFaeXEyp+nCdfD9S6ZOFMcS1hBM7YZS69HEuSEEUxpOTGLZlvRxNxfHuGAPiISlSF1KuHNr1j6hJVk2LhwUxyZfBFLBha8ukb/4MUuHJdlW/z0gVSHjdFgiieHGpQSLQ8AkAvaFVShd0csf0OJYuVf6IKlyRiczjpUnP50EUwpBEZK/IktSC3yhT97iMOsLvfyCuQ+3TbNl+4JJwxcl6upJW5IgHR8dsbxo+QeNts5wsxM1NV8w+X9wBjGLVSJmwWKY4R7eaKkojskAogP4iZtkJ7I+OAUbxFoA7QYNJxce7URJ5dIHNYfWSf6IP7MZwtEtSyABs/KPINtw7ERJkXBxIgMa9C+mKPQTTeZVBo+IiMGsC5KXLyY/3cq99gsqOv6AyoykqYqTTPBxcYzHTmSm/C+kZjOB29/INBomEaiCmgPBpAZp8EakEaUbpmc9kNoD+tAtNV1MHuc5EkmRgEkHv+EM2ovUxPErqhWLQ8CU0WCSoG055SCJbWF48OJHz1+YWtwSdro4hnkRKLvxXBr1xO1KU3U4NUwiYCCWOo5Bag2Wiw1NCcoJmqohV4eiJiqY0g9KkZTTOsmJJJjysC+MJCE2sWwrx/5CLT8xXVr2hcy2+4Yo5YvJ17PEtjD8ASV0XHpBZiQlWlr0O3p7wGag021xrLxDlt4xxdQXFTTRER9QHKMDRAfAAjh8WOMhnLhJH0RH8C+nRanfMESnrK+V2jOyt7zIrskSLR38RCRFvyC1SsgHVgqX1FwqEosW/1yWbJxGT3aJR8+ig/hfmBoujm1huKUYxLZsw638kxO9XBI12AcllUv/RmaVs2hnEl+0Nz+R5uZXTL4O3C/N/IqkuhRLy5OZzBLxcCd3WAPsQAkSG0QOybM+aJVrEYJJ5WiLv7wK1Ssmf3GWWpJtWZJtWZJtWZLtV6cgS7Iti3Oili9KF95O+F/orYPszHQhqsUhYDp48vX2bU5ZSgj/C1N7dXG6YPA7/eHuJvEQM1FMEn4iSTlIj/0PpCc2XVLw8LDJPTq7LMm2LMm2+u/E1QymEkzthtTKQUmUBdWgT5SpEYCNwyf+qtUjp/uGVMoXyXMXbbJDot+RAmIsOi48veJ8Y2rIOlHv53u2fHY78+HrthVJizZcgoKxk6tnKfXSRculfkBLDFmff6QY3JTIxizaRFTR1N5cVnt0RfLyxeS4aLQk9584yVRm5Vi0JPkDLcW20S6R/YLiUKMqmnSgciBYstO/uWZCOpBdzV9RUmpZ9IU2Iqb1UHHuaA2/oJwu4hNq9UVasBB0KSE8O4PlJOVFa/JFBS9+8BNZyYAl2Zal/+zi2J5+ECrbgO+IZluIsTuKkxKgN6TmLRbhCpeIloivnnLqN5QiibP/fwCSxfirYODuh/iC/GWxf2HMXxXjbSNg1Z8w2uG5LPmJEOxptlfljvX8BTNj7SU5+A3ZhbXlGelOgeWB/BWVlP7VuSt/vYVRakcxWXSuTQfOCLE6YhBAiT4+PJvCp+Pc0UvRi/ScyBQ5liJ3f3FoLuk2AkZfRBzCJpIYBPjm05za4TRlYSAY+UTE8i+MdjoJ1ocGz1kI1vvmY0grfC2DZgb4vBWCPXazq/pfSC3v6W9N8w2zFw1IS6AYKWMRmpMMzqsSf/moR+QDdxdKmvmuc2c5HUG8+hMyM5Yi/UOI4ewlGxVOnhjOc7HUgatNw0c5+Imb9EG0Ba/OHf2oE7cHGJ1kV6QF9g/7as5dGQT7erDfAw6HkbdlwlzLmsi57G/sFtquyDC7Rkn8OI33Cq1Y7/zG9iLm/jiD9EX4fvPsp0hL6lfeLehXZD4Up5v4yysS+t9tMLsHMoF/HsTw8mik7T2wQwl4NGAfw1zItz81RTs8/ckXmxJqDSl0N6zY+yB5XorFk/NbkaexOs3zzdFTANE694qZHk9LpwhYxWB2D2YfMsLJk+P53U6tF07voZ9ILX3HXdCkAbCVO1LZTaxIHZb70hUKxngV9TQjYiXFaOvA9JKkBgyHYNkR6Y4pHJ5q8hf8o5SJz5toxK68n5THNDm+kZeUXzA9LKODiN74hp+uXJf7fpEe7iB2Sf77A6UVheYb567WHjDPYiKAM5geMoB45X90tY36DXlW+SJ53sDSvjFIQjGW4txYPeHTnAJODzHdhfQ0OfSSCd9Sd1H6C1M7nNa+7YYh3H7sXszIVCaOzG9R+oR0MNTKiezN96R0ILVNU+xzKtGT1c1JgmkIZueJqe2C6uTB9m5tVo2KREciHVPonVGy8440xFI4kT3lYDYlX6TltrQ8C/+zHxOL3c1wEe0Ht0apH1GMtg7kaYFnzECq+ZZBPoAkPLWPR6HAmmjpAsdC0Kk+cbQU+3SSIgHrQP/vt/o03nlWz82J0xHt11n2+QnSiJBdAPoIw9nUyxfJqwenmdeQnHzuijhbfjndNTYWt4M8ExdnZ2uRzoUQ7NSTvzkbMxYYpBE7ZytGePNMpnbF5N2wAU4LVn5HvjAC34FRD0eA9DfMKDnw9ZunlT4KE+HksfDDP5y9kMSpJWOG3cnmLjKKRO6imW+nTI6CThJjCCsHp41OEjSs4gebUb8i+1DSeKhMY9GB1gZzf7KLVPrhbMD6sCdMY5dQLDL+jelBznsKfwb2tL542VWlnAzs15Aeb5vfmFuo5coP78K2JUv5g90C/QtTG+9eQnZEIcXIeAexd5AWWVpsb0Xelm7y9JJiJXcsi94u1vwLs5c2LHcBp3D8Bn0IhXJWl59IksE4Pa09YsR/Obva8oK9g9qJaQ6/YGqRFvk5+j2h7aL2QX6b8gumyFDlYjLq5Cklu2NYr2hoNwH74fn98o4T2fnh2YwjEJlt5OccJKH7chdp7/gL2UWZ0enMvR/O3tavSDVa2sHAPy9lpPbanMKLR84FN2RbuXT+LwCRdPxV8I7WnBfMXzY7kDp+cNDRnWlCrUGR47Q0vyGF8r+QWgZt9pEbLy9+suoOxxfTQqqMDnpyBEvkxr8x2rq+cXsl2dQkWaqLc+RBKLpx4VaO/YSWbcoGA/9CbR8ojvEYaFmxhqYE5Vwx+bdvT+QsuCG18sXkp5Ng4v2YgrpyiF1BdjAtX6jlJ6pnVK26yI7qX2h7+oI3Z658UZI9vfaBaBI6Ln3h9ugJo32cSbFSVSyOFS59oVFwZKUu8hNLqD+iUS01HihOcqD6YKLgMV3Pp3XUXkx6xeRvTqtSA+1dtmgvpxY72B0tp0gsMmNyvaIomRBbTG9SXDhUh4vT/ERPTRdM/urayqKfEA1dnN5FHmRQdoi+0MtBOUXigZKYgX1QUrn0itpjb+eiHY5fMfnpDDZfBHTyEJxxovSFabuKUzZtlhofEMnUxpy2pHdEjtj95DekEO7FDNplsi3Jn39wS8uvmHydBky06hm9+gVpts0Cy/44RBYnGqATpdEXpeES2Mo7sqNdX6iTS82zJlpR0huKk1oa3jC1V2e+NRFZgCkHxIQYu6CVZyW8o+k3LZZk2ZZk2VaO/YWIUeKkCn7cyxeZNU22Ry+SXzG5Jdv4F0qjST8ooxEYSwwZlL7Qyx/Q4ljZIR1IZvVUJ/9gCKUITRsiiHEpIbUTxaGHqGjK+ebR1o8StGl3hXimH7htCbeDSS8oUYJLF1RP2pNMVRr0I0aNi6Gg3dihZk7qlPFFLZramx89D4iE+XS2kE+0clwuopVj8awkf6ClWBpPtGyj+0SS4eKkBkTzYiC8+GfoBB2Ll10SWvkVJUWrlCB985SVEi5O+YnW8AvKqRKfUKsv0uIovnLy8sXkp1u5z15UEH/F7Ej9gumViHcXh7WjG4LZk9hXtGynOkhuw3FMiLFBcRCpSgTsF/U5TlOpG1WefJ1d1U4Uhxqm9Ab/o3fFMQN++CywF6llt4uTifPhEMx4Wv5Ga9ZeMfl4ivbkNshO+xslS0JWUXpAr/aFDEWxLdFhO1G2JVkBezCENHLSQXGsXy5OdDUQL1gGv6DI41GD6rF6X3In4D+IgLXxCYXYJb9oo7FS6ZFkH1w9B7uj5a0WmflFlOqL5MLtcJEaHxRn5WrQoklGt5yc+I5utZGhO2pqviI5XBzadbjQbAvDLdUaSK/o5UFx/oWiXz3ZPUmjbB9J0YZjFKQTSaoHJTWXiuKEAx8egtNO/LJDtNzKRMGascvkOnErviA1hZ8oDZd+ECFtKVzRVz356e2EvaCj469o5R77CdGEpwaqmF1o4iw/9BNTwmNOwE9kBkrrKPYVvfoV6U6PB5PSJC2XpOZJov3gkxjtxSNnIehFLYaf/wvA/kGQwN8q+cuoOCX87RCErQiE4/z1EoKR08WfQOkij75+7ipPa+rT9hmhCznzaaMraZs+vA3oixnG56+tzJN3LkhLlcWVmE1H1lJNjeUY+hOP9uIszL1UZ7Yrw9jPQlbTQR69vjXU1o4ekPLuoKd8sPvDcYxl0emGYA+8EiHGLbWGubVpAntQpgtOnrvCDz95yq1zLxhrT/SbQzA+pOUrHm8djbtHgHZgkbHqF5zLiPSNUawR2CUMoEwAABAASURBVNMnXTDzeJXgxbkEo3JqWRG+yK58M9dMXzm1E7c3r6EJluzj2Rv2iuxKLbNfyIWx01lDnsaZKW+YWynCUv/iVdGLPPyKkcNvSE/5557spi3C/81Z1VkwvyMw8yQnJ4/NlXn7sPL8Jrn4L6SWO7qPoSfcFu7G2jNIzCg3cG/0ZDTD0BujvPs5003MPGB6Tmdn8ysmr8j85PMN5Ll530MRxm9TfsGkeIxSYPrIuucH2dvGRfL2XTB3xZH4oLytSwhYRKS5hASjqdawPG3lbeSuIGKy7n7kTNDT0oS0ImLZi6cc8RGZybfkjiBTtJYVy9MTZwHrkuFbQcDoDcePnivSkN1I9LGbZPh/yPvz0QcyPPdmXzn3oUA3Dp9SVDh3ERkNZ88TR8t7aIrRnj62VA9+fPrC2VdriMAcwEt2CZxa+NXZSYHGrQVSB7l1SlRXgqNSy84ZfeI0UJy3pX7hLKp+YlZS547R4cnXe0/y7HvFuYNIOzG9P87eal/YnWgnZj78D8zb8XZlJ/m8PTP5livOYtpojx7elIClwEjnn5DdfBSxxROZxNjHOpLGR2SsxRM34d5mYPbH5w2oqx38jtzS+iLLW78hBEsbXbwZQmQzyefNzWgKZkew70jv6qRIVBhuzyNyS/XgVy8LOvcXpnY6O5ovZm84WAXEeBOfgnU3QpA29JL/juygOaOs5+1PPNp672nOPeBwcn4vFmDk2XblyU/vEH1YtV8e+VxBUn7DueO4e16diE5zsvmmcO5hdmx5epo2pPXiTEc+eorR1lmUe2HMNH4h92Wmn5U6PDPh8ey+4fZcZ5LjLMaok+dOCJYFo0FiXBA+S6kOh3JtDB6jUiNQY4K4Ol3DidwVdRcD6cdXHwhnPISU8Y48Iw0Yi2IZorcCfJCker+RJbxiODkJMX2Mka2FJAWnOzvaxZuw0SNAuvcLo8U7t7XwGZmdH846HkIbd26tGTri7ww91V8wtdN3B0t6XzFaLgRzT7WE4UjYlXMPSr8liEdpN/fcUV1cOX2sATKaNhABI3nko9OQBfH7cHe3Bz3fg4DRn9h+krWqaP9EerKz+8j/Rp7dnsFcBeU14WVZBecX4mIiOTUitHG0jQw3e0VmU2M47yKd/eVPNba1lkA9NzKECknEb3zfHEjvN7ImEiMB7h4hb4lQRBqc3TRhFU8kmfuRJ2eapaHl0A+G4FMkiZWQfLAZO1iMcTfvz45kH0yJzlh6H3HWptw5ek5kZ7/tC3PHqad2OLNT495oj5xa9SDdybkc49rwP7w7qZ+4O/IJLGDV7ICT0EWdPDqANNm8nRozxNXZG463/ohsqf6CyL10kY1ZD+NebEiSF2d3e05kNAtpP3elFg7O/wKQHuMx56+DSRa/ueZPlvqgOJawhmB6ghGDf/nRA2bs3HHl5NF9w1HEGV1UnQBKCbAHtHoPAaM+3B5M0U4+Lo5N/hem9uo7q8XLLkZkR8dBKUgkx5LoB8WxVgfFCQdUbCC9IDWjCP9Bi9NQ7H30xUQYLpGqJ603h2BKY1AETDeMgKdHOeSAPaj0SsThE8MlxNgFvfyC2YNXCeLCbc/cFSVKliXZiUFcguOSon7cy6+YfJ0dzU7MPIovmFr4idTgWYykw4XmCUTTFAt6+WKZpaI4JgOIDlxxBOWOlA7UqZNgSuFEknJQ+JEHr0tOHhGnlfgPO5qczVJ3uGj5ASNFf0L1dAXZM1qjX1Dk61r8VbbiIP4Xpna6lfvsRQVxUNFEvqgiu4WmnAOFoh436sNXWJA9mX1Fr75IzTZLjC41WAoG1CA9459FqUPpWc890UAXxbEmHUweh42eBGfkwq1yPaGl6ovk5cXJxPHJ1cziEDBl96DlyAgnktgWhgf/8O/ZcsniELDmQRRy48KtHJPdMJei2Ua2bC8CsoZ+o1YHxfHHLSvW0LRBikhaTP7mZ484EIxEbRfnhyNg4qGYgrpyiF1BdjAtX6hvrp5RtdVFdlT/QtvTVyQ/kbnkfkFJlEVZz2hZwo2/YWqW6JgdVvDgP2gUXHj7bhiS+mKb4Dc0zIgGxTEe8w+PenMvO3GTPoRa8E8/eiT7PmsfXD1fVFP1H2iJIcsXJC2/ID2VTqQ2I8pZWYN+QDThNBCTXVybv6Cj46A4rKBfCopju7ltKVa0bMOt/BP5B6Xh0olqVTlOwL8RqWbfK3Y4/oqMpUaLnpCyUnvAtOtSnLbEcbeWaInc+JhDSQ+UILFB5JBAMQne+wiYbOPiBHHhaFqEyU6sIku48eAf7q2d6Jk5dgXXtWjTgw+XbiiOJazhESXqrbygVwdzD0yLBTkLJLAcShr6b09j+m8YAX9cJg61xkHSWhkB02edk8IvaEnsxhYRIDYoy7Yky7Zy7G+Uoqw8ubToO9JkSbZlSbbVf6+4Pb5i8nVJjIoyScwa7hCZf+LcMcyrfmEoM9mhE8mqL5K3XkyQFCHp4sEpYBSEpybON6aGrBP1fi6zbJSeeDTcpgO3g2l9QOm6Qjlp/6DlEOIVfePDEpExMusdU3vzTKX2gEiYZeMyFzgRH0QgF+eba3XQ6mHF4gj2BUntBtlfmKloi1RFk3rQy0sINwKvHeILskOidqI44UIdVGpJT5RUrp7ISQatH5Qpm+gH1OqLtDiKr5y8/Amt3GdfMfm6vjE70CTZi/pGappj4HBS2WH6Qi9fpMd2mtClhNBHFCetgC4YOhzxICdGe/HIM0g3BCNRJOWEX/x/0f52/lTYhismXw/sXxjnL49pRsROnvzNt72Qnssu/kCJHHG8f8GkPpjt0Z+QMaxVApYmJke8c7Yh5C+2vY8weXQKGYn2gPzZtzvTFaflgU+FbSlT/+LszuNy52Da6G7bIj0YZfiUyUnowSaHsjy2nAq2hGrJYvLDkWaKBA3rzA2nRGzpjjRi+S1mDQRr44lJ8H5EpsmB+WaSGSSuHgkf1k2wRXZU/wup5T3dT/MN2RSOTEsiewEMTp76zec3T2zPvjKctrLk8Uzn6n8ii9r3hGwcS7GbEpAuHFYRROUZE0eDoid++LDGn9YV+iA6gpEOzK7miEFa+kPdMASnhfgPO5rmFzt3cU8V7rhjvoKZWgMjB85VjDR5RrbR3i0H0o3KjSTEyY/YTtRFZjDuTC8aBLtzhM/dIelbzCaK2Z6hX8zeqiQHMg+LsSVw+g9nd4uPSHf0m9NdvgjkiYFXbPEI7Gx6xeS/3q+JnMXgh7OgfJG8LU9IIc/NL/LBacz/HVen54OTsRk1feEfH/3DszNdH+wr+Y8qKn0Uck8cEUNfDcIdbAwHPpy58kVypohPfCpzq/T/ujHaeO+NFvqGqR2eW448ePATEbG+5MDsffVzkIQBjKTj/8K28tvMar5wBH6mJOFBVqWHZfOt8A6Ah04tNt3oIfidsw+N5Z3OrtbZkcpwMsTmQTopM3LR2VENpByjvnd2JoXlpEwSwymSDU8MDyKyJaxdTdBvSKV8Mfl63sr4FKKF/GAEPA/Pden5E1t8DseOvzC101nTPE/kDdD+YGDfDh7PSduFrsxvERE201+coVES6ag1zETThg8PXc9qVlDL+3Cy4Wl44enBp9oNZY+cNe14RQqxXEpjfxN4fyMwX9U8N9CDxDWNH0yN2f9mO3vMsLNzN6SnPEg1OWnf8Y2Uj1XfmDEemQ68X1IkYB8+WWKWZ+KCpFjEWQ/B7jwC3vsIGE9lH1oay5nub7tIdXr2JWmtVp4pEmz0O0dmSyJ6lpPO7m/OxtTx1ott5u5FIMtyzxUjn7zkCO2EXDH5i0c+F0Ewhnlo42C0N/+ZpZHv6OCB6Tk9e+kB+Hrix6oSsIpFAjbrorJz+E6H4/nB+htyzx0ZTZ3Z0cPxcgKWfe8+90xkjl3JZxfZD8/C6GDfArKcNoZrDUgv2EomGUxL+MfZjH7lULoT031Nq6U1yRWTn06C5febWcj5WPLOfuE0Ulmd7L9Yu7ubbvDDycoXyXNFf+NKCXxd9Bklhhf69GRbzmjo4vGLDTKFnnwcgiXfSq+Cg1VA7HZH7okziFGtNbxw9lHJErp4WziA9sxTG+89SacxK8J42kVIejQGr57u8L8wtXj2BG9+iC/Y3dROzHA4T+T7Yn10pPQU6TkwKTnQtk6V8xsdmCKLSovJqJOnlOwbj460NCdgveOOTCPkv2t9HgGjL2Jf05wuSOMvcgndPGHrzQjY6IyQx46OE3MZhdwP9K52V6crC5K/YYcS8PQAPCexazbAH4urp3Y40nVB5C8p9GiZPwDmL4JRD0x++iFeMbn5o6Kl+dNm0TIozqCXX1pUydKJkm51WeW6oqXyxeTr4ri5NgYv7s1f0cp99hWTr+sb2ZdecRadFKc1dvpIqQrtBdnR6itKooZdUFLW4djk4kAwtZbwIVK4ciL+4Sml94bMld+xUh6WBMQkAvZBWbYlWbYlWbYlWbaVYzlAPLAU/oDMpMv21Bft4TZ4c8mO9oISdVx6QWYlJVq6oTheJajk3HVHcagaaB0k3zZ9o52i0Bf1hGjVnShtfEd9jjc9cZPcm1Iw0g0R4DZ49ID2M/+Sv17n5Ys0m11CNa5yQ638I2BkRiKrpSccHE6tHJS08qJ/URKqpq+ZPnFr0mj+YLNyMlCc7iAPQmWH6Au9HJRTJB4oiRnYB2X+iXMg6ZoXD7BXeURq0W/OZPkLIu/lSluoWBMc7qVXNGWj+xeRTGXMekTk6hfMXfEMBG0LkxTEX7EdVJ8w2pd7+Yme2blMNnwdgpkBf1Cc1AFE+YYaLg1SxJTzwck8HURT/ri9+YmU6YopYctJH12c9ACtJ5QTMIW/uKuLY1wwcCwELiUg/YHWPP2Kpt/olmTZlmTZVo5tmcRO1OTSP9BTZ8aSbMuSbKv/rpg8noq354bRJMox0SrKJw/58GZIV/TyB7Q4VnZKB5JZPdWTr9skmN5QFFN7xaylJ5Ce4oRDHaapdpcksPUnRGv9CSVKTMZSl+DqWfrFLVM10aAWvSiGJt948BNnAqp2GP6Xpyt1cMw6ZmVmCV4XBSvHcoD4gyOI1un44QixbbBDaF20wz9Opj+W6d+nG2hbzH7YfSc1dMuKiVxJX1GaunrSlmTQ+sEUhX6iyfyoIGLUrAuSly8mP93KffaiFsvJy6+YHeEXTI9yVic1HvtB9lZ/RMu2CNiBEiQ2KA49VBVxUHMg2OSJJQ2wKyZ/8cgiYHrD1HCe0Za0xcubiGMd3PbyRV1RsPAnlCjGlNMuAqaIg04qe5AEIw9/cmnq0jtKsvTiXt3KsQ3HQSUDYbItyRpY1KKp4FBN/cLFoYZJBE8g+sNhJaDxIw9aOROVWlMCppwnjHY6CaY87EQSuA0KX7TJu3PQXoyGD1MmlPPImal+Q5TyxeTrWWZbGO6sBfVxaXLpBS1LuPEDk6+zeDPqZN4esBmIiTblBA8XBTtBshf1hEZ1mgYbDy6OUQCiAxfP2tItfPhFSHoUgn86lqd7AAAQAElEQVR5lqV+wxA8e4DDhk7U+TaTibPIrmavKNkmYCdKioT/IMK0WcE0BmHlRV1jO1Be0NHxV7S6n4CRf7icOcseJxFZxAtKSl2cA5PiMSfgH5zMMqpkPyFadVOXGiw9ojipAbIUuCNFTBEPVE4JSXDc6UHRYrnFIdQapjqp/sffKPtHxhsyUhGcv2zyZ8T8FTN/NrzgzGwNvb1Q/gza8YNTWt6FLSdUZ+f0sa3Cf8DMrANYZnIFl49lPToaOzH49kCw5dH+4WzJ++iamX5C2O4OPzx3sxzIFH700F/9jlRnZ2o4BNuek2d5tCsyOZdwB0mtYTn9ZCwjojcuZm/4F6aXrQPUYyef0VAcgqVxVkCS4PmdRh+tnEV/Iyvp4euImQuHTQrJt4RfcO/q3kse/utZwWz2tfeLz2rujo6T0ZaYTxm8Ropso9b4jOk5nZ3Nr5g8FwfZs2/jmu4jYBWR/oXsmS6S2cVW5qHRGW/GG06MFg7m92pzeQXGn7G9sySRMfqSZRY86kupV+QV38gcTby2d/0gtQx3X1vpWMyy6NNSMa349tDQ2g2plS8mj9PYXUde5Enf2D70Ijt67V+Y2q/zyGwGqJGRJALhl98IlSsitEbyN+67aMKY/JOzjTpX5IPov3PEWkLagu0lHHxem7h3UcuiKL/Ihgy2NeGbM4XcuQv2P5dwdk+evgiDREYav5D9mclnBRlpV5EabyHdmeUIc8fBmUjff/Hck74H5HqMXamRjV14dGa5te95RXryPppitLGDN4dQgmPlQRIsteO+IBWMuZDvoWiHX2rprpzAzoOTsqtGQI3AHPbCaaD4+YYLZ3f1E7OCnedvA09+ePYkvyH95YvJ/7Ozv71XTL7ed5HfkHvKF5Mfnl3JwU6B7QKH9/H9jydh5aQpg/ltSFNIWmTDG3IXQ8Q2n8gGjDmuI2ks0lYCYkiNxWZ7T3du3v98yP8Tsnz6srIbswo1PMCbKi9mb18NB9PcbPVvnt13z14m2Dl6+NW/atzRvr8wtXjekL3N2fmG6cH7dccMSDvPz/3jEIxGankDBPvisySjXMjcE0djipiWzdgZoXszXc588MXbm/HWdxf80Aezg830YEl4M8AdH85Q+SI524hwmtgATQwnTaVpA/uoJU1vkZ4z/66FX7y7Hvih89R8B2vnnvDUDsw9yf/C1B6chdjnbkgsj/8gu0Ny/yBZrWFfwgjZGDoJW5kkcm+rX5hdo6eNGSzatEGw8PHp+a6Vc1d7wPxOs7PDyIvUqgeReFUorOSCew/AMDoJl2D0M0V7dYTcFf/m0W7eFcy+4ta4bdYvzx3nDFr5YvJ4ZoI3z1PTd8Xkh39qjGPLycZ4RfaVUAviydjA51IPp2c4jywvUgepYSnD6Y9FuCCFS70F+B3zOyJi6L0jOPuJrBg+kbYR6SThvupFsiuSM4yt/sBzdzzLgtNC/6xmlvug+V1ao/EXqSISUx0/+CtmLxPZnZ5itMO/a+EXzy2ZA/NIKkBjF0w2kUIsX/SFbUUP5gGLKPkt0vx/xczE2ZZlbML6ziAem2IyPG8MRMTb+4LUuvsRc13mrpi94UHuoTzzcH63fBsqUgvFgxfTczgt1f7C1E6nu/kVk/9Hz718J937rnxH2AX5DK4gXjRmIuTbUDt7IrXqj8hU9RdE5kkYN9YaUAf7MuZzF5eOTnd58FKbXlqqp2N2dC5peov0LP7P8/dAolF1YjJx7Oj4iYh0xZRASandUFK55iRPViRgSsOJSSzbkj7u5uIYF+wBkbAUqUsJd27N2ie0JMvGhYPi2OSLQCq48NUl8hc/ZumwJNvqvwekKmScDkskMdy4lGBxCJhEwL6wCqUrevkDWhwr90ofJFXO6GTGsfLkp5NgSiEoQvJXZElqgS/0yVscZn2hl18w9+G2abZsXzBp+KJEXT1pSxKk46Mjlhct/6DR1hludqKm5gsm/w/OIGaxSsQsWAwz3MMbLRXFMRlAdAA/cZPsRNYHp2CDWAug3aDh5MKjnSipXPqg5tA6yR/xZzZDOLplCSRgVv4RZBuOnSgpEi5OZECD/sUUhX6iybzK4BERMZh1QfLyxeSnW7nXfkFFxx9QmZE0VXGSCT4ujvHYicyU/4XUbCZw+xuZRsMkAlVQcyCY1CAN3og0onTD9KwHUntAH7qlpovJ4zxHIikSMOngN5xBe5GaOH5FtWJxCJgyGkwStC2nHCSxLQwPXvzo+QtTi1vCThfHMC8CZTeeS6OeuF1pqg6nhkkEDMRSxzFIrcFysaEpQTlBUzXk6lDURAVT+kEpknJaJzmRBFMe9oWRJMQmlm3l2F+o5SemS8u+kNl23xClfDH5epbYFoY/oISOSy/IjKRES4t+R28P2Ax0ui2OlXfI0jummPqigiY64gOKY3SA6ABYAIcPazyEEzfpg+gI/uW0KPUbhuiU9bVSe0b2lhfZNVmipYOfiKToF6RWCfnASuGSmktFYtHin8uSjdPoyS7x6Fl0EP8LU8PFsS0MtxSD2JZtuJV/Iv+gNFySq5JI1px/IrvauWhnAl+0Nz+R7uZXTL4O3C/P/IqkuhRLy5OZzBLxcCd3WAPsQAkSG0QOybM+aJVrEYJJ5WiLv7wK1Ssmf3GWWpJtWZJtWZJtWZLtV6cgS7Iti3Oili9KF95O+F/orYPszHQhqsUhYDp48vX2bU5ZSgj/C1N7dXG6YPA7/eHuJvEQM1FMEn4iSTlIj/0PpCc2XVLw8LDJPTq7LMm2LMm2+u/E1QymEkzthtTKQUmUBdWgT5SpEYCNwyf+qtUjp/uGVMoXyXMXbbJDot+RAmIsOi48veJ8Y2rIOlHv53u2fHY78+HrthVJizZcgoKxk6tnKfXSRculfkBLDFmff6QY3JTIxizaRFTR1N5cVnt0RfLyxeS4aLQk9584yVRm5Vi0JPkDLcW20S6R/YLiUKMqmnSgciBYstO/uWZCOpBdzV9RUmpZ9IU2Iqb1UHHuaA2/oJwu4hNq9UVasBB0KSE8O4PlJOVFa/JFBS9+8BNZyYAl2Zal/+zi2J5+ECrbgO+IZluIsTuKkxKgN6TmLRbhCpeIloivnnLqN5QiKSf6H/6//J0wfa+YvxrmL4qH85fD9v6FqR2e5clPhGBPO3rVcQ/Yv2hmjjxw8BuyC3taN1MsxajvFAQbvoP5622qwd5DQ0onZ1P5iYynER/9yrMpPBWQXbTxR9grp6d6kCo5lmb6vjiUa2PUaxsosJINJDEI8M2nObXDaZptJGhYe4ojESudmNrpJFgfGsyuH4yA96OyhTyQ3gt+3lrxq7pPYEen/0JqeU//86L5hqxOGUhLoEhbMUJzksF5VeIvH/WIeWF2l6eZLwhn1Wd3dLz6EzIzlmI3JiCFdzPrrgilmphGuiY94rdw8BM36YMYCl49u8NP3B7g81Eh+K4i+8OOpsXL7nzV7KSGPpyvIu/1E64tvSflJM/YLZSvyH52jZL4cRrvFVqx3vmN7UXMvXEG6Yvw/ebZT5GW1K+8W9CvyHwoTjfxl1ck9L/bYHYPZAL/PIjh5dFI23tghxLwaMA+hrmQb39qinZ4+pMvNiXUGlLoblix90HyvBSLJ+e3Ik9jdZrnm6OnAKJ17hUzPZ6WThGwisHsHsw+ZISTJ8fzu51aL5zeQz+RWvqOu6BJA2Ar75h7Ug0WM8YMxqtyBQDBSor0HEjKWCJ9A8NpwL5EGiJeHWkGSKIDV/4gpePTQgP2eRsEC+8npbEJv12RF31jelhKB5F64xt+unJN70k/Oz+cnnKUWPI3ZJZyX/CNEdkUwFmQXjKAeOV/dLWN+g35tvJF8tzNUj4nhBsiNG2IQDMwTSTRcbItkL1xSocdLSdfIfdFe8Johz/2ROQVuypPjJKR4OFT5reo8IR0MNTKiezNwpQOpLZpivxmQOp4Vm+5OpVido6erGoCa8LHI2TFwQ7enQl4dgDd+YxsiKXxRDaWg9w4wy2GcQ35Ltss7D/6MbGYezJZRPtBitEo9R3FaOvAPIokNeDOP+JkieP5Oj6GiSuPEr5IioXMWgh25xHwPDOFIgHr7vy/B7krOPUyPoeh6ejuUdPx7LQys7UZhU8yu6n1UjZdkbz14C7p1MmZq75IPvUPR6qxufippPPi7GwtUr7qCaO9ebandiIEu+3M3lc/B0k6CI6VNcBB7LZ2OF+YhO/AqIcjQPobZpQcePntGUkRZ4o4PHk8QpCt+wXJ0rPI7mRzFxnNRO6aScrkKOgksQx/cNq6OyFtd6yCdEX2oWTRoWbNI5+GlI6WL6QB64OeMPfkI05kvPyCqUE/l5S8hFyS0uJlV5VyMjBf2dXkwfmNueWHZ1/0J+wWCn9hauO9h/D/KTkXXdmZ3FaT8/7vfM5HSnbb3fbaf2pLokhdqtwzQYCFIHNF3sHeCx8djRJL52cjj04bxp5wsrES0guWhdObJeVJ3jj3pYz3HpCRRO5nT7It9DeKFH4iSTl46WU4jOWHPvTvuL3HA74x90Q7MduYwbio1nvhn7fSUw5iHT2R34RaBkeHUys/MQ3Rg/dKWkaNDoNgxxMqXnnelHtO5Fs+fO5oDT1LZjZ6di8mxWOp/4lZTkN2AqycieHsa/2KdEVLGxjIU1D7LY9YkfDanMKLR84FNzx2LaYWh6b16vwBMH8eTOUF85fN/jkxdfzgoKN7Z0Ef3Gg4LapEfiJJ9b+QWgbtGfTBi600q+5wfDEFUmV00JMjWCI3/o3R1vWN2yvJpibJUl2cIw9C0Y0Lt3LsJ7RsUzYY+Bdq+0BxjMdAy4o1NCUo54rJv317ImfBDamVLyY/nQQT78cU1JVD7Aqyg2n5Qi0/UT2jatVFdlT/QtvTF7w5c+WLkuzptQ9Ek9Bx6Qu3R08Y7eNMipWqYnGscOkLjYIjq3XyExVCXdakV24kS40HipMcqD6YKHhM1/NpHbUXk14x+ZvTqtRAe5ct2supxQ52R8spEovMmFyvKEomxBbTmxQXDtXh4jQ/0VPTBZO/uray6CdEQxend5EHGZQdoi/0clBOkXigJGZgH5RULr2i9tjbuWiH41dMfjqDzRcBnTwEZ5wofWHaruKUTZulxgdEMrUxpy3pHZEjdj/5DSmEezGDdplsS/LnH9zS8ismX6cBE616Rq9+QZpts8CyPw6RxYkG6ERp9EVpuAS28o7saNcX6uRS86yJVpT0huKkloY3TO3VmW9NRBZgygExIcYuaOVZCe9o+k2LJVm2JVm2lWN/IWKUOKmCH/fyRWZNk+3Ri+RXTG7JNv6F0mjSD8poBMYSQwalL/TyB7Q4VnZIB5JZPdXJPxhCKULThghiXEpI7URx6CEqmnK+ebT1owRt2l0hnukHblvC7WDSC0qU4NIF1ZP2JFOVBv2IUeNiKGg3dqiZkzplfFGLpvbmR88DImE+nS3kE60cl4to5Vg8K8kfaCmWxhMt2+g+kWS4OKkB0bwY5MkcAwAAEABJREFUCC/+GTpBx+Jll4RWfkVJ0SolSN88ZaWEi1N+ojX8gnKqxCfU6ou0OIqvnLx8MfnpVu6zFxXEXzE7Ur9geiXi3cVh7eiGYPYk9hUt26kOkttwHBNibFAcRKoSAftFfY7TVOpGlSdfZ1e1E8Whhim9wf/oXXHMgB8+C+xFatnt4mTifDgEM56Wv9GatVdMPp6iPbkNstP+RsmSkFWUHtCrfSFDUWxLdNhOlG1JVsAeDCGNnHRQHOuXixNdDcQLlsEvKPJ41KB6rN6X3An4DyJgbXxCIXbJL9porFR6JNkHV8/B7mh5q0VmfhGl+iK5cDtcpMYHxVm5GrRoktEtJye+o1ttZOiOmpqvSA4Xh3YdLjTbwnBLtQbSK3p5UJx/oehXT3ZP0ijbR1K04RgF6USS6kFJzaWiOOHAh4fgtBO/7BAttzJRsGbsMrlO3IovSE3hJ0rDpR9ESFsKV/RVT356O2Ev6Oj4K1q5x35CNOGpgSpmF5o4yw/9xJTwmBPwE5mB0jqKfUWvfkW60+PBpDRJy5WT/AHbM4HqtSn5i0fODOhFLZ7c0kqDBwfn/wegcvZPhPzVsn+q/AtTw/m7Z1v5s2ixfxXNmnVa0OkqX+TPj9Vv2AbWLFJj8JdHp4VN1NqREHU538FyDE5XeiHYF0/txdmW76A6M10ZxlUsYiUd5NHrW0Nt7egBKe8OesoHuz8cx1gWnW4I9sArEWLcUmuYW5smsAdluuDkuSv88JOn3Dr3grH2RL85BONDWr7i8dbRuHsEaAcWGat+wbmMSN8YxRqBPX3SBTOPVwlenEswKqeWFeGL7Mo3c830lVM7cXvzGppgyT6evWGvyK7UMvuFXBg7nTXkaZyZ8oa5lSIs9S9eFb3Iw68YOfyG9JR/7slu2iL835xVnQXzOwIzT3Jy8thcmbcPK89vkov/Qmq5o/sYesJt4W6sPYPEjHID90ZPRjMMvTHKu58z3cTMA6bndHY2v2LyisxPPt9Anpv3PRRh/DblF0yKxygFpo+se36QvW1cJG/fBXNXHIkPytu6hIBFRJpLSDCaag3L01beRu4KIibr7kfOBD0tTUgrIpa9eMoRH5GZfEvuCDJFa1mxPD1xFrAuGb4VBIzecPzouSIN2Y1EH7tJhv+HvD8ffSDDc2/2lXMfCnTj8ClFhXMXkdFw9jxxtLyHphjt6WNL9eDHpy+cfbWGCMwBvGSXwKmFX52dFGjcWiB1kFunRHUlOCq17JzRJ04DxXlb6hfOouonZiV17hgdnny99yTPvlecO4i0E9P74+yt9oXdiXZi5sP/wLwdb1d2ks/bM5NvueIspo326OFNCVgKjHT+CdnNRxFbPJFJjH2sI2l8RMZaPHET7m0GZn983oC62sHvyC2tL7K89RtCsLTRxZshRDaTfN7cjKZgdgT7jvSuTopEheH2PCK3VA9+9bKgc39haqezo/li9oaDVUCMN/EpWHcjBGlDL/nvyA6aM8p63v7Eo633nubcAw4n5/diAUaebVee/PQO0YdV++WRzxUk5TecO46759WJ6DQnm28K5x5mx5anp2lDWi/OdOSjpxhtnUW5F8ZM4xdyX2b6WanDMxMez+4bbs91JjnOYow6ee6EYFkwGiTGBeGzlOpwKNfG4DEqNQI1Joir0zWcyF1RdzGQfnz1gXDGQ0gZ78gz0oCxKJYheivAB0mq9xtZwiuGk5MQ08cY2VpIUnC6s6NdvAkbPQKke78wWrxzWwufkdn54azjIbRx59aaoSP+ztBT/QVTO313sKT3FaPlQjD3VEsYjoRdOfeg9FuCeJR2c88d2Zs646PDyf/f/1MoK0KiDeZNtFMbTsPm4XiKe0drF95ZVjEwsX1NGzKdmX9i5vDu+ydyW3sGcxE0r8pVUH4ZLiSWF0edHuJoGxlu9opzD2X20ZndNz+0X+QqLDpOxgIiOcuIWQzncURWklS94xQyip6REfpboRSRBplnd5q/ebR4ykGuzLJCObs+GIKzlyaSWAnJB5vNQtq4O9vgybJrMCU6Y9SmJeSqz9qUO0f5RAb6LV+Y3aee2uHMTo390R45tepBupNzOca14X94d1I/cXfkE1jAqtkBJ6GLOnl0AGmyeTs1Zoirszccb/0R2VL9BZF76SIbsx7GvdiQJC/O7vacyGgW0n7uSi18MeV4KB8SYwXd9Jz/PwCVPxGKM3+ylE4Uhz8VYhIBU2pBEbDAq6eQHjBj544rJ4/uG44izuii6gRQSoA9oNV7CBj14fZginbycXFs8r8wtVffWS1edjEiOzoOSkEiOZZEPyiOtTooTjigYgPpBakZRfgPWpyGYu+jLybCcIlUPWm9OQRTGoMiYLphBDw9yiEH7EGlVyIOnxguIcYu6OUXzB68ShAXbnvmrihRsizJTgziEhyXFPXjXn7F5OvsaHZi5lF8wdTCT6QGz2IkHS40TyCapljQyxfLLBXFMRlAdOCKIyh3pHSgTp0EUwonkpSDwo88eF1y8og4rcR/2NHkbJa6w0XLDxgp+hOqpyvIntEa/YIiX9fir7IVB/G/MLXTrdxnLyqIg4om8kUV2S005RwoFPW4UR++woLsyewrevVFarZZYnSpwVIwoAbpGf8sSh1Kz3ruiQa6KI416WDyOGz0JDgjF26V6wktVV8kLy9OJo5PrmYWh4ApuwctR0Y4kcS2MDz4h3/PlksWh4A1D6KQGxdu5ZjshrkUzTayZXsRkDX0G7U6KI4/blmxhqYNUkTSYvI3P3vEgWAkars4PxwBEw/FFNSVQ+wKsoNp+UJ9c/WMqq0usqP6F9qeviL5icwl9wtKoizKekbLEm78DVOzRMfssIIH/0Gj4MLbd8OQ1BfbBL+hYUY0KI7xmH941Jt72Ymb9CHUgn/60SPZ91n74Or5opqq/0BLDFm+IGn5BempdCK1GVHOyhr0A6IJp4GY7OLa/AUdHQfFYQX9UlAc281tS7GiZRtu5Z/IPygNl05Uqupxo1DUc/ASgn0og3YQf8UOqQvTQ6uuKE40QF+YNl3EKSeOu7VES+TGxxxKeqAEiQ0ihwSKSfDeR8BkGxcniAtH0yJMdmIVWcKNB/9wb+1Ez8yxK7iuRZsefLh0Q3EsYQ2PKFFv5QW9Oph7YFosyFkggeVQ0tB/exrTf8MI+OMycag1DpLWygiYPuucFH5BS2I3togAsUFZtiVZtpVjf6MUZeXJpUXfkSZLsi1Lsq3+e8Xt8RWTr0tiVJRJYtZwh8j8E+eOYV71C0OZyQ6dSFZ9kbz1YoKkCEkXD04BoyA8NXG+MTVknaj3c5llo/TEo+E2HbgdTOsDStcVykn7By2HEK/oGx+WiIyRWe+Y2ptnKrUHRMIsG5e5wIn4IAK5ON9cq4NWDysWR7AvSGo3yP7CTEVbpCqa1INeXkK4EXjtEF+QHRK1E8UJF+qgUkt6oqRy9UROMmj9oEzZRD+gVl+kxVF85eTlT2jlPvuKydf1jdmBJsle1DdS0xwDh5PKDtMXevkiPbbThC4lhD6iOGkFdMHQ4YgHOTHai0eeQbohGIkiKSf8T6eIiQdj+h9/CswYzp8DicOTrwf658MUIVh7rpj8zXeskJ7Lrv5FMnydv0nSlthG1DekDWuVgP08ieEYOvtoyF9sex9h8ugUsifaA+ZPpek4nJbuvPMwrmnlAdld9cTZUspMkYDRxpumTE7CamxyKO2x5VSwJVRLFpMfjjRTJGhYZ244JWJLd6QRy28xayBYG09MgvcjMk0O5HcGsOWzYGM3UPtCdrT7L6SW93Q/zTdkYzgyLYnsBzA4eeo3n988sT287kDayqa2aiDqX0gtT6Std96wJO9I0wumZ50unjEx3RDsmyMd9l3qQyheMT3hwdzTHBKkdR5NcnLyGC2Bv/1oyq9G57GDe6rA75ivYqbWwPUHMo8xQqQPOcmds636BWmCcSMJcfIjsqfaIrMYd6YXDYLdOcLnzpD0LbIrzdn+jNnbKsmBzMNibAmc/sM/F0/PjdMdfnPayheBPDHwii0egZ1Nr5j81/s1kbMY/HAWlC+St+UJKeS5+UU+OI35n+Pq9HxwMjajpi/846N/eHam64N9Jf9RRaWPQu6JI2Loq0G4g43hwIczV75IzhTxiU9lbk09/OO9N7dEesPUDs8tRx48+ImIWG7KumKTiE9+DpJQx0hmLMkfvCV+m1nPF47Az5QkPMiq9LBrvhXeAfDQqcWmGz0Ev3P2obG809nVOjtSGU6G2DxIJ2VGLjo7qoGUY9T3zs6ksJyUSWI4RbLhieFBRLaEtasJ+g2plC8mX89bGZ9CtJAfjIDn4bkuPX9ii8/h2PEXpnY6a5rnibwB2h8M7NvB4zlpu9CV+S0iwmb6izM0SiIdtYaZaNrw4aHrWc0KankfTjY8DS88PfhUu6HskbOmHa9IIZZLaexvAu9vBOarmucGepC4pvGDqTH732xnjxl2du6G9JQHqSYn7Tu+kfKx6hszxiPTgfdLigTswydLzPJMXJAUizjrIdidR8B7HwHjqexDS2M50/1tF6lOz74krdXKM0WCjX7nyGxJRM9y0tn9zdmYOt56sc3cvQhkWe65YuSTlxyhnZArJn/xyOciCMYwD20cjPbmP7M08h0dPDA9p2cvPQBfT/xYVQJWsUjAZl1Udg7f6XA8P1h/Q+65I6OpMzt6OF5OwLLv3eeeicyxK/nsIvvhWRgd7FtAltPGcK0B6QVbySSDaQn/OJvRrxxKd2K6r2m1tCa5YvLTSbD8fjMLOR9L3tkvnEYqq5P9F2t3d9MNfjhZ+SJ5ruhvXCmBr4s+o8TwQp+ebMsZDV08frFBptCTj0Ow5FvpVXCwCojd7sg9cQYxqrWGF84+KllCF28LB9CeeWrjvSfpNGZFGE+7CEmPxuDV0x3+F6YWz57gzQ/xBbub2okZDueJfF+sj46UniI9ByYlB9rWqXJ+owNTZFFpMRl18pSSfePRkZbmBKx33JFphPx3rc8jYPRF7Gua0wVp/EUuoZsnbL0ZARudEfLY0XFiLqOQ+4He1e7qdGVB8jfsUAKeHoDnJHbNBvhjcfXUDke6Loj8JYVeW5qnr07A+JBY/gCYPwdm5IrJrfxT/kwoS6BlUJxBL6ekppZ+UNKtLqtcV7RUvph8XRw318bgxb35K1q5z75i8nV9I/vSK86ik+K0xk4fKVWhvSA7Wn1FSdSwC0rKOhybXBwIptYSPkQKV07EPzyl9N6QufI7VsrDkoCYRMA+KMu2JMu2JMu2JMu2ciwHiAeWwh+QmXTZnvqiPdwGby7Z0V5Qoo5LL8ispERLNxTHqwSVnLvuKA5VA62D5NumX0xR6Isa9A0tlTtR2viO+hxveuImfQi1YKQbIsBtkBYt2s/8S9Z2LfqONDs7UY2r3PogqSxkEUNkk5kUVDH5uqSVF/2LklA1fc30iVuTRvMHm5WTgeJ0B3kQKjtEX+jloJwi8UgJ5fkAABAASURBVEBJzMA+KPNPnANJ17x4gL3KI1KLfnMmy18QeS9X2kLFmuBwL72iKRvdv4hkKmPWIyJXv2DuimcgaFuYpCD+iu2g+oTRvtzLT/TMzmWy4esQzAz4g+KkDiDKN9RwaZAippwPTubpIJryx+3NT6RMV0wJW0766OKkB2g9oZyAKfzFXV0c44KBYyFwKQHpD7Tm6Vc0/Ua3JMu2JMu2cmzLJHaiJpf+gZ46M5ZkW5ZkW/13xeTxVLw9N4wmUY6JVlE+eciHN0O6opc/oMWxslM6kMzqqZ583SbB9IaimNorZi09gfQUJxzqME21uySBrT8hWutPKFFiMpa6BFfP0i9umaqJBrXoRTE0+caDnzgTULXD8L88XamDY9YxKzNL8LooWDmWA8QfHEG0TscPR4htgx1C66Id/nEy/bFM/z7dQNti9sPuO6mhW1ZM5Er6itLU1ZO2JIPWD6Yo9BNN5kcFEaNmXZC8fDH56Vbusxe1WE5efsXsCL9gepSzOqnx2A+yt/ojWrZFwA6UILFBceihqoiDmgPBJk8saYBdMfmLRxYB0xumhvOMtqQtXt5EHOvgtpcv6oqChT+hRDGmnHYRMEUcdFLZgyQYefiTS1OX3lGSpRf36laObTgOKhkIk21J1sCiFk0Fh2rqFy4ONUwieALRHw4rAY0fedDKmajUmhIw5TxhtNNJMOVhJ5LAbVD4ok3enYP2YjR8mDKhnEfOTPUbopQvJl/PMtvCcGctqI9Lk0svaFnCjR+YfJ3Fm1En8/aAzUBMtCkneLgo2AmSvagnNKrTNNh4cHGMAhAduHjWlm7hwy9C0qMQ/MuzLPUbhuDZAxw2dKLOt5lMnEV2NXtFyTYBO1FSJPwHEabNCqYxCCsv6hrbgfKCjo6/otX9BIz8w+XMWfY4icgiXlBS6uIcmBSPOQH/4GSWUSX7CdGqm7rUYOkRxUkN0CMiWlKKpEXllJAEx50eFC2WWxxCrWGqkypkn6pB3/B/85dN/iSYv2LmT4UX5O+b/IFya+jthfZPh+DBKdGHoaU2nOlwdk5feIT/gJlZB7DMsJ9sLdckBbfGpdgXT+0fzpa8j66ZFfewqC89MFoccXrpyVy1Tu4seWcG2xW+ThM2teyBxGiL1mXLKxFiufQb6ef+NCebKn1o3fuA6W1f2qjHTh7tdBIs/TybFkgSvLu/kUXVX5EV1Pg6YnaFwyaFzBf0PuTi3tG9lzz817OCHdnX3i/OTmTujo6TDd+Z8KtTpMIzGp8xPaezs/kVk+fiIHv2bVzTfQSsItK/kD3TRTK72Mo8NDrjzXjDidHCwfxebS6vwPgztneWJDJGX7LMgkd9KfWKvOIbmaOJ1/auH6SW4e5rKx2LWRZ9WiqmFd8eGlq7IbXyxeRxGrvryIs86Rvbh15kR6/9C1P7dR6ZzQA1MpJEIPzyG6FyRYTWSP7GfRdNGJN/crZR54p8EP13jlhLSFuwvYSDz2sT9y5qWRTlF9mQwbYmfHOmkDt3wf7nEs7uydMXYZDISOMXsj8z+awgI+0qUuMtpDuzHGHuODgT6fsvnnvS94Bcj7ErNbKxC4/OLLf2Pa9IT95HU4w2dvDmEEpwrDxIgqV23BekgjEX8j0U7fBLLd2VE9h5cFJ21QioEZjDXjgNFD/fcOHsrn5iVrDz/G3gyQ/PnuQ3pL98Mfl/dva394rJ1/su8htyT/li8sOzKznYKbBd4PA+vv/xJKycNGUwvw1pCkmLbHhD7mKI2OYT2YAxx3UkjUXaSkAMqbHYbO/pzs37nw/5f0KWT19WdmNWoYYHeFPlxeztq+Fgmput/s2z++7ZywQ7Rw+/+leNO9r3F6YWzxuytzk73zA9eL/umAFp5/m5fxyC0Ugtb4BgX3yWZJQLmXviaEwR07IZOyN0b6bLmQ++eHsz3vrugh/6YHawmR4sCW8GuOPDGSpfJGcbEU4TG6CJ4aSpNG1gH7Wk6S3Sc+bftfCLd9cDP3Semu9g7dwTntqBuSf5X5jag7MQ+9wNieXxH2R3SO4fJKs17EsYIRtDJ2Erk0TubfULs2v0tDGDRZs2CBY+Pj3ftXLuag+Y32l2dhh5kVr1IBKvCoWVXHDvARhGJ+ESjH6maK+OkLvi3zzazbuC2VfcGrfN+uW545xBK19MHs9M8OZ5avqumPzwT41xbDnZGK/IvhJqQTwZG/hc6uH0DOeR5RekhqU8/f9PP4hwqbMzA1+e33GbWM4LUifrLDj1dsAW6WEbhP6o5ShXJM+OzpM/YbQ4n0Yru7qCwE5G0HoF5a0lowybWjmMZmLY+MFfMXuZyK70FKMd/l0Lv3huyRyYh1ABGrtgsokUYvmiL2wrejAPWESZ34R57sjQf+XpjbMty9iEsWM4eeyLDE3E2/uC1Lr7EXNd5q7IZZHwmQvPN4H8bvkmGKU2FA9eTM/htFT7C1M7ne7mV0z+Hz338p1077vmu1j54XxGOPDRmDk4E9VPpJZvRsSYvHGmyl8QmSdhmevGBNQrJ6eD5aMnP5zdHQDzTZUTGDk5tUonzprQ7PzFDDNN4X+26cZPhCr8gqkh6URq5WAs+YkQTCJgg0ks25I+7ubiGBfsAZGwFKlLCXduzdontCTLxoWD4tjki0AquPDVJfIXP2bpsCTb6r8HpCpknA5LJDHcuJRgcQiYRMC+sAqlK3r5A1ocK/dKHyRVzuhkxrHy5KeTYEohKELyV2RJaoEv9MlbHGZ9oZdfMPfhtmm2bF8wafiiRF09aUsSpOOjI5YXLf+g0dYZbnaipuYLJv8PziBmsUrELFgMM9zDGy0VxTEZQHQAP3GT7ETWB6dgg1gLoN2g4eTCo50oqVz6oObQOskf8Wc2Qzi6ZQkkYFb+EWQbjp0oKRIuTmRAg/7FFIV+osm8yuARETGYdUHy8sXkp1u5135BRccfUJmRNFVxkgk+Lo7x2InMlP+F1GwmcPsbmUbDJAJVUHMgmNQgDd6INKJ0w/SsB1J7QB+6paaLyeM8RyIpEjDp4DecQXuRmjh+RbVicQiYMhpMErQtpxwksS0MD1786PkLU4tbwk4XxzAvAmU3nkujnrhdaaoOp4ZJBAzEUscxSK3BcrGhKUE5QVM15OpQ1EQFU/pBKZJyWic5kQRTHvaFkSTEJpZt5dhfqOUnpkvLvpDZdt8QpXwx+XqW2BaGP6CEjksvyIykREuLfkdvD9gMdLotjpV3yNI7ppj6ooImOuIDimN0gOgAWACHD2s8hBM36YPoCP7ltCj1G4bolPW1UntG9pYX2TVZoqWDn4ik6BekVgn5wErhkppLRWLR4p/Lko3T6Mku8ehZdBD/C1PDxbEtDLcUg9iWbbiVfyL/oDRcOlGSNWdQ75xdylm0M4Ev2pufSHPzKyZfB+6XZX5FUl2KpeXJTGaJeLiTO6wBdqAEiQ0ih+RZH7TKtQjBpHK0xV9eheoVk784Sy3JtizJtizJtizJ9qtTkCXZlsU5UcsXpQtvJ/wv9NZBdma6ENXiEDAdPPl6+zanLCWE/4Wpvbo4XTD4nf5wd5N4iJkoJgk/kaQcpMf+B9ITmy4peHjY5B6dXZZkW5ZkW/134moGUwmmdkNq5aAkyoJq0CfK1AjAxuETf9XqkdN9Qyrli+S5izbZIdHvSAExFh0Xnl5xvjE1ZJ2o9/M9Wz67nfnwdduKpEUbLkHB2MnVs5R66aLlUj+gJYaszz9SDG5KZGMWbSKqaGpvLqs9uiJ5+WJyXDRakvtPnGQqs3IsWpL8gZZi22iXyH5BcahRFU06UDkQLNnp31wzIR3IruavKCm1LPpCGxHTeqg4d7SGX1BOF/EJtfoiLVgIupQQnp3BcpLyojX5ooIXP/iJrGTAkmzL0n92cWxPPwiVbcB3RLMtxNgdxUkJ0BtS8xaLcIVLREvEV0859RtKkZQT/S9PY+o3jGDZ1v/yF8L+hTF/Qozzx8HyvzC1w8VJDmT8r1n+4EhXmsf5GyQ8Fp7JB0TCUnxZz5Y0sDyQ7yGlf3Wm8tdbGKV2FJNFn9tTZSS9CK2BsSMPDv/0lvcyZm9IT3mQLnIsTdz9xaFcG6Ne20CBS9lAEoMA33yaUzucptlGgoa1pzgSsdKJqZ1OgvWhwez6wQh4PypbyAPpveDnrRW/qvsEdnT6L6SW9/Q/L5pvyOqUgbQEirQVIzQnGZxXJf7yUY+YF2Z3eZr5gnBWfXZHx6s/ITNjKXZjAlJ4N7PuilCqiWmka9IjfgsHP3GTPoih4NWzO/zE7QE+HxWC7yqyP+xoWrzszlfNTmrow/kq8l4/4drSe1JO8ozdQvmK7GfXKIkfp/FeoRXrnd/YXsTcG2eQvgjfb579FGlJ/cq7Bf2KzIfidBN/eUVC/7sNZvdAJvDPgxheHo20vQd2KAGPBuxjmAv59qemaIenP/liU0KtIYXuhhV7HyTPS7F4cn4r8jRWp3m+OXoKIFrnXjHT42npFAGrGMzuwexDRjh5cjy/26n1wuk99BOppe+4C5o0ALbyjrkn1RMzxgzGq3KFlFr4ifSUg7HkP4iIZUdKd0zh8FSTv+AfpUz0gek53wbBokfqvU347Yoo38j3ZxcdgWX0lX3jpyvX9J70sfPD6SlHiSV/Q2Yp985vjMimAM6C9JIBxCv/o6tt1G/IN5UvkudulvI5IdwQoWlDBJqBaSKJjpNtgeyNUzrsaDn5Crkv2hNGO/yxJyKv2FV5YpSMBA+fMr9FhSekg6FWTmRvFqZ0ILVNU+Q3A1LHs3rL1akUs3P0ZFUTWBM+HiErDnbw7kzAswPozmdkQyyNJ7KxHOTGGW4xjGvId9lmYf/Rj4nF3JPJItoPUoxGqe8oRlsH5lEkqQF3/hEnSxzP1/ExTFx5lPBFUixk1kKwO4+A55kpFAlYd+d/H+Su4NTL+ByGpqO7R03Hs9PKzNZmFD7J7KbWS9l0RfLWg7ukUydnrvoi+dQ/HKnG5uKnks6Ls7O1SPmqJ4z25tme2okQ7LYze1/9HCTpIDhW1gAHsdva4XxhEr4Dox6OAOlvmFFy4OW3ZyRFnCni8OTxCEG27hckS88iu5PNXWQ0E7lrJimTo6CTxDL8wWnr7oS03bEK0hXZh5JFh5o1j3waUjpavpAGrA96wtyTjziR8fILpgb9XFLyEnJJSouXXVXKycB8ZVeTB+c35pYfnn3Rn7BbKPyFqY33HsJckXew98JHR6PE0vnZyKPThrEnnGyshPSCZeH0Zkl5kjfOfSnjvQdkJJH72ZNsC/2NIoWfSFIOXnoZDmP5oQ/9O27v8YBvzD3RTsw2ZjAuqvVe+Oet9JSDWEdP5DehlsHR4dTKT0xD9OC9kpZRo8Mg2PGEileeN+WeE/mWD587WkPPkpmNnt2LSfFY6n9iltOQnQArZ2I4+1q/Il3R0gYG8hTUfssjViS8Nqfw4pFzwQ2PXYupxaFpvXlIawSsj+TdwXzj//gzIGP+OH8VlOCgi+KMuOioAAAQAElEQVRYkw4mj9MyOvLJSar/hdQyaM+gD15spVl1h+OLKZAqo4OeHMESufFvjLaub9xeSTY1SZbq4hx5EIpuXLiVYz+hZZuywcC/UNsHimM8BlpWrKEpQTlXTP7t2xM5C25IrXwx+ekkmHg/pqCuHGJXkB1Myxdq+YnqGVWrLrKj+hfanr7gzZkrX5RkT699IJqEjktfuD16wmgfZ1KsVBWLY4VLX2gUHFmtk5+oEOqPaFRrqpaWBdVjlCROwEGM5GMHP3GTPoC24F9Oi1IH7fusvZxa7GB3tJwisciMyfWKomRCbDG9SXHhUB0uTvMTPTVdMPmrayuLfkI0dHF6F3mQQdkh+kIvB+UUiQdKYgb2QUnl0itqj72di3Y4fsXkpzPYfBHQyUNwxonSF6btKk7ZtFlqfEAkUxtz2pLeETli95PfkEK4FzNol8m2JH/+wS0tv2LydRow0apn9OoXpNk2Cyz74xBZnGiATpRGX5SGS2Ar78iOdn2hTi41z5poRUlvKE5qaXjD1F6d+dZEZAGmHBATYuyCVp6V8I6m37RYkmVbkmVbOfYXIkaJkyr4cS9fZNY02R69SH7F5JZs418ojSb9oIxGYCwxZFD6Qi9/QItjZYd0IJnVU538gyGUIjRtiCDGpYTUThSHHqKiKeebR1s/StCm3RXimX7gtiXcDia9oEQJLl1QPWlPMlVp0I8YNS6GgnZjh5o5qVPGF7Voam9+9DwgEubT2UI+0cpxuYhWjsWzkvyBlmJpPNGyje4TSYaLkxoQzYuB8OKfoRN0LF52SWjlV5QUrVKC9M1TVkq4OOUnWsMvKKdKfEKtvkiLo/jKycsXk59u5T57UUH8FbMj9QumVyLeXRzWjm4IZk9iX9GyneoguQ3HMSHGBsVBpCoRsF/U5zhNpW5UefJ1dlU7URxqmNIb/I/eFccM+OGzwF6klt0uTibOh0Mw42n5G61Ze8Xk4ynak9sgO+1vlCwJWUXpAb3aFzIUxbZEh+1E2ZZkBezBENLISQfFsX65ONHVQLxgGfyCIo9HDarH6n3JnYD/IALWxicUYpf8oo3GSqVHkn1w9Rzsjpa3WmTmF1GqL5ILt8NFanxQnJWrQYsmGd1ycuI7utVGhu6oqfmK5HBxaNfhQrMtDLdUayC9opcHxfkXin71ZPckjbJ9JEUbjlGQTiSpHpTUXCqKEw58eAhOO/HLDtFyKxMFa8Yuk+vErfiC1BR+ojRc+kGEtKVwRV/15Ke3E/aCjo6/opV77CdEE54aqGJ2oYmz/NBPTAmPOQE/kRkoraPYV/TqV6Q7PR5MSpO0XDnJX/G3qBmWnrDthFqDlL6mDaUrNZ83kVIWBCspyrItybJ9+b8A3L8K8idQ/jjInwrh/N2TXHh4YDB/VIzTErEjCeUUfpG56ovkDDLyxaMj5d7sCK5EbybmLa0RMHS6MgPBlkd7cRbmL59Up7crw9jPAlbRQR69vjXU1o4ekPLuoKd8sPvDcYxl0emGYA+8EiHGLbWGubVpAntQpgtOnrvCDz95yq1zLxhrT/SbQzA+pOUrHm8djbtHgHZgkbHqF5zLiPSNUawR2NMnXTDzeJXgxbkEo3JqWRG+yK58M9dMXzm1E7c3r6EJluzj2Rv2iuxKLbNfyIWx01lDnsaZKW+YWynCUv/iVdGLPPyKkcNvSE/5557spi3C/81Z1VkwvyMw8yQnJ4/NlXn7sPL8Jrn4L6SWO7qPoSfcFu7G2jNIzCg3cG/0ZDTD0BujvPs5003MPGB6Tmdn8ysmr8j85PMN5Ll530MRxm9TfsGkeIxSYPrIuucH2dvGRfL2XTB3xZH4oLytSwhYRKS5hASjqdawPG3lbeSuIGKy7n7kTNDT0oS0ImLZi6cc8RGZybfkjiBTtJYVy9MTZwHrkuFbQcDoDcePnivSkN1I9LGbZPh/yPvz0QcyPPdmXzn3oUA3Dp9SVDh3ERkNZ88TR8t7aIrRnj62VA9+fPrC2VdriMAcwEt2CZxa+NXZSYHGrQVSB7l1SlRXgqNSy84ZfeI0UJy3pX7hLKp+YlZS547R4cnXe0/y7HvFuYNIOzG9P87eal/YnWgnZj78D8zb8XZlJ/m8PTP5livOYtpojx7elIClwEjnn5DdfBSxxROZxNjHOpLGR2SsxRM34d5mYPbH5w2oqx38jtzS+iLLW78hBEsbXbwZQmQzyefNzWgKZkew70jv6qRIVBhuzyNyS/XgVy8LOvcXpnY6O5ovZm84WAXEeBOfgnU3QpA29JL/juygOaOs5+1PPNp672nOPeBwcn4vFmDk2XblyU/vEH1YtV8e+VxBUn7DueO4e16diE5zsvmmcO5hdmx5epo2pPXiTEc+eorR1lmUe2HMNH4h92Wmn5U6PDPh8ey+4fZcZ5LjLMaok+dOCJYFo0FiXBA+S6kOh3JtDB6jUiNQY4K4Ol3DidwVdRcD6cdXHwhnPISU8Y48Iw0Yi2IZorcCfJCker+RJbxiODkJMX2Mka2FJAWnOzvaxZuw0SNAuvcLo8U7t7XwGZmdH846HkIbd26tGTri7ww91V8wtdN3B0t6XzFaLgRzT7WE4UjYlXMPSr8liEdpN/fckb2pMz46nHzbWBESbfD//b//lzZ8OA2bh+PsqvaA+R42YenL2CBCrYyL/4n05I7uI/8b5x7aGOlmEI0boyUL5vc5MTXen+7qzTejqdkrsjE1hvMu0rmv/KnGttYSqOcuhlAhifiN87j0BJ6QNSkxEuDuEfKWCEWkwdlNE1bxRJK5H3lyplkaWg79YAg+RZJYCckHm7GDxRh38/7sSPbBlOiMpfcRZ23KnaPnRHb2274wd5x6aoczOzXujfbIqVUP0p2cyzGuDf/Du5P6ibsjn8ACVs0OOAld1MmjA0iTzdupMUNcnb3heOuPyJbqL4jcSxfZmPUw7sWGJHlxdrfnREazkPZzV2rhiynHQ/mQGCvopifk9i00li/+T84FBEwhQf4ymPTDpfLWpFseEh3MWIvfnFp033AUcUYXVSeAUgLsAa3eQ8CoD7cHU7STj4tjk/+Fqb36zmrxsosR2dFxUAoSybEk+kFxrNVBccIBFRtIL0jNKMJ/0OI0FHsffTERhkuk6knrzSGY0hgUAdMNI+DpUQ45YA8qvRJx+MRwCTF2QS+/YPbgVYK4cNszd0WJkmVJdmIQl+C4pKgf9/IrJl9nR7MTM4/iC6YWfiI1eBYj6XCheQLRNMWCXr5YZqkojskAogNXHEG5I6UDdeokmFI4kaQcFH7kweuSk0fEaSX+w44mZ7PUHS5afsBI0Z9QPV1B9ozW6BcU+boWf5WtOIj/hamdbuU+e1FBHFQ0kS+qyG6hKedAoajHjfrwFRZkT2Zf0asvUrPNEqNLDZaCATVIz/hnUepQetZzTzTQRXGsSQeTx2GjJ8EZuXCrXE9oqfoieXlxMnF8cjWzOARM2T1oOTLCiSS2heHBP/x7tlyyOASseRCF3LhwK8dkN8ylaLaRLduLgKyh36jVQXH8ccuKNTRtkCKSFpO/+dkjDgQjUdvF+eEImHgopqCuHGJXkB1Myxfqm6tnVG11kR3Vv9D29BXJT2QuuV9QEmVR1jNalnDjb5iaJTpmhxU8+A8aBRfevhuGpL7YJvgNDTOiQXGMx/zDo97cy07cpA+hFvzTjx7Jvs/aB1fPF9VU/QdaYsjyBUnLL0hPpROpzYhyVtagHxBNOA3EZBfX5i/o6DgoDivol4Li2G5uW4oVLdtwK/9E/kFpuHSiWlWOE/APQi5m3yt2OP6KDKdGi56QslJ7wLTrUpy2xHG3lmiJ3PiYQ0kPlCCxQeSQQDEJ3vsImGzj4gRx4WhahMlOrCJLuPHgH+6tneiZOXYF17Vo04MPl24ojiWs4REl6q28oFcHcw9MiwU5CySwHEoa+m9PY/pvGAF/XCYOtcZB0loZAdNnnZPCL2hJ7MYWESA2KMu2JMu2cuxvlKKsPLm06DvSZEm2ZUm21X+vuD2+YvJ1SYyKMknMGu4QmX/i3DHMq35hKDPZoRPJqi+St15MkBQh6eLBKWAUhKcmzjemhqwT9X4us2yUnng03KYDt4NpfUDpukI5af+g5RDiFX3jwxKRMTLrHVN780yl9oBImGXjMhc4ER9EIBfnm2t10OphxeII9gVJ7QbZX5ipaItURZN60MtLCDcCrx3iC7JDonaiOOFCHVRqSU+UVK6eyEkGrR+UKZvoB9Tqi7Q4iq+cvPwJrdxnXzH5ur4xO9Ak2Yv6RmqaY+BwUtlh+kIvX6THdprQpYTQRxQnrYAuGDoc8SAnRnvxyDNINwQjUSTlhP/pFDHxYIwJSBMjudz+4P/4QyAifyrE+LNhreHKk78507ODqfSELPYvkuHr/E2S7sQ2oL4hbVirBIzltYY7Zx9C/qrZ+wiTR6eQPdEesH8djb4O8KZeURy+O1Zha2TY6uzORO4cTJmulhfpwSjDp0xOQg82OZSlseVUsCVUSxaTH440UyRoWGduOCViS3ekEctvMWsgWBtPTIL3IzJNDsw3k8wgcfVI+LBugi2yo/pfSC3v6X6ab8imcGRaEtkLYHDy1G8+v3lie/aV4bSVJY9nOlf/E1nUvidk41iK3ZSAdOGwiiAqz5g4GhQ98cOHNf60rtAH0RGMdGB2NUcM0tIf6oYhOC3Ef9jRNL/YuYt7qnDHHfMVzNQaGDlwrmKkyTOyjfZuOZBuVG4kIU5+xHaiLjKDcWd60SDYnSN87g5J32I2Ucz2DP1i9lYlOZB5WIwtgdN/OLtbfES6o9+c7vJFIE8MvGKLR2Bn0ysm//V+TeQsBj+cBeWL5G15Qgp5bn6RD05j/ue4Oj0fnIzNqOkL//joH56d6fpgX8l/VFHpo5B74ogY+moQ7mBjOPDhzJUvkjNFfOJTmVtTD/94780tkZ4w+tVzyxM/9Kcd0V79HCRhMUaShxY6luxBr8Rv0x4Qo5MvbXIgq8ov2IErZwzrvldkH7XjP4P8bu1ndyrDyRCbB7mHMiMXnR3VQMox6rzlwjcNUGcRGRuI6QsPOzBy+GLkTN2QufLF5Ot5K+1TiBbygxHwPDzXpOdPbPE5HDv+wtROZ03zPJE3QPuDgX07eDwnbRe68uW3SRF1tqzO0GSJVGoN09m04cND17OSFdTyPpxseBpeeHrwqXZD2SNnTTtekUIsl9LY3wTe3wjMVzXPDfQgcU3jB1Nj9r/Zzh4z7OzcDekpD1JNTtp3fCPlY9U3ZoxHpgPvlxQJ2IdPlpjlmbggKRZx1kOwO4+A9z4CxlPZh5bGcqb72y5SnZ59SVqrlWeKBBv9zpHZkoie5aSz+5uzMXW89WKbuXsRyLLcc8XIJy85QjshV0z+4pHPRRCMYR7aOBjtzX9maeQ7Onhgek7PXnoAvp74saoErGKRgM26qOwcvtPheH6w/obcc0dGU2d29HC8nIBl37vPPROZY1fy2UX2I4iJrgAAEABJREFUw7MwOti3gCynjeFaA9ILtpJJBtMS/nE2o185lO7EdF/TamlNcsXkp5Ng+f1mFnI+lryzXziNVFYn+y/W7u6mG/xwsvJF8lzR37hSAl8XfUaJ4YU+PdmWMxq6ePxig0yhJx+HYMm30qvgYBUQu92Re+IMYlRrDS+cfVSyhC7eFg6gPfPUxntP0mnMijCedhGSHo3Bq6c7/C9MLZ49wZsf4gt2N7UTMxzOE/m+WB8dKT1Feg5MSg60rVPl/EYHpsii0mIy6uQpJfvGoyMtzQlY77gj0wj571qfR8Doi9jXNKcL0viLXEI3T9h6MwI2OiPksaPjxFxGIfcDvavd1enKguRv2KEEPD0Az0nsmg3wx+LqqR2OdF0Q+UsKvbY0T1+dgPEhMVohWN4x35hvijD4P/4sSBN/EeSvgpYVa2jaIEojQYXfuKQ793Bd0VL5YvJ1cdxcG4MX9+avaOV++4rJ1/WN7EuvOItOitMaO32kVIX2guxo9RUlUcMuKCnrcGxycSCYWkv4EClcORH/8JTSe0Pmyu9YKQ9LAmISAfugLNuSLNuSLNuSLNvKsRwgHlgKf0Bm0mV76ov2cBu8uWRHe0GJOi69ILOSEi3dUByvElRy7rqjOFQNtA6Sb5t+MUWhL+oJ0apbyejWnGFKTTkHT75+SCdu0ofQE4x0QwS4DdKiRfuZf8narkXfkWZnJ6pxlVsfJJWFLGKIbDKTgiomX5e08qJ/URKqpq+ZPnFr0mj+YLNyMlCc7iAPQmWH6Au9HJRTJB4oiRnYB2X+iXMg6ZoXD7BXeURq0W/OZPkLIu/lSluoWBMc7qVXNGWj+xeRTGXMekTk6hfMXfEMBG0LkxTEX7EdVJ8w2pd7+Yme2blMNnwdgpkBf1Cc1AFE+YYaLg1SxJTzwck8HURT/ri9+YmU6YopYctJH12c9ACtJ5QTMIW/uKuLY1wwcCwELiUg/YHWPP2Kpt/olmTZlmTZVo5tmcRO1OTSP9BTZ8aSbMuSbKv/rpg8noq354bRJMox0SrKJw/58GZIV/TyB7Q4VnZKB5JZPdWTr9skmN5QFFN7xaylJ5Ce4oRDHaapdpcksPUnRGv9CSVKTMZSl+DqWfrFLVM10aAWvSiGJt948BNnAqp2GP6Xpyt1cMw6ZmVmCV4XBSvHcoD4gyOI1un44QixbbBDaF20wz9Opj+W6d+nG2hbzH7YfSc1dMuKiVxJX1GaunrSlmTQ+sEUhX6iyfyoIGLUrAuSly8mP93KffaiFsvJy6+YHeEXTI9yVic1HvtB9lZ/RMu2CNiBEiQ2KA49VBVxUHMg2OSJJQ2wKyZ/8cgiYHrD1HCe0Za0xcubiGMd3PbyRV1RsPAnlCjGlNMuAqaIg04qe5AEIw9/cmnq0jtKsvTiXt3KsQ3HQSUDYbItyRpY1KKp4FBN/cLFoYZJBE8g+sNhJaDxIw9aOROVWlMCppwnjHY6CaY87EQSuA0KX7TJu3PQXoyGD1MmlPPImal+Q5TyxeTrWWZbGO6sBfVxaXLpBS1LuPEDk6+zeDPqZN4esBmIiTblBA8XBTtBshf1hEZ1mgYbDy6OUQCiAxfP2tItfPhFSHoUgn95lqV+wxA8e4DDhk7U+TaTibPIrmavKNkmYCdKioT/IMK0WcE0BmHlRV1jO1Be0NHxV7S6n4CRf7icOcseJxFZxAtKSl2cA5PiMSfgH5zMMqpkPyFadVOXGiw9ojipAXpEREwpHqicEin6uoviGBcMxJJBMMjYIQ2iUdQ82XfU8qKlL/xf/0zYv3DOXwTnr4n8hTBWnb8dkkcPTf8NKfQvi4jFg/+Fqa0DWO7mHrK1XJMU3Fr303PD1P7hbMm76Jpd2h1XTB7nO6eXnsxV6+TOkuf+1MB2gZ0BacK25+Rdgn5FJrmLNRhJrWE5O8gylIxuGPXE7H3A9LYvbdRjJ492OgmW/lkFSYLnO0YfrZxFf2Nv4eMWMxp24nxB91aH713de8nDf5297XlBdlLmlanjZMNzz/Joh1OkwnManzE9p7Oj+RWT5+Ige/Kt9HBF9xGwikj/QvZMF8nsYivz0OiMN8t+kvw+yLRQiEX/j95ZduxygAUPPOtOGdKuG6KUvyA1lmOp56nzXb0/EnVs659aNT7uF+mpvpg8TmN2Vk1ejfu+MbXzXrrPnN5b7eDp+XUenM0ANTKSRCCcXyy7ALZUL6JFyjtfkZ7W/xOyhb5eAGJckw9aPQUoIu9Ce+Dz2kQaWZAszc/IJnq65hGZYk3nL5jvSTvTlNIzfnIWtucH24G6yE4m2RGOsxQJHnU5QnedSC19/8X5iTr7gHkEmwJ4lnPfZBvh3EHse16RntxBU4w2trIuhBIcKw+SYKlxCQbBqGDMobR2xeSHXxamu3ICOw5Oyq4aATUCc9gLp4Hi5xsunN3VT8wKdu7vCVBBI2GKp39qH46W/XRm1//N2Z1Zls1c+MW7E35D7itfTH54diUHOwW2CxyeD0HhPj4mFvmCFGLpPzH9JfR9IXchElcnCz+WouZCPAbDkrUtSe5ZbCl8Pb9Hdv2fkF3Tzwuyp5yADc23QHhAOQElrN77kq3+zbP77nMP7bSyiY+YPHr80BYvu7vniUeLswhLxm52Jcv+b4yG96sYwOhHiEF6D4iIVXzHWcINJMzQzcW8HcrQ6OTVg/QA7QnmLgiWDuZSf/H2to0Qa19GQw7MDjZTw5LkGV9IPy/rviDONBGdITZAE8NJU2nawD5qSdNbpOfMv2vhF++uB37oeWl2XTG18OB37YlHe3Aejn3uhsTy+A9yTwifNTp3jqHUCPSwhXosPGyRe6t+YXaOnmF6sWjTBsHCx6fnu1bex7SZ1hdMD55XARh9tYYL33sAlqGTcAnGU5mmvTpC/rsS/+bRbt4VzL7i1rht1i/PHecMWvli8nhmgjfPU9N3xeSHf2qMY8vJxnhF9pVQC+LJ2MDnUg+nZziPLL8gNSzl6WckvwltJydJHWiR/Bc7M0Ms5wVdmpTewiJ5rIyeX0SpvkjOxdg7z93xuT5354n0c9GOM49GQ/kjZg5P7XCaq7wiO1PjqtxPOveUP9XYRtP0kueecDCDVb45teits5etSfNliyjVgyQxdtBAveT/jAxkGTezZXdFYxs6WuyLDE3EmTnfnC1XTt5dj8j66lfkslkZMaMfZHd/y0UK1HMzzh5iKh/PnrC/MLXT2dD8isn/o/cuek/khX3XBefziBeNngj5NtR+04nUqj8iU9VfEJmnYPmobkxAvXJyOrh09OSHs7sDYL6qcgIjJ6dW6cRZE5qdv5hhpqdAC5wF/cYv/B9/EJTyp8P+cZCA6erihAPVE8oJmMqTWLYlfdzNxTEu2AMiYSlSlxLu3Jq1T2hJlo0LB8WxyReBVHDhq0vkL37M0mFJttV/D0hVyDgdlkhiuHEpweIQMImAfWEVSlf08ge0OFbulT5IqpzRyYxj5clPJ8GUQlCE5K/IktQCX+iTtzjM+kIvv2Duw23TbNm+YNLwRYm6etKWJEjHR0csL1r+QaOtM9zsRE3NF0z+H5xBzGKViFmwGGa4hzdaKopjMoDoAH7iJtmJrA9OwQaxFkC7QcPJhUc7UVK59EHNoXWSP+LPbIZwdMsSSMCs/CPINhw7UVIkXJzIgAb9iykK/USTeZXBIyJiMOuC5OWLyU+3cq/9goqOP6AyI2mq4iQTfFwc47ETmSn/C6nZTOD2NzKNhkkEqqDmQDCpQRq8EWlE6YbpWQ+k9oA+dEtNF5PHeY5EUiRg0sFvOIP2IjVx/IpqxeIQMGU0mCRoW045SGJbGB68+NHzF6YWt4SdLo5hXgTKbjyXRj1xu9JUHU4NkwgYiKWOY5Bag+ViQ1OCcoKmasjVoaiJCqb0g1Ik5bROciIJpjzsCyNJiE0s28qxv1DLT0yXln0hs+2+IUr5YvL1LLEtDH9ACR2XXpAZSYmWFv2O3h6wGeh0Wxwr75Cld0wx9UUFTXTEBxTH6ADRAbAADh/WeAgnbtIH0RH8y2lR6jcM0Snra6X2jOwtL7JrskRLBz8RSdEvSK0S8oGVwiU1l4rEosU/lyUbp9GTXeLRs+gg/hemhotjWxhuKQaxLdtwK/9E/kFpuHSiJGvO3yjZ27Foh+OL9uYnSgzh0gcl0VYXJzkwHIIp5EDlOAqJT3cV3znU0S1iAyglwAaT4HlidXJBMElWkYBJCscXf3kVqldM/uIstSTbsiTbsiTbsiTbr05BlmRbFudELV+ULryd8L/QWwfZmelCVItDwHTw5Ovt25yylBD+F6b26uJ0weB3+sPdTeIhZqKYJPxEknKQHvsfSE9suqTg4WGTe3R2WZJtWZJt9d+JqxlMJZjaDamVg5IoC6pBnyhTIwAbh0/8VatHTvcNqZQvkucu2mSHRL8jBcRYdFx4esX5xtSQdaLez/ds+ex25sPXbSuSFm24BAVjJ1fPUuqli5ZL/YCWGLI+/0gxuCmRjVm0iaiiqb25rPboiuTli8lx0WhJ7j9xkqnMyrFoSfIHWopto10i+wXFoUZVNOlA5UCwZKd/c82EdCC7mr+ipNSy6AttREzroeLc0Rp+QTldxCfU6ou0YCHoUkJ4dgbLScqL1uSLCl784CeykgFLsi1L/9nFsT39IFS2Ad8RzbYQY3cUJyVAb0jNWyzCFS4RLRFfPeXUbyhFUk70vzyNqd8wgmWbDR+3DBfxg//jD4Kav0ACIfPHwkqhUe9IA9aGL+wfHNucAn+BbJ4N4Zl4QCQsxemGYBfOnggsD/DnzBj11ZnKXzZh6O0oJos+t6fKSHoRWgNjRx4c/ukt595fpKd6kCo5xgUPnDLXxqjXNlDgUiZIYhDgm09zaofTNNtI0LD2FEciVjoxtdNJMH6k7YFgJScmwftR2UIeuN4L/7wVgj12saP6X0gt7+l/XjTfMHvRgLQEipEyFqE5yeC8KvGXj3rEfHN2lKeZ7wtnVe84kVr1J2RmLMVuTEAK72bWXBFKNTGNdE16xG/h4Cdu0gcxFLx6doefuD3A56NC8F1F9ocdTYuX3fmq2UkNfThfRd7rJ1xbek/KSZ6xWyhfkf3sGiXx4zTeK7RivfMb24uYe+MM0hfh+82znyItqV95t6BfkflQnG7iL69I6H+3weweyAT+eRDDy6ORtvfADiXg0YB9DHMh3/7UFO3w9CdfbEqoNaTQ3bBi74PkeSkWT85vRZ7G6jTPN0dPAUTr3CtmejwtnSJgFYPZPZh9yAgnT47ndzu1Xji9h34itfQdd0GTBsBW3jH3pHpixpjBeFWuACBYSZGeYJyU8UT6BoZTxL5EGiJeHWkGSKIDV/4gpePTQgP2eRsEC+8npbEJv12RF31jelhKB5F64xt+unJN70k/Oz+cnnKUWPI3ZJZyX/CNEdkUwFmQXjKAeOV/dLWN+g35tvJF8tzNUj4nhBsiNG2IQDMwTSTRcbItkL1xSocdLZ8bZUgAABAASURBVCdfIfdFe8Johz/2ROQVuypPjJKR4OFT5reo8IR0MNTKiezNwpQOpLZpivxmQOp4Vm+5OpVido6erGoCa8LHI2TFwQ7enQl4dgDd+YxsiKXxRDaWg9w4wy2GcQ35Ltss7D/6MbGYezJZRPtBitEo9R3FaOvAPIokNeDOP+JkieP5Oj6GiSuPEr5IioXMWgh25xHwPDOFIgHr7vzvg9wVnHoZn8PQdHT3qOl4dlqZ2dqMwieZ3dR6KZuuSN56cJd06uTMVV8kn/qHI9XYXPxU0nlxdrYWKV/1hNHePNtTOxGC3XZm76ufgyQdBMfKGuAgdls7nC9Mwndg1MMRIP0NM0oOvPz2jKSIM0UcnjweIcjW/YJk6Vlkd7K5i4xmInfNJGVyFHSSWIY/OG3dnZC2O1ZBuiL7ULLoULPmkU9DSkfLF9KA9UFPmHvyEScyXn7B1KCfS0peQi5JafGyq0o5GZiv7Gry4PzG3PLDsy/6E3YLhb8wtfHeQ5gr8g72XvjoaJRYOj8beXTaMPaEk42VkF6wLJzeLClP8sa5L2W894CMJHI/e5Jtob9RpPATScrBSy/DYSw/9KF/x+09HvCNuSfaidnGDMZFtd4L/7yVnnIQ6+iJ/CbUMjg6nFr5iWmIHrxX0jJqdBgEO55Q8crzptxzIt/y4XNHa+hZMrPRs3sxKR5L/U/MchqyE2DlTAxnX+tXpCta2sBAnoLab3nEioTX5hRePHIuuOGxazG1ODStNw9pjYD1kbw7eHxj8jhfmQ1MtLE4/xeA/E1wjL8MYsnjxx8Qb0ih/C+kJtyeZSYvL36y6g7HF9NCqowOenIES+TGvzHaur5xeyXZ1CRZqotz5EEounHhVo79hJZtygYD/0JtHyiO8RhoWbGGpgTlXDH5t29P5Cy4IbXyxeSnk2Di/ZiCunKIXUF2MC1fqOUnqmdUrbrIjupfaHv6gjdnrnxRkj299oFoEjoufeH26AmjfZxJsVJVLI4VLn2hUXBktU5+okKoP6JRLTUeKE5ySdXF+XAk+MUupaq9mOyKyd+cVqUG2rts0V5OLXawO1pOkVhkxuR6RVEyIbaY3qS4cKgOF6f5iZ6aLpj81bWVRT8hGro4vYs8yKDsEH2hl4NyisQDJTED+6CkcukVtcfezkU7HL9i8tMZbL4I6OQhOONE6QvTdhWnbNosNT4gkqmNOW1J74gcsfvJb0gh3IsZtMtkW5I//+CWll8x+ToNmGjVM3r1C9JsmwWW/XGILE40QCdKoy9KwyWwlXdkR7u+UCeXmmdNtKKkNxQntTS8YWqvznxrIrIAUw6ICTF2QSvPSnhH029aLMmyLcmyrRz7CxGjxEkV/LiXLzJrmmyPXiS/YnJLtvEvlEaTflBGIzCWGDIofaGXP6DFsbJDOpDM6qlO/sEQShGaNkQQ41JCaieKQw9R0ZTzzaOtHyVo0+4K8Uw/cNsSbgeTXlCiBJcuqJ60J5mqNOhHjBoXQ0G7sUPNnNQp44taNLU3P3oeEAnz6Wwhn2jluFxEK8fiWUn+QEuxNJ5o2Ub3iSTDxUkNiObFQHjxz9AJOhYvuyS08itKilYpQfrmKSslXJzyE63hF5RTJT6hVl+kxVF85eTli8lPt3Kfvagg/orZkfoF0ysR7y4Oa0c3BLMnsa9o2U51kNyG45gQY4PiIFKVCNgv6nOcplI3qjz5OruqnSgONUzpDf5H74pjBvzwWWAvUstuFycT58MhmPG0/I3WrL1i8vEU7cltkJ32N0qWhKyi9IBe7QsZimJbosN2omxLsgL2YAhp5KSD4li/XJzoaiBesAx+QZHHowbVY/W+5E7AfxABa+MTCrFLftFGY6XSI8k+uHoOdkfLWy0y84so1RfJhdvhIjU+KM7K1aBFk4xuOTnxHd1qI0N31NR8RXK4OLTrcKHZFoZbqjWQXtHLg+L8C0W/erJ7kkbZPpKiDccoSCeSVA9Kai4VxQkHPjwEp534ZYdouZWJgjVjl8l14lZ8QWoKP1EaLv0gQtpSuKKvevLT2wl7QUfHX9HKPfYToglPDVQxu9DEWX7oJ6aEx5yAn8gMlNZR7Ct69SvSnR4PJqVJWq6c5K/4VIz268rSyItePPSTW7qVDl60jjcWFW7pFVtRjumZ/wvA/MWQPwr2L4YgfxrMHwz5aylt1DA4fz9MjWL5DVNIfZEaA8x/8ehIdFJrR0LU5Z/78pbc84xsoDi1r5xt1U/kivR2Nb3Bmx/a4qWXNt4VHUdn03Dy3AGJIadOd/UnbAsh1h8grwv5QvagpJCsyM7g4b03PayJ1vKFJ707jVgf+oWdTVg/dt+RW1LvZ2UBvBcsImEho9I7fL4g93ZfdSrBix/19IyzqvXFvZdJWmcn5d41iEaRSJ0ZKs0PpKn8FZlJLTu+MAuRAnVWgmmcmfKG3hARlvoXr4pe5IOuGDn8hvSUZyUJxsWQ6JDro/6VM9JZML8vwB52kJycPLYqrxlWzv58TXa8Ij2tF7OeydiFN0XL8iMP0p1RZLZTJ8IbPzjV53jOdBMzD5ie09nd/IrJKzI/eX8bHggbjdtJErkgKr9R6yDGNLGlwcbwqXQf2iDzzFJlJXXy6hekQDl9HSJfBKZGwmgLL8i6bUoDu/J6xGTZ8YxspKetE9KKiM2a5UyXfyEz+RZU+tpQvPH0xLlnO2DsJyIRySlgOxueDYsUeseJ1Bgc7R95fpH0giy/3RXCdABnOT3hwIczyysYTZ3qE0fLW2iK0Z4+tlQPfnz6wtlXa4jAHMDNuwROLfzq7KRA49YCqYPcOiWqK8FRqWXnjD5xGijO21K/cBZVPzErqXPH6PDk670nefa94txBpJ2Y3h9nb7Uv7E60EzMf/gfm7Xi7spN83p6ZfMsVZzFttEcPb0rAUmCk80/Ibj6K2OKJTGLsYx1J4yMy1uKJm3BvMzD74/MG1NUOfkduaX2R5a3fEIKljS7eDCGymeTz5mY0BbMj2Hekd3VSJCoMt+cRuaV68KuXBZ37C1M7nR3NF7M3HKwCYryJT8G6GyFIG3rJf0d20JxR1vP2Jx5tvfc05x5wODm/Fwsw8my78uSnd4g+rNovj3yuICm/4dxx3D2vTkSnOdl8Uzj3MDu2PD1NG9J6caYjHz3FaOssyr0wZhq/kPsy089KHZ6Z8Hh233B7rjPJcRZj1MlzJwTLgtEgMS4In6VUh0O5NgaPUakRqDFBXJ2u4UTuirqLgfTjqw+EMx5CynhHnpEGjEWxDNFbAT5IUr3fyBJeMZychJg+xsjWQpKC050d7eJN2OgRIN37hdHindta+IzMzg9nHQ+hjTu31gwd8XeGnuovmNrpu4Mlva8YLReCuadawnAk7Mq5B6XfEsSjtJt77sje1BkfHU6+bawIiTaYN9FO63AaNv9/gyl+hjN46p1FQZjYvqYNbKQ0L83eV545vPv+iVnJTpa1n5sYyStzRViRjg+OOj3E1g5kuPwV7/fRNnt7/1ONba0lUM89DKFCEvEb53HpCTwha1JiJMDdI3y+HR5LA179ARmc++mdnHXpA8pvGIKnlzeRYSU3rMIOFmN8V3rhybJzMCU6Y9SmJeSqz9qUO0f5RAb6TV+Y3aee2uHMTo390R45tepBupNzOca14X94d1I/cXfkE1jAqtkBJ6GLOnl0AGmyeTs1Zoirszccb/0R2VL9BZF76SIbsx7GvdiQJC/O7vacyGgW0n7uSi18MeV4KB8SYwXd9ITcvoXG8ldklNrc+v80/xeAhr45fyWMiXD8hZFUIpycvPyGo4jj6iI6AZQSYA9odS8Boz7cHkzRTj4ujk3+F6b26jurxcsuRmRHx0EpSCTHkugHxbFWB8UJB1RsIL0gNaMI/0GL01DsffTFRBgukaonrTeHYEpjUARMN4yAp0c55IA9qPRKxOETwyXE2AW9/ILZg1cJ4sJtz9wVJUqWJdmJQVyC45KiftzLr5h8nR3NTsw8ii+YWviJ1OBZjKTDheYJRNMUC3r5YpmlojgmA4gOXHEE5Y6UDtSpk2BK4USSclD4kQevS04eEaeV+A87mpzNUne4aPkBI0V/QvV0BdkzWqNfUOTrWvxVtuIg/hemdrqV++xFBXFQ0US+qCK7haacA4WiHjfqw1dYkD2ZfUWvvkjNNkuMLjVYCgbUID3jn0WpQ+lZzz3RQBfFsSYdTB6HjZ4EZ+TCrXI9oaXqi+TlxcnE8cnVzOIQMGX3oOXICCeS2BaGB//w79lyyeIQsOZBFHLjwq0ck90wl6LZRrZsLwKyhn6jVgfF8cctK9bQtEGKSFpM/uZnjzgQjERtF+eHI2DioZiCunKIXUF2MC1fqG+unlG11UV2VP9C29NXJD+RueR+QUmURVnPaFnCjb9hapbomB1W8OA/aBRcePtuGJL6YpvgNzTMiAbFMR7zD496cy87cZM+hFrwTz96JPs+ax9cPV9UU/UfaIkhyxckLb8gPZVOpDYjyllZg35ANOE0EJNdXJu/oKPjoDisoF8KimO7uW0pVrRsw638E/kHpeHSiWpVOU7AvxGpZh+VQTuIvyJjqdGiJ6Ss1B4w7boUpy1x3K0lWiI3PuZQ0gMlSGwQOSRQTIL3PgIm27g4QVw4mhZhshOryBJuPPiHe2snemaOXcF1Ldr04MOlG4pjCWt4RIl6Ky/o1cHcA9NiQc4CCSyHkob+29OY/htGwB+XiUOtcZC0VkbA9FnnpPALWhK7sUUEiA3Ksi3Jsq0c+xulKCtPLi36jjRZkm1Zkm313ytuj6+YfF0So6JMErOGO0Tmnzh3DPOqXxjKTHboRLLqi+StFxMkRUi6eHAKGAXhqYnzjakh60S9n8ssG6UnHg236cDtYFofULquUE7aP2g5hHhF3/iwRGSMzHrH1N48U6k9IBJm2bjMBU7EBxHIxfnmWh20elixOIJ9QVK7QfYXZiraIlXRpB708hLCjcBrh/iC7JConShOuFAHlVrSEyWVqydykkHrB2XKJvoBtfoiLY7iKycvf0Ir99lXTL6ub8wONEn2or6RmuYYOJxUdpi+0MsX6bGdJnQpIfQRxUkroAuGDkc8yInRXjzyDNINwUgUSTnhfzpFTDwYYwLSxEgut68omX/i/KL4A2D/ikj1DSntHwzzx0YYjVj/jriYPM7fJFsfHAWB8TZeMGrqICWs5BnZRiF/1fz8BTTaOBt4FzlJey5IgTu7ukipyLri8LD0vOBcyqrUuSfAdOUDIRhLqM9SchJ6scmhtMeWU8GWUC1ZTH440kyRoGGdueGUiC3dkUaMD9gaBCs5MQnej8g0OZDfE8CW7zuGdQO1L2RH638htbyn+2m+IRvDkWlJZD+AwclTv/n85ont4Y0H0lY2tVUDUf9Cankibb3zhiV5R5peMD3rdPGMiemGYN8c6bDvUh9C8YrpCQ/mnuaQIK3zaJKTk8doCfztR1N+NTqPHdxTBX7HfBUztQauP5D7cpeJAAAQAElEQVR5jBEifchJ7pxt1S9IE4wbSYiTH5E91RaZxbgzvWgQ7M4RPneGpG+RXWnO9mfM3lZJDmQeFmNL4PQf/rl4em6c7vCb01a+COSJgVds8QjsbHrF5L/er4mcxeCHs6B8kbwtT0ghz80v8sFpzP8cV6fng5OxGTV94R8f/cOzM10f7Cv5jyoqfRRyTxwRQ18Nwh1sDAc+nLnyRXKmiE98KnNr6uEf7725JdIbpnZ4bkl++MFPpIDlpqwrNon45OcgCXWMZMaS/MFb4reZ9XzhCPxMScKDrEoPu+Zb4R0AD51abLrRQ/A7Zx8ayzudXa2zI5XhZIjNg3RSZuSis6MaSDlGfe/sTArLSZkkhlMkG54YHkRkS1i7mqDfkEr5YvL1vJXxKUQL+cEIeB6e69LzJ7b4HI4df2Fqp7OmeZ7IG6D9wcC+HTyek7YLXZnfIiJspr84Q6Mk0lFrmImmDR8eup7VrKCW9+Fkw9PwwtODT7Ubyh45a9rxihRiuZTG/ibw/kZgvqp5bqAHiWsaP5gas//NdvaYYWfnbkhPeZBqctK+4xspH6u+MWM8Mh14v6RIwD58ssQsz8QFSbGIsx6C3XkEvPcRMJ7KPrQ0ljPd33aR6vTsS9JarTxTJNjod47MlkT0LCed3d+cjanjrRfbzN2LQJblnitGPnnJEdoJuWLyF498LoJgDPPQxsFob/4zSyPf0cED03N69tID8PXEj1UlYBWLBGzWRWXn8J0Ox/OD9Tfknjsymjqzo4fj5QQs+9597pnIHLuSzy6yH56F0cG+BWQ5bQzXGpBesJVMMpiW8I+zGf3KoXQnpvuaVktrkismP50Ey+83s5DzseSd/cJppLI62X+xdnc33eCHk5UvkueK/saVEvi66DNKDC/06cm2nNHQxeMXG2QKPfk4BEu+lV4FB6uA2O2O3BNnEKNaa3jh7KOSJXTxtnAA7ZmnNt57kk5jVoTxtIuQ9GgMXj3d4X9havHsCd78EF+wu6mdmOFwnsj3xfroSOkp0nNgUnKgbZ0q5zc6MEUWlRaTUSdPKdk3Hh1paU7AescdmUbIf9f6PAJGX8S+pjldkMZf5BK6ecLWmxGw0Rkhjx0dJ+YyCrkf6F3trk5XFiR/ww4l4OkBeE5i12yAPxZXT+1wpOuCyF9S6LWlefrqBIwPidEKwfKO+cZ8U4QDW6HvCfMHQEv7B8NnlO66rPbripbKF5Ovi+Pm2hi8uDd/RSv32VdMvq5vZF96xVl0UpzW2OkjpSq0F2RHq68oiRp2QUlZh2OTiwPB1FrCh0jhyon4h6eU3hsyV37HSnlYEhCTCNgHZdmWZNmWZNmWZNlWjuUA8cBS+AMyky7bU1+0h9vgzSU72gtK1HHpBZmVlGjphuJ4laCSc9cdxaFqoHWQfNv0iykKfVFPiFbdidLGK6rHjbdwSCdu0ofQGYx0QwS4DdKiRfuZf8narkXfkWZnJ6pxlVsfJJWFLGKIbDKTgiomX5e08qJ/URKqpq+ZPnFr0mj+YLNyMlCc7iAPQmWH6Au9HJRTJB4oiRnYB2X+iXMg6ZoXD7BXeURq0W/OZPkLIu/lSluoWBMc7qVXNGWj+xeRTGXMekTk6hfMXfEMBG0LkxTEX7EdVJ8w2pd7+Yme2blMNnwdgpkBf1Cc1AFE+YYaLg1SxJTzwck8HURT/ri9+YmU6YopYctJH12c9ACtJ5QTMIW/uKuLY1wwcCwELiUg/YHWPP2Kpt/olmTZlmTZVo5tmcRO1OTSP9BTZ8aSbMuSbKv/rpg8noq354bRJMox0SrKJw/58GZIV/TyB7Q4VnZKB5JZPdWTr9skmN5QFFN7xaylJ5Ce4oRDHaapdpcksPUnRGv9CSVKTMZSl+DqWfrFLVM10aAWvSiGJt948BNnAqp2GP6Xpyt1cMw6ZmVmCV4XBSvHcoD4gyOI1un44QixbbBDaF20wz9Opj+W6d+nG2hbzH7YfSc1dMuKiVxJX1GaunrSlmTQ+sEUhX6iyfyoIGLUrAuSly8mP93KffaiFsvJy6+YHeEXTI9yVic1HvtB9lZ/RMu2CNiBEiQ2KA49VBVxUHMg2OSJJQ2wKyZ/8cgiYHrD1HCe0Za0xcubiGMd3PbyRV1RsPAnlCjGlNMuAqaIg04qe5AEIw9/cmnq0jtKsvTiXt3KsQ3HQSUDYbItyRpY1KKp4FBN/cLFoYZJBE8g+sNhJaDxIw9aOROVWlMCppwnjHY6CaY87EQSuA0KX7TJu3PQXoyGD1MmlPPImal+Q5TyxeTrWWZbGO6sBfVxaXLpBS1LuPEDk6+zeDPqZN4esBmIiTblBA8XBTtBshf1hEZ1mgYbDy6OUQCiAxfP2tItfPhFSHoUgn95lqV+wxA8e4DDhk7U+TaTibPIrmavKNkmYCdKioT/IMK0WcE0BmHlRV1jO1Be0NHxV7S6n4CRf7icOcseJxFZxAtKSl2cA5PiMSfgH5zMMqpkPyFadVOXGiw9ojipAXpEREwpHqicEpLguNODIlnilJskOugT0aywhn2qBn1HLS9a+sEqqIPiGObF/v8AzB9A81fGwfzlkCoES8JfGvmLIuT5L4zpp86Cs558HcDSs3+BpBVjZzjevW+YuX94tmfHibsrL68OTx7n4rwRSDdOrT17B8rUh1PlnZNHh2DffBazhvbUwpsSYtxWa8gNiPSRsYyI3rg4iyjdOUIXt0x/jEWHnHSdOSyF9iasX79h6m0k/QuzNvVFUixkn5BvydMuyH25K85yjNpFi/5xVrX2grO6d9EGZhe9yXgILNnHaar2F6Z2OruaXzF5Lg6yLffQwyX9FgJWEelfyJ7pIpldbGUeGp3xZtlPkt8FmRYKsej/0TvLjl0OsOCBZ90pQ9p1Q5TyF6TGciz1PHW+q/dHoo5t/VOrxsf9Ij3VF5PHaczOqsmrcd83pnbeS/eZ03urHTw9v86DsxmgRkaSCITzi2UXwJbqRbRIeecr0tP6f0K20NcLQIxr8kGrpwBF5F1oD3xem0gjC5Kl+RnZRE/XPCJTrOn8BfM9aWeaUnrGT87C9vxgO1AX2ckkO8JxliLBoy5H6K4TqaXvvzg/UWcfMI9gUwDPcu6bbCOcO4h9zyvSkztoitHGVtaFUIJj5UESLDUuwSAYFYw5lNaumPzwy8J0V05gx8FJ2VUjoEZgDnvhNFD8fMOFs7v6iVnBzv09ASpoJEzx9E/tw9Gyn87s+r85uzPLspkLv3h3wm/IfeWLyQ/PruRgp8B2gcPzISjcx8fEIl+QQiz9J6a/hL4v5C5E4upk4cdS1FyIx2BYsrYlyT2LLYWv5/fIrv8Tsmv6eUH2lBOwofkWCA8oJ6CE1XtfstW/eXbffe6hnVY28RGTR48f2uJld/c88WhxFmHJ2M2uZNn/jdHwfhUDGP0IMUjvARGxiu84S7iBhBm6uZi3Qxkanbx6kB6gPcHcBcHSwVzqL97ethFi7ctoyIHZwWZqWJI84wvp52XdF8SZJqIzxAZoYjhpKk0b2EctaXqL9Jz5dy384t31wA89L82uK6YWHvyuPfFoD87Dsc/dkFge/0HuCeGzRufOMZQagR62UI+Fhy1yb9UvzM7RM0wvFm3aIFj4+PR818r7mDbT+oLpwfMqAKOv1nDhew/AMnQSLsF4KtO0V0fIf1fi3zzazbuC2VfcGrfN+uW545xBK19MHs9M8OZ5avqumPzwT41xbDnZGK/IvhJqQTwZG/hc6uH0DOeR5RekhqU8/YzkN6Ht5CSXehvgJzbvzAyxnBd0aVL6CovksTJ6fhGl+iJ57u9+8ieMFp/rc3eexDwXMZLxcRrKHzFzeGqH01zlFeceyuynkysnjx4/tCsmX889DMDSHDZ7yEiIqYyXs5/GpPmyRZTqQZIYO2mgXvJ/RgayjPvZsruisQ0dLfZFhibizOTVM/PFqVV/RNZXvyKXzYqIGf0gL8x/7rkrSIF62QfTc3j2JP8LUzudXc2vmPw/eu+i90ReyPexct8Hn88jkl9qEa7fRLUzBIwN6cUh2MGZQsNo515kirHhlHkKRqHWgDrIRPsIGBqdJFNPPouR0kkdg6xBsF4G9u3FGZ9R5tDS8+EIkPZzx9+Yq9jRlZm78/+hiz8Iqid/Fgz5wQiWbdo+bhkeG/TyG1qjvqI1a5/QkiwbFw6KY5MvAqngwleXyF/8mKXDkmyr/x6QqpBxOiyRxHDjUoLFIWASAfvCKpSu6OUPaHGs3Ct9kFQ5o5MZx8qTn06CKYWgCMlfkSWpBb7QJ29xmPWFXn7B3IfbptmyfcGk4YsSdfWkLUmQjo+OWF60/INGW2e42Ymami+Y/D84g5jFKhGzYDHMcA9vtFQUx2QA0QH8xE2yE1kfnIINYi2AdoOGkwuPdqKkcumDmkPrJH/En9kM4eiWJZCAWflHkG04dqKkSLg4kQEN+hdTFPqJJvMqg0dExGDWBcnLF5OfbuVe+wUVHX9AZUbSVMVJJvi4OMZjJzJT/hdSs5nA7W9kGg2TCFRBzYFgUoM0eCPSiNIN07MeSO0BfeiWmi4mj/MciaRIwKSD33AG7UVq4vgV1YrFIWDKaDBJ0LaccpDEtjA8ePGj5y9MLW4JO10cw7wIlN14Lo164nalqTqcGiYRMBBLHccgtQbLxYamBOUETdWQq0NRExVM6QelSMppneREEkx52BdGkhCbWLaVY3+hlp+YLi37QmbbfUOU8sXk61liWxj+gBI6Lr0gM5ISLS36Hb09YDPQ6bY4Vt4hS++YYuqLCproiA8ojtEBogNgARw+rPEQTtykD6Ij+JfTotRvGKJT1tdK7RnZW15k12SJlg5+IpKiX5BaJeQDK4VLai4ViUWLfy5LNk6jJ7vEo2fRQfwvTA0Xx7Yw3FIMYlu24Vb+ifyD0nDpREnWnH8iu9q5aGcCX7Q3P5Hu5ldMvg7cL8/8iqS6FEvLk5nMEvFwJ3dYA+xACRIbRA7Jsz5olWsRgknlaIu/vArVKyZ/cZZakm1Zkm1Zkm1Zku1XpyBLsi2Lc6KWL0oX3k74X+itg+zMdCGqxSFgOnjy9fZtTllKCP8LU3t1cbpg8Dv94e4m8RAzUUwSfiJJOUiP/Q/8/5SaC7LtOo5jgZr/nLsXQNmWve1zX+qSBAF+JO98FR1xoumJTZcUPDxsco/OLkuyLUuyrf47cWkGUwmmdkNq5aAkyoJq0CfK1AjAisMn/qrVI6f7hlTKF5LnLtpkh0S/IwXEWHRceHrFeWJqyDpR3+c5Wz67nfnw5bYVSQttuAQFYydXz6LUSxdaLvULWmLIuv6RYnBTIhuzaBNRRVP7clnt0Y7k5QuT46LRktx/4iRTmZVj0ZLkD7QUW412iewPFIcaVdGkA5UDwZKd/uSaCelAdjX/REmpZdEDbURMy0PFuaM1fEM5XcQ31NIX0oKFoEsJ4dkZLCcpL1qTL1Rw84OfyEoGLMm2LP1nF8f29INQQMO/vgAAEABJREFU2QZ8RzTbQozdUZyUAH0hNa9iEa5wiWiJ+Okpp35DKZJyov/laUz9hhEs22y43DJcxCeqpyoBO/n8AZA/DFYpErD8nZA/LiJDsHD+6Di8hfxVsYWltYP8gbRgETuVcOfsicDywP0vnVmXOs7g/KWTVav35KnROl3UmxOw7Dwc2s7hifSyq/oN2VQepEqOpTnPuyNllsbQaytQ4Ao2kMQgwJNPc2qH0zTbSNCw9hRHIlY6MbXTSbA+NJhdPxgB70dlC3kgvRteb634qK4nsKPTfyG1vKf/e9F8Q1anDKQlUKStGKE5yeC8KvGXj3rEvDC7y9PMF4Sz6todHa/+hsyMpdiNCUjh3cy6HaFUE9NI16RHfAoHP3ElfRBDwd2zO/zE1QNcHxWCr1Vkf9jRtHDbna+andTQh/NV5L1+wt7Se1JO8o7dQnlH9rNrlMTLabxXaMV65xPbi5h74wzSF+H55tlPkZbUd94t6DsyH4rTTfzlFQn9bxvM7oFM4NeDGF48Gml7D+xQAh4NWI9hLuTpb03RDk9/8oVNCbWGFLobVux9kDwvxeLJ+a3I01id5vnm6CmAaJ37xEyPp6VTBKxiMLsHsw8Z4eTJ8fxup9YLp/fQT6SWvuMuaNIA2Mo35p5UT8wYMxivyhUABCsp0nMgKeOJ9A0otYgHVi4hC+6OlN7AG6Y1tU+kgF1vg2Dh/aTsbMJvV+SZT0wPd9BBpN74hVdXruk96WfnxekpR4kl/0JmKfcFT4zIpgDOgvSSAcSd/9HVNuo35NvKF5LnbpbyOSHcEKFpQwSagWkiiY6TrQLZF6d02NFy8iXkvmhvGO3w156IvGKtyhOjZCR4+JT5LSq8IR0MtXIie7MwpQOprTRFfjMgdTyrV7k6lWJ2jp6sagJrwscjZMXBDt6dCXh2AN35jmyIpfFENpaD3DjDLYZxDflatrKw/+jHxMLck8ki2g9SjEap7yhGWw7Mo0hSA+78EidLHM/X8TFM7DxK+EJSLGTWQrA7j4DnmSkUCVh35/89yF3BqZfxOQxNR3ePmo53p5WZVZtR+CSzm1ovZdOO5K0H15JOnZy56gvJp35xpBqbi1clnZuzs7VI+ao3jPbl2Z7aiRDstjN7P/0cJOkgOFbWAAex29rhfGESvgOjHo4A6W+YUXLg47dnJEWcKeLw5PEIQbauL0iWnoXsTjZ3kdFM5K6ZpEyOgk4Sy/CF09bdCWm7YxWkHdmHkkWHmjWvfBpSOloeSAPWB71h7slHnMh4+YapQa9LSj5CLklp4barSjkZmK/savLg/Mbc8sOzL/obdguFvzC18d5DmCvyDvZufHQ0Siydn408Om0Ye8LJxkpINywLpzdLypN8ce5LGe89ICOJ3M+eZKvQ3yhS+Ikk5eDWy3AYyw996N9x9R4PeGLuiXZitjGDcVGt98Kvt9JTDmIdPZHfhFoGR4dTKz8xDdGD90paRo0Og2DHEyruPG/KPSfyLRefO1pDz5KZjZ7dC5PisdT/xCynITsBVs7EcPa1viNd0dIGBvIU1H7LK1YkfDan8OGRc8ENj10LU4tD03rzkNYIWB/Ju4PHNyaP85XZwEQbN6wM/8X/48+FOv6QWJT1T5TZZNke1I6CGR9MYklpDYqA6eC2Jw9K5Bv3wb10UHh7D1w9kmw0SZbq4hx5EIpuXLiVY7+hZZuywcC/UKsPFMd4DLSsWENTgnJ2TP701RM5C25IrXxh8tNJMPF+TEHtHGJXkB1MywO1+InqGVVLXciO6g+0PX3BmzNXvlCSPb32gWgSOi49cPXoDaNdzqRYqSoWxwqXHmgUHFmtk5+oEOqvaFRLjQeKkxyoPpgoeEz7uVpH7cWkOyb/clqVGmivZQvtxanFDnZHyykSi8yYXJ8oSibEFqY3KS4cqsPFaX6ip6YNk3+6VmWh3xANXZzeRR5kUHaIHujFQTlF4oGSmIFdKKlc+kStY6/OhXY4vmPy0xlsvhDQyUNwxonSA9O2i1M2bZYaXxDJ1MactqR3RI7Y/eQ3pBDuhRm0y2Rbkq9/cEuL75h8OQ2YaNU7eukb0mybBZZ9OUQWJxqgE6XRF0rDJbCVb2RHux6ok0vNsyZaUdIXipNaGr4wtU9nvjURWYApB8SEGNvQyrMSvtH0mxZLsmxLsmwrx34gYpQ4qYKXe/GFzJom26MXyXdMbsk2/kBpNOkHZTQCY4khg9IDvfgLWhwrO6QDyaye6uQXhlCK0LQhghiXElI7URx6iIqmnCePtvwoQZt2V4hn+oXblnA7mHRDiRJc2lA9aU8yVWnQrxg1LoaCdmOHmjmpU8YXaqGpffnR84JImE9nC/lEK8flIlo5Fs9K8gdaiqXxRMs2uk8kGS5OakA0LwyEF/8MnaBj4bZLQivfUVK0SgnSk6eslHBxyk+0hm8op0p8Qy19IS2O4p2Tly9MfrqV++yFCuKfmB2pb5heiXh3cVg7uiGYPYm9o2U71UFyG45jQowNioNIVSJgv6jrOE2lblR58uXsqnaiONQwpTf4H70rjhnw4rPAXkgtu12cTJyLQzDjafkbrVm7Y/LxFO3JbZCd9hMlS0JWUXpBL+2BDEWxLdFhO1G2JVkBezCENHLSQXGsXy5OdDUQNyyDbyjyeNSgeqzel9wJ+A8iYG18QyF2yS/aaKxUeiTZB1fPwe5oeVWLzPwiSvWF5MLtcJEaHxRnydWgRZOMbjk58RvdaiNDd9TUvCM5XBzadbjQbAvDLdUaSHf04kFx/oWiXz3ZPUmjbB9J0YZjFKQTSaoHJTWXiuKEAxcPwWknPuwQLbcyUbBm7DK5TlwVb0hN4SdKw6UfREhbCjt615Of3k7YBzo6/olW7rHfEE14aqCK2YUmzuKHfmJKeMwJ+InMQGkdxd7RS9+R7vR4MClN0uLKSf6Jb8VoHx45y0Ev1MKTW1rS4MGL1vHGosItfWIryjE9B5okDlRNHv8//mQa4w+I/P2wfzh8wxSiL+zfEl94dFqodGdwSYtzPX+9xOBU0wvBHjy1D2dh/vJJdWa6MiyfsDDa6Ye2kMu4trO0FFPJTjYMTw8OiSHTMUMfvC2EGI21hrw24kL2kEVIVsw9S7txxof3lUlJELGtHR0B68MeOKsRk+D7NzLICLVspQZcvBe0I2EYrRh8Xk7z0uGZx8mmnnx5+1ae+0mR6GRZORf/ImuqB1cvt3U2uDsiHbMz+g9nR7Tjvg0Zip3OOHkaZqa8oTdEhKX+4FXRizx8x8jhN6SnPCtJMC6GRIfw3uH/IWekvWB+R4A9zJGcnDy2VF4zrJy78jXZ8Yn0tF7MeiZjG2+KluVHHqQ7o8hsp06EN1441fd4znQTMy+YntPZ3XzH5BWZn7y/DQ+EjcbtJIlcEJXfqHUQY5rY0mBj+FS6D22QeWapspI6efUNKVBOX4fIFwJTI2G0hQ9k3WpKA7vyesRk2fGObKSnrRPSiojNmsWZLn8gM/kWVPraULzx9MS5Z3XA2E9EIpJTwNZseDYspNA7TqTG4Gj/yPOLpBdk+e2uEKYDOMvpCQcuziyvYDR1qm8cLW+hKUZ7+thSPXj59IWzr9YQgTmAm9cSOLXw3dlJgcZVC6QOcuuUqC4JjkotO2f0jdNAcd6W+sZZVP3ErKTOHaPDky/vPcmz7xPnDiLtxPT+OHurPbA70U7MfPgfmLfj7cpO8nl7ZvItO85i2miPHt6UgKXASOffkN18FLHFE5nE2Mc6ksZXZKzFE1fCvc3A7I/PG1CXdvA7ckvrC1ne+g0hWNro4s0QIptJrjc3oymYHcG+I71LJ0WiwnB7XpFbqgcfvSzo3F+Y2unsaL4we8PBKiDGm/gUrLsRgrShl/x3ZAfNGWU9b3/j0Zb3nubcAw4n5/diAUaebTtPfnqH6MOq/fLI5wqS8hvOHcfd8+pEdJqTzTeFcw+zY4unp2lDWjdnOvLRU4y2nEW5F8ZM4wO5LzP9rNThmQmPZ/cNV88+kxxnMUadPHdCsCwYDRLjgvBZSnU4lGtj8BiVGoEaE8Sl0zWcyF1R12Ig/fjSB8IZDyFlvCPvSAPGoliG6K0AHySp3m9kCa8YTk5CTB9jZMtCkoLTnR3t4k3Y6BEg3fvAaPHOrVr4jMzOi7OOh9DGnavWDB3xd4ae6h+Y2ulrB0t6XzFaLgRzT7WE4UjYzrkHpd8SxKO0m3vuyN7UGR8dTr7aWBESbTBvop3W4TSsPBxP8RrO4NTRO4uCMLF9TRsynX3/xMzh3fdP5Lb2DOYiKK8JL8uVcH4hLiaSUyNCG0dbkeFmn8hsagznfaSzv/ytxrbWEqjnRoZQIYn4ja83B9L7RNZEYiTA3SPkLRGKSIOzmyas4okkcz/y5EyzNLQcemEIPkWSWAnJhc3YwWKMu3l/diS7MCU6Y+l9xVmbcufoOZGd/bYH5o5TT+1wZqfGvdFeObXqQbqTcznGteF/eHdSP3HtyCewgFWzA05CF3Xy6ADSZPN2aswQl87ecLz1V2RL9Q9E7qUL2Zj1MO7FhiT5cHa350RGs5D2c1dq4QtTjofyITFW0E1PyO1baCz/REapza1ZMDxZPKVg7gr+n/L3wPwpEDz+wkgqEU5OXn7DUcRxdRGdAEoJsBe0upeAUR9uD6ZoJx8Xxyb/C1P79DWrhdsuRmRHx0EpSCTHkugHxbGWDooTDqjYQLohNaMI/0GL01DsffTFRBgukaonrTeHYEpjUARMN4yAp0c55IA9qPRKxOETwyXE2IZefMPswasEceG2Z25HiZJlSXZiEJfguKSol3vxHZMvZ0ezEzOP4g1TCz+RGjyLkXS40DyBaJpiQS++sMxSURyTAUQHdhxBuSOlA3XqJJhSOJGkHBR+5MF9yckj4rQS/2FHk7NZ6g4XLb9gpOhvqJ6uIHtHa/QNRb5cC3+VVXEQ/wtTO93KffZCBXFQ0US+UEV2C005BwpFPW7UxZewQPZk9o5e+kJqtllidKnBUjCgBukd/yxKHUrP8twTDXRRHGvSweRx2OhJcEY2bpXrDS1VX0heXpxMHJ9czSwOAVN2D1qOjHAiiW1hePAPf86WSxaHgDUPopAbF27lmOyGuRTNNrJleyEga+gTtXRQHF9uWbGGpg1SRNJi8i8/e8SBYCRquzg/HAETD8UU1M4hdgXZwbQ8UE+unlG1qgvZUf2BtqevSH4ic8n9gZIoi7Le0bKEG//C1CzRMTus4MF/0Ci48PbdMCT1hW2C39AwIxoUx3jMPzzqzb3YiSvpQ6gF//SjR7Lvs/bB1fOgmqr/QEsMWd6QtHxDeiqdSG1GlLNkDfoF0YTTQEy2uVb+gY6Og+Kwgn4pKI7t5ralWNGyDbfyT+QXSsOlE9WqcpyAPxGpZt8rdjh+Ijn7dHLGklcmYK0dSFnJXzBj2orTljju1hItkRsfcyjpgRIkNogcEigmwXsfAZNtXJwgLhxNC2GyE6vIEm48+Id71U70zOneig8AABAASURBVBy7gsu10KYHHy7dUBxLWMMrStRb+UAvHcw9MC0syFkggeVQ0tB/exrTf8MI+Osycag1DpLWygiYrnVOCt/QktiNLUSA2KAs25Is28qxnyhFWfLk0kLfkSZLsi1Lsq3++8TV4x2TL5fEqCiTxKzhDpH5J84dw7zUB4Yykx06kaz6QvLWiwmSIiRdeHAKGAXhqYnzxNSQdaK+zzbLRumNR8NtOnA7mNYXlPYVykn7hZZDiDv6xoclImNk1jem9uWZSu0FkTDLxmUucCI+iEAuzpNr6aDVw4qFI9gbktoNsh+YqWgLqYom9aCXlxBuBF47xA9kh0TtRHHChTqo1JKeKKlcPZGTDFo/KFM20S+opS+kxVG8c/LyN7Ryn71j8uV6YnagSbIX6onUNMfA4aSyw/RAL76QHttpQpcSQl9RnLQC2jB0OOJBToz24ZFnkG4IRqJIygn/0yli4sEYE5AmRnK5vaNk/onzi4iY8ViRgCkjQf4AqPyJkADkT4LHnwjB/JUQlVoK/EUSLTwZIiz6KHceFh2kBSt5R7ZRyF81ex9h8ugUsiLaC/avo9GXA7ypVxWHrx1LYWtk2NLZnYncOZgyXS0vpAejDJ8yOQk92ORQlsYWp4ItQrVkYfLDkWaKBA3rzA2nRGzpjjRi+S1mDQRr44lJ8H5EpsmB+WaSGSQuPRI+rJtgC9lR/S+klvd0P803ZFM4Mi2J7AUwOHnqN5/fPLE965XhtJUlj2c6V/8TWdS+N2TjWIrdlIC0cVhFEJVnTBwNip548WGNP61L6IPoCEY6MLuaIwZp6Q91wxCcFuI/7GiaX+zcxT1VuOOO+Qpmag2MHDhXMdLkHdlGe7ccSDcqN5IQJz9iO1EXMoNxZ3rRINidI1x3h6RvYTZRzPYM/WL2ViU5kHlYjC2B0384u1t8Rbqj35zu8oVAnhj4xBaPwM6mOyb/9X5N5CwGL86C8oXkbXlDCnlufpELpzH/d1ydngsnYzNq+sIvH/3i2ZmuC/tK/qeKSh+F3BNHxNCXBuEONoYDF2eufCE5U8Q3PpW5NfXwy3tvbon0hakdnluOPHjwA992RPv0c5CEhRhJHlroWLIXvRK/TXtAjE6+tMmBrCrfsAM7Zwzrvk9kH7Xjf4P8bu1ndyrDyRCbB7mHMiObzo5qIOUYdd6y8ZUGqLOIjA3E9IWHHRg5fGHkTN2QufKFyZfnrbRPIVrID0bA8/Bck54/scX3cOz4C1M7nTXN80TeAO0PBvbt4PGctG10ydtvkyLqbFk6Q5MlUqk1TGfThouHLs9KVlDL+3Cy4Wn44OnBp9oNZa+cNe34RAqxXEpjfxN4fyMwX9U8N9CDxDWNF6bG7H+zNXvMsLNzN6SnPEg1OWnf8UTKx6onZoxHpgPvlxQJ2MUnS8zyTGxIikWc9RDsziPgvY+A8VT2oaWxnOn+tgupTs96SVqrlWeKBBv9zpHZkoie5aSz+8nZmDreerHN3L0QyLLcs2Pkk5ccoZ2QHZN/eORzEQRjmIc2Dkb78p9ZGvmODh6YntOzlx6ArydeVpWAVSwSsFkXlZ3D13Q4nh+svyH33JHR1JkdPRwvJ2DZ9+1zz0Tm2JV8dpH98CyMDvYtIMtpY7jWgPSBrWSSwbSEX85m9J1D6U5M955WS2uSHZOfToLl95tZyPlY8s4+cBqpLJ3sv1i7u5tu8OJk5QvJc0V/40oJfF30GSWGF/r0ZKuc0dCFxy82yBR68nEIlnxVehUcrAJitztyT5xBjGqt4YOzj0qW0MXbwgG0d57aeO9JOo1ZEcbTNiHp0RjcPd3hf2Fq8ewJ3vwQP7C7qZ2Y4XCeyPfF+uhI6SnSc2BScqBtnSrnNzowRRaVFpNRJ08p2ROPjrQ0J2C9445MI+S/tT6PgNEXsa9pThek8Re5hG6esOrNCNjojJDHjo4TcxmF3A/0rnZXpysLkn9hhxLw9AA8J7FrVoC/Fpee2uFI+4LIDyl0b2mevjoB40NitEKwvGO+Md8U4cBW6HvDyl2fLFMhRYRg/wC4/qCooqxfNO1G96B8/kNYuYrieHcIpux8R0+NBow8fHOt/ETJRhNnoZPiIsEC9ZGiCP6B7Gj1EyVRwzaUlHU4Nrk4EEytJVxECldOxD88pfTekLnyO1bKw5KAmETALpRlW5JlW5JlW5JlWzmWA8QDS+EvyEy6bE99oT3cBm8u2dE+UKKOSx/IrKRESzcUx0sJKjl33VEcqgZaB8lXm34xRaEv1BuiVXeitOI36jy/rZ5aH0IajHRDBLgN0qKF9jt/yFpdC31Hmp2dqMZVbl1IKgtZxBDZZCYFVUy+XNKSF/oXJaFq+prpiqsmjeYLm5WTgeJ0B3kQKjtED/TioJwi8UBJzMAulPknzoGky7zwAHspr0gt+s2ZLP9A5HW50hYq1gSHe9EdTdno/kUkUxmzXhG5+oa5K56BoG1hkoL4J7aD6htGe7gXP9EzO5fJhi+HYGbAF4qTOoAo31DDpUGKmHIunMzTQTTly+2Vn0iZrpgSVjnpq4uTHqD1hHICpvAPd3VxjAsGjoXApQSkP9Cap+9o+o1uSZZtSZZt5diWSexETS79Az11ZizJtizJtvpvx+TxVLx6bhhNohwTraJ88pCLN0Pa0Yu/oMWxslM6kMzqqZ58uU2C6QtFMbVPzFp6AukpTjjUYZpqd0kCW39DtNbfUKLEZCx1Ca6eRR/cMlUTDWqhF4qhyVc8+IkzAVU7DP/L05U6OGYdszKzBC8XBSvHcoD4gyOI1un44Qix1WCH0LrQDr+cTH8s079PN9C2MPth953U0C0rJnIl/URp6upJW5JB6wdTFPqJJvOrgohRszYkL1+Y/HQr99kLtbCcvHzH7AjfMD3KWTqp8dgPsrf6K1q2RcAOlCCxQXHooaqIg5oDwSZPLGmA7Zj8wyOLgOkLU8N5RlvSFi9vIo51cNuLL9SOgoW/oUQxppx2ETBFHHRS2YMkGHn4m0tTl75RkqUP99KtHNtwHFQyECbbkqyBhVpoKjhUU9+4ONQwieAJRF8cVgIaP/KglTNRqTUlYMp5w2ink2DKw04kgdug8IU2eXcO2guj4cOUCeW8cmaq3xClfGHy5VlmWxjurAV1uTS59IGWJdz4gcmXs3hl1Mm8esBmICbalBM8XBTsBMleqDc0qtM02HhwcYwCEB3YPGtLV+Him5D0KAT/8ixL/YYhePYAhw2dqPNtJhNnIbuafaJkm4CdKCkS/oMI02YF0xiElRe1x3agfKCj459odT8BI7+4nDnLHicRWcQNJaUuzoFJ8ZgT8Asns4wq2W+IVt3UpQZLryhOaoBeERFTigcqp4QkOO70oGhhucUh1KyUSHXDCPg82bqhFi9a+sEqqIPiGOaFAEyXU8BOzh8A118S+Svp+18YV50/HZ715MsBLD3rL5D8WRHrXy8HV6376blhav/wbM/MiWuHNkwe58K8EUg3fvSsO1CmPpwq75w8OgR78lnME2hPLbwpIcZttYbcgEgfGcuI6I0LZxGlO0fo4pbpj7HokJMuZw5Lob0Jy/dvmHobSf/CrE19ISkWsp6Qb8nTNuS+3BVnOUZt06JfzqrWPnBW9y7awOyiNxkPgSW7nKZqf2Fqp7Or+Y7Jc3GQbbmHHi7ptxCwikj/QvZMF8nsYivz0OiMN8t+kvwuyLRQiEX/j95ZdqzlAAteeNadMqRdN0Qp/0BqLMdSz1Pnu3p/JOrYql+1anzcL9JTfWHyOI3ZWTV5Ne57YmrnvXSfOb232sHT8+s8OJsBamQkiUA4v1h2AWypXkSLlHd+Ij2t/ydkC329AMS4Jh+09BSgiLwL7YXPaxNpZEGyNL8jm+jpmldkijWd3zDfk3amKaVn/OQsbM8PtgN1ITuZZEc4zlIkeNTFEbrrRGrp+y/OT9TZF8wj2BTAs5z7JlsRzh3EvucT6ckdNMVoYyvrQijBsfIgCZYal2AQjArGHEprOyY/fFuY7soJ7Dg4KbtqBNQIzGEfnAaK1zdsnN3VT8wKdq7fE6CCRsIUT79qF0fLfjqz639zdmeWZTMXvnl3wm/IfeULkx+eXcnBToHtAofnQ1C4j4+JRd6QQiz9J6a/hL4Hchcicelk4cdS1FyIx2BYsrYlyT0LWwpfnt8ju/4nZNf084LsKSdgQ/MtEB5QTkAJq/e+ZEt/8uy++9xDO61s4iMmjx4/tIXb7u5549HiLMKSsZtdybL/idHwfhUDGP0IMUjvARGxit84S7iBhBm6uZi3Qxkanbx6kB6gPcHcBcHSwVzqH97ethFi7ctoyIHZwWZqWJI844H087LuC+JME9EZYgM0MZw0laYN7KOWNL1Fes78WQvfvLte+KHnpdm1Y2rhwWftjUd7cR6OXXdDYnn8hdwTwmeNzp1jKDUCPWyhHgsPW8i9VR+YnaNnmF4s2rRBsPDx6XnWyvuYNtP6genB8yoAo6/WsPF1D8AydBIuwXgq07RXR8h/K/Enj3bzrmD2E1eN22b94rnjnEErX5g8npngzfPU9O2Y/PCrxji2ONkYr8i+EmpBPBkb+Fzq4fQM55HlG1LDUp5+RvKb0HZykq3eBvgdOzNDLOcF/+//gViXp53+UDxWRu0XUaovJM/93U/+htHic33u3u6bNVlBedWSRb9hani0w3Nf8k+ceyizn9nsvPmh7Zh8+babBWEANTIS4uSJ5ezmxqT8hKjlKCeSxPKgdATx+W3S3yLzfyMNXUpXkVXF4WXwYBUSdhM7x6uDVXL3k6O1/oqsrb4ji7km8syFsx2NLiRy7ug3LqzCQDHa4cxU+wtTO53u5jsm/4+ee493FHnxE/M5eCzfwHX9poMzsfjcCcHoyh4cgh2cKTSMsfQ/OJQnYemnhSyWLMgEKbWShckPn8Xtmd5zIR30YzyGOpZeeIBi5YThTFMbToKYb2cKCc7AO28H1cEkbArgzGUPT8osrLt25A+A/D1w/uQom1yXuznTCw9+Q2uqn2jN2je0JMvGhYPi2OQLgVRw4UuXyD/8mKXDkmyr/16QqpBxOiyRxHDjUoLFIWASAXtgFUo7evEXtDhW7pUuJFXO6GTGsfLkp5NgSiEoQvJPZElqgQf65C0Osx7oxTfMfbhtmi3bGyYNXyhRV0/akgTpuHTE8qLlHzTacoabnaipecPk/8EZxCxWiZgFC8MM9/BGS0VxTAYQHcBPXEl2IuvCKdgg1gJoN2g4ufBoJ0oqly7UHFon+SP+zGYIR7csgQTMyj+CbMOxEyVFwsWJDGjQv5ii0E80mZcyeEREDGZtSF6+MPnpVu61P1DR8RdUZiRNVZxkgo+LYzx2IjPlfyE1mwncfiLTaJhEoApqDgSTGqTBG5FGlG6YnuWB1F7Qh26p6cLkcZ4jkRQJmHTwG86gvZCaOP5EtWJxCJgyGkwStC2nHCSxLQwPbn70/IWpxS1hp4tjmBcCZTeeS6OeuLrSVB1voR9FAAAQAElEQVRODZMIGIiljmOQWoPlYkNTgnKCpmrI7lDURAVT+kEpknJaJzmRBFMe9sBIEmITy7Zy7Adq8RPTpcUeyGy7b4hSvjD58iyxLQx/QQkdlz6QGUmJlhb6G716wGag021xrLxDlr4xxdQXKmiiI76gOEYHiA6ABXD4sMZDOHElfRAdwb+cFqV+wxCdsh4rtc7IXuWF7Jos0dLBT0RS9A2pVUI+sFK4pOZSkVi0+OeyZOM0erItHj0LHcT/wtRwcWwLwy3FILZlG27ln8gvlIZLJ0qy5vwT2dXOhXYm8IX2yovJ6W6+Y/LlwP3yNRORVEHleGWGjLuK7xzq6BaxAZQSYINJ8DyrOrkgmCSrSMAkheMLf3kVqjsm/3CWWpJtWZJtWZJtWZLtT6cgS7Iti3OiFl8obbyd8L/Qqw6yM9OFqBaHgOngyZe3b+WUpYTwvzC1TxenCwaf6Q93N4mHmIlikvATScpBeux/ID2x6ZKCh4dN7tHZZUm2ZUm21X8nLs1gKsHUbkitHJREWVAN+kSZGgFYcfjEX7V65HTfkEr5QvLcRZvskOh3pIAYi44LT684T0wNWSfq+zxny2e3Mx++3LYiaaENl6Bg7OTqWZR66ULLpX5BSwxZ1z9SDG5KZGMWbSKqaGpfLqs92pG8fGFyXDRakvtPnGQqs3IsWpL8gZZiq9Eukf2B4lCjKpp0oHIgWLLTn1wzIR3IruafKCm1LHqgjYhpeag4d7SGbyini/iGWvpCWrAQdCkhPDuD5STlRWvyhQpufvATWcmAJdmWpf/s4tiefhAq24DviGZbiLE7ipMSoC+k5lUswhUuES0RPz3l1G8oRVJO9L88janfMIJlmw2XW4aL+ET1VCVgGzf9UHYZ0AP5AyB/D8T698OFyeP5S2JmkgcPfkNmsLa8I90prL9E8ifIGP1Lz98pWwtPY0rkXJi/WgLpwNGJ6Th8atHHh69ZesvZ/Yv0VA9SJcdY8sIpZ1Xu3DHy8Fagg2wgjw1nKST54dAMBoKRT0Qsf2C000mw/ojBcxaC9b75GNIKj2XQzADXWyHYaze7qv+F1PKe/u9F8w2zFw1IS6AYKWMRmpMMzqsSf/moR+QD1y6UNPNd585yOoJ49TdkZixF+ocQw9lLNiqcPDGc52KpA7tNw6Uc/MSV9EG0BXfnjn7UiasHGJ1krUgL7B/2aM5dGQT7erDfAw6HkbdlwlzLmsi57G/sFtp2ZJhdoyReTuO9QivWO5/YXsTcH2eQvgjPN89+irSkvvNuQd+R+VCcbuIvr0jof9tgdg9kAr8exPDi0Ujbe2CHEvBowHoMcyFPf2uKdnj6ky9sSqg1pNDdsGLvg+R5KRZPzm9FnsbqNM83R08BROvcJ2Z6PC2dImAVg9k9mH3ICCdPjud3O7VeOL2HfiK19B13QZMGwFa+MfekemLGmMF4Va4AIFhJkZ4DSRlPpG9gOA3YTWw54u4Rwz/wj1ImrjfRiO28n5THNOG3K/KiJ6aHZXQQqTd+4dWV63LfL9LDHcQuyX8/UFpRaL5x7mrtBfMsJgI4g+khA4g7/6OrbdRvyLPKF5LnDSztG4MkFGMpzo3VE67mFHB6iOkupKfJoZdMeErdRekvTO1wWvu2G4Zw+7F7YUamMnFkfovSN6SDoVZOZG++J6UDqa00xT6nEj1Z3ZwkmIZgdp6Y2lpQnTzY3lWbVaMi0ZFIxxR6Z5TsvCMNsRROZE85mE3JF9JyW1qehf/Zj4mF3c1wEe0HV41SP6IYbTmQpwXeMQOp5lsG+QCS8NQuj0KBNdHSBY6FoFN942gp9ukkRQLWgf7fb/VpvPOsnpsTpyPar7Ps+gnSiJBdAPoIw9nUyxeSVw9OM68hOfncFXG2/HK6a2wsrg7yTGzOztYinQsh2Kkn/3I2ZiwwSCN2zlaM8OWZTG3H5N2wApwWrPyOfGEEvgOjHo4A6W+YUXLg8ZunlT4KE+HksfDDL85eSOLUkjHD7mRzFxlFInfRzLdTJkdBJ4kxhJWD00YnCRpW8cJm1HdkH0oaD5VpLDrQ2mDuT7ZJpRdnA9aHvWEau4RikfEnpgc57yn8GdjT+sJtV5VyMrBfQ3q8bX5jbqGWKy/ehW1LlvKF3QL9C1Mb715CdkQhxch4B7F3kBZZWmxvRd6WbvL0kmIldyyL3i7W/AuzlzYsdwGncPwGfQiFclaXn0iSwTg9rb1ixH85u9rygb2D2olpDt8wtUgL+Tn6PaHtonYhv035hikyVLmYjDp5SsnuGNYrGtpNwH54fr+840R2XjybcQQis438nIMkdG93kfaOv5BdlBmdztx7cfa2viPVaGkHA/+8lJHaZ3MKHx45F9yQbeULk8ehab15SGsEjB8NS3J9EwKT8PSuDIClb6rDEx+cFqziYPbQt34b/gDo/FEQZUN58YUHL4pofDCJJfGHRQUTgge3LQwHpUE/0UsHhTNAlJ24eqWLS7LmBA+PYiomMQjIduCBXjxImR5MiLEXrESorSDJsQZpCBGunB2TP331RGYqpoRyKalywm8OwcSDMQW1c4hdQXYwLQ/U4ieqZ1QtdSE7qj/Q9vQFb85c+UJJ9vTaB6JJ6Lj0wNWjN4x2OZNipapYHCtceqBRcGS1Tn6iQqi/olEtNR4oTnKg+mCi4DHt52pV5V5MtmPyL6dVqYH2WrbQXpxa7GB3tJwisciMyfWJomRCbGF6k+LCoTpcnOYnemraMPmna1UW+g3R0MXpXeRBBmWH6IFeHJRTJB4oiRnYhZLKpU/UOvbqXGiH4zsmP53B5gsBnTwEZ5woPTBtuzhl02ap8QWRTG3MaUt6R+SI3U9+QwrhXphBu0y2Jfn6B7e0+I7Jl9OAiVa9o5e+Ic22WWDZl0NkcaIBOlEafaE0XAJb+UZ2tOuBOrnUPGuiFSV9oTippeELU/t05lsTkQWYckBMiLENrTwr4RtNv2mxJMu2JMu2cuwHIkaJkyp4uRdfyKxpsj16kXzH5JZs4w+URpN+UEYjMJYYMig90Iu/oMWxskM6kMzqqU5+YQilCE0bIohxKSG1E8Whh6hoynnyaMuPErRpd4V4pl+4bQm3g0k3lCjBpQ3Vk/YkU5UG/YpR42IoaDd2qJmTOmV8oRaa2pcfPS+IhPl0tpBPtHJcLqKVY/GsJH+gpVgaT7Rso/tEkuHipAZE88JAePHP0Ak6Fm67JLTyHSVFq5QgPXnKSgkXp/xEa/iGcqrEN9TSF9LiKN45efnC5Kdbuc9eqCD+idmR+obplYh3F4e1oxuC2ZPYO1q2Ux0kt+E4JsTYoDiIVCUC9ou6jtNU6kaVJ1/OrmonikMNU3qD/9G74pgBLz4L7IXUstvFycS5OAQznpa/0Zq1OyYfT9Ge3AbZaT9RsiRkFaUX9NIeyFAU2xIdthNlW5IVsAdDSCMnHRTH+uXiRFcDccMy+IYij0cNqsfqfcmdgP8gAtbGNxRil/yijcZKpUeSfXD1HOyOlle1yMwvolRfSC7cDhep8UFxllwNWjTJ6JaTE7/RrTYydEdNzTuSw8WhXYcLzbYw3FKtgXRHLx4U518o+tWT3ZM0yvaRFG04RkE6kaR6UFJzqShOOHDxEJx24sMO0XIrEwVrxi6T68RV8YbUFH6iNFz6QYS0pbCjdz356e2EfaCj459o5R77DdGEpwaqmF1o4ix+6CemhMecgJ/IDJTWUewdvfQd6U6PB5PSJC2unOSf+FaM9uGRsxz0Qi08uaVIgWIS/HjbDWmwKX5iVqV+xyhxcYKHsyamrKxGsiN/AOQvgvw1MH8inL+uwvnb4iuPzp8R27FwSfyFNhPczi4MTld6INiDp/bhLMw7qM5MV4axn0WspIM8en3VUFs7ekDKawc95YPdH45jLItONwR74ZUIMW6pNcytTRPYgzJdcPLcFX74yVNunXvBWHui3xyC8SEt73i8dTTuHgHagYWMVd9wLiPSN0axRmBPn7Rh5vEqwc25BKNyalkRvpBd+Waumb5yaieu3ryGJliyy7M37BPZlVpmH8iFsdNZQ57GmSlvmFspwlJ/8KroRR6+Y+TwG9JTft2T3bRF+N+cVZ0F8zsCM09ycvLYXJm3DyvPb5KL/0JquaP7GHrD1cLdWHsGiRnlBu6NnoxmGHpjlG8/Z7qJmRdMz+nsbL5j8orMTz7fQJ6b13sowvhtyjdMiscoBaaPrHt+kL1tXEjevg1zVxyJD8rbuoSARUSaS0gwmmoNi6etvI3cFURM1t2vnAl6WpqQVkQse/GUI74iM/mW3BFkitayYnl64ixgXTJ8VRAwesPxo2dHGrIbiT52kwz/D3l/PvpAhufe7CvnPhToisOnFBXOXURGw9nzxtHyHppitKePLdWDl09fOPtqDRGYA3jJWgKnFr47OynQuGqB1EFunRLVJcFRqWXnjL5xGijO21LfOIuqn5iV1LljdHjy5b0nefZ94txBpJ2Y3h9nb7UHdifaiZkP/wPzdrxd2Uk+b89MvmXHWUwb7dHDmxKwFBjp/Buym48itngikxj7WEfS+IqMtXjiSri3GZj98XkD6tIOfkduaX0hy1u/IQRLG128GUJkM8n15mY0BbMj2Hekd+mkSFQYbs8rckv14KOXBZ37C1M7nR3NF2ZvOFgFxHgTn4J1N0KQNvSS/47soDmjrOftbzza8t7TnHvA4eT8XizAyLNt58lP7xB9WLVfHvlcQVJ+w7njuHtenYhOc7L5pnDuYXZs8fQ0bUjr5kxHPnqK0ZazKPfCmGl8IPdlpp+VOjwz4fHsvuHq2WeS4yzGqJPnTgiWBaNBYlwQPkupDodybQweo1IjUGOCuHS6hhO5K+paDKQfX/pAOOMhpIx35B1pwFgUyxC9FeCDJNX7jSzhFcPJSYjpY4xsWUhScLqzo128CRs9AqR7Hxgt3rlVC5+R2Xlx1vEQ2rhz1ZqhI/7O0FP9A1M7fe1gSe8rRsuFYO6pljAcCds596D0W4J4lHZzzx3Zmzrjo8PJVxsrQqIN5k200zqchpWH4ylewxmcOnpnURASGU1/04YyZv+J9DCM0UnevZ/Iba0N5iIorwkvYw85yujnL4WydLKodZr+RmbS06fRWYx2+KH9Itdg0XGyPKxZ9p18vTmAxnqydAHhI2Q0AjhCfyOUItIgc+ymCat4IkkfnPLkHeaGQWLrg43wIHsC00l28WazkF7uTg88We4YTInOGLVpCdn1WZty5yifyEC/7YHZfeqpHc7s1Ngf7ZVTqx6kOzmXY1wb/od3J/UT1458AgtYNTvgJHRRJ48OIE02b6fGDHHp7A3HW39FtlT/QOReupCNWQ/jXmxIkg9nd3tOZDQLaT93pRa+MOV4KB8SYwXd9ITcvoXG8k9klNrcmgXDk8VTCuauYPfTnJ3hRYoH8gfA/j2QFiv/1GjlmPwHrVE/0eKPjDTd0d558nFxbPK/MLVPX7NauO1iRHZ0HJSCRHIsTw0stAAAEABJREFUiX5QHGvpoDjhgIoNpBtSM4rwH7Q4DcXeR19MhOESqXrSenMIpjQGRcB0wwh4epRDDtiDSq9EHD4xXEKMbejFN8wevEoQF2575naUKFmWZCcGcQmOS4p6uRffMflydjQ7MfMo3jC18BOpwbMYSYcLzROIpikW9OILyywVxTEZQHRgxxGUO1I6UKdOgimFE0nKQeFHHtyXnDwiTivxH3Y0OZul7nDR8gtGiv6G6ukKsne0Rt9Q5Mu18FdZFQfxvzC1063cZy9UEAcVTeQLVWS30JRzoFDU40ZdfAkLZE9m7+ilL6RmmyVGlxosBQNqkN7xz6LUofQszz3RQBfFsSYdTB6HjZ4EZ2TjVrne0FL1heTlxcnE8cnVzOIQMGX3oOXICCeS2BaGB//w52y5ZHEIWPMgCrlx4VaOyW6YS9FsI1u2FwKyhj5RSwfF8eWWFWto2iBFJC0m//KzRxwIRqK2i/PDETDxUExB7RxiV5AdTMsD9eTqGVWrupAd1R9oe/qK5Ccyl9wfKImyKOsdLUu48S9MzRIds8MKHvwHjYILb98NQ1Jf2Cb4DQ0zokFxjMf8w6Pe3IuduJI+hFrwTz96JPs+ax9cPQ+qqfoPtMSQ5Q1Jyzekp9KJ1GZEOUvWoF8QTTgNxGSba+Uf6Og4KA4r6JeC4thubluKFS3bcCv/RH6hNFw6Ua0qxwn4E5Fq9r1ih+OfyFhq/kBkrk/UEzO2i9witSmZySw1bkhqtDGnnPSOyBEDxSR47yNgso2LE8SFo2khTHZiFVnCjQf/cK/aiZ6ZY1dwuRba9ODDpRuKYwlreEWJeisf6KWDuQemhQU5CySwHEoa+m9PY/pvGAF/XSYOtcZB0loZAdO1zknhG1oSu7GFCBAblGVbkmVbOfYTpShLnlxa6DvSZEm2ZUm21X+fuHq8Y/LlkhgVZZKYNdwhMv/EuWOYl/rAUGayQyeSVV9I3noxQVKEpAsPTgGjIDw1cZ6YGrJO1PfZZtkovfFouE0HbgfT+oLSvkI5ab/QcghxR9/4sERkjMz6xtS+PFOpvSASZtm4zAVOxAcRyMV5ci0dtHpYsXAEe0NSu0H2AzMVbSFV0aQe9PISwo3Aa4f4geyQqJ0oTrhQB5Va0hMllasncpJB6wdlyib6BbX0hbQ4indOXv6GVu6zd0y+XE/MDjRJ9kI9kZrmGDicVHaYHujFF9JjO03oUkLoK4qTVkAbhg5HPMiJ0T488gzSDcFIFEk54X86RUw8GGMC0sRILrd3lMw/cX4RETMeKxIwZWTQSeEbst+G4/wBsH8X1P53RP42CR8lyS+PmjrIOFbyjkxTmL84pj/8chT+SAknac+GFPIHzdMpnTkrQ+GTzYY848H5a2fVEzNGd9sWUsNog0+ZnIQebHIol8UWp4ItQrVkYfLDkWaKBA3rzA2nRGzpjjRi+S1mDQRr44lJ8H5EpsmB/J4AtvgsWLEbqD2QHe3+C6nlPd1P8w3ZGI5MSyL7AQxOnvrN5zdPbA+vO5C2sqktNRD1L6SWJ9LWO29Yknek6QPTs5wunjEx3RDsyZEOe5b6EIo7pic8mHuaQ4K0zqNJTk4eoyXwtx9N+dXoPHZwTxX4HfNVzNQauP5A5jFGiPQhJ7lztlXfkCYYN5IQJz8ie6otZBbjzvSiQbA7R7juDEnfQnalOdvfMXtbJTmQeViMLYHTf/h18fTcON3hN6etfCGQJwY+scUjsLPpjsl/vV8TOYvBi7OgfCF5W96QQp6bX+TCacz/HVen58LJ2IyavvDLR794dqbrwr6S/6mi0kch98QRMfSlQbiDjeHAxZkrX0jOFPGNT2VuTT388t6bWyJ9YWqH55YjDx78REQsN2VdMcmnn4MkDGIkM5bkD94Sv82s5gtH4GdKEh5kVXrYNd8K7wB46NRi040egt85+9BY3unsap0dqQwnQ2wepJMyI5vOjmog5Rj1dWdnUliclEliOEWy4YnhQUS2hLWrCfoNqZQvTL48b2V8CtFCfjACnofnuvT8iS2+h2PHX5ja6axpnifyBmh/MLBvB4/npG2jS+a3iAib6QdnaJREOmoNM9G04eKhy7OaFdTyPpxseBo+eHrwqXZD2StnTTs+kUIsl9LY3wTe3wjMVzXPDfQgcU3jhakx+99szR4z7OzcDekpD1JNTtp3PJHyseqJGeOR6cD7JUUCdvHJErM8ExuSYhFnPQS78wh47yNgPJV9aGksZ7q/7UKq07NektZq5ZkiwUa/c2S2JKJnOensfnI2po63Xmwzdy8Esiz37Bj55CVHaCdkx+QfHvlcBMEY5qGNg9G+/GeWRr6jgwem5/TspQfg64mXVSVgFYsEbNZFZefwNR2O5wfrb8g9d2Q0dWZHD8fLCVj2ffvcM5E5diWfXWQ/PAujg30LyHLaGK41IH1gK5lkMC3hl7MZfedQuhPTvafV0ppkx+Snk2D5/WYWcj6WvLMPnEYqSyf7L9bu7qYbvDhZ+ULyXNHfuFICXxd9RonhhT492SpnNHTh8YsNMoWefByCJV+VXgUHq4DY7Y7cE2cQo1pr+ODso5IldPG2cADtnac23nuSTmNWhPG0TUh6NAZ3T3f4X5haPHuCNz/ED+xuaidmOJwn8n2xPjpSeor0HJiUHGhbp8r5jQ5MkUWlxWTUyVNK9sSjIy3NCVjvuCPTCPlvrc8jYPRF7Gua0wVp/EUuoZsnrHozAjY6I+Sxo+PEXEYh9wO9q93V6cqC5F/YoQQ8PQDPSeyaFeCvxaWndjjSviDyQwrdW5qnr07A+JAYrRAs75hvzDdFOLAV+t6wctcny1RIEaHIb/OGuSs6fwCcvwSKvxPaloKbi+NyrRjc3Cv/RCtr7R2TL9cT2ZdecRY6KU5r7PSRUhXaB7Kj1U+URA3bUFLW4djk4kAwtZZwESlcORH/8JTSe0Pmyu9YKQ9LAmISAbtQlm1Jlm1Jlm1Jlm3lWA4QDyyFvyAz6bI99YX2cBu8uWRH+0CJOi59ILOSEi3dUBwvJajk3HVHcagaaB0kX236xRSFvlBviFbdidKK36jreKUnTqI+hFow0g0R4DZIy9Frv/OHrNW10Hek2dmJalzl1oWkspBFDJFNZlJQxeTLJS15oX9REqqmr5muuGrSaL6wWTkZKE53kAehskP0QC8OyikSD5TEDOxCmX/iHEi6zAsPsJfyitSi35zJ8g9EXpcrbaFiTXC4F93RlI3uX0QylTHrFZGrb5i74hkI2hYmKYh/YjuovmG0h3vxEz2zc5ls+HIIZgZ8oTipA4jyDTVcGqSIKefCyTwdRFO+3F75iZTpiilhlZO+ujjpAVpPKCdgCv9wVxfHuGDgWAhcSkD6A615+o6m3+iWZNmWZNlWjm2ZxE7U5NI/0FNnxpJsy5Jsq/92TB5PxavnhtEkyjHRKsonD7l4M6QdvfgLWhwrO6UDyaye6smX2ySYvlAUU/vErKUnkJ7ihEMdpql2lySw9TdEa/0NJUpMxlKX4OpZ9MEtUzXRoBZ6oRiafMWDnzgTULXD8L88XamDY9YxKzNL8HJRsHIsB4g/OIJonY4fjhBbDXYIrQvt8MvJ9Mcy/ft0A20Lsx9230kN3bJiIlfST5Smrp60JRm0fjBFoZ9oMr8qiBg1a0Py8oXJT7dyn71QC8vJy3fMjvAN06OcpZMaj/0ge6u/omVbBOxACRIbFIceqoo4qDkQbPLEkgbYjsk/PLIImL4wNZxntCVt8fIm4lgHt734Qu0oWPgbShRjymkXAVPEQSeVPUiCkYe/uTR16RslWfpwL93KsQ3HQSUDYbItyRpYqIWmgkM19Y2LQw2TCJ5A9MVhJaDxIw9aOROVWlMCppw3jHY6CaY87EQSuA0KX2iTd+egvTAaPkyZUM4rZ6b6DVHKFyZfnmW2heHOWlCXS5NLH2hZwo0fmHw5i1dGncyrB2wGYqJNOcHDRcFOkOyFekOjOk2DjQcXxygA0YHNs7Z0FS6+CUmPQvAvz7LUbxiCZw9w2NCJOt9mMnEWsqvZJ0q2CdiJkiLhP4gwbVYwjUFYeVF7bAfKBzo6/olW9xMw8ovLmbPscRKRRdxQUuriHJgUjzkBv3Ayy6iS/YZo1U1darD0iuKkBugVETGleKBySkiC404PihaWWxxCrWGqkyokT73QGr5QO1oq37EK6qA4hnkhANPlFLCNe3IutSTbsiTbsiT+AHj8pXFD/owIayRgMP5cSMyfIeFAeRA1ef7S+IOp/cPZNn+NXH08avjaHX74sb+c/mDu/dlBDZ0N/JV18uyEYE/eJeg7MsldrMVIag2Ls4MsQ8nohlFP3O6tvnh6h3MPfbGTz2goDsHSP6OQJPj+DVOnxqLqn8hKanMr/WMRR83eFudLjr3ZGX/yaHdnVXZk7xuyG7l3DXJPelFOnvxwRDq4tvEd03P62/3RcnGQPbmPfq7oPgJWEelfyJ7pIpldbGUeGp3xZtlPkt8GmRYKsej/0TvLjrUcYMELz7pThrTrhijlH0iN5Vjqeep8V++PRB1b9atWjY/7RXqqL0wepzE7qyavxn1PTO28l+4zp/dWO3h6fp0HZzNAjYwkEQjnF8sugC3Vi2iR8s5PpKf1/4Rsoa8XgBjX5IOWngIUkXehvfB5bSKNLEiW5ndkEz1d84pMsabzG+Z70s40pfSMn5yF7fnBdqAuZCeT7AjHWYoEj7o4QnedSC19/8X5iTr7gnkEmwJ4lnPfZCvCuYPY93wiPbmDphhtbGVdCCU4Vh4kwVLjEgyCUcGYQ2ltx+SHbwvTXTmBHQcnZVeNgBqBOeyD00Dx+oaNs7v6iVnBzvV7AlTQSJji6Vft4mjZT2d2/W/O7syybObCN+9O+A25r3xh8sOzKznYKbBd4PB8CAr38TGxyBtSiKX/xPSX0PdA7kIkLp0s/FiKmgvxGAxL1rYkuWdhS+HL83tk1/+E7Jp+XpA95QRsaL4FwgPKCShh9d6XbOlPnt13n3top5VNfMTk0eOHtnDb3T1vPFqcRVgydrMrWfY/MRrer2IAox8hBuk9ICJW8RtnCTeQMEM3F/N2KEOjk1cP0gO0J5i7IFg6mEv9w9vbNkKsfRkNOTA72EwNS5JnPJB+XtZ9QZxpIjpDbIAmhpOm0rSBfdSSprdIz5k/a+Gbd9cLP/S8NLt2TC08+Ky98WgvzsOx625ILI+/kHtC+KzRuXMMpUaghy3UY+FhC7m36gOzc/QM04tFmzYIFj4+Pc9aeR/TZlo/MD14XgVg9NUaNr7uAViGTsIlGE9lmvbqCPlvJf7k0W7eFcx+4qpx26xfPHecM2jlC5PHMxO8eZ6avh2TH37VGMcWJxvjFdlXQi2IJ2MDn0s9nJ7hPLJ8Q2pYytPPSH4T2k5OstXbAL9jZ2aI5bygS5PSV1gowRhPpKfqDVHKF5Ln/u4nf8No8bk+d7Of3nVFxsdpiEzHC0elSEzX+ME/ce6hzOfGEjQAABAASURBVD4m58nk0eOHtmPy5bmFYViaw5gNm0WTTaQQ45PglBlYnKw8SBJjJ43US/5nZCDLeA9b1q5obENHiz3I0EScGV5Jb+KDU+uuV8xI+nfkskj4zIWzN5wX5n93GKUIZOwllhfTczgt1f7C1E6nu/mOyf+j597be+a7WLneB8/n4LH5FjRmDg5r74nU0oeIsenGmSr/QGSehGWuGxNQd05OB8tHT344uzsA8gs0bWDk5NTSPm+kSm141tFVviMCM+2n8W9kX3qyChxj18lXnn3R3jDah/MHQKb6t0ARrRyTnWgN+0SLPybS9IaWZNm4cFAcm3whkAoufOkS+Ycfs3RYkm313wtSFTJOhyWSGG5cSrA4BEwiYA+sQmlHL/6CFsfKvdKFpMoZncw4Vp78dBJMKQRFSP6JLEkt8ECfvMVh1gO9+Ia5D7dNs2V7w6ThCyXq6klbkiAdl45YXrT8g0ZbznCzEzU1b5j8PziDmMUqEbNgYZjhHt5oqSiOyQCiA/iJK8lOZF04BRvEWgDtBg0nFx7tREnl0oWaQ+skf8Sf2Qzh6JYlkIBZ+UeQbTh2oqRIuDiRAQ36F1MU+okm81IGj4iIwawNycsXJj/dyr32Byo6/oLKjKSpipNM8HFxjMdOZKb8L6RmM4HbT2QaDZMIVEHNgWBSgzR4I9KI0g3TszyQ2gv60C01XZg8znMkkiIBkw5+wxm0F1ITx5+oViwOAVNGg0mCtuWUgyS2heHBzY+evzC1uCXsdHEM80Kg7MZzadQTV1eaqsOpYRIBA7HUcQxSa7BcbGhKUE7QVA3ZHYqaqGBKPyhFUk7rJCeSYMrDHhhJQmxi2VaO/UAtfmK6tNgDmW33DVHKFyZfniW2heEvKKHj0gcyIynR0kJ/o1cP2Ax0ui2OlXfI0jemmPpCBU10xBcUx+gA0QGwAA4f1ngIJ66kD6Ij+JfTotRvGKJT1mOl1hnZq7yQXZMlWjr4iUiKviG1SsgHVgqX1FwqEosW/1yWbJxGT7bFo2ehg/hfmBoujm1huKUYxLZsw638E/mF0nDpREnWnH8iu9q50M4EvtBe+Yl0N98x+XLgfnnml0iqrVhansxkloiHO7nDGmAHSpDYIHJInnWhVa6FEEwqR1v4y6tQ3TH5h7PUkmzLkmzLkmzLkmx/OgVZkm1ZnBO1+EJp4+2E/4VedZCdmS5EtTgETAdPvrx9K6csJYT/hal9ujhdMPhMf7i7STzETBSThJ9IUg7SY/8D6YlNlxQ8PGxyj84uS7ItS7Kt/jtxaQZTCaZ2Q2rloCTKgmrQJ8rUCMCKwyf+qtUjp/uGVMoXkucu2mSHRL8jBcRYdFx4esV5YmrIOlHf5zlbPrud+fDlthVJC224BAVjJ1fPotRLF1ou9QtaYsi6/pFicFMiG7NoE1FFU/tyWe3RjuTlC5PjotGS3H/iJFOZlWPRkuQPtBRbjXaJ7A8UhxpV0aQDlQPBkp3+5JoJ6UB2Nf9ESall0QNtREzLQ8W5ozV8QzldxDfU0hfSgoWgSwnh2RksJykvWpMvVHDzg5/ISgYsybYs/WcXx/b0g1DZBnxHNNtCjN1RnJQAfSE1r2IRrnCJaIn46SmnfkMpknKi/+VpTP2GESzbbLjcMlzEJ6qnKgHbuOmHssuA3hCt+oa2kZz/H4Di8BfJxhdEwvJnyPzx8QX5C2Qa8hdGduSvqKT0LZ2p/IUTRimNKYUNdiQ9JFHTcTgSFfpIogHwdEUbJbur91L0Ij0nUiXHUuQNDw5laYx6bQUKXMEmkhgEePJpTu1wmmYbCRrWnuJIxEonpnY6CdaHBrPrByPg/ahsIQ+kd8PrrRUf1fUEdnT6L6SW9/S3pvmGrE4ZSEugSFsxQnOSwXlV4i8f9Yh5YXaXp5kvCGfVtTs6Xv0NmRlLsRsTkMK7mXU7QqkmppGuSY/4FA5+4kr6IIaCu2d3+ImrB7g+KgRfq8j+sKNp4bY7XzU7qaEP56vIe/2EvaX3pJzkHbuF8o7sZ9coiZfTeK/QivXOJ7YXMffGGaQvwvPNs58iLanvvFvQd2Q+FKeb+MsrEvrfNpjdA5nArwcxvHg00vYe2KEEPBqwHsNcyNPfmqIdnv7kC5sSag0pdDes2PsgeV6KxZPzW5GnsTrN883RUwDROveJmR5PS6cIWMVgdg9mHzLCyZPj+d1OrRdO76GfSC19x13QpAGwlW/MPamemDFmMF6VKwAIVlKk50BSxhPpGxhOA/YQaYi4u6QZWDVg52l9SKFXCw3Y9TYIFt5PSmMTfrsiL3pielhKB5F64xdeXbmm96SfnRenpxwllvwLmaXcFzwxIpsCOAvSSwYQd/5HV9uo35BvK19InrtZyueEcEOEpg0RaAamiSQ6TrYKZF+c0mFHy8mXkPuivWG0w197IvKKtSpPjJKR4OFT5reo8IZ0MNTKiezNwpQOpLbSFPnNgNTxrF7l6lSK2Tl6sqoJrAkfj5AVBzt4dybg2QF05zuyIZbGE9lYDnLjDLcYxjXka9nKwv6jHxMLc08mi2g/SDEapb6jGG05MI8iSQ2480ucLHE8X8fHMLHzKOELSbGQWQvB7jwCnmemUCRg3Z3/9yB3BadexucwNB3dPWo63p1WZlZtRuGTzG5qvZRNO5K3HlxLOnVy5qovJJ/6xZFqbC5elXRuzs7WIuWr3jDal2d7aidCsNvO7P30c5Ckg+BYWQMcxG5rh/OFSfgOjHo4AqS/YUbJgY/fnpEUcaaIw5PHIwTZur4gWXoWsjvZ3EVGM5G7ZpIyOQo6SSzDF05bdyek7Y5VkHZkH0oWHWrWvPJpSOloeSANWB/0hrknH3Ei4+Ubpga9Lin5CLkkpYXbrirlZGC+sqvJg/Mbc8sPz77ob9gtFP7C1MZ7D2GuyDvYu/HR0SixdH428ui0YewJJxsrId2wLJzeLClP8sW5L2W894CMJHI/e5KtQn+jSOEnkpSDWy/DYSw/9KF/x9V7POCJuSfaidnGDMZFtd4Lv95KTzmIdfREfhNqGRwdTq38xDRED94raRk1OgyCHU+ouPO8KfecyLdcfO5oDT1LZjZ6di9MisdS/xOznIbsBFg5E8PZ1/qOdEVLGxjIU1D7La9YkfDZnMKHR84FNzx2LUwtDk3rzUNaI2B9JO8OHt+YPM5XZgMTbdywMvwFacUyPnV2D1/bwnF+WIwKee49/P8k/hKIX3hlqaRkSfzBUMGE4MFtC8NBadBP9NJB4QwQZSeuXunikqw5wcOjmIpJDAKyHXigFw9SpgcTYuwFKxFqK0hyrEEaQoQrZ8fkT189kZmKKaFcSqqc8JtDMPFgTEHtHGJXkB1MywO1+InqGVVLXciO6g+0PX3BmzNXvlCSPb32gWgSOi49cPXoDaNdzqRYqSoWxwqXHmgUHFmtk5+oEOqvaFRLjQeKkxyoPpgoeEz7uVpH7cWkGyr5l9PaOmivZQvtxanFDnZHyykSi8yYXJ8oSibEFqY3KS4cqsPFaX6ip6YNk3+6VmWh3xANXZzeRR5kUHaIHujFQTlF4oGSmIFdKKlc+kStY6/OhXY4vmPy0xlsvhDQyUNwxonSA9O2i1M2bZYaXxDJ1MactqR3RI7Y/eQ3pBDuhRm0y2Rbkq9/cEuL75h8OQ2YaNU7eukb0mybBZZ9OUQWJxqgE6XRF0rDJbCVb2RHux6ok0vNsyZaUdIXipNaGr4wtU9nvjURWYApB8SEGNvQyrMSvtH0mxZLsmxLsmwrx34gYpQ4qYKXe/GFzJom26MXyXdMbsk2/kBpNOkHZTQCY4khg9IDvfgLWhwrO6QDyaye6uQXhlCK0LQhghiXElI7URx6iIqmnCePtvwoQZt2V4hn+oXblnA7mHRDiRJc2lA9aU8yVWnQrxg1LoaCdmOHmjmpU8YXaqGpffnR84JImE9nC/lEK8flIlo5Fs9K8gdaiqXxRMs2uk8kGS5OakA0LwyEF/8MnaBj4bZLQivfUVK0SgnSk6eslHBxyk+0hm8op0p8Qy19IS2O4p2Tly9MfrqV++yFCuKfmB2pb5heiXh3cVg7uiGYPYm9o2U71UFyG45jQowNioNIVSJgv6jrOE2lblR58uXsqnaiONQwpTf4H70rjhnw4rPAXkgtu12cTJyLQzDjafkbrVm7Y/LxFO3JbZCd9hMlS0JWUXpBL+2BDEWxLdFhO1G2JVkBezCENHLSQXGsXy5OdDUQNyyDbyjyeNSgeqzel9wJ+A8iYG18QyF2yS/aaKxUeiTZB1fPwe5oeVWLzPwiSvWF5MLtcJEaHxRnydWgRZOMbjk58RvdaiNDd9TUvCM5XBzadbjQbAvDLdUaSHf04kFx/oWiXz3ZPUmjbB9J0YZjFKQTSaoHJTWXiuKEAxcPwWknPuwQLbcyUbBm7DK5TlwVb0hN4SdKw6UfREhbCjt615Of3k7YBzo6/olW7rHfEE14aqCK2YUmzuKHfmJKeMwJ+InMQGkdxd7RS9+R7vR4MClN0uLKSf6Jb8VoHx45y0Ev1MKTW1rS4MGL1vHGIo12C7LfMCui3zFKXJzg4SLBlFWDltODcGLyD+cPgPlLIX8Z5O+HyQCMDIl4/mWRPxyis5kE618Tv5FJisdfGW/IlvITuSK9Xc1c8OaHtnDrpW3esXaxaXh6cEgMmVm+JyTyL7aFEKOx1pDNEReyhyxCsuIs5Cn0U8u3RSet1nJIygcmP50Ey5tS3rGzCcuP3XfkttRz24FdhB5kNxYSBs7Lc8/o8MzhZFNPvrx9K8+9pEh0Mly+7oWOXs6aE1cvt3c2uDsiHWuW7IezKxoX9L4NGYqdzlryNMxMeQN7/0Jq6WCKjIcT2UKC2uSJLRGY4G20J8GRyhn6r8gIj04EmEuWWTDfC5w2Vd5SZSG9zf5CaizH2BAr57kbNqWWbznyIF3MNW6YG3EaiIz8EdnZ6l+Y2ul0N98xeUXeMHl/m+P+hRR5Cz9O+YZJ8RilwPSRdc8Pzh396gzg7dswd8WRaMvbuoSARUSaS0gwmmoNi6etvI3cGURM1t2vnAl6WpqQVkQse/GUI74iM/mW3BFkitayYnl64ixgXTJ8VRAwesPxo2dHGrIbiT52kwz/D3l/PvpAhufe7CvnPhToisOnFBXOXURGw9nzxtHyHppitKePLdWDl09fOPtqDRGYA3jJWgKnFr47OynQuGqB1EFunRLVJcFRqWXnjL5xGijO21LfOIuqn5iV1LljdHjy5b0nefZ94txBpJ2Y3h9nb7UHdifaiZkP/wPzdrxd2Uk+b89MvmXHWUwb7dHDmxKwFBjp/Buym48itngikxj7WEfS+IqMtXjiSri3GZj98XkD6tIOfkduaX0hy1u/IQRLG128GUJkM8n15mY0BbMj2Hekd+mkSFQYbs8rckv14KOXBZ37C1M7nR3NF2ZvOFgFxHgTn4J1N0KQNvSS/47soDmjrOftbzza8t7TnHvA4eRZY83VAAAQAElEQVT8XizAyLNt58lP7xB9WLVfHvlcQVJ+w7njuHtenYhOc7L5pnDuYXZs8fQ0bUjr5kxHPnqK0ZazKPfCmGl8IPdlpp+VOjwz4fHsvuHq2WeS4yzGqJPnTgiWBaNBYlwQPkupDodybQweo1IjUGOCuHS6hhO5K+paDKQfX/pAOOMhpIx35B1pwFgUyxC9FeCDJNX7jSzhFcPJSYjpY4xsWUhScLqzo128CRs9AqR7Hxgt3rlVC5+R2Xlx1vEQ2rhz1ZqhI/7O0FP9A1M7fe1gSe8rRsuFYO6pljAcCds596D0W4J4lHZzzx3Zmzrjo8PJVxsrQqIN5k200zqchpWH4ylewxmcOnpnURAmtq9pQ6b1//4fnVBqn5xa7u0+8r+R29ozyOaM9g5kKL8MFxGXnoxeOpAbo5zOUPNPZDY1hvMu0tlb/lZjW2sJ1HMjQ6iQRPzGeXJ6Am/ImpQYCXD3CHlLhCLS4OymCat4Isncjzw50ywNLYdeGIJPkSRWQnJhM3awGONu3p8dyS5Mic5Yel9x1qbcOXpOZGe/7YG549RTO5zZqXFvtFdOrXqQ7uRcjnFt+B/endRPXDvyCSxg1eyAk9BFnTw6gDTZvJ0aM8Slszccb/0V2VL9A5F76UI2Zj2Me7EhST6c3e05kdEspP3clVr4wpTjoXxIjBV00xNy+xYayz+RUWpzaxYMTxZPKZi7gt1Pc3aGFyn+V+QPgOIvhvlb4UJSLARdSrhziz8mot/R3nnycXFs8r8wtU9fs1q47WJEdnQclIJEciyJflAca+mgOOGAig2kG1IzivAftDgNxd5HX0yE4RKpetJ6cwimNAZFwHTDCHh6lEMO2INKr0QcPjFcQoxt6MU3zB68ShAXbnvmdpQoWZZkJwZxCY5Linq5F98x+XJ2NDsx8yjeMLXwE6nBsxhJhwvNE4imKRb04gvLLBXFMRlAdGDHEZQ7UjpQp06CKYUTScpB4Uce3JecPCJOK/EfdjQ5m6XucNHyC0aK/obq6Qqyd7RG31Dky7XwV1kVB/G/MLXTrdxnL1QQBxVN5AtVZLfQlHOgUNTjRl18CQtkT2bv6KUvpGabJUaXGiwFA2qQ3vHPotSh9CzPPdFAF8WxJh1MHoeNngRnZONWud7QUvWF5OXFycTxydXM4hAwZfeg5cgIJ5LYFoYH//DnbLlkcQhY8yAKuXHhVo7JbphL0WwjW7YXArKGPlFLB8Xx5ZYVa2jaIEUkLSb/8rNHHAhGoraL88MRMPFQTEHtHGJXkB1MywP15OoZVau6kB3VH2h7+orkJzKX3B8oibIo6x0tS7jxL0zNEh2zwwoe/AeNggtv3w1DUl/YJvgNDTOiQXGMx/zDo97ci524kj6EWvBPP3ok+z5rH1w9D6qp+g+0xJDlDUnLN6Sn0onUZkQ5S9agXxBNOA3EZJtr5R/o6DgoDivol4Li2G5uW4oVLdtwK/9EfqE0XDpRrSrHCfgTkWr2vWKH45/IWGq06A2VOh5Lz4Zply5xssRxt5Zoidz4mENJD5QgsUHkkEAxCd77CJhs4+IEceFoWgiTnVhFlnDjwT/cq3aiZ+bYFVyuhTY9+HDphuJYwhpeUaLeygd66WDugWlhQc4CCSyHkob+29OY/htGwF+XiUOtcZC0VkbAdK1zUviGlsRubCECxAZl2ZZk2VaO/UQpypInlxb6jjRZkm1Zkm313yeuHu+YfLkkRkWZJGYNd4jMP3HuGOalPjCUmezQiWTVF5K3XkyQFCHpwoNTwCgIT02cJ6aGrBP1fbZZNkpvPBpu04HbwbS+oLSvUE7aL7QcQtzRNz4sERkjs74xtS/PVGoviIRZNi5zgRPxQQRycZ5cSwetHlYsHMHekNRukP3ATEVbSFU0qQe9vIRwI/DaIX4gOyRqJ4oTLtRBpZb0REnl6omcZND6QZmyiX5BLX0hLY7inZOXv6GV++wdky/XE7MDTZK9UE+kpjkGDieVHaYHevGF9NhOE7qUEPqK4qQV0IahwxEPcmK0D488g3RDMBJFUk74n04REw/GmIA0MZLL7R0l80+cX0TEjMeKBEwZGXRS+Ibst+G4cHtyG5SQLuwfAPlbpXIuDMtfHkH+rIiVvCNTFOYvjukPvxyFP1LCSdqzIYX8QfN0SmfOylD4ZLMhz3hw/tpZ9cSM0d22hdQw2uBTJiehB5scymWxxalgi1AtWZj8cKSZIkHDOnPDKRFbuiONWH6LWQPB2nhiErwfkWlyIL8ngC0+C1bsBmoPZEe7/0JqeU/303xDNoYj05LIfgCDk6d+8/nNE9vD6w6krWxqSw1E/Qup5Ym09c4bluQdafrA9Cyni2dMTDcEe3Kkw56lPoTijukJD+ae5pAgrfNokpOTx2gJ/O1HU341Oo8d3FMFfsd8FTO1Bq4/kHmMESJ9yEnunG3VN6QJxo0kxMmPyJ5qC5nFuDO9aBDszhGuO0PSt5Bdac72d8zeVkkOZB4WY0vg9B9+XTw9N053+M1pK18I5ImBT2zxCOxsumPyX+/XRM5i8OIsKF9I3pY3pJDn5he5cBrzf8fV6blwMjajpi/88tEvnp3purCv5H+qqPRRyD1xRAx9aRDuYGM4cHHmyheSM0V841OZW1MPv7z35pZIX5ja4bnlyIMHPxERy01ZV2wS8cUz13oS6liyXfribeW3aS+I0cqXNjmQF5Rv2IGdM4Z13yeyj9rxv0F+t/azO5XhZIjNg9xDmZFNZ0c1kHKMOm/Z+EoD1FlExgZi+sLDDowcvjBypm7IXPnC5MvzVtqnEC3kByPgeXiuSc+f2OJ7OHb8hamdzprmeSJvgPYHA/t28HhO2ja65O23SRF1tiydockSqdQaprNpw8VDl2clK6jlfTjZ8DR88PTgU+2GslfOmnZ8IoVYLqWxvwm8vxGYr2qeG+hB4prGC1Nj9r/Zmj1m2Nm5G9JTHqSanLTveCLlY9UTM8Yj04H3S4oE7OKTJWZ5JjYkxSLOegh25xHw3kfAeCr70NJYznR/24VUp2e9JK3VyjNFgo1+58hsSUTPctLZ/eRsTB1vvdhm7l4IZFnu2THyyUuO0E7Ijsk/PPK5CIIxzEMbB6N9+c8sjXxHBw9Mz+nZSw/A1xMvq0rAKhYJ2KyLys7hazoczw/W35B77sho6syOHo6XE7Ds+/a5ZyJz7Eo+u8h+eBZGB/sWkOW0MVxrQPrAVjLJYFrCL2cz+s6hdCeme0+rpTXJjslPJ8Hy+80s5HwseWcfOI1Ulk72X6zd3U03eHGy8oXkuaK/caUEvi76jBLDC316slXOaOjC4xcbZAo9+TgES74qvQoOVgGx2x25J84gRrXW8MHZRyVL6OJt4QDaO09tvPckncasCONpm5D0aAzunu7wvzC1ePYEb36IH9jd1E7McDhP5PtifXSk9BTpOTApOdC2TpXzGx2YIotKi8mok6eU7IlHR1qaE7DecUemEfLfWp9HwOiL2Nc0pwvS+ItcQjdPWPVmBGx0RshjR8eJuYxC7gd6V7ur05UFyb+wQwl4egCek9g1K8Bfi0tP7XCkfUHkhxS6tzRPX52A8SExWiFY3jHfmG+KcGAr9L1h5a5PlqmQIkKR3+YNc9epp+fwzCVf2D8A5u+BRrBMVGOyOgETfzzUO1qtETDy8M218hPZT6PFWZg8TkvsdDrIW/lGdijVT5REDdtQUtbi2OTiQDC1lnARKVw5Ef/wlNJ7Q+bK71gpD0sCYhIBu1CWbUmWbUmWbUmWbeVYDhAPLIW/IDPpsj31hfZwG7y5ZEf7QIk6Ln0gs5ISLd1QHC8lqOTcdUdxqBpoHSRfbfrFFIW+UG+IVt2J0orfqOt4pSeupA+hFoy0UEUE0AZpqQba7/wha3Ut9B1pNruEalzlhlr5R8DIjERWS084OJxaOShpyQv9i5JQNX3NdMVVk0bzhc3KyUBxuoM8CJUdogd6cVBOkXigJGZgF8r8E+dA0mVeeIC9lFekFv3mTJZ/IPK6XGkLFWuCw73ojqZsdP8ikqmMWa+IXH3D3BXPQNC2MElB/BPbQfUNoz3ci5/omZ3LZMOXQzAz4AvFSR1AlG+o4dIgRUw5F07m6SCa8uX2yk+kTFdMCauc9NXFSQ/QekI5AVP4h7u6OMYFA8dC4FIC0h9ozdN3NP1GtyTLtiTLtnJsyyR2oiaX/oGeOjOWZFuWZFv9t2PyeCpePTeMJlGOiVZRPnnIxZsh7ejFX9DiWNkpHUhm9VRPvtwmwfSFopjaJ2YtPYH0FCcc6jBNtbskga2/IVrrbyhRYjKWugRXz6IPbpmqiQa10AvF0OQrHvzEmYCqHYb/5elKHRyzjlmZWYKXi4KVYzlA/MERROt0/HCE2GqwQ2hdaIdfTqY/lunfpxtoW5j9sPtOauiWFRO5kn6iNHX1pC3JoPWDKQr9RJP5VUHEqFkbkpcvTH66lfvshVpYTl6+Y3aEb5ge5Syd1HjsB9lb/RUt2yJgB0qQ2KA49FBVxEHNgWCTJ5Y0wHZM/uGRRcD0hanhPKMtaYuXNxHHOrjtxRdqR8HC31CiGFNOuwiYIg46qexBEow8/M2lqUvfKMnSh3vpVo5tOA4qGQiTbUnWwEItNBUcqqlvXBxqmETwBKIvDisBjR950MqZqNSaEjDlvGG000kw5WEnksBtUPhCm7w7B+2F0fBhyoRyXjkz1W+IUr4w+fIssy0Md9aCulyaXPpAyxJu/MDky1m8MupkXj1gMxATbcoJHi4KdoJkL9QbGtVpGmw8uDhGAYgObJ61patw8U1IehSCf3mWpX7DEDx7gMOGTtT5NpOJs5BdzT5Rsk3ATpQUCf9BhGmzgmkMwsqL2mM7UD7Q0fFPtLqfgJFfXM6cZY+TiCzihpJSF+fApHjMCfiFk1lGlew3RKtu6lKDpVcUJzVAr4iIKcUDlVNCEhx3elC0sNziEGoNU51UIeupGvQN01Bd0S39YBXUQXEM80IApsspYBv35FxiSbZlSbZlSbYffmiD/zd/UcxfI9dfIPmzIda/Xg6uWv5qiNC/LJ6Y2j+cCzpzIvdklzZMHj/2Jk9/sL3rjmgbZwPvXDV0CPbkXYK+I5PcxTqMpNawODvIMpSMbhj1xNzzgultX9qox04e7XQSLP2zCpIEz+80+mjlLPobewsftzCjYSfOF3Rvdfi6q3u3PPzX2dueD2QnZV6ZOk42PPcsHu1wilR4TuM7pud0djTfMXkuDrIn30oPV3QfAauI9C9kz3SRzC62Mg+Nzniz7CfJ74NMC4VY9P/onWXHWg6w4IVn3SlD2nVDlPIPpMZyLPU8db6r90eijq36VavGx/0iPdUXJo/TmJ1Vk1fjviemdt5L95nTe6sdPD2/zoOzGaBGRpIIhPOLZRfAlupFtEh55yfS0/p/QrbQ1wtAjGvyQUtPAYrIu9Be+Lw2kUYWJEvzO7KJnq55RaZY0/kN8z1pZ5pSesZPzsL2FDwg0QAAEABJREFU/GA7UBeyk0l2hOMsRYJHXRyhu06klr7/4vxEnX3BPIJNATzLuW+yFeHcQex7PpGe3EFTjDa2si6EEhwrD5JgqXEJBsGoYMyhtLZj8sO3hemunMCOg5Oyq0ZAjcAc9sFpoHh9w8bZXf3ErGDn+j0BKmgkTPH0q3ZxtOynM7v+N2d3Zlk2c+Gbdyf8htxXvjD54dmVHOwU2C5weD4Ehfv4mFjkDSnE0n9i+kvoeyB3IRKXThZ+LEXNhXgMhiVrW5Lcs7Cl8OX5PbLrf0J2TT8vyJ5yAjY03wLhAeUElLB670u29CfP7rvPPbTTyiY+YvLo8UNbuO3unjceLc4iLBm72ZUs+58YDe9XMYDRjxCD9B4QEav4jbOEG0iYoZuLeTuUodHJqwfpAdoTzF0QLB3Mpf7h7W0bIda+jIYc+P8pORdd23Vcx5L1//98e5ByEiczWWe3tySK1MPOrGo0sHBR2cFmaliSPOOB9POy7gviTBPRGWIDNDGcNJWmDeyjljS9RXrO/FkL37y7Xvih56XZtWNq4cFn7Y1He3Eejl13Q2J5/IXcE8Jnjc6dYyg1Aj1soR4LD1vIvVUfmJ2jZ5heLNq0QbDw8el51sr7mDbT+oHpwfMqAKOv1rDxdQ/AMnQSLsF4KtO0V0fIf1fiTx7t5l3B7CeuGrfN+sVzxzmDVr4weTwzwZvnqenbMfnhV41xbHGyMV6RfSXUgngyNvC51MPpGc4jyzekhqU8/YzkN6Ht5CRbvQ3wO3ZmhljOC7o0KX2FheSxMno27E4m70hP7u9+8jeMFp/r2cDSci5iJOPjNJS/Yubw1A6nucon5ql0rPtom3vK32rp3Tz3MISS5jDmw2bBZBMpxPJFD+woejBzC1H6G2Q/nqF/5emNsy3L2ISxYzh57EGGJuLt/UBq3f2KuS5zO3JZJHzmwvlNwvOLsQdGKQLZxmHpuJyWan9haqfT3XzH5P/oufn2nvkuVva9xXwOHst/PtWYOTgT7T2RWvoQMbpvnKnyD0TmSVjmujEBdefkdLB89OSHs7sDIL9A0wZGTk4t7fNGqtSGZx1d5TsiMNN+Gv9G9qUnq8Axdp185dkX7Q2j/bNzX3sH/ycr1kD6ghZ/RER/Q0uybFw4KI5NvhBIBRe+dIn8w49ZOizJtvrvBakKGafDEkkMNy4lWBwCJhGwB1ahtKMXf0GLY+Ve6UJS5YxOZhwrT346CaYUgiIk/0SWpBZ4oE/e4jDrgV58w9yH26bZsr1h0vCFEnX1pC1JkI5LRywvWv5Boy1nuNmJmpo3TP4PziBmsUrELFgYZriHN1oqimMygOgAfuJKshNZF07BBrEWQLtBw8mFRztRUrl0oebQOskf8Wc2Qzi6ZQkkYFb+EWQbjp0oKRIuTmRAg/7FFIV+osm8lMEjImIwa0Py8oXJT7dyr/2Bio6/oDIjaariJBN8XBzjsROZKf8LqdlM4PYTmUbDJAJVUHMgmNQgDd6INKJ0w/QsD6T2gj50S00XJo/zHImkSMCkg99wBu2F1MTxJ6oVi0PAlNFgkqBtOeUgiW1heHDzo+cvTC1uCTtdHMO8ECi78Vwa9cTVlabqcGqYRMBALHUcg9QaLBcbmhKUEzRVQ3aHoiYqmNIPSpGU0zrJiSSY8rAHRpIQm1i2lWM/UIufmC4t9kBm231DlPKFyZdniW1h+AtK6Lj0gcxISrS00N/o1QM2A51ui2PlHbL0jSmmvlBBEx3xBcUxOkB0ACyAw4c1HsKJK+mD6Aj+5bQo9RuG6JT1WKl1RvYqL2TXZImWDn4ikqJvSK0S8oGVwiU1l4rEosU/lyUbp9GTbfHoWegg/hemhotjWxhuKQaxLdtwK/9EfqE0XDpRkjXnP5Fd7VxoZwJfaK/8RLqb75h8OXBdvggrFPFA5TgKiU93Fd851NEtYgMoJcAGk+B5VnVyQTBJVpGASQrHF/7yKlR3TP7hLLUk27Ik27Ik27Ik259OQZZkWxbnRC2+UNp4O+F/oVcdZGemC1EtDgHTwZMvb9/KKUsJ4X9hap8uThcMPtMf7m4SDzETxSThJ5KUg/TY/4H0xKZLCh4eNrlHZ5cl2ZYl2Vb/nbg0g6kEU7shtXJQEmVBNegTZWoEYMXhE3/V6pHTfUMq5QvJcxdtskOi35ECYiw6Ljy94jwxNWSdqO/znC2f3c58+HLbiqSFNlyCgrGTq2dR6qULLZf6BS0xZF3/SDG4KZGNWbSJqKKpfbms9mhH8vKFyXHRaEnuP3GSqczKsWhJ8gdaiq1Gu0T2B4pDjapo0oHKgWDJTn9yzYR0ILuaf6Kk1LLogTYipuWh4tzRGr6hnC7iG2rpC2nBQtClhPDsDJaTlBetyRcquPnBT2QlA5ZkW5b+2cWxPf0gVLYB3xHNthBjdxQnJUBfSM2rWIQrXCJaIn56yqnfUIqknOh/eRpTv2EEyzYbLrcMF/GJ6qlKwDZu+qHsMqA3RKu+oW0kZ6KYzLaMApy4/i8AUfNHS2D+Aklycv4CSZ6/ngaKSdZfEfk7IhI9DM5fOlFSywoQSAVHJ3YUMQigRB8fnl3h07HvbL076TkRlRxjKPqDQ3NJtxEw+iLiECZIYhDgyac5tcNpysJAMPKJiOUPjHY6CcaPNqvPWUSs4nwMaYXHMmhmgOutEOy1m13V/0JqeU9/a5pvmL1oQFoCxUgZi9CcZHBelfjLRz0iH7h2oaSZ7zp3ltMRxKu/ITNjKdI/hBjOXrJR4eSJ4TwXSx3YbRou5eAnrqQPoi24O3f0o05cPcDoJGtFWmD/YY/m3JVBsK8H+z3gcBh5WybMtayJnMv+xm6hbUeG2TVK4uU03iu0Yr3zie1FzP1xBumL8Hzz7KdIS+o77xb0HZkPxekm/vKKhP53G8zugUzg14MYXjwaaXsP7FACHg1Yj2Eu5OlvTdEOT3/yhU0JtYYUuhtW7H2QPC/F4sn5rcjTWJ3m+eboKYBonfvETI+npVMErGIwuwezDxnh5Mnx/G6n1gun99BPpJa+4y5o0gDYyjfmnlRPzBgzGK/KFQAEKynScyAp44n0DQynAXuINETcHWkGSKIDBw++SOlIaZAG7HobBAvvJ6WxCb9dkRc9MT0so4NIvfELr65c03vSz86L01OOEkv+hcxS7gueGJFNAZwF6SUDiDv/o6tt1G/It5UvJM/dLOVzQrghQtOGCDQD00QSHSdbBbIvTumwo+XkS8h90d4w2uGvPRF5xVqVJ0bJSPDwKfNbVHhDOhhq5UT2ZmFKB1JbaYr8ZkDqeFavcnUqxewcPVnVBNaEj0fIioMdvDsT8OwAuvMd2RBL44lsLAe5cYZbDOMa8rVsZWH/6MfEwtyTySLaD1KMRqnvKEZbDsyjSFID7vwSJ0scz9fxMUzsPEr4QlIsZNZCsDuPgOeZKRQJWHfn/z/IXcGpl/E5DE1Hd4+ajnenlZlVm1H4JLObWi9l047krQfXkk6dnLnqC8mnfnGkGpuLVyWdm7OztUj5qjeM9uXZntqJEOy2M3s//Rwk6SA4VtYAB7Hb2uF8YRK+A6MejgDpb5hRcuDjt2ckRZwp4vDk8QhBtq4vSJaehexONneR0UzkrpmkTI6CThLL8IXT1t0JabtjFaQd2YeSRYeaNa98GlI6Wh5IA9YHvWHuyUecyHj5hqlBr0tKPkIuSWnhtqtKORmYr+xq8uD8xtzyw7Mv+ht2C4W/MLXx3kOYK/IO9m58dDRKLJ2fjTw6bRh7wsnGSkg3LAunN0vKk3xx7ksZ7z0gI4ncz55kq9DfKFL4iSTl4NbLcBjLD33o33H1Hg94Yu6JdmK2MYNxUa33wq+30lMOYh09kd+EWgZHh1MrPzEN0YP3SlpGjQ6DYMcTKu48b8o9J/ItF587WkPPkpmNnt0Lk+Kx1P/ELKchOwFWzsRw9rW+I13R0gYG8hTUfssrViR8Nqfw4ZFzwQ2PXQtTi0PTevOQ1ghYH8m7g8c3Jo/zldnARBs3rAx/QVqxjE+d3cPXtnCcHxajQp57D8/G5iQXdh390vl/AXj8VTB/GjTNB7ctDAerg9bwE704KJwBouzE1StdXJI1J3h4FFMxiUFAtgMP9OJByvRgQoy9YCVCbQVJjjVIQ4hw5eyY/OmrJzJTMSWUS0mVE35zCCYejCmonUPsCrKDaXmgFj9RPaNqqQvZUf2BtqcveHPmyhdKsqfXPhBNQselB64evWG0y5kUK1XF4ljh0gONgiOrdfITFUL9FY1qqfFAcZID1QcTBY9pP1frqL2YdMfkL65otB5or2UL7cXTgx/sjpapiVhkxuT6RDqpyeAE2cbhloRDdbg4zU/01LRh8k/Xqiz0G6Khi9O7yIMMyg7RA704KKdIPFASM7ALJZVLn6h17NW50A7Hd0x+OoPNFwI6eQjOOFF6YNp2ccqmzVLjCyKZ2pjTlvSOyBG7n/yGFMK9MIN2mWxL8vUPbmnxHZMvpwETrXpHL31Dmm2zwLIvh8jiRAN0ojT6Qmm4BLbyjexo1wN1cql51kQrSvpCcVJLwxem9unMtyYiCzDlgJgQYxtaeVbCN5p+02JJlm1Jlm3l2A9EjBInVfByL76QWdNke/Qi+Y7JLdnGHyiNJv2gjEZgLDFkUHqgF39Bi2Nlh3QgmdVTnfzCEEoRmjZEEONSQmonikMPUdGU8+TRlh8laNPuCvFMv3DbEm4Hk24oUYJLG6on7UmmKg36FaPGxVDQbuxQMyd1yvhCLTS1Lz96XhAJ8+lsIZ9o5bhcRCvH4llJ/kBLsTSeaNlG94kkw8VJDYjmhYHw4p+hE3Qs3HZJaOU7SopWKUF68pSVEi5O+YnW8A3lVIlvqKUvpMVRvHPy8oXJT7dyn71QQfwTsyP1DdMrEe8uDmtHNwSzJ7F3tGynOkhuw3FMiLFBcRCpSgTsF3Udp6nUjSpPvpxd1U4Uhxqm9Ab/0bvimAEvPgvshdSy28XJxLk4BDOelr/RmrU7Jh9P0Z7cBtlpP1GyJGQVpRf00h7IUBTbEh22E2VbkhWwB0NIIycdFMf65eJEVwNxwzL4hiKPRw2qx+p9yZ2A/yAC1sY3FGKX/KKNxkqlR5J9cPUc7I6WV7XIzC+iVF9ILtwOF6nxQXGWXA1aNMnolpMTv9GtNjJ0R03NO5LDxaFdhwvNtjDcUq2BdEcvHhTnv1D0qye7J2mU7SMp2nCMgnQiSfWgpOZSUZxw4OIhOO3Ehx2i5VYmCtaMXSbXiaviDakp/ERpuPSDCGlLYUfvevLT2wn7QEfHP9HKPfYboglPDVQxu9DEWfzQT0wJjzkBP5EZKK2j2Dt66TvSnR4PJqVJWlw5yT/xrRjtwyNnOeiFWnhyS0saPHjROt5YVLglWfYbtqIc03ugSeJA1eTxkGBWDTqS7A2Tf7qm1wul4VLx/L8A5A+H118Y+4dE/sL4ial9OFvmL42rLv7ayHJW8RdHtPCbH9rCrZe2NcAOHOAAABAASURBVEMNnU3DyXMHJIacOt3V37AthBgvqTXktREXsocsQrIiO4OH9970MB6t5Y0nvTuNWB/6wM4mLD9235FbUu9nZQG8FyxEwkJGpXf4fEHu7b7qVIKbH/X0jLOq9YXrXiZpnZ2Ue9cgGkUidWaoND+QpvJPZCa17HhgFiIF6qwE0zgz5Q29ISIs9Qevil7kg3aMHH5DesqzkgTjYkh0yP6o/8oZ6SyY3xdgDztITk4eWyqvGVbO/nxNdnwiPa0Xs57J2MabomX5kQfpzigy26kT4Y0XTvU9njPdxMwLpud0djffMXlF5ifvb8MDYaNxO0kiF0TlN2odxJgmtjTYGD6V7kMbZJ5ZqqykTl59QwqU09ch8oXA1EgYbeEDWbea0sCuvB4xWXa8IxvpaeuEtCJis2ZxpssfyEy+BZW+NhRvPD1x7lkdMPYTkYjkFLA1G54NCyn0jhOpMTjaf+T5RdILsvx2VwjTAZzl9IQDF2eWVzCaOtU3jpa30BSjPX1sqR68fPrC2VdriMAcwM1rCZxa+O7spEDjqgVSB7l1SlSXBEellp0z+sZpoDhvS33jLKp+YlZS547R4cmX957k2feJcweRdmJ6f5y91R7YnWgnZj78D8zb8XZlJ/m8PTP5lh1nMW20Rw9vSsBSYKTzb8huPorY4olMYuxjHUnjKzLW4okr4d5mYPbH5w2oSzv4Hbml9YUsb/2GECxtdPFmCJHNJNebm9EUzI5g35HepZMiUWG4Pa/ILdWDj14WdO4vTO10djRfmL3hYBUQ4018CtbdCEHa0Ev+HdlBc0ZZz9vfeLTlvac594DDyfm9WICRZ9vOk5/eIfqwar888rmCpPyGc8dx97w6EZ3mZPNN4dzD7Nji6WnakNbNmY589BSjLWdR7oUx0/hA7stMPyt1eGbC49l9w9WzzyTHWYxRJ8+dECwLRoPEuCB8llIdDuXaGDxGpUagxgRx6XQNJ3JX1LUYSD++9IFwxkNIGe/IO9KAsSiWIXorwAdJqvcbWcIrhpOTENPHGNmykKTgdGdHu3gTNnoESPc+MFq8c6sWPiOz8+Ks4yG0ceeqNUNH/J2hp/oHpnb62sGS3leMlgvB3FMtYTgStnPuQem3BPEo7eaeO7I3dcZHh5OvNlaERBvMm2indTgNKw/HU7yGMzh19M6iIExsX9OGTGffB7KBNma655+R29o7yIZc0V3IUH4ZLiQuPRm9dCA3RjmdoeafyGxqDOedpLO3/K3GttYSqOdGhlAhifiN8+T0BN6QNSkxEuDuEfKWCEWkwdlNE1bxRJK5H3lyplkaWg69MASfIkmshOTCZuxgMcbdvD87kl2YEp2x9L7irE25c/ScyM5+2wNzx6mndjizU+PeaK+cWvUg3cm5HOPa8D+8O6mfuHbkE1jAqtkBJ6GLOnl0AGmyeTs1ZohLZ2843vorsqX6ByL30oVszHoY92JDknw4u9tzIqNZSPu5K7XwhSnHQ/mQGCvopifk9i00ln8io9Tm1iwYniyeUjB3Bbuf5uwML1L8d2R/+xc+dp3/F4DKXwgpqn9JJHmg7ZSUYCcfF8cm/wtT+/Q1q4XbLkZkR8dBKUgkx5LoB8Wxlg6KEw6o2EC6ITWjCP9Bi9NQ7H30xUQYLpGqJ603h2BKY1AETDeMgKdHOeSAPaj0SsThE8MlxNiGXnzD7MGrBHHhtmduR4mSZUl2YhCX4LikqJd78R2TL2dHsxMzj+INUws/kRo8i5F0uNA8gWiaYkEvvrDMUlEckwFEB3YcQbkjpQN16iSYUjiRpBwUfuTBfcnJI+K0Ev/DjiZns9QdLlp+wUjR31A9XUH2jtboG4p8uRb+KqviIP4Xpna6lfvshQrioKKJfKGK7Baacg4UinrcqIsvYYHsyewdvfSF1GyzxOhSg6VgQA3SO/5ZlDqUnuW5JxroojjWpIPJ47DRk+CMbNwq1xtaqr6QvLw4mTg+uZpZHAKm7B60HBnhRBLbwvDgH/6cLZcsDgFrHkQhNy7cyjHZDXMpmm1ky/ZCQNbQJ2rpoDi+3LJiDU0bpIikxeRffvaIA8FI1HZxfjgCJh6KKaidQ+wKsoNpeaCeXD2jalUXsqP6A21PX5H8ROaS+wMlURZlvaNlCTf+halZomN2WMGD/6BRcOHtu2FI6gvbBL+hYUY0KI7xmH941Jt7sRNX0odQC/7pR49k32ftg6vnQTVV/4GWGLK8IWn5hvRUOpHajChnyRr0C6IJp4GYbHOt/AMdHQfFYQX9UlAc281tS7GiZRtu5Z/IL5SGSyeqVeU4AX8iUs2+V+xw/BMZS40WvSFlpfaDUtqJmmO5SeK4qySaimEWAXuihBgbpBwSKCbBex8Bk21cnCAuHE0LYbITq8gSbjz4h3vVTvTMHLuCy7XQpgcfLt1QHEtYwytK1Fv5QC8dzD0wLSzIWSCB5VDS0P/2NKb/hhHw12XiUGscJK2VETBd65wUvqElsRtbiACxQVm2JVm2lWM/UYqy5Mmlhb4jTZZkW5ZkW/33iavHOyZfLolRUSaJWcMdIvNPnDuGeakPDGUmO3QiWfWF5K0XEyRFSLrw4BQwCsJTE+eJqSHrRH2fbZaN0huPhtt04HYwrS8o7SuUk/YLLYcQd/SND0tExsisb0ztyzOV2gsiYZaNy1zgRHwQgVycJ9fSQauHFQtHsDcktRtkPzBT0RZSFU3qQS8vIdwIvHaIH8gOidqJ4oQLdVCpJT1RUrl6IicZtH5QpmyiX1BLX0iLo3jn5OVvaOU+e8fky/XE7ECTZC/UE6lpjoHDSWWH6YFefCE9ttOELiWEvqI4aQW0YehwxIOcGO3DI88g3RCMRJGUE/6nU8TEgzEmIE2M5HJ7R8n8E+cXETHjsSIBU0YGnRS+IfttOC7cntwGJaQnoknouHTD8/8C8PjL4y/OXzrnL47KnxH5o2S0cZThJO3ZkELWnU7pzPPXzOGTsS2U+oPz10suZVV0ugLp2pEejDbq2ZLa8gDtUanXrvAstivi7hHDFzYlYF1UpPaJFDA+oO0N4XnUiUnwfgS7UgPyewIYtcYDIdiwboQtZEf1v5Ba3tP9NN+QTeHItCSyF8Dg5KnffH7zxPbw9gNpK5vaUgNR/0JqeSJtvfOGJXlHmj4wPcvp4hkT0w3BnhzpsGepD6G4Y3rCg7mnOSRI6zya5OTkMVoCf/vRlF+NzmMH91SB3zFfxUytgesPZB5jhEgfcpI7Z1v1DWmCcSMJcfIjsqfaQmYx7kwvGgS7c4TrzpD0LWRXmrP9HbO3VZIDmYfF2BI4/YdfF0/PjdMdfnPayhcCeWLgE1s8Ajub7pj81/s1kbMYvDgLyheSt+UNKeS5+UUunMb8v+Pq9Fw4GZtR0xd++egXz850XdhX8h9VVPoo5J44Ioa+NAh3sDEcuDhz5QvJmSK+8anMramHX957c0ukL0zt8Nxy5MGDn4iI5aasKzaJ+ObnIAl1jET6B2wLv82s5wtH4GdKEh7kBelh6XwrvAPgoVOLTTd6CH7n7ENjeaezq3V2pDKcDLF5kE7KjGw6O6qBlGPU152dSWFxUiaJ4RTJhieGBxHZEtauJug3pFK+MPnyvJXxKUQL+cEIeB6e69LzJ7b4Ho4df2Fqp7OmeZ7IG6D9wcC+HTyek7aNLpnfIiJsph+coVES6ag1zETThouHLs9qVlDL+3Cy4Wn44OnBp9oNZa+cNe34RAqxXEpjfxN4fyMwX9U8N9CDxDWNF6bG7L/Zmj1m2Nm5G9JTHqSanLTveCLlY9UTM8Yj04H3S4oE7OKTJWZ5JjYkxSLOegh25xHw3kfAeCr70NJYznR/24VUp2e9JK3VyjNFgo1+58hsSUTPctLZ/eRsTB1vvdhm7l4IZFnu2THyyUuO0E7Ijsk/PPK5CIIxzEMbB6N9+c8sjXxHBw9Mz+nZSw/A1xMvq0rAKhYJ2KyLys7hazoczw/W35B77sho6syOHo6XE7Ds+/a5ZyJz7Eo+u8h+eBZGB/sWkOW0MVxrQPrAVjLJYFrCL2cz+s6hdCeme0+rpTXJjslPJ8Hy+80s5HwseWcfOI1Ulk72L9bu7qYbvDhZ+ULyXNHfuFICXxd9RonhhT492SpnNHTh8YsNMoWefByCJV+VXgUHq4DY7Y7cE2cQo1pr+ODso5IldPG2cADtnac23nuSTmNWhPG0TUh6NAZ3T3f4X5haPHuCNz/ED+xuaidmOJwn8n2xPjpSeor0HJiUHGhbp8r5jQ5MkUWlxWTUyVNK9sSjIy3NCVjvuCPTCPnvWp9HwOiL2Nc0pwvS+ItcQjdPWPVmBGx0RshjR8eJuYxC7gd6V7ur05UFyb+wQwl4egCek9g1K8Bfi0tP7XCkfUHkhxS6tzRPX52A8SExWiFY3jHfmG+KcGAr9L1h5a5PlqmQIkKR3+YNc9epp+fwzCW/Ye6OMEg515T8jz8aytS+0WqNgJGHb66VnyjZaOIsdFJcJFigPlIUwT+QHa1+oiRq2IaSsg7HJhcHgqm1hItI4cqJ+IenlN4bMld+x0p5WBIQkwjYhbJsS7JsS7JsS7JsK8dygHhgKfwFmUmX7akvtIfb4M0lO9oHStRx6QOZlZRo6YbieClBJeeuO4pD1UDrIPlq0y+mKPSFekO06k6UVvxGXccrPXElfQi1YKQbIsBtkBbZGnjnjzatroW+I83OMlTjKrcuJJWFLGKIbDKTgiomXy5pyQv9i5JQNX3NdMVVk0bzhc3KyUBxuoM8CJUdogd6cVBOkXigJGZgF8r8E+dA0mVeeIC9lFekFv3mTJZ/IPK6XGkLFWuCw73ojqZsdP8ikqmMWa+IXH3D3BXPQNC2MElB/BPbQfUNoz3ci5/omZ3LZMOXQzAz4AvFSR1AlG+o4dIgRUw5F07m6SCa8uX2yk+kTFdMCauc9NXFSQ/QekI5AVP4h7u6OMYFA8dC4FIC0h9ozdN3NP1GtyTLtiTLtnJsyyR2oiaX/gM9dWYsybYsybb6b8fk8VS8em4YTaIcE62ifPKQizdD2tGLv6DFsbJTOpDM6qmefLlNgukLRTG1T8xaegLpKU441GGaandJAlt/Q7TW31CixGQsdQmunkUf3DJVEw1qoReKoclXPPiJMwFVOwz/y9OVOjhmHbMyswQvFwUrx3KA+IMjiNbp+OEIsdVgh9C60A6/nEx/LNN/n26gbWH2w+47qaFbVkzkSvqJ0tTVk7Ykg9YPpij0E03mVwURo2ZtSF6+MPnpVu6zF2phOXn5jtkRvmF6lLN0UuOxH2Rv9Ve0bIuAHShBYoPi0ENVEQc1B4JNnljSANsx+YdHFgHTF6aG84y2pC1e3kQc6+C2F1+oHQULf0OJYkw57SJgijjopLIHSTDy8DeXpi59oyRLH+6lWzm24TioZCBMtiVZAwu10FRwqKa+cXGoYRLBE4i+OKwENH7kQStnolJrSsCU84bRTifBlIedSAJQCd5XAAAQAElEQVS3QeELbfLuHLQXRsOHKRPKeeXMVL8hSvnC5MuzzLYw3FkL6nJpcukDLUu48QOTL2fxyqiTefWAzUBMtCkneLgo2AmSvVBvaFSnabDx4OIYBSA6sHnWlq7CxTch6VEI/uVZlvoNQ/DsAQ4bOlHn20wmzkJ2NftEyTYBO1FSJPwHEabNCqYxCCsvao/tQPlAR8c/0ep+AkZ+cTlzlj1OIrKIG0pKXZwDk+IxJ+AXTmYZVbLfEK26qUsNll5RnNQAvSIiphQPVE4JSXDc6UHRwnKLQ6g1THVShaynatB31OJFSwsvbIY6KI5hXgjAdDkFbOOenMstybYsybYsyfbDD22hNHVx0jsggwn/618S+VPiO85fMaf2kfO3xNZP5A+L/ImRlfyFlBkuah4kmV560l8tPXhn7tiu6MtZiK0eNEiMtmhdtnglQiyXPpF+7k9zsqnSh5b3lWf/xtM7Ovegx04+o6E4BEv/rIAkwbv7iSyq/omspDa3Zlc4bFLIfEHvQy6uO7p3y8N/PSvYkX3tfXB2IvcFg6sX5eTJD0ekg2c0vmN6Tn/c13dEy8VB9lRLGM5SLJwa90KIX5w9UyWhnza2ZGTjKLwHAZ0GjAQRi/6Pnt82OzpL8sWzjvK0QXJdyIVk1T+QWvuL88amDU8+35y3THnx/CZZX0TbMXmcgc4deZH9T2wfepFd2dv80J6Ynl/vN3U3NXD4ml0/GKvJUgfoyfuacd8nUmvfPyFb6GN1Ls4TigeH1BLSFmyNcPB5XSKvRUyWRe/IBnoYpyX9T84UMsVYisV8T8YQ4OkZPzkL2/OD7UBdyG4m2RGOsxQJHnVxhO46kVr6/sX7c9L/gnlEKqwlJdaicC8KI31HGXd9IrW8j+YYbexgVwglOFYeJMFSyxV0IvYmMIzicyiNh2+1dFdOyNiJ7CsP0kWe+2b0jdNA8fqGjbOz+ol5Jju6mr7g7tkTfkP6yxcm/2df93FV3sFYPuXyvoueG3JP+cLkh7OgKtgp8M77+O5PoJy2pAvzENIUkhbZ8IXcm2E6MgTrUC5ZnBQ1EaHWPG1JsnchEnViNDy/R3eT/zOya+ayil3lBCxrULMqbBAxbz88YvOlP3l2352N6eWq0cN3Z9te47do31+YWvzY25ydX9j9fBLW3eUJzHRH3hD+D8iO+WaSzAI/HI1txNm/kgWp4MxSZXTl4Q/PW/kk2tITeMO8mdXMYknYCTB4cebKF5KzjQiniQ3QxHDSVJo2sI9a0vQW6TnzZy188+564YfOU/OdrJ17wlM7MPck/wtTe3EWYtfdkFgefyG7Q3L/IFmtYb2EEbIxdBK2Mknk3lYfmF2jp40ZLNq0QbDw8el51sq5qz1gfqfZ2WHkhdSqB5F4VSisZMN1D8AwOgmXYPQzRXt1hNwVf/JoN+8KZj9x1bht1i+eO84ZtPKFyeOZCd48T03fjskPv2qMY4uTjfGK7CuhFsSTsYHPpR5Oz3AeWb4hNSzl6WckvwltJyfZ6m2A37EzM8RyXtClSekrLCSPldHziyjVF/7f//Wu7o+O5z07Tx6f63N3RpjnotWeEcqrlowybNNhNBNTHT/4J849lNnDZHbe/NB2TL48tzAMy6Kw2UNGQkxlvJzdNCbNly1EqR4kibGTBuol/9/IQJZxP1vWrmhsQ0eLPcjQRJyZvHpmHpxa9VdkffUduWxWRMzohbww/7nnriAF6mUXpufw7En+F6Z2Orua75j8H7130XsiL+T7WLneB5/PI5JvtQj7N1HtDAFjQ3pxCHZwptAw2rkXmWJsOGWeglGoNaAOMtE+AoZGJ8nUk89ipHRSxyDLIFgvA/v24ozPKHNo6bk4AqT93PE35ip2dGXmnnzVsi89bxjtn5397V34s5P7+ozB/yl/FcyfA1+xBVqs/qOHfbLDVBQnzDeUhr/gMUtHe8otGxe+YaahsqNLJDF84+JYwhp+sQr1Hb34C1ociytvKEOx0ZPgWHlqp5NgSiEoQvJPZElqgQf65C0Osx7oxTfMfbhtmi3bGyYNXyhRV0/akgTpuHTE8qLlHzTacoabnaipecPk/+AMYharRMyChWGGe3ijpaI4JgOIDuAnriQ7kXXhFGwQawG0GzScXHi0EyWVSxdqDq2T/BF/ZjOEo1uWQAJm5R9BtuHYiZIi4eJEBjToX0xR6CeazEsZPCIiBrM2JC9fmPx0K/faH6jo+AsqM5KmKk4ywcfFMR47kZnyv5CazQRuP5FpNEwiUAU1B4JJDdLgjUgjSjdMz/JAai/oQ7fUdGHyOM+RSIoETDr4DWfQXkhNHH+iWrE4BEwZDSYJ2pZTDpLYFoYHNz96/sLU4paw08UxzAuBshvPpVFPXF1pqg6nhkkEDMRSxzFIrcFysaEpQTlBUzVkdyhqooIp/aAUSTmtk5xIgikPe2AkCbGJZVs59gO1+Inp0mIPZLbdN0QpX5h8eZbYFoa/oISOSx/IjKRESwv9jV49YDPQ6bY4Vt4hS9+YYuoLFTTREV9QHKMDRAfAAjh8WOMhnLiSPoiO4F9Oi1K/YYhOWY+VWmdkr/JCdk2WaOngJyIp+obUKiEfWClcUnOpSCxa/HNZsnEaPdkWj56FDuJ/YWq4OLaF4ZZiENuyDbfyT+QXSsOlEyVZc/4T2dXOhXYm8IX2yk+ku/mOyZcD98szv0RStSiOV+bmghkPHl7usAaqB0qQ2CBySJ51oVWuhRBMKkdb+MurUN0x+Yez1JJsy5Jsy5Jsy5JsfzoFWZJtWZwTtfhCaePthP+FXnWQnZkuRLU4BEwHT768fSunLCWE/4Wpfbo4XTD4TH+4u0k8xEwUk4SfSFIO0mP/B9ITmy4peHjY5B6dXZZkW5ZkW/134tIMphJM7YbUykFJlAXVoE+UqRGAFYdP/FWrR073DamULyTPXbTJDol+RwqIsei48PSK88TUkHWivs9ztnx2O/Phy20rkhbacAkKxk6unkWply60XOoXtMSQdf0jxeCmRDZm0Saiiqb25bLaox3Jyxcmx0WjJbn/xEmmMivHoiXJH2gpthrtEtkfKA41qqJJByoHgiU7/ck1E9KB7Gr+iZJSy6IH2oiYloeKc0dr+IZyuohvqKUvpAULQZcSwrMzWE5SXrQmX6jg5gc/kZUMWJJtWfpnF8f29INQ2QZ8RzTbQozdUZyUAH0hNa9iEa5wiWiJ+Okpp35DKZJyov/laUz9hhEs22y43DJcxCeqpyoB27jph7LLgN4QrfqGtpGciWIy2zIKcMdop3tqRKP97/aXTYQb5y+F/B0Rib8Wnn/pRMlfGOmdv3zCUws/MRoClhWHQ9sxPJE+dlW/IfeVB6mSY2nmLQ8OZWmMem0FClzBBpIYBHjyaU7tcJpmGwka1p7iSMRKJ6Z2OgnWhwaz6wcj4P2obCEPpHfD660VH9X1BHZ0+i+klvf0Py+ab8jqlIG0BIq0FSM0JxmcVyX+8lGPmBdmd3ma+YJwVl27o+PV35CZsRS7MQEpvJtZtyOUamIa6Zr0iE/h4CeupA9iKLh7doefuHqA66NC8LWK7A87mhZuu/NVs5Ma+nC+irzXT9hbek/KSd6xWyjvyH52jZJ4OY33Cq1Y73xiexFzb5xB+iI83zz7KdKS+s67BX1H5kNxuom/vCKh/90Gs3sgE/j1IIYXj0ba3gM7lIBHA9ZjmAt5+ltTtMPTn3xhU0KtIYXuhhV7HyTPS7F4cn4r8jRWp3m+OXoKIFrnPjHT42npFAGrGMzuwexDRjh5cjy/26n1wuk99BOppe+4C5o0ALbyjbkn1RMzxgzGq3IFAMFKivQcSMp4In0Dw2nAHiINEXdHmgGS6MDOXyTdWmjArrdBsPB+UnY14bcr8qInpoeddBCpN37h1ZVrek/62XlxespRYsm/kFnKfcETI7IpgLMgvWQAced/dLWN+g35tvKF5LmbpXxOCDdEaNoQgWZgmkii42SrQPbFKR12tJx8Cbkv2htGO/y1JyKvWKvyxCgZCR4+ZX6LCm9IB0OtnMjeLEzpQGorTZHfDEgdz+pVrk6lmJ2jJ6uawJrw8QhZcbCDd2cCnh1Ad74jG2JpPJGN5SA3znCLYVxDvpatLOwf/ZhYmHsyWUT7QYrRKPUdxWjLgXkUSWrAnV/iZInj+To+homdRwlfSIqFzFoIducR8DwzhSIB6+78/we5Kzj1Mj6Hoeno7lHT8e60MrNqMwqfZHZT66Vs2pG89eBa0qmTM1d9IfnUL45UY3PxqqRzc3a2Filf9YbRvjzbUzsRgt12Zu+nn4MkHQTHyhrgIHZbO5wvTMJ3YNTDESD9DTNKDnz89oykiDNFHJ48HiHI1vUFydKzkN3J5i4ymoncNZOUyVHQSWIZvnDaujshbXesgrQj+1Cy6FCz5pVPQ0pHywNpwPqgN8w9+YgTGS/fMDXodUnJR8glKS3cdlUpJwPzlV1NHpzfmFt+ePZFf8NuofAXpjbeewhzRd7B3o2PjkaJpfOzkUenDWNPONlYCemGZeH0Zkl5ki/OfSnjvQdkJJH72ZNsFfobRQo/kaQc3HoZDmP5oQ/9O67e4wFPzD3RTsw2ZjAuqvVe+PVWespBrKMn8ptQy+DocGrlJ6YhevBeScuo0WEQ7HhCxZ3nTbnnRL7l4nNHa+hZMrPRs3thUjyW+p+Y5TRkJ8DKmRjOvtZ3pCta2sBAnoLab3nFioTP5hQ+PHIuuOGxa2FqcWhabx7SGgHrI3l38PjG5HG+MhuYaOOGleEvSCuW8amze/jaFo7zw2JUyHPv4dnYnOTCrqN/YWp4jA29Jxj+P9vCcBDFBq3hJ3pxUHh6Tly9kmxqkizVxTnyIBTduHArx35DyzZlg4H/Qq0+UBzjMdCyYg1NCcrZMfnTV0/kLLghtfKFyU8nwcT7MQW1c4hdQXYwLQ/U4ieqZ1QtdSE7qj/Q9vQFb85c+UJJ9vTaB6JJ6Lj0wNWjN4x2OZNipapYHCtceqBRcGS1Tn6iQqi/olEtNR4oTnKg+mCi4DHt52odtReT7pj8y2lVaqA9y344tdiq6o5efCE7mn2iZJsQWwjH0CVF2lyc1k60hm8o8k/Xqiz0G6Khi9Pd5EEGZYfogV4clFMkHiiJGdiFksqlT9Q69upcaIfjOyY/ncHmCwGdPARnnCg9MG27OGXTZqnxBZFMbcxpS3pH5IjdT35DCuFemEG7TLYl+foHt7T4jsmX04CJVr2jl74hzbZZYNmXQ2RxogE6URp9oTRcAlv5Rna064E6udQ8a6IVJX2hOKml4QtT+3TmWxORBZhyQEyIsQ2tPCvhG02/abEky7Yky7Zy7AciRomTKni5F1/IrGmyPXqRfMfklmzjD5RGk35QRiMwlhgyKD3Qi7+gxbGyQzqQzOqpTn5hCKUITRsiiHEpIbUTxaGHqGjKefJoy48StGl3hXimX7htCbeDSTeUKMGlDdWT9iRTlQb9ilHjels7GQAAEABJREFUYihoN3aomZM6ZXyhFpralx89L4iE+XS2kE+0clwuopVj8awkf6ClWBpPtGyj+0SS4eKkBkTzwkB48c/QCToWbrsktPIdJUWrlCA9ecpKCRen/ERr+IZyqsQ31NIX0uIo3jl5+cLkp1u5z16oIP6J2ZH6humViHcXh7WjG4LZk9g7WrZTHSS34TgmxNigOIhUJQL2i7qO01TqRpUnX86uaieKQw1TeoP/6F1xzIAXnwX2QmrZ7eJk4lwcghlPy99ozdodk4+naE9ug+y0nyhZErKK0gt6aQ9kKIptiQ7bibItyQrYgyGkkZMOimP9cnGiq4G4YRl8Q5HHowbVY/W+5E7AfxABa+MbCrFLftFGY6XSI8k+uHoOdkfLq1pk5hdRqi8kF26Hi9T4oDhLrgYtmmR0y8mJ3+hWGxm6o6bmHcnh4tCuw4VmWxhuqdZAuqMXD4rzXyj61ZPdkzTK9pEUbThGQTqRpHpQUnOpKE44cPEQnHbiww7RcisTBWvGLpPrxFXxhtQUfqI0XPpBhLSlsKN3Pfnp7YR9oKPjn2jlHvsN0YSnBqqYXWjiLH7oJ6aEx5yAn8gMlNZR7B299B3pTo8Hk9IkLa6c5J/4Voz24ZGzHPRCLTy5pSUNHrxoHW8sKtzSJ0qmJs6OLidgRx5MazC7Bx1J9obJP13T64XScGlDcnHSMyBSMunjfwOQvz4+/tLYvy5G4++HzU/kr4zVN2R1/sI4zq7yhVsvMn+ljI6js2E4ee6AxJBTp7v6G7aFEOPWWkNeGXEhe8giJCuyM3h4700P49Fa3njSu9OI9aEP7GzC8mP3Hbkl9X5WFsB7wUIkLGRUeofPF+Te7qtOJbj5UU/POKtaX7juZZLW2Um5dw2iUSRSZ4ZK8wNpKv9EZlLLjgdmIVKgzkowjTNT3tAbIsJSf/Cq6EU+aMfI4TekpzwrSTAuhkSH7I/6r5yRzoL5fQH2sIPk5OSxpfKaYeXsz9dkxyfS03ox65mMbbwpWpYfeZDujCKznToR3njhVN/jOdNNzLxgek5nd/Mdk1dkfvL+NjwQNhq3kyRyQVR+o9ZBjGliS4ON4VPpPrRB5pmlykrq5NU3pEA5fR0iXwhMjYTRFj6QdaspDezK6xGTZcc7spGetk5IKyI2axZnuvyBzORbUOlrQ/HG0xPnntUBYz8RiUhOAVuz4dmwkELvOJEag6P9R55fJL0gy293hTAdwFlOTzhwcWZ5BaOpU33jaHkLTTHa08eW6sHLpy+cfbWGCMwB3LyWwKmF785OCjSuWiB1kFunRHVJcFRq2Tmjb5wGivO21DfOouonZiV17hgdnnx570mefZ84dxBpJ6b3x9lb7YHdiXZi5sP/wLwdb1d2ks/bM5Nv2XEW00Z79PCmBCwFRjr/huzmo4gtnsgkxj7WkTS+ImMtnrgS7m0GZn983oC6tIPfkVtaX8jy1m8IwdJGF2+GENlMcr25GU3B7Aj2HeldOikSFYbb84rcUj346GVB5/7C1E5nR/OF2RsOVgEx3sSnYN2NEKQNveTfkR00Z5T1vP2NR1vee5pzDzicnN+LBRh5tu08+ekdog+r9ssjnytIym84dxx3z6sT0WlONt8Uzj3Mji2enqYNad2c6chHTzHachblXhgzjQ/kvsz0s1KHZyY8nt03XD37THKcxRh18twJwbJgNEiMC8JnKdXhUK6NwWNUagRqTBCXTtdwIndFXYuB9ONLHwhnPISU8Y68Iw0Yi2IZorcCfJCker+RJbxiODkJMX2MkS0LSQpOd3a0izdho0eAdO8Do8U7t2rhMzI7L846HkIbd65aM3TE3xl6qn9gaqevHSzpfcVouRDMPdUShiNhO+celH5LEI/Sbu65I3tTZ3x0OPlqY0VItMG8iXZah9Ow8nA8xWs4g1NH7ywKwsT2NW3IdPb9J2YO777/+z9GmPjk3NbaYC6C8prwMubJUUY/fymUpZNFrdP0NzKTnj6JzmK0ww/tF7kGi46T5WHNsu/k680BNNaTpQsIHyGjEcAR+luhFJEGmWM3TVjFE0n64JQn7zA3DBJbH2yEB9kTmE6yizebhfRyd3rgyXLHYEp0xqhNS8iuz9qUO0f5RAb6bQ/M7lNP7XBmp8b+aK+cWvUg3cm5HOPa8D+8O6mfuHbkE1jAqtkBJ6GLOnl0AGmyeTs1ZohLZ2843vorsqX6ByL30oVszHoY92JDknw4u9tzIqNZSPu5K7XwhSnHQ/mQGCvopifk9i00ln8io9Tm1iwYniyeUjB3Bbuf5uwML1L8d2R/+xc+d5VTO5HvSs5Dct/5vwFoW5gS7OTj4tjkf2Fqn75mtXDbxYjs6DgoBYnkWBL9oDjW0kFxwgEVG0g3pGYU4T9ocRqKvY++mAjDJVL1pPXmEExpDIqA6YYR8PQohxywB5VeiTh8YriEGNvQi2+YPXiVIC7c9sztKFGyLMlODOISHJcU9XIvvmPy5exodmLmUbxhauEnUoNnMZIOF5onEE1TLOjFF5ZZKopjMoDowI4jKHekdKBOnQRTCieSlIPCjzy4Lzl5RJxW4n/Y0eRslrrDRcsvGCn6G6qnK8je0Rp9Q5Ev18JfZVUcxP/C1E63cp+9UEEcVDSRL1SR3UJTzoFCUY8bdfElLJA9mb2jl76Qmm2WGF1qsBQMqEF6xz+LUofSszz3RANdFMeadDB5HDZ6EpyRjVvlekNL1ReSlxcnE8cnVzOLQ8CU3YOWIyOcSGJbGB78w5+z5ZLFIWDNgyjkxoVbOSa7YS5Fs41s2V4IyBr6RC0dFMeXW1asoWmDFJG0mPzLzx5xIBiJ2i7OD0fAxEMxBbVziF1BdjAtD9STq2dUrepCdlR/oO3pK5KfyFxyf6AkyqKsd7Qs4ca/MDVLdMwOK3jwHzQKLrx9NwxJfWGb4Dc0zIgGxTEe8w+PenMvduJK+hBqwT/96JHs+6x9cPU8qKbqP9ASQ5Y3JC3fkJ5KJ1KbEeUsWYN+QTThNBCTba6Vf6Cj46A4rKBfCopju7ltKVa0bMOt/BP5hdJw6US1qhwn4E9Eqtn3ih2OfyJjqdGiN6Ss1F4w7dqK05Y47tYSLZEbH3Mo6YESJDaIHBIoJsF7HwGTbVycIC4cTQthshOryBJuPPiHe9VO9Mwcu4LLtdCmBx8u3VAcS1jDK0rUW/lALx3MPTAtLMhZIIHlUNLQ//Y0pv+GEfDXZeJQaxwkrZURMF3rnBS+oSWxG1uIALFBWbYlWbaVYz9RirLkyaWFviNNlmRblmRb/feJq8c7Jl8uiVFRJolZwx0i80+cO4Z5qQ8MZSY7dCJZ9YXkrRcTJEVIuvDgFDAKwlMT54mpIetEfZ9tlo3SG4+G23TgdjCtLyjtK5ST9gsthxB39I0PS0TGyKxvTO3LM5XaCyJhlo3LXOBEfBCBXJwn19JBq4cVC0ewNyS1G2Q/MFPRFlIVTepBLy8h3Ai8dogfyA6J2onihAt1UKklPVFSuXoiJxm0flCmbKJfUEtfSIujeOfk5W9o5T57x+TL9cTsQJNkL9QTqWmOgcNJZYfpgV58IT2204QuJYS+ojhpBbRh6HDEg5wY7cMjzyDdEIxEkZQT/qdTxMSDMSYgTYzkcntHyfwT5xcRMeOxIgFTRgadFL4h+204Ltye3AYlpCeiSei49IuSLC33Dc//DcD5i6P4UyF/IexfFAdR+CMlOUl7NqTA3xEZiYbH8lfFw4eHpecDuavVE9dU27k3SA2jDT5lchJq2OTQPObiZNitmJ403TxiG0lArDM3nBKxpTvSiOW36NqE8BtGwPsRmSYH8nsC2OKZOdnLVdRyT7vZ9YnU2ldkz47syL2ZDULT2ptX2+QU2gP7QlpazX8qcW7qrv9EFuYuhqd/5xW7IQGWYtINUaPEUXnGxHAI9uRIhz1LfQjFHdMTHsxdzSFBWufRJCcnj9ES+NuPpvnFzl3cU4Wdd8xXMVNrYOTAuYmRJu/INtq75UC6UbmRhDj5EduJupAZjDvTiwbB7hzhujskfQuziWK2Z+gXs7cqyYHMw2JsCZz+w9nd4ivSHf3mdJcvBPLEwCe2eAR2Nt0x+a/3ayJnMXhxFpQvJG/LG1LIc/OLXDiN8/9+s3VxetlIDO9EKDz5eIRUTyfB8h/N9HHJ8ERmwpenqXfuvAvzBpLoQBZ1moBFifSB07E20Bd+ee9DjfGaWkNaIgZ3zy1v/NCPmR2Tf/o5SMJijKRPeMWt3pTfZFbzhSPwMyYJD7IqPSybb4V3ADx0arHpRg/B75x9aCzvdHa1zo5UhpMhNg/SSZmRTWdHNZByjPq6szMpLE7KJDGcItnwxPAgIlvC2tUE/YZUyhcmX563Mj6FaCE/GAHPw3Ndev7EFt/DseMvTO101jTPE3kDtD8Y2LeDx3PSttEl81tEhM30gzM0SiIdtYaZaNpw8dDlWc0KankfTjY8DR88PfhUu6HslbOmHZ9IIZZLaexvAu9vBOarmucGepC4pvHC1Jj9N1uzxww7O3dDesqDVJOT9h1PpHysemLGeGQ68H5JkYBdfLLELM/EhqRYxFkPwe48At77CBhPZR9aGsuZ7m+7kOr0rJektVp5pkiw0e8cmS2J6FlOOrufnI2p460X28zdC4Esyz07Rj55yRHaCdkx+YdHPhdBMIZ5aONgtC//maWR7+jggek5PXvpAfh64mVVCVjFIgGbdVHZOXxNh+P5wfobcs8dGU2d2dHD8XICln3fPvdMZI5dyWcX2Q/Pwuhg3wKynDaGaw1IH9hKJhlMS/jlbEbfOZTuxHTvabW0Jtkx+ekkWH6/mYWcjyXv7AOnkcrSyf7F2t3ddIMXJytfSJ4r+htXSuDros8oMbzQpydb5YyGLjx+sUGm0JOPQ7Dkq9Kr4GAVELvdkXviDGJUaw0fnH1UsoQu3hYOoL3z1MZ7T9JpzIownrYJSY/G4O7pDv8LU4tnT/Dmh/iB3U3txAyH80S+L9ZHR0pPkZ4Dk5IDbetUOb/RgSmyqLSYjDp5SsmeeHSkpTkB6x13ZBoh/13r8wgYfRH7muZ0QRp/kUvo5gmr3oyAjc4IeezoODGXUcj9QO9qd3W6siD5F3YoAU8PwHMSu2YF+Gtx6akdjrQviPyQQveW5umrEzA+JEYrBMs75hvzTREObIW+N6zc9ckyFVJEKPLbvGHuOvX0HJ655DfM3REGKeeakuw4nA70sJQG7/8bgJZs312Ln7h6xElvYDktsdORyR34RnYo1U+URA3bUFLW4tjk4kAwtZZwESlcORH/8JTSe0Pmyu9YKQ9LAmISAbtQlm1Jlm1Jlm1Jlm3lWA4QDyyFvyAz6bI99YX2cBu8uWRH+0CJOi59ILOSEi3dUBwvJajk3HVHcagaaB0kX236xRSFvlBviFbdidKK36jreKUnrqQPoRaMdEMEuA3SooX2L9/KR5tW10LfkR3OEKpxlVsXkspCFjFENplJQXs3r5EAABAASURBVBWTL5e05IX+RUmomr5muuKqSaP5wmblZKA43UEehMoO0QO9OCinSDxQEjOwC2X+iXMg6TIvPMBeyitSi35zJss/EHldrrSFijXB4V50R1M2un8RyVTGrFdErr5h7opnIGhbmKQg/ontoPqG0R7uxU/0zM5lsuHLIZgZ8IXipA4gyjfUcGmQIqacCyfzdBBN+XJ75SdSpiumhFVO+uripAdoPaGcgCn8w11dHOOCgWMhcCkB6Q+05uk7mn6jW5JlW5JlWzm2ZRI7UZNL/4GeOjOWZFuWZFv9t2PyeCpePTeMJlGOiVZRPnnIxZsh7ejFX9DiWNkpHUhm9VRPvtwmwfSFopjaJ2YtPYH0FCcc6jBNtbskga2/IVrrbyhRYjKWugRXz6IPbpmqiQa10AvF0OQrHvzEmYCqHYb/5elKHRyzjlmZWYKXi4KVYzlA/MERROt0/HCE2GqwQ2hdaIdfTqY/lum/TzfQtjD7Yfed1NAtKyZyJf1EaerqSVuSQesHUxT6iSbzq4KIUbM2JC9fmPx0K/fZC7WwnLx8x+wI3zA9ylk6qfHYD7K3+itatkXADpQgsUFx6KGqiIOaA8EmTyxpgO2Y/MMji4DpC1PDeUZb0hYvbyKOdXDbiy/UjoKFv6FEMaacdhEwRRx0UtmDJBh5+JtLU5e+UZKlD/fSrRzbcBxUMhAm25KsgYVaaCo4VFPfuDjUMIngCURfHFYCGj/yoJUzUak1JWDKecNop5NgysNOJIHboPCFNnl3DtoLo+HDlAnlvHJmqt8QpXxh8uVZZlsY7qwFdbk0ufSBliXc+IHJl7N4ZdTJvHrAZiAm2pQTPFwU7ATJXqg3NKrTNNh4cHGMAhAd2DxrS1fh4puQ9CgE//IsS/2GIXj2AIcNnajzbSYTZyG7mn2iZJuAnSgpEv6DCNNmBdMYhJUXtcd2oHygo+OfaHU/ASO/uJw5yx4nEVnEDSWlLs6BSfGYE/ALJ7OMKtlviFbd1KUGS68oTmqAXhERU4oHKqeEJDju9KBoYbnFIdQapjqpQtZTNeg7avGipR+sgjoojmFeCMB0OQVs456cyy3JtizJtizJ9sMPbaE0dXHSOyCDCcHDRwoTpcH1vwE4f83sXx358+EN8zfDaCfy18PyDUUe54+KnU2e/mB71/5oG89U+6Ph+ZPrL++SlGjPnvCmhFgufSJ93JWhZFOlDy37y3PfxtM7OvvRYyef0VAcgqV/VkCS4N39RBZV/0RWUptbsyscNilkvqD3IRfXHd275eG/nhXsyL72Pjg7kfuCwdWLcvLkhyPSwTMa3zE9pz/u6zui5eIge6olDGcpFk6NeyHEL86eqZLQTxtbMrJxFN6DgE4DRoKIRf9Hz2+bHZ0l+eJZR3naILku5EKy6h9Irf3FeWPThiefb85bprx4fpOsL6LtmDzOQOeOvMj+J7YPvciu7G1+aE9Mz6/3m7qbGjh8za4fjNVkqQP05H3NuO8TqbXvn5At9LE6F+cJxYNDaglpC7ZGOPi8LpHXIibLondkAz2M05L+J2cKmWIsxWK+J2MI8PSMn5yF7fnBdqAuZDeT7AjHWYoEj7o4QnedSC19/+L9Oel/wTwiFdaSEmtRuBeFkb6jjLs+kVreR3OMNnawK4QSHCsPkmCp5Qo6EXsTGEbxOZTGw7dauisnZOxE9pUH6SLPfTP6xmmgeH3DxtlZ/cQ8kx1dTV9w9+wJvyH95QuT/7Ov+7gq72Asn3J530XPDbmnfGHyw1lQFewUeOd9fPcnUE5b0oV5CGkKSYts+ELuzTAdGYJ1KJcsToqaiFBrnrYk2bsQiToxGp7fo7vJ/xnZNXNZxa5yApY1qFkVNoiYtx8esfnSnzy7787G9HLV6OG7s22v8Vu07y9MLX7sbc7OL+x+Pgnr7vIEZrojbwj/B2THfDNJZoEfjsY24uxfyYJUcGapMrry8IfnrXwSbekJvGHezGpmsSTsBBi8OHPlC8nZRoTTxAZoYjhpKk0b2EctaXqL9Jz5sxa+eXe98EPnqflO1s494akdmHuS/4WpvTgLsetuSCyPv5DdIbl/kKzWsF7CCNkYOglbmSRyb6sPzK7R08YMFm3aIFj4+PQ8a+Xc1R4wv9Ps7DDyQmrVg0i8KhRWsuG6B2AYnYRLMPqZor06Qu6KP3m0m3cFs5+4atw26xfPHecMWvnC5PHMBG+ep6Zvx+SHXzXGscXJxnhF9pVQC+LJ2MDnUg+nZziPLN+QGpby9DOS34S2k5Ns9TbA79iZGWI5L+jSpPQVFpLHyuj5RZTqC8lzf/eTb9g3hB8+1+fulJjnIkYyPk5D+StmDk/tcJqrfOLcQ5n9dHLl5NHjh7Zj8uW5hwFYmsNmDxkJMZXxcvbTmDRfthClepAkxk4aqJf8fyMDWcb9bFm7orENHS32IEMTcWby6pl5cGrVX5H11XfkslkRMaMX8sL+Z7+QAvXcjLOHmMrl2RP2F6Z2Ohua75j8H7130XsiL+y7NpzPI24aPRHybaj9phOpVX9Fpqp/IDJPwfJR3ZiAunNyOrh09OSHs7sDYL6qcgIjJ6dW6cRZE5qdv5hhpqdAC5wF/cYfzO30diV9tZ2vnF2UuusHU/tn5772Lsy94SdyHxcQuYuevDe1A9tLdeH/lL8F9i+Hlm3l2JZJ7ESRG98x+YczY4l+42A5+QtSFTKeukQSwzcujiWs4RerUN/Ri7+gxbFyr3QhqXJGJzOOlSc/nQRTCkERkn8iS1ILPNAnb3GY9UAvvmHuw23TbNneMGn4Qom6etKWJEjHpSOWFy3/oNGWM9zsRE3NGyb/B2cQs1glYhYsDDPcwxstFcUxGUB0AD9xJdmJrAunYINYC6DdoOHkwqOdKKlculBzaJ3kj/gzmyEc3bIEEjAr/wiyDcdOlBQJFycyoEH/YopCP9FkXsrgERExmLUhefnC5Kdbudf+QEXHX1CZkTRVcZIJPi6O8diJzJT/hdRsJnD7iUyjYRKBKqg5EExqkAZvRBpRumF6lgdSe0EfuqWmC5PHeY5EUiRg0sFvOIP2Qmri+BPVisUhYMpoMEnQtpxykMS2MDy4+dHzF6YWt4SdLo5hXgiU3XgujXri6kpTdTg1TCJgIJY6jkFqDZaLDU0JygmaqiG7Q1ETFUzpB6VIymmd5EQSTHnYAyNJiE0s28qxH6jFT0yXFnsgs+2+IUr5wuTLs8S2MPwFJXRc+kBmJCVaWuhv9OoBm4FOt8Wx8g5Z+sYUU1+ooImO+ILiGB0gOgAWwOHDGg/hxJX0QXQE/3JalPoNQ3TKeqzUOiN7lReya7JESwc/EUnRN6RWCfnASuGSmktFYtHin8uSjdPoybZ49Cx0EP8LU8PFsS0MtxSD2JZtuJV/Ir9QGi6dKMma85/IrnYutDOBL7RXfiLdzXdMvhy4X575JZJqK5aWJ7MsS0+O5GhOpSEs5ELkkDzrQqtcCyGYVI628JdXobpj8g9nqSXZliXZliXZliXZ/nQKsiTbsjgnavGF0sbbCf8LveogOzNdiGpxCJgOnnx5+1ZOWUoI/wtT+3RxumDwmf5wd5N4iJkoJgk/kaQcpMf+D6QnNl1S8PCwyT06uyzJtizJtvrvxKUZTCWY2g2plYOSKAuqQZ8oUyMAKw6f+KtWj5zuG1IpX0ieu2iTHRL9jhQQY9Fx4ekV54mpIetEfZ/nbPnsdubDl9tWJC204RIUjJ1cPYtSL11oudQvaIkh6/pHisFNiWzMok1EFU3ty2W1RzuSly9MjotGS3L/iZNMZVaORUuSP9BSbDXaJbI/UBxqVEWTDlQOBEt2+pNrJqQD2dX8EyWllkUPtBExLQ8V547W8A3ldBHfUEtfSAsWgi4lhGdnsJykvGhNvlDBzQ9+IisZsCTbsvTPLo7t6Qehsg34jmi2hRi7ozgpAfpCal7FIlzhEtES8dNTTv2GUiTlRP/L05j6DSNYttlwuWW4iE9UT1UCtnHTD2WXAb0hWvUNbSM5E8VktmUU4I7RTvfUiK5mMuELGU5mN4o/AF5/DZy/cPJXw/51cFAcOvj7IZzIHxeJySlgvzzdqacCsos2/hq5c3qqB6mSY2mm78GhubDTBIy+iDiEDSQxCPDk05za4TRlYSAY+UTE8gdGO50E60OD5ywE633zMaQVHsugmQGut0Kw1252Vf8LqeU9/c+P5htmLxqQlkAxUsYiNCcZnFcl/vJRj8gHrl0oaea7zp3ldATx6m/IzFiK9A8hhrOXbFQ4eWI4z8VSB3abhks5+Ikr6YNoC+7OHf2oE1cPMDrJWpEW2H/Yozl3ZRDs68F+DzgcRt6WCXMtayLnsr+xW2jbkWF2jZJ4OY33Cq1Y73xiexFzf5xB+iI83zz7KdKS+s67BX1H5kNxuom/vCKh/90Gs3sgE/j1IIYXj0ba3gM7lIBHA9ZjmAt5+ltTtMPTn3xhU0KtIYXuhhV7HyTPS7F4cn4r8jRWp3m+OXoKIFrnPjHT42npFAGrGMzuwexDRjh5cjy/26n1wuk99BOppe+4C5o0ALbyjbkn1RMzxgzGq3IFAMFKivQcSMp4In0Dw2nAHiINEXdHmgGS6MDOX6R0XC00YH3bA/tJaWzCb1fkRU9MD0vpIFJv/MKrK9fl3l+khzuIXZL//kBpRaH5xrmrtRfMs5gI4Aymhwwg7vyPrrZRvyHPKl9InjewtG8MklCMpTg3Vk+4mlPA6SGmu5CeJodeMuEpdRelvzC1w2nt224Ywu3H7oUZmcrEkfktSt+QDoZaOZG9+Z6UDqS20hT7nEr0ZHVzkmAagtl5YmprQXXyYHtXbVaNikRHIh1T6J1RsvOONMRSOJE95WA2JV9Iy21peRb+sx8TC7ub4SLaD64apX5EMdpyIE8LvGMGUs23DPIBJOGpXR6FAmuipQscC0Gn+sbRUuzTSYoErAP9f7/Vp/HOs3puTpyOaL/OsusnSCNCdgHoIwxnUy9fSF49OM28huTkc1fE2fLL6a6xsbg6yDOxOTtbi3QuhGCnnvzL2ZixwCCN2DlbMcKXZzK1HZN3wwpwWrDyO/KFEfgOjHo4AqS/YUbJgcdvnlb6KEyEk8fCD784eyGJU0vGDLuTzV1kFIncRTPfTpkcBZ0kxhBWDk4bnSRoWMULm1HfkX0oaTxUprHoQGuDuT/ZJpVenA1YH/aGaewSikXGn5ge5Lyn8GdgT+sLt11VysnAfg3p8bb5jbmFWq68eBe2LVnKF3YL9C9Mbbx7CdkRhRQj4x3E3kFaZGmxvRV5W7rJ00uKldyxLHq7WPNfmL20YbkLOIXjN+hDKJSzuvxEkgzG6WntFSP+l7OrLR/YO6idmObwDVOLtJCfo98T2i5qF/LblG+YIkOVi8mok6eU7I5hvaKh3QTsh+f3yztOZOfFsxlHIDLbyM85SEL3dhdp7/gL2UWZ0enMvRdnb+s7Uo2WdjDwn5cyUvtsTuHDI+ejyMXwAAAQAElEQVSCG7KtfGHyODStNw9pjYDxo2FJrm9CYBKe3pUBsPRNdXjig9OCVRzMHvrO3wZOzg+M0UGe3/hwOqtT2bDr4AtpSh3gTZc2fCrcEko9PGxw/W8A8tfA/EUwnr8V3lCyqUsXSrLmBA+PYiomMQjIduCBXjxImR5MiLEXrESorSDJsQZpCBGunB2TP331RGYqpoRyKalywm8OwcSDMQW1c4hdQXYwLQ/U4ieqZ1QtdSE7qj/Q9vQFb85c+UJJ9vTaB6JJ6Lj0wNWjN4x2OZNipapYHCtceqBRcGS1Tn6iQqi/olEtNR4oTnKg+mCi4DHt52odtReT7pj8y2lVaqC9li20F6cWO9gdLadILDJjcn2iKJkQW5jepLhwqA4Xp/mJnpo2TP7pWpWFfkM0dHF6F3mQQdkheqAXB+UUiQdKYgZ2oaRy6RO1jr06F9rh+I7JT2ew+UJAJw/BGSdKD0zbLk7ZtFlqfEEkUxtz2pLeETli95PfkEK4F2bQLpNtSb7+wS0tvmPy5TRgolXv6KVvSLNtFlj25RBZnGiATpRGXygNl8BWvpEd7XqgTi41z5poRUlfKE5qafjC1D6d+dZEZAGmHBATYmxDK89K+EbTb1osybItybKtHPuBiFHipApe7sUXMmuabI9eJN8xuSXb+AOl0aQflNEIjCWGDEoP9OIvaHGs7JAOJLN6qpNfGEIpQtOGCGJcSkjtRHHoISqacp482vKjBG3aXSGe6RduW8LtYNINJUpwaUP1pD3JVKVBv2LUuBgK2o0dauakThlfqIWm9uVHzwsiYT6dLeQTrRyXi2jlWDwryR9oKZbGEy3b6D6RZLg4qQHRvDAQXvwzdIKOhdsuCa18R0nRKiVIT56yUsLFKT/RGr6hnCrxDbX0hbQ4indOXr4w+elW7rMXKoh/YnakvmF6JeLdxWHt6IZg9iT2jpbtVAfJbTiOCTE2KA4iVYmA/aKu4zSVulHlyZezq9qJ4lDDlN7gP3pXHDPgxWeBvZBadrs4mTgXh2DG0/I3WrN2x+TjKdqT2yA77SdKloSsovSCXtoDGYpiW6LDdqJsS7IC9mAIaeSkg+JYv1yc6GogblgG31Dk8ahB9Vi9L7kT8B9EwNr4hkLskl+00Vip9EiyD66eg93R8qoWmflFlOoLyYXb4SI1PijOkqtBiyYZ3XJy4je61UaG7qipeUdyuDi063Ch2RaGW6o1kO7oxYPi/BeKfvVk9ySNsn0kRRuOUZBOJKkelNRcKooTDlw8BKed+LBDtNzKRMGascvkOnFVvCE1hZ8oDZd+ECFtKezoXU9+ejthH+jo+Cdaucd+QzThqYEqZheaOIsf+okp4TEn4CcyA6V1FHtHL31HutPjwaQ0SYsrJ/knvhWjfXjkLAe9UAtPbmlJgwcvWscbiwq39ImtKMf0HGhJ8eFqpZyAKbsHLUuyLUuy/R9+9CyUpl/akFwcS9jp4rhMRCvHZMIP/P3fAMzfCPNXyBP5i2L5hiI/PX9NDF+49dLCXymj4+jtAs+/bjan6z+RyfmDZV4FiSHUGpbOPWRTRSfPXeGHnzzl1rkfjLUn+s0hGB/S8o48G41iEvzYfce00MM1o8PnMiL6WER4m36R3bk3X1eEZ1f8ySkh0Zm9EGB4V6MXex16EI0m4sV5QXmwO2CfyI7UsuOBWYgUqLMOTOPMlDew/y+klg6myPgAIltIUJs8sSUCE30A6Q0ZKv8HZJRHJwL0J8ss2N8fPGyqvKXCQnqb/YXUWI6xIVZ+vT33VKLGp9OX2jhxOIX2FHMjjkCM8u3sbM9fmNrpdDffMXlF3jJ53gyZe9c7hvPjlG+YFI9RCjBXYIS9pN134twx306dodY3ZJBy+jpEvhCYGgmjLXwg61ZTGtiVVyEmy453ZCM9bZ2QVkRs1izOdPkDmcm3oNLXhuKNpyfOPasDxn4iEpGcArZmw7NhIYXecSI1Bkf7jzy/SHpBlt/uCmE6gLOcnnDg4szyCkZTp/rG0fIWmmK0p48t1YOXT184+2oNEZgDuHktgVML352dFGhctUDqILdOieqS4KjUsnNG3zgNFOdtqW+cRdVPzErq3DE6PPny3pM8+z5x7iDSTkzvj7O32gO7E+3EzIf/gXk73q7sJJ+3ZybfsuMspo326OFNCVgKjHT+DdnNRxFbPJFJjH2sI2l8RcZaPHEl3NsMzP74vAF1aQe/I7e0vpDlrd8QgqWNLt4MIbKZ5HpzM5qC2RHsO9K7dFIkKgy35xW5pXrw0cuCzv2FqZ3OjuYLszccrAJivIlPwbobIUgbesm/Iztozijrefsbj7a89zTnHnA4Ob8XCzDybNt58tM7RB9W7ZdHPleQlN9w7jjunlcnotOcbL4pnHuYHVs8PU0b0ro505GPnmK05SzKvTBmGh/IfZnpZ6UOz0x4PLtvuHr2meQ4izHq5LkTgmXBaJAYF4TPUqrDoVwbg8eo1AjUmCAuna7hRO6KuhYD6ceXPhDOeAgp4x15RxowFsUyRG8F+CBJ9X4jS3jFcHISYvoYI1sWkhSc7uxoF2/CRo8A6d4HRot3btXCZ2R2Xpx1PIQ27ly1ZuiIvzP0VP/A1E5fO1jS+4rRciGYe6olDEfCds49KP2WIB6l3dxzR/amzvjocPLVxoqQaIN5E+20Dqdh5eF4itdwBqeO3lkUhInta9qQ6ez7T8wc3n3fyCo2xdrDrWAuCiBTLyvm9xk9Gb15L+Wwm9NU/onMpsYFeR/p7C9/q7GttQTquZchVEgifuM8Kj2BN2RNSowEuHuEvCVCEWlwdtOEVTyRZO5HnpxploaWQy8MwadIEishubAZO1iMcTfvz45kF6ZEZyy9rzhrU+4cPSeys9/2wNxx6qkdzuzUuDfaK6dWPUh3ci7HuDb8D+9O6ieuHfkEFrBqdsBJ6KJOHh1AmmzeTo0Z4tLZG463/opsqf6ByL10IRuzHsa92JAkH87u9pzIaBbSfu5KLXxhyvFQPiTGCrrpCbl9C43ln8gotbk1C4Yni6cUzF3B7qc5O8OLFP8d2d/+hc9d5dRO5LuS85DzvuTsSFfv3fj/6JW9/h74hTT50y235sFtB7Ls6DgoBYnkWBL9oDjW0kFxwgEVG0g3pGYU4T9ocRqKvY++mAjDJVL1pPXmEExpDIqA6YYR8PQohxywB5VeiTh8YriEGNvQi2+YPXiVIC7c9sztKFGyLMlODOISHJcU9XIvvmPy5exodmLmUbxhauEnUoNnMZIOF5onEE1TLOjFF5ZZKopjMoDowI4jKHekdKBOnQRTCieSlIPCjzy4Lzl5RJxW4n/Y0eRslrrDRcsvGCn6G6qnK8je0Rp9Q5Ev18JfZVUcxP/C1E63cp+9UEEcVDSRL1SR3UJTzoFCUY8bdfElLJA9mb2jl76Qmm2WGF1qsBQMqEF6xz+LUofSszz3RANdFMeadDB5HDZ6EpyRjVvlekNL1ReSlxcnE8cnVzOLQ8CU3YOWIyOcSGJbGB78w5+z5ZLFIWDNgyjkxoVbOSa7YS5Fs41s2V4IyBr6RC0dFMeXW1asoWmDFJG0mPzLzx5xIBiJ2i7OD0fAxEMxBbVziF1BdjAtD9STq2dUrepCdlR/oO3pK5KfyFxyf6AkyqKsd7Qs4ca/MDVLdMwOK3jwHzQKLrx9NwxJfWGb4Dc0zIgGxTEe8w+PenMvduJK+hBqwT/96JHs+6x9cPU8qKbqP9ASQ5Y3JC3fkJ5KJ1KbEeUsWYN+QTThNBCTba6Vf6Cj46A4rKBfCopju7ltKVa0bMOt/BP5hdJw6US1qhwn4E9Eqtn3ih2OfyJjqdGiN6Ss1F4w7dqK05Y47tYSLckwt91kY15cGi4VkYvikPeeE61we1AK4guf3FIq+I7JP5wBTKzXoH+Rom0WWPblkNjSpRCLQ8AkAvaLEqVWPtBLB7kv3VpYkCsllEMj/ZOnKf03jIC/LhOHWuMgaa2MgOla56TwDS2J3dhCBIgNyrItybKtHPuJUpQlTy4t9B1psiTbsiTb6r9PXD3eMflySYyKMknMGu4QmX/i3DHMS31gKDPZoRPJqi8kb72YIClC0oUHp4BREJ6aOE9MDVkn6vtss2yU3ng03KYDt4NpfUFpX6GctF9oOYS4o298WCIyRmZ9Y2pfnqnUXhAJs2xc5gIn4oMI5OI8uZYOWj2sWDiCvSGp3SD7gZmKtpCqaFIPenkJ4UbgtUP8QHZI1E4UJ1yog0ot6YmSytUTOcmg9YMyZRP9glr6QlocxTsnL39DK/fZOyZfridmB5oke6GeSE1zDBxOKjtMD/TiC+mxnSZ0KSH0FcVJK6ANQ4cjHuTEaB8eeQbphmAkiqSc8D+dIiYejDEBaWIkl9s7SuafOL+IiBmPFQmYMjLopPAN2W/DceH25DYoIT0RTULHpV+UZGm579idaGA6bHI6bEtg/wA4fxXk74P8lfD6q6Ei8LdCICkea50kCFCfbP7umN4HZ2fVE9dU25gKUsNog0+ZnIQaNjmUy2KLU8EWoVqyMPnhSDNFgoZ15oZTIrZ0Rxqx/CV31kCwNp6YBO9HZJocyO8KYIvPghW7gdoD2dHuv5Ba3tP9NN+QjeHItCSyH8Dg5KnffH7zxPbwugNpK5vaUgNR/0JqeSJtvfOGJXlHmj4wPcvp4hkT0w3BnhzpsGepD6G4Y3rCg7mnOSRI6zya5OTkMVoCf/vRlF+NzmMH91SB3zFfxUytgesPZB5jhEgfcpI7Z1v1DWmCcSMJcfIjsqfaQmYx7kwvGgS7c4TrzpD0LWRXmrP9HbO3VZIDmYfF2BI4/YdfF0/PjdMdfnPayhcCeWLgE1s8Ajub7pj81/s1kbMYvDgLyheSt+UNKeS5+UUunMb8v+Pq9Fw4GZtR0xd++egXz850XdhX8h9VVPoo5J44Ioa+NAh3sDEcuDhz5QvJmSK+8anMramHX957c0ukL0zt8Nxy5MGDn4iI5aasKzaJ+ObnIAl1jGTGkvzBW+K36XoQY4IvbXIgq8o37MDOGcO67xPZR+34zyC/W/vZncpwMsTmQe6hzMims6MaSDlGnbdsfKUB6iwiYwMxfeFhB0YOXxg5Uzdkrnxh8uV5K+1TiBbygxHwPDzXpOdPbPE9HDv+wtROZ03zPJE3QPuDgX07eDwnbRtd8vbbpIg6W5bO0GSJVGoN09m04eKhy7OSFdTyPpxseBo+eHrwqXZD2StnTTs+kUIsl9LY3wTe3wjMVzXPDfQgcU3jhakx+2+2Zo8ZdnbuhvSUB6kmJ+07nkj5WPXEjPHIdOD9kiIBu/hkiVmeiQ1JsYizHoLdeQS89xEwnso+tDSWM93fdiHV6VkvSWu18kyRYKPfOTJbEtGznHR2PzkbU8dbL7aZuxcCWZZ7dox88pIjtBOyY/IPj3wugmAM89DGwWhf/jNLI9/RwQPTc3r20gPw9cTLqhKwikUCNuuisnP4mg7H84P18uoJZAAAEABJREFUN+SeOzKaOrOjh+PlBCz7vn3umcgcu5LPLrIfnoXRwb4FZDltDNcakD6wlUwymJbwy9mMvnMo3Ynp3tNqaU2yY/LTSbD8fjMLOR9L3tkHTiOVpZP9i7W7u+kGL05WvpA8V/Q3rpTA10WfUWJ4oU9PtsoZDV14/GKDTKEnH4dgyVelV8HBKiB2uyP3xBnEqNYaPjj7qGQJXbwtHEB756mN956k05gVYTxtE5IejcHd0x3+F6YWz57gzQ/xA7ub2okZDueJfF+sj46UniI9ByYlB9rWqXJ+owNTZFFpMRl18pSSPfHoSEtzAtY77sg0Qv671ucRMPoi9jXN6YI0/iKX0M0TVr0ZARudEfLY0XFiLqOQ+4He1e7qdGVB8i/sUAKeHoDnJHbNCvDX4tJTOxxpXxD5IYXuLc3TVydgfEiMVgiWd8w35psiHNgKfW9YueuTZSqkiFDkt3nD3HXq6Tk8c8lvmLsjDFLONSXZcTgd6GEp7ci3UKmaYfLcH/4/81dAu1F2UCeSyNLpSW5cQoryB7Kz1U+URA3bUFLW4tjk4kAwtZZwESlcORH/8JTSe0Pmyu9YKQ9LAmISAbtQlm1Jlm1Jlm1Jlm3lWA4QDyyFvyAz6bI99YX2cBu8uWRH+0CJOi59ILOSEi3dUBwvJajk3HVHcagaaB0kX236xRSFvlBviFbdidKK36jreKUnrqQPoRaMdEMEuA3SooX2O3/ISlfHEmDDTYZAswHBjKvcUCv/CBiZkchq6QkHh1MrByUteaF/URKqpq+Zrrhq0mi+sFk5GShOd5AHobJD9EAvDsopEg+UxAzsQpl/4hxIuswLD7CX8orUot+cyfIPRF6XK22hYk1wuBfd0ZSN7l9EMpUx6xWRq2+Yu+IZCNoWJimIf2I7qL5htId78RM9s3OZbPhyCGYGfKE4qQOI8g01XBqkiCnnwsk8HURTvtxe+YmU6YopYZWTvro46QFaTygnYAr/cFcXx7hg4FgIXEpA+gOtefqOpt/olmTZlmTZVo5tmcRO1OTSf6Cnzowl2ZYl2Vb/7Zg8nopXzw2jSZRjolWUTx5y8WZIO3rxF7Q4VnZKB5JZPdWTL7dJMH2hKKb2iVlLTyA9xQmHOkxT7S5JYOtviNb6G0qUmIylLsHVs+iDW6ZqokEt9EIxNPmKBz9xJqBqh+F/ebpSB8esY1ZmluDlomDlWA4Qf/D/UXIuyLbruq0F0v8+JwOgbMue9jo72iRBgB/J8yaVqlX3vRFE63T8cITYarBDaF1oh19Opj+W6b9PN9C2MPth953U0C0rJnIl/URp6upJW5JB6wdTFPqJJvOrgohRszYkL1+Y/HQr99kLtbCcvHzH7AjfMD3KWTqp8dgPsrf6K1q2RcAOlCCxQXHooaqIg5oDwSZPLGmA7Zj8wyOLgOkLU8N5RlvSFi9vIo51cNuLL9SOgoW/oUQxppx2ETBFHHRS2YMkGHn4m0tTl75RkqUP99KtHNtwHFQyECbbkqyBhVpoKjhUU9+4ONQwieAJRF8cVgIaP/KglTNRqTUlYMp5w2ink2DKw04kgdug8IU2eXcO2guj4cOUCeW8cmaq3xClfGHy5VlmWxjurAV1uTS59IGWJdz4gcmXs3hl1Mm8esBmICbalBM8XBTsBMleqDc0qtM02HhwcYwCEB3YPGtLV+Him5D0KAT/8ixL/YYhePYAhw2dqPNtJhNnIbuafaJkm4CdKCkS/oMI02YF0xiElRe1x3agfKCj459odT8BI7+4nDnLHicRWcQNJaUuzoFJ8ZgT8Asns4wq2W+IVt3UpQZLryhOaoBeERFTigcqp4QkOO70oGhhucUh1BqmOqlC1lM16Dtq8aKlH6yCOiiOYV4IwKThUu44cwluWZJtWZJtWZJtWZLthx/aQmnq4qR3QAYTgoePFCZKO3pxkB2tLvyf/m2QvwpeyN8FyzcUeZw/KuYvh0D+hoijt5fpF6TKX1lXjToEe/JZnDLFWMYuzC1cyNTo5WERF6IlS0Pe94bHwt5Df2z6cv/u2RvORtLOZQjv7ieyqPon9hYWLmQnFsIEcvYBuWf03Ht59fR8Oqta+0B2U+5dg9lNL8rJkx+OSAfXNr5jek5nV/Mdk+fiIHv4sP5GJ0Yr6a1c8geyZ6okmQPCGWd7RiOAFQaT8ibaFkco/xv7xmxLL/jFV5ndbco1PIW3QSM2o+kTqbWvmFE6+7SEJ79q0744t14crXxh8jgN+Yaqyaux/4mp5eoi3WdOb7UnpufX+03dTQ0cvmbP36ZJqiT0sZ+EVi4lyXuBO6en+j8h0/T1AhDLA/Clp9CrcjfaC6dCIZFGFiTjQXS+cVbTQ5GW1J+caWSKsRSL+Z6MIcDTM35yFrbnB9uBupDdTLIjHGcpEjzq4gjddSK19P2L55dI3wvmEWwK4FnOfZOtCGeW2Pd8Ij15H00x2tjKuhBKcKw8SIKlxiUYBKOCMYfS2o7JD98WprtyAjsOTsquGgE1AnPYB6eB4vUNG2d39ROzgp3r9wSooJEwxdOv2sXRsp/O7Pr/Obszy7KZC9+8O+E35L7yhckPz67kYKfAdoHD8yEo3MfHxCJvSCGW/hPTX0LfA7kLkbh0svBjKWouxGMwLFnbkuSehS2FL8/vkV3/L2TX9POC7CknYEPzLRAeUE5ACav3vmRLf/LsvvvcQzutbOIjJo8eP7SF2+7ueePR4izCkrGbXcmy/4nR8H4VAxj9CDFI7wERsYrfOEu4gYQZurmYt0MZGp28epAeoD3B3AXB0sFc6h/e3rYRYu3LaMiB2cFmaliSPOOB9POy7gviTBPRGWIDNDGcNJWmDeyjljS9RXrO/FkL37y7Xvih56XZtWNq4cFn7Y1He3Eejl13Q2J5/IXcE8Jnjc6dYyg1Aj1soR4LD1vIvVUfmJ2jZ5heLNq0QbDw8el51sr7mDbT+oHpwfMqAKOv1rDxdQ/AMnQSLsF4KtO0V0fI/6zEnzzazbuC2U9cNW6b9YvnjnMGrXxh8nhmgjfPU9O3Y/LDrxrj2OJkY7wi+0qoBfFkbOBzqYfTM5xHlm9IDUt5+hnJb0LbyUm2ehvgd+zMDLGcF3RpUvoKC8ljZfT8Ikr1heS5v/vJ3zBafK7/37TjzHMRI+TruTSUv+K8mZjqOM3ln5i9dHBV7qftuuum7T3Jl+cWhmBZFMZ8WIeHr0ghli96YEfRg5lbiJI3pfn/i5mJsy3L2IT1nUE8NsVkeN4ciIi39wOpdfcr5rrM7Zi94UHuoTzz8Pw27EFFaqF48GJ6Dqel2l+Y2ul0N98x+T967t3ex6r1vnwPO/iEamAs/zmVM3NwOjtzIrX0IWJ03zhT5R+IzJOwzHVjAurOyelg+ejJD2d3B8C+Pq2pgSenVunEWROanb+YYaanQAucBf3GH8zt9HYlfbWdr5xdlLrrB1P7Z+e+9i7MveEnch8XELmLnrw3tQPbS/UF2x19eXj/nwDzd0H+Qig8WfAP5y+Hlq7ecsvGhW/YLhOjgVpoO2kKsjgETCG/WIXSjl78BS2OxRU3lKHY6ElwrDy100kwpRAUIfknsiS1wAN98haHWQ/04hvmPtw2zZbtDZOGL5SoqydtSYJ0XDpiedHyDxptOcPNTtTUvGHyf3AGMYtVImbBwjDDPbzRUlEckwFEB/ATV5KdyLpwCjaItQDaDRpOLjzaiZLKpQs1h9ZJ/og/sxnC0S1LIAGz8o8g23DsREmRcHEiAxr0L6Yo9BNN5qUMHhERg1kbkpcvTH66lXvtD1R0/AWVGUlTFSeZ4OPiGI+dyEz5X0jNZgK3n8g0GiYRqIKaA8GkBmnwRqQRpRumZ3kgtRf0oVtqujB5nOdIJEUCJh38hjNoL6Qmjj9RrVgcAqaMBpMEbcspB0lsC8ODmx89f2FqcUvY6eIY5oVA2Y3n0qgnrq40VYdTwyQCBmKp4xik1mC52NCUoJygqRqyOxQ1UcGUflCKpJzWSU4kwZSHPTCShNjEsq0c+4Fa/MR0abEHMtvuG6KUL0y+PEtsC8NfUELHpQ9kRlKipYX+Rq8esBnodFscK++QpW9MMfWFCproiC8ojtEBogNgARw+rPEQTlxJH0RH8C+nRanfMESnrMdKrTOyV3khuyZLtHTwE5EUfUNqlZAPrBQuqblUJBYt/rks2TiNnmyLR89CB/G/MDVcHNvCcEsxiG3Zhlv5J/ILpeHSiZKsOf+J7GrnQjsT+EJ75SfS3XzH5MuB++WZXyKptmJpeTKTWSIe7uQOa4AdKEFig8ghedaFVrkWQjCpHG3hL69CdcfkH85SS7ItS7ItS7ItS7L96RRkSbZlcU7U4guljbcT/hd61UF2ZroQ1eIQMB08+fL2rZyylBD+F6b26eJ0weAz/eHuJvEQM1FMEn4iSTlIj/0fSE9suqTg4WGTe3R2WZJtWZJt9d+JSzOYSjC1G1IrByVRFlSDPlGmRgBWHD7xV60eOd03pFK+kDx30SY7JPodKSDGouPC0yvOE1ND1on6Ps/Z8tntzIcvt61IWmjDJSgYO7l6FqVeutByqV/QEkPW9Y8Ug5sS2ZhFm4gqmtqXy2qPdiQvX5gcF42W5P4TJ5nKrByLliR/oKXYarRLZH+gONSoiiYdqBwIluz0J9dMSAeyq/knSkotix5oI2JaHirOHa3hG8rpIr6hlr6QFiwEXUoIz85gOUl50Zp8oYKbH/xEVjJgSbZl6Z9dHNvTD0JlG/Ad0WwLMXZHcVIC9IXUvIpFuMIloiXip6ec+g2lSMqJ/penMfUbRrBss+Fyy3ARn6ieqgRs46Yfyi4DekO06hvaRnImislsyyjAHaOd7qkRXc1kwhcynMxulH1hu0yMBpKpfwDk74X8/TB/D0wWHBeHPzauGgRLx2iJ9PHXRGT+GrlzuqoHqZJjaabvwaG5oNMEjL6IOIQNJDEI8OTTnNrhNGVhIBj5RMTyB0Y7nQTrQ4PnLATrffMxpBUey6CZAa63QrDXbnZV/wup5T39CzXNN8xeNCAtgWKkjEVoTjI4r0r85aMekQ9cu1DSzHedO8vpCOLV35CZsRTpH0IMZy/ZqHDyxHCei6UO7DYNl3LwE1fSB9EW3J07+lEnrh5gdJK1Ii2w/7BHc+7KINjXg/0ecDiMvC0T5lrWRM5lf2O30LYjw+waJfFyGu8VWrHe+cT2Iub+OIP0RXi+efZTpCX1nXcL+o7Mh+J0E395RUL/ZxvM7oFM4NeDGF48Gml7D+xQAh4NWI9hLuTpb03RDk9/8oVNCbWGFLobVux9kDwvxeLJ+a3I01id5vnm6CmAaJ37xEyPp6VTBKxiMLsHsw8Z4eTJ8fxup9YLp/fQT6SWvuMuaNIA2Mo35p5UT8wYMxivyhUABCsp0nMgKeOJ9A0MpwF7iDRE3B1pBkiiAzt/kdJxtdCAXW+DYOH9pDQ24bcr8qInpoeldBCpN37h1ZVrek/62ZGp9fgAABAASURBVHlxespRYsm/kFnKfcETI7IpgLMgvWQAced/dLWN+g35tvKF5LmbpXxOCDdEaNoQgWZgmkii42SrQPbFKR12tJx8Cbkv2htGO/y1JyKvWKvyxCgZCR4+ZX6LCm9IB0OtnMjeLEzpQGorTZHfDEgdz+pVrk6lmJ2jJ6uawJrw8QhZcbCDd2cCnh1Ad74jG2JpPJGN5SA3znCLYVxDvpatLOwf/ZhYmHsyWUT7QYrRKPUdxWjLgXkUSWrAnV/iZInj+To+homdRwlfSIqFzFoIducR8DwzhSIB6+7834PcFZx6GZ/D0HR096jpeHdamVm1GYVPMrup9VI27UjeenAt6dTJmau+kHzqF0eqsbl4VdK5OTtbi5SvesNoX57tqZ0IwW47s/fTz0GSDoJjZQ1wELutHc4XJuE7MOrhCJD+hhklBz5+e0ZSxJkiDk8ejxBk6/qCZOlZyO5kcxcZzUTumknK5CjoJLEMXzht3Z2QtjtWQdqRfShZdKhZ88qnIaWj5YE0YH3QG+aefMSJjJdvmBr0uqTkI+SSlBZuu6qUk4H5yq4mD85vzC0/PPuiv2G3UPgLUxvvPYS5Iu9g78ZHR6PE0vnZyKPThrEnnGyshHTDsnB6s6Q8yRfnvpTx3gMyksj97Em2Cv2NIoWfSFIObr0Mh7H80If+HVfv8YAn5p5oJ2YbMxgX1Xov/HorPeUg1tET+U2oZXB0OLXyE9MQPXivpGXU6DAIdjyh4s7zptxzIt9y8bmjNfQsmdno2b0wKR5L/U/MchqyE2DlTAxnX+s70hUtbWAgT0Htt7xiRcJncwofHjkX3PDYtTC1ODStNw9pjYD1kbw7eHxj8jhfmQ1MtHHDyvAXpBXL+NTZPXxtC8f5YTEq5Ln38GxsTnJh19G/MDU8xobeExw+2bqNWnjYQu7LluweXFMp0/0/+UOgbRnd9mByPGbC4aTUjQu3cuw3tGxTNhj4L9TqA8UxHgMtK9bQlKCcHZM/ffVEzoIbUitfmPx0Eky8H1NQO4fYFWQH0/JALX6iekbVUheyo/oDbU9f8ObMlS+UZE+vfSCahI5LD1w9esNolzMpVqqKxbHCpQcaBUdW6+QnKoT6KxrVUuOB4iQHqg8mCh7Tfq7WUXsx6Y7Jv5xWpQbaa9lCe3FqsYPd0RpuuU0GLTFr+QUjRQdbB9MbCa8EIikuThCp3OKflajRrb//rV5p+vyGaOjidCd5kAHZIXqgFwflFIkHSmIGdqGkcukTtY69Ohfa4fiOyU9nsPlCQCcPwRknSg9M2y5O2bRZanxBJFMbc9qS3hE5YveT35BCuBdm0C6TbUm+/sEtLb5j8uU0YKJV7+ilb0izbRZY9uUQWZxogE6URl8oDZfAVr6RHe16oE4uNc+aaEVJXyhOamn4wtQ+nfnWRGQBphwQE2JsQyvPSvhG029aLMmyLcmyrRz7gYhR4qQKXu7FFzJrmmyPXiTfMbkl2/gDpdGkH5TRCIwlhgxKD/TiL2hxrOyQDiSzeqqTXxhCKULThghiXEpI7URx6CEqmnKePNryowRt2l0hnukXblvC7WDSDSVKcGlD9aQ9yVSlQb9i1LgYCtqNHWrmpE4ZX6iFpvblR88LImE+nS3kE60cl4to5Vg8K8kfaCmWxhMt2+g+kWS4OKkB0bwwEF78M3SCjoXbLgmtfEdJ0SolSE+eslLCxSk/0Rq+oZwq8Q219IW0OIp3Tl6+MPnpVu6zFyqIf2J2pL5heiXi3cVh7eiGYPYk9o6W7VQHyW04jgkxNigOIlWJgP2iruM0lbpR5cmXs6vaieJQw5Te4D96Vxwz4MVngb2QWna7OJk4F4dgxtPyN1qzdsfk4ynak9sgO+0nSpaErKL0gl7aAxmKYluiw3aibEuyAvZgCGnkpIPiWL9cnOhqIG5YBt9Q5PGoQfVYvS+5E/AfRMDa+IZC7JJftNFYqfRIsg+unoPd0fKqFpn5RZTqC8mF2+EiNT4ozpKrQYsmGd1ycuI3utVGhu6oqXlHcrg4tOtwodkWhluqNZDu6MWD4vwXin71ZPckjbJ9JEUbjlGQTiSpHpTUXCqKEw5cPASnnfiwQ7TcykTBmrHL5DpxVbwhNYWfKA2XfhAhbSns6F1Pfno7YR/o6PgnWrnHfkM04amBKmYXmjiLH/qJKeExJ+AnMgOldRR7Ry99R7rT48GkNEmLKyf5J74Vo3145CwHvVALT25pSYMHL1rHG4sKt/SJrSjH9BxokjhQNXk8JJjdg44ke8Pkn67p9UJpuLQhuTjpGRApmcDJTCbOYKKHca+o2QcXxyqV9T/5Q2D+OnhD5W+Fh+evickX8hfFo5c2/koZHUdvF9h9IMUYcup0o2EvvBIhxvZaA3+j3JE9KNOFTp67wg8/ecqtcy8Ya0/0m0OwPvSBx1unxt0jQNu4kK3VN5zLiPSNUawR2NMnbZh5vEpwcy7BqJxaVoQvZFe+mWumr5zaias3r6EJluzy7A37RHalltkHcmHsdNaQp3FmyhvmVoqw1B+8KnqRh+8YOfyG9JRf92Q3bRH+f86qzoL5HYGZJzk5eWyuzNuHlec3ycV/IbXc0X0MveFq4W6sPYPEjHID90ZPRjMMvTHKt58z3cTMC6bndHY23zF5ReYnn28gz83rPRRh/DblGybFY5QC00fWPT/I3jYuJG/fhrkrjsQH5W1dQsAiIs0lJBhNtYbF01beRu4KIibr7lfOBD0tTUgrIpa9eMoRX5GZfEvuCDJFa1mxPD1xFrAuGb4qCBi94fjRsyMN2Y1EH7tJhv9D3p+PPpDhuTf7yrkPBbri8ClFhXMXkdFw9rxxtLyHphjt6WNL9eDl0xfOvlpDBOYAXrKWwKmF785OCjSuWiB1kFunRHVJcFRq2Tmjb5wGivO21DfOouonZiV17hgdnnx570mefZ84dxBpJ6b3x9lb7YHdiXZi5sP/wLwdb1d2ks/bM5Nv2XEW00Z79PCmBCwFRjr/huzmo4gtnsgkxj7WkTS+ImMtnrgS7m0GZn983oC6tIPfkVtaX8jy1m8IwdJGF2+GENlMcr25GU3B7Aj2HeldOikSFYbb84rcUj346GVB5/7C1E5nR/OF2RsOVgEx3sSnYN2NEKQNveTfkR00Z5T1vP2NR1vee5pzDzicnN+LBRh5tu08+ekdog+r9ssjnytIym84dxx3z6sT0WlONt8Uzj3Mji2enqYNad2c6chHTzHachblXhgzjQ/kvsz0s1KHZyY8nt03XD37THKcxRh18twJwbJgNEiMC8JnKdXhUK6NwWNUagRqTBCXTtdwIndFXYuB9ONLHwhnPISU8Y68Iw0Yi2IZorcCfJCker+RJbxiODkJMX2MkS0LSQpOd3a0izdho0eAdO8Do8U7t2rhMzI7L846HkIbd65aM3TE3xl6qn9gaqevHSzpfcVouRDMPdUShiNhO+celH5LEI/Sbu65I3tTZ3x0OPlqY0VItMG8iXZah9Ow8nA8xWs4g1NH7ywKwsT2NW3IdPb9J2YO777/RG5rz6CkXMFrwnMtvwwXEpeejBodyI1RTs+uqJ/IbGoM532ks7f8rcbm1hKob7szSBVopBhcbw6k94msiZR7B0fIW06OVE7TF3Lp3Efv5EynHyi/YQieXt5EhpXcsAo7WIzlW1DgybJzMKXof+GsZTRNGb2Q+/tND8zuU0/t8F5F9U/seiaCq5fLMe4O/8OZyr10TG+eziDX/XAEurkjPXgss7/INnaks3Xyb2S69Q9E7qUL2Zy1MF6IDUny4exuz4mMZiHt567UwhemHA/tN1O7IwLFfhONf2Nup59re9/CKHHGY1lfTBI9O09cd1X7z5z72rMw94XfkFp5cF6VeN7HS3JXq52lCr7zWTTl/9X8NwDR/Onm74TCF/KnQ0uyEwct/pUHl2ZJaNgdxaE2ukTacCFZrYE6KC30L1qchmL30hUTYbhEqp603hyCKY1BETDdMAKeHuWQA/ag0isRh08MlxBjG3rxDbMHrxLEhdueuR0lSpYl2YlBXILjkqJe7sV3TL6cHc1OzDyKN0wt/ERq8CxG0uFC8wSiaYoFvfjCMktFcUwGEB3YcQTljpQO1KmTYErhRJJyUPiRB/clJ4+I00r8DzuanM1Sd7ho+QUjRX9D9XQF2Ttao28o8uVa+KusioP4X5ja6VbusxcqiIOKJvKFKrJbaMo5UCjqcaMuvoQFsiezd/TSF1KzzRKjSw2WggE1SO/4Z1HqUHqW555ooIviWJMOJo/DRk+CM7Jxq1xvaKn6QvLy4mTi+ORqZnEImLJ70HJkhBNJbAvDg3/4c7ZcsjgErHkQhdy4cCvHZDfMpWi2kS3bCwFZQ5+opYPi+HLLijU0bZAikhaTf/nZIw4EI1HbxfnhCJh4KKagdg6xK8gOpuWBenL1jKpVXciO6g+0PX1F8hOZS+4PlERZlPWOliXc+BemZomO2WEFD/6DRsGFt++GIakvbBP8hoYZ0aA4xmP+4VFv7sVOXEkfQi34px89kn2ftQ+ungfVVP0HWmLI8oak5RvSU+lEajOinCVr0C+IJpwGYrLNtfIPdHQcFIcV9EtBcWw3ty3FipZtuJV/Ir9QGi6dqFaV4wT8iUg1+16xw/FPZCw1WvSGlJXaC6ZdW3HaEsfdWqIlcuNjDiUNNm2ADSbBsTuPwKWYbOPiBHHhaFoIk51YRZZw48E/3Kt2omfm2BVcroU2Pfhw6YbiWMIaXlGi3soHeulg7oFpYUHOAgksh5KG/renMf03jIC/LhOHWuMgaa2MgOla56TwDS2J3dhCBIgNyrItybKtHPuJUpQlTy4t9B1psiTbsiTb6r9PXD3eMflySYyKMknMGu4QmX/i3DHMS31gKDPZoRPJqi8kb72YIClC0oUHp4BREJ6aOE9MDVkn6vtss2yU3ng03KYDt4NpfUFpX6GctF9oOYS4o298WCIyRmZ9Y2pfnqnUXhAJs2xc5gIn4oMI5OI8uZYOWj2sWDiCvSGp3SD7gZmKtpCqaFIPenkJ4UbgtUP8QHZI1E4UJ1yog0ot6YmSytUTOcmg9YMyZRP9glr6QlocxTsnL39DK/fZOyZfridmB5oke6GeSE1zDBxOKjtMD/TiC+mxnSZ0KSH0FcVJK6ANQ4cjHuTEaB8eeQbphmAkiqSc8D+dIiYejDEBaWIkl9s7SuafOL+IiBmPFQmYMjLopPAN2W/DceH25DYoIT0RTULHpV+UZGm579idaGA6bHI6bEvFRpXKKhoNFz7/DUDlb4UErH9VXAjkb4uBb5w/JfKH0JksTXfogYgYl/CXyWxLbXmAtqjUa1d4FtsVcfeI4QubErAuKlL7RAoYH9D2hvA86sQkeD+CXakB81dXkoOfGK2bmjB5ITvK/0JqeU/303xDNoUj05LIPQAGJ0/95vObJ7aHNx5IW9nUlhqI+hdSyxNp6503LMk70vSB6VlOF8/7K5BjAAAQAElEQVSYmG4I9uRIhz1LfQjFHdMTHsw9zSFBWufRJCcnj9ES+NuPpvxqdB47uKcK/I75KmZqDVx/IPMYI0T6kJPcOduqb0gTjBtJiJMfkT3VFjKLcWd60SDYnSNcd4akbyG70pzt75i9rZIcyDwsxpbA6T/8unh6bpzu8JvTVr4QyBMDn9jiEdjZdMfkv96viZzF4MVZUL6QvC1vSCHPzS9y4TTmf4+r03PhZGxGTV/45aNfPDvTdWFfyX9UUemjkHviiBj60iDcwcZw4OLMlS8kZ4r4xqcyt6YefnnvzS2RvjC1w3PLkQcPfiIilpuyrtgk4pufgyTUMZIZS/IHb4nfZtbzhSPwMyUJ/1+JHfONrExveAd2johlClhV6iH46OwjZ3nr2VmdnakMJ0NsHqSTMiObzo5qIOUY9XVXZ1JYnJRJYjhFsuGJ4UFEtoS1qwn6DamUL0y+PG9lfArRQn4wAp6H57r0/Iktvodjx1+Y2umsaZ4n8gZofzCwbweP56Rto0vmt4gIm+kHZ2iURDpqDTPRtOHiocuzmhXU8j6cbHgaPnh68Kl2Q9krZ007PpFCLJfS2N8E3t8IzFc1zw30IHFN44WpMftvtmaPGXZ27ob0lAepJiftO55I+Vj1xIzxyHTg/ZIiAbv4ZIlZnokNSbGIsx6C3XkEvPcRMJ7KPrQ0ljPd33Yh1elZL0lrtfJMkWCj3zkyWxLRs5x0dj85G1PHWy+2mbsXAlmWe3aMfPKSI7QTsmPyD498LoJgDPPQxsFoX/4zSyPf0cED03N69tID8PXEy6oSsIpFAjbrorJz+JoOx/OD9Tfknjsymjqzo4fj5QQs+7597pnIHLuSzy6yH56F0cG+BWQ5bQzXGpA+sJVMMpiW8MvZjL5zKN2J6d7TamlNsmPy00mw/H4zCzkfS97ZB04jlaWT/Yu1u7vpBi9OVr6QPFf0N66UwNdFn1FieKFPT7bKGQ1dePxig0yhJx+HYMlXpVfBwSogdrsj98QZxKjWGj44+6hkCV28LRxAe+epjfeepNOYFWE8bROSHo3B3dMd/hemFs+e4M0P8QO7m9qJGQ7niXxfrI+OlJ4iPQcmJQfa1qlyfqMDU2RRaTEZdfKUkj3x6EhLcwLWO+7INEL+Z63PI2D0RexrmtMFafxFLqGbJ6x6MwI2OiPksaPjxFxGIfcDvavd1enKguRf2KEEPD0Az0nsmhXgr8Wlp3Y40r4g8kMK3Vuap69OwPiQGK0QLO+Yb8w3RTiwFfresHLXJ8tUSBGhyG/zhrnr1NNzeOaS3zB3RxiknGtKsuNwOtDDUtqRb6FSNcPkuX/4mmo7fUG8bZRu/w3A/EWQPwoG6tTBKPrG9SdFO32WbUmWbUnWwBMlWYoHgsqBYBpOhi0ijSgVU/jwyOm5oRRJOdVJQEzKA5OAWPkNZdmWZNmWZNmWZNlWjuUA8cBS+Asyky7bU19oD7fBm0t2tA+UqOPSBzIrKdHSDcXxUoJKzl13FIeqgdZB8tWmX0xR6Av1hmjVnSit+I26jld64kr6EGrBSDdEgNsgLVpov/OHrNW10DcUzc5Ouf9Ubl1IKgtZxBDZZCYFVUy+XNKSF/oXJaFq+prpiqsmjeYLm5WTgeJ0B3kQKjtED/TioJwi8UBJzMAulPknzoGky7zwAHspr0gt+s2ZLP9A5HW50hYq1gSHe9EdTdno/kUkUxmzXhG5+oa5K56BoG1hkoL4J7aD6htGe7gXP9EzO5fJhi+HYGbAF4qTOoAo31DDpUGKmHIunMzTQTTly+2Vn0iZrpgSVjnpq4uTHqD1hHICpvAPd3VxjAsGjoXApQSkP9Cap+9o+o1uSZZtSZZt5diWSexETS79B3rqzFiSbVmSbfXfjsnjqXj13DCaRDkmWkX55CEXb4a0oxd/QYtjZad0IJnVUz35cpsE0xeKYmqfmLX0BNJTnHCowzTV7pIEtv6GaK2/oUSJyVjqElw9iz64ZaomGtRCLxRDk6948BNnAqp2GP6Xpyt1cMw6ZmVmCV4uClaO5QDxB0cQrdPxwxFiq8EOoXWhHX45mf5Ypv8+3UDbwuyH3XdSQ7esmMiV9BOlqasnbUkGrR9MUegnmsyvCiJGzdqQvHxh8tOt3Gcv1MJy8vIdsyN8w/QoZ+mkxmM/yN7qr2jZFgE7UILEBsWhh6oiDmoOBJs8saQBtmPyD48sAqYvTA3nGW1JW7y8iTjWwW0vvlA7Chb+hhLFmHLaRcAUcdBJZQ+SYOThby5NXfpGSZY+3Eu3cmzDcVDJQJhsS7IGFmqhqeBQTX3j4lDDJIInEH1xWAlo/MiDVs5EpdaUgCnnDaOdToIpDzuRBG6Dwhfa5N05aC+Mhg9TJpTzypmpfkOU8oXJl2eZbWG4sxbU5dLk0gdalnDjByZfzuKVUSfz6gGbgZhoU07wcFGwEyR7od7QqE7TYOPBxTEKQHRg86wtXYWLb0LSoxD8y7Ms9RuG4NkDHDZ0os63mUychexq9omSbQJ2oqRI+A8iTJsVTGMQVl7UHtuB8oGOjn+i1f0EjPzicuYse5xEZBE3lJS6OAcmxWNOwC+czDKqZL8hWnVTlxosvaI4qQF6RURMKR6onBKS4LjTg6KF5RaHUGuY6qQKWU/VoO+oxYuWfrAK6qA4hnkhANPlFLCT2578L0ztdHY1XyjJnh0ksiSoggnBw8VxxB+M6lEzTI99cOTyDalhCF7/fwAqfyvE+5dB/kpYvpA/FSbLXxSfyAR/ZUVNDw7BnjzLou3IJHfxh0qMpNawOP1kLCOiNy7MPeEPTC9bB6jHTj6joTgES+OsgCTB842jj1bOor+RlfTwdcTMhcMmheRbwjdcd3Xvlof/elYwm33tffBZzd3RcTLaEvMpg3ukyDZqje+YntPZ2XzH5Lk4yJ71Nq7pPgJWEem/kD3TRTK72Mo8NDrjzXjDidHCwfxebS6vwPg7tneWJDJGX7LMgkd9UeoVecUTmaOJ1/auH6SW4e5rKx0Lsyz6tFRMK756aGjthtTKFyaP09hdR17kSU9sH3qRHb32L0zt13lkNgPUyEgSgfDtN0LligitkfyN6100YUz+ydlGnSvyQfTfOWItIW3B9hIOPq9NXHdRy6Iov8iGDLY14cmZQu7chv3PJZzdk6cvwiCRkcYHsj8z+awgI+0qUuMtpGtmcYS54+BMpO9fPPek7wW5HmNXamRjG4/OLLf2PZ9IT95HU4w2dvDmEEpwrDxIgqV23BekgjEX8hyKdvhWS3flBHYenJRdNQJqBOawD04DxesbNs7u6idmBTvP3wae/PDsSX5D+ssXJv9nZ397d0y+vO8ivyH3lC9Mfnh2JQc7BbYLHN7H9z+ehCUnTRnMb0OaQtIiG76QuxgitvlENmDMcR1JY5G2EhBDaiw2W/d058r7nw/5PyHLpy8ruzGrUMMDvKnywuztq+Fgmpst/cmz++7ZywQ7Rw/f/VHjjvb9hanF84bsbc7OL0wP3q87ZkDaeX7uH4dgNFLLGyDYg8+SjHIhc28cjSliWlbGzgjdm+ly5oMf3t6Mt752wQ99MDvYTA+WhDcD3HFxhsoXkrONCKeJDdDEcNJUmjawj1rS9BbpOfNnLXzz7nrhh85T8x2snXvCUzsw9yT/C1N7cRZi192QWB5/IbtDcv8gWa1hvYQRsjF0ErYySeTeVh+YXaOnjRks2rRBsPDx6XnWyrmrPWB+p9nZYeSF1KoHkXhVKKxkw3UPwDA6CZdg9DNFe3WE3BV/8mg37wpmP3HVuG3WL547zhm08oXJ45kJ3jxPTd+OyQ+/aoxji5ON8YrsK6EWxJOxgc+lHk7PcB5ZviE1LOXpZyS/CW0nJ9nqbYDfsTMzxHJe0KVJ6SssJI+V0fOLKNUXkuf+7id/w2jxuT5353nMcxEjGY9TXrVklGGbDqOZmOr4wT9x7qHMHiaz8+aHtmPy5bmFYVgWhc0eMhJiKuPl7KYxab5sIUr1IEmMnTRQL/l/IwNZxv1sWbuisQ0dLfYgQxNxZvLqmXlwatVfkfXVd+SyWRExoxfywvznnruCFKiXXZiew7Mn+V+Y2unsar5j8n/03kXvibyQ72Pleh98Po9IvtUi7N9EtTMEjA3pxSHYwZlCw2jnXmSKseGUeQpGodaAOshE+wgYGp0kU08+i5HSSR2DLINgvQzs24szPqPMoaXn4giQ9nPH35ir2NGVmXvyVcu+9LxhtH929rd34c9O7uszNkxPviOY2eQvyEZ+hsyNDyeml50UYxFOvP03APs3Q/40WMxfDbnQdjP7F5WKiamBWmg7aQqyOARMIb9YhdKOXvwFLY7FFTeUodjoSXCsPLXTSTClEBQh+SeyJLXAA33yFodZD/TiG+Y+3DbNlu0Nk4YvlKirJ21JgnRcOmJ50fIPGm05w81O1NS8YfJ/cAYxi1UiZsHCMMM9vNFSURyTAUQH8BNXkp3IunAKNoi1ANoNGk4uPNqJksqlCzWH1kn+iD+zGcLRLUsgAbPyjyDbcOxESZFwcSIDGvQvpij0E03mpQweERGDWRuSly9MfrqVe+0PVHT8BZUZSVMVJ5ng4+IYj53ITPlfSM1mArefyDQaJhGogpoDwaQGafBGpBGlG6ZneSC1F/ShW2q6MHmc50gkRQImHfyGM2gvpCaOP1GtWBwCpowGkwRtyykHSWwLw4ObHz1/YWpxS9jp4hjmhUDZjefSqCeurjRVh1PDJAIGYqnjGKTWYLnY0JSgnKCpGrI7FDVRwZR+UIqknNZJTiTBlIc9MJKE2MSyrRz7gVr8xHRpsQcy2+4bopQvTL48S2wLw19QQselD2RGUqKlhf5Grx6wGeh0Wxwr75Clb0wx9YUKmuiILyiO0QGiA2ABHD6s8RBOXEkfREfwL6dFqd8wRKesx0qtM7JXeSG7Jku0dPATkRR9Q2qVkA+sFC6puVQkFi3+uSzZOI2ebItHz0IH8b8wNVwc28JwSzGIbdmGW/kn8gul4dKJkqw5/4nsaudCOxP4QnvlJ9LdfMfky4H75ZlfIqm2Yml5MpNZIh7u5A5rgB0oQWRJReRftPLMNBQJmKTo+MJfXoXqjsk/nKWWZFuWZFuWZFuWZPvTKciSbMvinKjFF0obbyf8L/Sqg+zMdCGqxSFgOnjy5e1bOWUpIfwvTO3TxemCwWf6w91N4iFmopgk/ESScpAe+z+Qnth0ScHDwyb36OyyJNuyJNvqvxOXZjCVYGo3pFYOSqIsqAZ9okyNAKw4fOKvWj1yum9IpXwhee6iTXZI9DtSQIxFx4WnV5wnpoasE/V9nrPls9uZD19uW5G00IZLUDB2cvUsSr10oeVSv6AlhqzrHykGNyWyMYs2EVU0tS+X1R7tSF6+MDkuGi3J/SdOMpVZORYtSf5AS7HVaJfI/kBxqFEVTTpQORAs2elPrpmQDmRX80+UlFoWPdBGxLQ8VJw7WsM3lNNFfEMt37pYKQAAEABJREFUfSEtWAi6lBCencFykvKiNflCBTc/+ImsZMCSbMvSP7s4tqcfhMo24Dui2RZi7I7ipAToC6l5FYtwhUtES8RPTzn1G0qRlBP9L09j6jeMYNlmw+WW4SI+UT1VCdjGTT+UXQb0hmjVN7SN5EwUk9mWUYA7RjvdUyO6msmEL2Q4md0o+8J2mRgNJKNOJEciwciFH/zl/w9A/noo/kjIXxkB/lKYPx3C+SvixekpD6KSY2mi/8GhWdUtBIy+iDiEDSQxCPDk05za4TRlYSAY+UTE8gdGO50E60OD5ywE633zMaQVHsugmQGut0Kw1252Vf8LqeU9/Us1zTfMXjQgLYFipIxFaE4yOK9K/OWjHpEPXLtQ0sx3nTvL6Qji1d+QmbEU6R9CDGcv2ahw8sRwnoulDuw2DZdy8BNX0gfRFtydO/pRJ64eYHSStSItsP+wR3PuyiDY14P9HnA4jLwtE+Za1kTOZX9jt9C2I8PsGiXxchrvFVqx3vnE9iLm/jiD9EV4vnn2U6Ql9Z13C/qOzIfidBN/eUVC/2cbzO6BTODXgxhePBppew/sUAIeDViPYS7k6W9N0Q5Pf/KFTQm1hhS6G1bsfZA8L8XiyfmtyNNYneb55ugpgGid+8RMj6elUwSsYjC7B7MPGeHkyfH8bqfWC6f30E+klr7jLmjSANjKN+aeVE/MGDMYr8oVAAQrKdJzICnjifQNDKcBe4g0RNwdaQZIogM7f5HScbXQgF1vg2Dh/aQ0NuG3K/KiAw9MD0vpIFJv/MKrK9f0nvSz6+L0lKPEkn8hs5T7gidGZFMAZ0F6yQDizv/oahv1G/Jt5QvJczdL+ZwQbojQtCECzcA0kUTHyVaB7ItTOuxoOfkScl+0N4x2+GtPRF6xVuWJUTISPHzK/BYV3pAOhlo5kb1ZmNKB1FaaIr8ZkDqe1atcnUoxO0dPVjWBNeHjEbLiYAfvzgQ8O4DufEc2xNJ4IhvLQW6c4RbDuIZ8LVtZ2D/6MbEw92SyiPaDFKNR6juK0ZYD8yiS1IA7v8TJEsfzdXwMEzuPEr6QFAuZtRDsziPgeWYKRQLW3fm/B7krOPUyPoeh6ejuUdPx7rQys2ozCp9kdlPrpWzakbz14FrSqZMzV30h+dQvjlRjc/GqpHNzdrYWKV/1htG+PNtTOxGC3XZm76efgyQdBMfKGuAgdls7nC9Mwndg1MMRIP0NM0oOfPz2jKSIM0UcnjweIcjW9QXJ0rOQ3cnmLjKaidw1k5TJUdBJYhm+cNq6OyFtd6yCtCP7ULLoULPmlU9DSkfLA2nA+qA3zD35iBMZL98wNeh1SclHyCUpLdx2VSknA/OVXU0enN+YW3549kV/w26h8BemNt57CHNF3sHejY+ORoml87ORR6cNY0842VgJ6YZl4fRmSXmSL859KeO9B2QkkfvZk2wV+htFCj+RpBzcehkOY/mhD/07rt7jAU/MPdFOzDZmMC6q9V749VZ6ykGsoyfym1DL4OhwauUnpiF68F5Jy6jRYRDseELFnedNuedEvuXic0dr6Fkys9Gze2FSPJb6n5jlNGQnwMqZGM6+1nekK1rawECegtpvecWKhM/mFD48ci644bFrYWpxaFpvHtIaAesjeXfw+Mbkcb4yG5ho44aV4S9IK5bxqbN7+NoWjvPDYlTIc+/h2dic5MKuo39haniMDb0nOHyydRu18LCF3Jct2T24plJOdxBfbb0T+cTbfwMwo+bPgyYxCMh24IFePEiZHkyIsResRKitIMmxBmkIEa6cHZM/ffVEZiqmhHIpqXLCbw7BxIMxBbVziF1BdjAtD9TiJ6pnVC11ITuqP9D29AVvzlz5Qkn29NoHoknouPTA1aM3jHY5k2KlqlgcK1x6oFFwZLVOfqJCqL+iUS01HihOcqD6YKLgMe3nah21F5PumPzLaVVqoL2WLbQXpxY72B0tp0gsMmNy2XpHUTIhtjAzSXHhUB0uTvMTPTVtmPzTtSoL/YZo6OL0LvIgg7JD9EAvDsopEg+UxAzsQknl0idqHXt1LrTD8R2Tn85g84WATh6CM06UHpi2XZyyabPU+IJIpjbmtCW9I3LE7ie/IYVwL8ygXSbbknz9g1tafMfky2nARKve0UvfkGbbLLDsyyGyONEAnSiNvlAaLoGtfCM72vVAnVxqnjXRipK+UJzU0vCFqX06862JyAJMOSAmxNiGVp6V8I2m37RYkmVbkmVbOfYDEaPESRW83IsvZNY02R69SL5jcku28QdKo0k/KKMRGEsMGZQe6MVf0OJY2SEdSGb1VCe/MIRShKYNEcS4lJDaieLQQ1Q05Tx5tOVHCdq0u0I80y/ctoTbwaQbSpTg0obqSXuSqUqDfsWocTEUtBs71MxJnTK+UAtN7cuPnhdEwnw6W8gnWjkuF9HKsXhWkj/QUiyNJ1q20X0iyXBxUgOieWEgvPhn6AQdC7ddElr5jpKiVUqQnjxlpYSLU36iNXxDOVXiG2rpC2lxFO+cvHxh8tOt3GcvVBD/xOxIfcP0SsS7i8Pa0Q3B7EnsHS3bqQ6S23AcE2JsUBxEqhIB+0Vdx2kqdaPKky9nV7UTxaGGKb3Bf/SuOGbAi88CeyG17HZxMnEuDsGMp+VvtGbtjsnHU7Qnt0F22k+ULAlZRekFvbQHMhTFtkSH7UTZlmQF7MEQ0shJB8Wxfrk40dVA3LAMvqHI41GD6rF6X3In4D+IgLXxDYXYJb9oo7FS6ZFkH1w9B7uj5VUtMvOLKNUXkgu3w0VqfFCcJVeDFk0yuuXkxG90q40M3VFT847kcHFo1+FCsy0Mt1RrIN3RiwfF+S8U/erJ7kkaZftIijYcoyCdSFI9KKm5VBQnHLh4CE478WGHaLmViYI1Y5fJdeKqeENqCj9RGi79IELaUtjRu5789HbCPtDR8U+0co/9hmjCUwNVzC40cRY/9BNTwmNOwE9kBkrrKPaOXvqOdKfHg0lpkhZXTvJPfCtG+/DIWQ56oRae3NKSBg9etI43FhVu6RNbUY7pOdAkcaBq8nhIMLsHHUm2ZZqL9vBX1KotlIZLG5KLYwk7XRyXiWjlmEz4idxZfqI4VA2kL4ivsp74P9vfEvOHQf4yGIW/JfZPhoNRrr8wwqiVF7noPzF70gfmlvxF8hXZHR1P1m52Bw/vvdRj0VoOYWd40rtTwPiwlnfsbMLyY/cdGUs9zz+wF6AH2Y2FhIHz8twzOjxzONnUky9v38pzLykSnQyXr3uho5ez5sTVy+2dDe6OSMeaJfvh7IrGBb1vQ4Zip7OWPA0zU97A3r+QWjqYIuPhRLaQoDZ5YksEJngb7UlwpHKG/hUZ4dGJAHPJMgvme4HTpspbqiykt9lfSI3lGBti5Tx3w6bU8i1HHqSLucYNcyNOA5GRPyI7W/0LUzud7uY7Jq/IGybvb3Pcv5Aib+HHKd8wKR6jFJg+su75wbmjX50BvH0b5q44Em15W5cQsIhIcwkJRlOtYfG0lbeRO4OIybr7lTNBT0sT0oqIZS+ecsRXZCbfkjuCTNFaVixPT5wFrEuGrwoCRm84fvTsSEN2I9HHbpLh/5D356MPZHjuzb5y7kOBrjh8SlHh3EVkNJw9bxwt76EpRnv62FI9ePn0hbOv1hCBOYCXrCVwauG7s5MCjasWSB3k1ilRXRIclVp2zugbp4HivC31jbOo+olZSZ07RocnX957kmffJ84dRNqJ6f1x9lZ7YHeinZj58D8wb8fblZ3k8/bM5Ft2nMW00R49vCkBS4GRzr8hu/koYosnMomxj3Ukja/IWIsnroR7m4HZH583oC7t4HfkltYXsrz1G0KwtNHFmyFENpNcb25GUzA7gn1HepdOikSF4fa8IrdUDz56WdC5vzC109nRfGH2hoNVQIw38SlYdyMEaUMv+XdkB80ZZT1vf+PRlvee5twDDifn92IBRp5tO09+eofow6r98sjnCpLyG84dx93z6kR0mpPNN4VzD7Nji6enaUNaN2c68tFTjLacRbkXxkzjA7kvM/2s1OGZCY9n9w1Xzz6THGcxRp08d0KwLBgNEuOC8FlKdTiUa2PwGJUagRoTxKXTNZzIXVHXYiD9+NIHwhkPIWW8I+9IA8aiWIborQAfJKneb2QJrxhOTkJMH2Nky0KSgtOdHe3iTdjoESDd+8Bo8c6tWviMzM6Ls46H0Madq9YMHfF3hp7qH5ja6WsHS3pfMVouBHNPtYThSNjOuQel3xLEo7Sbe+7I3tQZHx1OvtpYERJtMG+indbhNKw8HE/xGs7g1NE7i4IwsX1NGzKdff+JmcO77z+R29ozmIugvCa8LFfC//dC5PxeecfgFhku+8TspYPhvI+22Vv+Vrt6eQQWjpNlsBlLgsN5HDXWkVS94xTSij73JclbTqSnPHvxND95tHjKQa7MskL5LEtEH1jFnZBzGTFNzWYhNG9HgSfLzsGUov+FLEwL3rkdeUS/5YHZfeqpHc7s1Lgv2iunVj1Id/K8+8RoH96d1E5cO/IJ2bFhvyV8OYDEJSTz9pklLp297IBg9JG374Ydpv6ByDwtMWtJsyd0Q9QW35C7WjvxmuV1LfXyrEsPeKwJTe0XaULst9D8N+YK+rm29y2MEmc8lmuKSaJn54nrrmr/mXNfexbmvvAbUisPzqsSz/t4Se5qtbNUwXc+i6acvnA6u+wX/8fKPzVakm1Zkp04aPGvPLg0S0LD7igOtdEl0oYLyWoN1EFpoX/R4jQUu5eumAjDJVL1pPXmEExpDIqA6YYR8PQohxywB5VeiTh8YriEGNvQi2+YPXiVIC7c9sztKFGyLMlODOISHJcU9XIvvmPy5exodmLmUbxhauEnUoNnMZIOF5onEE1TLOjFF5ZZKopjMoDowI4jKHekdKBOnQRTCieSlIPCjzy4Lzl5RJxW4n/Y0eRslrrDRcsvGCn6G6qnK8je0Rp9Q5Ev18JfZVUcxP/C1E63cp+9UEEcVDSRL1SR3UJTzoFCUY8bdfElLJA9mb2jl76Qmm2WGF1qsBQMqEF6xz+LUofSszz3RANdFMeadDB5HDZ6EpyRjVvlekNL1ReSlxcnE8cnVzOLQ8CU3YOWIyOcSGJbGB78w5+z5ZLFIWDNgyjkxoVbOSa7YS5Fs41s2V4IyBr6RC0dFMeXW1asoWmDFJG0mPzLzx5xIBiJ2i7OD0fAxEMxBbVziF1BdjAtD9STq2dUrepCdlR/oO3pK5KfyFxyf6AkyqKsd7Qs4ca/MDVLdMwOK3jwHzQKLrx9NwxJfWGb4Dc0zIgGxTEe8w+PenMvduJK+hBqwT/96JHs+6x9cPU8qKbqP9ASQ5Y3JC3fkJ5KJ1KbEeUsWYN+QTThNBCTba6Vf6Cj46A4rKBfCopju7ltKVa0bMOt/BP5hdJw6US1qhwn4E9Eqtn3ih2OfyJjqdGiN6Ss1F4w7dqK05Y47tYSLZEbH3Mo6YESJDaILDdt6PCULmYAABAASURBVD1og1bQHkyDTS4cfHJLqeA7Jv9wBjBl1aBlSbZlSbZPJ8GeXEKMDYpjCWt4RYl6Kx/opYPcn24tLMiVEsqhkf7J05T+G0bAX5eJQ61xkLRWRsB0rXNS+IaWxG5sIQLEBmXZlmTZVo79RCnKkieXFvqONFmSbVmSbfXfJ64e75h8uSRGRZkkZg13iMw/ce4Y5qU+MJSZ7NCJZNUXkrdeTJAUIenCg1PAKAhPTZwnpoasE/V9tlk2Sm88Gm7TgdvBtL6gtK9QTtovtBxC3NE3PiwRGSOzvjG1L89Uai+IhFk2LnOBE/FBBHJxnlxLB60eViwcwd6Q1G6Q/cBMRVtIVTSpB728hHAj8NohfiA7JGonihMu1EGllvRESeXqiZxk0PpBmbKJfkEtfSEtjuKdk5e/oZX77B2TL9cTswNNkr1QT6SmOQYOJ5Udpgd68YX02E4TupQQ+oripBXQhqHDEQ9yYrQPjzyDdEMwEkVSTvifThETD8aYgDQxksvtHSXzT5xfRMSMx4oETBkZdFL4huy34bhwe3IblJCeiCah49IvSrK03HfsTjQwHTY5HbalYqNKZRWNhgv/4eJEB1LvfwMwOX8rDORvjXecPyXyh9D5E2JpukIPRMT658Ulk7MGgk0OpT22OBVsEaolC5MfjjRTJGhYZ244JWJLd6QR4wNWDYKVnJgE70dkmhyYv7qSrPuv3yhaNzSZ7sXZUf4XUst7up/mG7IxHJmWRPYCGJw89ZvPqxLbw1sPpK1saksNRP0LqeWJtPXOG5bkHWn6wPQsp4tnTEw3BHtypMOepT6E4o7pCQ/mnuaQIK3zaJKTk8doCfztR1N+NTqPHdxTBX7HfBUztQauP5B5jBEifchJ7pxt1TekCcaNJMTJj8ieaguZxbgzvWgQ7M4RrjtD0reQXWnO9nfM3lZJDmQeFmNL4PQffl08PTdOd/jNaStfCOSJgU9s8QjsbLpj8l/v10TOYvDiLChfSN6WN6SQ5+YXuXAa87/H1em5cDI2o6Yv/PLRL56d6bqwr+Q/qqj0Ucg9cUQMfWkQ7mBjOHBx5soXkjNFfONTmVtTD7+89+aWSF+Y2uG55ciDBz8REctNWVdsEvHNz0ES6hjJjCX5g7fEbzPr+cIR+JmShAdZlR52zbfCM3DjEGy6U4dgd84+NJZ3OrtaZ3cqw8kQmwfppMzIprOjGkg5Rn3d2ZkUFidlkhhOkWx4YngQkS1h7WqCfkMq5QuTL89bGZ9CtJAfjIDn4bkuPX9ii+/h2PEXpnY6a5rnibwB2h8M7NvB4zlp2+iS+S0iwmb6wRkaJZGOWsNMNG24eOjyrGYFtbwPJxuehg+eHnyq3VD2ylnTjk+kEMulNPY3gfc3AvNVzXMDPUhc03hhasz+m63ZY4adnbshPeVBqslJ+44nUj5WPTFjPDIdeL+kSMAuPllilmdiQ1Is4qyHYHceAe99BIynsg8tjeVM97ddSHV61kvSWq08UyTY6HeOzJZE9Cwnnd1PzsbU8daLbebuhUCW5Z4dI5+85AjthOyY/MMjn4sgGMM8tHEw2pf/zNLId3TwwPScnr30AHw98bKqBKxikYDNuqjsHL6mw/H8YP0NueeOjKbO7OjheDkBy75vn3smMseu5LOL7IdnYXSwbwFZThvDtQakD2wlkwymJfxyNqPvHEp3Yrr3tFpak+yY/HQSLL/fzELOx5J39oHTSGXpZP9i7e5uusGLk5UvJM8V/Y0rJfB10WeUGF7o05OtckZDFx6/2CBT6MnHIVjyVelVcLAKiN3uyD1xBjGqtYYPzj4qWUIXbwsH0N55auO9J+k0ZkUYT9uEpEdjcPd0h/+FqcWzJ3jzQ/zA7qZ2YobDeSLfF+ujI6WnSM+BScmBtnWqnN/owBRZVFpMRp08pWRPPDrS0pyA9Y47Mo2Q/1nr8wgYfRH7muZ0QRp/kUvo5gmr3oyAjc4IeezoODGXUcj9QO9qd3W6siD5F3YoAU8PwHMSu2YF+Gtx6akdjrQviPyQQveW5umrEzA+JEYrBMs75hvzTREObIW+N6zc9ckyFVJEKPLbvGHuOvX0HJ655DfM3REGKeeakuw4nA70sJR25FuoVM0wee4fvqbaTl8QbxulIpyRtBcmpCj1vwFIyh8DHfjF9SdEO3XLNn3eMDR8x+TjBtRAAmIaToYtIo0oFVP48MjpuaEUSTnVSUBMynuTgFj5DWXZlmTZlmTZlmTZVo7lAPHAUvgLMpMu21NfaA+3wZtLdrQPlKjj0gcyKynR0g3F8VKCSs5ddxSHqoHWQfLVpl9MUegL9YZo1Z0orfiNuo5XeuJK+hBqwUg3RIDbIC1aaL/zh6zVtdB3pNnZiWpc5daFUnTkIkE2itFBFZMvl7Tkhf5FSaiavma64qpJo/nCZuVkoDjdQR6Eyg7RA704KKdIPFASM7ALZf6JcyDpMi88wF7KK1KLfnMmyz8QeV2utIWKNcHhXnRHUza6fxHJVMasV0SuvmHuimcgaFuYpCD+ie2g+obRHu7FT/TMzmWy4cshmBnwheKkDiDKN9RwaZAippwLJ/N0EE35cnvlJ1KmK6aEVU766uKkB2g9oZyAKfzDXV0c44KBYyFwKQHpD7Tm6TuafqNbkmVbkmVbObZlEjtRk0v/gZ46M5ZkW5ZkW/23Y/J4Kl49N4wmUY6JVlE+ecjFmyHt6MVf0OJY2SkdSGb1VE++3CbB9IWimNonZi09gfQUJxzqME21uySBrb8hWutvKFFiMpa6BFfPog9umaqJBrXQC8XQ5Cse/MSZgKodhv/l6UodHLOOWZlZgpeLgpVjOUD8wRFE63T8cITYarBDaF1oh19Opj+W6b9PN9C2MPth953U0C0rJnIl/URp6upJW5JB6wdTFPqJJvOrgohRszYkL1+Y/HQr99kLtbCcvHzH7AjfMD3KWTqp8dgPsrf6K1q2RcAOlCCxQXHooaqIg5oDwSZPLGmA7Zj8wyOLgOkLU8N5RlvSFi9vIo51cNuLL9SOgoW/oUQxppx2ETBFHHRS2YMkGHn4m0tTl75RkqUP99KtHNtwHFQyECbbkqyBhVpoKjhUU9+4ONQwieAJRF8cVgIaP/KglTNRqTUlYMp5w2ink2DKw04kgdug8IU2eXcO2guj4cOUCeW8cmaq3xClfGHy5VlmWxjurAV1uTS59IGWJdz4gcmXs3hl1Mm8esBmICbalBM8XBTsBMleqDc0qtM02HhwcYwCEB3YPGtLV+Him5D0KAT/8ixL/YYhePYAhw2dqPNtJhNnIbuafaJkm4CdKCkS/oMI02YF0xiElRe1x3agfKCj459odT8BI7+4nDnLHicRWcQNJaUuzoFJ8ZgT8Asns4wq2W+IVt3UpQZLryhOaoBeERFTigcqp4QkOO70oGhhucUh1BqmOqlC1lM16Dtq8aKlH6yCOiiOYV4IwHQ5BWzjnpzLLcm2LMn2hclPXz1eKMm2LM5CYHEVU4uL4yoiWjkmE35ihsNPFIeqgeogNSyJiqktf/L/yV8S+bshf01tvGH+ZNg6f0YMUsTou3HuKd+RyfVXR7ohMYRaQtQN+ZNklHax6w25OBcM0B+bvspJl2dvNDaSdiA78f0bopez6G/M2ixaSIqFMLnuAbrvwHVX9255+K+zqj0fyE7KvWtwvouYK9GbXUhTlb8wtdPf7o2Wi4Ns44Pzbi7hzpILRyQunYwi8eDsGUYyu9ialo2j8B4E9MyRhSctNknTn943MsqSRIC5ZNkBHvVFqVfkdU9kjiZe2/t+kFqGu6+tdCzMsujTUjGt+OqhobUbUitfmDxOY3cdeZEnPbF96EV29Nq/MLVf55HZDFAjI0kEwrffCJUrIrRG8jeud9GEMfknZxt1rsgH0X/niLWEtAXbSzj4vDZx3UUti6L8Ihsy2NaEJ2cKuXMb9j+XcHZPnr4Ig0RGGh/I/szks4KMtKtIjbeQrpnFEeaOgzORvn/x3JO+F+R6jF2pkY1tPDqz3Nr3fCI9eR9NMdrYwZtDKMGx8iAJltpxX5AKxlzIcyja4Vst3ZUT2HlwUnbVCKgRmMM+OA0Ur2/YOLurn5gV7Dx/G3jyw7Mn+Q3pL1+Y/J+d/e3dMfnyvov8htxTvjD54dmVHOwU2C5weB/f/3gSlpw0ZTC/DWkKSYts+ELuYojY5hPZgDHHdSSNRdpKQAypsdhs3dOdK+9/PuT/hCyfvqzsxqxCDQ/wpsoLs7evhoNpbrb0J8/uu2cvE+wcPXz3R4072vcXphbPG7K3OTu/MD14v+6YAWnn+bl/HILRSC1vgGAPPksyyoXMvXE0pohpWRk7I3RvpsuZD354ezPe+toFP/TB7GAzPVgS3gxwx8UZKl9IzjYinCY2QBPDSVNp2sA+aknTW6TnzJ+18M2764UfOk/Nd7B27glP7cDck/wvTO3FWYhdd0NiefyF7A7J/YNktYb1EkbIxtBJ2MokkXtbfWB2jZ42ZrBo0wbBwsen51kr5672gPmdZmeHkRdSqx5E4lWhsJIN1z0Aw+gkXILRzxTt1RFyV/zJo928K5j9xFXjtlm/eO44Z9DKFyaPZyZ48zw1fTsmP/yqMY4tTjbGK7KvhFoQT8YGPpd6OD3DeWT5htSwlKefkfwmtJ2cZKu3AX7HzswQy3lBlyalr7CQPFZGzy+iVF9Invu7n/wNo8Xn+tyd5zHPRYxkfJyG8juGUc8cPmwizVU+ce6hvObDd2eaZ+RtV0+05bmFAqxDwfais5BYpVjOLhqT5ssWolQPksTYSQP1kv83MpBl3MuWtSsa29DRYg8yNBFnJi+fmQenVv0VWV99Ry6bFREzeiEvPH6vIAXquRlnDzEdl2dP2F+Y2ulsaL5j8n/03kXvibyw79pwPo+4afRE2L+Jar+NgPVRL8gUsxjt3EsbTbHhlHkKRqHWgDrIRPsIGBqdJFNPPouR0kkdgyyDYL0M7NuLMz6jzKGl5+IIkPZzx9+Yq9jRlZl78lXLvvS8YbR/dva3d+HPTu7rMzZMT74jmNnkL8hGfobMjQ8nppedFGMRNqQQo4e16CFpGfwf2+q/F1QqJqYGaqHtpCnI4hAwhfxiFUo7evEXtDgWV9xQhmKjJ8Gx8tROJ8GUQlCE5J/IktQCD/TJWxxmPdCLb5j7cNs0W7Y3TBq+UKKunrQlCdJx6YjlRcs/aLTlDDc7UVPzhsn/wRnELFaJmAULwwz38EZLRXFMBhAdwE9cSXYi68Ip2CDWAmg3aDi58GgnSiqXLtQcWif5I/7MZghHtyyBBMzKP4Jsw7ETJUXCxYkMaNC/mKLQTzSZlzJ4REQMZm1IXr4w+elW7rU/UNHxF1RmJE1VnGSCj4tjPHYiM+V/ITWbCdx+ItNomESgCmoOBJMapMEbkUaUbpie5YHUXtCHbqnpwuRxniORFAmYdPAbzqC9kJo4/kS1YnEImDIaTBK0LaccJLEtDA/5tMZIAAAQAElEQVRufvT8hanFLWGni2OYFwJlN55Lo564utJUHU4NkwgYiKWOY5Bag+ViQ1OCcoKmasjuUNREBVP6QSmSclonOZEEUx72wEgSYhPLtnLsB2rxE9OlxR7IbLtviFK+MPnyLLEtDH9BCR2XPpAZSYmWFvobvXrAZqDTbXGsvEOWvjHF1BcqaKIjvqA4RgeIDoAFcPiwxkM4cSV9EB3Bv5wWpX7DEJ2yHiu1zshe5YXsmizR0sFPRFL0DalVQj6wUrik5lKRWLT457Jk4zR6si0ePQsdxP/C1HBxbAvDLcUgtmUbbuWfyC+UhksnSrLm/Ceyq50L7UzgC+2Vn0h38x2TLwful2d+iaTaiqXlyUxmiXi4kzusAXagBIkNIofkWYOSIJgkq0jAJIXjC395Fao7Jv9wllqSbVmSbVmSbVmS7U+nIEuyLYtzohZfKG28nfC/0KsOsjPThagWh4Dp4MmXt2/llKWE8L8wtU8XpwsGn+kPdzeJh5iJYpLwE0nKQXrs/0B6YtMlBQ8Pm9yjs8uSbMuSbKv/TlyawVSCqd2QWjkoibKgGvSJMjUCsOLwib9q9cjpviGV8oXkuYs22SHR70gBMRYdF55ecZ6YGrJO1Pd5zpbPbmc+fLltRdJCGy5BwdjJ1bMo9dKFlkv9gpYYsq5/pBjclMjGLNpEVNHUvlxWe7QjefnC5LhotCT3nzjJVGblWLQk+QMtxVajXSL7A8WhRlU06UDlQLBkpz+5ZkI6kF3NP1FSaln0QBsR0/JQce5oDd9QThfxDbX0hbRgIehSQnh2BstJyovW5AsV3PzgJ7KSAUuyLUv/7OLYnn4QKtuA74hmW4ixO4qTEqAvpOZVLMIVLhEtET895dRvKEVSTvS/PI2p3zCCZZsNl1uGi/hE9VQlYBs3/VB2GdAbolXf0DaSM1FMZltGAe4Y7XRPjehqJhO+kOFkdqPsC9tlYjSQjDqRHIkEIxd+8hL0D+x/A1Cc+Svq+ssgfyocnr80tshfDj8QmfYYw7UVKPSPjATSQ2Rj2cEH03N4yskXNiVgUeYisp0nP50E64ODGfjBCHj+KsqqeUMStEBmwOutEOxeXVPsqP4XUst7+pvSfMPsRQPSEihGyliE5iSD86rEXz7qEfPC7ChPM98VzqrecSK16m/IzFiK3ZiAFN7NrNkRSjUxjXRNesSncPATV9IHMRTcPbvDT1w9wPVRIfhaRfaHHU0Lt935qtlJDX04X0Xe6yfsLb0n5STv2C2Ud2Q/u0ZJvJzGe4VWrHc+sb2IuTfOIH0Rnm+e/RRpSX3n3YK+I/OhON3EX16R0P/ZBrN7IBP49SCGF49G2t4DO5SARwPWY5gLefpbU7TD0598YVNCrSGF7oYVex8kz0uxeHJ+K/I0Vqd5vjl6CiBa5z4x0+Np6RQBqxjM7sHsQ0Y4eXI8v9up9cLpPfQTqaXvuAuaNAC28o25J9UTM8YMxqtyBQDBSor0HEjKeCJ9A8NpwB4iDRF3R5oBkujAzl+kdFwtNGDX2yBYeD8pjU347Yq86InpYSkdROl/G+l7xasr1/Se9LHz4vSUo8SSfyGzlPuCJ0ZkUwBnQXrJAOLO/+hqG/Ub8m3lC8lzN0v5nBBuiNC0IQLNwDSRRMfJVoHsi1M67Gg5+RJyX7Q3jHb4a09EXrFW5YlRMhI8fMr8FhXekA6GWjmRvVmY0oHUVpoivxmQOp7Vq1ydSjE7R09WNYE14eMRsuJgB+/OBDw7gO58RzbE0ngiG8tBbpzhFsO4hnwtW1nYP/oxsTD3ZLKI9oMUo1HqO4rRlgPzKJLUgDu/xMkSx/N1fAwTO48SvpAUC5m1EOzOI+B5ZgpFAtbd+b8HuSs49TI+h6Hp6O5R0/HutDKzajMKn2R2U+ulbNqRvPXgWtKpkzNXfSH51C+OVGNz8aqkc3N2thYpX/WG0b4821M7EYLddmbvp5+DJB0Ex8oa4CB2WzucL0zCd2DUwxEg/Q0zSg58/PaMpIgzRRyePB4hyNb1BcnSs5DdyeYuMpqJ3DWTlMlR0EliGb5w2ro7IW13rIK0I/tQsuhQs+aVT0NKR8sDacD6oDfMPfmIExkv3zA16HVJyUfIJSkt3HZVKScD85VdTR6c35hbfnj2RX/DbqHwF6Y23nsIc0Xewd6Nj45GiaXzs5FHpw1jTzjZWAnphmXh9GZJeZIvzn0p470HZCSR+9mTbBX6G0UKP5GkHNx6GQ5j+aEP/Tuu3uMBT8w90U7MNmYwLqr1Xvj1VnrKQayjJ/KbUMvg6HBq5SemIXrwXknLqNFhEOx4QsWd502550S+5eJzR2voWTKz0bN7YVI8lvqfmOU0ZCfAypkYzr7Wd6QrWtrAQJ6C2m95xYqEz+YUPjxyLrjhsWthanFoWm8e0hoB6yN5d/D4xuRxvjIbmGjjhpXhL0grlvGps3v42haO88NiVMhz7+HZ2Jzkwq6jf2FqeIwNvSc4fLJ1G7XwsIXcly3ZPbimUk53EF9tvRP5wmlPzDilNIcO9r8BGGrzZ0MSO2jZDgMD/g/UqoPiGI+BlhVraEpQzo7Jn756ImfBDamVL0x+Ogkm3o8pqJ1D7Aqyg2l5oBY/UT2jaqkL2VH9gbanL3hz5soXSrKn1z4QTULHpQeuHr1htMuZFCtVxeJY4dIDjYIjq3XyExVC/RWNaqnxQHGSA9UHEwWPaT9X66i9mHTH5F9Oq1ID7bVsob04tdjB7mg5RWKRGZPrEyXbUq1BtnEkS8KhOlyc5id6atow+adrVRb6DdHQxeld5EEGZYfogV4clFMkHiiJGdiFksqlT9Q69upcaIfjOyY/ncHmCwGdPARnnCg9MG27OGXTZqnxBZFMbcxpS3pH5IjdT35DCuFemEG7TLYl+foHt7T4jsmX04CJVr2jl74hzbZZYNmXQ2RxogE6URp9oTRcAlv5Rna064E6udQ8a6IVJX2hOKml4QtT+3TmWxORBZhyQEyIsQ2tPCvhG02/abEky7Yky7Zy7AciRomTKni5F1/IrGmyPXqRfMfklmzjD5RGk35QRiMwlhgyKD3Qi7+gxbGyQzqQzOqpTn5hCKUITRsiiHEpIbUTxaGHqGjKefJoy48StGl3hXimX7htCbeDSTeUKMGlDdWT9iRTlQb9ilHjYihoN3aomZM6ZXyhFpralx89L4iE+XS2kE+0clwuopVj8awkf6ClWBpPtGyj+0SS4eKkBkTzwkB48c/QCToWbrsktPIdJUWrlCA9ecpKCRen/ERr+IZyqsQ31NIX0uIo3jl5+cLkp1u5z16oIP6J2ZH6humViHcXh7WjG4LZk9g7WrZTHSS34TgmxNigOIhUJQL2i7qO01TqRpUnX86uaieKQw1TeoP/6F1xzIAXnwX2QmrZ7eJk4lwcghlPy99ozdodk4+naE9ug+y0nyhZErKK0gt6aQ9kKIptiQ7bibItyQrYgyGkkZMOimP9cnGiq4G4YRl8Q5HHowbVY/W+5E7AfxABa+MbCrFLftFGY6XSI8k+uHoOdkfLq1pk5hdRqi8kF26Hi9T4oDhLrgYtmmR0y8mJ3+hWGxm6o6bmHcnh4tCuw4VmWxhuqdZAuqMXD4rzXyj61ZPdkzTK9pEUbThGQTqRpHpQUnOpKE44cPEQnHbiww7RcisTBWvGLpPrxFXxhtQUfqI0XPpBhLSlsKN3Pfnp7YR9oKPjn2jlHvsN0YSnBqqYXWjiLH7oJ6aEx5yAn8gMlNZR7B299B3pTo8Hk9IkLa6c5J/4Voz24ZGzHPRCLTy5pSUNHrxoHW8sKtzSJ7aiHNNzoEniQNXk8ZBgdg86kuwNk29uUztd0+uF0nBpQ3Jx0jMgUjKBk5lMnMFED+MeUbMPLo5VqoWWyt9QHHQtdxKjLex/A7B/b1x/QsxfGg/PnxFHpoM/GH5z/rjYOsjfGMcQag1IQfaQTRecPHeFH37ylFvPYyFYe4I3h2B5G+20QLDw4+3J48fuO2YkAxt2ETxICQsJA/MNvInlo8PJuz8d5Nl/ePWblhWZWdhV8BtSKw9S4yJiVnFDswuzO+wT2ZFadjwwC5ECddaAaZyZ8oa5kyIs9Qevil7k4TtGDr8hPeXXPdlNW4T/n7Oqs2B+c2DmSU5OHpsr8/Zh5fwAVf5Carmj+xh6w9XC3Vh7BokZ5dO4JXoymmHojVG+/ZzpJmZeMD2ns7P5jskrMj/5fAN5bl7voQjjtynfMCkeoxSYPrLu+UH2tnEhefs2zF1xJD4ob+sSAhYRaS4hwWiqNSyetvI2clcQMVl3v3Im6GlpQloRsezFU474iszkW3JHkClay4rl6YmzgHXJ8FVBwOgNx4+eHWnIbiT62E0y/B/y/nz0gQzPvdlXzn0o0BWHTykqnLuIjIaz542j5T00xWhPH1uqBy+fvnD21RoiMAfwkrUETi18d3ZSoHHVAqmD3DolqkuCo1LLzhl94zRQnLelvnEWVT8xK6lzx+jw5Mt7T/Ls+8S5g0g7Mb0/zt5qD+xOtBMzH/4H5u14u7KTfN6emXzLjrOYNtqjhzclYCkw0vk3ZDcfRWzxRCYx9rGOpPEVGWvxxJVwbzMw++PzBtSlHfyO3NL6Qpa3fkMIlja6eDOEyGaS683NaApmR7DvSO/SSZGoMNyeV+SW6sFHLws69xemdjo7mi/M3nCwCojxJj4F626EIG3oJf+O7KA5o6zn7W882vLe05x7wOHk/F4swMizbefJT+8QfVi1Xx75XEFSfsO547h7Xp2ITnOy+aZw7mF2bPH0NG1I6+ZMRz56itGWsyj3wphpfCD3ZaaflTo8M+Hx7L7h6tlnkuMsxqiT504IlgWjQWJcED5LqQ6Hcm0MHqNSI1Bjgrh0uoYTuSvqWgykH1/6QDjjIaSMd+QdacBYFMsQvRXggyTV+40s4RXDyUmI6WOMbFlIUnC6s6NdvAkbPQKkex8YLd65VQufkdl5cdbxENq4c9WaoSP+ztBT/QNTO33tYEnvK0bLhWDuqZYwHAnbOfeg9FuCeJR2c88d2Zs646PDyVcbK0KiDeZNtNM6nIaVh+MpXsMZnDp6Z1EQJravaUOms+8/MXN49/0nclt7BnMRlNeEl+VKOL8QFxPJqRGhiXdnuD2fyGxqDOd9pLO//K3GttYSqOc2hlAhifiNrzcH0vtE1kRiJMDdI+QtEYpIg7ObJqziiSRzP/LkTLM0tBx6YQg+RZJYCcmFzdjBYoy7eX92JLswJTpj6X3FWZty5+g5kZ39tgfmjlNP7XBmp8a90V45tepBupNzOca14X94d1I/ce3IJ7CAVbMDTkIXdfLoANJk83ZqzBCXzt5wvPVXZEv1D0TupQvZmPUw7sWGJPlwdrfnREazkPZzV2rhC1OOh/IhMVbQTU/I7VtoLP9ERqnNrVkwPFk8pWDuCnY/zdkZXqT478j+9i987iqndiLflZyHnPclZ0e6eu+fPMPsmOE8P2PfaJ6+owAAEABJREFUyK5a9jPDJP2JIf+r/jcAzV8DbbPZCtiDIaS6oThWJEKtAWkhWa1B5p84g4lebGFg9QjsfWDs4tJwqZiZ00kwZTAoAtbGE5Pg6VEOOWAPKjMScfjEcAkxtqEX3zB78CpBXLjtmdtRomRZkp0YxCU4Linq5V58x+TL2dHsxMyjeMPUwk+kBs9iJB0uNE8gmqZY0IsvLLNUFMdkANGBHUdQ7kjpQJ06CaYUTiQpB4UfeXBfcvKIOK3E/7CjydksdYeLll8wUvQ3VE9XkL2jNfqGIl+uhb/KqjiI/4WpnW7lPnuhgjioaCJfqCK7haacA4WiHjfq4ktYIHsye0cvfSE12ywxutRgKRhQg/SOfxalDqVnee6JBroojjXpYPI4bPQkOCMbt8r1hpaqLyQvL04mjk+uZhaHgCm7By1HRjiRxLYwPPiHP2fLJYtDwJoHUciNC7dyTHbDXIpmG9myvRCQNfSJWjooji+3rFhD0wYpImkx+ZefPeJAMBK1XZwfjoCJh2IKaucQu4LsYFoeqCdXz6ha1YXsqP5A29NXJD+RueT+QEmURVnvaFnCjX9hapbomB1W8OA/aBRcePtuGJL6wjbBb2iYEQ2KYzzmHx715l7sxJX0IdSCf/rRI9n3Wfvg6nlQTdV/oCWGLG9IWr4hPZVOpDYjylmyBv2CaMJpICbbXCv/QEfHQXFYQb8UFMd2c9tSrGjZhlv5J/ILpeHSiWpVOU7An4hUs+8VOxz/RMZSo0VvSFmpvWDatRWnLXHcrSVaIjc+5lDSAyVIbBA5JFBMgvc+W0F7MAM2uXDwyS2lgu+Y/MMZwJRVg5Yl2ZYl2T6dBHtyCTE2KI4lrOEVJeqtfKCXDnJ/urWwIFdKKIdG+idPU/pvGAF/XSYOtcZB0loZAdO1zknhG1oSu7GFCBAblGVbkmVbOfYTpShLnlxa6DvSZEm2ZUm21X+fuHq8Y/LlkhgVZZKYNdwhMv/EuWOYl/rAUGayQyeSVV9I3noxQVKEpAsPTgGjIDw1cZ6YGrJO1PfZZtkovfFouE0HbgfT+oLSvkI5ab/QcghxR9/4sERkjMz6xtS+PFOpvSASZtm4zAVOxAcRyMV5ci0dtHpYsXAEe0NSu0H2AzMVbSFV0aQe9PISwo3Aa4f4geyQqJ0oTrhQB5Va0hMllasncpJB6wdlyib6BbX0hbQ4indOXv6GVu6zd0y+XE/MDjRJ9kI9kZrmGDicVHaYHujFF9JjO03oUkLoK4qTVkAbhg5HPMiJ0T488gzSDcFIFEk54X86RUw8GGMC0sRILrd3lMw/cX4RETMeKxIwZWTQSeEbst+G48LtyW1QQnoimoSOS78oydJy37E70cB02OR02JaKjSqVVTQaLvyHixMdaH0CcUSTCT+w/w1A/iTIXxD5iyB/KswfCoeLw18KK2+ISlta6imXL/3iZFibUtubmqcYT3HDpgSss0V6PpECxge0vSE8d5yYBJ+PO5flr60QjFrjgRBsWDfCFrKj+l9ILe/pfppvyKZwZFoS2QtgcPLUb85vX/6LyHxl9PFM5+r/RC5r3xuycSzFbkpA2jisIojKMyaOBkVPvPiwxp/WJfRBdAQjHZhdzRGDtPSHumEITgvxP+xoym9G67GTe6rA75ivYKbWwPUHMo8xQqQPOcmds636hjTBuJGEOPkR2VNtIbMYd6YXDYLdOcJ1Z0j6FrIrzdn+jtnbKsmBzMNibAmc/sOvi6fnxukOvzlt5QuBPDHwiS0egZ1Nd0z+6/2ayFkMXpwF5QvJ2/KGFPLc/CIXTmP+97g6PRdOxmbU9IVfPvrFszNdF/aV/EcVlT4KuSeOiKEvDcIdbAwHLs5c+UJypohvfCpza+rhl/fe3BLpC1M7PLccefDgJyJiuSnrik0ivvk5SEIdI5mxJH/wlvhtZj1fOAI/U5LwIKvSw675VngHwEOnFms3yTuyjxrLO51d7WNHKsPJEJsH6aTMyKazo9r/cfYvSpMzOW8uCnz3f81/+wGYklJVUnWPs0mCAA+Zqpllx35jwhukHKPOWza+0gB1FpGxgZi+8LADI4cvjJypGzJXvjD58ryV9ilEC/nCCHgenmvS8xNbfA7Hjl+Y2umsaZ4n8gZofzCwbweP56Rto0vefpsUUWfL0hmaLJFKrWE6mzZcPHR5VrKCWt6Hkw1PwwtPDz7Vbih75KxpxytSiOVSGvubwPsbgfmq5rmBHiSuabwwNWb/zdbsMcPOzt2QnvIg1eSkfccnUj5WfWLGeGQ68H5JkYBdfLLELM/EhqRYxFkPwe48At77CBhPZR9aGsuZ7m+7kOr0rJektVp5pkiw0e8cmS2J6FlOOrs/ORtTx1svtpm7FwJZlnt2jHzykiO0E7Jj8hePfC6CYAzz0MbBaG/+NUsj39HBA9NzevbSA/D1xMuqErCKRQI266Kyc/iaDsfzg/U35J47Mpo6s6OH4+UELPvefe6ZyBy7ks8usi+ehdHBvgVkOW0M1xqQXrCVTDKYlvDL2Yy+cyjdiene02ppTbJj8tNJsPx+Mws5H0ve2Q+cRipLJ/sXa3d30w1enKx8IXmu6G9cKYGviz6jxPBCn55slTMauvD4xQaZQk8+DsGSr0qvgoNVQOx2R+6JM4hRrTW8cPZRyRK6eFs4gPbMUxvvPUmnMSvCeNomJD0ag7unO/wXphbPnuDND/EFu5vaiRkO54l8X6yPjpSeIj0HJiUH2tapcn6jA1NkUWkxGXXylJJ94tGRluYErHfckWmE/HetzyNg9EXsa5rTBWn8Ri6hmyesejMCNjoj5LGj48RcRiH3A72r3dXpyoLkb9ihBDw9AM9J7JoV4I/Fpad2ONK+IPKHFLq3NE9fnYDxITFaIVjeMd+Yb4pwYCv0PWHlrk+WqZAiQpHf5glz16mn5/DMJb9h7o4wSDnXlGTH4XSgh6W0I99CpWqGyXP/8DXVdvqCeNsoFeGMpL0wIcVIFLFko5dMEaH/C0DlL4LrT4m2pRuXhIZtKGnaChOkYOTgB5FGlIrpevHI6bmhFEk51UlATMrDkoBY+Q1l2ZZk2ZZk2ZZk2VaO5QDxwFL4AzKTLttTX2gPt8GbS3a0F5So49ILMisp0dINxfFSgkrOXXcUh6qB1kHy1aZvTFHoC/WEaNWdKK34jrqOV3riSvoQasFIN0SA2yAtWmg/8w9Zq2uh70izsxPVuMqtC0llIYsogmwyo4MqJl8uackL/Y2SUDV9zXTFVZNG84XNyslAcbqDPAiVHaIP9OKgnCLxQEnMwC6U+SfOgaTLvPAAeymPSC36zZksf0HkdbnSFirWBId70R1N2ej+RiRTGbMeEbn6hrkrnoGgbWGSgvgrtoPqE0b7cC9+omd2LpMNXw7BzIAvFCd1AFG+oYZLgxQx5Vw4maeDaMqX2ys/kTJdMSWsctJHFyc9QOsJ5QRM4S/u6uIYFwwcC4FLCUg/0Jqn72j6jW5Jlm1Jlm3l2JZJ7ERNLv0FPXVmLMm2LMm2+m/H5PFUvHpuGE2iHBOtonzykIs3Q9rRiz+gxbGyUzqQzOqpnny5TYLpDUUxtVfMWnoC6SlOONRhmmp3SQJbf0K01p9QosRkLHUJrp5FP7hlqiYa1EIvFEOTr3jwE2cCqnYY/svTlTo4Zh2zMrMELxcFK8dygPiFI4jW6fjiCLHVYIfQutAOv5xMP5bp76cbaFuY/bD7TmrolhUTuZK+ojR19aQtyaD1hSkK/UST+VFBxKhZG5KXL0x+upX77IVaWE5evmN2hG+YHuUsndR47AvZW/0RLdsiYAdKkNigOPRQVcRBzYFgkyeWNMB2TP7ikUXA9Iap4TyjLWmLlzcRxzq47cUXakfBwp9QohhTTrsImCIOOqnsQRKMPPzJpalL7yjJ0ot76VaObTgOKhkIk21J1sBCLTQVHKqpb1wcaphE8ASiLw4rAY0fedDKmajUmhIw5TxhtNNJMOVhJ5LAbVD4Qpu8OwfthdHwYcqEch45M9VviFK+MPnyLLMtDHfWgrpcmlx6QcsSbvzA5MtZvDLqZF49YDMQE23KCR4uCnaCZC/UExrVaRpsPLg4RgGIDmyetaWrcPFNSHoUgr88y1K/YQiePcBhQyfqfJvJxFnIrmavKNkmYCdKioR/IcK0WcE0BmHlRe2xHSgv6Oj4K1rdT8DILy5nzrLHSUQWcUNJqYtzYFI85gT8wskso0r2E6JVN3WpwdIjipMaoEdExJTigcopIQmOOz0oWlhucQi1hqlOqpD1VA36jlq8aOkLq6AOimOYFwIwXU4B27gn53JLsi1Lsi1Lsn1z6OKrJg0Xh6IHFEwIHk4JKUwf6MVBdrR6ojjRgXQZpIYlUbFa6TcXRUyPaPV/AZi/NsbzJ9fg4cPFHw+PvzweWIkQ4y+KtQb+phikj6zzQTxKu9efLHPHztM7nPvoj52cleVFApb+WQVJgnfnJzJY/RV7Sy5NRwgIzVqg93ziuqN7tzz821nZnhdkN+XeOcgv1bs3pAqbSFPzX5ja6U/3RsvFQbblPvq5gM8tuXBE4tLJKBIPzp5hJLOLrWnZOEr2Rwky2gYwv9fkJWl89fayo/3gG88VlKcNwubuvJCs+gtSy3D3t2W+65lftY7lt8jMDekpX5g8zkB2Vk1ejad+YmrZWaT7zOmt9onp+fZ+U3dTA4ev2fWDsZosdYCevK8Z97witfb9E7KFPlbn4jyheHBILSFtwdYIB5/XJfJaxGRZ9IxsoIdxWtL/yZlCphhLsZjvyRgCPD3jJ2dhe76wHagL2c0kO8JxliLBoy6O0F0nUkvfv3h/TvofMI9IhbWkxFoU7kVhpO8o465XpJb30RyjjR3sCqEEx8qDJFhquYJOxN4EhlH8HErj4Vst3ZUTMnYi+8qDdJHnvhl94jRQvL5h4+ysfmKeyY6upi+4e/aE35D+8oXJ/9nXfVyVdzCWT7m876LnhtxTvjD54SyoCnYKvPM+vvsTKKct6cI8hDSFpEU2vCH3ZpiODME6lEsWJ0VNRKg1T1uS7F2IRJ0YDc/v0d3k/4zsmrmsYlc5Acsa1KwKG0TM2w+P2Hzpnzy7787G9HLV6OG7s22v8Vu07xemFj/2NmfnG3Y/n4R1d3kCM92RN4T/A7Jjvpkks8AXR2MbcfavZEEqOLNUGV15+IfnrXwSbekJPGHezGpmsSTsBBi8OHPlC8nZRoTTxAZoYjhpKk0b2EctaXqL9Jz5Zy188+564IfOU/OdrJ17wlM7MPck/4WpPTgLsetuSCyPv5DdIbl/kKzWsF7CCNkYOglbmSRyb6sfmF2jp40ZLNq0QbDw8en5rJVzV3vA/E6zs8PIC6lVDyLxqlBYyYbrHoBhdBIuwehnivbqCLkr/smj3bwrmH3FVeO2Wb947jhn0MoXJo9nJnjzPDV9OyY//Koxji1ONsYrsq+EWhBPxgY+l3o4PcN5ZPmG1LCUp5+R/B1jJGQAABAASURBVCa0nZxkq7cBfsfOzBDLeUGXJqWvsJA8VkbPN6JUX0ie+7uf/Amjxef63J3nMc9FjGR8nIbyR8wcnto4M4sz1OwL5x7k6eXKyaPHmaq2Y/LluYcBWJrDZg8ZCTGV8XJ20Zg0X7YQpXqQJMZOGqiX/M/IQJZxP1vWrmhsQ0eLfZChiTgzefXMfHBq1R+R9dV35LJZETGjF/LC/Oeeu4IUqJddmJ7Dsyf5L0ztdHY13zH5P3rvovdEXsj3sXK9Dz6fRyTfahH2b6LaGQLGhvTiEOzgTKFhtHMvMsXYcMo8BaNQa0AdZKJ9BAyNTpKpJ5/FSOmkjkGWQbBeBvbtxRmfUebQ0nNxBEj7ueM35ip2dGXmPvmqZV96njDaPzv727vwayf39RkbpiffEcxs8gdkIz9D5saHE9PLToqxCBtSiNHDWvSQtCwckRjOXjKaiMP/y18QbQtTQtDeuDiWsIZvrEJ9Ry/+gBbH4oobylBs9CQ4Vp7a6SSYUgiKkPwVWZJa4AN98haHWR/oxTfMfbhtmi3bGyYNXyhRV0/akgTpuHTE8qLlLzTacoabnaipecPk/+AMYharRMyChWGGe3ijpaI4JgOIDuAnriQ7kXXhFGwQawG0GzScXHi0EyWVSxdqDq2T/IhfsxnC0S1LIAGz8o8g23DsREmRcHEiAxr0N6Yo9BNN5qUMHhERg1kbkpcvTH66lXvtF1R0/AGVGUlTFSeZ4OPiGI+dyEz5L6RmM4Hbn8g0GiYRqIKaA8GkBmnwRqQRpRumZ3kgtQf0oVtqujB5nOdIJEUCJh38hjNoL6Qmjl9RrVgcAqaMBpMEbcspB0lsC8ODmx89vzC1uCXsdHEM80Kg7MZzadQTV1eaqsOpYRIBA7HUcQxSa7BcbGhKUE7QVA3ZHYqaqGBKXyhFUk7rJCeSYMrDPjCShNjEsq0c+wO1+Inp0mIfyGy7b4hSvjD58iyxLQx/QAkdl16QGUmJlhb6Hb16wGag021xrLxDlt4xxdQXKmiiIz6gOEYHiA6ABXD4sMZDOHElfRAdwV9Oi1K/YYhOWR8rtc7IXuWF7Jos0dLBT0RS9A2pVUI+sFK4pOZSkVi0+OeyZOM0erItHj0LHcR/YWq4OLaF4ZZiENuyDbfyT+QXSsOlEyVZc/6K7GrnQjsT+EJ75SfS3XzH5MuB++WZXyKptmJpeTKTWSIe7uQOa4AdKEFig8ghedaFVrkWQmxxwvHqfuBKBd8x+YtnryTbsiTbsiTbsiTbr05BlmRbFudELb5Q2ng74b/Qqw6yM9OFqBaHgOngyZe3b+WUpYTwX5jaq4vTBYOf6Rd3N4mHmIlikvATScpBeuy/ID2x6ZKCh4dN7tHZZUm2ZUm21X8nLs1gKsHUbkitHJREWVAN+kSZGgFYcfjEb7V65HTfkEr5QvLcRZvskOh3pIAYi44LT684n5gask7U+/mcLZ/dznz4ctuKpIU2XIKCsZOrZ1HqpQstl/oBLTFkXf9IMbgpkY1ZtImooqm9uaz2aEfy8oXJcdFoSe4/cZKpzMqxaEnyAy3FVqNdIvsFxaFGVTTpQOVAsGSnf3LNhHQgu5q/oqTUsugDbURMy0PFuaM1fEM5XcQn1NIX0oKFoEsJ4dkZLCcpL1qTL1Rw84OfyEoGLMm2LP2zi2N7+kGobAO+I5ptIcbuKE5KgN6QmlexCFe4RLREfPWUU7+hFEk50X95GlO/YQTLNhsutwwX8RPVU5WAbdz0Q9llQE+IVn1D20jORDGZbRkFuGO00z01oquZTPhChpPZjbIvbJeJ0UAy6kRyJBKMXPjJS9B/ITXj02WJ3Hjwv/zhsH8R5A+CjygONYw/K9ZWOPRWhjTe+TRHO5wm/v6Y2Frk8CLqE0Y7nQTLWzP2vYPifBQlclaSNH5i/h66CoXHbnZV/4XU8p7+pZrmG7I5ZSAtgSJtxQjNSQbnVYnffNQj5nuyuzzN/CDhrLp2R8erPyEzYyl2YwJSeDezbkco1cQ00jXpET+Fg5+4kj6IoeDu2R1+4uoBro8Kwdcqsh92NC3cduerZic19OF8FXmvn7C39J6Ukzxjt1Dekf3sGiXxchrvFVqx3vmJ7UXMvXEG6Yvw+ebZT5GW1HfeLeg7Mh+K00385hUJ/e82mN0DmcCvBzG8eDTS9h7YoQQ8GrAew1zIpz81RTs8/ckXNiXUGlLoblix90HyvBSLJ+e3Ik9jdZrnm6OnAKJ17hUzPZ6WThGwisHsHsw+ZISTJ8fzu51aL5zeQz+RWvqOu6BJA2Ar75h7Uj0xY8xgvCpXABCspEjPgaSMJ9I3MJwG7EOkIeLuSDNAEh3Y+YOUjquFBux6GwQL7yelsQm/XZEXfWJ6WEoHkXrjA1a/unJN74nOzovTU44SS/6GzFLuCz4xIpsCOAvSSwYQd/6jq23Ub8i3lS8kz90s5XNCuCFC04YINAPTRBIdJ1sFsjdO6bCj5eRLyH3RnjDa4Y89EXnFWpUnRslI8PAp81tUeEI6GGrlRPZmYUoHUltpivxmQOp4Vq9ydSrF7Bw9WdUE1oSPR8iKgx28OxPw7AC68xnZEEvjiWwsB7lxhlsM4xrytWxlYf/ox8TC3JPJItoXUoxGqe8oRlsOzKNIUgPu/BInSxzP1/ExTOw8SvhCUixk1kKwO4+A55kpFAlYd+f/PshdwamX8TkMTUd3j5qOZ6eVmVWbUfgks5taL2XTjuStB9eSTp2cueoLyad+caQam4tXJZ2bs7O1SPmqJ4z25tme2okQ7LYze1/9HCTpIDhW1gAHsdva4XxhEr4Dox6OAOlvmFFy4OW3ZyRFnCni8OTxCEG2ri9Ilp6F7E42d5HRTOSumaRMjoJOEsvwhdPW3Qlpu2MVpB3Zh5JFh5o1j3waUjpaPpAGrA96wtyTjziR8fINU4Nel5S8hFyS0sJtV5VyMjBf2dXkwfmNueWLZ1/0J+wWCr8wtfHeQ5gr8g72bnx0NEosnZ+NPDptGHvCycZKSDcsC6c3S8qTvHHuSxnvPSAjidzPnmSr0N8oUviJJOXg1stwGMsPfejvuHqPB3xi7ol2YrYxg3FRrffCr7fSUw5iHT2R34RaBkeHUys/MQ3Rg/dKWkaNDoNgxxMq7jxvyj0n8i0XnztaQ8+SmY2e3QuT4rHUf2KW05CdACtnYjj7Wt+RrmhpAwN5Cmq/5RErEl6bU3jxyLnghseuhanFoWm9eUhrBKyP5N3B4xuTx/nKbGCijRtWhj8grVjGp87u4WtbOM4Pi1Ehz72HZ2Nzkgu7jv6FqeExNvSe4PDJ1m3UwsMWcl+2ZPfgmko53UF8tfVO5AunPTHjlNIcOpibWqDyhP1fAIo/J2J6x5YItRUkOdYgDSHClbNj8k9fPZGZiimhXEqqnPCbQzDxYExB7RxiV5AdTMsHavET1TOqlrqQHdU/0Pb0BW/OXPlCSfb02geiSei49IGrR08Y7XImxUpVsThWuPSBRsGR1Tr5iQqh/ohGtdR4oDjJgeqDiYLHtJ+rddReTLpj8jenVamB9lq20F6cWuxgd7ScIrHIjMn1iqJkQmxhei0BEakDKeHiRE866Klrw+SvrlVZ6CdEQxend5AHGZQdog/04qCcIvFASczALpRULr2i1rFX50I7HN8x+ekMNl8I6OQhOONE6QPTtotTNm2WGh8QydTGnLakd0SO2P3kN6QQ7oUZtMtkW5Kvf3BLi++YfDkNmGjVM3rpG9JsmwWWfTlEFicaoBOl0RdKwyWwlXdkR7s+UCeXmmdNtKKkNxQntTS8YWqvznxrIrIAUw6ICTG2oZVnJbyj6TctlmTZlmTZVo79gYhR4qQKXu7FFzJrmmyPXiTfMbkl2/gHSqNJXyijERhLDBmUPtCLP6DFsbJDOpDM6qlOfmEIpQhNGyKIcSkhtRPFoYeoaMr55NGWHyVo0+4K8Uw/cNsSbgeTbihRgksbqiftSaYqDfoRo8bFUNBu7FAzJ3XK+EItNLU3P3oeEAnz6Wwhn2jluFxEK8fiWUl+oKVYGk+0bKP7RJLh4qQGRPPCQHjxZ+gEHQu3XRJa+Y6SolVKkD55ykoJF6f8RGv4hnKqxCfU0hfS4ijeOXn5wuSnW7nPXqgg/orZkfqG6ZWIdxeHtaMbgtmT2DtatlMdJLfhOCbE2KA4iFQlAvaNuo7TVOpGlSdfzq5qJ4pDDVN6g//oXXHMgBefBfZCatnt4mTiXByCGU/Lb7Rm7Y7Jx1O0J7dBdtqfKFkSsorSA3ppH8hQFNsSHbYTZVuSFbAHQ0gjJx0Ux/rm4kRXA3HDMviGIo9HDarH6n3JnYB/IQLWxicUYpd8o43GSqVHkn1w9RzsjpZXtcjMN6JUX0gu3A4XqfFBcZZcDVo0yeiWkxPf0a02MnRHTc07ksPFoV2HC822MNxSrYF0Ry8eFOdvKPrVk92TNMr2kRRtOEZBOpGkelBSc6koTjhw8RCcduKHHaLlViYK1oxdJteJq+INqSn8RGm49IUIaUthR+968tPbCXtBR8df0co99hOiCU8NVDG70MRZ/NBPTAmPOQE/kRkoraPYO3rpO9KdHg8mpUlaXDnJX/GpGO3FI2c56IVaeHJLSxo8eNE63lhUuKVXbEU5pudAk8SBqsnjIcHsHnQk2Rsmf3VNryV7m5FGl0BcHEvY6eK4TEQrx2TCT2Rn+YniUDWQviC+yvrCaZPoiXuCtHC4pfKFyZf//X8ByB8S88fD8y+QJflbIoVaA2owf28EyxYeg2idOnjKaKVgLPViaqeTYP2T5wd2NmH59VfUNjISZGvq2rCXwIO0YCFhYL6hzRfPPN5KcHMuwaicWlaEL+wq+A2plQep8QAiexbn5vJg9v5EZtKTHR+YhUiBOmvANM5MecPcRhGW+gevil7k4TtGDr8hPeXXPdlNW4T/zVnVWXD+821CyJp1SRm8mLcnWcgP0OwXUssd3c/KJ1wtveTIgxGCuePCMlYu5MNfs9yX+i9M7XQ2Nd8xecW5k4fMN6B39yBFGL9N6sDJyZkm8jUrWUDLZN1HxyD72EH31Mmrb0iBcvo6RL4QmBpJVxOwNnwg61ZTCuzK6xGTZcczsometk5IKyI2axZnuvwDmcm3oNLXhuKNpyfOPasDxn4iEpGcArZmw7NhIYXecSI1Bkf7S55fJL0gy293hTAdwFlOTzhwcWZ5BaOpU33iaHkLTTHa08eW6sHLpy+cfbWGCMwB3LyWwKmF785OCjSuWiB1kFunRHVJcFRq2TmjT5wGivO21DfOouonZiV17hgdnnx570mefa84dxBpJ6b3y9lb7QO7E+3EzIf/wLwdb1d2ks/bM5Nv2XEW00Z79PCmBCwFRjr/hOzmo4gtnsgkxj7WkTQ+ImMtnrgS7m0GZn983oC6tIPfkVtaX8jy1m8IwdJGF2+GENlMcr25GU3B7Aj2HeldOikSFYbb84jcUj340cuCzv3C1E6TPv2+AAAQAElEQVRnR/OF2RsOVgEx3sSnYN2NEKQNveTfkR00Z5T1vP2JR1vee5pzDzicnN+LBRh5tu08+ekdog+r9s0jnytIym84dxx3z6sT0WlONt8Uzj3Mji2enqYNad2c6chHTzHachblXhgzjR/IfZnpZ6UOz0x4PLtvuHr2meQ4izHq5LkTgmXBaJAYF4TPUqrDoVwbg8eo1AjUmCAuna7hRO6KuhYD6ceXPhDOeAgp4x15RhowFsUyRG8F+CBJ9X4jS3jFcHISYvoYI1sWkhSc7uxoF2/CRo8A6d4PjBbv3KqFz8jsvDjreAht3LlqzdARv2foqf6CqZ2+drCk9xWj5UIw91RLGI6E7Zx7UPotQTxKu7nnjuxNnfHR4eSrjRUh0QbzJtppHU7DysPxFK/hDE4dvbMoCBPb17Qh09n3V8wc3n1/RW5rz2AugvKa8LJcCecX4mIiOTUitHG0FRlu9ufP1L44s9EYzvtIZ3/5U41trSVQz1aGUCGJ+I2vNwfS+4msicRIgLtHyFsiFJEGZzdNWMUTSeZ+5MmZZmloOfTCEHyKJLESkgubsYPFGHfz/uxIdmFKdMbS+4izNuXO0XMiO/ttH5g7Tj21w5mdGvdGe+TUqgfpTs7lGNeG//DupH7i2pFPYAGrZgechC7q5NEBpMnm7dSYIS6dveF464/IluoviNxLF7Ix62Hciw1J8uLsbs+JjGYh7eeu1MIXphwP5UNirKCbnpDbt9BY/oqMUptbs2B4snhKwdwV7H6aszO8SPHfkf3tX/i5q5zaiXxXch5y3pecHenqvT95htkxw3l+xt6RXbXsZ4ZJ+hNDXjADy7//F4Dcnz8Onn9pPPiJ/BWx1kArSM1kwr/Q4jQUu5e+mAjDJVL1pPXmEExpDIqA6YYR8PQohxywB5VeiTh8YriEGNvQi2+YPXiVIC7c9sztKFGyLMlODOISHJcU9XIvvmPy5exodmLmUbxhauEnUoNnMZIOF5onEE1TLOjFF5ZZKopjMoDowI4jKHekdKBOnQRTCieSlIPCjzy4Lzl5RJxW4l/saHI2S93houUHjBT9CdXTFWTPaI2+ociXa+G3sioO4r8wtdOt3GcvVBAHFU3kC1Vkt9CUc6BQ1ONGXXwJC2RPZu/opS+kZpslRpcaLAUDapCe8WdR6lB6lueeaKCL4liTDiaPw0ZPgjOycatcT2ip+kLy8uJk4vjkamZxCJiye9ByZIQTSWwLw4M//HO2XLI4BKx5EIXcuHArx2Q3zKVotpEt2wsBWUM/UUsHxfHllhVraNogRSQtJn/zs0ccCEaitovzxREw8VBMQe0cYleQHUzLB+qTq2dUrepCdlT/QNvTVyQ/kbnkfkFJlEVZz2hZwo2/YWqW6JgdVvDgX2gUXHj7bhiS+sI2wW9omBENimM85i8e9eZe7MSV9CHUgj/96JHs+6x9cPV8UE3VP9ASQ5Y3JC3fkJ5KJ1KbEeUsWYN+QDThNBCTba6Vv6Cj46A4rKBfCopju7ltKVa0bMOt/BP5hdJw6US1qhwn4J+IVLPvFTscf0XGUqNFT0hZqT1g2rUVpy1x3K0lWiI3PuZQ0gMlSGwQOSRQTIL3PgIm27g4QVw4mjRIlJ1YRZZw48Ef7lU70TNz7Aou10KbHny4dENxLGENjyhRb+UFvXQw98C0sCBngQSWQ0lD/+5pTP8NI+CPy8Sh1jhIWisjYLrWOSl8Q0tiN7YQAWKDsmxLsmwrx/5EKcqSJ5cW+o40WZJtWZJt9d8rrh7vmHy5JEZFmSRmDXeIzD9x7hjmpX5gKDPZoRPJqi8kb72YIClC0oUHp4BREJ6aOJ+YGrJO1PvZZtkoPfFouE0HbgfT+oDSvkI5ab/QcghxR9/4sERkjMx6x9TePFOpPSASZtm4zAVOxAcRyMX55Fo6aPWwYuEI9oakdoPsD8xUtIVURZN60MtLCDcCrx3iC7JDonaiOOFCHVRqSU+UVK6eyEkGrS+UKZvoB9TSF9LiKN45efkTWrnP3jH5cn1idqBJshfqE6lpjoHDSWWH6QO9+EJ6bKcJXUoIfURx0gpow9DhiAc5MdqLR55BuiEYiSIpJ/ynU8TEgzEmIE2M5HJ7R8n8E+cbETHjsSIBU0YGnRS+IfttOC7cntwGJaRPRJPQcekbJVla7jt2JxqYDpucDttSsVGlsopGw4V/cXGiA61PII5oMuHvKI7xmPP/L8CavxjyB8P8mTGw/jiIXlshfSs9mg6ktCpkEXdH6sKFKYXfkFr5E1LA8raM9Z7wkBOT4PkrKCvaA+avrQBGrfFACDbs6F7Ijuq/kFre0/003zB7qSPTksheAIOTp37z/JU2+jfSxldGH29XFkX9hdR4Qtp7J+0XlqSUphdMz3K6eMbEdEOwT4502GepD6G4Y3rCg7mnOSRI6zyW5OTkMVoCv/1oym9G57GDe6rA75ivYqbWwPUHMo8xQqQPOcmds636hjTBuJGEOPkR2VNtIbMYd6YXDYLdOcJ1Z0j6FrIrzdn+jNnbKsmBzMNibAmc/sWvi6fnxukOvzlt5QuBPDHwii0egZ1Nd0z+7f2ayFkMXpwF5QvJ2/KEFPLc/CIXTmP/v+vU8daLk7EZlr7wy0e/eHam68K+kv+ootJHIffEETH0pUG4g43hwMWZK19IzhTxiU9lbk09/PLem1sivWFqh+eWIw8e/ERELDdlXbFJxCc/B0moYyQzluQHb4nfZtbzhSPwMyUJD7IqPeyab4V3ADx0arHpRg/Bb5yZcmaC2RXkslaG507m00MRljJOFh49e5ODDMaoM7PxlQao00zGBmL6wsMOjBy+MHKmbshc+cLky/Nu2qcQLeQLI+C8P7fQPJDeZtRuWPIcjh2/MLXTWdOcW4PQ/mBg3w4ezzjL0fB51fbboLFltS+dockSmag10PeCkZdnJSvoZXM0suElYX1utkOwZONMwLvhHVnTjlekEMulNPY3ga9L2QtpbZDItY0X0sXoP9qaPWa6m9Eb0lMeXDXS4003pHys+sSu2MSs4NGZwPMbAtQnSzw6NiTFOvaKKeC9j4DxRPahZbA89yRZSHV6eELzG2YKAcuKw6FMJ2717oQ/Ipuj4/Ofazjz5QuBLM0dO0Y+eckR2gnZMfmLRz4XQTCGeXDjYLQ3/5qlkfd38MD0nJ699AB8LfGyqgSsYpGAzbqo7By+psNx/sPCUkEP577+psx8Y9fRTxGbqaV9cfZVSxc97I4yO8m+eJqjg30DyChtDNcakF6wlUwymJbwy9mMvnMo3Ynp3tNqaU2yY/LTSbD+GMEsOB9bgbUfmJ7sPLHkr6FbuptW8OJk5QvJs7q/caWEPAOcUWJ4oU9PlrFiAr66swqfX46plYfTUUu+KgcHq4DY7Y7cE2cRRrXW8MKzP/UgD5sukjdOaVnvSc54YeH9QVSOxuDulG69Tzxa/Nid/PRDfMHcxffMHfRg+d0qTYAixtJbZPmBScmBWcFM2hi6eIrRT8xAfrtgO89KkqMSZCzWXenO7jvShZD/rrVGwOiPOLtbyxYKqIjM9KKF1KqfSEvq+Og7H+WcZCdtcx9J7mp3dbrSnvwNmeHaxI41SW+SYgPsF6Z2OK37wsgfUuje0jx9dQLGB8VohWB53PFtd2yFvies3PXJ1poPzm/U4h1zx/Sj8/uVB+ltfsPcHWGQtrmDBVjzIB3kk7E1dPGw6GCGo56Ytugb0toyUhHOSC9P2pxakMnqDZ/FNHz5GgxQ+/5fAOaPg5sn5Q+KbQ9enAxTROWUkAR/eEqZueEaA1IKBKeFiIk/hWL6Qlm2JVm2JVm2JVm2lWM5QDywFP6AzKTL9tQX2sNt8OaSHe0FJeq49ILMSkq0dENxvJSgknPXHcWhaqB1kHy16RtTFPpCPSFadSdKK76jruOVnriSPoRaMNINEeA2SIsW2s/8Q9bqWug70uzsRDWucutCUlnIIobIJjMpqKLUNLmk5tJCf6MkVE1fM11x1aTRfGGzcjJQnO4gD0Jlh+gDvTgop0g8UBIzsAtl/olzIOkyLzzAXsojUot+cybLXxB5Xa60hYo1weFedEdTNrq/EclUxqxHRK6+Ye6KZyBoW5ikIP6K7aD6hNE+3Iuf6Jmdy2TDl0MwM+ALxUkdQJRvqOHSIEVMORdO5ukgmvLl9spPpExXTAmrnPTRxUkP0HpCOQFT+Iu7ujjGBQPHQuBSAtIPtObpO5p+o1uSZVuSZVs5tmUSO1GTS39BT50ZS7ItS7Kt/tsxeTwVr54bRpMox0SrKJ885OLNkHb04g9ocazslA4ks3qqJ19uk2B6Q1FM7RWzlp5AeooTDnWYptpdksDWnxCt9SeUKDEZS12Cq2fRD26ZqokGtdALxdDkKx78xJmAqh2G//J0pQ6OWceszCzBy0XByrEcIH7hCKJ1Or44Qmw12CG0LrTDLyfTj2X6++kG2hZmP+y+kxq6ZcVErqSvKE1dPWlLMmh9YYpCP9FkflQQMWrWhuTlC5OfbuU+e6EWlpOX75gd4RumRzlLJzUe+0L2Vn9Ey7YI2IESJDYoDj1UFXFQcyDY5IklDbAdk794ZBEwvWFqOM9oS9ri5U3EsQ5ue/GF2lGw8CeUKMaU0y4CpoiDTip7kAQjD39yaerSO0qy9OJeupVjG46DSgbCZFuSNbBQC00Fh2rqGxeHGiYRPIHoi8NKQONHHrRyJiq1pgRMOU8Y7XQSTHnYiSRwGxS+0CbvzkF7YTR8mDKhnEfOTPUbopQvTL48y2wLw521oC6XJpde0LKEGz8w+XIWr4w6mVcP2AzERJtygoeLgp0g2Qv1hEZ1mgYbDy6OUQCiA5tnbekqXHwTkh6F4C/PstRvGIJnD3DY0Ik632YycRayq9krSrYJ2ImSIuFfiDBtVjCNQVh5UXtsB8oLOjr+ilb3EzDyi8uZs+xxEpFF3FBS6uIcmBSPOQG/cDLLqJL9hGjVTV1qsPSI4qQG6BERMaV4oHJKSILjTg+KFpZbHEKtYaqTKmQ9VYO+oxYvWvrCKqiD4hjmhQBMl1PANu7JudySbMuSbMuSbH/4oS2UWrc46R3QcBWTx8VxFRGtHJMJP5Ed5SeKQ9VA+oLUMASr6KYS+MUripMicONo4TdfPQH0l/83APl7Yv6aiB9/YbxjWIoL+UtiMqb4qy56+PrTZf6aGp0CV9KVMvVY9NWWdDkNWPqnBkmCd9cnsqj6K2YtO+b2EDpLFvImaO87cN3RvVse/u2sbM8LspNy7xrkPp5DzJXozS6kqcovTO30p3uj5eIg23If/VzCnSUXjkhcOhlF4sHZM4xkdrE1LRtHyf4oQUbbAOb3mrwkja/eXna0H3zjuYLytEHY3J0XklV/QWoZ7v62zHc986vWsfwWmbkhPeULk8cZyM6qyavx1E9MLTuLdJ85vdU+MT3f3m/qbmrg8DW7fjBWk6UO0JP3NeOeV6TWvn9CttDH6lycEkW4zgAAEABJREFUJxQPDqklpC3YGuHg87pEXouYLIuekQ30ME5L+j85U8gUYykW8z0ZQ4CnZ/zkLGzPF7YDdSG7mWRHOM5SJHjUxRG660Rq6fsX789J/wPmEamwlpRYi8K9KIz0HWXc9YrU8j6aY7Sxg10hlOBYeZAESy1X0InYm8Awip9DaTx8q6W7ckLGTmRfeZAu8tw3o0+cBorXN2ycndVPzDPZ0dX0BXfPnvAb0l++MPk/+7qPq/IOxvIpl/dd9NyQe8oXJj+cBVXBToF33sd3fwLltCVdmIeQppC0yIY35N4M05EhWIdyyeKkqIkIteZpS5K9C5GoE6Ph+T26m/yfkV0zl1XsKidgWYOaVWGDiHn74RGbL/2TZ/fd2Zherho9fHe27TV+i/b9wtTix97m7HzD7ueTsO4uT2CmO/KG8H9Adsw3k2QW+OJobCPO/pUsSAVnliqjKw//8LyVT6ItPYEnzJtZzSyWhJ0AgxdnrnwhOduIcJrYAE0MJ02laQP7qCVNb5GeM/+shW/eXQ/80HlqvpO1c094agfmnuS/MLUHZyF23Q2J5fEXsjsk9w+S1RrWSxghG0MnYSuTRO5t9QOza/S0MYNFmzYIFj4+PZ+1cu5qD5jfaXZ2GHkhtepBJF4VCivZcN0DMIxOwiUY/UzRXh0hd8U/ebSbdwWzr7hq3DbrF88d5wxa+cLk8cwEb56npm/H5IdfNcaxxcnGeEX2lVAL4snYwOdSD6dnOI8s35AalvL0M5LfhLaTk2z1NsDv2JkZYjkv6NKk9BUWksfK6PlGlOoLyXN/95M/YbT4XJ+78zzmuYiRjI/TUP6ImcNTO5zmKndkV1Vw7qFMjsaVk0ePH9qOyZfnHgZgaQ6bPWQkxFTGy9lPY9J82UKU6kGSGDtpoF7yPyMDWcb9bFm7orENHS32QYYm4szk1TPzwalVf0TWV9+Ry2ZFxIxeyAvzn3vuClKgXnZheg7PnuS/MLXT2dV8x+T/6L2L3hN5Id/HyvU++HwekXyrRdi/iWpnCBgb0otDsIMzhYbRzr3IFGPDKfMUjEKtAXWQifYRMDQ6SaaefBYjpZM6BlkGwXoZ2LcXZ3xGmUNLz8URIO3njt+Yq9jRlZn75KuWfel5wmj/7Oxv78KvndzXZ2yYnnxHMLPJH5CN/AyZGx9OTC87KcYibEghRg9r0UPSsnBEYjh7yWgibrwMHgyAMbbov/yNkD8ExpTwzatQ2tGLP6DFsfqXSl1Iii6NLsnqKU9+OgmmFIIiJH/FrKEnkJ4NffKKw6wP9OIb5j7cNs2W7Q2Thi+UqKsnbUmCdFw6YnnR8hcabTnDzU7U1Lxh8n9wBjGLVSJmwcIwwz280VJRHJMBRAfwE1eSnci6cAo2iLUA2g0aTi482omSyqULNYfWSX7Er9kM4eiWJZCAWflHkG04dqKkSLg4kQEN+htTFPqJJvNSBo+IiMGsDcnLFyY/3cq99gsqOv6AyoykqYqTTPBxcYzHTmSm/BdSs5nA7U9kGg2TCFRBzYFgUoM0eCPSiNIN07M8kNoD+tAtNV2YPM5zJJIiAZMOfsMZtBdSE8evqFYsDgFTRoNJgrbllIMktoXhwc2Pnl+YWtwSdro4hnkhUHbjuTTqiasrTdXh1DCJgIFY6jgGqTVYLjY0JSgnaKqG7A5FTVQwpS+UIimndZITSTDlYR8YSUJsYtlWjv2BWvzEdGmxD2S23TdEKV+YfHmW2BaGP6CEjksvyIykREsL/Y5ePWAz0Om2OFbeIUvvmGLqCxU00REfUByjA0QHwAI4fFjjIZy4kj6IjuAvp0Wp3zBEp6yPlVpnZK/yQnZNlmjp4CciKfqG1CohH1gpXFJzqUgsWvxzWbJxGj3ZFo+ehQ7ivzA1XBzbwnBLMYht2YZb+SfyC6Xh0omSrDl/RXa1c6GdCXyhvfIT6W6+Y/LlwP3yzC+RVFuxtDyZySwRD3dyhzXADpQgsUHkkDzrQqtcCyGYVI62cPjOq1DdMfmLs9SSbMuSbMuSbMuSbL86BVmSbVmcE7X4Qmnj7YT/Qq86yM5MF6JaHAKmgydf3r6VU5YSwn9haq8uThcMfqZf3N0kHmImiknCTyQpB+mx/4L0xKZLCh4eNrlHZ5cl2ZYl2Vb/nbg0g6kEU7shtXJQEmVBNegTZWoEYMXhE7/V6pHTfUMq5QvJcxdtskOi35ECYiw6Ljy94nxiasg6Ue/nc7Z8djvz4cttK5IW2nAJCsZOrp5FqZcutFzqB7TEkHX9I8XgpkQ2ZtEmooqm9uay2qMdycsXJsdFoyW5/8RJpjIrx6IlyQ+0FFuNdonsFxSHGlXRpAOVA8GSnf7JNRPSgexq/oqSUsuiD7QRMS0PFeeO1vAN5XQRn1BLX0gLFoIuJYRnZ7CcpLxoTb5Qwc0PfiIrGbAk27L0zy6O7ekHobIN+I5otoUYu6M4KQF6Q2pexSJc4RLREvHVU079hlIk5UT/5WlM/YYRLNtsuNwyXMRPVE9VArZx0w9llwE9IVr1DW0jORPFZLZlFOCO0U731IiuZjLhCxlOZjfKvrBdJkYDyagTyZFIMHLhJy9B/4XUjE+XJXLjg+IME1r3imMc++/jD4LHHwYpYRTzN0UyDNI4mL8eQrHw3ZFmCwk61t7iSMRKJ6Z2OgmWv2LOGgjWgROT4Pmr6LkkCVpgBokHrwh/QHa06xdSy3v6l2qab8jKlIG0BIq0FSM0JxmcXzTxm496xHxzdpenmS8IZ9W1Ozpe/QmZGUuxGxOQwruZdTtCqSamka5Jj/gpHPzElfRBDAV3z+7wE1cPcH1UCL5Wkf2wo2nhtjtfNTupoQ/nq8h7/YS9pfeknOQZu4Xyjuxn1yiJl9N4r9CK9c5PbC9i7o0zSF+EzzfPfoq0pL7zbkHfkflQnG7iN69I6H+3weweyAR+PYjhxaORtvfADiXg0YD1GOZCPv2pKdrh6U++sCmh1pBCd8OKvQ+S56VYPDm/FXkaq9M83xw9BRCtc6+Y6fG0dIqAVQxm92D2ISOcPDme3+3UeuH0HvqJ1NJ33AVNGgBbecfck+qJGWMG41W5AoBgJUV6DiRlPJG+geE0YB8iDRF3R5oBkujAzh+kdFwtNGDX2yBYeD8pjU347Yq86BPTw1I6iNQb3/DqyjW9J/3svDg95Six5G/ILOW+4BMjsimAsyC9ZABx5z+62kb9hnxb+ULy3M1SPieEGyI0bYhAMzBNJNFxslUge+OUDjtaTr6E3BftCaMd/tgTkVesVXlilIwED58yv0WFJ6SDoVZOZG8WpnQgtZWmyG8GpI5n9SpXp1LMztGTVU1gTfh4hKw42MG7MwHPDqA7n5ENsTSeyMZykBtnuMUwriFfy1YW9o9+TCzMPZkson0hxWiU+o5itOXAPIokNeDOL3GyxPF8HR/DxM6jhC8kxUJmLQS78wh4nplCkYB1d/7vg9wVnHoZn8PQdHT3qOl4dlqZWbUZhU8yu6n1UjbtSN56cC3p1MmZq76QfOoXR6qxuXhV0rk5O1uLlK96wmhvnu2pnQjBbjuz99XPQZIOgmNlDXAQu60dzhcm4Tsw6uEIkP6GGSUHXn57RlLEmSIOTx6PEGTr+oJk6VnI7mRzFxnNRO6aScrkKOgksQxfOG3dnZC2O1ZB2pF9KFl0qFnzyKchpaPlA2nA+qAnzD35iBMZL98wNeh1SclLyCUpLdx2VSknA/OVXU0enN+YW7549kV/wm6h8AtTG+89hLki72DvxkdHo8TS+dnIo9OGsSecbKyEdMOycHqzpDzJG+e+lPHeAzKSyP3sSbYK/Y0ihZ9IUg5uvQyHsfzQh/6Oq/d4wCfmnmgnZhszGBfVei/8eis95SDW0RP5TahlcHQ4tfIT0xA9eK+kZdToMAh2PKHizvOm3HMi33LxuaM19CyZ2ejZvTApHkv9J2Y5DdkJsHImhrOv9R3pipY2MJCnoPZbHrEi4bU5hRePnAtueOxamFocmtabh7RGwPpI3h08vjF5nK/MBibauGFl+APSimV86uwevraF4/ywGBXy3Ht4NjYnubDr6F+YGh5jQ+8JDp9s3UYtPGwh92VLdg+uqZTTHcRXW+9EvnDaEzNOKc2hg7mpBSrPuHoD7Wlyhv/6F0H+GnhiSvAAfzDEIJjIxkqkEOWEP/mqpZTeG1IrX5j8dBJMPAhTUDuH2BVkB9PygVr8RPWMqqUuZEf1D7Q9fcGbM1e+UJI9vfaBaBI6Ln3g6tETRrucSbFSVSyOFS59oFFwZLVOfqJCqD+iUS01HihOcqD6YKLgMe3nah21F5PumPzNaVVqoL2WLbQXpxY72B0tp0gsMmNyvaIomRBbmN6kuHCoDpek5iSDnpo2TP7qWpWFfkI0dHF6B3mQQdkh+kAvDsopEg+UxAzsQknl0itqHXt1LrTD8R2Tn85g84WATh6CM06UPjBtuzhl02ap8QGRTG3MaUt6R+SI3U9+QwrhXphBu0y2Jfn6B7e0+I7Jl9OAiVY9o5e+Ic22WWDZl0NkcaIBOlEafaE0XAJbeUd2tOsDdXKpedZEK0p6Q3FSS8MbpvbqzLcmIgsw5YCYEGMbWnlWwjuaftNiSZZtSZZt5dgfiBglTqrg5V58IbOmyfboRfIdk1uyjX+gNJr0hTIagbHEkEHpA734A1ocKzukA8msnurkF4ZQitC0IYIYlxJSO1EceoiKppxPHm35UYI27a4Qz/QDty3hdjDphhIluLShetKeZKrSoB8xalwMBe3GDjVzUqeML9RCU3vzo+cBkTCfzhbyiVaOy0W0ciyeleQHWoql8UTLNrpPJBkuTmpANC8MhBd/hk7QsXDbJaGV7ygpWqUE6ZOnrJRwccpPtIZvKKdKfEItfSEtjuKdk5cvTH66lfvshQrir5gdqW+YXol4d3FYO7ohmD2JvaNlO9VBchuOY0KMDYqDSFUiYN+o6zhNpW5UefLl7Kp2ojjUMKU3+I/eFccMePFZYC+klt0uTibOxSGY8bT8RmvW7ph8PEV7chtkp/2JkiUhqyg9oJf2gQxFsS3RYTtRtiVZAXswhDRy0kFxrG8uTnQ1EDcsg28o8njUoHqs3pfcCfgXImBtfEIhdsk32misVHok2QdXz8HuaHlVi8x8I0r1heTC7XCRGh8UZ8nVoEWTjG45OfEd3WojQ3fU1LwjOVwc2nW40GwLwy3VGkh39OJBcf6Gol892T1Jo2wfSdGGYxSkE0mqByU1l4rihAMXD8FpJ37YIVpuZaJgzdhlcp24Kt6QmsJPlIZLX4iQthR29K4nP72dsBd0dPwVrdxjPyGa8NRAFbMLTZzFD/3ElPCYE/ATmYHSOoq9o5e+I93p8WBSmqTFlZP8FZ+K0V48cpaDXqiFJ7e0pMGDF63jjUWFW3rFVpRjeg40SRyomjweEszuQUeSvWHyV9f0eqE0XDqRUVFGqDUvl8gnM5k4g4kelmFq9sGRyzektJ3us0EAABAASURBVMr6wmmT6Il7grRwuKXyhclPFyc6UG1Haf2/AcjfDvmDYv5A2L8okj9jVIo0JmOKv1QOTx4//tJJCzfRlXLIjslPJ8FYlHEcgoXPX0UhSfBj9x0zQk9uowfgtsXJltFUI/CmNm2YObxKcPN5B5VTy4rwhezKe3LjhdSqB1cvD2FF4t0R6eCaxgdkR3q4oPs3pDl2OovJ0zAz5Q2zmyIs9Q9eFb3Iw3eMHH5Desqve7Kbtgj/m7Oqs2C+D5h5kpOTx+bKvH1YeX6bXPwLqeWO7mPoCVcLd2PtGSRmlBu4N3oymmHojVHe/ZzpJmYeMD2ns7P5jskrMj/5fAN5bl7voQjjtynfMCkeoxSYPrLu+UL2tnEhefs2zF1xJD4ob+sSAhYRaS4hwWiqNSyetvI2clcQMVl3P3Im6GlpQloRsezFU474iMzkW3JHkClay4rl6YmzgHXJ8FVBwOgNx4+eHWnIbiT62E0y/B/y/nz0gQzPvdlXzn0o0BWHTykqnLuIjIaz54mj5T00xWhPH1uqBy+fvnD21RoiMAfwkrUETi18d3ZSoHHVAqmD3DolqkuCo1LLzhl94jRQnLelvnEWVT8xK6lzx+jw5Mt7T/Lse8W5g0g7Mb1fzt5qH9idaCdmPvwH5u14u7KTfN6emXzLjrOYNtqjhzclYCkw0vknZDcfRWzxRCYx9rGOpPERGWvxxJVwbzMw++PzBtSlHfyO3NL6Qpa3fkMIlja6eDOEyGaS683NaApmR7DvSO/SSZGoMNyeR+SW6sGPXhZ07hemdjo7mi/M3nCwCojxJj4F626EIG3oJf+O7KA5o6zn7U882vLe05x7wOHk/F4swMizbefJT+8QfVi1bx75XEFSfsO547h7Xp2ITnOy+aZw7mF2bPH0NG1I6+ZMRz56itGWsyj3wphp/EDuy0w/K3V4ZsLj2X3D1bPPJMdZjFEnz50QLAtGg8S4IHyWUh0O5doYPEalRqDGBHHpdA0nclfUtRhIP770gXDGQ0gZ78gz0oCxKJYheivAB0mq9xtZwiuGk5MQ08cY2bKQpOB0Z0e7eBM2egRI935gtHjnVi18RmbnxVnHQ2jjzlVrho74PUNP9RdM7fS1gyW9rxgtF4K5p1rCcCRs59yD0m8J4lHazT13ZG/qjI8OJ19trAiJNpg30U7rcBpWHo6neA1ncOronUVBmNi+pg2Zzr6/Yubw7vsrclt7BnMRlNeEl+VKOL8QFxPJqRGhjaOtyHCzVxT76GA476MNzr7y4Gft4lyGheNkGWzGkuDw9eYAPawla3VwhLTC574kecuJ9JRnL57mTx4tnnKQq7KsUD7LEtEHVnEn5FxGTFOzWQjNm1HgybJzMKXov5CFacE7tyOP6Ld8YHafemqHMzs17ov2yKlVD9KdPO8+MdqLdye1E9eOfEJ2bNhvCV8OIHEJybx9ZolLZy87IBh95O27YYepvyAyT0vMWtLsCd0QtcUn5K7WTrxmeV1LvTzr0gMea0JT+0aaEPstNP/GXEE/1/a+hVHijMdyTTFJ9Ow8cd1V7a8597VnYe4LvyG18uC8KvG8j5fkrlY7SxV85rNoyukLp7PLHpDdtQzQw0SbfmIGlmeMgVoDOy7kD4Dm/vxh8EKyWgMlkB6TCf9Ci9NQ7F8w6YuJMFwiVU9abw7BlMagCJhuGAFPj3LIAXtQ6ZWIwyeGS4ixDb34htmDVwniwm3P3I4SJcuS7MQgLsFxSVEv9+I7Jl/OjmYnZh7FG6YWfiI1eBYj6XCheQLRNMWCXnxhmaWiOCYDiA7sOIJyR0oH6tRJMKVwIkk5KPzIg/uSk0fEaSX+xY4mZ7PUHS5afsBI0Z9QPV1B9ozW6BuKfLkWfiur4iD+C1M73cp99kIFcVDRRL5QRXYLTTkHCkU9btTFl7BA9mT2jl76Qmq2WWJ0qcFSMKAG6Rl/FqUOpWd57okGuiiONelg8jhs9CQ4Ixu3yvWElqovJC8vTiaOT65mFoeAKbsHLUdGOJHEtjA8+MM/Z8sli0PAmgdRyI0Lt3JMdsNcimYb2bK9EJA19BO1dFAcX25ZsYamDVJE0mLyNz97xIFgJGq7OF8cARMPxRTUziF2BdnBtHygPrl6RtWqLmRH9Q+0PX1F8hOZS+4XlERZlPWMliXc+BumZomO2WEFD/6FRsGFt++GIakvbBP8hoYZ0aA4xmP+4lFv7sVOXEkfQi34048eyb7P2gdXzwfVVP0DLTFkeUPS8g3pqXQitRlRzpI16AdEE04DMdnmWvkLOjoOisMK+qWgOLab25ZiRcs23Mo/kV8oDZdOVKvKcQL+iUg1+16xw/FXZCw1WvSElJXaA6ZdW3HaEsfdWqIlcuNjDiU9UILEBpFDAsUkeO8jYLKNixPEhaNpIUx2YhVZwo0Hf7hX7UTPzLEruFwLbXrw4dINxbGENTyiRL2VF/TSwdwD08KCnAUSWA4lDf27pzH9N4yAPy4Th1rjIGmtjIDpWuek8A0tid3YQgSIDcqyLcmyrRz7E6UoS55cWug70mRJtmVJttV/r7h6vGPy5ZIYFWWSmDXcITL/xLljmJf6gaHMZIdOJKu+kLz1YoKkCEkXHpwCRkF4auJ8YmrIOlHvZ5tlo/TEo+E2HbgdTOsDSvsK5aT9QsshxB1948MSkTEy6x1Te/NMpfaASJhl4zIXOBEfRCAX55Nr6aDVw4qFI9gbktoNsj8wU9EWUhVN6kEvLyHcCLx2iC/IDonaieKEC3VQqSU9UVK5eiInGbS+UKZsoh9QS19Ii6N45+TlT2jlPnvH5Mv1idmBJsleqE+kpjkGDieVHaYP9OIL6bGdJnQpIfQRxUkroA1DhyMe5MRoLx55BumGYCSKpJzwn04REw/GmIA0MZLL7R0l80+cb0TEjMeKBEwZGXRS+Ibst+G4cHtyG5SQPhFNQselb5Rkabnv2J1oYDpscjpsS8VGlcoqGg0X/sXFiQ60PoE4osmEv6M4xmNW90+aKFlzFp7/bwBW5a+DWP9A2HARyiULkx+O1L82LowcfkNq5U9IActfcjN2uzd6xP4ZE1JkRzRg/upKcvATo3VTEyYvZEf5L6SW93Q/zTdkUzgyLYncA2Bw8tRv3r/V8rJvpG3pqXVDd2RLnvCKtLb+hGwcS7EbEpA2DqsIovKMiaNB0RMvPqzxq3UJfRAdwUgHZldzxCAt6yNZj1aegC9K9sOOpvxmtB07uacK/I5cQ22M2Rg95eRs+H7OTWdb+YYMwbLizIYnzn0ZCVtX3e5oLSHTYHtAKH0ksYqzC5G7Kj5gp9B3zFz4hcMeeO5J8RHnztx/Oc3ppVQNui6/lqe268lP/yyGP3t+v9lNvdYwm440iKcvz/pChOo3nIH8f8d5dO9JHc/y4VMZnnz8k2d3txEwfpKZnt3M0JA8ThGja2mQuTG8i2c2Il0M11KJ9ILtpL5j8vHeSzXWbZFDdkx+eG458uDBT0TEbruy79XPQRIGMZKO/w3bym8zq/ltRuBnSxIeZFV6WDbfCu8AeOjUYtONHoLfOfvQWN7p7GqdHakMJ0NsHqSTMiObzo5qIOUY9XVnZ1JYnJRJYjhFsuGJ4UFEtoS1qwn6DamUL0y+PG9lfArRQr4wAp6H57r0/MQWn8Ox4xemdjprmueJvAHaHwzs28HjOWnb6JL5LSLCZvqDMzRKIh21hplo2nDx0OVZzQpqeR9ONjwNLzw9+FS7oeyRs6Ydr0ghlktp7G8C728E5qua5wZ6kLim8cLUmP03W7PHDDs7d0N6yoNUk5P2HZ9I+Vj1iRnjkenA+yVFAnbxyRKzPBMbkmIRZz0Eu/MIeO8jYDyVfWhpLGe6v+1CqtOzXpLWauWZIsFGv3NktiSiZznp7P7kbEwdb73YZu5eCGRZ7tkx8slLjtBOyI7JXzzyuQiCMcxDGwejvfnXLI18RwcPTM/p2UsPwNcTL6tKwCoWCdisi8rO4Ws6HM8P1t+Qe+7IaOrMjh6OlxOw7Hv3uWcic+xKPrvIvngWRgf7FpDltDFca0B6wVYyyWBawi9nM/rOoXQnpntPq6U1yY7JTyfB8vvNLOR8LHlnP3AaqSyd7F+s3d1NN3hxsvKF5Lmiv3GlBL4u+owSwwt9erJVzmjowuMXG2QKPfk4BEu+Kr0KDlYBsdsduSfOIEa11vDC2UclS+jibeEA2jNPbbz3JJ3GrAjjaZuQ9GgM7p7u8F+YWjx7gjc/xBfsbmonZjicJ/J9sT46UnqK9ByYlBxoW6fK+Y0OTJFFpcVk1MlTSvaJR0damhOw3nFHphHy37U+j4DRF7GvaU4XpPEbuYRunrDqzQjY6IyQx46OE3MZhdwP9K52V6crC5K/YYcS8PQAPCexa1aAPxaXntrhSPuCyB9S6N7SPH11AsaHxGiFYHnHfGO+KcKBrdD3hJW7PlmmQooIRX6bJ8xdp56ewzOX/Ia5O8Ig5VxTkh2H04EeltKOfAuVqhkmz/3D11Tb6QvibaNUhDOS9sKEFCNRxJKNXjLFCuG7U6q+Y/LlaU268L/+IbABFcQ0fyUkwxaRRpSKKbx45PTcUIqknOokICblT5RJQKz8hrJsS7JsS7JsS7JsK8dygHhgKfwBmUmX7akvtIfb4M0lO9oLStRx6QWZlZRo6YbieClBJeeuO4pD1UDrIPlq0zemKPSFekK06k6UVnxHXccrPXElfQi1YKQbIsBtkBYttJ/5h6zVtdB3pNnZiWpc5daFpLKQRQyRTWZSUMXkyyUtuWjxz2g7SmGaPuv+b9Wk0X1hs3IyUJzuIA9CZYfoA704KKdIPFASM7ALZf6JcyDpMi88wF7KI1KLfnMmy18QeV2utIWKNcHhXnRHUza6vxHJVMasR0SuvmHuimcgaFuYpCD+iu2g+oTRPtyLn+iZnctkw5dDMDPgC8VJHUCUb6jh0iBFTDkXTubpIJry5fbKT6RMV0wJq5z00cVJD9B6QjkBU/iLu7o4xgUDx0LgUgLSD7Tm6TuafqNbkmVbkmVbObZlEjtRk0t/QU+dGUuyLUuyrf7bMXk8Fa+eG0aTKMdEqyifPOTizZB29OIPaHGs7JQOJLN6qidfbpNgekNRTO0Vs5aeQHqKEw51mKbaXZLA1p8QrfUnlCgxGUtdgqtn0Q9umaqJBrXQC8XQ5Cse/MSZgKodhv/ydKUOjlnHrMwswctFwcqxHCB+4QiidTq+OEJsNdghtC60wy8n049l+vvpBtoWZj/svpMaumXFRK6kryhNXT1pSzJofWGKQj/RZH5UEDFq1obk5QuTn27lPnuhFpaTl++YHeEbpkc5Syc1HvtC9lZ/RMu2CNiBEiQ2KA49VBVxUHMg2OSJJQ2wHZO/eGQRML1hajjPaEva4uVNxLEObnvxhdpRsPAnlCjGlNMuAqaIg04qe5AEIw9/cmnq0jtKsvTiXrqVYxuOg0oGwmRbkjWwUAtNBYdq6hsXhxpr4v+dAAAQAElEQVQmETyB6IvDSkDjRx60ciYqtaYETDlPGO10Ekx52IkkcBsUvtAm785Be2E0fJgyoZxHzkz1G6KUL0y+PMtsC8OdtaAulyaXXtCyhBs/MPlyFq+MOplXD9gMxESbcoKHi4KdINkL9YRGdZoGGw8ujlEAogObZ23pKlx8E5IeheAvz7LUbxiCZw9w2NCJOt9mMnEWsqvZK0q2CdiJkiLhX4gwbVYwjUFYeVF7bAfKCzo6/opW9xMw8ovLmbPscRKRRdxQUuriHJgUjzkBv3Ayy6iS/YRo1U1darD0iOKkBugRETGleKBySkiC404PihaWWxxCrWGqkypkPVWDvqMWL1r6wiqog+IY5oUATJdTwDbuybnckmzLkmzLkmx/+KEtlKYuTnoHZDAhePhIYaK0oxcH2dHqieJEB9JlkBqWRMVqpd9cFDE9YgqfLk40IDOBHbdS0v/4m+T64yJ/EqwlRN2QvyhGSeP1l03q0Y8/YS4soMemnxdMaygOwfLn4fYmLO9u8huyqPwVWUmNW4gsHosIR80+oPcdGG159ZXnnm9nVesvyE7KvWuQX6pv2JAqbCJNzX9haqc/3RstFwfZlvvo5wI+p+TCEYlLJ6NIPDh7hpHMLramZeMo2R8lyGgbwPxek5ek8dXby472g288V1CeNgibu/NCsuovSC3D3d+W+a5nftU6lt8iMzekp3xh8jgD2Vk1eTWe+ompZWeR7jOnt9onpufb+03dTQ0cvmbXD8ZqstQBevK+ZtzzitTa90/IFvpYnYvzhOLBIbWEtAVbIxx8XpfIaxGTZdEzsoEexmlJ/ydnCpliLMVividjCPD0jJ+che35wnagLmQ3k+wIx1mKBI+6OEJ3nUgtff/i/Tnpf8A8IhXWkhJrUbgXhZG+o4y7XpFa3kdzjDZ2sCuEEhwrD/4fgc1/Bv9oUMX/49ZwfPHqyQ/PXHJwZrOYfi46+B+29O4DqZX//yA7+m0nilW9ociXUEEjyUvS+430czexM+0J/ydnd/t2TL6c2yknshstGcJ5V/juW63dXzwfwvR8RHcyviGFGHOjl1B/wWkirjoZzbmE67mHjKSxSFsJiCE1Fpv1XjIwv2N2/U/I8unPSvaUEzBWJmblhYh55eEpNl/6J8/uu889tNPKJFdOHj1+aAv5fTr/C1OLswhLxm52Jcv+T4yG81H0rXtmcPFoNKDlbkTshc8SbiBJP0DznaMxTeRN9KxkQSp49eve7Pj0eQtj6e1IwtqZtHp2TE8o1a65I828sPuCeOtBhtgATaSvRr5wWhZPb/T6p7bz5MtZkHtPP/iJuZrefsLC1MKDuTP5L0ztwfNDnPdSH95lSXMxNywOROwL8n2pHEjtplMrD2bvA2YXFyzoIihTpBVPJMGizSoIdnJ2J2cYaOEb04OzPW3NCBj9tQZ4PqRd9G1ImaWx0XnI8btFPPJH7MrZ1foXXzVun2sWzx1nL1r5wuTxzARvniemb8fkh181xrHFycZ4RfaVUAviydjA51IPp2c4jyzfkBqW8vQzkm+n7eQkW70N8Dt2ZoZYzgu6NCl9hYXksTJ6vhGl+kLy3N/95E8YLT7X5+48j3kuYiTj4zSUP2Lm8NQOp7nKK849lNn/Bw/fnWmekbddPdGW5x4KsA4F24ueZeXkwXJ20Zg0X7YQpXqQJMZOGqiX/M/IQJZxM1vWrmhsQ0eLfZChiTgz55uzZefk3fWIrK++I5fNyogZvZDdx+8VpEA9N+PsIabj8uwJ+4Wpnc6G5jsm/0fvXfSeyAv7rg3n84ibRk+E/Zuo9tsIWB/1gEwxi9HOvbTRFBtOmadgFGoNqINMtI+AodFJMvXksxgpndQxyDII1svAvr044zPKHFp6Lo4AaT93/MZcxY6uzNwnX7XsS88TRvtnZ397F37t5L4+Y8P05DuCmU3+gGzkZ8jc+HBietlJMRZhQwoxeliLHpKWhSMSw9lLRhNx42XwYACMsSWteXXShTRgKeTK/7z+OnjHMDNgqr5jaNQPRKJP6l80xWldw5OfToK1EBShQ28oDjWi0quc4T55NA3zJ3rpG+Y+3DbNlu0Nk4YvlKirJ21JgnRcOmJ50fIXGm05w81O1NS8YfJ/cAYxi1UiZsHCMMM9vNFSURyTAUQH8BNXkp3IunAKNoi1ANoNGk4uPNqJksqlCzWH1kl+xK/ZDOHoliWQgFn5R5BtOHaipEi4OJEBDfobUxT6iSbzUgaPiIjBrA3JyxcmP93KvfYLKjr+gMqMpKmKk0zwcXGMx05kpvwXUrOZwO1PZBoNkwhUQc2BYFKDNHgj0ojSDdOzPJDaA/rQLTVdmDzOcySSIgGTDn7DGbQXUhPHr6hWLA4BU0aDSYK25ZSDJLaF4cHN2yNZUuvSN0q61aVycUzmhUDZjWdp1BNXV5qqw6lhEgEDsdRxDFJrsP6TKg46XDlwcuO6uTipAdH9hGjVXzC1B+9bGZn3SAf/Qs3JimQ/keHWb4hSvjD5clWyoPgDcmFrr8hMatox+Ytb7czOZg+cBrWeGi784iFMRmiaYFoc8QHFMTpAdAAsgMOHNR7CiSvJfWkI/vKj54YhUsaU87EyUnxkyyHEIkMmF148+IlToYw5RPaBkpJuLs4qKyhZQeKFKpO9UDt2AmWhg/gvTA0Xx7Yw3FIMYlu24Vb+ifxCabh0oiRrzl+RXe1caGcCX2iv/ES6m++YfDlwvzzzSyTVViwtT2YyS8TDndxhDbADJUhsEDkkz7rQKtdCCCaVoy385lWoBtMX/OEstSTbsiTbsiTbsiTbr05BlmRbFudELb5Q2ng74b/Qqw6yM9OFqBaHgOngyZe3b+WUpYTwX5jaq4vTBYOf6Rd3N4mHmIlikvATScpBeuy/ID2x6ZKCh4dN7tHZZUm2ZUm21X8nLs1gKsHUbkitHJREWVAN+kSZGgFYcfjEb7V65HTfkEr5QvLcRZvskOh3pIAYi44LT684n5gask7U+/mcLZ/dznz4ctuKpIU2XIKCsZOrZ1HqpQstl/oBLTFkXf9IMbgpkY1ZtImooqm9uaz2aEfy8oXJcdFoSe4/cZKpzMqxaEnyAy3FVqNdIvsFxaFGVTTpQOVAsGSnf3LNhHQgu5q/oqTUsugDbURMy0PFuaM1fEM5XcQn1NIX0oKFoEsJ4dkZLCcpL1qTL1Rw84OfyEoGLMm2LP2zi2N7+kGobAO+I5ptIcbuKE5KgN6QmlexCFe4RLREfPWUU7+hFEk50X95GlO/YQTLNhsutwwX8RPVU5WAbdz0Q9llQE+IVn1D20jORDGZbRkFuGO00z01oquZTPhChpPZjbIvbJeJ0UAy6kRyJBKMXPjJS9B/ITXj02WJ3PigOMOE1r3iGMc+uSKktnD+F4A0rj8R8ofD/Hkwwo7JD/+oRWYqlsojpud0Eix/gZxeCNb7T0yC50+Ur0szQU/rEw52Q3aU/0JqeU//Uk3zDVmdMpCWQJG2YoTmJIP5K+287Zundnm7aKoCHpxV1+7oeN/whPkRoz9iN7NuR2h6AyCjzc7wKRz8xJX0QUwFd2fnPJ6+6LQMJzk5eYyWwG8/mhZ2BzmYr5rdO+dXpNZnTNhbelXKSZ6xWynvyH52jZJ4OY33Cq1Y7/zE9iLm3jiD9EX4fPPsp0hL6jvvFvQdmQ/F6SZ+84qE/ncbzO6BTODXgxhePBppew/sUAIeDViPYS7k05+aoh2e/uQLmxJqDSl0N6zY+yB5XorFk/NbkaexOs3zzdFTANE694qZHk9LpwhYxWB2D2YfMsLJk+P53UajPhdmXUn0kCK1IjNrG6UoYf/X6p/8r+qqfvA/4f/HVQdmjpxdYqbfnp7wE+kpB9nJcO+447VD6WHXhdTKg4w2f8FckdIrUsB69wfmib2zyR9a2vCNfR/1f0J+q/Yt5DfJpG5ILTzfxd1/kr8hu/6k9oCqzq7UsusV05PfMphv3JAdYjZ3XMiLqy8kb73IHlC8WeAfZoOZvZCe6sG5T7xN0R4xPcvZqfYcfO3IfdGfMNrhjz2zq9/Q+gePhv/BxRvfkbdwzx96dOIfpqJvSE18R5Ri8uWiO+9ILSh2Bf/smB54Z8HWwPau2h/w4CIfTuSe8ldcbz3eWOS/DwfmnuQL2cg6ZrhD6OXJ/9nXbPZlhh0sxKLj5Tvyn020vP/EaMu7g/wV2ZUa981bw8f/oGnz4X/oTn0h9ybTL6TWepB9+c9PvLVYzu+5MPf9Se3k2Z76jsm/XbzsD3e0Ag5fb2XnxdlXvpD8D943seMbu5HxhfQkE3cU4RT5P1XD5j7xflUP3zz3pMas3jC1N8/O1E5kd/mG2fvq+e8CvZlvT/h4Xp9vUmrsPPgd85vRz3f8oUdF9h3I7B/y7HhFelrfMHfED/0Pb/tD/c8nsrsaqNR4w3DedHBqf9Dnbejkw/90o8LJnpFvofaHXTqRby4Psq/54B96tHN2K9orsj813pj79YnZFe1E7infMLXccSK18ifkvtYWbrv69pOHMY+p7+MrgvlvdRC9v2E5AYsMtP3C7CnrrWx5wPSMp9gs+4cQURbPHaS3O6pVnO3lTI1RqDUggY0gjUQex37iTCf55KlEB2eA5OBLYFeU/iaRwk8kKQenKZEdn3zk33HN8A3T98FzT2onposejAtr/fHg11vpKQexjp7Ib0Etg6PDqZWfmIbowXslLaNGh0Gw4wkVd5435Z4T+ZaLzx2toWfJzEbP7oVJ8VjqPzHLachOgJUzMZx9re9IV7S0gYE8BbXf8ogVCa/NKbx45Fxww2PXwtTi0LTePKQ1AtZH8u7g8Y3J43xlNjDRxg0rwx+QVizjU2f38LUtHOeHxaiQ597Ds7E5yYVdR//C1PAYG3pPcPhk6zZq4WELuS9bsntwTaWc7iC+2non8oXTnphxSmkOHcxNLVB5xtUbaE+TK7Cm5AXnfwGYvwiKUCN0Ysfkn54mNExr9kIpknJSvzkEE3+BxBTUziF2BdnBtHygFj9RPaNqqQvZUf0DbU9f8ObMlS+UZE+vfSCahI5LH7h69ITRLmdSrFQVi2OFSx9oFBxZrZOfqBDqj2hUS40HipMcqD6YKHhM+7laR+3FpDsmf3NalRpor2UL7cWpxQ52R8spEovMmFyvKEomxBamNykuHKrDxWl+oqcma3S4frlWdaGfEA1dnO4kDzIoO0Qf6MVBOUXigZKYgV0oqVx6Ra1jr86Fdji+Y/LTGWy+ENDJQ3DGidIHpm0Xp2zaLDU+IJKpjTltSe+IHLH7yW9IIdwLM2iXybYkX//glhbfMflyGjDRqmf0pv9R+8wsLvyLixMdaL3IXP4P70NHIyWKlslMJs4X5gJqtqe6UAsHqGHVim2VnnJxoqf4hqm9OvOticgCTDkgJsTYhtbxxnc0/abPkizbkizbyrE/EDFKnFTBy734QmZNk+3Ri+Q7JrdkG/9AaTTpC2U0AmOJIYPSNaOE8AAAEABJREFUB3rxB7Q4VnZIB5JZPdXJLwyhFKFpQwQxLiWkdqI49BAVTTmfPNryowRt2l0hnukHblvC7WDSDSVKcGlD9aQ9yVSlQT9i1LgYCtqNHWrmpE4ZX6iFpvbmR88DImE+nS3kE60cl4to5Vg8K8kPtBRL44mWbXSfSDJcnNSAaF4YCC/+DJ2gY+G2S0Ir31FStEoJ0idPWSnh4pSfaA3fUE6V+IRa+kJaHMU7Jy9fmPx0K/fZCxXEXzE7Ut8wvRLx7uKwdnRDMHsSe0fLdqqD5DYcx4QYGxQHkapEwL5R13GaSt2o8uTL2VXtRHGoYUpv8B+9K44Z8OKzwF5ILbtdnEyci0Mw42n5jdas3TH5eIr25DbITvsTJUtCVlF6QC/tAxmKYluiw3aibEuyAvZgCGnkpIPiWN9cnOhqIG5YBt9Q5PGoQfVYvS+5E/AvRMDa+IRC7JJvtNFYqfRIsg+unoPd0fKqFpl5RtFHJXVcuB2ODmJIcAnEpaI4rZ1oOTnxHd1qI8N31NS8IzlcHNp1uNBsC8Mt1RpId/TiQXH+hqJfPdk9SaNsH0nRhmMUpBNJqgclNZeK4oQDFw/BaSd+2CFabmWiYM3YZXKduCrekJrCT5SGS1+IkLYUdvSuJz+9nbAXdHT8Fa3cYz8hmvDUQBWzC02cxQ/9xJTwmBPwE5mB0jqKvaOXviPd6fFgUpqkxZWT/BWfitFePHKWg16ohSe3tKTBgxet441FhVt6xVaUY3oONEkcqJo8HhLM7kFHkr1h8lfX9HqhNFzakFyc9AyIVKTgZCa7eJihlu0PhMqqrIWWyp9QHHQtdxKjLXTRCPixJNrplJo/IRpjRD21pDT/C8A/+dtiQv7eCPL/YzRZ1eNPl2g3nja0lsFY6sXUTifB+ifPD+xswvLrr6htZCTI1tS1YS+BB2nBQsLAeTnDF8883kpw8/ZtnBSJTpbmPcDwdf9wrikPrl5u62xwd0Q61g6yL86OaCzufRsyFDudteRpmJnyBvb+QmrpYIqMhxPZQoLa5BNbIjDB22hPgiOVM/SvyAiPTgSYS5ZZMN8LnDZV3lJlIb3NfiE1lmNsiJXz3A2bUsu3HHmQLuYaN8yNOA1ERn5Edrb6C1M7ne7mOyavyBsm729z3L+QIm/hxynfMCkeoxSYPrLu+cK5o1+dAbx9G+auOBJteVuXELCISHMJCUZTrWHxtJW3kTuDiMm6+5EzQU9LE9KKiGUvnnLER2Qm35I7gkzRWlYsT0+cBaxLhq8KAkZvOH707Jj8y9P76dz72cdNeReVNgdpQc3vikTW+0EUYtjo5WmO+gup5Y58BCnD3JI1EAzOpnLSCM0JtYZpIKUDS4Knl7sRpp78U6OtdZBbm9JcRAJRkzCHvXAaKF7fsHHurH5iVlDnktHhyZf3N0iefa+YN+FrZ/Z8O3uzg6umtnh3kp/InvR0V/QHnhreanaSZ+fB7ziLaUOeXbTns+BYCrnvDVczk2mGtTlLFydFTUQY2DntFU9cCfc1A/sYsN8AfvJDH+SW9ixkefUbQrC00bVe0y+IunFeQFMq2RHM3cGLsyE9baXyiOk5/KOH245dr5ie09nTfGHuCwergFieybegbG+jDZ1qtX/EbEn/L0xteb5hUvaTDCdnB6/ByOchqQ5P7fTI9MSqffPI5wqS8hsyXL6QnIuIcJr5TwCaGE5KZWzx9DRt4DejJ2mduS+MtpxF+WYYc40fmF3RN8xMPjOe3Tf86O3b0EAWY5PnTgiWBaNBYrnoQnaH0IVea2DiQnrKTwzLBJh7eW92ZKD33niG6MXaU4z25jRg6e3q264WuGbwuItXdNkg5cwsJWm6L1xdLB8dniT8RJLyC3NXfN6VmeW5J703zBvwjHMx0Fj86mVPqtXJnzDa6dmbvh2T5wFgd4H0k2LcWmtYnHmyfksQj8IUEn3hmS+y9xNpWeXph5NkHIBgJOWDCBmIs6vaA/b3zXWpgReHYGxh57w0O1557sE7f8P/Y/7/GN2RfX+iDdJAPRGfCxZPHY23RYaRHXxYY+6jkrufOTPpYUl7itE093zV2NKeBPq23RmgCjRSDPJDpSfwhKxJiWsCnU2St5xITzlNb8jg3Efv5EynHyi/YQieXt5EhpXcsAo7WIzlW1DgybJzMKXov3DWMpqmjF7I/f2mD8zuU0/t8F5F9Sd2PRPB1cvlGHeH/3Cmci8d05unM8h1XxyBbu5IDx7L7DeyjR3pbJ38HZlu/QWRe+lCNmctjBdiQ5K8OLvbcyKjWUj7uSu18IUpx0P7zdTuiECx30Tjb8zt9HNt71sYJc54LOuLSaJn54nrrmp/zbmvPQtzX/gNqZUH51WJ5328JHe12lmq4DOfRVNOXzidXfaA7K5lgB4m2vQTM7A8YwzUGthxYe5GwPI7zggEC8/s/C8A6XP/RJjoxRYGWkMG+0dIMCbCcIlUPem/OQRTGoMiYLphBDw9yiEH7EGlVyIOnxguIcY29OIbZg9eJYgLtz1zO0qULEuyE4O4BMclRb3ci++YfDk7mp2YeRRvmFr4idTgWYykw4XmCUTTFAt68YVllorimAwgOrDjCModKR2oUyfBlMKJJOWg8CMP7ktOHhGnlfgXO5qczVJ3uGj5ASNFf0L1dAXZM1qjbyjy5Vr4rayKg/gvTO10K/fZCxXEQUUT+UIV2S005RwoFPW4URdfwgLZk9k7eukLqdlmidGlBkvBgBqkZ/xZlDqUnuW5JxroojjWpIPJ47DRk+CMbNwq1xNaqr6QvLw4mTg+uZpZHAKm7Db/J+Yj0lD9r2g5K2m+o6onVJeSKsdkJjEIEB24kF0K+0JxrJFNnv9r4MBSvgbk//DHmgf1J19J78JP/if6L8/K1q8df1iM5f+O0Teu+3S87YOzS9T+nCgOPVlUHUrtz43n7ugPyEwe8ecDdeN5C85e9ZC/4Z8WuOgNmU3P/+PsXbTkxpVkWY/5/28Wr5kDZJL5qN3nUghYeLwApjTVvau0epz1k9b4TtAx1sLjF8m5HPdJ5hjkfZpnxic5p3HJ1fUp6nmbx4PWbGN2cxc5z1rPO6n/05jTHAPk2QNzaWqqN/E9s79v3PU3uQszQs1xMQwxfiO5A5mLuZ4VvyQOnxF7qE0f9V9mkfkfvKV61ocmwAr/h8trZJFANQzvgk+C11T7em+kJjyd/4PmtDBLHmEutanG/8l1nnc7rOHoB5lxGPvCNM5sc4rNdTZJYvq507D6Qe+QPp5Fms+icpHaVxzBCncN7Hx9BXzXawqFdU4qfthZcnE7zG6H3HZsZnNp34UeVjVNBz5Y74LzoYkl63P8TgeYh5zlOx6btGVpzlVQcvy/GD2tf3CddewzOt98bZ1zxMc69TIjB2c/uQIHs1Yczaq+yBzz2MEZeZCu6jvxXfbLhxGs3qR3ybvGb/wbqTZHynukNLYNNAYPc4rNUx/kQvxFC3hHYit+07iH8QcTQ0d4jGPVJXPgwR0PmM3jZMxjF/m9Mceo1khzDyJ+LXqbgh4X+KGNYTNUYDMylH5hQjx9LNOZ8U0P4ocy3j7sdCebs7n0Uu6EWXizM99o7JfZbe4LCbEmM1iGA8YdWySAH553nR2Hkz6M2FyBmRtxZ7pl5o12GdskG4rSh3h1BdtDoLvO4A8yIyF3MTzqEF2MOd2LSarTx7DO4uSDGdLDPl+YHd+kZIzMXeNXf+PE82bu1N+WdzqDWJKZzbyTXNYz4DTczKjyxtl6k5qZsYh44qb8yvBYCnKjcmmCp7ho7IcZXo1UI1g4MRQf9Z9GkhUuzKIDUWcITfXMncnwKzyfJMgazFWysWLL4uiib2T+DBoLNrP8GZgQeiexhDiWfDLJJNvmyc4kBq2YwadiZpKyeyozKYcYFuxDh8c4aH5t7Cs4eMF+MzyDuSadv1z3ZLKeizisWPiF/8eX/9XAvyYsxy+ydzOq3qzLxmpvSe4nSbCu/zXoOeoHDWD9t35mmQPru644p75orKfXofNFZlT/RXLep/MpfpBJasKUuHMOYKHxzT+s36vlZp+kbMfNdUJnOMUr/CSlzX8jE9cy2QluhG4a1SAkyjXWvmJI4u4vvVT3j9Id6IWokIZOOqs+QUnJfknGE6t2w7bE+2OdRX5mlJ0zOacR9JMcQ24tel3UVOMz4fM6jzjTqm+kCeWIy1vafZ1ni2of9TijOTe7YWsgkjocV4NrFkHOavAL20X8TvvULy71RXuOya9cZ3r+yyi2llRjyH34a7i5e1z/svek+rv5+a3Z5Lu6rUmnKzHrvNYHCTT+4Grw/469dM8xjzl86ZVZWn/Z0lZoxBjF6kfxpMo8dVygZ31jB1LzIH3Vm/j/GEd7PkkvuX8kWeTVL/tHg2fzQ3PuSNwfpltIT6fLu3FWP4YzduqLJFhX76PYxLtdjTjkWDht/19s6XlXyKKFd6hzklHVN/ZOd00bq/N+knnk+JDa3c/s0uQ4g900duRg2Idujedi7V0k3JlutJnR3VwRZxlYdDcuX1GnOeuTRCyntHn9bb5HDzNhTPFBA5g1zGBa99/c6W84Z/xFc5cxpD6nSSQfsDvgTnonThrDlvzyGZFjmm+KZ97Kk88MBdSZv8f1l6388q06p8iVW97ardNbttRZ9YMOJfX26rw7Qdb5+1fedAvo9aT6vIUkxLHdXzRH739bu/fs+XoxahqXTNXH9fy23TXpxr7QMi5pBuublGysl16eu4fYcSMuy+A6BsF6agNYz2NjcVXmEbOwmu71GRvHtrZkqVYSlcu45Fd9xkuH46zZ9D00k9VY82WLud8m8BDvcafhS1ecWysRd+r/MMPXIASLZi7afdHYL/vopZD3aONJay5zLjWAt2d/rUbZWA2WbKw1zigzl97daswPrJ8h5zxJq3l6V1yNVbOxnPfb1jlrp49Z+msW3od2oHHYu0CGU0ZzVzdCP9iMnTRaon4Zk4nfNZJqd6vvbmOW6typfxkOy89v9SKuy+K3942rkMyOb0/1l/GvHhyz34AzXppY9Sa+R/QzZuCDnkUMMMudt37XDTPLIfnHri9N6L+MJEvNHD1mqbxCI9V4sN3QnEY5ywB5vLW+6U6kSHaKpTi/NKm9eo4+Y4vNx8sbOwvl3e5Nxr9pY5pz5MPO4A92JrmLNqt5Xd8St3eFr99Haqohq60X+UzItfskueqLJqhzPjE9gDK+KvUax2GdV/hCqijwbt7jTgayzGN4NlPKAWpOpKGa3JOUkHat+F2vyJ7AyK2Z1fqS2OaCmqwCl6Y1UE2Y491XTM+aiw9B9Js2dhol94GG30LKe0l962psLO+4rodgeTk/2082ske2kHEnG0bfSIrVQMkh3+hZV9ya0+g8cy96BxOLlK4zGcCqL6nAX971+0fErqXZbSbm7MZbbnx3q7GWESrRtFherM2kIZIsvRWvWMkG1Hcj1fid+tss1f1JEix//xzDNwD9tqAdd4Ncg2gAABAASURBVOr/MMNhY+ViohufxnEgK7l951FX/WAmM5NkMjNJJjOTZDIz8ZmMYD9Zif5CeqyamZXfnFl6Bj4smTH2gwl5LPlBepO4T/JgeGZHZPQ568nwkB3QPMTfZfmkyRDfzDcSa3zck73/Zl7PbPfidnoRctLQgwTQM5CSbM5812/h7KrNeZLicSbRwVI9eRE3E8JhV2QGb3BhSv1tSXZ4cz6ZhOgrnqq9019vc16sV40Hw9Oz8CUyM4q8cbaGGZPsJ5PQg3oxw6/wnMTdazZPzOzIV5Iz/jA6q3+Q8D48linDGLn0bHnnkB7i80lCQ2atyVcSbvxGz9JskDMTVhKJ/WQryH6jsWPn9LHBkjgb90aV8SG2DIc1Bl8MD81EQzB3HuFh8x8SK56VT25sBn2n/rKZxVwMDzFWwsYSPy081oDWuFWzsaL+YdN4eAYLCq6lQCduhP7gZF39zqF+iE+SycwkmcxMfGYmgzPjnuUn/4Oz8vRMkpnJJJmZ9Ned+pqZ2TUPGktIu0JpSF9a8dL1CN05W3/hhGfizOQk3qRP4/rbZnBY+cWQNPeTjqVGWFOu7YwulZXtrCSw+W8k1vw3JqTodJlP0Omz5ZueDNlhH5jN2Vx6qe/7WXGn/g87nEIOhmfgbIJUG8PiHfi/3+DPL4aHnDPylc04qf8OOHh0sAYLSr6s5xB1ltmv5JzGv5JZjW9+nUWO+PBe6aOOkfgM3pOqrCizJzwXZ8dvJBdmz8Xh3aefbYjNzkkmNT446sV05libLD/ZnCedlRAzjlXfuXOdZRxtDTqbPafaXLhruFMWmRxydH7RRofCoWo2wVaR9H4yncV+neMZ6nCn2PMgs6u/0CZzf9EcRjf7a1Xfek893DvEL+JXl+HO0/vPh06f6f1DXfpU4y1O4+xlOKv+LzKr+b9o7qfR3dysO3sO9x7Yd4Lz0OFplvrNRthYg7kuMrv64so4c8XRzPcsrfGHpqp6E1gnsmd+sMlzY37dO/XHN+s7BC+cYSSdOcSNbhrDBjNPND5fyRfxxh8kUr2Jn20ciztYsInPTqETI9VJvnMyCTbYgelraowmduJ7n52D9SArlMVHnhYSM27JzGa+cYiORYvdTx2eIQLYR9zMsZU78dK3gO6ZkH+Zw8w/qMCcA8615Npz3W3wwrPJrHo/mcwMG+tiEkPYBwmssom0UKKqy9z3VhD5wTGO/eSk89lY+C+dsW8yswwneAZvTGI+PCd1Mde4YS8ubzJEk5lvJNb4kE+6TfKV4TEH8pUEWTF5Mj4VOHLZWEMkm9UTHraubiu73Cj2VbM4T2brcpIPNkJ0MTyDmk2AystIsG56ls/hk2RmMklmJpNkZt7sjG0mKx8eaxcy0E2etkKqZEwSWHSfpZgRcjOnDs+kMpsI1is+dUM6jd91EKyVDA+ClcZ13i08xoA14s5bqm43iiAr4QKsi+u/AchXdb6HGb/qv76zeTx0v2NonWHoWvUt091GAct6/4etPK2zCT7IoOqfdKwDN3FZCjo8e93cM1Ycvc/o3Juv/jRGteYH1xE9izLofGr1OBCl9zKKGvuL5i5jVv079T1YMs1zqOEQXrPixRVk33E8kuynZs5SOGsWUy25aSLONyJpbQH081p+hYU/rbXMaD38pT2C9CpDMLkzX8Rr/AfJ2dz5LVnv9V2/cm3zs7DnQWqqN/U1GpzZqH5jXPWd5pxZUn351Db2Tms+re/U2eTg0rt3f2CMxjMPqPF+9TjnJ8m17j+RKdQx2oO9QnlqRJebZbI5tlOv27lzW4J6DvpOJlBDOyXWv2u6CJN0mSx9H9sIoK1ZdmkGtuaDrSC6yWw6mXHX+I1LsvocxqJO/d/Mv533j95f9BJMEhiFXUY4lwi/Ez2vysOJ+U4fmlzjJV0fpIPZtK959dm6utnUop5OP4JFzqa73XKrllbzlJ4al94uNqIG6GP90BSQfL3DTTO78YuOYCbHrjha/zTn6D9IffWm/n825rf2Tv1tvRf+g5xTval/mrP0Ybtgq+DSvTy/T3eS4SOhjTiOy/qLTKj+wtXE3uKLTGRRzzE43UvKKiCLUPey3j6Hi7CIoPv78F/J8FXvSPqr2ViMcGcu8KamCXrL00zW3/F37eynrXMop5ROZi7fuHbGNnsu/l80pzGIpcdsZuk5/53GsL4VDSzqCbgQ530Jshr8zTWEE3DsBRQ/NTGmsHMnarazYQZrnPeUP8x7dXDze1Zb3U7tDEZTw9LxOm+knkGdJzG62YnTxASkuxrXTN1uzCOna21JzeW/59Q366wv+ox7U2fdaU4t33PftLEvxsVZr7MRLi//IucoeK0V58y1iHSxUcMU8i61apNzG32jM1fcZmpZxlYZgqVetmrec9W9TIsp/UFrMG8FWNR1dbvpfQ5gGHEcDmFxVbopb5yAf1a0d23sYR1B70/uHKet8Vt7xtVDrHpTX7NHPsyrWnen/mmvHO2srfHW4hbOqyAnMT0m8Lrk1dQszSWrbyTHMr3qafEzoezSOLd8C9BPtmc1MZwbdKgudcUmvquKGlbCv9i8SKZ6E7/5P3iQ6/ltOSzHDm8DO36RiOeY+SRRguxWLTv14d8IxC69qzjPcwnzERGrDv5pjaHv1N/mKTSj2iA7jzhN7I2U1cynUJePkFw1kYs4LmZSQF3F/zNp6FC6S2cZW7qKuGwEh7uwW9ME5zfyjcSs8z0/SXfzdzKYYwyvejXTiVFFCN9PaBU89M6YXUZPY3/R3GVU179T/z+ap3Ivqve9uHH1jb4O5vIz4bjWnprKrZlCL4JFFb71CNap6Wr8BwlzJZb1nexG9K7xqWDoiuufxuw2QG5TtxstlyZn+bobWXJLO46q6jsJ0NN6Cv8m86xxFFyLWZfevvOMfaOx/2yc19rNj5mc5/W5CGXuGLXshPkIyeuTrHdjq9Tblmav7kH0v5OpLmoYS16xeqq79SSDKPNvulHiUkAXDczjPMUVx2GZ8EhpWp66v18Iuf8bgBN/xX3CM+l3CfMiLvFkxZNM+lTrX4bDigkZNv2fdAw1wpob59INLjV542x9o+dhM0PxZGZu1FVvJuTTxzIdScUrTrC6nMwHh9g2mutdzMrNjfr/wWhkTRgVdgdsqgY9S3efpAzP4AH2EdjF7TiTcF5ciRnIagLOdMvS+MGMXUxSnbyY9VC6nD/2j16bMOKTSSAba+IvtswMmnUxiSEsPIZBFueTJkP84uDNjiyeO0EWanIjfvWm/mUTz535wRjHvjD2JFnZ8OgFvSw8g7ku0lP9F8nN0IHNvJNuYqyEjSzMehCspFuy+BDJCiYPWrNNmPvCOeOT1N3U17hOglOysZJTP7gaZzbJhWd+Ms1MeNj8b8r435nBjQnpqMVJfTYWvnpZi/1im/FrcfLGmTHysmnFpcMzqNkEVQ/NjBi9GJ5JZTYRrISNBVmTBGO9kQjrDI5F8Rm2QU0ZvGXhMQaM1WVj5dKJbnwax7mIw4oXe6OhhGCdyczEZ+aN2fqiVdnqjfS2+kEi1Zv62xwyM2FhX5gQx5IfpCeJ+ySb85uza2A9OFZPeCbeI5P8pknzm5HDPga/MDxDHLCPgAVceqnuZ+DidnohKuRfRknMP6jIFc7byOxnhWenN5m1PPdJTn2RUIzfSK4hwicbUiepn5Ts5YRfU6W3jMJZ3m0/azZHYn/RHBaemQkLm8SFmJnMDHrir+C/mCydXEwyWc//JLNauTljB7Y5s/2LVNe/U38beB5u/w7i5pasrNYbvEnYTxv9UXVDnUwQrkXCCq/14qQ6mwhWUk1s81M3QvZO/bvdfIZOkpnJJJmZTJKZySSZmZ9GIpNkZjLhuZitN5ObbiX6L87OQ2baXRid8LCxcmr9ba3bPunETf0Xzf208HTA4rv7oaeTwkWGjlJHfRGnGlIz8z9IjWtVJfI01fJnxZk1SWYmk2Rm0l8Xd2ygGWnuQXLVMAnpILM4FzPk2MDel177Z7Rxw1Y/SKZ6E9+zKMuMwviTJAi6jGPBrA3PO80RzsX8ft57q9fssV+9bWZiKJsz6AQJu9j49yf2/vvTV6ZR/jfsN/Jvbswcak7DZaGGc/D8a6S4oSzjryH+l501D44qM5tZTDXzog7PovugYnw5oTQ+n6TAtRMzFdT/4B5CNhTlZHwQLL3L3nVWR3LS8/R/Mok5B71xhiAr25TheXKy9I0Zq9i/MTu+SQlLQTxxUztTVuNUl5Plb0be7NQXGUnDJJmZTPKfLTwzs+ohMjMD5kliMxOCrifDYwrkF8nNTpboqBP2Sdh/mmnzDyaG4mP8L7PQ/IMGJjPDhJdNBh32d6ZPo2ysmx7qkcwakG8k1viNM0No7Cj1ZiZDBDxp7LJZOfZpbPCCbdKsN9M9My+2atiNQTzy7PiEcFj4wS5dQfwvkhtsVU2CP9hieJYKsc4Nz2Csdx0D5v4kBc1P/q9fefny+mJ4+KrM3lhdNtYZ+qC5y3BYfsexY93UDxrA+C5kZ5mrQ+xGvw9aubdntrdj21XMav4biXkfv+PpUQ8y2zSwRJTOuuJEq8t1nvuK6XENBuvdrVGKGoOnZkzPuEiuZ30jc9cy2QluhNSdzJg7kWTdLaRquef+Hjj1xe30QjTJuzlbfXHXgNdLKbA9Cu+PdRZt3mb7VmsmOeJL81b4PX5t95KeY1rnOzuF9J3MZ9aKuL+MwmeGUlbPfGdrCXquRiN1Bt7vvOaTpMT8XXcK8TvpV2JUs3/qBtn6Zxs6e8EO7HUhmrc2htvak21yw4yBfRn6FO/2rcjYadbrb9Zl6+pmorNRZc9DeD2T5aX5rPAtbJzi9c7GTUBi7fuDq4p6hrBfH4Etd+3spe1I+rf5+Om1tOmeO/UHuYx152ykroBmnP2D3C9WXbSNWtaKo82p+am3Zz+M3uoP/qPdJmgud+qf9qtmxz3b/p9kjrnrbi/tZxvPNQePks/ineTCGcdFzz4aWfG75qf+ZEKtFWHWJ6lpfN3Fcw/ueBiTdzLrMPaFaZxZ5jgvP2kNZ1HTu9zJjKgfpKp6E9879DzuJrN50BvyznhxnRVruFNzf3J9frGms+7aWehz1jcaO60z3nvoJ953gNlnXNoYdmDhfX6TuZxzUJOLB13GbyQXzjBS6m8L1Z5rToZZ8rjTGnR7YXOwtTt3wFMHf2l2zqn+yX3X844lfz5Oeo7+JhMZRw9nhHi1/n+23es8e5jBQJZxrPpOfq+Mef+LxrZ1Bv5PMssc5627qpcdxHKzpQ+qzW9yrl7+IrnmJfP8/Qt3Lav5PDc97zB3aaebv1P/08LNDs5oBi6978rMl2Ze9Sb+gfVOzPhkJ9K+SY1eOKNEk/QLO946L9w/qJTGtnmOMXqb+0Zjv8yZ5i4yt/pG5/80/yxQa39r1Mv6Lp2Fhqd+0s/M/J3M4736GTL3f5KaYJ27qa+d8YO7Hc1xzp2eYw6mtIoa7ntpcof6IjXVkFmZ1bufAAAQAElEQVTX7xsxI0/Nu1BzMDsXmV8teff6iwc1uWtmxthPMt8cd/PcvNNZxi5yTvWN5jzjIrnqX+SPZvPQs0Gg1fK8b9/FIDnL+xlSWxIvq9lYloE1AqeajcVIptFjUhBwpFXc+rjM4MFmj8Rl4RE4rKKZ5Rh6mYIgtbS+1Zu4rIonq4wfeI75X+QcyzDPAlfg/AzWBQhbwOjqiziNQ5v1v9Lg/7I9Y9+cE3fDjnc2/kXT6hvNGdrsqGprmIivZxrVV3nQJE2rzM9O72Qr3yoq6YCUsjpTGpSetcgcHD/XFbtrfBqagw6hFBh39qYu5jL/Jz2EAmeCznqRec3fSdaYg6HwKkR98eJDr+jOt4PInfo/zLADH/zRTtjShykevQju7WXWO6OtwXhLJ9TTeWmVHV9IO6vJxd3FGZfG54NlEcH33NOcWB/nxY6jftMc5mIC91vxpY2o7/QOash5zV7cXaaZtMM9C/nJVe7uGEpoZG2xNHv1V9raBpyTuOc6Qz9JgtWLXcTx4hjfAOS7gflmnkCcFfMPJobiY/xhCFb4DiMrMneNmGkgM9KSN2bri+mzotnRTWY0/saZWXXyYfRVbyaZWbUzJ4klxLHkjbsm32jsZXSGkWlkwjNRJ28cIhjhNI9/MQryXzlEJ+l+Mjz6oPFF96BduT+v0hXtwbh36v8ySmMOzuxhmzNbk3Od6snJmGQv6Rn8/GRIDZtr01pdLBgyp4Wn/sVZudyofzMyN5Xtb843EiMenp6FL2nMjCJvnK1hxiT7yST0oF5MUp38ZPYzsys3Z9TYnfqX0Vh/E+TSCox29uSNlt2DKz2UTdL9CwkNubXGMt0nCRvsfPwHSahn08aZqsxMknn9Qk+ytdQOtNxGASuU5jun8VYf7BTOEMOCzSx/ZkyG/QsJ+cV9DvJH/GLPz643Aat937gTjiedk7nizNNndkzWp/IXScWc2y+a+2nXACoYwDKCcMWtITYWeuK13H5zdh3MZGaSTGYmPjNvJGhEw4182Wy9Se9QNDMrXuLfqT/JzGBvTFYs+WCGGBtt7orF5I2z9RdOeCbOSE7iTfo0jv+igpSBut0MhPbEzdzF8FDDHmPxedfGtp0pZN3OUszq/qJnJsFmpO6NCSl0cmP6WK6zssnifKVRLTTJme5tqje6YxrbzOaQ+2VnzRcSYs1lTMFf+8RnqsM+8ZlwLZ0/OInLwouTmSE+F3GWDo85YGw2hbr8c2sHFZu3WQmx6juTGGvILXnXpmMKC0/1xcnSN2bMsn9jdnyTkjEyd41fval/2cTzZjYjsZ90hvkbrU3YnxYexq74IFgzy5m5czIzZhfxZ9AYKwRdi+EhSDZhY30yr2csqpzuqdbfxqzGLoaHHCvWyv9oHXH2wJdeA2Y2yTl7yuWF56URrMEs+ZuTNfZO/WUmZ5Y/A5k5885kkhBOmXzh7NgbaTIyMwkVM+OemUkyETOLClzDuovhmXzq8BhPN/Ybq9A3Bl8zKtNn0vP0xw37IAFWC78xBDvkkzPEGBlrksycOn1O9Un+nYOK/jsMyU82GVJx61jEnfozBJMIPRkeeeqJv9J9kkWOn2P8y32YxFaGgkn0GTJlVZBZ+oDYpE/j+JJEZgYLNmyub5z4K9bGpwrnF5PJemjZzsYZ2JyhkpUHCVRL+upvgtY+qMAoZ39bZ3Ayzaw9qHrMHvxc3Jm5kVzUF5Olkw8SsMzEnXOP61/WStQPjnHsJyeeM/ONxIKZgymdRSw8W5/xi6Yw17hhF+lBUroiM3fOjt9JtTWzqEtRsnV89H/yW9LYDzPscDib2bz0JDu0eOpyct6xjHqSn2wmPkPNycHRQKP6mkI6e3EMZeZG/Z+WVTubydLJjfjhsWYhuHiByxu88MjgX+Tc6ovhITvAOontdD64yhJqtFlbsrn0JNWb+peFxzho7E78XynirMQL6UBW9QwBbGbyf37X1P9Betqlj/D4HVDg/3jdWvdpJFjP7zDSw3cXWYwlqYOds5+0hJq2bPYA4pIQS6GC3Ilaz1txNLOXJoLv/NMaf8QcYc8ms1r7ILlquWs5nTHuTyNIBcd0/0JmWNOrUXMjxa7LGIxvweqp7kbfXyRnBV14XJydKThE67yzKTY6uBvlOhihapr+K2nh0u6APj17oZ8ruNbKcpdGNqmt9xfJMZzFBFc1172xLjnf5fQlVfR1v9ETMQrYafljZ2azf9HcZVTXv1O/Qe6w/H425/mbJLkLH071jbqYi5RYdXid88F1Rt/aBqx1N3qWRogy79YhbCyDhNYhOCyKurptbVl1CzlTEtTr7K+aDmqaWpulBFnOxUwb/Ep6fBfPkHRRWlVWW6MxgHF6LyPAotZK7Ky5kwJnE7r+xt/SnEPwT78fH3WcGH7SXs8e4g2xMX7vnI+3UkbR1LLHM36SmuZLuj9obNmq02d+VzcDjt8k5j2Ys4Jbf4uZatxKBIshCqOQNzbGLNYPTQHJdTfrb5opjV90BHkOWXG0/jY+KCqJOc/YV64z2Clnt+bD9gyO8hzSq7YzyV20X/0HuRFZO/YMlAONf9Ay83cyn3tQ3v4/uZLsNDCbSfdm4szdOwkFRi179c1doR3oLCKQS1DK5JtvzM/pk5Yyw2V9RyAeRLBWmrn4dO1b3jV9FBnxLNnzqHxpOq1pKRVfac1pbzW3WefMD1pzGXPqb3qeGjYCWV5zvdXtbpQRJ9vYf6RTrP+L5rZ59+UyH2dpfGZ4Py5gFJfYutDyzddMk3P90IbPVprXSAKNlzTfid86SRG/A0h36rq6kd20pm63zie0SZ9hAixi6ps5hQSRlfvQHm32Rmt8bc3ZD77VOnsbB7DIv2mCLAeZW8Mo8UBO2hooqCLuwutiI0cn+45TuDT7GkTCum+aNmuaZmPRTr3xb0YBiwu7VoH9NL3/2Tk1p7Zu0dEO2MRlKZhg2a5i5oqjddQXcapf9CzNS8nLOpIZD/Y4Szlz5+oRd+6j1jzW+A+au2zP6NWsVy/jCNYZs4A4kbXumpoGN/H1Ws05T3JZ87SvOBp/l/GOCmOLfi6UU7o0BdtXYyZfzTauPPH2EiGw9tbV7Wa38/4n7cM67z/SWs2DaOE23KIH/fNINJ8Qmh2fHDuy+4rtneZ6/9j1JVX/8Jm0ZuGz8K1hFoM8+2XGztxB3dKMYRnH8EzUY5hcum9gFqfRJzmLgKUCroBnGygJLdLPbIpYDV7E8VJFN9JSSGe9WEW9bAXOJxvxPG8POZ0edzKXNqT+i2s8LRatayBYTfTdOOPOntKCemaX9Shif7LHUC93LbNYnK3+w+jyHlSsWm9II8d9aAJUc4Y1mMveTzKNGVY2j/+bdDf/g4R76CaTHYvihqwldH4Ys1tzkVYHUn7NMqfeNK0p+87kniRAsu9E4d/0dOo5tudtGtFodzm+1DHuzIv7rMb+p895rdn0PPWD5KrlupX7dR438axm20sWftdr0Epbp6ayw76Q2V02UENHi/6kDdtso6GrGzNe9GwCLD/H1YJgqdvrtq3viH/n//FNQKbwHUH2ZHLpCc9sXZeNNe9GgNVCGTZWHjSAreGJuSQzxOKzOBnF3rNIiFWxODt+o3OwRiQWbGZW350JqckkmXGXWILGkhh92Wx9p/42ZtS7aD+RudGc+iI5tIMJ5bQQm7WxD0UuOVtvVk1ShmfwAPuIO1cgnmHqZK44DismLuJUw2CnL+9DLm0Qo5T9f6yzaJycdMaUk/lCQ8a/MX06Au87Jyt+Y/C3ZfMzsjMjsb9o7rKJ581sRmIwxoK/mZLZIRafkyGSPtM9L70DG5lZ3syds+Ob5GaGIUM86TaJFOmWfOefyaRN1mzzHGNwyvBMlruor6FWXAej5aYn1fnGSRrfxK8ulxeeufRRb4jpSGcvjqHM3DipDs/M1J/5wbOGr76UxJ+Gf/z3BK3BXEyhJtjEZ/AedAixmSE8mZlNkMmS78yOw/DMyyYTV7e63RKDuKX+L7tqwoNg4aTl4fnQBFjhoqzI3DVipoHMSEvemHedPiuand1kRuNvnJlVV+JfpE9/fjAJ6ZDOd04mwQb7RXOTULFmTOSpPzhEsGCte1BhfrNF6AcHNQQHhmcw13xoow+brS5upxchJ/+0syaZefbOnDp93mRWdv7gJDRN5kbc6hupaegiudUSnx3O4nwhsWAUsOvdLNv/wTGOwfAwgvpEhmdm6s9M4ionM4Oe+Cv4LyZLJxfTbHzGDXsnoa6ZZ2ZGjf0kbeYoyTeSjrkvtDy35CpzXzbNuU+CP9hao8Q9mSBci4QVotTBeh4bKzODhUdiwYhlE5UZ90YyCTaY/MNm5+bkrJ5zltyWzRlqsKWTB8MzCavbVybkm/nB2XHoOahsFhkHJLAaiav832ah9Q8awL4OCw+57ou4XVVsrLzGjS76xknCbNYmAcQMzGRmkkxmJj4z70yM7PDyk815kqJJMjOZJDOT/vrJXTN36m9LQmtI47gmS48iw6/wPKmaHX2jkh5n5CJe45v4zZduSQzobp6aBItEMHPheac5wrmY38+tl4nJN20Mm6ECm5GWfmFyG3HE/zHrvy+9+H+hi/g8qBqiITo3w2URmZ2R/u3ApHG29DrGv1lC/sj4a/BvxGVNZrAMyXHHFgngh+ddZ8fhpA8jNldg5kbcmW6ZeaNdxjbJhqL0IV5dwfYQ6K4z+IPMSMhdDI86RBdjTvdikur0MayzOPlghvSwzxdmxzcpGSNz1/jV3zjxvJk79bflnc4glmRmM+8kl/UMOA03M6q8cbbepGZmLCKeuCm/MjyWgtyoXJrgKS4a+2GGVyPVCBZODMVH/aeRZIULs+hA1BlCUz1zZzL8Cs8nCbIGc5VsrNiyOLroG5k/g8aCzSx/BiaE3kksIY4ln0wyybZ5sjOJQStm8KmYmaTsnspMyiGGBfvQ4TEOml8b+woOXrDfDM9grknnL9c9maznIg4rFv4kieZhMH04M/43AMNzYC7I8osx/3uWAIKF09B3UsDyO47PHoKsNvJdxxed0gQti80R7ndFSzbWM7urmNX4XyTHcBaVrmr6pXMh4ZWvJnen/mXrVu7t4SVPUlK1cjsqjP5Fclyhh36Q3rUssuQLLdhGlmus3WoE610TOtd7qhcgeac1auk59RGSUj44d44jprdhqfJvexXXO2fS7Ofo7Cc5htxadLjsKddJSr3vZBq1nXKSYqKOvLyl3VvZnMqZtkmKvd7KGSRg/DQkeRKuBtcsgvQ0+IXtIn6nfeoXl/qiPcfkV64zPf9lFFtLqjHkPvw13Nw9rn/Ze1L93fz81mzyXd3WpNOVmHVe64MEGn9wNfQnGcYxL9/zmP7kUquDJOv0SzZWPwrpf9uPHyL3b/5RSpx+LtCzLvKz5cP/9g70bHx7KVZ5lScZ1PxXrgynkLVV/bKe6zRDv2juNKecvjz1RYIsT3JcWcfgN7saccizcFabzh+6KT6zNZ43b3iS8gAAEABJREFUXAE+Jh21ZJQ1zFrvim4DPOPkXKuauAJ7auYRY3i7ndU8M8wsjUewvqSSNC23ODMag6Rd5PeZ7TGxNS6d7GqSeEu7qyVBpqhaVYf4g2SqN/W3eVfaV8KY4oMGMC/ucdb8ySa/b+eMv2juMsbU94rcAdkPDPbu8LyOZTe5w3wWBlGr+03TtCLuVHR1Wx11u720cpujGUHO+2F4S1vwQ1uDrWwnVH3VjGnFT5JweSiF/UzQ/Yygb1XfE6ghxDHdXzRH739bu/fsYWb7HqSmWpLVx+093kn6HPVO27ikFVjfpGRjvfTy3B1ux424LINrPIL11AawnsfG4qrMI2ZhNd39bDfJrpp9E0sbq7YLh7XiT02YKe7EHY67Zr9rJprHmi9bzNmbwGGec6fhS1ecWysRd+r/MMPXIASLZi7afdHYL/vopZD3aONJay5zLjWAt2d/rUbZWA2WbKw1zigzl97daswPrJ8h5zxJq3l6V1yNVbOxnPfb1jlrp49Z+msW3od2oHHYu0CGU0ZzVzdCP9iMnTRaon4Zk4nfNZJqd6vvbmOW6typfxkOy89v9SKuy+K3942rkMyO4/2X1erOphq+NF71Jr5H9DNuyI23M75a2dVFr6630n5C1DNAL/53++r771pWSc0sdV36aZUzVNLB/KsZExL/nY5SQ5fRwCLa5b/PtTMEWQ1unnHpHf4XrVnWe+gyrtjsJc6AsbNQ3u2s+YvmNOfIh53BH/Qs3nLdhxrW/gCIIljNwdfvJwdUQ1ZHXOSzIeeMFUeTq75ogXH5zFhyZiSXcJ1X+EKqGOPdPO9OG8nS052DJCdQSMtLU1h9kRRlrhW/6xXZkzq7dcx8kZpqqnApWgOMves2uWHmANdwXz1PQfxbkbHTKLn3GH4LKe8l9a2rsbG8s9ftJdQU+dmqn2xkj2yhlVsX6BspYTVQcsg3esYVt+Y0Os/ci97BxCKl60wGsOpLKvCXx++McmuVcWiz0YuWGb+R0qYJlWhaerhufXKSzsa7vSct+LDdKJqr89o6A/mTJFj+/rXdC97NoBr6+f1f+E7gw/gGYfWDScvC0/hiXb6L2BxkJWysFzOZmSSTmUkymZkkk5mJz2QE+8lK9BfSY9XMrPzmzNIz8GHJjLEfTMhjyQ/Sm8R9kgfDMzsio89ZT4aH7IDmIf4uyydNhvhmvpFY4+Oe7P0383pmuxe304uQk4YeJICegZRkc+a7fgtnV23OkxSPM4kOlurJi7iZEA67IjN4gwtT6m9LssOb88kkRLPq6uXcJ9n+JoExMuGZrJ6U4ame3LRCfeeQH4MZfoWmF5Olk4tpNrmY65nLW87MjnwlOeMPo6/6BwlzrHssW073rSdTOTcOkUHPJwkNmbUmX0m48Rs9W7NBzkxYSST2k60gK0+z/vTfOEvHhy+cM7N6oaEZdA01CW63mSXYlw4PsadOqpNFBCs+Ly5vVgX7kH7ZzPYFmQyXfKexX8YX+tVDnzXvveofto6kr/mDu+Eww7/l6Mz/xqQ/4WfYi0mq06eviLfIOea496X1/6eFkc9e7+cMxuVBAi+9e3yvxtXLznf03s469ZPhoZ7df8gzot5Pco4FznyR/sY39bd5T8+LAxuj605kcz95mMHu1D9oO3Z8cb0jIT5rkizinHvGLxIjmXW3PEnvih8rXn2kn433/tCJc9dI6940CRY1xjEEK56xeOSDnOPn+9WSNB4e68Smn3NnGcOC8G7LPQShN9L7+92OeM/OZdaqY4w9arjyxpb1PHN8TvlFcz+NOc1tfp1Bjjgr3q3nXHd5u3PjR+v83NY7oDljaVLUhOfS5JCMtS4wfXoeOel7Ss+X9r54ZOlN5leXWTmKG0tuGj9BY8mmM/A91x6ZxPPDI0/ru5F/kJ7qr0zO378XD4Is7hp6nP1JajyHmub1NXT6mNc5qf/Dzp6/aA7z8/LzPq3aseSKi6qk75SE14jP4rH1Nx5x9vlOJTOfpIR3dfaKoxlc/Y232tZ808Z+GvObC8+RNSNleD71kfQeMEk/I98B67u9k9mNX0yWTi7m9TD6JfD6GUD/jBXO1ym5wzcau4zi+nfqh7tnPftQ37XnVB87D707tu6ifrSl5YRKhnySSOOb+ttsnpmwsGFK4M2SpZMfnEyCDebdpLZjDFZdNmc8PBPS/jZkUF06mHGDM4pkZjM8fJ6TyVpycAc9i91n6/AMEcA+4maOrdyJl74FdM+E/MscZv5BBeYccK4l157rboMXnk1m1fvJZGbYWBeTGMI+SGCVTaSFElVd5r63gsgPjnHsJyedz8bCf+mMfZOZZTjBM3hjEvPhOamLucYNe3F5kyGazHwjscaHfNJtkq8MjzmQryTIismT8anAkcvGGiLZrJ7wsHV1W9nlRrGvmsV5MluXk3ywEaKL4RnUbAJUXkaCddOzfA6fJDOTSTIzmSQz82ZnbDNZ+fBYu5CBbvK0FVKF1J2z9WRmEtXF8Ewqs4lgveJTN6TT+F0HwVrJ8CBYaVzn3cJjDFgj7ryl6najCLISLsB6IxmCM598/TcAr+8KhufoPyfcdlh3286RYBFTL/M7in7n8UH+wVL9k4wgx6HszlGjlovo91Cf5GBnaud5+t/NVmY4r31v2qPMXdy13qZxtP5pztD/i+YuezvPmdsYw/WZX+22agmy1ORWEfsvzcVXFod6yphCP9J4NRHu04g0tuln1uJqEn+wtWuIO23U69kDz/yW5BvkFu+kjyJu68XIv2lyNndeU1RuUkzqrl9+2yj4JDWNb+prFHpGo/qNcaV3mtvnt/7yqX3kTs3Exp/k4k4GxPFw3IH69hkR5QgDzeH8zX0WRSw6/9RMI88RXpb6pybY5WaZbC3bqddt3fdZ5Bxk5JNMsLGlbu+aLsLtu/H8nKkmZc2yS3Nmaz7YCqPLmEknM4xj3IUQ2mjSv/HXH/6iSXSmNZfx02Z+jPwZtx7rx/edXIC1c3hr3XR7OZyfUR+cwW241xdN7uA+JIOLMYOygx9rLx1ip73l6GtNSe4bjZ3mTH3of0fn1ZucmlTPWzzyb9/lNw/qD+qOT3KWvwe+3yLnMJi16vk9qX8SwWruxWPrTRLO+m+2z+MdVr36Zr0f+kHOqd7UP82z9eH5Tn5uzl46+zO4M9w/xAOPLzx2/As5yz8HnnGnZy2d1Ofze9FYwhUfuZc+Gu9M5v8/kT/Tq975zKmOf/TXeXg956Tz9bd5R/4vjtrD/6tY9zB31smHZdXyfp7r7Kcx5557n/VNG9N6DvPr/8HOD1V53IX2rb3Dsd6FYN/xF/m8mv+L5Pjjep3H8Z0t/Qw4aeuj5zvvm7WWppVbd+dau+fUzkjn+bkenPpJo8fqM48dmL+Pzn4y/X11xoqjObT64rfYwfwzrr/Nc9r3ps+4n5X5O82p5Xvumzb2xfput/jSeX1W5jin8YsH+fQzIL1I7vosuBMVO37wzkcj/b3CO+lMM35u9ffv47v+K9daZrYGnrM/SK5nSc553PWhw7sd3P2N1HhGz+OlnX/aitPzFj/z/jmv72dkzQfpNcbdftdS095Nfc0e+bD0M/euPZe7L9+45oxF2njXrZl16r5TNTmJ9TOTFB0PBnVw5o3UeCYgfvCZ5oOe8cpb82nenyj93dcMPqv2wpVnNj6vybuktb0r/+B/Ea96E//A/mHvzI4Z18IlJcD1FM+4mW9PuDf8IFEa2a1adupy3efg5j2jPHoO6Rv3efwB8Z+J5v6xrc/4rC9vZ1hMzAi1egxUXVbNnZmu20+RUkikcYnj2olDYv+v7AH2OR0KY4zmkKrNRgj0xsTUGD2NfCOxzvpKR9h/Z8fbYvBJPx3meFbf8U03buy0jib6F81dtms9ozH1/4N5rr0XfQX6faXG0fqYy3fgGN7RnRw17FvTp8asI8ii7qGZUv2DhLkKy75OdiN61/hUMHzF9U9jdhsgt6nbjZZLk7N83ZEsuaUdR1X1nQToaT2Ff5N51jgKrsWsS2/feca+0dh/Ns5r7ebHTM7z+lyEMneMWnbCfITk9UnWu7FV6m1Ls1f3IPrfyVQXNYwlr1g91d16kkGU+TfdKHEpoIsG5nGe4orjsEx4pDQtT93fL8R/4eu/Acg3Bz3KbxLK3LX+ZTisWCjDpv+TTqNGWHPjXLrBpSZvnK1v9DxsZiiezMyNuurNhHz6WKYjqXjFCVaXk/ngENtGc72LWbm5Uf8/GI2sCaPC7oBN1aBn6e6TlOEZPMA+Aru4HWcSzosrMQNZTcCZblkaP5ixi0mqkxezHkqX88f+0WsTRnwyCWRjTfzFlplBsy4mMYSFxzDI4nzSZIhfHLzZkcVzJ8hCTW7Er97Uv2ziuTM/GOPYF8aeJCsbHr2gl4VnMNdFeqr/IrkZOrCZd9JNjJWwkYVZD4KVdEsWHyJZweRBa7YJc184Z3ySupv6GtdJcEo2VnLqB1fjzCa58MxPHs0MNTrSVhmcMuxHMjPYO88Y8YQ8OvnNJJOEUSmTMjyD50/WB98v6PKhbbIGHodZqt5J3vZDWnI3E+qLCFbOWhkfg9/szG1aYs+D5Kq/kQQr3D9vNBSDdSYzE5+ZN2bri1ZlqzfS2+oHiVRv6m9zyMyEhX1hQhxLfpCeJO6TbM5vzq6B9eBYPeGZeI9M8psmzW9GDvsY/MLwDHHAPgIWcOmlvu9nxZ36P+xwCrkHiaGJ8ocX33XX+P5LypTTv5ER/oxXe0f8pYfOIT83Zusb6QmPVaBKXwtnSGfLMFvOnfoanY3rX5aeN84xlqCx5DcTJqXvPniDOxCw6y2LiplPhoc856X5rDlqzHvkL9JjPptMon+S6mGfhP1l4TEGGpc346yqi7u29yYjzcF1N/L4wQaTp1XT8kmCrHGOxFxMEvtWs8jM2dGyevi9wKz40Fk5Zo+50tgPY8ZYU1Lzjca+WKtvvacOjzMBd2G3BsNDD78/+R+cnYec6+c54fF9gFrIxivW9q6taYbenzT30+hqbhPkehcF9tDD3Ylx7/UZoJXqi4M3K0KvnjN/kprmb3S2Fu4m56RTqXPWXKziXjJWYNCeBP8tnhDb1hn4F3ctveEZOOZgLlJTLSnCtyYS+cn0vNif9cwC8eUNnqGTOTUz618Mz/TPWKxhZsw9mJVv7M0/e07e/kE1xtTbZiaGsjnjv9kkao8sw0OZ/5OX34DI/q1KvMVkdQ0Mz52TMHPy+oXLQg8pvLUmlIU9JR+2s5dP3dwswy80FzSPxzKGEWAnv3YcF6YOz6L7oGJmOaE1Pp+kwLUTMxXU/+AeQjYU5WR8ECy9y951Vkdy0vP0fzKJOQe9cYYgK9uU4XlysvSNGavYvzE7vkkJS0E8cVM7U1bjVJeT5W9G3uzUFxlJwySZmUzyny08M7PqITIzA+ZJYjMTgq4nw2MK5BfJzU6W6KgT9knYf5pp8w8mhuJj/C+z0PyDBiYzw4SXTQYd9nemTwkYkvYAABAASURBVKNsrJse6pHMGpBvJNb4jTNDaOwo9WYmQwQ8aeyyWTn2aWzwgm3SrDfTPTMvtmrYjUE88uz4hHBY+MEuXUH8L5IbbFVNgj/YYniWCrHODc9grHcdA+b+JAXNQ2a05wtnJv/H1+H0nwb+wwBvaZy71r8Mh+V3HFctgvWagTgwkyWz9MUb/YdBw3uzS/dBZlT/RXLeZ33Hk5tUbzJQCSwRpTOvONHqct3KfcX0mMXd9e7WKEWNwVMzpmdcJNezvpG5a5nsBDdC6k5mzJ1Isu4WUrXcc38PnPridnohmuTdnK2+uGvA66UU2B6F98c6izZvs32rNZMc8aV5K/wev7Z7Sc8xrfOdnUL6TuYza0XcX0bhM0Mpq2e+s7UEPVejkToD73de80lSYv6uO4X4nfQrMarZP3WDbP0zDp29YAf2uhDNWxvDbe3JNrlhxsC+DH2Kd/tWZOw06/U367J1dTPR2aiy5yG8nsny0nxW+BY2TvF6Z+MmILH2faV5u5dZ0i42VoPrJ791+Wh2PYeZP66fYKOu2Kqh2HE0vmkuQzXxLpQ0Yh0/SSaiBxiBR+pwtuQy+v4NsXYRk/sg6umitvqisW2guQ8yiNVZ5vjp+PK9z90sUv+gZ3rAT9Jrjs+tl73R94rnGoNH6fvTw8xLk4v6onehjtiK3zU/9W98k5lW5kFy1ZzD3Tzn+EVmNSetuTHVzDJ23Y2ZH9oa49K73siM0OsZL3Ljxjfxmy+ZA8P9Aw96pb0vUtO4XOeFO8XYV1qzjZlpzan3DM8z/o3GTvtas2b1HZp/08awAwt3/E3uwjkHNbl40GX8RnLhPYyU+ttCtfcwJ8MsedxpDbq9sDnY2p074KmDvzQ751T/5L7receSPw8nPUd/k4mMo4czQrxa//+v7XvlJ/liYK6/RWysx1Gkq3/ShpVcnvuy97svzevtgdWUsgyuKIL11AYwr2miZGNxMFNw2HlFipiyfn+JEKfACNbOTf1Pay0jWMxSUXPOePCcvUnOM22y95PMcRxJll7v4XbqBtmYyO46M/JmnNVphq4BCNYV1/9l76O/zTD20z4GGKh5ZNtUCNZ1JeNL84Y6vAeLvJoAop8hvf+T1LjoEo6+zIBxpu6YHsegGvccfdgoQSsqGyeKYOn4WwlZ1JF2Ibq6GTb4Yj1Cd/YEriYBWXcHnFWXXgFTZ+iNFLB6sW909ro8MyygvfpGa5AUdP972zPOHv79pC7sWNi7wP6++aULf305o9dl4UkOU4K2SctJZ/GwlSP+wUbx7zyqzx3BQlHC3leSnvEiYfLsnEkU3zyNrK3xOLD55VrUDq5IjUGaiG4NiH3X9pmHqwDn1DvALCP9zAypL+JUw1Xkzox3vcJ/77uHu666N+055i5aRQ2LA7v4UMrXXakh3xZdfNAyC1ecz6xxaJIzKks947IdbxWVVEJKWJ0tDUrPWGQOjndbsbvGp6E56BBKgXFnb+piLvN/0kMocCborBeZ1/ydZI05GAqvQtQXLz70iu58O4jcqf/DDDvwwR/thC19mOLRi+DeXma9M9oajLd0Qj2dl1bZ8YW0s5pc3F2ccWl8PlgWEXzPPc2J9XFe7DjqN81hLiZwvxVf2oj6Tu+ghpzX7MXdZZpJO9yzkJ9c5e6OoYRG1hZLs1d/pa1twDmJe64z9JMkWL3YRRwvrjnnB/08/y/9JiEbK4oy0Y2P+mEIVvjuISsyd42YaSAz0pI3ZuuL6bOi2dFNZjT+xplZdfJh9FVvJplZtTMniSXEseSNuybfaOxldIaRaWTCM1EnbxwiGOE0j38xCvJfOUQn6X4yPPqg8UX3oF25P6/SFe3BuHfq/zJKYw7O7GGbM1uTc53qycmYZC/pGfz8ZEgNm2vTWl0sGDKnhaf+xVm53Kj/07IzCR1Zs/Bmx0t8GJ7m8WVKt2TmztkaZkyyn0xCLerFJNXJT2Y/M7tyc0aN3al/GY31N0EurcBoZ0/eaNk9uNJD2STdv5DQkFtrLNN9krDBzsd/kIR6Nm2cqcrMJJnXL/QkWx9Q/80oYIXS9TU4yakX56aZQeEMMSzYzPJnhsbJhAf/yRA/2I5FvtCb79ddftL8IBXpYwUOs9izcTFX+kh9fqr9orEfxtn+pD0+9lxkICtrSPKT4WkhFZBFIAjXF056dzYW+W96dhxmMjNJJjMTn5k3EjSi4Ua+bLbepHcompkVL/Hv1J9kZrA3JiuWfDBDjI02d8Vi8sbZ+gsnPBNnJCfxJn0ax39RQcpA3W4GQnviZu5ieKhhj7H4vGtj284Usm5nKWZ1f9Ezk2AzUvfGhBQ6uTF9LNdZ2WRxvtKoFprkTPc21RvdMY1tZnPI/bKz5gsJseYypuCvfeIz1WGf+Ey4ls4fnMRl4cXJzBCfizhLh8ccMDabQl3+v2wdQMNP+nXD/LHG+zXCWthrlEf8GuLfovGL5pOkqAnPiie2h+c7j53fpNc6e2XP4WvW0tSYf1jSHMVlgsaSH3QGuc7cTOLfMnq3890a58ylw7NmvHTSzyZZ7F2SlMeTnNt4eeAe5I8nzW1jRDyHjXVgb2sVhAHp03vi3an/H8zPj874mYfnpRGs6x3xXevoYx9950H6IH7EWX5+v0lJ73an/jKGxHMv43Op/+ARz/C+pbkPY15jb+QlWHFmeORTM5uAs3PR2JHHO/UdDkqOZzw85GjNqk+faryTuF3evw53lT1Xnxn9c/BBqow56BtJcyn3vNN37cz4HHnpg8CRdZd3Zsc3afLoPEikehO/+dK+ySQY+yGxzb5q4kdFHrJT1V0aSZ+ldPUu44yx+mJUQWbF1dikT+N8bv2cy8mKTdLFluDyadRlo2CIpOTiqUp+0kz60FJSWs5Mmc0ZNKv6Ik7jkvL6m6C1Dyowytnf1hmcTDNrD6oeswc/F3dmbiQX9cVk6eSDBCwzcefc4/qXtRL1g2Mc+8mJ58x8I7Fg5mBKZxELz9Zn/KIpzDVu2EV6kJSuyMyds+N3Um3NLOpSlGwdH/2f/JY09sMMOxzOZjYvPckOLZ66nJx3LKOe5Cebic9Qc3JwNNCovqaQzl4cQ5m5Uf+nZdXOZrJ0ciN+eKxZCC5e4PIGLzyL7rMU54bczGQxPJMZkEk5+c3wkM+20Rlim1MOAewcZuwyUvW/kRht7PlW0pQzdSCLusnMvJjJzCSZzEx8Zl78v/6PU78q+3XupP5lOKzndxgZQyOLf76Q1MH8jiIBSokxa2ki5OjYcTS5akkpy6AK8l3ZJm+0H2tE3oyhLDJXzBHqTWZ5D894kVzjctdyOiPcn0aQinWGmQ/NDGMc0Pk30uS6jHZ8C1ZPdbeeYBBl/k03Srzk4ncaVj9ITbUjcVgcjDCO4L5L/wefltZC3w8whz6cS+O7dpTbLFXNWb6NM36SmuZLx9Ppuum6xBx++pJqWwkznTw7uvuLK/t9v3o6iZ4vtOYyZte/U79B+pffz4YLolaM03HcOcAon1HzkEU3e1OL3dUr03nEFumnlywjyeM3fiMJ0ta1CX8TrBwOrU38ION2kQXM8vYE9ZzxnUykpqVrs5Qga43Zmu7qN9LjuxClrgXlQ1ujcU7j/Ch3V1LLOd6aAAttReLfsLs0Ts+4+G/VOe9/WWevmdl/Y6ezjPPTcH1/su1/Y4aQtwTWc5iK+dwmB70vkm98E//AKHLFTfliRxJnmehotq5uqwCXCpYOZi13ILDy+u8xypqH3KYuxSUhSFSHPtYPTQHJ1zvcNGc2ftER5DlkxdH62/rO+s77Se+E7ZnO+TTmOoOjVm7rzsS/yBxrOsv4F20Oa9aZ+M489ZNrMGWE1yzKfS00y4Tn/eIuptNiVIsdujUuUXcCC3dNeYMXt8N59WAvA/sO8F2f8UVOac0mwxt/EMGyjKp9m76B0ZvmBhSZcYb0bPnSTLCmpWS+0prT3mo47Zz1k9Zcxpz6m56nho1AltfkXYjc7kYZcbKN/Uc6xfq/aG6b77Bc5uMsjc8MbsPCXxcxu7S5ywxT42rsUxu+RuBUP0hz9SY+B7GjKeZ3AOmuxiWz1tbW1O3GZ0aNbo2+DxrbxiDfGUVf9zc6y/iN9viamrMffKvt3YhBBrOW75kIlgNWDOHyoBeZraCKeFc3Ol6kpvqiyg7oudzXGTb03Ie2iVpWa0pjv4wClrUd/ZjVBMcsnmdxiw5bJG3Pjuha/eKuYviKo3XUF3GqX/Qsbd3Lnm2eY+2D3gGznYNB9/KjljlmG8f/RmOXOde6O/W9AOwsSD0ui1O7um1NP17fRWJG6CJEndr+krnvpGSnVz0ax3aAYOFULxKwQWNWY1/Yz9fjzMGXRrCYwsx1U2d81/67kf9i81/JPP7dxrMOyAGMJsYdjn1f0QgHGqtmY61anMZ3DyfHf59a7E6dZMrXGZzauPxVYwH5fcZxHOEQFaAHj0Pc+aTWWUHRhTYP1CtgqQG4At7fQElokT7ejSJWgxdxGG+ertYsUtU46sYqtGwFzicbcRb3dD7T6XEnQ1xvpdSmfnGNp8UiR73IgL7bG519xc2d1iPI/smOp0PuWg5ncbb6D6PLc6lYtV6dRo770ASo5gxrMJe9n2QaM6xsHv836W7+Bwn30E0mOxbFDVlL6PwwZrfmIq0OpPyaZU69aVpT9p3JPUmAZN+Jwr/p6dRzbM/bNKLR7nJ8qWPcmRf3WY39T5/zWrPpeeoHyVXLdSv36zxu4lnNtpcs/K7XoJW2Tk1lh30hs7tsoIaOFv1JG7bZRkNXN2a86NkEWH6OqwXBUrfXbVvfEf9BmqovMp0aJjPiyP5vACLXNwUT+TAEK37XUIaN1cKLOpg18cEHM4uxJ2Ffeu3qhKDrxtn6RudgjUgs2MysvjsTUpNJMuMusQSNJTH6stn6Tv1tzKh30X4ic6M59UVyaAcTymkhNmtjH4pccrberJqkDM/gAfYRd65APMPUyVxxHFZMXMSphsFOX96HXNogRin7/1hn0Tg56YwpJ/OFhox/Y/p0BN53Tlb8xuBvy+ZnZGdGYn/R3GUTz5vZjMRgjAV/MyWzQyw+J0MkfaZ7XnoHNjKzvJk7Z8c3yc0MQ4Z40m0SKdIt+c4/k0mbrNnmOcbglOGZLHdRX0OtuA5Gy01PqvONkzS+iV9dLi88ZkGj+ppCOnuRnS+YM2MqM3By4+nPjr0xWfEEYnwh9afJ/LxYwVfTvAw3oT9hD8+xmRcnPJOZeSMykxV+Z3YchoefZK8foe/5asLGZlOoy3M7cN6N93HxT4P1Hor+A4LCr2SGNaCfAdyNOXXvQHzxII6g57c+KDioOz5JU+e+0c/pFU+Wlsfy+Uwae6f3MPaTzDCXxPkc+4Xm0mf9WUhkeL7S8zB/P5rHf9GmdefmkZ9MvIebd0qfo/u7Xr8X5rZxVmMXbSPXgZv6P+2sOeLnuWatGS99EDjIH4t8ftadd/tNyjmXlbCx4KH7pAnu3/NKajZ7jj4spYFXAAAQAElEQVRn+pm2tJoRF/GT2N98kheZlaB/sDPIwfezlqaXnLP7+7YHL00uPMRY4RDW8clkxX0HrHPfaEzr3ObCc2Rp3B7wjUdijjt+pbPM/WR4mMHu+cVfW2dR8CD91Zv62nmm/mW797wzsvf+SWaac9ZFYz/Mc6y9aBO1c2PP5m03ez7+gfl7/CCzjj3rJ6lZ0zkHp//j4EEEq1nOkJ4he545zri0/n+1W6/3c8Y5+6I1X4xQb94eBWYPyItcmMCx/yCWhJ7kK4B57PDDfJDm6jvxXc6RDyNYvUnvkneN3/g3Um2OVC4a2wZiDh4lGysET33Eh3cSxrFgB/ZBeht/MLH0CI9xrLpkLjy42wGzeZyMeeyif07VN5pj9HGRXPUXOtccBPy+eigeuh7Mthki2IwM4S9MiKePZTofzGE469YpmQTDM3DbMejwfwITZ7CXRLrC06/5/N9C85PmH34m1TlpzaHCcRnHiIRCRkWVPqd3MuSO+IwbRgt78uLKzNyIO9ONujeGxxwgGbLJu85+mtz+hTP4g51F7qKN6mT45Yq5QV9MUp0+hnUWJx/MkB72+cLs+CYlY2TuGr/6GyeeN3On/ra80xnEksxs5p3ksp4Bp+FmRpU3ztab1MyMRcQTN+VXhsdSkBuVSxM8xUVjP8zwaqQawcKJofio/zSSrHBhFh2IOkNoqmfuTIZf4fkkQdZgrpKNFVsWRxd9I/Nn0FiwmeXPwITQO4klxLHkk0km2TZPdiYxaMUMPhUzk5TdU5lJOcSwYB86PMZB82tjX8HBC/ab4RnMNen85bonk/VcxGHFwp8k0TwMpg9n8J22ObO1MUy1/xuAqPV1bf0TArm/RqNJsJ7/A3EXGLfw8T8Udw6s7zziWANe/+KDYLX9ncxq/C+S8z6dT/GDziNPmBL3z1cw+rJ1K/cV06PndmcjWqMWkeMIT+IM8K6paf4bqV3LZCe6EbppVIOQKAesfcWQxN1feqnuH6U70AtRIQ2ddFZ9gpKS/VKMJ1bthm2J98c6i9Ynds3inEY440mOIbcWvS5qqvE9SPmbTGvdjRSjHHF5S7uv82xRObu+m9WQdV27eQKSNHEFMwzUdeskg5z5rttF/E5KlRjV7K/1oT3H9FdSbfxhFFdvgn3456G0m37aGbxT/9N86zWbXFe3Ne50JWad1/oggcYfXA39v2vjmJfveUxfdLfOzMtI7+oV6/9nWoKeYbUzF/8Z7e9nYy1g5jupooiZdJFj72Dc+APuamoW6afSgqVfnhnKyJp5mWdbRYI0d3JwNj1g/XXC8GPpmvWGL2NU/Yuc1PYbmdk+DiH6tmfrTedwE1qIE/tDc0w61xoavKran9a/GK7OqdSs+Dcd5oS6/MFj5TmEFf9Gp/T/q59zl6aGS9WX3klS6J+Dxr2HMejnRopZyb+bpi3GF499pzsP8gfxA3rnG5ndd38w8fzOM34z7+Q9fI+Sok8ePas13tOaPxnqfxgvRnuuWd+0scuYUz+8g/fI1du7ew/fB17viO8ZtKWfRfWRr5qgv3+r7ojvXs3MnzS3refoc4bn23PynPWhabJuncn7VP8gs0nHGd+578x7rPzS/Xzp7TnNGT+CyzsesbY13Nt7VNf3Hn/Z7qWBlWsGg1+ammrJLH3u0tp3eqaxn2SGOYaz8rrrPa5/GudRyFq1f86m1vzDmFO9ySB/H3uu71FN7iIz9B93NOYXsUXS3OWl/cJmrGTmb3KOeczPzt887/Ig555fru905qWtuQyH1QtdxPFC34zPorUP8i7Vm/q/zJnmHtzn8V6dbe6L+Znf86f+m/9ocf6dXIAP7sDCh/Ikn3Hjd+LzAR7eSf5pnNM8Z0hmHW9nPPXtbq1TH/vOkBkI9h3He+p9Dr0hd5TGln1q5rRmc7+TM+3/SmsuY279TWfxjrnI3OobzXG31pTk/gMPa5glD9hPFh7MW5oI+h92cKev9I8kx7H8PxMnrlckTgt7GtOxRiUPolo862aEWWQo8kyOvnTw/CPMJ8MZFKA94zQki3hXtx+a+WQY4s5YNUDRxVWXXhEkcf16q+CUjjCM3olehpAELdA/7Yz9RXPaHqn7sjP4g57jfS/aSW1Xt3VXXWtKak7q4oNeneJPmuSMVeZnpXeyHT8raHN1ZrvYWDfNHAL9vX+jjWSp7c5BkqN4D0pfmsLqi6Qoc634Xa/IntTZrWPmi9RUU4VL0Rpg7F23yQ0zB7iG++p5CuLfioydRsm9x/BbSHkvqW9djY3lnb1uL6GmyM9Y/WQje2QLrdy6QN9ICauBkkO+0TOuuDWn0XnmXvQOJhYpXWcygFVfUoG/PH5nlFurjEObjV60zPiNlDZNqETT0sN165OTdDbe7T1pwYftRtFcndfWGcifJMHy96/tXvBuBtXQz49JXM0GsdgYm2r/NwBRfjsQ8I1D98iG/K6hDmQRnzwY9SQ/2Ux8hppF92z1RoZPkpnJhGdzZqpn4MOSGWM/mJDHkh+kN4n7JA+GZ3ZERp+zngwP2QHNQ/xdlk+aDPHNfCOxxsc92ftv5vXMdi9upxchJw09SAA9AynJ5sx3/RbOrtqcJykeZxIdLNWTF3EzIRx2RWbwBhem1N+WZIc355NJiGbV1ctr37lkxWbR2nrVeDA8xk9DZoaE68HZcZhJyE1mM0l1cjHDr/CcxN1rNk/M7MhXkjP+MDqrf5DwPjyWKcMYufRseeeQHuLzSUJDZq3JVxJu/EbP0myQMxNWEon9ZCvIfqOxl/E1MM6c5MaJP3memfjMTGaW4bAmbC7o4sukofAFNDjIQ6KFs1bmyNLpQ+Xm8sYkF5pGX1s1rSy+pu9p/OS7mh7c3I1QHhaeDjmJYMWik/pfbBoLz2BBQX4E3lv8Z9JHLc3xp/FxBHYxCR9vfBaPas+4dIj9T0vOnk+S40xWnHlZgmY2Ce+24upl4d5rFprzT/1keMwDahilk59kpgWe9yL9jW/qb/NOnteBjdF1J7K5nzzMYHfqH7QdO77ouxJcMV7g1B8kZ926W/Jg8l0nK568cTIJNlh4Ft0HFYZPbr9OfTErOzfq/zKrzcG1JowKuwNKfS0kJj6TEewfXIFQuio+NAHXLphRULo5o34ZXv4Ylv/9dAJlm85HPWeSIz6ZuIIf3Z9MVj59LNNZnHzQZIhfHLz5GiHIIje5Eb96U/+yiefNbGazGr/6Tmeob7QmPjuOO5jrg8xt/CsnMxM21skE4VoMDzVkY3Ax60Gwlu9e0Q11p/4PMxw2Vn7RHMY1WmKZVl0nPJNTz8zWm7kzKPU3ps/Khrr0eepp3H12doj8NL40NfcXzf00upsb/zG8TuIfmIOXzdlc2ks1S/0mocFcH2R24xdXhTNXHM18Z2uNPzRV1ZvAOpE984NNnhvz696pP7zh9B2CF86YMjxDPKhNz8EGC/Yn7aKm3ReZ0/im/jaQmcHogB7sP/su+3lgknGNwO7U3zbWnDbxiOm7hqO2xs0gyyPrbASxGbcQ28zJxH/uouAQnRdVnBF74zMZwb5YweZZwLUTr5ZbQPdMyL+ss2zAsQ5wrHsuZj2rau0hubzBC88mM+r9ZDIzbKyLSQxhHySwyibSQomqLnPfW0HkB8c49pOTzmdj4b90xr7JzDKc4Bm8MYn58JzUxVzjhr24vMkQTWa+kVjjQz7pNslXhsccyFcSZMXkyfhU4MhlYw2RbFZPeNi6uq3scqPYV83iPJmty0k+2AjRxfAMajYBKi8jwbrpWT6HT5KZySSZmUySmXmzM7aZrHx4rF3IQDd52gqpQurO2Royo9mL4ZlUWjXKyVMbW9b4LD9w1rYCAx7awLvtGmHtOy03Blm5lyw9WXe4c6gb4vPJZMWTr1z/DcAj66tnycbif426iCP8jiLW7yi+ky/wjf8kI8hxAruz1KjlIvo91Cf3GZ1789WfZisznNfaN+1R5i7uWm/TOFr/NGfo/0Vzl72d58xtjOEzZH6126olyFKTW0XsvzQXX1kc6iljCv1I49VEuE8j0timn1eLq0n8wdauIe60Ua9nDzzzW5JvkFu8kz6KuK0XI/+mydnceU1RuUkxqbt++W2j4JPUNL6pr1HoGY3qN8aV3mlun9/6y6f2kTs1Ext/kos7GRDHw3EH6ttnRJQjDDSH8zf3WRSx6PxTM408R3hZ6p+aYJebZbK1bKdet3XfZ5FzkJFPMsHGlrq9a7oIt+/G83OmmpQ1yy7Nma35oBX8JNrXak5tr8S4i8f0bydZoybQWfXpLe35D+YMfszMWvdU82NoOj3MG2C47p4DwWunNv5Ee/8VIv8miXfp/bjHP0ytcYArbkuvu740pzqPnmwezI66pH4zd+qfZp8+fPYe3JmfpXN5VhAuSNwAZ7B+aApIrjtbf9NMafyiI6jp50idvJtz1A9SX72p/59tn8dR3oO2flwXey9qHuSc6k3902hsFLYLPnUv3zPcSFumu+lFcE3olkz4Rc61mQqbUG3ykK1xiboT6KpvmY5zNwmRZzeG+Xl0Nv5/Jmc9+k59kT+DzuPP2KpD62/L/nN3bL7rxs1dxpvXv1P/NOZz3uoj5jnW/0VzmnX21j97v9AajA8v1zn0IlievyzEzP9JPqfm/yI5b3GeJ+2Rnc99l36dW835d7bWezfOxK90hn8mNpl92PMgXxeqN/GDHZjnPXlw+zXraP7IwbkHM4+L32K7pzX625ix+t70Gee05u80p5bO0/+L5r5Y3mJL3z4r88xu/CKfke/K2TlJ7nho3kWNefd+lsy6M5de54VZIXZs5uI6L19yreUMc/fZB7UPbQ32uCPzP/W6y8H7OPMitdUXeT/O6Dmb+l+NWY3/JLPM9X6c6Dz1g9RUb+pr9siH7RncteeWxk5zhv76XI/OODjxpfuuxC/iH9jjM+XMpfnMyB2cc2ly1cQO/HxhHnHP/rT2Mru1cGnOs5cbn/rAD1aSowJZtUnEO1ATif0vHtRoHJv+O02v5xxG1t+0Ts1sXPcs+jn/yz/uw86YYxnJf1bB44NkjNMDmEOFs0/zeBL+u5pzvd/RWuqIH9ptJgNU4ChxSqpLLmeoPq38U5QMZ+A0vujhvOsqIE4BvmchWP9NU+gQzmIq/ew3XYWWzBNU1mstHuR21Li/aXLO/34nW6y/kwMMYatPzVy15zIPRcoA3k2jrHgZJY39RXOXUV3/Tv3/aJ78uM96L0b2vqWvg7n8TBqj59R0tPYiOesIsqh+aLqqf5AwV2LZ14luRO8anwqGr7j+acxuA+QTqNuNlkuTs3zdkSy5pR1HVfWdBOhpPYV/k3nWOAquxaxLb995xr7R2H82zmvt5sdMzvP6XIQyd4xadsJ8hOT1Sda7sVXqbUuzV/cg+t/JVBc1jCWvWD3V3XqSQZT5N90ocSmgiwbmcZ7iiuOwTHikNC1P3d8vxH8i41v3g+u/Acg3DnMZDit+m1GGTf8nmWxOvHEuGgEzrgAAEABJREFU3eRSkzfO1jd6HjYzFE9m5kZd9WZCPn0s05FUvOIEq8vJfHCIbaO53sWs3Nyo/x+MRtaEUWF3wKZq0LN090nK8AweYB+BXdyOMwnnxZWYgawm4Ey3LI0fzNjFJNXJi1kPpcv5Y//otQkjPpkEsrEm/mLLzKBZF5MYwsJjGGRxPmkyxC8O3uzI4rkTZKEmN+JXb+pfNvHcmR+McewLY0+SlQ2PXtDLwjOY6yI91X+R3Awd2Mw76SbGStjIwqwHwUq6JYsPkaxg8qA124S5L5wzPkndTX2N6yQ4JRsrOfWDq3Fmk1x45ifTzISHjRVb5RH2I5mZTJKZweRp6psl5NEJxPhqS0smPuzM2l76k2XzBMiwJ9Nfi35Bn4TI4Q+XlYlq/zSZqDI+nrF4hJI4OzQvHmleHZ4HHyLDLypYU5vqqZ/64VEDdV02Vi6d6PbCc+RJpDHr39i7kl69Se/s52PtnfE50rBxzDP6N8/wH6So+kH6qzf1t/lBe653+Urnc29ntuZDh3utu7UmQf9hnUUehmfNTGR4SnK/aRHncf/eHRl8Vn4yMRWf1ulse9cfhX4o1t6p/8vea6vdElvisw+9tDFshSeDH/aSosFfesCg5kZcImsZR9NTjTzZkDpJ/aRkLyf8miq9ZRTO8m77WbM5EvuL5rDwzExY2CQuxMxkZtATfwX/xWTp5GKSyXr+J5nVys0ZO7DNme1fpLr+nfrbwPNw+3cQN7dkZbXe4E3Cftroj6ob6mSCcC0SVnitFyfV2USwkmpim5+6EbJ36v8whk6SmckkmZlMkpnJJJmZzHw3kpkkM5MJz8VsvZncdCvRf3F2HjLT7sLohIeNlVPrb2vd9kknbuq/aO6nhacDFt/dDz2dFC4ydJQ66os41ZCamf9BalyrKpGnqZY/K86sSTIzmSQzk/66uGMDzUhzD5KrhklIB5nFuZghxwb2vvTaP6ONG7b6QTLVm/ieRVlmFMafJEHQZRwLZm143mmOcC7m99PeI6v0ZKLmhFJfayn/LNPvP6tacOSMl/ufp/3nubUfeo0M/w600uMoyuUkmf1LLzE54WlxyxTxrAm/JqlP3n/GLtuxhPZZ+QwiPJPWR2JyW0hMKxIZHjmowc/FBDdHElri8yKVrh2YqaDuB3cz2VCUk/FBsPQue9dZHclJz9P/ySTmHPTGGYKsbFOG58nJ0jdmrGL/xuz4JiUsBfHETe1MWY1TXU6Wvxl5s1NfZCQNk2RmMsl/tvDMzKqHyMwMmCeJzUwIup4MjymQXyQ3O1mio07YJ2H/aabNP5gYio/xv8xC8w8amMwME142GXTY35k+jbKxbnqoRzJrQL6RWOM3zgyhsaPUm5kMEfCksctm5dinscELtkmz3kz3zLzYqmE3BvHIs+MTwmHhB7t0BfG/SG6wVTUJ/mCL4VkqxDo3PIOx3nUMmPuTFDQPmdGeL5zZeXPYUyXq9d8A9CvbZTgsv+PYr3hu6gcNYHwXMn3wv9Dvgza8t69VzGj8L5LzPv1OJsUPMts0sESUlJUG6uMsrlu5f+oVPXf+8dMZ1RbzGXw7i3DrvrLBTnJDMajLrZN7Mz0LiFazsVYU57VWwac+498uaOw0bvC8LKPMgRXHuWbh/8/1VtxZxGBvD30vZy+NMmZJ76LmEDWGZ6n4wU4hf6eN6heXUjOfc/Qaw2F19jsZuuIkvCJtaAUzDNR16ySDlLzrTiF+J6VKjGr2T90gW/9sQw52B3Zgnu9U+TDKqjeBZeInmzw3Zte9U/80k/qbddm6upnoC6HKnovwWibLS/PZ4VvYOMXrnY2bgMTa95Xm7V5miV3+BTt/8ntqZxt3th2L9JCoD/lwLQdWcCKx9jAI1+LmcSCZtSg0Uqx499dPgu3lZ9VEqVPgHfwkOv6Me2sOZQDnMrP+g02lcXovcq/6JedB5x7MPJh/XOT0aukZf7AzqCk5krGMCe1ZNGf8k37mPbO9R9bfaswnGcTKPzYWTGfT9oXM4bNwbvNsrPi3DF6kBtF53NdzvctXMqu5L/QdnfHPHBdjcbcjnzx2XHr3Gzm/d30w8czOMY5Vl0c81/eRni+d8SI1NLdG/r8Yn0tnnT0cXP0XzZ1mn/6D6z5+vmvWm7YW67vwEr/Jn0Nm/6PmuHhk6RvJHbzHP2aW+ts833uYkwez5L876VO31/i21u7cP3jqA39p7sA51T/pO1h357/8650hZx36m51bffD7bh5ynmf8N/uXVfeNxt7N+cbu1N/G15PO+0l6zfG1annuy/4RO262tJF/rw7ereovkvMO/WyYV/J5ldX/3POPWKfDRuDBSfUfPKj/tMMazvq3ubTq2LNP/tt6k3N6tqT3+CB9jW/i/8OOfdahv+1fb2bk3xU5GlNjzK6m9yfN/TKnmrvozAN14/28D3/X0nE0d9RzZ8L6s2eEM0795D8+O6p5j3/UHOU/+v4R/2fn/2arjut0u047yC3/X/Pu/xr7t7Tn4f2DR9mdM49VxZ3M/YPrbsTxlz7oOLjr8Qf/Mcf8nf+o/0f8HzxK9wP1DyWPzZ6jz5mNfZAOY97/G5npvY+LB/elpzM3zakvUlP9H+iZ1sJOg+2CS4fziJz/jORfTfpOD01N44u0ovCpYXc6utO+0Nkv4xWu84jS7v6P38+QOkrH3s84EBoHsY7wUeahaWBCCDaPs2gfN7r0ihJhBvuK49DPwsl1PqXVPUfBLAPVFqsv4lTDVeQe71PHnM5O6/62s+gHO4vcRSepbzRnaNPra8pWkXuRz6L6RpM0NFzqkcc3pfekitcVlLL66tIW6dmLdOP4Oa7YXePT0Bx0CKXAOMNpUOOZFf+b9FjozE8yt/k7qTLmQVD8z0No6fpZbOKHGfaAB5lWvamvIS19mKI5NlZ/F7i3XO9scBlv6QQ61K3YuiD+hZSyLF55Zi+9p6kxfpNYZPA99zQn1sd5seOo3zSHuZjQc+TSy9unkVOrNjnPKc5e3F2mrZbYLuuZhF9c5e62k7JYuehJTZD5zl0rWlPntTGm4idJsHqhizheWLP5B9c7W7CMruXsXb3+G4B+K/AyHFb47iErMneNmGkgM9KSN2bri+mzotnRTWY0/saZWXXyYfRVbyaZWbUzJ4klxLHkjbsm32jsZXSGkWlkwjNRJ28cIhjhNI9/MQryXzlEJ+l+Mjz6oPFF96BduT+v0hXtwbh36v8ySmMOzuxhmzNbk3Od6snJmGQv6Rn8/GRIDZtr01pdLBgyp4Wn/sVZudyo/9OyM5vzSULxjPDI00Jixi2ZuXO2hhmT7CeTUIt6MUl18pPZz8yu3JxRY3fqX0Zj/U2QSysw2tmTN1p2D670UDZJ9y8kNOTWGst0nyRssPPxHyShnk0bZ6oyM0nm9Qs9ydbyi1nAVzJKqSOPZuVTTybJzFyG47qsDrPK8Ezi3wpjcykWE2jhwU+c+bJ/hK2VODTxhd6dYDiOWKCRuYgTH3+CndFziB3+I+U09c2os4ofpvcEGZuJP2jsq4XHCaATID9J7wmwb/DB5LzjbybhDq93TZ+lj3ywZxOHnu25L0uWv+lc6pzReDW5O/W99ze2d53l/deMpf3NoyUrnpx63Sk81gGWdSAf3AHv1/w3Taz50o1KA3W7GcgarsYU1sRH/RfNbTtLkXXPGfCXniGDzchk5sZk6eTG9LFMh2qRxflKo1pokjPdk3FNkGFPycbKS1MzP8wqc19IiDWXMQF/7ROfqQ77xGfiufXGPV80CZeFF4e6afHMIoGlw2MMGCMbGZ8zrv/T2kH2G429G6UxFvZFvfAMEbD3LB7v3FV8cZnwSCzYYJ8M/2dDpXPMJ9VEyvCMuTv1L5vew32MMWOIzE/GLLNvtNYz3izqZNfG/7Nu74rPTc+Ob1YNDYMH2EdIZuYiXvUbjW3zPTwv3DGNMan+JrOivhjuRQ6suM5/s3Z1FvXwpfGqN/Gdfd7tk/ann1t4xnv/5HhzszcaWxaiy9s7s+o9SFX1pv6H0dXYG53P+xDt5ybnoZlpTXzMyhBJn2Gmzrhhlz7jzCLMZ7EqRo29089TG/vIZ7Nd+g75ylaQ/YvmPm1eb0F/UJP7c6o/SZIVml3faQHWL1e8oOw/M4nxoac+LyzVaTxZfIhkBZNNsw9DDLkan+MkS3luknVGEhJ+nOsuSDS/SXlpA8SZEdxh2y5B1WyGZ8gC9hHY4hBBsDh+vdogWM4CmdmBzRk0i0RyEadxmaR+UoZHDV5agVHO/rbO4GSaWXtQ9Zg1+Lm4M3MjuagvJksnHyRgmYk75x7Xv6yVqB8c49hPTjxn5huJBTMHUzqLWHi2PuMXTWGuccMu0oOkdEVm7pwdv5Nqa2ZRl6Jk6/jo/+S3pLEfZtjhcDazeelJdmjx1OXkvGMZ9SQ/2Ux8hpqTg6OBRvU1hXT24hjKzI36Py2rdjaTpZMb8cNjzUJw8QKXN3jhWXSfpTg35GZOHZ5JZRZBqiefDA/xbBudIbY55RDAziHGLiNV/xuJ0caebyVNOVMHsqibzMyLmcxMksnMxGfmjQaxHc7Kpvy/53cWwxc5vqyyjPcbi27b1ncU+R+nar7gL22LDTeSYxI78bVIdrHR3+SNzsMakTdb9yBzxRyh3mSW9+AYSolXk7tIjCQ7eeP1erd6zlX9JD3mnPFGBxISNcZAC1dPdbeeZBBl/k03Srzk4ncaVj9ITbUjcVgcjDCOuF/qf/m0tBf6OQLmMAPn0viuHeU2S1Uz37dxxk9S03zpeDpdN12XmMNPX1JtK2Gmk2dHd39xZb/vV08n0fOF1lzG7Pp36jdI//L72XBB1IpxOo47BxjlM2oesuhmb2qxu3plOo/YIv30kmUkefzGbyRB2ro24W+ClcOhtYkfZNwusoBZ3p6gnjO+k4nUtHRtlhJkrTFb0139Rnp8F6LUtaB8aGs0ztkVqmUEWPRwnrc/a+6koGcY+6/m3/jRrpkdwpmco0tc0XvirPnpT6VXiqLG/yGp4txUn/GT5PkRdf+WkOdVHusny/SwbNt28J4W0EsPgolbc7I6JbE79U+z7/TpdsXNkZtc+AxBzyTCRVg/tM3WfSEz/Wxo5HrkO+qNxrZR9P+x93e9t21rdh/U2glUERtkE1csqmzXeyVEcSIHhJDBlgXIwDln76qyCQJkGcQFSCBuIgwCiRv4ACBxz1fdk19rTx9jjjHnGP+9TsVJateZffWnt6e156X30dfec481/6tOUUE2myUrte84e7GSzprcN1s9KG6PDbNP/B1TTy670iIrPV/4qKkgRn54ku+QWPYkmZnNqEGDMPm9wX/k9+EK83tD7PGC2jn94rN3tVekp6LtyH7lP7BSS28tmzMQf+GbPvjQCdMl+Sekb3lw7cMZqeTOjnz2eiRGj6AWZo/hD9Xn/PeYnM3of8w99G79FY+2G33qL0yvcFALE3mU4+W8+A+QgzLXM5XnLD/CuSeRS0Elb5kAABAASURBVCfdYnKWdZ/69AWH49NDnC893jCx3fg9qc+OC1tzeobkJA7S80EsPZ/IftUX4jcepOfjhA9OSR49HtUfeiTnxKNtljuLf8T4y+jR+ltctew6efDkhse6L9qO9K1+wJ4vZ0Zbfnpp+WfkjqovpFfjRfbZMf3CQbQHZ9KO7FMO0kvxF3bfE599xPmVnGK0O2O/5qQ3OadexC74nI38xPYzPvDIp1c87Zg8+nKW0eHEFL5j6qI/Mc8Vm7yJhafHO1bVg34PzvTgJI8Ns0/4CVe/5FR/4dF2e9A38SPGzzOB7Q2yN4lh+lFsFvXB1J2Qj8DyA5K60mgdQixC3IUE2HfTG4B/jbkvtlp5geSnx1ha58XiR5H3kOZ9E7IPeVyvHmD2r5+t+e0Xm+Vcj/7ePAhz96yP8BM+hpHfDLBKEYWmj9S070NQDAxPzrL8bcQeo5yzFZPHYZKbXUhASTAdeVT64ym5Ui+L1IWbB03t0KRGUJ8ZL88IqEjOowdkF3oiMivuiNP9Ex6faghZ1WEHLIMHm4HzjlXo0USQ3XGzEtl5pPCvcNpTkqQeL0t574D6F+wuTaiX6BipVb7EbkN+kOzk0ovJtuFfGFUPEsmY3By9fPU6cBLIRo+GZab2HelGj2Q2jn+PVDd+g8jddCGd0xaWhwQaxL9Derdgx1VDyd4rsfCFW6vQPjOxMyIQ7DOR/DVmd/LZtvstjBKjPDPti3Gip+eOa69qP+qzX3MWZr/wExIrD86psu77cZLs1WhriYLXfBpNOHnhZLbZBdK7MwXkUNGkLzEFy1JGQWcXejwxeyMwc49TAmGGtzbLsj4j/gkpKt+R7uTQmRZpBA/BlkwmhDXRnylfC+YrwQ0FYeqEEbDkKAMfsAeVXIl1+KzhEmLmAb34AdMHqxLEhNmeuiNKhCxLsrMGMQmOSYr6NC9+xPjL6FFvx9Sj+ICJhe9IDJ7GSNpMaJ6F1SRlBr34wjJLRTGMB7A6cMQRlD0S2lC7jsNUAjvilIPCNj94bLLziBiprD8ytySns9QeLlq+wEjRr1AdbYF3jdboBxT+Mi18V1bEQewrTGw3K/vZCxXEQEUT/kIV6S00ZWwoFHW4q558CQtkj2cf0UtfSMw2TYwudbEUDKiLdI1fBqUWJWdZ9okGuiiGNe5g/Bhs9DgYJQdulesKLVVfiF9eHE8M7/xRz2hxgukdFELQNh4s6OBmln1lK64MZxGJev4NMQmSueyhfJRuPwlW1W19LAZnL1bZ07PwEIP/ZBTbRUq4hkjT/mQ7yAdzfpI9ljSSmPFS41mkI+qLQc+Jsg8zu/NfBiRI/4vwioRyBiB3ATDJYS3HNX5SBh85CW0P+CCB3nscP3v6Ckmt/oKpferqHnmUnKExDnCPD/LvLL0S+woTU0d+X7pPNkcJB3RCYuWXSHb1hUB+b9PzidLw4EMzBvO8R85FQxNbRu9qOxLmbqYhOWn8pW05C19ry4kdMf5ua79AtTjJD2LZG5jz4PScL5ic6DtSXw6mZ/wdX2qhz94hv6Jlz5SA2e3YazgBpvgXuX/ro4iwofgdwteO/G6UH5CYGO13g4nFRG3wIfqSq3L8W5x9crZHcjjaCenxiHaBqk7vxEIWzt4E0eLriJHDT5gzqCN7EVYRpUjuEyFMcVaB7R8/BHzltGCSyKrk6EfGayo9W3HE+NgDkylYODzPEm0hxQ8ocH4mhF3HF2d7KGPuUyeeBtFB9nokthBXw9kvhJT0/WajprknnL0ea4/2T7w2+zyUkbzwsSgP9j/jCA96jQ5nlu9In8SxB3vohFSVHxE/M/XBkyGWL6R26JHjV79CshMjlHOoGG0ZUA18JAa+8kc07JuQz6bmnRClfCF+PusfRe4azN5XnAo1lv05H28Ni+NtPDHBd4x/Y1sNyM6a3uQeOX703MMTOUn1F1Q49WD/m/eG4lHJYfa/3zTkcdGMiSMMGjcWcUPlAEPqZskeJ5OSNUYuU4lXhVj8cliWBwyffx7MOfCGd1UHWaCXsmHqHugSpcp4onkGofPPvFQUkt1F9guKEQ0gKKLSK9caDS5/h028wfYitmMKwyXzK1OJGb6jpHJ1RI4zaL2hTNisvkAtfSEpjuIjxy+/Qiv72UeMv0yvmB5okuyFekVimmFgM1zZYXpBL76QHNtJQpeyhF6iGEkFdMDQ4Ygb2THajUWeQrIhTBxFUkb4l0aQKQ7MpAJSx0gut48omV9ivCMi01hmkYWplAw6LvyA9LfhmDB7fBuUkF4RTULHpHeUZGmZz9ieaGAybHwybEvFriqVVTQaJuyNixEdaHwW1hGNJ+wexTCWabX/uFkla8aOOEwl8RYJNA4Kiw/a+Om20F48GraxazQdpPe/AcgHemY/5foZyJI/uEUs0jk+MN884mx8x2jtUIcOT6RH+VdILH9gbH+ST0incGRSsrIPwITjJ36y/Mcq+juSxomjjzUrjaJ+hcRyRNK65wlL2ikLLMlxD4gaJYbKMWYNhzBfOdI2X0M9CMEjJic8mL3qQ4KkzqFxdo6fSUrga9uScmdkbj3Ypwr8jHkqajq7sP2G1DMpYSUPOc6Z0636AUmCsSMO6/jbSp9qC6llsmdy0SDMM0d47hmSvIX0SnK6X2P6NoqzIfWwTLoEdnvjz40n58TJDj8ZaeULgRwxcIsNbgs96x4x/rv1aSKnMfjkNChfiN+UKySQ4+ZGnjiJ+fe4OjlPHI/OqCsPMh4Oc/P5wW5+S8ijBpEJzymx2Ww4fve6xDQkHxA/xU2PNHxiPOIA5fm5cTJJQegaZH/8WfnJc7LSi4IfOCTVCVFHLpoax0/Ngrg1spScGLX1wZw/P31+pG85P8XekNzHrYkWnIB9WPHh7EF6t/sK8yTTlxoS2Y6aBz9BfxxQix+w0SMXivLUX+Bj4tmH8/Un+2D250m7xyB9ksPzvPFNTwyDUpf8sY2fEMIk79G7yb7dE3FQ6A/iC7mU6ieUfihfGH9Zf//rP8RvnVL7jsSyHxcMTE7PH10XPNqNbT2+wsR2o0/9hdk3/ITEyhfG3+3ujEtvr/jLchc85PsdpDc5iR8t+4TvuHLokX9gjve5c2LRuThmCqlBgzBfOOdDVP7dEjnvyObkPNZvcBHe33DwkQdpLHn8E0mPxo6YnPBvMvo0b2F7c+YTEisPrhhn6b6vmF7RLvBRnR6JccbHwtyDDvyBP3xyh+dO4fR4pO4rJCas+3Hu4GNh+ybGHtGG5x6x5ND7kdgJszfPXW38B76wN6RH9UucPUSsexfpe0R6queLPnuFp2dw2688uZx1fO5m5/HvjL5vNdG+0eYfej4p05+acvwjxt9t5fBJ/KgWPvZAy9mL+EWe4YzcGTFx5tHh+OVBej5OSFb5EfHp8aA3/9bH+8Lo32ieiTp6PV72OHOeJTntTW0Q615BeulLXPuwx5wt/GnZS42N9ki/cvYN0lvRvsLEdqNP/YXtgb8jfXme6Rkdnlj22DHaj1vPeuj15PRFf6QfZ5m7Ykf8bHPi/JMWGcg//gm/I8Gchq7Ef6BrOv+AP+ojHk3al6QgFJUcnEcqQE7Q3qTkt4w4Cvrk04tAfNKJleA+Vi7xziz0JSMByns6VBRyWena9YmkdBJPYvyFU4/AZwIrLQkwcaA43GP9JMZQy7/CxGKUB862iTfYPYjtmOrw9TS43R/sXRXJ2TAuPtC0VpVvzw4myA1VLsaLHmzFbQbpme2d7BzzjPRByNkaY2GSH3F6N5YuBFARqcmOGydWfUdSEsdGP/JRVofZJ3n0AhYnp5wsXMRpEO2VtygLlhjAMbJOzZmgXyVF24yUY03kFyn0mFI/eTUWZs6c4/YQ4STlHsPPWGW1bGIyFy/AD0gKs0KRTa4we+x6cjajcos9MWdIYJDU2ZMGzPpBMvDH43cmdPGw6GCKo+6YtOgHJLVhpCKckm4etz6xIJXVu7wGk/BmqzDQWJ3n0h7QWyTAzO9fy3PAo0UMB3N/dOJoKQgMVmPZ2Fd4+huA/QKRhSmxMCVZtiVZtiVZtiVZtpVhOcC6YSn8AqlJlu2JL7SH2+DJJDvaDUrEMekGqZWU1dIJxfBSgorPXmcUg6iBxkH8laZ3TFDoC3WFaNWdVVrrPeo5vNwdl9ODEAtGOiEC3AZJ0UL7mr/IWlkLfUaSnZ6oxlRuPRFXFrJYQ2TjGRdUMf4ySUte6HeUhKrJq6fnumLSaH5ivXI8UJLaAz84PESyj+jFQTlB1g0lkQt7oswvMTbEXdMLN7CXconEop+MyvIbRF6bK2mhok1wuBc9ogkb3e+IZCIzrUtErn7A7BVLQdC2mJKC2C02g2hws+Rv/gt68TdEkGR7N5xMRCb6Q1YH0J/nouFKO5LxyAerZhBsHh++uNUsg4+uyCSTwU+blyJaEWcmDVCRhdn8LvnPzNFoQy5tJppceH5aHnjDiu/LlD1W4LG2Dj6UHpz0G5AUJ/+IUpptz3bGh8LTO5gnqc+TfI1pea5tPg/BXD3JgaRvTUJfNZyxWjHag+BD02Pw+pnFSBzoGYOiTh1sd0b6R5i/dSANUl99YfxlOVP2VRpVk05cjMSA5rzhIwp2xPgP0h9LH8yzIo5Gz42/IbHkzdmkE+YOGn+MXv5Qfx9z/jcupX9LiIlx4gSY5GgMwlT2HHzoDdkn93ppkqqLkbzAwtxre0XDBMlZxn0EkF6Q2vtneyjnbF96TR5tUhMOTjzaWPdLLHdxh4ndGn0aW3jZgxg6Uzmb4uxneTlz9Ufzcm/zDHD2GE6IHDF2TgxK2+QJVEe2iRPcLMH6LEzlPt4QoXrRk4PAFExFFrsMfkQtfkAlLsag67Ew4wNkZJXsUewr9MSJ2U4yXMoSWhQDQlRPrhmIzPGzlnSBHTH+nZGqxL7CxLRnaY1W5T8S4eDGncxy89tt/hHxAbX4Faqj/zjwW19EOaOpFzsMLm/41Zo+0b/CxG5t9jHPk38sYezfdZ6pvY9cjHCAGgOZt8i+je84md2PQJE+WvbOSWpsIdDcYhZs9daGSM85+4nnUEf4mKOl98LhSTLPLtSF6YsZyx5fYqqSd0L6lAfT92nZKGo+14L5g2k+J3Zjw/q3aDqnnzVjw2EJRqlxrkFHbsLW+ykgW+JfSZbHQlxFDEr8AyLBc3UGRbLFYLHMI5kUS+haA4ZnmfU4s3/5CuwlcR5EgokFoQpuvD7kiFvOCUMwUln3OXRWyfwS4wXpXeUWJdsszB0lRcLeEGHSrGASg7Dyoo5rM1Bu0NGxW7Tan4WJ/+Ry6ix7DEd4EQ8oKXExNoyLZToL9sTxLKNK9hWiVTdxqYulSxQjMUCXiMhUghsqowQnOObkoGhhucVg6ewy0XEVso6qQZ9RixctvWEV1EExDPNCAKanEWAeuMdnc0uyLUuyLUuy/WKbtlCauBjJHZDBLMHNRgoToSN6cZAeje4oRnQgWQaJMeOoWK1Ub1wEmbrEBF6VfjmUAAAQAElEQVRNjGhAagJHPITqdiEJZEocgPmCRBDtC5QoQZfuUTMmSwputv4GIJ9kfKvYbxRfkQ/26rfI5ykxMfJH2Lh0ixgXrHrGtUf7Hvzwd0spPWg6sReefRPbceWyO62zng2RDP471vUak7Pby37ZaxmNp748y+QiMsNnDwipd5yDTxSHfNLokpIDR+E8COgkMHEQmdG/0XJ/6dFanDuedoQnDZLtQp6IV/0GiTW/OGes2+WVzzPnLBNePHeS9kW0I8aPUdC6zS/S/xWbh16kV/rW37RXTM679Znamxg4fNWuC6M1XuIAOTlfPfa7RWLN+yakC3m0zsY5QnHjkM4sSQs2xrLxOV1WTosYL42ukQ7kUE5K8l85VcgEMxMs5nlShgBPztjOadicN2xG1DF6U0mP6BhNkdS/WdWrIIrQXol9q/ET3NZkl9RsvXakaX6onHg0MIdgt3gY8az52yLUz3mI4is/h85PghMPx7KX0B7Zl5rmo0MF1LI8yAlq4YNeSsLCBz2Hs391MNpmrcvB+al3feILt96P1GGDyZuce37sl/wD51yP9N+RE8JZOSZ5nKv+htk3/leY2Deb2Icd8gitCT9Y94KfkPzyhfE3S4/4YKvAZoHD8w8DCvuxcWbkAxLITP6OyS8h7wXZC5F16XjhW1PUbIhlwpjxmhYn+yxsKHzZ4y+C9Jo6TpD6chbm0DwLhAOUs6CE1XL28qW/8vQ+2+xDOqlU8hDjR49t2sLsQgJs8q94tFjy0q8+ve4wOVifaqsBSZ898HNmCJPEr/g0SSkb5pQIyQcoHh2fLqxJWR45EbpPssqpD95Yc1Pe+OoF3/TB9KAzOcw4OcYLUsSezQ9idGNFp4gO0KxPntwoaVY/eSfL5wQZ+SyofuTxl63PjUfz0Da+4+qR0yQnmNiGm/YVJvbNtvbbzpx9UrsjZ0wsZ9gwsRMnJzzWWvgtvuyXnsndMbWTM387+YUf9vghdfA3RHtgP2AP+t7jg9/ORs9IzYPeP+xITvkPk7f8H66Qu6l+iz/kVNjC9HjLJVZ9YfxYqoIne6j7cdYnRtssPeL/wNnB9hh8pAb+SL8j4v+ANYvYGR85LXsekJwf6PXAfsC/wsdJ/4GzvFtrs29yweHsU/5gT2q6+4P1QcajfaqS80S88oX42b/98K8wWuyxnuGHhXxwiJKnoZdf4pzn0ZOxd5Dk8uTn1GAjB3wkJx81vBzhzl7EHzWyic158rH00IOkWvKbg8ZeBFjxo7FX+GMUWJtEqv8gh27lfUbCgziZjZMRxJq/MH4sxU/k3WfFo29GqzRJ6+LwoRwEp0qxHj1IZD4Io8Djpd+OaOWXmNLUHbHtUxLxjNmFPundZ3nh1aNt1taoX2Fiu63c7FEt/Few7JvaHfMI1OeRqsPjY5l5BrbhGbMSI4d1cerCseQhMsk7cbqU3yAyR2Gmrp2zoB45Phk0Hz3+ZvRuAchp6nahZOfEkj5nJEpseNqRVX5EBGqaT+LXSL/kpBU4k147X376RbvCaN9s7NfchW892S/H5yCkZcXIZUXmConHJ1jvgM0KXzactbwbUf+KdM0kh7bEQ6amvEt3ighL/IVXRQ8GwEwK6Md+IbuOw0wgWwYTDm68v1+Qb0LaN+8Wc1aCbJJtuw80NeE/U74PzDeLtyhGvi8EkhNY6IWVWIxFOqMjSexhMYJY+SWKEJmZiUtwdSxaTriYQH2cQcv1fcD4y2hSb0eRh+IDxv8Go5Bp0UqsabAwzHAP72qpKIbxAFYHsB2Xk57IeuIEbJDZAGh30XB8YdF2lFQuPVEzSB3ni/WtNkUYumUJZGFa+cUi23DmjpIiYWJEBjTod0xQ6Dsaz0sZ3FZEJsw6IH75wvi7WdnXvkFFxy5QqZE0UTHiCT4mhrHMHakp/wqJ2VRg9itSjcaUWIiCmgFhSl2kwRORRpROmJxlgcQu0Jtuqe7C+DGOI+EUWZjSxk84hfZCYmL4Fh+NmJw4wZQGFechwLIk21hws/CDScThEogpw1l2HlZjmZ90P/gJcT6+k2aNFl/4iz+IY2L/qlbH/MTYI6OkFmDmg9gSM9Y8flTf+I4Jk8CM17zswX8M+PxmQ9VK0QfpW39hU9qVkg1bBr/CLecdacV/L6Jj+XE6B8qeekVi1XdkH86UDUc/cDGIMRE7u5w4KdvkqZbbDPwXfNsgcWzXUxJ+xPg31kMTA9sCzMwhNz5nykpfgvEax1+VARjxmQnDkd841WhcdCZ5w/sf6F2Ptowuje2YEmJpzQFbEv/OtpwTUg+nE2fAX713Tix7EsxEJqcbgexD+tIJbXxHEju7kAoSm8qs4U/rPmRtDdm62ZHa/ZmKzjzy+izM1gdT2CaQO0wONnvTE39WauIsK2Nh7kfJPsPzLCSyR/t8K7ZkaltX3vZpDVs+XvZJ5juOer2mPpF3HCXrGFv0yad/GDqfTfH6v1eGM0i/6gvxq5+Q5HAgH6Z8NKgoRj/fBrMXHycQJjodcTIbwQl+YdRwSk0P8q54tEsT46oGLTfB+ds7fqyckviBW2xwluwbb6u9wmh39mO1if8qtp9Hc2Vv3Es/oCXx3znmQgSIDUqEfgQ1Y7Kk4GZh43t0elqSbVmSbfXXjkszmEgwsRMSKwclERZUg95RJsYCrHX4rO9q9cjJPiGR8oX42Ys02SHRz0gAMTM6Jiy5YrxiYsjaUffjtbZ8ejv14ctsK5IW2nAJCmbuXB2h/feTf1afmFAZzisiiUb8y+9lVeLz7w4R5TMhmPchk5s9gOqN+aFollRLbTRJ0VmZVn8ZN15yMFzmQ2IlJC2MH9u4Mio8ND11QALZbwXscBN3kywXteli4KMq2obKgDDj7fbKpU1ZSK9qtygpsaS/oI3I1LJQMc5oDT+gnCzWK9TSF5LCDEGXsoSnZ7Acp7xojb9QwYNtfEdaUmBJtmXpm00M25MPQmUb8BnRbAsx84xiJAToDol5BYtwhUusllhvLeHETyhFUkb0ryyJiZ8wgmWbDk+zDBfrK6qjKgvzwE0+lF4GdIVo1Q9oG8mpKMazLaMAZ4y2myfG6mrGE7aQ4nh2V9lPbJZZo4F4xFnxkXCY+MJ2XoL+FRIzNlmW8I0NijFMaO0rhjHmK1eExL5EEhoH6dGaC7RXPDHszKThPiM1FmMhXwA+5h2HD+TMEl5en0jyBHDIZW0M3D7ucTvP0ZVFr+pfIbG87fYFmOQT0jlhICmBImnFCPVxBudUWd/5qNuaE6Z3eZJ5znBaPXtHx6pfITUzE2zHLEjh7Uy7I0KJZk0iWeNu66uw8R2X0wNRFDxaeofvuHKA50OFYKsV3hdzS1p46J2nmp7E0IfzVPjdfpZjSvdJOM41tgvhI9KfXqNkfRqJ5wipzO75is1FzL4xCsmL8Hrm6U+QlMSPvF3Qj0h9KEY26zuvyNJ/tsH0HkgF9jwQxYtHw23uhi3KgkUD1mGoC3m1q6RomyU//sK6LJ1dEmhvWLH7QXK8BIs7567wk1id5Hnm6AmAaK27xVSPJaVVLMyKwfQenH7ZY+cEw3Nvu9ZG5I4Aw0leDoLB6D1xZH5OjNgsfpKLS2St6yfQxChgi8SjpQNZBbT102iAHMQ05SfVEMrC246FOUniR/qE6QF/kNu/Lcg+ZHclkuQXS5T9yKABsReefRO7RWoTYz82lw74iJ6biAY+ipziFYlRyC70YiWj57hG7oocUdM4vd6RnOr04wzZ93GH9GrsApWatc8DVHKOuHP2qx6c+3sQE1p6vyNReoucxvGfOGcW51d0egR1QnLKg7Of6KVol5icZfRUcza+emS/6FcYbbPLnOnVZ2j8hUfDeGp+Xy/uiJg4+wMT+5zxQZQzcu5H4w89yGFBZ5/oB1PU8IWi5lHOvhsmhj490PEfWHNX7AFuXPjDWelRfovrrNsZi+yxYfaJv5COtKOGPYReHv+bbdWmX2roQUNmdKz8iLmz8CPG/1Z71uZec+bNHtnrYMN5omoL+9nEXl8hsX6WBbnnfI698semL3xyHj0aW1QrRnu37bpI7yMMTwG53XtDzl6+EH8/E+k92wmpK1+Inz3yW1SEZ69YzhhUAtVZ6i9kr8a49ltM7M5ok327R3LS+xWj/QWsZ9/Px92kB3zTB/lnH00/HJEDlIPUPPDzbLdITuMHTO/Ypj/4Z+xB/PGK9K4GKjHOMpyL2TixB/rzjDxLOUhP4T9ucT0DvUTOo8iz7jj7JCa0BzlBLey+8dmj2hvSPxpnzDn0ivSstiP7Jac9qQ0mdkJyyq/wribPlPzExx4vfcv5B61I/2I5dbdIX2L8m8K68vivxPCsif/AP8JjD/rWA+MT4Nr4fcqROE80WLW06dWRm7/xh9g9SMNlL/RHG4j1gSbiNBomUUwWbbKjiJEDe3o/oCGQxKyf/VGSMsAe46Qv9eFNZmF2U/YpJpbkHVODsHP8H51pmqQbbC9iO65cpB46mBjYZwHnwYjGJz1hoEdGfccEKZp0nhm/ecXxkpLIYNboIEXM9gymJJg9B6nCydlGO3J8ChoD04RUIHp6L4yLZSb+JWYTEtITaK8n0q/xIxKNlsZgIEdBXQ+IV/GAuJ3Vu0CPGP/GImeDE96UIyf1ZCGnWgjnzmHnmeHJwXjKdKgX58nDUnGBlDMbHFxV7LFzfC6WiYKffTdLx/o4T2w78hcmhmXSgfONPjxK+BFzhnCQ/RrdcVUlTKcldy/oO0561rQhhULmIsNZyy8xpS3A2RB3m5t0iwSYPdiOODl4LH1uMPeZ8GZUbW5x42fkzlY0+s/EN4HKV4Igk5Bl+4Ba/IBKHL6jOkbVUhfSq/oL2p684MmoK18oyZ5ce0M0CR2TXnDl6AqjPY1K0VJVLIYVLr2gUTBkNY6/o0KIX6JRLXXdUIz4QPXBrIJn6jieqaN2Y9wjxr8zUpUYaK9mC+3FiWVu7IyWE2QtUmN83aIImSVzYXLjYsKg2kyM+jt6Yjpg/FvTiiz0FaKhi9G98IMUyg7RC3pxUE6QdUNJ1MCeKKlcukWtYa/MhXY4dsT4u1FYfyGgnYdglLNKL5i0ozhhk2ap6wUimdhMJy3uGZEjtj/+CQmEe2EK7TLZluTnL7ilxTd8wOMvI4EpUhUUI7jxJ7pxG1ymogKY+fi2OgCmEDWYPR86jmSHezJmTUp+skzAWKYdz8844gO20pSfbMuINRZm/mOSj+Hd0JIfSyw/+aZC7ygGyc+Gwx/AbjjM/T8oPHX9W6Q2scAtNjhLesfbcTnH/0jFvzWKG1sIzPlwogNvx4j2Jh73xW/tGXO/UxY9N7swuXF3ZIPyC6RB0lpNzmAcujcAklO9+PQSoSPqeFmnMjl/QeO3f+vR3vzzVw7ecRF7YINk4T/oUw59xzmbyEnvpDwREeGR4AFVzr819K6/sPsk1jIWphILioUZuLUEknOBe+/EsO1M3V95hhZy/wfEfRAjHR3njecZoh+RCFLMGQAAEABJREFUJM78wIQFNyNT9XGCwIlnr6+NfSh6aGH6hxfR3pDnisaRtDD7Pg5c+MPJpVf5jgSZ2W90CE75JU7hI5B40sFMsXQfMaovjH9npFCWVdfITqnVAZUBj3aw/Ps0n5HEHBbMM78i9fREVfbsmcOx1A+nPpz+5cVURH/BxJaJQQZs9p3M+MvoWW3HZBPreRfG/wbrWbNfcsEnp0/5QvzsCXCu8WbXxMPDFtKr6i3ShVjvZMdoY6OPn7tNr3ecvXLexjnVO9Kj+gtyb1HSM12CZ46anP1sPBt+9urfSqVnEa248R05CbH0nDg8BKMz6/D4sbAgu9CBMLX1b5GKxDhj+ue+TkiLaheYZ23vxLJbeoCjHU8xCjsRJZk10XueSPKucCq3yPwhE42Ziv4nr04WbD+8cuVj7M9ROf4DQ5eeyGeWYbbVwd080US0eohBPfG8QyU9W20JtomLXDA5YuCKhAex5RIXj+KoONsMjx98xJm8eM6CVpTs3VFGaaQ4O+LAs69wha8N9yKc6EBjR4y/WwpDvNIcgnk4PertKHRneSIxiOylA8JC3xCh+gv6yOPvlq0SvUFHx27Ryn72FaIJSwxUMb3QxFh803dMCMt0FmxHaqCkjmIf0Us/ItnJ8WBckqTFlRH/Fq+C0W4scpqDXqiFO7e0pMGNF63tjEWFW7rFRpRhcjY0TgyoGj8WEkzvQUeSfcD4t6bJ9UJpuHRAfDGSMyBcPIHjGU+Mwawexr4iZm9cDKtUCy2Vv6DCxQDjxzzLiBYsC4anrYkWL4oRDrxxtLsQOlNKzzggs9xGwGxQlm1Jlm1l2C8YEVuyJqobdPWslvT+vwHIh/f2oT/I5+f61N85OdSy8kE5k6ROlvzHiCg1hIbj5w95jeCnz2bVT1pKyKS4OW0FPyE55UFiyc1pNoy/WXrHv0V6JJbaF5yzJT5GG6Qkhi8ckTWcs+CRxHrgZfAiBz9i5PATklP+3Cc9SYvwqxmtWgvmPoGpx9k5fuZsmWcYVp47ycZfIbHs0X4UXeFKYW9mcwZZU8oO7Bs9Hskw9K5R7m2vaSdqLjA5u9Gz/hHjV6R+/HkG/Oy8zkMQxt2UHzAulkkoMHl47fOG9G3iQvzmHTB7xZB4oJytTViYEZFmExwmSZ1dFk9aeRPZK4gYr70vORXkNDRLUhGZ6YslHPESqcmzZI8gVaSWFcuTE6MB7eJhK4LAJDcc23LA+UErvUhIbyTywr/BKG4NOw3OPVJJj+yzLPFlZNRLwlYTVH7CnM0T5cfRf/JHf13/+B/9ln7x8/+GvvvFb+t77Ltf/A74O/C/o+9//tv67uf4G/4CbbffIS984S/j/119X8S/wmhH+4783f6evq9/xM0/5v0F/e9X3Y6r9/cHjL/Zd+jxfxVM7pv9Ls9Fr+9e8PtwbMeV0z2jX/DEvtlWj/RvTfh/jpbnzd478jzlf0/fLfx+3dV3C1/5pg/+rk5Ij/IT/q6+L1+IX36FnCvn+G7h9wuf/PfY73exrzCxzV5y2XPrdYvJ2Y0+9d9xniH62PffD363cOO/Ev7p73NX9PkKE1uWvb6v/3sKDsfnDN//6Q0mttvs9/33v6/WgjnvkX9XLfHfX3v8CPY8v6/vLvEPln7G7/70yONvlj7xjxh/2Z/9GK7aPztgasIvjX7Vjxj/W4199v7U/PniRfwrjHZnOUtit/iH+i6xPzti/DvjDCv3l8FD71+mzwX/ZTRs8A/1juz159H/4vjLl/qN//Kf/RH70fuEaOUL42/250v7VTC5u/0x+9Hjz48Yf9k/W9g4/sa/wsRu7U/0y8aOGH+z7BH/K0xs2T+/x19kn39Or+SATx7tT/QLtF/+s29Acpr3Tfjv6Bfk/eKfDf7ynwcx9or+S84S/MURE4P/HPx5kHP/fLc/0c/pF2sd+tT+MefHiP0iWvGPyP3jp/35n+jn/L6l9uf88/Jz8v6nf/ZH+kf/w7+nP/x3/yavZX17U/4WZt/LeBd7rHez/t0+3tEevKMJw1Uxfk3DeZesHsTSB9CDXiSAsMw0wB6YiA3SvZwE3i+FHwiyBW2Jx0FPr+pxSA8kRFLdK2xaa/HAdEuPM1JJLL3mTFecLaZFgmnxRApb94LZY9cT2yx94n+JbU9WkE7J5YxM9g7/wqjKvmRMbo5OIS3eOALZ7JEcLDO170g3eiSzcfx7pLrxG0TupgvpnLYwTsgcEufG6N2cHSlNQ9L3XomFL0w4FtpnJnZGBIJ9JhK/xuxOPtt2v4VRYpRnpn0xTvT03HHtVe1HffZrzsLsF35CYuXBOVXWfT9Okr0abS1R8JpPowknL5zMNrtAenemgBwqmvQlpmBZyijo7EKPJ2ZvBGbucUogzPDWZlnWZ8Q/IUXlO9KdHDrTIo3gIdiSyYSwNor4jjxd9QdfAOb7wH51aKkoBn7WV66lE8ssY2EqoUHHhR8wfbAqQUyYbfKYR5QIWZZkZw1iEhyTFPVpXvyI8ZfRo96OqUfxARML35EYPI2RtJnQPAurScoMevGFZZaKYhgPYHXgiCMoeyS0oXYdh6kEdsQpB4VtfvDYZOcRMVJZf2RuSU5nqT1ctHyBkaJfoTraAu8ardEPKPxlWviurIiD2FeY2G5W9rMXKoiBiib8hSrSW2jK2FAo6nBXPfkSFsgezz6il76QmG2aGF3qYikYUBfpGr8MSi1KzrLsEw10UQxr3MH4MdjocTBKDtwq1xVaqr4Qv7w4nhjeuepZDBam0nvQcmSEHXFsa34yHLwyEceU4Sw7p1RVtp8c9xMyKY/qibke/PH8gI2XWhH7/d/7a/qX/+L39f/9//y39H/+T/5d/Yv/1e/pT7/7O3xx9zv67pe/c8bot5Yv1Kjrl3avmNi/Lvt7+v7lC6L/XHi+NMu+vwom9y9sv6vvW/sVJvYTsT9d59wxXxKh9cuihfH/i7I/4zzZ+ytM7Jvt9/V9c48Y/z+9fccXPd8f7I5v+r9OTK/Y93wxE/wuX97kLOV/oO++wsR+MpYvlfI8R4z/n5X9EXeX3keM/2P2n1GcLyq+48up777CxL7Z/ljtxZcfT4z2V8T4wui7PNuvgsn9S2t/ou96tq8wsX9N9j9bfb7CxP612b+j79rrK0xsM87X/D/RL8EaXxSecNPf8I+nhvv8ZWrA7/7jP9H/8n/77+s/+X/8d/X//v/9U/2L/91/oN/7w7/BG5mlfY3XtzUUdSSqhxfnpa6qNO9zwdG2jAk8ABNkJhGzw710UIxogPTC0a3DOJFN38QbpIfoqx3FILezixqLm5yipA0lRRZj0IsfUE6U9Qq19IWkOIqPHL/8Cq3sax8x/jK9YnqgSbIX6hWJaYaBzXBlh+kFvfhCcmwnCV3KEnqJYiQV0AFDhyNuZMdoNxZ5CsmGMHEUSRnhXxpBpjgwkwpIHSO53D6iZH6J8Y6ITGOZRRamUjLouPAD0t+GY8Ls8W1QQnpFNAkdk95RkqVlPmN7ooHJsPHJsC0Vu6pUVtFomLA3LkZ0oPFZWEc0nrB7FMNYptX+42aVrBk74jCVxFsk0DgoLD5o46fbQnvxaNjGrtF0SNIVWqKX5XwB+OCTEhPGt4LqwAfnm0ecxAC+N2QlvesN0qPVXyExvr5kkplZTr8gvbMv8sTLiR0x/m5zqqyt4awbklI2saUGon6FxHqUK6R2ZoI51wUmYRlRjjFrsiHMV460zddQD0LwiMkJD2af+pAgqVxcVrZDi7cgqaFf2zO53taT4txjep+RbYjNpCIzNcXZKTTeNdKN3HbZkGTUtNy94Vmb2VhYeqYsSHKON7GICNE3gxInkFlxeiFSU/ECW4V+xNSFP3HYBc8+CV7i7Jn9n0ZycglVg67Nn80TO+rxd3sNhl9b7m96E+/sMp02N4glL8d6Q4TqJ5yC/HucQ3efxLE0Hz6R4fHHXnl6p1v/Z3EIpmf4g5/CQrkiupH0wCBMovhPTlZ49i6GZ6/kgQAK0XFmRY8C6U+S42Nb3v/if/539X//v/57+u//w7+l3/yNn0X+2E/tBj7n/dzA5wY+N/C5gc8NfG7gJ3kDv/Gb/4b+4T/5O/q//L/+of7j//V/k5c23tZ4Z+MlkLe1OvqBJ+MNcee8AqJkRqUkaUNZ0cJr+CjKe+bioUqDGp2DEV+w755Hnd1DN6i/L2kecoPtTWzHlRspDcE5U54Fkok1FCS9pTvyXNUPSIzqlOCh19vwHCGBaGJLpxdzO8IFkktC7iTnOCKNmIljeCkmlcbh7ERBObEzkkI4c/QjH2V1oOXi9Gp+EW3hQDjREFyKpmE4MttnHS1ecnY8EdQrHm0zUo4NI79IoceU+smrsTBzxjkehJnD5W7fscpq2UTabVgZfkBCzApFNrnC7LXrydmMyi32xJwhgUFSZ08aMOsHycAfb//9Q0nVcNYUo6V39aZHX9XhWNOQinBKkl6YJcFIBJnxRi+ZYIXwoxGqfsT4y5Ia9xYJMPP71zY54NEihoPzjDQr54QLUTrTJs7XyN0kKf2C9KiykD+98j0g3waKbwNtS29YRRkmNphVi70gPSzJtizGQtvlNngyyY52gxJxTLpBaiVltXRCMbyUoOKz1xnFIGqgcRB/pekdExT6Ql0hWnVnldZ6j3oOL3fH5fQgxIKRTogAt0FStNC+5i+yVtZCn5FkpyeqMZVbT8SVhSzWENl4xgVVjL9M0pIX+h0loWry6um5rpg0mp9YrxwPFKM98INQ2SGSfUQvHZQlYpYXSiqXdpT5JcaGuGt64Qb2Ui6RWPSTUVl+g8hrcyUtVLQJDveiRzRho/sdkUxkpnWJyNUPmL1iKQjaFlNSELvFZhC9wsfSE1vmV/TkzGay4csgmS2wzUee1QEwleAgrvhAxWbOviLIRHrsweEiZP1b//X/sv5v/+rf0//gn/xtfcbnBj438LmBzw18buBzA58b+NzAf7E38E/+x7+nf/X//O/p3/qtf5ODWH5YvLQxeZdj1Rp5K+TFcDFipJUs5LWxVKvmEcHJOyRUgzO1+5D4pFYTIxwQocCOJVr0GRzPu24x6OEotyjZZmHuKCkS9oYIk2YFkxiElRd1XJuBcoOOjt2i1f4sTPwnl1Nn2WM4wot4QEmJi7FhXCzTWbAnjmcZVbKvEK26iUtdLF2iGIkBukREphLcUBklOMExJwdFC8stBktnl4mOq5B1VA36jFq8aOkNq6AOimGYFwIwPY0A88A9Pptbkm1Zkm1Zku0X27SF0sTFSO6ADGYJbjZSmAgd0YuD9Gh0RzGiA8kySIwZR8VqpTvX0hzHxC4xgVdbuYHUvGLSo4FMHVOGW3OmI5o8o/sdpdGle9QMqusEN5PMr1ktBpsbxe46fwNwvmnke0G+FcyffM+8CpUL+YBjhsznKDXDqU9W+MHyTWf63Rutmn+D9CTcvQbZhw1Z0xq93hNJqvIVJrbb1b7RsnGQbtmPfDZhz5Injsi6dG9znb0AABAASURBVDyCrBunzzCc6UXXpBw4SvpHCVLaBDD3Nn5JEm+tufRoPnjHswXhSYPQuT2fiFf9BomluP2bMs91zZ+xluUuUnNCcsoXxo9RkJ5V41fjqK+YWHoWyd59cqu9YnLerc/U3sTA4at2XRit8RIHyMn56rHPLRJr3jchXcijdTbOEYobh3RmSVqwMZaNz+myclrEeGl0jXQgh3JSkv/KqUImmJlgMc+TMgR4csZ2TsPmvGEzUBfSm0p6hGPlwaiD/dt/bMYkD52fyrY3wjtOzfa/C0O7qem1UrthA+RyknFZ229+irwyW5usv/7Xf6b/0//xT/QHv//X6PCZnxv43MDnBj438LmBzw18buBzA38ZbuD3/uhv6P/wr/7b+mv/tf/SvNX9wFscr3XS852OVzyO+hCvkKD0wIn2yILygCMyKUR77DZ/4y+cIPMZh6RRDfUCacyJMgmGYJyNtbUJZJ87JJa8673p2PgRacxBIk9dOPuhkYWEz17tt7AKBcVom1FT7StMbDey6x8x/jda9t3OUeTEr5jHwTLzDGzXZ9o4FYvPnhAmWemDQZgbpwqNSVnyXziUIzGTTwpeZrwgFbjEShbG32waN2dy94ZkkM/kMMSZyYUHCFbOMpxqYsNxEPPsVCHBKbjmzSA6GIdOAYy69OFIqYW11xsm55uNfZq78K03u7MBK3uRM6foiozWyCU2u73JAYez4jPjUNcND0jXzCRcITsnmY5Tf8XRGg/Sg8TOLGkbJJSNcUlgtufCxkhkNp67njgJiF/ydCUHoIR8nObvOCejcbchqZicZlObjOEo4Qf7GX2YxjLPaL4pjLqZ47AwldCg48IPyLeLwmyPfsJI0RdKSVVG0jYk46kjlhctv6HRltGk3o6amA8Y/xuMQqZFK7GmwcIwwz28q6WiGMYDWB3AdlxOeiLriROwQWYDoN1Fw/GFRdtRUrn0RM0gdZwv1rfaFGHoliWQhWnlF4tsw5k7SoqEiREZ0KDfMUGh72g8L2VwWxGZMOuA+OUL4+9mZV/7BhUdu0ClRtJExYgn+JgYxjJ3pKb8KyRmU4HZr0g1GlNiIQpqBoQpdZEGT0QaUTphcpYFErtAb7qlugvjxziOhFNkYUobP+EU2guJieFbVCMWg4Wp/u/5QQVhyrYMty0mdsT4y7acopSf8NpWhu3hEMdYGudzEMp8ENdu/eQsG10MWuSzVf+bf/kH+p3f/q+gfObnBj438LmBzw38dG/gc/LPDXxu4K/iDfz23/2v6l/+7/9DHu2BqW9zea/L+6UyeAcs5G/1kWIjxA8SsMMlG5RlO+SJYqChClF5nxRcGYjMvi+Gxsrj7LYpC1uLf4sUJkZK9zmgDWFqWSjZOqMXP6BMmll9gVr6QlKYIehSlvDsESzHKS9a4y9U8GAb35GWFFiSbVn6ZhPD9uSDUNkGfEY020LMPKMYCQG6Q2JewSJc4RKrJdZbSzjxE0qRlBH9K0ti4ieMYNmmw9Msw8X6iuqoysI8cJMPpZcBXSFa9QPaRnIqivFsyyjAGaPt5omxuprxhC2kOJ7dVfYTm2XWaCAecVZ8JBwmvrCdl6B/hcSMTZYlfGODYgwTWvuKYYz5yhUhsS+RhMZBerTmAu0VTww7M2m4z0iNxTghSvlC/BTZzt8AFINPQtbnJ9fwfHNYeS2jvmTl28TEv0Ji/WaySP0RqQ0FkhIoZq9dRy0vzqmyjhaPnnzKxztaVZKqgRunTffYkVj3ukL6zkywHbIghbczbY4IJZo1iWSNu62vwsZ3XE4PRFHwaOkdvuPKAZ4PFYKtVnhfzC1p4aF3nmp6EkMfzlPhd/tZjindJ+E419guhI9If3qNkvVpJJ4jpDK75ys2FzH7xigkL8Lrmac/QVISP/J2QT8i9aEY2azvvCJLvmkHSJjM4fjPA00svEb2EaFrc/JCMMpZn7xkW16D4UdLXvjCuiydXRJob1ix+0NyrASLO+eu8JNYneTtGXdEa90tpnosKXTMb0Xcimmf3sEf8lNcmqV3+IOf0D4IxlI0Wjo0qT36t/+gSm4QS55a1y3Iq/LExJp31OnL/v/4H/+W/sO//zeIfuZfiRv4PMTnBj438LmBzw18buBzA3/lbuDv/0f/tv7R/+h3+27HG1yfj9c7EMbrHXNeAqPwfgfAfyAfSGISeHeskDjavG/+0NS8R9ZBH9z0sn1Jm53UiRILucH2JLbjykXidJ3dHz5nIo6fs7YkNHzHeeYUThxOrHzHFEQPniNJGTU6DMLcjlDxyHOm7LMjB3vy2aMx9DSZ2ujpvTAulpn4l5jmJKQnQMupGE6/xo9IVrSkgYEcBbXPcokVWW6TE7ixyNnghFuvhYnFoEk9WUhjLMweknMHt2eMH+Mp04GKJh6wMvwCSWWmfOL0Hr66hWNcLJMIfvbdLB3r4zyx7chfmBiWSYfuExw+3tqNWHjYQvZLl/QeXFUJJzuIrbTuifzESc+ackJJDh3MTg0QucaVG2hOnedCm5JbJMDsgXbEyYFjKb7BeeYkjFE1zlo3fsZ5ojxLdXpXecPJ6N8AtPlmkKb2wnw9GL4jhDlRLXUhNdVf0PbkBU9GXflCSfbk2huiSeiY9IIrR1cY7WlUipaqYjGscOkFjYIhq3H8HRVC/BKNaqnrhmLEB6oPZhU8U8fxTB21G+MeMf6dkarEQHs1W2gvTixzY2e0nCBrkRrj6xZFyCyZC5MbFxMG1WZi1N/RE9MB49+aVmShrxANXYzuhR+kUHaITghhRrfyS+Q8URou7SjJmnGHE5XslbHQDseOGH83iSJMKorRWBDLpDygF0yaDuKEjWKp6wUimdhMJy3uGZEjtj/+CQmEe2EK7TLZluTnL7ilxY8Yfxk/fW0OC1OU6Ixe/IAk2aaBZW8mQfKpVrQYiQGCMBXUGuX4rpiPSsMeZTiDDzx6/E/+6W/jfObnBj438LmBzw18buBzA58b+NzAX+Yb+Kff/SHHyzsdwB/c6/E+t/1NwMcSbBx0BUm14czyHXHQH5hwdURqyk8IaU/wbaZBRMuBtQosp7fxteOK+IDEFL6jNFx6Q4SkJXBEH/X4uzUTdoOOjt2ilX3sK0QTlhioYnqhibH4pu+YEJbpLNiO1EBJHcU+opd+RLKT48G4JEmLKyP+LV4Fo91Y5DQHvVALd25pSYMbL1rbGYsKt3SLjSjD5GxonBhQNX4sJJjeg44k+4Dxb02T64XScOmA+GIkZ0C4eALHM54Yg1k9jH1FzN64GFapFloqv0Ix0LXMsupnsVizYHjammjxohjhwBtHuwuhM6X0jAMyy20EzAZl2ZZk2VaG/YIRsSVrorpBV89qMSgyit1VWmgP7xeA2zeNO/KBKcZ8czh/po6Uz7R8k/mGfLs4OhH89Nms+kmjX/nC7BN+QmLlQU6RthyAtKxnQySDbbpeID2Skx4vSHLmbjTGT+LUlHeZ3gRhib/wquhFDn7EyOEnJKf8uU96kxbhVzNatRbMnQNTj7Nz/MzZMmcfVp47ycZfIbHs0X4UXeFKYW9mcwZZU8oO7Bs9Hskw9K5R7m2vaSdqLjA5u9Gz/hHjV6R+/HkG/Oy8zkMQxt2UHzAulkkoMHl47fOG9G3iQvzmHTB7xZB4oJytTViYEZFmExwmSZ1dFk9aeRPZK4gYr70vORXkNDRLUhGZ6YslHPESqcmzZI8gVaSWFcuTE6MB7eJhK4LAJDccgzAPnF4I6U05evhm/JQWcWKbdkZub2qyY3IRABhN+UEt2fWDhPDTk3PglScZf/4W4UP/0T/4G/qtv/UbCX3scwOfG/jcwOcGPjfwuYHPDXxu4C/xDfytf/vf1D/47/xt3gXzbof1va7IqXn7g/NGSLwvhcr7Hot+QBeWd0w98m5I1vpbgNp1NGY53YKBJ5axWTCJR2S/0LxjBunZRJBT4WalZueRwr9CGiUFyxkoTXLcBvos2W8C6LPHrie2GT0a/RLbnoog2cmlN3N646T3pVFVfcfVIydN3QFpRhbxaFhmat8xZ+AQZDeePljr35BqNCaNU/fCobTJSjyTvsx4o4d8YdOY9JUTSCHIbui0Tk74woRjoXPmyXnyJhMCSewz3mK2SN4Zo8Qoy6RX4mufQk+HDrJx9vg2o0/zF772Kie2I/3jc4qcp3vEp0eyfpynmB5TzHnDqSy/QHp3pj85VDbpS0zBspRR0NmFHk/M3gjMHuQFW5tlWZ4teSdkn/Id6Z78tk5DOH7mksksG0Rs1gl5unIiwYNt+2fPWL8AlKwM7ximYX5FL/2AfJsorEoQKy9Sf0SJUDOLYqwwXLL0Yl78iPGXUVxvx9Sj+ICJhe9IDJ7GSNpMaJ6F1SRlBr34wjJLRTGMB7A6cMQRlD0S2lC7jsNUAjvilIPCNj94bLLziBiprD8ytySns9QeLlq+wEjRr1AdbYF3jdboBxT+Mi18V1bEQewrTGw3K/vZCxXEQEUT/kIV6S00ZWwoFHW4q558CQtkj2cf0UtfSMw2TYwudbEUDKiLdI1fBqUWJWdZ9okGuiiGNe5g/Bhs9DgYJQdulesKLVVfiF9eHE8M71z1LAYLU+md//2UQS0e9PgEmPjhX5hEDqYMZ4E/VI+FiQ9/zAfpcKHFixgMV0f27CdrHek/+Pt/s/pn+dzA5wY+N/C5gZ/6DXzO/7mBzw38OtzAv/8P/ra2v/GnvuY9gDpar3cgPP9XKBEwpvI3/ezoVt5RFf/BjQUBOQsG39y+XT4JwW1u4g3SQ2m4oxjkdnaREou7o6RydUSOM2i9oUzYrL5ALX0hKY7iI8cvv0Ir+9lHjL9Mr5geaJLshXpFYpphYDNc2WF6QS++kBzbSUKXsoReohhJBXTA0OGIG9kx2o1FnkKyIUwcRVJG+JdGkCkOzKQCUsdILrePKJlfYrwjItNYZpGFqZQMOi78gPS34Zgwe3wblJBeEU1Cx6R3lGRpmc/YnmhgMmx8MmxLxa4qlVU0GibsjYsRHWh8FtYRjSfsHsUwlmm1/7hZJWvGjjhMJfEWCTQOCosP2vjpttBePBq2sWs0HZJ0hZboZXkQX5gdHumJ6wvAfLrlI2xDdQyLXqryfJsY+hUS275pTFG+adyR2vD0CkKTmvATERsv8m3mDSJTl/hYTpqtfxRp3rwrpOPMBNspC9KBwyqCqBxj1tGg6FmffFjXt9Ql9EBkBCNtmF71EYOk9KJOGIKRwvojc0vKnZG69WSfKvAz5imo6ezC9htSz6SElTzkOGdOt+oHJAnGjjis428rfaotpJbJnslFgzDPHOG5Z0jyFtIryel+jenbKM6G1MMy6RLY7Y0/N56cEyc7/GSklS8EcsTALTa4LfSse8T479aniZzG4JPToHwhflOukECOmxt54iTOv7/puji5dGQNb0UoPP5YhER3w2Hmt2by2GQ4fXGyx2ZJin/CNiT3hGuv1KdrMQlLx21FdRZyyoPdP1rTNyKXAAAQAElEQVR+UvvQH/zeXyf7M//K3MDnQT438LmBzw18buBzA58b+Ct9A7//R39Tj7zG8V63pub9kcfmPY/1zPPaFx2bvAhkwVl5ebzhDbKsMN5M+LxXhkICOchuCO1NbEe0xCMt5JDszUxOdKyhIOmRgaaR9Y4JUjDpOVG8DVtxm0FZZnu2ioV54PRByH3lHEdMIVFyu7JRkK1IpOTJSSzfkRBpmaMf+SirU3s3j55PJKecLFySpkG0V96iLFhiAMfIOjVngn6VFG0zUo41kV+k0GNK/eTVWJg5c47bQ4STlLsNP2OV1bKJyVy8AD8gKcwKRTa5wuyx68nZjMot9sScIYFBUmdPGjDrB8nAH4/fmdDFw6KDKY66Y9KiH5DUhpGKcEq6edz6xIJUVu/yGkzCm63CQGN1nkt7QG+RADO/fy3PAY8WMRzM/dGJo6UgMFiNZWNfY5+w2c2jd5VbXPuQnP37BaBlGoh1Q3UME7o6yvkWMWh79IX2cBs8mWRHu0GJOCbdILWSslo6oRheSlDx2euMYhA10DiIv9L0jgkKfaGuEK26s0prvUc9h5e743J6EGLBSCdEgNsgKVpoX/MXWStroc9IstMT1ZjKrSfiykIWa4hsPOOCKsZfJmnJC/2OklA1efX0XFdMGs1PrFeOB4rRHvhBqOwQvaAXt/AS1BMlUWMxNpT5BWd14GBvnJqGL5Hs6Ccju/wGkdk2q5I2TtfFLZf6gEYx3O+IZCIzrUtErn7A7B1LQdC2mJKC2C02g+gVRnsxL76jp3Y2kw2vSRCmzygGcT5PRVDbT2zJgnc2pIz8pDeI4VZvXjiVFYJwLfxbv/Wb+ozPDXxu4HMDnxv43MDnBj438LmBn8YN5P8MeL3GSXnhE2N74WuAPwXz7viIFiOs6PHRtZtUXwnwB+joYuyIn7ntER+b7FlF7XjGE2MhPerdomSbhbmjpEjYGyJMmhVMYhBWXtRxbQbKDTo6dotW+7Mw8Z9cTp1lj+EIL+IBJSUuxoZxsUxnwZ44nmVUyb5CtOomLnWxdIliJAboEhGZSnBDZZTgBMecHBQtLLcYLJ1dJjquQtZRNegzavGipTesgjoohmFeCMD0NALMA/f4bG5JtmVJtmVJtl9s0xZKExcjuQMymCW42UhhInRELw7So9EdxYgOJMsgMWYcFauVvnMRZGrhGRN4NTGiAakJHPEQqtuFJJApcSDmCxJBtC9QogRdukfNmCwpuFnY+K4u9ohnd4W+IhWJebBfAPYbQ/HBlj8B85nIDAkDV7TfKCYJHn9ZvunMN4n3lhapucFp2b1oCa7ceBwEFu9pJFX7ChPb7WrfaNk4SLfsQz6b8DglTxyRdel4BFk3Tp9hONOLrkk5cJT0jxKktAlg7m38kiTeWnPp0XzwjmcLwpMGoXN7PhGv+g0SS3H7N2We65o/Yy3LXaTmhOSUL4wfoyA9q8avxlFfMbH0LJK9++RWe8XkvFufqb2JgcNX7bowWuMlDpCT89Vjn1sk1rxvQrqQR+tsnCMUNw7pzJK0YGMsG5/TZeW0iPHS6BrpQA7lpCT/lVOFTDAzwWKeJ2UI8OSM7ZyGzXnDZqAupDeV9AjHaIoEjxq+GZxAe5Lzww/h32Ds1JpeK/kHZBPm0sibGT7Gzo0P/kAYnb2Hj/+bv9GPSLp+5ucGPjfwuYHPDXxu4HMDnxv43MBf9hv4jd/8N3i/473uB97o5r0Onvc6tHDskb8iWOzLZ+MszMl5EIOkQY2sIguTXrmEijjFLiX1qG/WG9KfN8703va4xmxDp0x6rBJEJtrUZzt2CSchfWCEIuBRx1peTM5mpFT7ChPbjez6R4z/jZZ9T+fJc1DbR1gYH8ucZ5mcjcP6LDumH4bI7OEOSBUxJun0J0wwczhhjsQk0NkFdZCK5rEw0cjEmXj8aYyUTOJMyJoQZjcD8ywvJeRRRyw50yocAdJ8Cr5GWiSnJ0rdK6dfYul3h4l9s9G/uQvferJfj3HA5GxnTG38C6Qj15C6seGsyaUnwcwIBySQSQ5t0UOSsnBE1nD64pHEeuBl8GAAzKRLUnv6jVdIDvsxSYEwo2+8v1+Qb8J0JxegRRql5RFz5kbXEYand7OojTIcJfxLm/6kdL/Tn275UlBiYR7QkeAH5BtEYbZHP2Gk6AulpCojaRuS8dQRy4uW39Boy2hSb0dNzAeM/w1GIdOilVjTYGGY4R7e1VJRDOMBrA5gOy4nPZH1xAnYILMB0O6i4fjCou0oqVx6omaQOs4X61ttijB0yxLIwrTyi0W24cwdJUXCxIgMaNDvmKDQdzSelzK4rYhMmHVA/PKF8Xezsq99g4qOXaBSI2miYsQTfEwMY5k7UlP+FRKzqcDsV6QajSmxEAU1A8KUukiDJyKNKJ0wOcsCiV2gN91S3YXxYxxHwimyMKWNn3AK7YXExPAtqhGLwcJUSoNxgrblhFlwZRsTZkmWvUwaX7pANDH43DOQ/72XYnxspmWcGDA++arHyj7zyToZ6YFKNEmj6TM+N/C5gc8NfG7gJ34Dn+N/buBzA79ON2DzDucH73MgDx6qLKXGtcTU0uJGKKJtyB+bI+9/kfChGY2Pu9ZNWUgPyXos1BtK1ZKe2AFtCFPLQsU4ozX8gHKyWK9QS19ICjMEXcoSnp7BcpzyojX+QgUPtvEdaUmBJdmWpW82MWxPPgiVbcBnRLMtxMwzipEQoDsk5hUswhUusVpivbWEEz+hFEkZ0b+yJCZ+wgiWbTo8zTJcrK+ojqoszAM3+VB6GdAVolU/oG0kp6IYz7aMApwx2m6eGKurGU/YQorj2V1lP7FZZo0G4hFnxUfCYeIL23kJ+ldIzNhkWcI3NijGMKG1rxjGmK9cERL7EkloHKRHay7QXvHEsDOThvuM1FiME6KUL8RPkR0u2QeU4E87fQG4faidkK8Ky79CYnydyCQzs5yPzKCCLMxFyUM78vi75fvMxK8w2tOalf2EBm6cVt1jR2Ld+wqpnZlgO2RBCqcvXoR4g+2aBRsV5zkpexK8je+4nB4ocXj8zbJf/B1XDvB8qBCMUtYfmVvSwkPvnv6N85TRSJ94OFuEY3jPY1zyVpF2xCSGP3FYOP151njVcJjd4xVpOjqBHJEyeAg9ItTN0k4RSXnl7YJ+RFJDMbJZ33lFlnzTDpAwmcPxs3+6Bk9GdvlCIGmBW2xwW+hd94jxN0sw/sK6LJ1dEuC8nbMgZ+8cK8EiWpHAOxKsvhC/dbf43CYprWJhNhDMHmfM7xlhArnTGL+5KQfy01J2TAxAqL4jWnpFLJbjdbIQmO70rz9IGi1WnN5VS9kvKH50nKSP/dW4gc9TfG7gcwOfG/jcwOcGPjfwa3EDj/wNP560yDvdI+95IC9+vO7h/IBV4w0xyPthY9SIWqKTV57laI0eBfztnXHF2hM5fQvRserBiuxxwMQSWtjS8uSQih8vYZjeMEGKJo3nwm9ecbykJDKYNTpIEbM9gykJZo9BqnByj6MdOT4FjYFpQioQPb0XxsUyE/8SswkJ6Qm01xPp1/gRiUZLYzCQo6CuB8SreEDczupdoEeMf2ORs8EJb8qRk3qykFMthHPnsPPM8ORgPGU61Ivz5GGpuEDKmQ0Orir22Dk+F8tEwc++m6VjfZwnth35CxPDMunA+UYfHiX8iDlDOMh+je64qhKm05K7F/QdJz1r2pBCIXOR4azll5jSFuBsiLvNTbpFAswebEecHDyWPjeY+0x4M6o2t7jxM3JnK1qd3lXeME9MRiaxPPq2X2l1qV8Aug2lS+Tbw+ovaHvygyejT/lCSfbk2huiSeiY9IIrR1cY7WlUipaqYjGscOkFjYIhq3H8HRVC/BKNaqnrhmLEB6oPZhU8U8fxTB21G+MeMf6dkarEQHs1W2gvTixzY2e0nCBrkRrj6xZFyCyZC5MbFxMG1WZi1N/RE9MB49+aVmShrxANXYzuhR+kUHaIXtCLg3KCrJbIhS0u7VxSdekWtYa9Mhfa4dgR4+9GYf2FgHYeglHOKr1g0o7ihE2apa4XiGRiM520uGdEjtj++CckEO6FKbTLZFuSn7/glhY/YvxlJDBFqs74eOEuT5WNjwmzx7dNyLIY+GcU+iMLqI7EUeDxtBDlsXF1hD0SjRNEDcfFqwh+5ucGPjfwuYHPDXxu4HMDnxv43MBP5Qbs9Q4H5g/KzoudH1K4pSBLZ/1qmkFOnR3Lnktyn2x5m2i5CivbaTHRyzLUWcFMZ4EvJAcie+OS4mJviJC0JBzRRz3+bs2E3aCjY7doZR/7CtGEJQaqmF5oYiy+6TsmhGU6C7YjNVBSR7GP6KUfkezkeDAuSdLiyoh/i1fBaDcWOc1BL9TCnVta0uDGi9Z2xqLCLd1iI8owORsaJwZUjR8LCab3oCPJPmD8W9PkeqE0XDogvhjJGRAunsDxjCfGYFYPY18RszcuhlWqhZbKr1AMdC1zHKMtdNEIlrYmWrxI6BaJJRW4SmkoPeOATInFRsBsUJZtSZZtZdgvGBFbsiaqG3T1rBaDIqPYXaWF9nAACd8JGT/4tJ/1m0Ex+JBi8rVhPibDD7i+MqyCn28SN8s3n5s/mBZk0qy8reAnJKc8SCy5HITWWc+GSAbbdL1AeiQnPV6Q5MzdaIyfxKkp7zK9CcISf+FV0Ysc/IiRw09ITvlzn/QmLcKvZrRqLZj7BKYeZ+f4mbNlzj6sPHeSjb9CYtmj/Si6wpXC3szmDLKmlB3YN3o8kmHoXaPc217TTtRcYHJ2o2f9I8avSP348wz42XmdhyCMuyk/YFwsk1Bg8vDa5w3p28SF+M07YPaKIfFAOVubsDAjIs0mOEySOrssnrTyJrJXEDFee19yKshpaJakIjLTF0s44iVSk2fJHkGqSC0rlicnRgPaxcNWBIFJbji25RyRBOjk4GSfe8vfxmP/La/XBwfTADnQ/bMkUkuAnMf6W3yPCZLL5mjZj9MtTrT5D/0QzE9+gz9sP82l0Wd+buBzA58b+NzA5wY+N/C5gc8N/CRuIP9b0rzkMR+87j0ukHe8vOsty18IJIlcHg9CBTTvjPDkAHmVLFSmPmQTiwmkkkBr4GCVN2QrtJT1nbSpWY56+oQH6UKYQ2VGACuckKwnp3l5kNT6X+LsRUp79HgszMXpAMl536x7EN8xvcLfkWZkofcpWJjpBxDK7sTYh3Vx+oRjzbtEqqvfIHI3XUjHtIexH3NInBujd3N2pDQNSd97JRa+MOFYKA+SSQuyyQk5PQuJ5bdIKbHZNQ2Gx4slFMxewfYnOT3DiwS/Henf/IWvvcqJ7chzxecg+37x6ZGs7vslTzE9pjjHT9k90qsz/amhkvysITeYgmUpo6CzC2VPnLNMKgFmD7KwtVmW5dkSPyHF5TvSPfltnUZw/Mwlk1k2iNisE/Jc5USCB9v2z55j9G/8iPHHfiYrswsu6MUPOF8jonviGy9Gir5Qkm1Z45PLkgAAEABJREFUkp01iElwTFLUp3nxI8ZfRo96O6YexQdMLHxHYvA0RtJmQvMsrCYpM+jFF5ZZKophPIDVgSOOoOyR0IbadRymEtgRpxwUtvnBY5OdR8RIZf2RuSU5naX2cNHyBUaKfoXqaAu8a7RGP6Dwl2nhu7IiDmJfYWK7WdnPXqggBiqa8BeqSG+hKWNDoajDXfXkS1ggezz7iF76QmK2aWJ0qYulYEBdpGv8Mii1KDnLsk800EUxrHEH48dgo8fBKDlwq1xXaKn6Qvzy4nhieOeqZzFYmErvQcuREXbEgWrM4Jg0aB9Qkg2XDoifj0erIxALsfJrvFkdQOUDD49WWWWj8/mJA1eBz8liFqJ6JEef8bmBzw18buBzAz/tG/ic/nMDnxv4dbuBvMLtr3khebGTFXcWbiSkSZLFe2I4KDA8bq0kiWVrqYh/g/SQEht7BMJBL1RyTNaOksrVETnOoPWGMmGz+gK19IWkOIqPHL/8Cq3sZx8x/jK9YnqgSbIX6hWJaYaBzXBlh+kFvfhCcmwnCV3KEnqJYiQV0AFDhyNuZMdoNxZ5CsmGMHEUSRnhXxpBpjgwkwpIHSO53D6iZH6J8Y6ITGOZRRamUjLouPAD0t+GY8Ls8W1QQnpFNAkdk95RkqVlPmN7ooHJsPHJsC0Vu6pUVtFomLA3LkZ0oPFZWEc0nrB7FMNYptX+42aVrBk74jCVxFsk0DgoLD5o46fbQnvxaNjGrtF0SNIVWqKX5UF8YXZ4pFeMNibGSkvJ/J8Abx9pRf4U/KNIzvZNo0jON407skE4MilZ+UAFmHD8xE/Gt5nl74hM2+hjqc7WP4ps1rwrpOPMBNspC9KBwyqCqBxj1tGg6FmffFjXt9Ql9EBkBCNtmF71EYOk9KJOGIKRwvojc0vKnZG69WSfKvAz5imo6ezC9htSz6SElTzkOGdOt+oHJAnGjjis428rfaotpJbJnslFgzDPHOG5Z0jyFtIryel+jenbKM6G1MMy6RLY7Y0/N56cEyc7/GSklS8EcsTALTa4LfSse8T479aniZzG4JPToHwhflOukECOmxt54iTm3+Pq5DxxPDqjJi/8aaM/eXom64k9ZX6rkgrCCXavK0xW9BOu/vzwNb3DBpcHYVJBb06J032K5UTzt/zwH2CqxE97i+x1whR97Kd/A58n+NzA5wY+N/C5gc8NfG7g1+cG8j7H6x4vgDwzDvyB9X2v73687S2cnKSRx7vhzvGjAATXrEDtLi7hlWevaDumntzOLjQZ7LniYnsJ6S3dkXfaxEkYHU6MJihxwpOw4TnympGiZrMw+8hnpA9Czpb9jji1iWMlQXYgkRI2XpxY+Y6ESMsc/chH2Svp1bwTklNOFu7Foadhc6hODsD2WScWr3oX2FeY2GakHhtFfpFCjyn1k1djYebMczwIM4fK3b5jldWyibTbsDL8gISYFYpscoXZa9eTsxmVW+yJOUMCg6TOnjRg1g+SgT8evzOhi4dFB1McdcekRT8gqQ0jFeGUdPO49YkFqaze5TWYhDdbhYHG6jyX9oDeIgFmfv9angMeLWI4mPujE0dLQWCwGsvGvsY+YbObR+8qt7j2Ibn7F6ON0eh09J9F4PvCgIp8PRi0fclt9JNJdrQblIhj0g1SKymrpROK4aUEFZ+9zigGUQONg/grTe+YoNAX6grRqjurtNZ71HN4uTsupwchFox0QgS4DZKihfY1f5G1shb6jCQ7PVGNqdx6Iq4sZLGGyMYzLqhi/GWSlrzQ7ygJVZNXT891xaTR/MR65XigGO2BH4TKDtELenFQTpB1Q0m2YE+U+SXGhrhreuEG9lIukVj0k1FZfoPIa3MlLVS0CQ73okc0YaP7HZFMZKZ1icjVD5i9YikI2hZTUhC7xWYQvcJoL+bFd/TUWh22ZY/hMC0W5kIxEgcQhaosJ5QidYnOZ95wCTwrRom6mW1lPBY2TIPHyAl97HMDnxv43MDnBj438LmBzw18buCndAN5r3P+yLxe6Mr5w3AR7Yjby1+0PCNh/hyvymKEA9scmpUXRpLiacd4kuhl+QtMKPEjSqvkHQnQMquCSQha/HJZvINt2g22htgtWu3PwsR/cjl1lj2GI7yIB5SUuBgbxsUynQV74niWUSX7CtGqm7jUxdIlipEYoEtEZCrBDZVRghMcc3JQtLDcYrB0dpnouApZR9Wgz6jFi5besArqoBiGeSEA09MIMA/c47O5JdmWJdmWJdl+sU1bKE1cjOQOyGCW4GYjhYnQEb04SI9GdxQjOpAsg8SYcVSsVvrORZCpS0xgrPHkKCPaDR5CdbuQCzIlDsR8QSKI9gVKlKBL96gZkyUFNwsb39XFHvHsrtBXpCIxXyGaRM3TfpavA/PxdcJ8u7is+vLzjeK78WHa+A0qOrYjH8ZsyJrWfL7We2J6hX2Fie1G7/pHjJ8Ng/TPfuTQlj1Lnjgi69LxCLJunD7DcKYXXZNy4CjpHyVIaRPA3Nf4JUm8tebSo/ngHc8WhCcNQuf2fCJe9RskluL2b8o81zV/xlqWu0jNCckpXxg/RkF6Vo1fjaO+YmLpWSR798mt9orJebc+U3sTA4ev2nVhtMZLHCAn56vHPrdIrHnfhHQhj9bZOEcobhzSmSVpwcZYNj6ny8ppEeOl0TXSgRzKSUn+K6cKmWBmgsU8T8oQ4MkZ2zkNm/OGzUBdSG8q6RGO0RQJHnVxhPbakdjJD7+yH2afq55cc4JUBbA0ZD+8CcFxsm9Vemj73/7jJ7793/rb+A90SRxjztnHocNnfm7gcwOfG/jcwOcGPjfwuYHPDfyUbuDBu54eD97peJfse17+z0bW+96JLz0Px7tf3x53jIiNuBx64NGYlUBzb5BY8h5fokhJfXBvWZIygpkNpE92D5KAXvZE3oGXgtaMrzHb7kZl/SPG/0bL3hyYbPbMyv7lB+xTsDDzDGzXXOhC6qihYjh+8iBMsk+cqvIbROZIzNS1YxbUI8cng+ajx9+M3i0AOVXdLpTsnFjS54xEiQ1PO7LKj4hATfNJ/Brpl5y0AmfSa+fLT79oVxjtm439mrvwrSf75fgchLSsGLmsyFwh8fgE6x2wWeHLhrOWdyPqX5GumeTQlnjI1JR36U4RYYm/8KrowQCYSQH92C9k13GYCWTLYMLBjff3C/JNSPvm3WLOSpBNsm33gabmycnJfuQ0Hv/WeKrGrhCNHoRpk57Sz/J1oNnwhHyDWH6JIkRFZuISXB2LlhMuJlAfZ9ByfR8w/jKa1NtR5KH4gPG/wShkWrQSaxosDDPcw7taKophPIDVAWzH5aQnsp44ARtkNgDaXTQcX1i0HSWVS0/UDFLH+WJ9q00Rhm5ZAlmYVn6xyDacuaOkSJgYkQEN+h0TFPqOxvNSBrcVkQmzDohfvjD+blb2tW9Q0bELVGokTVSMeIKPiWEsc0dqyr9CYjYVmP2KVKMxJRaioGZAmFIXafBEpBGlEyZnWSCxC/SmW6q7MH6M40g4RRamtPETTqG9kJgYvkU1YjFYmEppME7QtpxwEMe2mNiGGl/6cZRkSa2XFJ/PMWXEH8v6kNdf3QtrPA6aHccq6IwPRKbE4jR2XX3G5wY+N/C5gc8N/NRv4HP+zw18buDX8gZ4p1Pf57rEldDmPc+yGHBWhZTnHVAzhsfnD8yBJG34wKH2EQ3UJUpKrI1YmBu3IUwtCxXjjNbwA8rJYr1CLX0hKcwQdClLeHoGy3HKi9b4CxU82MZ3pCUFlmRblr7ZxLA9+SBUtgGfEc22EDPPKEZCgO6QmFewCFe4xGqJ9dYSTvyEUiRlRP/Kkpj4CSNYtunwNMtwsb6iOqqyMA/c5EPpZUBXiFb9gLaRnIpiPNsyCnDGaLt5YqyuZjxhCymOZ3eV/cRmmTUaiEecFR8Jh4kvbOcl6F8hMWOTZQnf2KAYw4TWvmIYY75yRUjsSyShcZAerblAe8UTw85MGu4zUmMxTohSvhA/RXa4ZB9Qgj9NjBWuLlnDB6//BqAYfE34APiqkIkXjuWzMd9O7khOZIC8rHzLmHTcXY+/23yQZiWNNvGoWV7YZlVJKgc3TqvTXpQOJ6d7HrHBVmaBJRg32M60OyKUrKwra9xtpWxzixvfcTk9CBnBo6V3+I4rB5iHwFktkgL7kfmSfOidp5qe5KAP56nw0/vJ2WJScBIvTClu0oHFWwU9IsU0HCXr00g8R0hlttcrNhcx+8UoJC9CzrRwRNbw2YekA28X+BGpD8WoYn3nFVn6zzaYngOpwJ4HonjxaLjN3bBFWbBowDoMdSGvdpUUbbPkx19Yl6WzSwLtDSt2P0iOl2Bx59wZfhKrkzzPHD0BEK11t5jqsaS0ioVZMZjeg+mHjLBzHGjElHN9k4NT/oYchhLyO2HPWR26OlA/ys7ZKP7zGdODHPR6/BQ4+202cuJES2j+mT/tG/ic/nMDnxv43MDnBj438LmBX68b4P2u7355l3v80Nc8gbmE0fEWV3Pga/IWON7uhG7kFX9IMC+NILH04m00E7GzC6Ftn+f+h5K4ydmRt9fyAxJLr8psQAQl61NBaGQwaypAUpjbESoeec6Uo++YLiQMnz3qo6cJISB6ei+Mi2Um/iVmMxLSE2ivJ9Kv8SMSjZbGYCBHQe2zXGJFltvkBG4scjY44dZrYWIxaFJPFtIYC7OH5NzBeeaIYzxlOlAR3ozFC+gXSCozyROn9/DVLRzjYplE8LPvZulYH+eJbUf+wsSwTDp0n+Dw8dZuxMLDFrJfuqT34KpKONlBbKV1T+QnTnrWlBNKcuhgdmqAyDWu3EBz6jwX2pTcIgFmD7QjTg4cS/ENzjMnYYyqcda68TPOE+VZqtO7yhuuDJK6z4b0JnWOiwYdHyc6cOLXfwOQLJtvCMF8XWjj7yak8IXScOmA+BIck16QWklZLb2gFx9s1F3F9pKsSzQRTFjjR6xI/BKNaqnrhmLEB6oPZhU8U8fxTB21B8A9Yvw7I1WJgfZqttBenFjmxs5oOUHWIjXG1y2KkFkyFyY3LiYMqs3EqL+jJ6YDxr81rchCXyEauhjdCz9IoewQvaAXB+UEWTeURA1sRzHKv0BCnfbKXGiHY0eMvxtl9RcC2V+U1MqzYNGATU+ZNgJO2Mu7Qaeiy+SNGxEuZWnf6NgbR0jcC1Ngl8m2JD9/wS0tfsT4y0hgilRdo5e+IXUeE0W2gTEcWYxogHaURl+o56gO9WTUy0fjxm1XK5ATJlAVvEElZZgllv9YFOGf+bmBzw18buBzA58b+NzA5wY+N/DTuYG+w7Ew+7J3wvUYfRfkrXGhkpNQcf0pOrxW8eBt3FNGj3o7Ct1ZnkgMInvpgLDQN0So/oI+8vi7ZatEb9DRsVu0sp99hWjCEgNVTC80MRbf9B0TwjKdBduRGiipo9hH9NKPSHZyPBiXJGlxZcS/xatgtBuLnOagF2rhzi0taXDjRWs7Y1Hhlm6xEUjYHvsAABAASURBVGWYnA2NEwOqxo+FBNN70JFkHzD+rWlyvVAaLh0QX4zkDAgXT+B4xhNjMKuHsa+I2RsXwyrVQkvlVygGupY5jtEWumgEbGsSbTdJ9cUgh1U7l3b3NQRnEmdlit7MchsBs0FZtiVZtpVhv2BEbMmaqG7Q1bNaDIqMYneVFtrDASR8J2T84MGk0aRLnL8BmK8Gsf2bxvjL8nVhvmF8Gh+UjS3UFaJVD9KVz1DWtOKP1fWemF5ht0iPxNLjBdMQKVCjDZjEqSnvMnsShCX+wquiFzn4ESOHn5Cc8uc+6U1ahF/NaNVaMHcMTD3OzvEzZ8ucfVg5F1DlKySWPdqPoitcKezNbM4ga0p5NHaJHo9kGHrXKPe217QTNReYnN3oWf+I8StSP/48A352XuchCONuyg8YF8skFJg8vPZ5Q/o2cSF+8w6YvWJIPFDO1iYszIhIswkOk6TOLosnrbyJ7BVEjNfel5wKchqaJamIzPTFEo54idTkWbJHkCpSy4rlyYnRgHbxsBVBYJIbjm05RyQhvZHIozfO8Pip2Sz8xXp9aNkxdeXkg5Xyv9uHn4yog+M1Tg3h7luVnwAXq5MdxHIekvr/DC6IBGxxKniG9Euvj31u4HMDnxv43MDnBj438LmBzw38dG7g8Xj0ZW5739uQl73R8yh5+TthCfGFgb4M8n5YjBAfXO+X6VeFXk/8oT1mT1xiKX/n9OF9M+H2wd+Rgua/YPbY9cQ2o3Zi7BftkhOrHiQ7Ppsz2Tb8C2tP4juuHnkEGtBqesBxyCKOHx1AGm/OTowa1qXTNxxr/BLpUv0GkbvpQjqmPYx9mUPi3Bi9m7MjpWlI+t4rsfCFCcdCeZBMWpBNTsjpWUgsv0VKic2uaTA8XiyhYPYKtj/J6RleJPjtSP/mL3ztVU5sR54rPgfZ94tPj2R13y95iukxxTl+yu6RXp3pTw2V5GcNucEULEsZBZ1dKHvinGVSCTB7kIWtzbIsz5b4CSku35HuyW/rNILjZy6ZzLJBxGadkOcqJxI82LZ/9hyjf+NHjL+MXQhnTekbzt8AnK8RxfeHEr7tA8YNXyiRYlmSnTWISXBMUtSnefEjxl9Gj3o7ph7FB0wsfEdi8DRG0mZC8yysJikz6MUXllkqimE8gNWBI46g7JHQhtp1HKYS2BGnHBS2+cFjk51HxEhl/ZG5JTmdpfZw0fIFRop+hepoC7xrtEY/oPCXaeG7siIOYl9hYrtZ2c9eqCAGKprwF6pIb6EpY0OhqMNd9eRLWCB7PPuIXvpCYrZpYnSpi6VgQF2ka/wyKLUoOcuyTzTQRTGscQfjx2Cjx8EoOXCrXFdoqfpC/PLieGJ456pnMViYSu9By5ERdsSxLSYWPJrQNkOX4ObTahAPji8GhKnNUPBhfC4ab+c4xjLt8exBLVwgRcY2XgznozExXHXEMRuVfJbPDXxu4HMDnxv46d3A58SfG/jcwK/rDeQ1Lu91fX4Ikze9rCh9+eMdjzkvoGhEM+ONrdzHwmOzJLSH9Vg4YXI7u0iJxV0o/FioGF7vmcOtN5STxXqFWvpCUhzFR45ffoVW9rOPGH+ZXjE90CTZC/WKxDTDwGa4ssP0gl58ITm2k4QuZQm9RDGSCuiAocMRN7JjtBuLPIVkQ5g4iqSM8C+NIFMcmEkFpI6RXG4fUTK/xHhHRKaxzCILUykZdFz4AelvwzFh9vg2KCG9IpqEjknvKMnSMp+xPdHAZNj4ZNiWil1VKqtoNEzYGxcjOtD4LKwjGk/YPYphLNNq/3GzStaMHXGYSuItEmgcFBYftPHTbaG9eDRsY9doOiTpCi3Ry/IgvjA7PNIrRhsTY6WlRM4vK6tGtyxhxqT5G4Bi8DXhfA7Ot4/5ujDfMArxhE0lZyGQ1KQ9EZGy0VjHXzUHTlpZIrF8CHMMZFiKEr1CtOZdITUzE2zHLEgHDqsIonY/FuawiUGJZz3ZW8oSeiAyg5E2TI/6iEFSelEnDMFIYf2RuSVxR8ncerJPFfgZ8zTUdHZh+w3TgDg0HqUB4oWFdGv8gIRh7IjDOv620q/aQmqZqxcahHnmCM+9Q5K3kF5JTvdr3M5wROpDMbqwPucbf248SSdOdvjJSCtfCOSIgVtscFvoWfeI8d9tnjnJxDq7ROgDwgbjYDlWznBChPITkly+ED+Nuh/d3zHRMcIre3h6twsLk9+iqe5nBsnBzQhmtjBaSGresSldGk8fLPOdj5Jd4wVbuE7ZfeI3yMJsHGzu/gB0R2MljMNMWfln+enewOfknxv43MDnBj438LmBzw382t1AXuPyftl3ubzr5QZesDnVefULHqzviOVb1hHx22vD+Rt/7RIpm4Lb/n0XTUo1soL0bosd2bH6AYmRnW546PU2PEdIIJrY0unF3I5wgeSSkLPlHEekETNxDC/FpNI4nJ0oKCd2RlIIZ45+5KOsDrRcnF7NL6ItHAgnGoJL0TQMR2b7rKPFS86OJ4J6xaNtRsqxYeQXKfSYUj95NRZmzjjHgzBzuNztO1ZZLZtIuw0rww9IiFmhyCZXmL12PTmbUbnFnpgzJDBI6uxJA2b9IBn44+2/fyipGs6aYrT0rt706Ks6HGsaUhFOSdILsyQYiSAz3uglE6wQfjRC1Y8Yf1lS494iAWZ+/9omBzxaxHBwnpFm5ZxwIUpn2sT5GrmbJKVfkB5VbnHtQ9PuX4w2tlrQbTjh86MQqQYmd/4GIJ7tfiNogyeT7Gg3KBHHpBukVlJWSycUw0sJKj57nVEMogYaB/FXmt4xQaEv1BWiVXdWaa33qOfwcndcTg9CLBjphAhwGyRFC+1r/iJrZS30GUl2eqIaU7n1RFxZyGINkY1nXFDF+MskLXmh31ESqiavnp7rikmj+Yn1yvFAMdoDPwiVHaIX9OKgnCDrhpKogT1R5pcYllmP841T2/glkh39ZGSX3yDy2lxJCxVtgsO96BFN2Oh+RyQTmWldInL1A2avWAqCtsWUFMRusRlErzDai3nxHT21s5ls+DKZXGwQJ7oYt6ikKoNsiZ+UFiX0fIwFRzGKGMZUH+9h2ZaE7SgGvB+AIBNBpCr9xTj60M/83MDnBj438LmBzw18buBzA58b+CndQN7v8u4HPoI5e/y8PoKheT08YYmQt6TBc7qJS6KnHy6y/P/ZexMo2rb0KmvOV32fqqQSCUQIRBppNbQCShOiSA8KIxoQVJB+hKAD1AwMDGlEaYVAgCDSRILAGAEMNgMCqAy6AQalHWDoYgipVJuqSnXv+s251t5n73P2OfcmVZXUq9rrrv+f/5x/s/ZZ9+Vm13n33se28kPRZTibuOGK0uDSDSKMMiuYgiCsvKitbwXKHXR07C5anY9jE1+4nD7LHkYgoogblJS8WAsmxLIdh11wRJZRJfsI0aqbvFRn6RDFSg7QISKyleSCyiohCA5zalA0sdxi4brrRnaECpmPqoHeoyYvWrrBKqgDxTLMEwGYLkaCveEeMYdbkm1Zkm1Zku0rW7SJ0siLldoBMhgXXGxIYSK1RU8OMqPZFcWKDqTKIDl2AhWrld5ykWTrEJO4NrGiAbLilV5lobMTRWpYhwKyJR6IfYVkEO0DlGhBl+6jxhpVUnCxsBG7ujgjkV0PvUY6kvMRokn0bEwaXJroFWXN3wGYbxvvWr5J5DtJfg3MN46U8Y3ihit5bMWZ0wYTL8YAMmNGtCMebTVmN95i4hwYZNp8NsZ1Lo5dEelpyJxRRTBmMZV+aHTaG/EMK0YLB3MnLS6vQPsxtnYMiaeNukTpBZf8pOQr8hTXSB9FPG3PukFyae68llIxMcOij5KKKcVmDQXN7ZBc+cTEMQo7a4mLPNI1tg69yIwe+wiTuzUeMpMBckQE8UD45o5QOSJCcwSPcT4XRWw6H3KmkeeIfCDq9xyxOy5lwdbiFj6eNn6eRS6DotwiE9LY0rhrThdy+zbYn5dwZo84dREG4mmpv0LmpycfK0hLq4rkeBbC2TM5wjhj4XSk7saSX2zWcM7zzxODnVF8npMTUEvE+OEJUgnAybPT0ypmFDlzwdaGY6lbjIfPpoyKDlswUv4VbQeHEJz7vIHzBs4bOG/gvIHzBs4bOG/gBXQDvOfl3Y6XPN4B8xc+E13e69BWngBOko8HIcZD47FwjIHjb6EmZnLzea+MvtjCB6Yk/VtMPCw9jCop8mabvswOkqCk7IKpWayjyT/C5FabtRzGHjMJctYzWc5N/Yo8YfkGxw3iNxo1EXIGas9dkVz1Q6Sr+h1E5lHY+YCdGIe65cRUcOjQEy/G7DaA3EzDOlpWTi7l4xnJkhs846gq3yICPa2n8DEyLzUZBY7NrJXPOPOiHWG0ZzbOa+3Em5mcl8fnQSiLx6jFI3OF5BOTbLTBVoVPGxxf3oPov0amZlPDWPIho6e8ridFhCV/xauiBwNgNg3M47yQVSdgJ5Ejg0kHF96fL8gzIeNbdxfzrCQ5JMf2HGh6LpyanEdN84nvGp+quSNEYwZpxmTmhi96kdzE8TsA+UZRmG0pe4uSQsXaImUXPbnVLDf2BhNPY0ijFUUdijeY+BmMRrbFKOEzYGKY4R683lJRLBMBeAewFWeQmci64EjYILsJ0K7T4MTCoq0oqVy6oMaidAQP/E1vmjB0yxKIY1v5gZNtOHtFSZEwsSIDGuhbTFLoK5rIUxm4eEQ2zNogcfnExKtZOde+g4qOHaDSI2lkxUok+DCxjGWvSE/5IyRn04HZ10g3GlvCkQU1FoQt1UkDd0QaorTD1EwLJHeAXnRLDScmjvE4EkERx5YWvsPRaE8kJ5bvopqxWDi20hpMELQtJx0ksC02FtzYUlOULKl1EmhZuhiEvXKxDPNEoGzwMMkOW9Bwsa6QGvMLXpKEkqVhTwr9F7jNi0XST4rRCc593sB5A+cNnDfwgruB84HPGzhv4GP5Buar3LgCXu3yP4kHyTue+v6n3eqbIkqLpeWF8S5KrUl5ajZoQ9iaFirWHq3BNyinCn+EmvpEStgh6FJceGYGywnKi9aIJyq4sYWvyEgaLMm2LD2ziWV71INQ2Qa8RzTbQszeo1hJAbqH5DyTRbjCJbwl/F1LOvkdSpGUFf2RpTD5HUawbDPhYpbhwl+juqri2Btu6qHMMqAjRKu+QdtITkcxkW0ZBdhjtNU8cnhXM5GwiTQnsutlX7BVxkcDicjjiZEI2MTCVl6C/gjJGRtVloiNDRRrMKF1rljG2NdcEZJ7iBQ0DzKjPQdoz3xy2J5Jg3uP9FisHaKUTyROkx0u2RuU4BcTa6arS9bgG5QEwxYcLH78HYDjK8N+a5j/HZxvJ1cUv2SOXyvJQ9gtnwikdGP5dpEelLSFXXCwxbeKZDm48M4sRwliOZOR4xm2vCJ1h9jJjNsiNLUBkFGNVnctLHzFGfSB6ApujZn7h5w1wNAJ5oiUwp6yr4pzVhrBfKoxk5qVcxfELRluW9Kzkk5wjJ3rXPMYAAAQAElEQVRKeovMZ9ZQ4i9G4T5DKbtnXmNrEXNujEbqIlw/85hPkpLkt7xT0LdIfyhGNf6WV8T1n20wswekA7s8EM2TRyNs7YJtisOiAfNh6Au5tqOiaIulPvHEhrjuuiQ6G1bseZA8XpLFlXNXxCmsTvH4zNGTANHadxfTPSwl7cKxKwYze2DmISOsPDGWe1u1cWDGUdyNG70zBe8OHXVES8WKmVsdxx6fjb7qVOXAdK8cITGQ50lqZ8woDz4fh7UWEoSe+wV6A+djnzdw3sB5A+cNnDdw3sDH7g3k/S+ffsHE2KDjJW94xPVlcFF4p4y86G0it2KS4byDpoZwec/su2nqqpEPUv6EV0ugZai3mCSzRnnOT7RgO64qSukAKWV3ZjBicH0MAjZ55pHAEzMTMc87eH3EtJMPz+yJCbFsRgRal+CGM7f6ITKv+hapjpZBYOD+cGq3+25xEncscg7YIUPLJyaOQVO6s5DmcGwujZ3g8pkQ6ISndkYALHUjO3j8FaeEXXFg5lC33g2cmJ8kNhXE/XmcSGV1MhvsOPhEipIHeKaLNvjIcEoo+fCwiZyTjpw5MGXkk051EJtlPRP5gqM8Pu2kUhw6kEkQYjItuEHS1baYeFpaE95FEuw+0IoEeeBYe+EHOD5zEsNm1SD4he9xfKJ8luqcUeUGZwVFPWfBzG1MHoTuHv2aZ3bK9nhh6+8AtPk+sCbZiSdKg0sbJJbgmHSF9EqKt3SFnnxgs64XR0qyDtFkMGHNb7Ei+UM0qqX6BcVKDFQfGC94trbrUjrUPgDhFhPfM0qVHGjPYRPtycllL2yPlpPEF+kxse6iSBmXPTG1CTFhUC0mVuMVPXLaYOK7ppmZ6CNEQxerZxEHaZQdoiv05KCcJH5BSfTALiipXNqhWItO2G1PZaIdjm0x8Wq0NZ4IaOUhGO146QpTthVH2pRZqj9AJJMb2ylLuEfkiJ1PvEMS4Z6YRrtMtiX58gNuafItJp5GAVuU6hg99Q1SbJsBln0xGUmsFR1JcRYLxyZQJGV5Rgtq5eqyXdREOxybOIB/q4ukxfL/MI7i/utixpF7kuKFI537vIHzBs4bOG/gvIHzBs4bOG/ghXIDT3hQ3v/wysvgoGES73naruRW0Wu0lDgBM5zMik9gFo49kRxE9sIlJcRuECFlKdiit3ri1VoJu4OOjt1FK+fYR4gmLDlQxcxCE2vyRV8xKSzbcdiK9EApHYq9RU99i1SnxgMTUiRNrqzEd/EoGe2ORc5w0BM1ceWWpjRw4UVrecaiwi3dxWaUZWoWNEEMqJo4FhLM7IGOJHuDie+aRq0nSoNLGyQWKzUDREgkcEQmEmtgvAfjXJGzFy6WVaqJlsqPUCx0TXMCo0100QjYMiTaaqQa32KUu6mMS0FmEgtkayACxAZl2ZZk2VaWfYURsSlrZHUHXT3eYtFkFLtemmgPDiAROykTBzcmDU26g/RIirc00cWw9XcA5lvGYflmkW8In0zUEaJVD85a/kc1X2LG7w2RCr6lrD9AZqRmOW+DFGevxmDiFIye8roxmyQs+SteFb3Ig28xcvgOqSm/nJPZlEX4xhmj2gvmfoHRT7By4uxxZJ59sPLcTQ5+hORyRufRdISzhLPZrRmITysncG70RBTD0Ouj3Le1p5PoOcDUrMbMxltMXJH+EY/PQJyT5/OQhHE35RtMiGWTCow6os65Qea2cCJx6zaYs2JIfKA8W4fg2BGRxiEEbIq66yZPWXkLOSuImKizDzkd1DQ1XEoR2ZmLJR3xEOnJZ8kZQbooLSuWpybGAMYlwmYGgU1tOLbUbJGCzEaijtkEgz8tZt7m+mge52YeeggTAhgiWjiw8vRkSs67RRSeJTVP8ncCErMjRlpxaEzliM4BUxD9ifjXs2yKu6k693kD5w18FN7Am9/2vP7iV3yDvuzPvUt/4s+887SPoTvIz3l+7vPPwEfhP9rnRzpv4GP9Bvr582qXd7u+zOUFD7XvfCAvlfhWgH3p22HLm8ZBnqShSG0xOpOJRyqcqh1PnrEjVZJ0nqlI43ie2Tc5jBKawreGNHKMin7IyVUPUp2Yw9idmfPuWmfSs+KckY/AAEaNGXACqsgTRweQRpT5F848elNZnfg+0tX8HUTuoROZnLEwzmUPkuCOMbs1K9KagZSvs5ILn5h0LJQPmM0IqqkJ2X0WCsvvIq3kxqkZMHiiWFLBnBXsfIozM7xI8tmR+a2feD2rnNyKfK7EPMh6XmJmpKrnPuRpZsZozuOn7T4yqzvz6aGT+viQO5iGaWmjobuOtguOZxmlJNh9kIntjZuWz5b8DmkuX5Hpqe/oDIITZ0+ZyrKBiK3aIZ+rnExwY8v5OXMY85vfYuJpnEI6Pq3HONRD/xxfBcq2lB2UZFuWZMcHMQmOSYp6MU++xcTTmNFoxfSjeIPJha9IDp7BSFpMaB4Ob4qyg558YpmlolgmAvAObHEIyhlJLahVJ2AriRUJykFhSxzcDll5RIxS/FP2UuRMljrDRcsHGCn6EaqrI4iO0Rr6BkU8TRNvlZlxEHuEya1m5Tx7ooIYqGginqgis4WmrAWFoi7X68KnMEH2iOwteuoTydlmiNGlOkvBgOqkY3yYlNqUmmk5JxrooljWCAcmjsGGngCjZcOtch2hpeoTicuLIxLLK1cji4VjK7MHWo6MsCKBbbGx4APb9UqW1D6xIGwthrLGbiS8lWWioNIs2A02qylLlmLl/NJXRGNX73/xdyH5nX75C//gbhO/MBd1rvMGzhv4KLuBr/qa9+sLv+Tt+k9//dfpd//Rd+hL/9Q79ce//F2nfVTdweOfz/yc5+c+/wzkn4X8M/FR9o/5+XHOGzhvoDeQ9zkCY7sdfRH3+CTvf6mtjFteIKMlF2mikgtfkaJykB0ZaJlkDb5BWcKM3eJQxGreosrKDHyILGnwI/TIUcAmDt+YZrxiZqBJsifqGslpLAOLEcoO0xV68onU2E4RuhQXeohipRTQBkMHR1zIitHuWOTRSDWETaBIygp/aCTZ4oHZdEAaGMnl9hYl80OsW0RkG8su4thKy0AnhG+Q+TYcE2aP2AYlpGtEk9Ax6RYlWZrmPXYmGpgKm5gK21KxXqWyikbDhN1wsaIDzQ+HH6KJhN1HsYxlW50/wnjJGmtFArZSeBdJNA8KSwzaxJk20Z48GrawYzQTUnSElphleSCxMDs80jVGGybWLEuLnB9WvIZuWcKMLZj42J7jfxvzzeETvk5k56tEDUQZejnaFhOvxreZjW8RmfHRh2XKOAKeA5I9QrTWHSE9YyfZiXFIGw6rCKLyGMMPDYoef+GD1d+UTqEPREUw0oKZ1RgxSAkXF894tEQTUhr62C7FjZaZNHNrnblHJHJj05GdnuI4KTTRMTKN2k5ZkGLUjFyjweNb2VxYZqYtSHE/+g1HuORDmBGhYVwnRWTuNe9U9C1SGopRjb/sG55zkj5EqqPvjOLyicA8/PZQ2pPe2yJuMfGt5VOP2eS668a4JQxiqctj3SBC9R2OhvwbhDx0z0key/DBR2bwxMOueWZ3Go7Nz+/oHrPpoSBxjCSbqqlBxonhczBZmrrr8hv1Ziow6olaVxzRk/zOPHibWhX9CUeAzK8UB23NDmkMjxGmbLWFR2gex1bOK6bgtBfcDZwPfN7AwQ3kd339ii94i/7q33zPQfaUPhZvIP8s5J+J/LPxsfj5z8983sDHwg3kNVF5z9t82L63VuNdsvry0jexTeQmtoT6UNQxbpD5LoqUVixy6scZU5+9sPxHiUl3yhXSnDqMBD48HRdM1E4CNmcnj0HYG04VQp4hz7NFBrOTx4jSRGmH7JBc+YqU5MGwoW/5UDKRNCMnz+EIOb/V5VQlnfge0sOx8W1rkNoExTrYI0xuMUq3AyNfSaHbksapq+HYfLBsSiHsPNzy2fbYDHVHWLnjE80xV5w7anKPOWPUo3N/5UFqG+8wZ0cYSNk4gwHsxkEqiEfE1NDJw6KDaY66Ysqib5DSppGKcFp6eMLG5IJ0Vq+7TqbgxmZjoLkGF9cZ0LtIgt2fvBUJ8qCxzJyYe2QSj0aeYOXE2UMlHYId837CZptndpW7yDxy4zHoyN4Yg/aPjjDLp97ptNOUXKNo4bf4XL81xLFl8y2htUcJjkl30LKEGdujWFEXExW2pR2KZVXWREvlhxgx+Yk6QrTqjpemv4+6LM9wxRn0gcgFI+0QAW6DlGiifcyvZM2qid4jxc5MVGMqty5IKAtZ+BDZRCYEVUw8TdKUJ/oWJaFq1DXSxc+cNDRfsFE5EShWZxAHobJDdIWeHJSTxC8oiR7YBWV+iLUg4dyeuIA9lUMkF31ndJbfQeR5uFIWKsYEB/ekWzRpo/sWkUxmbOsQkatvMGfF0hC0LbakIHYXW0H2CKNdmSdf0aN3HCYbPg3CNg2+oFjJA7Ky6wgvKO11aXAJbOWKUdQV3WI0zBpBUKxrHJKQ+eVVxSUWq3Ewv0ha+c2AalG4znXewHkDHwU38Nf/znv7O/4+Cj7K+RE+DDeQ3xGYf0Y+DKPPkecNnDfwLXIDvMPl/Q7on/rIMyTWk77hafpgym6QF0ynZkHiHTcd5MSyQ6SAEmI3iJC8J1KtwYmMyVc/Fu0OOjp2F63Ox7GJL1xOn2UPIxBRxA1KSl6sBRNi2Y7DLjgiy6iSfYRo1U1eqrN0iGIlB+gQEdlKckFllRAEhzk1KJpYbrFw3XUjO0KFzEfVQO9Rkxct3WAV1IFiGeaJAEwXI8HecI+Ywy3JtizJtizJ9pUt2kRp5MVK7QAZjAsuNqQwkdqiJweZ0eyKYkUHUmWQHDuBitVKb7lIsnWISVybWNGA9AS2OFORGtZRBLIlHoh9hWQQ7QOUaEGX7qPGGlVScLGwEbu6OCORXQ+9RjqS8xGiSfRsTBpcmugVZTScpy1si8/120Mcm28Q+YbwCf8TGcIeXOHYirOGX0BbE9waIhWzl+iIR1uN2Y23mDgHBjNjIMd0Lo7dB0V6GjJnVBGMWUyjHxqd9kY8w4rRwsF+69u4hNb72NoxJJ4zqE2UfnDJT0q+Ik9xjfRRxNP2vBskl+bOaykVEzMs+iipmFJs1lDQ3A7JlU9MHKOws5a4yCNdY+vQi8zosY8wuVvjITMZIEdEEA+Eb+4IlSMiNEfwGOdzUcSm8yFnGnmOyAeifs8Ru+NSFmwtbuHjaePnWeQyKMotMiGNLY275nQht2+D/XkJZ/aIUxdhIJ6W+itkfnrysYK0tKpIjmchnD2TI4wzFk5H6p7Fck7qivQX6Qc5nj3i+pyDDlQn7HOkK+dfkIiZePJ44uaLdD3PtA4ZiNw6hoIk2AQ0ZkO641I/MJnWMO7c5w2cN/DCv4Ev+ZNf/8L/EOcn+LDewPnPyIf1es/h5w18c9zAegZvc32Vq7AhvOnldZBcRIyXxCf9Ux9P0Bc+kVzeBZ88mX/338qTz4hr5LRIP1ZZWgAAEABJREFU2OgLZ254ptMPIxWBaMNhqbgYJdUeYXKrUd14i4mf0XLy7nnG52Nkn7eYj4NlP2ntqFk4rLUrpgZDZDOBOH2QbMrybHRXv0Ioj8ROH6VE2YmCdBKSK5mYeDFmUsBOJXk2ZG4Iuw8BjmciRZz20Upf+RYRSLaewsfIvNTwOZgQUsaEYs5unHmpOcJoz2wc0dqJNzN5Cg7E5+g+A/SC6Q07QCbSQ2dy2OB4YnYC8j1wg0zPTsERclaKmTr6jzha80FmUNgdl7FBUjmYkAJ2Z05sjkJ28/35gjwTZiq1ACMzMCO2OJ4MtcdQVMzsVtGbisFRwh8ak5o/QjSmk+YYpmbcwndIrhykGB82bOETn8sH4wvHgLZolJUnXs1yY28w8TSaGq0o6lC8wcTPYDSyLUYJnwETwwz34PWWimKZCMA7gK04g8xE1gVHwgbZTYB2nQYnFhZtRUnl0gU1FqUjeOBvetOEoVuWQBzbyg+cbMPZK0qKhIkVGdBA32KSQl/RRJ7KwMUjsmHWBonLJyZezcq59h1UdOwAlR5JIytWIsGHiWUse0V6yh8hOZsOzL5GutHYEo4sqLEgbKlOGrgj0hClHaZmWiC5A/SiW2o4MXGMx5EIiji2tPAdjkZ7IjmxfBfVjMXCsZXWYIKgbTnpIIFtsbHgxpaaR5hczJL5ZQgA1WUiExkE6k3gRpJtSZZN55OguqBgOL8KQtiiKBtkWxLGnpi6hCjsRIxLSX5VlRq5fomfTKZznTdw3sAL+ga+/C+9W296ywde0J/hfPhnvYFvel3+Gck/K9/0CWfneQPnDXyk3IB5kCfYfMkjigIs73aluPECSYIYr3KC0NUI2M2BdtylJjRnBVFbJlmDb1CWMGN7VNfQRdZxoBQHWzEzV05QXrRGPFHBjS18RUbSYEm2ZemZTSzbox6EyjbgPaLZFmL2HsVKCtA9JOeZLMIVLuEt4e9a0snvUIqkrOiPLIXJ7zCCZZsJF7MMF/4a1VUVx95wUw9llgEdIVr1DdpGcjqKiWzLKMAeo63mkcO7momETaQ5kV0v+4KtMj4aSEQeT4xEwCYWtvIS9EdIztioskRsbKBYgwmtc8Uyxr7mipDcQ6SgeZAZ7TlAe+aTw/ZMGtx7pMdi7RClfCJxmuxwyd6gBL+YWDNdXbIG36AkGLbgYPVetIkLn9gvAPkyUFlbzC9kKydZXsz3ifnl9AijXaxVNFYBF84YvsGMR4mO9awj5AuDsZOkfhB8eCczaItQsvGzeoSLp20JiwtfcQZ9ICqCW8vs8BVnDXD5UCHYHEX0YC9FEzez86nGTHLog/OpiHv8cNuSnpN0gmPsFNJbZD6zhhJ/MQr3GUrZPfMaW4uYc2M0Uhfh+pnHfJKUJL/lnYK+RfpDMarxt7wiLt+0AxSMysGJLw80cuE1qrcInYdTF4LRjr/wksVdJ8O3lrrwiQ1x3XVJdDas2PMheawkiyvnrohTWJ3i5TOuiNa+u5juYSnJuMwKXvPMjL5DisPHzx9zwnsgz3aEaJmxzIYmDIDNbLDyhTObEzgqdcwPpKQ4eWrCJwYYkLZU7jBlDEMnYu+SqIPzb3p3A5o43QvlBs7nPG/g6gb+r7/13ivlpOcNHN/A+c/K8b2c6nkDL/Qb4I2Rj5AXvxjhuidfXh4XzKtgaprGsfv+CI53YJKpLSdmhwIty/vk4JxMTXmSvF+WFhORJ04q0R7D0glSyu7sYFqCOWMg3QR5tqFtOTENzYEZQikQPbMnJsSyk3+IOYSCzAQ664LMa36LZKNlMBjIo6DOD0hUcYOE3dXroFtMfMci54Ad3mlHTunOQna9EJ47Dzs+Mzw1GJ8yExoluPCwdBwg7ewmB84uzlg5MRfLRiHOuYtlYmOCC3Yc9ROTw7KZwPMNffAo4VvMM4SDnNfsirMraSZNuWdBb3GUx2cMJTSyJxkcX36IaW0DwYKEy16ku0iC3QdbkSAPHsucO5j7THoxupawuPA9cmczW53ZVW4wn5iKbHL56Mt5pdU7aPfoUZonGNjptG8xMQOqjnPCGjUgP/E5vgiUbZmBtifqAc4aKizVX9CTD2zW9WK0JOsQTQYT1vwWK5I/RKNaql9QrMRA9YHxgmdruy6lQ+0DEG4x8T2jVMmB9hw20Z6cXPbC9mg5SXyRHhPrLoqUcdkTU5sQEwbVYmI1XtEjpw0mvmuamYk+QjR0sXoWcZBG2SG6Qk8OykniF5RED+yCksqlu6i5bKuhR4cdxLaYeDWqG08EtPIQjHa8dIUp24ojbcos1R8gksmN7ZQl3CNyxM4n3iGJcE9Mo10m25J8+QG3NPkWE0+jgC1KdYye+gYpts0Ay74YRBYrGqAVpaFPlAaXwGY2qC6jJLANWLY3mHByQpLq3++SmiHDJSXmF8Fi4phYRRxbSTq/GkLYT8Jj+e2BQZ3rvIHzBl7oN/CPvvp9L/SPcD7/N9MNnP+sfDNd9HnMeQMf7ht4sjmgMS95lby+3eV/SEdyndEt5V1SQUKxGtahBhmWmoQYokJFvEOE8iv0lideTTO6g46O3UUr59lHiCYsOVDFzEITa/JFXzEpLNtx2Ir0QCkdir1FT32LVKfGAxNSJE2urMR38SgZ7Y5FznDQEzVx5ZamNHDhRWt5xqLCLd3FZpRlahY0QQyomjgWEszsgY4ke4OJ75pGrSdKg0sbJBYrNQNESCRwRCYSa2C8B+NckbMXLpZVqomWyo9QLHRNcwKjTXTRCNgyJNpqpBofIRpteG1LlIXOljIzAcgutxEwG5RlW5JlW1n2FUbEpqyR1R109XiLRZNR7Hppoj04gETspEwc3Jg0NOkO0iMp3tJEF/fMUtTABp/jlzG+YeQbQfH9IL8SDk5cHiSHiKducv5HdXmwPbC7SE9ymXGFGYgUqDEOTOHoKa9j/iMklwq6iHhwPFMIUBtcY1M4OvoAhDukqfwZkFYeOh6gPlF6weUbXcLukeVZJiuntsojJMdwNh3Z5ZdnzzmVyPHRqUtuGH5wEq0p5kQMAR/lvjGzNY8wudWobrzFxBV5lhHnmSHj3Pkcg3M55RtMiGWTCtBXoIW5hJ234jhjfHbyNDW/QRpJp65NxBOBkSOgtYk7yLhZlAJm5akQE2XGMTKRmpYOl1JE9hgzOd3lV0hPPgsqdS0o7nhqYpwzK2DMxyPhiUmwZ294Jkwk0TNWJEfj0J4S50ZSCzJ8d1YI3QGM4dSEAxdeGZUZPA0jIlxxcnkWktmUJc+UVU88jAz5xMzproswdE6eQ+Dkwmv5V7/hlJ77vIHzBl7QN/Cud5//t/yC/gn8Znz485+Vb8bLPo86b+BDewNX0/Lr/mJJJQbzrghc3v14/eO9L++V450xntpsaknp+YnJhKd2IINaFyTbuiCcgtZdIVmOpin61pBGbnmeI0RrXZDqxJzJ7sycd9dyFoV0jVoesbUHSAHVnJEclp3aW2QaM1PZPPF9pLv5O4jcQycyOWNh+ZBAk8T3kNltWHH20LLOSi584jIqtJ+Z3B4RSPYzUfwYczr1HNvzJkaJ0Z6d8cUE0TNzxXlWtafGnNeaiTkvfIfkyoPjqeLX83iSnNVse8mCx3wMGunUhVPZYQfI7O40UENHix5iGqaljYbuOmZcMGcjsHOPowXCDm9v3LR+RuId0lS+ItOpYTIjMggegk2ZSgi+WcRb5NNVJxPcGEPZM1+d+TcYbVrOyZhHmNw9y+zkVmRu+fgM/SPA/RYSvmLi1cz3hcK2mHgaTY1WnLXeYHLhK5KDM1RIqwnNw+FNUXbQk08ss1QUy0QA3oEtDkE5J6kFteoEbCWxIkE5KGyJg9shK4+IUYp/yl6KnMlSZ7ho+QAjRT9CdXUE0TFaQ9+giKdp4q0yMw5ijzC51aycZ09UEAMVTcQTVWS20JS1oFDU5Xpd+BQmyB6RvUVPfSI52wwxulRnKRhQnXSMD5NSm1IzLedEA10UyxrhwMQx2NATYLRsuFWuI7RUfSJxeXFEYnnlamSxcGxl9kDLkRFWJLAtNhZ8YNe95ZLFwrEbB1GIjQmzsky0Q0+Ww8nZEayCJkLYguoGxXKMXzVB53fygRKuuy6/ClYaDk2s1KZuNbRznzdw3sB5A+cNvEBu4HzM8wbOGzhvYLmB+W7Xd7pFC059fYGcWmVcd52UmoQLilUOsiMDLZOSEMsaOigPfohCTX4ioaN4y4nLj9DKOfYWE0/TNWYGmiR7oq6RnMYysBih7DBdoSefSI3tFKFLcaGHKFZKAW0wdHDEhawY7Y5FHo1UQ9gEiqSs8IdGki0emE0HpIGRXG5vUTI/xLpFRLax7CKOrbQMdEL4BplvwzFh9ohtUEK6RjQJHZNuUZKlad5jZ6KBqbCJqbAtFetVKqtoNEzYDRcrOtD8cPghmkjYfRTLWLbV+SOMl6yxViRgK4V3kUTzoLDEoE2caRPtyaNhCztGMyFFR2iJWZYHEguzwyNdY7RhYs2ytMj5YcVr6JYlzNiCie+YZ80O0eBi9QtAvhzkO0H+NzH/m5k9YpIj5tvKxreITG30YUzg282ppjnZI0TLmaRH/ZZX7KQ4WJIJN4gaJYbKgcOHQ9jXHGnZ16k+CMktpiY8mLMaQ4KUjocmWDlxNiWBx7YU5c6oXGZwThX4HvOp6Omu4/gF6WfTgqcOOcGeM636BimCcSIBfsSLZ061ifSyOTO1aBD2niNczgxJ3URmpTjTjzFzmyVYkH5YNlMCq93wy8GjZsepDt8ZZeUTgTxi4C42uThmNtxi4lvrp4mcweCFM6B8InFLjpBEHjc3csFRuP6bC2qaL46IybDUhV9s6Beemam6YJ+Sn6qo1JHIOTFENvrUIJzBxHDgwukrn0hMF/6Ij8w4dclHG9Zzc0roDVIffWs55YhHf34mAptZ4+yIF7toaTztBXMD54OeN3DewHkD5w2cN3DewHkD+S/7cgvjfY4g732BIu97vLvyFskmjhaY2J7w1IB9FyVmU89Gy6hygoGIbLJ5HY6aaVeYgkwPtpL8HpNJRZob49iduUeqEPJsOX+Lozd5rCTIURTSwoGTkytfkRRl2UPf8qGsncxq3Q6pKaeK8OChx8DW0J0agOPjRy5R9TrYI0xuMUq3gyJfSaHbksapq+HYeebxeBB2Hip3e4tV5sgWMm7ByvANkmJXKHLIEeasVU/NYnQuuQvmGZIYSOk4kwHsxkEqiEfEz0zo5GHRwTRHXTFl0TdIadNIRTgtPTxhY3JBOqvXXSdTcGOzMdBcg4vrDOhdJMHOz1/b84BbixgO5v6YxKOlITCwGm5hj7GfsNWtY3aVuzjPobjnF6MNY9D+0REYxdOOfGbTAo9Ha7RVo285A1ozMWnCzAQ0/w5AjW8T+VaQrfFNIxrEyg/iAxQr2cWUmjTvUCwqDFQHiWeZbjFJoU/UEaJVd7w0/X3UZXmGK86gD0IuGGmHCHAbpEQT7WN+JWtWTdvsDY0AABAASURBVPQeKXZmohpTuXVBQlnIwofIJjIhqGLiaZKmPNG3KAlVo66RLn7mpKH5go3KiUCxOoM4CJUdoiv05KCcJH5BSfTALijzQ6wFCef2xAXsqUzUDsmF74zO8juILNoKE/fck27RlBvdt4hkMmNbh4hcfYN9xHASI7aCGWATCzvEVpA9wmhX5slX9Ohltlg2fJqOkJrqhyhZYxVx7AoXHJFnpddsIss2CrYiVOFBjDB0NaQ1Tm7hKyKylaIFE9fEijjMq4Z87vMGzhs4b+C8gfMGzhs4b+C8gRfIDXg+p3mby//6DUZynMR7peU95k+CrHpSyW9Rmi232ERkixGSBuIVXhSeM/BErbiPTh67i1bn4tjEFy6nz7KHEYgo4gYlJS/WggmxbMdhFxyRZVTJPkK06iYv1Vk6RLGSA3SIiGwluaCySgiCw5waFE0st1i47rqRHaFC5qNqoPeoyYuWbrAK6kCxDPNEAKaLkWBvuEfM4ZZkW5ZkW5Zk+8oWbaI08mKldoAMxgUXG1KYSG3Rk4PMaHZFsaIDqTJIjp1AxWqlt1wk2TrEJK5NrGhAegJb3KQa1lEEsiUeiK09kkG0D1CiFF26jxprVEnBxcJG7OrijER2PfQa6UjOR4gm0bMxaXBpoleU0XCetrA9ipUKIHXeojT/DsB8k4jx62O/O7zGfoPYDN9OPgPy9WK+3RyWufRkZvXwYYwd82Zu4YjsikhPw3wg5gdSTTnT6Y+AXo7C2VWC0SbmGVtcTuIBtnYMiaeN+kTpAZf8pOQr8lTXSB9FPF0ejPwVJ5fmzmuKyokUk9ryS9w2Cm6RmuoTE8cozBlVE1fjka4xuXl+69eY2l1u4UysvkcePJMBdCKCeCB8c0eoHBGhOYLHOM+iiE3nQ8408hyRh6V+zxG741IWbC1u4eNp4+dZ5DIoyi0yIY0tjbvmdCG3b4PLPVNNKjXDVs6ZrbnBVqBOZCadzAjHeBYkeNTJETprRXKpexbr9VF/gHmIZBhLiO+OwrkotPQ5yjhrYNW9Ti7Ph5hNGTOYVVKshGNT29ETqUQcM1M/eDyNT5a/5494NFE7Y/pTlc7Tzhs4b+C8gfMGzhs4b+C8gfMGPmJv4ObB+t6Yd7u+z5Eu8o63ReK+Gy641JfnlTD1W8yc8CBviaRHP7y95MDl7CBVlNQnczF6qz7C5FajuvEWEz+j5WQ+F9XzeXjW8g3yMTgCv9GoiZDPgtreFclVP0S6qt9BZB6JzYnddagD85wcNjkalTl3NWY3BkctpamhdOXkKq1ITfJYZkfeIwnEfiYaH2NO70mpDCkyodi5OS7z7mFyz2wc0dqJNzN5Fg7H5+g+A/SC6Q07QCbSQ2dy2OB4YnYC8j1wg0zPTsERclaKmTr6jzha80FmUNgdl7FBUjmYkAJ2Z05sjkJ28/35gjwTZiq1ACMzMCO2OJ4MtcdQVMzsVtGbisFRwh8ak5o/QjSmk+YYpmbcwndIrhykGB82bOErbmamIjOTA6HqHwE2n/5i5ntCYVtMPC3fXia74qz1BhM/gzGGbTFK+AyYGGa4B6+3VBTLRADeAWzFGWQmsi44EjbIbgK06zQ4sbBoK0oqly6osSgdwQN/05smDN2yBOLYVn7gZBvOXlFSJEysyIAG+haTFPqKJvJUBi4ekQ2zNkhcPjHxalbOte+gomMHqPRIGlmxEgk+TCxj2SvSU/4Iydl0YPY10o3GlnBkQY0FYUt10sAdkYYo7TA10wLJHaAX3VLDiYljPI5EUMSxpYXvcDTaE8mJ5buoZiwWjq20BhMEbctJBwlsi40FN7bUPMLkYpbYq4llmCcCZTueQ6OuOKtSVB1Oji3h2CA7+ZhYIFvCeThpi8oyzqguiqiWXwgbi0XOCPzb2SHBUc993sB5A+cNnDfwkX4D5/OdN3DewHkDmxvIC2Pf5+a7XHhe7kpx7NBhkLz/hSRMLRgaC83kPVqDg0nK9QKN3eJQxGrealUcYUkwM4PVCcqL1ognKrixha/ISBosybYsPbOJZXvUg1DZBrxHNNtCzN6jWEkBuofkPJNFuMIlvCX8XUs6+R1KkZQV/ZGlMPkdRrBsM+FiluHCX6O6quLYG27qocwyoCNEq75B20hORzGRbRkF2GO01TxyeFczkbCJNCey62VfsFXGRwOJyOOJkQjYxMJWXoL+CMkZG1WWiI0NFGswoXWuWMbY11wRknuIFDQPMqM9B2jPfHLYnkmDe4/0WKwdopRPJE6THS7ZG5TgFxNrpqtL1uAblATDFhys3os2ceE7JFc+MTGWgf0CkP/Jmy8Dp+X7xPmtoa4xuYs1S3MVcOG08Q1mPEp0jC8dIWziHLTyEvRD7GQGbRGa2gCYcQ0Xdy0sfMUZ9AFoCm6NmePhqYtOyeAEKyfOpiTw2JaiiZ1BDOZTjdlbzl2Q62MMty3pUUknOMZOJb1F5jNrKPEXo3CfoZTdM6+xtYg5N0YjdRGun3nMJ0lJ8lveKehbpD8Uoxp/yyvi8k07QMGoHJz48kAjF16jeovQeTh1IRjt+AsvWdx1MnxrqQuf2BDXXZdEZ8OKPR+Sx0qyuHLuijiF1SlePuOKaO27i+kelpKMy6zgNc/M6DukOHz8/DEnvAfybEeIlhnLbGjCANjMITKWI5JnbkiqQsFsTibPmPxOveipKUabBoxaguSAwSHszLjYkkxisUVLVbQLjxJ22gvkBs7HPG/gvIHzBs4bOG/gvIHzBnoDV+90vEPytsmrXXSMfSmDsEmyqaK275LRsNDU7jF1Vce7ahsmD8CpIIpnyIyATSaMIwOUsDsrSFH2yvNenvNXJHvh44zm0NOUGYMznMJwomQDT0d6UpgZt8h5zW+Rqmg5CAw89RBauu8WJ3HHIueAHTKtfGLiGDSlOwtpDsfuzwLPHRyfOeIwPmUm0BHeiskL6AdIKTvFI8/swee0cKw/VxvM2bFMDKbngh2Xls5sLoXYEgeh5Ec0T5s8LDqYM6OuOLuSrg4nnumeiXxB0uGBIBPHww2Cpxk/xKM4ndG3mHjadeqGI7D7QCsS5IFjGXMHc59JL0bXEhYXvsd+QvITmd3oBvOJ6cwmlytYziutzhh2+URg/1FopLT+gjlxYeOcsEYNyO+QTPktHvwdgM4Xg9gRRruYUuV65VvLRvAbRGv+CBWxHXGwLffg9ZaKYiUGDjhSEhe7lA6tD0K4xcT3jFIlB9pz2ER7cnLZC9uj5STxRXpMrLsoUsZlT0xtQkwYVIuJ1XhFj5w2mPiuaWYm+gjR0MXqWcRBGmWH6Ao9OSgniV9QEj2wC0oql+6i5rJn5UQ7HLOldIfvTFK5VBRr5cTZtAd0hSnTRhxpo1iqP0AkkxvbKUu4R+SInU+8QxLhnphGu0y2JfnyA25p8i0mnkYBW5TqGD31DVJsmwGWfTGILFY0QCtKQ58oDS6BzdxHZrSqSNRyXLk1wCSkEkI9MrGST9Ehkk9utSMeTXL+zbHOdd7AeQPnDZw3cN7AeQPnDZw38MK6gb4E9pFH5L75iRfLRpbYdU7khHWyg09ASQmxPT6REFK2RSS2teoiXq2VsDvo6NhdtDLXPkI0YcmBKmYWmliTL/qKSWHZjsNWpAdK6VDsLXrqW6Q6NR6YkCJpcmUlvotHyWh3LHKGg56oiSu3NKWBCy9ayzMWFW7pLjajLFOzoAliQNXEsZBgZg90JNkbTHzXNGo9URpc2iCxWKkZIEIigSMykVgD4z0Y54qcvXCxrFJNtFR+hGKha5oTGG2ii0bAliHRViPV+AjRaMPrqKSpzExgK6FwNgJmg7JsS7JsK8u+wojYlDWyuoOuHm+xaDKKXS9NtAcHkIidlImDG5OGJt1BeiTFW5ro4p5Zihq4QTLVb/E5viuc3zgS8esZfn7bOCO+nmx0F/OtIhXpTc0GMxgpUGMwmILRU15H/yMklwq6iMQarJxxt9gSHJk+AOEOaSp/BqSVh44HqE+UXnD5Rpewe2Q3zxaV2iqPkBzD2UzILr88e86pRC4XsMRBquir32BOxCjA0/LAM7PZR5jcalQ33mLiijzDiPPMkHH2fI7BuZTyDSbEskkF6CvQwlzCzltxnNFPnQas+Q3SSDp1bSKeCIwcQUfj2C24QsbNoiSYladCTJQZx8gkalo6XEoR2WPM5HSXXyE9+Syo1LWguOOpiXHOrIAxH4+EJybBnr3hmTCRRM9YkRyNQ3tKnBtJLcjw3VkhdAcwhlMTDlw4vTwFrcmT3XEy4ViehaLsiFfIxNGOTsAmoC4bwk7EoaOQeYMncWVLrsXk2KM2voQZ5z5v4LyB8wbOGzhv4LyB8wbOG/gIvIHjR1re70DeNnmpq5/I+102ubz+jXfOpCJukdGRsLxnpnxFGtu3QUI254zCEev5gcwgk/YHPGdjOZYZbOrpSi8k5921TE3Niswpv0WGUoWec7DszL3FnM3hVDefeVj7b5BuNDaD03fFoYyJJ5/NXHaioYc8sDGY8lkTSCPIaeiMTk34xKRjoeOZR82Ft5gUSGE/413MEanbY5QYbdnMSn6eU+jToYMcnDOezZjT+onXs8rJrcj8xDxFnqdnJGZGqp7O08yM0czzhtNZfoDM7s58auhs0UNMw7S00dBdx4wL5mwEdh/kCtsbNy2fLXU75JzyFZme+o7OQDhx9pSpLBuI2Kod8unKyQQ3tpyfM4cxv/ktJp7GKaTj03qMQz32NPM09NaDzE0lj9YIpKQ6MkhdtTjpOefbQj7vHger5yvMPaodyBeEsGVTafLTNBFZMYUPhy+Z6D2WWSqKZSIA78AWh6DOJ7egVp2ArSRWJCgHhS1xkBm6wYgYpfin7KXIcio7iwh0lBuUbOPYN6iuyAmO0fQ3e0GhTdPEW2VmHMQeYXKrWXkOe6KCGKhoIp6oIrOFpqwFhaIu1+vCpzBB9ojsLXrqE8nZZojRpTpLwYDqpGN8mJTalJppOSca6KJY1ggHJo7Bhp4Ao2XDrXIdoaXqE4nLiyMSyytXI4uFYyuzB1qOjLAigW2xseADu+4tlywWjt04iEJsTJiVZaId5lA028iW7YkAe1CjDzI4cbYl9nAJMEexWDi2jng07AnW/BaXHmVB2InkJ4XTnTdw3sB5A+cNfKTfwPl85w2cN3DewNUNLC+QK84873nOe6Dh5PK2Z0OysaaCI41/oqQl6wZlCTMWVFeY1yiBk7fwVmbgQ2RJgx+hR44CNnH4xjTjFTMDTZI9UddITmMZWIxQdpiu0JNPpMZ2itCluNBDFCulgDYYOjjiQlaMdscij0aqIWwCRVJW+EMjyRYPzKYD0sBILre3KJkfYt0iIttYdhHHVloGOiF8g8y34Zgwe8Q2KCFdI5qEjkm3KMnSNO+xM9HAVNjEVNiWivUqlVU0GibshosVHWh+OPwQTSTsPoplLNvq/BHGS9ZYKxKwlcK7SKJ5UFhi0CbOtIn25NGwhR2jmZAIzuaBAAAQAElEQVSiI7TELMsDiYXZ4ZGuMdowsWZZWuT8sOI1dMsSZmzBxHfMs2aHaHCxOpM4mIG2xcYsscfvAFS/K8wXhBjfEE4OTB7tCRQMRH2E5PKtI2V849i2C1Yc540wxVc8iWlkxwB8qgrNJRrZRKst0ooz6ANRFYy0YGY1RgxSMh6WYOXE2ZQEHttSxF2lcJnBOVXge8ynoqe7juMXzADy0ES0BsgXJjKt+Q2ShnEiAX7Ei2detYn0sucsNAh7zxEuZ4ekbiKzUpzpx7g8wxbpD8WYgr/sG345eBTtONXhO6OsfCKQRwzcxSYXx8yGW0x8a+Mzp5hcd12EfkDYwARYHivPsEOE8h1SXD6ROIN6HtNvMdlhpGf14JndKTg2P0WjO/92orUUJI6RZFM1NUhn3eKYnSTVGZPwDo6KcWr6wi/Wc9MdKROKOHaqk9rZUpN8bOErIrLX3l1zEteWxvzXgIPk2Ina1uB0L4gbOB/yvIHzBs4bOG/gvIHzBs4bWG6Ad9nxLpgXO4zdFNh3TzDvt9EWvmshkb+CGphlvMmmhxfE1gWT3GEKqENLKtE1LhUpaYxj94w90o2QZ8t5Wxy9yWMlQU6ikBY+9uTkylckRVn20Ld8KGsns1q3Q2rKqSI8eOgxsDV0pwbg+PiRS1S9DvYIk1uM0u2gyFdS6LakcepqOHaeeTwehJ2Hyt3eYpU5soWMW7AyfIOk2BWKHHKEOWvVU7MYnUvugnmGJAZSOs5kALtxkAriEfEzEzp5WHQwzVFXTFn0DVLaNFIRTksPT9iYXJDO6nXXyRTc2GwMNNfg4joDehdJsPPz1/Y84NYihoO5PybxaGkIDKyGW9hj7CdsdeuYXeUuznMo7vnFaMMYtH90BEbxtCOf2bTA49EabdXoW86A1kxMmjAzgZ51g9Q0D975HYDiy0G+HpSKnr4sXx+GrygWFQaqg8QzrVtMUugTdYRo1R0vTX8fdVme4Yoz6IOQC0baIQLcBinRRPuYX8maVRO9R4qdmajGVG5dkFAWsvAhsolMCKqYeJqkKU/0LUpC1ahrpIufOWlovmCjciJQrM4gDkJlh+gKPTkoJ4lfUBI9sAvK/BBrQcK5PXEBeyqHSC66La1IZ+M7iCzaChP33JNu0ZQb3beIZDJjW4eIXH2DfcRwEiO2ghlgEws7xFaQPcJoV+bJV/ToZbZYNnyajpCa6ocoWWMVcewKFxyRZ+VAUzPMHqjilIXG1oKJ75lYyQEpV1x5HL/Chd8xVxfL+ZUWBrIRBMnWuc4bOG/gvIHzBs4bOG/gvIHzBl5gN8B7pfMmB2qixYK7XLKtrELCaeH5a6CDQisSBD1RExdejLZaK2B30NGxu2j1PByb+MLl9Fn2MAIRRdygpOTFWjAhlu047IIjsowq2UeIVt3kpTpLhyhWcoAOEZGtJBdUVglBcJhTg6KJ5RYL1103siNUyHxUDfQeNXnR0g1WQR0olmGeCMB0MRLsDfeIOdySbMuSbMuSbF/Zok2URl6s1A6QwbjgYkMKE6ktenKQGc2uKFZ0IFUGybETqFit9JaLJFuHmMS1iRUNSE9gi5tUwzqKQLbEA7Gv0Bo6FSTtDUqk4NJ91FijSgouFjZiVxezE9n10GukIzkfIZpEz8akwaWJXlFGw3nawvYoViqA1HmLEo+irB1SUw7O3wE4vlGs56vBp2JqVuN/OzfeYmKO5X9/51tQ0nwTGRI9yAlDHN9dEqMkecCZM1QCqminkHnQ6OUozKgSjDYx57e4nMQDbO0YEk8b9YnSAy75SclX5CmukT6KeNo8GPkrTi7NndcUlRMpJrXll7htFNwiNdUnJo5RmDOqJq7GI11jcvP81q8xtbvcwplYfY88eCYD6EQE8UD45o5QOSJCcwSPcZ5FEZvOh5xp5DkiD0v9niN2x6Us2FrcwsfTxs+zyGVQlFtkQhpbGnfN6UJu3waXe6aaVGqGrZwzW3ODrUCdyEw6mRGO8SxI8KiTI3TWiuRS9yzW66P+APMQyTCWEN8dhXNRaOlzlHHWXSSX50sLIWXMYBbN2XAmlROmoDGuu24UJHcZMrTwraUm/0oX5BQGUtZ8wjELH4LaKAWnnTdw3sB5A+cNnDdw3sB5A+cNfGTdwP2nyXve8r5HnBfK8a6Ztz/e79AG55UPyktfSiDscuq2SEHqUalrorjwYmoWo6TaI0xuNaobbzHxM1rOzWdaMZ+DXm5oPDc8MZa9avQsPBXRVyRXfoh0Vb+DyDwKOx+qE+NQt5yYCi5y6IkXY3YbwH6KlCYHrpxcpRXHmNDMvMU00z0SlMAZ0M94gzmd2o6krnvLZ8wsUp11g8k9s3Feayfm3PAVOY8D8JxFTZ43uQVbS/YAWx192uD48gxJ3zX2MM66g5xLEp88/UQ3HC0ZTkoqByQscnSRkomZk5AOwjZMbC2uP0/Pih2VARxJD5SRW845EXmAqtQEc0aQ4mYGR0n+oY1zKKGV2W1ZkFymbbWF75D6cpBB+LBhC19xMzMVm9nQ3TMc8fk7AK31B18NNl5RI+cNJn4Go5FtMUr4DJgYZrgHr7dUFMtEAN4BbMUZZCayLjgSNshuArTrNDixsGgrSiqXLqixKB3BA3/TmyYM3bIE4thWfuBkG85eUVIkTKzIgAb6FpMU+oom8lQGLh6RDbM2SFw+MfFqVs6176CiYweo9EgaWbESCT5MLGPZK9JT/gjJ2XRg9jXSjcaWcGRBjQVhS3XSwB2RhijtMDXTAskdoBfdUsOJiWM8jkRQxLGlhe9wNNoTyYnlu6hmLBaOrbQGEwRty0kHCWyLjQU3ttQ8wuRiltiriWWYJwJlO55Do644q1JUHU6OLahuUKzWDrSs7LqGOGUFj2zJTUxJBuwwuWnViRckPPd5A+cNnDfwobqBT3zDi/S9v9vL9NKXnL/IfGju9Jxy3sB5A+cNHNxAfonNS+UBenkPNH1Yyoi0R0++QZky471BTX6FlLAjkpfiwnNGsJygvGiNeKKCG1v4ioykwZJsy9Izm1i2Rz0IlW3Ae0SzLcTsPYqVFKB7SM4zWYQrXMJbwt+1pJPfoRRJWdEfWQqT32EEyzYTLmYZLvw1qqsqjr3hph7KLAM6QrTqG7SN5HQUE9mWUYA9RlvNI4d3NRMJm0hzIrte9gVbZXw0kIg8nhiJgE0sbOUl6I+QnLFRZYnY2ECxBhNa54pljH3NFSG5h0hB8yAz2nOA9swnh+2ZNLj3SI/F2iFK+UTiNNnhkr1BCX4xsWa6umQNvkFJMGzBweq9aBMXvkNy5RMTYxloW2zMJLNNPFCW5u8AnN8i8hXh9tvGqvlGMTq4cLH4AhKPEh0rP0J6x06S+kHw4eO0ocKHytzEwMoTT1tSk1IyokXvgyBtMfFiaUi84lUtNKnAiiX33HrwKNjMzqfjK1h0atAH59MSZ/aFryUEyRdGK2HKgcnbBd0i8xk4lPiLUbjPUMrurGtsLWLOi9FIXYQ808Qh4sPHORRteKfAt0h/KEYX/pZXxOWbdoCCUTk48eWBRi68RvUWofNw6kIw2vEXXrK462T41lIXPrEhrrsuic6GFXs+JI+VZHHl3BlxCqtTvHzGFdHadxfTPSwlGZdZwWuemdF3SHH4+HljTngP5NmOEC0zltnQhAGwmfvIbE7gqNQxP0B19tAZk5roR0Z61BIkDwwO6V/dB0YbIlH41pB2uSue0kiLLXzBRT/xI/cGzic7b+AFdAM/6NNfrp/5b79W3+lTX9Kn/nbf+sX6Yd//Ffp+3/Pl/WIwXw5u7ft895fpB/7LL9f3J9+GK/f61z6n7/WdX6ZPeP2LrjLfsvTzfs7r9Qt/6uu+ZR/iPP28gfMGPnZvoO9xOHbeN/sqON83eRutNDTC1lwjVdU32NuEg/ExuhjTwgOkkN0sjs37cDqGuOV5L+/j4didVcQ1FyUxmCGjdzzBwpmabODpyKwUZvYtMrf5LVIVbRw85idGHoTgmiN1V6+DbjHxHYucwTu8046c0p2F7HoheX708ZnhxPnZ4FNmAizaUCIMFh52hSTZFQfOKZyxcuL+3GwwZ8cyMZjaC3ZcWniWGacQa91EgHyU1GwxzxAO5sxUrTi7kq4OJ57pnol8QdLhgSATcxg0TQnBJO4apc1tMfG0tCe8iyTYfaAVCfLAsfbCDzD3GXmxWbXQm6ca+X5CaiZyRqMbnJ+dpp6zYDobkwehu0e/5pmdsj1uGXN40tQ0akB+h2TKj5BENs/PGHYIdUTZ83cAii8DfWNVXa98i9gIfoNozR+hIrYjDrblHrzeUlGsxMABR0riYpfSofVBCLeY+J5RquRAew6baE9OLnthe7ScJL5Ij4l1F0XKuOyJqU2ICYNqMbEar+iR0wYT3zXNzEQfIRq6WD2LOEij7BBdoScH5STxC0qiB3ZBSeXSXdRc9qycaIdjW0y8mqTGDAgCFx6C0Y6XrnCUX8QRmTJL9QeIZHJjO2UJ94gcsfOJd0gi3BPTaJfJtiRffsAtTb7FxNMoYItSHaOnvkGKbTPAsi8GkcWKBmhFaegTpcElsJn7yIxWXaFWLjXOmGex/KqVOuHYNLP5RW3LE981sdpIhZW/4wWB/QQOkGIrpKhznTdw3sB5Ax+6G3jnu5902Dve2X+DoX/9B71SP+VHvlr//k98Tb8YzJeDW/sP/63X6qf9uNfos3/sq9t37X7ED3ylfs5nvVY/9oe+8jr1Lco/+Y0v1id9/EfWl5LfohdyHn7ewHkD37w30Jc4XHed7ImaCDQ0vy4TJz14HtUq1x5hWnWVTa/H6OSxu2hlrn2EaMKSA1XMLDSxJl/0FZPCsh2HrUgPlNKh2Fv01LdIdWo8MCFF0uTKSnwXj5LR7ljkDAc9URNXbmlKAxdetJZnLCrc0l1sRlmmZkETxICqiWMhwcwe6EiyN5j4rmnUeqI0uLRBYrFSM0CERAJHZCKxBsZ7MM4VOXvhYlmlmmip/AjFQtc0JzDaRBeNgC1Doq1GqvERotGG11FJU5mZAGRTZ9m+oCwbLsu2suwrjIhNWSOrO+jq8RaLJqPY9dJEe3AAidhJmTi4MWlo0h2kR1K8pYku7pmlqIEbJFP9CElk90GTD7ngc/n2ku8T+Zay/gD5tpBvD9kjx6+R7QERslcTWnI7HATf5DFWJV8UK88ChEe+QXLVx7ORToBFJzEeFv4MMS39AGCfHbzh0TCm1e+Qs/q0j5BcZnY+zUc4S3hmdmsG4tPKR+SU6IkohqHXR7lva08n0XOAqVmNmY23mLgi/SMen4E4J8/nIQnLFUXfYEIsm9LAqCPqnBukv4UTiVu3wZwVQ+ID5dk6BMeOiDQOIWBT1F03ecrKW8hZQcREnX3I6aCmqeFSisjOXCzpiIdITz5LzgjSRWlZsTw1MQYwLhE2MwhsasOxpWaLFGQ2EnXMJhj8GeJeH3UgzePczCvnPBTo9IOPVFQ4Z+FpDWfO0vMFRQAAEABJREFUEUfL81CUTXnqmEILKfiIOYR8xPCBVI58k+hFcltMvNjNwKUnY+hjR0l5Q+rZJDmpQrOnO2/gvIHzBj4kN/D88+MXlv46w8T3vW/wz/8tb1bsd/yht6NK/9uff3d5tK950wf0/Pi+sLmte897R//XvfVOwbb4KfGrX/mcPuWfe7G+66e9VD/ge71cn8mXiz/hM16lz/4xr9HP+smv1ef8tNfpl/zMj9N/8fNer1/zuR+vf/dHv/ruxLxzvu/9d9Nn4ryB8wbOG/hgb+BxP780jnfNvNKFHCEjksJ44cxO0UBeDNt/hbwdkm9DMhdDGjlGRD3k5KoHqU7M/zNgd2bOu2udSc+Kc0Y+AgMYNWbACagiTxwdQBpR5l848+hNZXXi+0hX83cQuYdOZHLGwjiXPUiCO8bs1qxIawZSvs5KLnxi0rFQPmA2I6imJmT3WSgsv4u0khunZsDgiWJJBXNWsPMpzszwIslnR+a3fuL1rHJyK/K5EvMg63mJmZGqnvuQp5kZozmPn7b7yKzuzKeHTurjQ+5gGqaljYbuOtouOJ5llJJg90EmtjduWj5b8jukuXxFpqe+ozMITpw9ZSrLBiK2aod8rnIywY0t5+fMYcxvfouJp3EK6fi0HuNQjz3NPA299SBzU8mjNQIpqY4MUlctjoomrzE1yT/Rc7bzfaLsBaVG3mBy4SuSg1MopNWE5uHwpig76MknllkqimUiAO/AFoegnJPUglp1AraSWJGgHBS2xMHtkJVHxCjFP2UvRc5kqTNctHyAkaIfobo6gugYraFvUMTTNPFWmRkHsUeY3GpWzrMnKoiBiibiiSoyW2jKWlAo6nK9LnwKE2SPyN6ipz6RnG2GGF2qsxQMqE46xodJqU2pmZZzooEuimWNcGDiGGzoCTBaNtwq1xFaqj6RuLw4IrG8cjWyWDi2Mnug5cgIKxLYFhsLPrDr3nLJYuHYjYMoxMaEWVkm2mEORbONbNmeCMga9Bo1dVAsX8yysusa1kkRCYuJa2JF3FjCba58lgHbVKjygKlZsOLpzhs4b+C8gQ/uBvIl2n/0U17bP+qbST/pM1+tX/DZr9OrX/VcqL76az9Qy5d9Ed7y9sGjv/f9eWmLemsvnr/J7p3vfv42+QzKr/gFb9Bv//w36gt/+Rv1637Jx2v5o7s//Se8Rj/pM1+lf+MHv1I/+Hu/XJ/+XV+m7/IdXqpv/21eok/+xBfr9a97Tp/whnn45pwXIeWPI+eX0Ne9+jm9Ftuk9an0Z+6P+aGv0rd6I8Xb5Dc6PhvOGzhv4LyBOzeweZezIdmYsNB07dEafIMyZcab/409UGVWlolXtGB1G0QbkjKbcIMeMQk2cfjGNOMVMwtNkj1R10hOYxlYjFB2mK7Qk0+kxnaK0KW40EMUK6WANhg6OOJCVox2xyKPRqohbAJFUlb4QyPJFg/MpgPSwEgut7comR9i3SIi21h2EcdWWgY6IXyDzLfhmDB7xDYoIV0jmoSOSbcoydI077Ez0cBU2MRU2JaK9SqVVTQaJuyGixUdaH44/BBNJOw+imUs2+r8EcZL1lgrErCVwrtIonlQWGLQJs60ifbk0bCFHaOZkKIjtMQsywOJhdnhka4x2jCxZlla5Pyw4jV0yxJmbMHEd8yzZodocLE6kziYgbbFxix118meqKDxJu/l7wDk5ZJf2viekG8QxYLzBeFdTi5fLKblBiu2Mw6W4oQbRI0SQ+15OPZg0SHshRMue5FWnEEfhKJgpAVzVmPEICXzQ3IMWnkcNinRg70UcUepWmZyThX4HjmG3Nj0ZlNTTrwdEfmWM611G6QIlhFrNHj8OC8tYZnZOC7VIHt3Ba2J2DxBdsUxK8WZdYw08SS0ELQKTF+BzMDFj7qFUZdzQg+R6ug7o7h8IrAeQnnoDa+4uKOiaLfWTxM5A8ELZ1b5ROKWHCGJPC6fNNfXhvybg8FHQ+emDqMAH70VofDEwyIkuxoBu7MHzmnjUHQ4cc88wg6kZofzLAayk+kzJLjlQ5kTqAu/WM9Fze7UpEK2mHix5ZBrvujXveEPbW0kYCiboI/yTNii033E3sD5YOcNvEBu4NO/28uUv6vv23zSi/vE/8K3fUl/p91LXszLWJVvmlv63zN/J+E3dsrb3/m83vaO5/UPvur9+ut/97363//KN+h/+rPv0hf/ia/XF/wPb9ev+sK3VOf/fegDH5C+4u+8V7/md75VP+eXf61+0+9923rcy19m5UvEL/hlb9Sv/Jw3KO+cr3yF9SP5AjFF+TsM/9vP+wT90p/5cf2dhT/6h7xSn//z39A/3pz8aecNnDdw3sCH9AbyvpdfuMC+ixY5YSLAOzKcnbK8GN4gueortou3zuA+k5LduzAl7J5xjFSTyLPl3C1yADt5jChDKOXAcE6ioZzcHikhnT30LR/KnMDIyZnV+iLaxAHhZEMIaRoDw5E5Pn5oiVKz4o6gHvFoi1GyHRj5SgrdljROXQ3HzjOOx4Ow83C521usMke2kHELVoZvkBS7QpFDjjBnrXpqFqNzyV0wz5DEQErHmQxgNw5SQTyi9ecPJV2D49OMltnVWx59dodjLUMqwmlJeWG4JCORZCcaeslIVgjfGqnqW0w8LaUJ7yIJdn7+OiYPuLWI4eD4jAwr5wknonRnTILHyN2kKPOCzKhyF+c5DO35xWjD5gimDU56/1HIVANbC+a8GB1le1yqJqaZkMfDU3nE0ZoPMrE7wsoJhqjnrMsPJc5b2w7FosZAdZB4lukWkxT6RB0hWnXHS9PfR12WZ7jiDPog5IKRdogAt0FKNNE+5leyZtVE75FiZyaqMZVbFySUhSx8iGwiE4IqJp4macoTfYuSUDXqGuniZ04ami/YqJwIFKsziINQ2SG6Qk8OykniF5RED+yCMj/EWpBwbk9cwJ7KIZKLvjM6ywf2oC1HrgZGBrTnnnSLllCN3aCHkpSHwzviBaEQ9Tzi4GIpHLFHXkHsLraD7BFGuzJPvqJHbw6VZMOnQdiOeEGxkgcQRVZaOaHGGrpUlDY4FE9loKVyy7YkbEWxwoHqIDThoZGuviLFbEVcMPHOxDKKwWyQXwCNkh0l6AQ4to64znXewHkD5w18iG7gF/3qNylfmv2R//XrO/HX/M636Gd//tfqzW/jWzWU3/BLP0Gx/+Q/+DiYlD96Gx5bvjRs4sq99CX9FUzLHwW+Sj+V/je/+636Jb/u6/Srf8db9Fv/wNv0+//4O/TH/vQ79Wf/8rv1N//ee/UzfuJr9T2+40v19//x+/S5/9Wb9AVf/DZ95T95380fSf6G9zzR36D+z/EF4pf+qXf23De95QP6UmZ93s9+PXNeoxfxxvnlf/Hd/QLxd/3ht/eZ8x84+aHf7xWtP915A+cNnDfwIbsBfmm04yR7QUkJsRtEGGVWMIVBWHlRW98KlD2K1Spr5O6i1fk4NvGFy/Qi2pbtEJkfIr6gNLi0oiRrrFscimeF7RbaWyQutwZYYivkGsWKBugQEdlKckFllRAEhzk1KJpYbrFw3XUjO0KF5LEuaA0+UVu0VL7FKqgDxTLMEwGYLkaCveEeMYdakm1Zkm1Zku0rW7SJ0siLldoBMhgXXGxIYSK1RU8OMqPZFcWKDqTKIDl2AhWrld5ykWTrEJO4NrGiAekJbHGTalhHEciWeCD2FZJBtG9RLBv9EZLLHlVScLGwEbu6mJXIrodeIx3J+QjRJHo2Jg0uTfSKMhrO0xa2R7FSAaTOW5R4FGXtkJryYpyom6ggNvH47wDkfyzn281h+ZaR7yf50vDCownHbu3A8aViC/nWc+IQ8fc4c0aWYJzDNPqh0WlrxDkrRgsH80wtLq9A+zG2dgyJp426ROkFl/yk5CvyFNdIH0U8bc+6QXJp7ryWUjExw6KPkoopxWYNBc3tkFz5xMQxCjtriYs80jW2Dr3IjB77CJO7NR4ykwFyRATxQPjmjlA5IkJzBI9xPhdFbDofcqaR54h8IOr3HLE7LmXB1uIWPp42fp5FLoOi3CIT0tjSuGtOF3L7Ntifl3Bmjzh1EQbiaam/QuanJx8rSEuriuR4FsLZMznCOGPhdKTuWSznpO4AOZ7NrOSIxt7w6PRyap/nLlKT56MomzJm8MwhpODs8iABO7nlvCAZNn0h103RFtvkUl15ODyD2Tw2s7pxVEXDRuvCI7TydOcNnDdw3sCH/Qb+8T99v2Jfy5dmOewtb3te//D/e1/t/R/g16OIB/bi+TsI3/veg+QHKf2yn/d65Y/p/um/8G7911/0VuVLvkcjf/Pve5v+AF8g/s//x7tali8Af9XnvEGf8q1erL/zle/TL/61b9If/LKv7xeIf/n/fo/+y9/2ltbljxk3ON15A+cNnDfwbDfw9Cp+2RzvnnnVCwnSlhDLe+buvS9viQi8BZJqQXHhxdQsRkm1KyTNJhN9Z4u2xcTPaJm6eT5Gz+fL52LG+GhUEbDz2ZcaaGup3GPmYYhsqonTB8mmnLnIIaT2vEORciI1VIaglqAGMaL0j+TkW43Bx70ZRX02NVctjKOLXGYnPRAB0s9Aw2NkRGpyDDg2M1c+48yLdoTRntk4r7UTb2ZyXh6fB6EsHqMWj8zHI5+YZKMNtip82uD48h5E/zUyNZsaxpIPGT3ldT0pIiz5K14VPRgAs2lgHueFrDoBO4kcGUw6uPD+fEGeCRnfuruYZyXJITm250DTc+HU5Dxqmk981/hUzR0hGjNIMyYzN3zRi+QWpHiyKKMv0aLzkM1vMTk4ZaOeOJ/nHqeI3SJK9vhcvik03wbu0FL5U1DJ41oLjh3RhO4QExHgLU1/i1HUlVkJbjH9kg2yCSDscoQFNeMVJSUn1orE2ZQGHtraM4vLiUHLEohjW/mBk204e0VJkTCxIgMa6FtMUugrmshTGbh4RDbM2iBx+cTEq1k5176Dio4doNIjaWTFSiT4MLGMZa9IT/kjJGfTgdnXSDcaW8KRBTUWhC3VSQN3RBqitMPUTAskd4BedEsNJyaO8TgSQRHHlha+w9FoTyQnlu+imrFYOLbSGkwQtC0nHSSwLTYW3NhS8wiTi1liryaWYZ4IlO14Do264qxKUXU4ObaEY4Ps5DE2pLvOcrGuIU5ZQZM1ZGtQ1HgFk1ow/4nfcl3WwvNffIuaB4q2GgFbi56a084bOG/gvIEPww182j//Ei2/g+/X/563KvZ7/ug7etKf+cvv1m/8vW+r/dM3jd8l2MSVe8n4E8V67zfxjwBfjVvpZ/yAV+gT3/Ai/d1/8D59yZ8cv2txTT4leMn8UvI7f/uX6lWvfE75HYH5bO/+Bl5AN73/7M0fUL4k/LjXPKf83YGb1DOEZ8l5A+cNnDfw4Ab6LkcezCsdUV/tLujJNyiTNt4HqKlPpIQdgi7F3XCEnD3M2qHCN7bwFRlJgyXZlqVnNrFsj3oQKtuA94hmW4jZexQrKUD3kJxnsk25BWEAABAASURBVAhXuIS3hL9rSSe/QymSsqI/shQmv8MIlm0mXMwyXPhrVFdVHHvDTT2UWQZ0hGjVN2gbyekoJrItowB7jLaaRw7vaiYSNpHmRHa97Au2yvhoIBF5PDESAZtY2MpL0B8hOWOjyhKxsYFiDSa0zhXLGPuaK0JyD5GC5kFmtOcA7ZlPDtszaXDvkR6LtUOU8onEabLDJXuDEvxiYs10dckafIOSYNiCg9V70SYufIfkyicmxjLQttiYSWabeKC8oAkNMSjWRBqf48vEfisY7PeV8/1scJRwrPwI6R47SeoHwYf3u0sO3CKUbPysHuHiaVvC4sJXnEEfiIrg1jI7fMVZA/A1aHyO3eNgd/w8L/NSsZmdTzVmUoM+OOOJU37hNI4SguQLo5Uw5cDk7YJukWYGDiX+YhTuM5SyO+saW4uY82I0UhchzzRxiPjwcQ5FG94p8C3SH4rRhb/lFXH9phrMzAHpwC4PRPPk0Qhbu2Cb4rBowHwY+kKu7ago2mKpTzyxIa67LonOhhV7HiSPl2Rx5dwZcQqrUzw+c/QkQLT23cV0D0tJu3DsisHMHph5yAgrT4zl3latB47aRV+RXOqWs6AJA2Az9zHnJLti2uhh81Q5AoCwS4rULEhIezx1AwangH0lUhBxa0ijgSA6sOWLFDm28BUJ2Jdng7BXnp7TPjJv4Hyq8wZewDfwOf/exyl/3Df/wYwP5mO8+EVu+7P8HYD5nXbP+kXbj/1hr+ovg7/hv39r539j3Hf9tJe2PP9v4b/jC80v+3PvKj9y/+ir31/5kz5+fpNZdrrzBs4bOG/gg7yBvssxA8yvRUT9Ne2CvBOTy3vmyMOT5B2ycjFR9GArrypKqQQpYadoxzM7ev63QGMcmxrmkhg6cRQSifKgpIAyZk4cx+CR6h8gs1KS+bfIvOa3SFW0cTBPE45lRzvCaLHm62BbTHzHIueUHd5pR07pzkJ2vZA8P/r4zHDi3BCfMhNg0YYSYbDwsCskya44cE7hjJUT85PERiHOuYtlYmOCC3Yc9ROTw7KZwPMNffAo4VvMM4SDnNfsirMraSZNuWdBb3GUx2cMJTSyJxkcX36IaW0DwYKEy16ku0iC3QdbkSAPHsucO5j7THoxupawuPA9cmczW53ZVW4wn5iKbHL56Mt5pdU7aPfoUZonGNjptG8xMQOqjnPCGjUgv0My5UdIInscNiaGE40dwrySIA+WuPBEu98BKL4f5EtB6Rp5v6x+hNSOnWQ745DCPbDeUlGsxMABR0riYpfSofVBCLeY+J5RquRAew6baE9OLnthe7ScJL5Ij4l1F0XKuOyJqU2ICYNqMbEar+iR0wYT3zXNzEQfIRq6WD2LOEij7BBdoScH5STxC0qiB3ZBSeXSXdRc9qycaIdjW0y8Go2NJwKaXLSF3sOUaZMc5UaxVH+ASCY3tlOWcI/IETufeIckwj0xjXaZbEvy5Qfc0uRbTDyNArYo1TF66huk2DYDLPtiEFmsaIBWlIY+URpcApu5j8xo1RVq5VLjjIlWlHQPxUouBfcwubtGf3PCM4CtuRrWIYBsiWdiT+QXSwi7XC3Quc4bOG/gvIEP+gb+xe/wUv3cz3qtfvxnvLqzXvwi6U/9hXfra+bv7suXZrFP+7Yvaf6T3/hifcdv95LaK152/xejF8/vzZ72OwCfe0768T/8Vfq1//HHd/4jl/+gx8teauV36D3//KPK29x3/44v1c/6ya9t4q/9rffoL3zFNzS+59769nHAJ38iF3Kv6NTPGzhv4LyBb+wN8MvmeJ+TBj6ZOLms6tojTKuusunpa3QHHV2iJFuZgbRBj5gEm3jLiYWRwDOjXvZAAlmsax4Jy26eYEVqobKHYm/RU98i1anxwIQUSZMrK/FdPEpGu2ORMxz0RE1cuaUpDVx40VqesahwS3exGWWZmgVNEAOqJo6FBDN7oCPJ3mDiu6ZR64nS4NIGicVKzQAREgkckYnEGhjvwThX5OyFi2WVaqKl8iMUC13TnMBoE100ArYMibYaqcZHiEYbXkclTWVmApBNnWX7grJsS7JsK8seaE+MiE2qoeoOunq8xaLJKHa9NNEeHEAidlImDm5MGpp0B+mRFG9poot7Zilq4AbJVD9CEtl90ORDNsgskbMcET8QwrbG7wDk20M232TyDeGTfMs4ECF7tXxx2G9BZ015HfWPkFwqmEwk1mDlzLrFluDI9MEId0hT+TMgrf0AYJ8dvOHRMKbV75Bz+rSPkFxmdj7NRzhL+EDs1gzEp5V74ZToiSiGoddHuW9rTyfRc4CpWY2ZjbeYuCL9Ix6fgTgnz+chCcsVRd9gQiyb0sCoI+qcG6S/hROJW7fBnBVD4gPl2ToEx46INA4hYFPUXTd5yspbyFlBxESdfcjpoKap4VKKyM5cLOmIh0hPPkvOCNJFaVmxPDUxBjAuETYzCGxqw7GlZosUZDYSdcwmGPwZ4l4fdSDN49zMK+c8FOj0g49UVDhn4WkNZ84RR8vzUJRNeeqYUj14sVEXzrzuugj0ATzJHAInF741ZpKgcOYCyYOcOlJks5HgeHZmjlaqbjhCkrE0nnbewHkD5w18EDfAO5h+4U99nb7nd36Znn+eX1+Ylf/4xh/6k1+vD0yefOyzftT4gvAHffrL9Yt/xsfV8rsEM4O2m/0c73QR81/oDd6z7/89X67MeOs7xhdu9+qif+q3Hl9C5o/nhj+rfY/v9FL9vH/ndfnltS1Pe6YUve/94z4Sn3bewHkD5w08ww08Wwm/tPQ1bsWr9z3eFfsOeoVU8WsYTdG3hjRyvEpGP+Q8WnVqOJzdWRdkAiTn3lhnkl9xzsjI9GyQoVSRj4ZlZ94tMo/eVDZPfB/pbv4OIvfQiUzOWNj8wE0S30Nmt2FFWlNLyzorufCJScdC+5nJ7RGBZD8ThY8xp1PPsT1vYpQY7dkZX0wQPTNXnGdVe2rMea2ZmPPCd0iuPDieKn49jyfJWc22lyx4zMegkU5dOJUddoDM7k4DNXS06CGmYVraaOiuY8YFczYCO/c4WiDs8PbGTetnJN4hTeUrMp0aJjMig+Ah2JSphOCbRbxFPl11MsGNMZQ989WZf4PRpuWcjHmEyd2zzE5uReaWz8+Q2dOQ57NRQ/3Cb3E8P8WkRjNKmm74c3khtN0XQ3tBlcsDkRVT+HD4koneY5mlolgmAvAObHEI6nxyC2rVCdhKYkWCclDYEgeZoRuMiFGKf8peiiynsrOIQEe5Qck2jn2D6oqc4BhNf7MXFNo0TbxVZsZB7BEmt5qV57AnKoiBiibiiSoyW2jKWlAo6nK9LnwKE2SPyN6ipz6RnG2GGF2qsxQMqE46xodJqU2pmZZzooEuimWNcGDiGGzoCTBaNtwq1xFaqj6RuLw4IrG8cjWyWDi2Mnug5cgIKxLYFhsLPrDr3nLJYuHYjYMoxMaEWVkm2mEORbONbNmeCMga9Bo1dVAsX8yysusa1kkRCYuJ79laIxaETaCWi7Vwwu48YDSQLcVtuSzbkrCiznXewHkD5w18UDeQ97X8l3U//7e8uf+F3e2w5e/L+7Vf9FbFfu+Xjr8DMP813d/we96q2Ne99QPK7+Db9i3xe943ovyOvREd+x/1r72yif9l/gc6Su64r/yqMfQ7fMr4IvBO2U7+vt/jZfq5n/W6ar/jD729eO1+/Ge8Sr/qF71BX/jL36jf/vlvbPy9vsvLWvbmtz39i8kW1p3uvIHzBs4beNoNPNHyGjfQk29QZojxPkBNfSIljuItJy6/ICXZso1F32LiabrGWSvJJicp3tIGE6tr6CKnLjuKZG/Rk08kZztF6FJc6CGKlVJAGwwdHHEhK0a7Y5FHI9UQNoEiKSv8oZFkiwdm0wFpYCSX21uUzA+xbhGRbSy7iGMrLQOdEL5B5ttwTJg9YhuUkK4RTULHpFuUZGma99iZaGAqbGIqbEvFepXKKhoNE3bDxYoOND8cfogmEnYfxTKWbXX+COMla6wVCdhK4V0k0TwoLDFoE2faRHvyaNjCjtFMSNERWmKW5YHEwuzwSNcYbZhYsywtcn5Y8Rq6ZQkztmDiO+ZZs0M0uFidSRzMQNtiY5a662RPVNB4k/cGJVFjZVkO4Ps7APlqMF8WIvE94ZPC4MR5ceVrwwsvaUccLEUJN4gaJYY6BuLDC80nGtlEqy3SijPog1AVjLRgZjVGDFIyHpZg5cTZlAQe21LEXaRwmcE5VeB7zKeip7uO4xfMAPLQRLQGyBcmMq35DZKGcSIBfsSLZ161ifSy5yw0CHvPES5nh6RuIrNSnOnHuDzDFukPxZiCv+wbfjl4FO041eE7o6x8IpBHDNzFJhfHzIZbTHxr4zOnmFx3XYR+QNjABFgeK8+wQ4TyHVJcPpE4g3oe028x2WGkZ/Xgmd0pODY/RaN7/FsRaihIHCPJpmpqkM66RfrmQVQnGnVEt3wo49T0hV+s56Y70j1MbjHOSNlqC1+RQnZOak1dhHu2NhJQwyZo+w5LcJt8Q+5qHMEnHALXlSA8SM+5P/Ju4Hyi8wZeYDeQvwfvq7/29j/m8X/+1W/Ql//Fd+vv/6P31f7hV72/n+yfvun9+ttf+b7a7/9jX68v/hPH/yGON/PlYBo+9dvMPwsccmU/4l95hfK7CN/xzuf1l/76e66yt/Qb3vNEX/+u55U/Cvxv/qvji8Pbqr2yfFn4hV/ydv2//2R8gcg751r04374q/Qjf/Armfmc/sr/8x79zb//Xr3uNS/SJ338i1qTPxLd4HTnDZw3cN7Ah+gG8oqXUQPzXlfGe97EAC+B422PPHFeIBMldYSprU7A7qwtZsTgVBHkPTnnb3HUJI+VBDmRQlp4hMnJla9IirLsoW/5UNZOZrVuh9SUU0V48/DJLXqb47BoAI8RPw89FMlv9cSLkdoOiHwlhW5LGqeuhmPnmfOYfYhwinK34XusMke2MJWTF+AbpIRdocghR5gzVj01i9G55C6YZ0hiIKXjTAawGwepIB4RPzOhk4dFB9McdcWURd8gpU0jFeG09PCEjckF6axed51MwY3NxkBzDS6uM6B3kQQ7P39tzwNuLWI4mPtjEo+WhsDAariFPcZ+wla3jtlV7uI8h+KeX4w2jEH7R0dgFE878plNCzwerdFWjb7lDGjNxKQJMxPoWTdITfNBersjrJxgiHji5LZDUEPzdP0dgOKbwPGiZhWNggm75RGTn9gi+A7JlTtemv4+6rI8wxVn0AchF4y0QwS4DVKiifYxv5I1qyZ6jxQ7M1GNqdy6IKEsZOFDZBOZEFQx8TRJU57oW5SEqlHXSBc/c9LQfMFG5USgWJ1BHITKDtEVenJQThK/oCR6YBeU+SHWgoRze+IC9lQOkVz0ndFZfgeRc3iB9uCee9ItmjKj+xaRTGZs6xCRq2+wjxhOYsRWMANsYmGH2AqyRxjtyjz5ih69zBbLhk/TEVJT/RB0kr9CAAAQAElEQVQla6wijl3hgiPyrBxoaobZA7UiKaGxtWDieyZWckDKFVeOY5dHOzBXE8uYYODYIXApDklZxToYyJZ4bvYFZdmeHNS5zhs4b+C8gQ/fDfyNv/de/cEvO/5ybzk1X5b9+b92/Hfp/YP5heEP+T6vWMp3+EO+7yv0kz5z/LHi3/rFx78zb9cwyRf94Xf0BTRf3H3ez3693vC652bmGPIZftsffLvy9/4dVfxL83f6/ee/8ev0O//Ht+s3/7636bf8/retpZ/70z9O+Y+UrMIZnDdw3sB5Ax/MDfAKl9e5jBho3u/KdohaXtTWa7I76OjYFdKULdtY8rcoL7plO0Tmh4gvKA0urSjJGusWh+JZYbuF9haJy60BltgKuUaxogE6RES2klxQWSUEwWFODYomllssXHfdyI5QIXmsC1qDT9QWLZVvsQrqQLEM80QApouRYG+4R8yhlmRblmRblmT7yhZtojTyYqV2gAzGBRcbUphIbdGTg8xodkWxogOpMkiOnUDFaqW3XCTZOsQkrk2saEB6AlvcpBrWUQSyJR6IfYVkEO0DlGhBl3Yolj114uzBpOBiYSN2ddGTyK6HXiMdyfkI0SR6NiYNLk30ijIaztMWtkexUgGkzluUeBRl7ZCa8mKcqJuoIDbRE6lgW11tJgL7OwDzTWe+JLwg3w3yxWG+KLxoCNmjkBfDEkqehhw0qgj45pNyptMPjV6OkrlIOQ85AsaO/ozWXmbM4cA6POrKMy5CEdeqHaKU30FyDGMnP55xSEd8fOY8W2v4cLdITfWJiWMUtm+Ji5x3ja1DLzIjj9F40a4xNbfGB8pkgBwRQTwQzo1lJsC06kW0SHnOu0hN88+ETKGuB4BsjskHmnoSUESeC+2Aj6eNp5ABiVJ8jEyipmMOkS7GtH+D+Twpp5tUaoatnIGtucFWoE5kJp3MCMcYigSPOjlCZ61ILnXPYlxRew8wD8GkAJbhnDei6eGcge/z3EVqcgZF2ZQxlXEhpODs8iABOzkOYUPYZNj0oTS3xcSLbQamunIcMxZOyKxuHOoURiuEnTMWvnt2Zl14Crm4c583cN7AeQMfoTeQ/8jGO9/1vD7pE16kX/k5b9Bn/sBX6nt/t5fpx/2w8cdt83cK5j/k8bv+8Nv1lfN35j3LR8mXjl/0R96u/D1+n/KtXqxf/bkfr9/0n32CPv/nv0GvedXtl4H59fQr/vb43YW8W/aI7R9b/mdv/kC1n/ETX6v8x07yx4F//mePPzKcLzfzjPmPlDztjzJ3yOnOGzhv4GP1Bp79c/MKl1+XeBHMKx99eR9EXN7zJqKSr49yMUqrPsLkVqOamGHZWPg3wnIyD0zH6M0Tl/MJFoyGZedddRwXP2rw7V0xfRgimzri9EGyKeM05BBSe95DkHiusSlkR7nwCNhopoM4ydiigZzStjpKVk5ulFbMY4wSaEjSeySB2M9A42PMqJ6UypAiE4qdmyfOvHuY3DMbR7R24s1MnoXD8Tm6zwC9YHrDDpCJ9NCZHDY4npidgHwP3CDTs1NwhJyVYqaO/iOO1nyQGRR2x2VskFQOJqSA3ZkTm6OQ3Xx/viDPhJlKLcDIDMyILY4nQ+0xFBUzu1X0pmJwlPCHxqTmjxCN6aQ5hqkZt/AdkisHKcaHDVv4ipuZqcjM5EDo5Ry0e5wiNg3U5CwIpfc4N9m6gf0dgHlZO7J+eYhrDhybbxERXBJvJhnmicBkWjGRumi9g+mXbJBNAGGXIyyoGa8oKTmxViTOpjTw0NaeWVxODFqWQBzbyg+cbMPZK0qKhIkVGdBA32KSQl/RRJ7KwMUjsmHWBonLJyZezcq59h1UdOwAlR5JIytWIsGHiWUse0V6yh8hOZsOzL5GutHYEo4sqLEgbKlOGrgj0hClHaZmWiC5A/SiW2o4MXGMx5EIiji2tPAdjkZ7IjmxfBfVjMXCsZXWYIKgbTnpIIFtsbHgxpaaR5hczBJ7NbEM80SgbMdzaNQVZ1WKqsPJsSUcG2Qnj7Eh3XWWi3UNccoKmqwhW4Oixv//7L1L7H3du+UzxntKFadKuUdEInpuCUKClkskEkIkBH0JgoZLg4SQuERpECKIRFKhUTRcE0SEDhIJekUHLSFRUjd1UaWK+h+fMZ651l5r77W+7++c/+38z1nz9zxzPGM8lzn3fN/Iru133r+CSX2gFElZzRPsSIApBcFccGHC0StoOMoK7Oh61vMCzws8L/BDv8Cf+af/Gv3Ff96v0/a/8rv+tz8+5v7c/F/E6tf9Ud/+//3Jfzsw/2u6+T/z/Zv/ml+vv+Nv+Y366/6Kn9ef9Mf/nPI/5PGP/Uu/S//9/zA/zn0c+IWQnr//N/0O5b9H+Ht+3w+UH+f+tD/l5/SH/jBfML/o+7nv5u6/5tcMpvTf+A9+r/LfMvwL/qxf2/9BlPyfA/8cvyP+J//lH9C/+R/+Pv2mf/1367/7rf/P986WMu3x5wWeF3he4PtfYL7GeX2/A2WazO4L1NIXUoKFoEvZwjMzWE5QXrQSZwvCCNkhNij8hIwsP6BE1fe7WDbzFgKyDfiMaLaFGDujWEkBukNyXskiXOESuyX2W086+RNKkZQV/StPYfInjGDZZsLLLcPF/o7qqsqGHbiphzLLgK4QrfoBbSM5HcVEtmUU4IzRdvfk2F3NRMIX0pzI7i77ha0yezSQiDw7MRIBRix85yXoXyE541Nlidj4oFjDhNa5YhnH3rkiJPclUtA8yIz2XKC98snhZyYN9xnpsVgnRClfSJwmO1yyDyjBXy7WSleXrOEHlATDNxzW3Zu2cOMnJFe+MDGegbaF4SYZM/GgvKEJDTEo1kIaDRPqGaOoq38DkJ8L86OhLrFiUnzhq3VDDeb3RrBsw8xNPLhFYfV3YeM7roBfKacennhzzjpflqrkgNEJaGHPpQtfb2/FnYUG5tPNzCNnLLleY7ZjSY9KOsE1dirpIzKfWaNkfzmF5wylWM98x9Yi5tw4jdRFeL/zzCdJSfJH3inoR6Q/FKea/ZNXZMsv7QAFUzmc+HWhyYXXqT4idB1OXQhOO/uLl2zbezL86KkLX9iQrdYtic6GFXs+JNdKsrhz3oo4hdUp3j7jjmjtu8V0j6ck4zIr+M4zM/oJKQ6ff37MCe+B3O0K0TJjmw1NGACbuUdmcwJHpY75AapjozMmNdF3jLYcmFqC1ADDIVhmRDpjEpsnm/gGv0ilg4uv0RRiO+euGCWIDbbPRnn5Cyl67JfTCzx3eV7gZ/AF/uq/7Of1d/6tv1F/4Z/96/q36v733zb/rb/3j/Ibfp5fxRB/w8XfskO+tN/2O/6I/uF//nfqn/7Xfrf+3f/s9+s//a//QP/HQ/7uf+K36x/9F39Xf3i7bPwG8Q//v7+g3/If/T79Q//c79Tf+0/9dv1zv/n/UrSvWvnu2c/4C4dfOf/AH/wF/SP/wu/SP/DP/g79lv/49+tf/i2/R3/fP/M79v9RlP/t//j/9Jv//fkfQPlq9pN7XuB5gecFvvUF5uvc9v0ObOMR+Q7Il9KjkpIXD+P7YIBSbP8aSVts5/le3vPYMHJMoWF04igkEqWJFFDGAQs5JzpAdXZSA5+cWUll/icyr/kjUhUtB4CBz6HUxJpMsLy8G8IRE9945Bxwwpt25JSePOTUC+HeeZH5zPDU4HzKTGiU4MXD0nGBtGNNDq4uztg5Mf+QMBTinLt5JjYmeGHHUb8wOTzGBO43+vAo4UfMHcJBzmt2x9WVNJOW3LOgnzjl2TOGEhqxRYazl19iWttAsCHhZpt0iySwXmxHglw8njk3mPdMenO6trC48TPyZitbndlVPjCfmIoYuXz07bzS6h10unqU5gkGO532IyZmQNU5J6xRA/InJFN+hSRic9hMDCcaC2FeSZCLJS688U1Pbvl3+aLGD4S6RfHbYa0b7Ige3t2MNBGwdoFW1uyCx3Rch1TlXoToiInvnFIlB9pr2EJ7cXKxjZ3RcpLsRXpMrFsUKbPFFqY2IS4cqs3FaryjJ6cDJr51rcxCXyEaulg9izhIo+wQvaEXB+Uk2TeURA/shZLKpVvUWvaqXGiH40dMvDuNjRcC2nkITju7tHDDlB3FSZu0pe4XiGRyY05ZwjMiR+x84hOSCPfCNNplsi3Jrz9wS4sfMfFyCjBRqmv00g9IsW0GWPbLIbJY0QDtKI2+UBougc3cIzNa9YbaudQ4Y6IVJd2hWMml4A6Tu3X6mxM7AzBlgZgQYwe0cq0IxWyWIiYcRIBgkizbkizbetbzAs8LPC/wo3iBf4cf5v6Vf+v3KJ4f6/Kd7mpu/sbef/tb/5D+x//5D1+lv9TyI9p//t/8Qf2H/8X/3f/xkPyf1X7Z8ItM5v8c+H/5X+d/4OOr1nyGv+ef/O36V//tz//mYH4I/K/++z+o/4HP931/k/CrM57c8wLPCzwv8H0vMF/jzPe5VF6g0HbXim7Q0fFbtHoeG0Y83A7iwhODKmYWmliLb/qOSeExZ8N3pAdK6Sj2Eb30I1KdGg8mpEhaXFmJb/EqGe3GI2c46IVauHNLSxrceNHa7lhUuKVbbEZZpmZDE8SBqonjIcHMHnQk2QdMfOuaWi+UhksHJBYrNQMiJBI4kYnEGszuYZwrcvbGxbJKtdBS+RWKha7lTmC0hS4aAd+GRNudVOMrRKONXVclTWVmAhCjzrL9Qlm2JVm2lWW/YUR8yZqsdI2unt1i0WQUu7u00B4OIBE7KRMHDy6NJt0gPZKyW1ro4plZihr4QDLVr5BErBdNPuSAzBI5yxHZByGY4WIZj22YeLx/AzBfROP5gbC/gvZHxWz8Ijkie3h+UbzAZtGLGZy6hZGjn5BcOfNzcOITIpR/AzKqP9GCvTv4waPhTOt+Qs7pbb9CcpnZ+TRf4SrhA2GtGWRPa17ggDkRp4l9cnd7ZiX3FSa3OxMbHzFxRe4w8XwG4s4eJAnLE4UfMCEe48qBqSPqnA+kv4ULiVt3wJwVR+KJcrcOYcMiIs0hBBhFtW6Lp6y8hZwVREzU2ZecDmqami2liFjm4klHvER68llyRpAuSsuK5amJM4BxifCVQcCoDce3miNSkNlI1DGbYPg3xH0+6kCa59zMK+c8FOjah08qKpyz2GkNZ84VR8t9KIpRnjqmVA++fOrCf0BdjLlYIi6RBGEEnH7IaE1eaEitATm1IQ1FJBA1AbOwF2fexntpyNwt9TSUZ9LirUeP9PjzAs8LPC/wQ77A7/39P9Bv/Z/+cD3/a7x34/7P3/lH9Jv/vd/b/5Xcu5pHf17geYHnBX4VvsAv+iP3e97+fe79+x08uc35ylflS+zXSjqCVKd2fX/MWfF8xwx+OF3Vdlwz+FSjv3hnRF8OIHEYQWqBxXOH6At7F/gl0lX9BpG5WnYuEsuc0AO2AH6FzE4XF6OJGmx4dgjWHNjPAG5jpjWfIa1HpIhk6yn+Gtc5GUEtwM4sAqYkztZDwwAAEABJREFUCQcgWINgZu64zqr2vXFGMJ/m1uec9JyQmvIgtYm5BS08RThOT7MgrPo1TzMV00xdOJXlF8g5NeYWu9H/FSa3PG1MrXXLOckVczYB1ou8YXuzLc/7pO6EzCrfkVNS39EZCCeOLZnKskHEVp2Qz1dOJnjw7fycOc785o+YeDmnkM6e1msc9XqnmdvQ2x1kbiq5WiOQkurIIHXVslHR5DumJnlwmtjv+OGtpirC7v0bgPyAqLj4gdCzsVtsWNBnLLNUFMtEALsDRxxBnU9uQ+06AaYkdiQoB4VvcZAZ+sCIOKXs32NbkeVUdhYR6CgfKNlmwz5QXZETXKPpb/aFQluuhZ/KyjiIf4XJ7W7lHvZCBXFQ0US8UEVmC01ZGwpFXe6uF1/CAtkT2Uf00heSs80Qo0vdLAUD6iZd45dJqU2pWZ5zooEuimVNOJg4Dhs9AU7LgVvlukJL1RcSlxcnEss7VyOLxYYpswctR0bYkcC2MDz4hb/3lksWiw1rHEQhNi7cyjLRCXMomm1ky/ZCQNbQd9TSQbH8csuKSd8VHWKx2DCFf+V7jVgQjEBtEeuDI2DiopiCCmcrB9XAgJVlbxgmmT9i2WZ/7HmB5wWeF3he4JfHCzy3eF7geYHnBb79Bdzvc9lNk2E+oBZfSMpRfOTE5Vdo5WuifUS30Lb654RJRT1gq+A7JlaX2TcnlB2mN/TiC6mxnSJ0KVvoJYqVUkAHDB2OuJEdo9145GmkGoIRKJKywr90kpi4MEYHpIGRXG4fUTJ/xPpERMx4rMiGKS2DTgg/IPNtOC7cntgGJaR3RJPQcekTJVla7jN2JhqYCpuYCttSsbtKZRWNhgv/4GJFB5qfjX1EEwm/R7GMx6zOnzC7ZM3akQBTCm+RRPOg8MSgTZxpC+3Fo+Ebu0YzIUVXaIlZlgeJhdvhkd4x2rhYqywtcv5Y2TW6ZQk3vmHiG/eqOSEaXKzOJA5moG1huKVaN9kLFTS7yfuAkqixsiwH2AdFpK6Nl7D1bwDywyC/PMLyI2IJvzh+hcktp2Ua2dNVaC7RZBPtvkk7riC/dKYoGGnDzGqMGNxqThiCU8L+PbYV5ddTSreZnFMFfsZ8Knpq3XirDenHaGGnDjnBmTOt+gEpgnEiAfvE286cagvpxTgztWgQ7MwRXmeGpG4hs1Kc6deYuc0SbEg/LMaUwO4f/HXw1Jw41eEnp6x8IZArBm6xyW1jZsMjJv70fprIGQy+OAPKFxK35ApJ5Lp5kRdOYf7/IFSn5oUTMRk1deEvH/3FMzNVL+wt+UcVlToSOSeOiKEvDcIZTAwHXpy+8oXEdLFf8cnMqcmHv7zn5pRId5jc5jlli4Mb3xERy0kZV2wQ8cr3RgLyGMG0JfiCN8XbdDxbwjY24BMXUXbMQDi1ieazJ3r8l80LPBd5XuB5gecFnhd4XuB5gecFvuEF+j2Q73QvTMT3P7S0J3rHrSIljdmwfMWOdEC6SeS7Yr5GbrgVkCXszhfLICdRSMuLM7F8R1KUxUY/8lHWpM5uHTNfSE05VYQUzYBo77xN2fDkAK6RfXrOBP2qKNrmlBx7Ir9JoceSxqmrs2G5c67bS4RTlLcNP2OVNbKFqVy8AD8gJViFIodcYc7Y9dRsTueWe2HukMQgpXMmA7DGQSqIJ+KfTOjiYdHBNEfdMWXRD0hp00hFOC09PGFjckE6q3d7T6bgw1djoLkGr60zoLdIAss/v7bngkePGA7m/ZjE1dIQGKzGtrGvsZ+w1a1jdpVbXOdQ3POL0cYZdL46AqO47eQzmxZ4drRGRzX6kTOgNQuTJsxMoGd9IDXNB+mtRdg5wYjsxMkdh6CG5naD93v/BmB+HuTHQw3yG2EsQrBiUiWwIE4kahIlq65h0jvqtd5TzGjyiKkJ35EAboMpXmhf8zf57TZefCHFzkxU4yq3XkgoC1nsIbKJTAiqmHi5pCUv9CdKQtXUNdJrXzlpNL+wUTkRKFZnEAehskP0hl4clJNk31ASPbAXyvwRa0PCZV64gb2USyQX/eR0lt8g8jpcKQsVY4Lhggw1kVhB3yMpp9Ji7/aJyIjqfOLg5u2q5skriN9iO8heYbQ39+I7enpzAUk2fDkEc8QXipU8gCiy0s4JNWt0qSgdcBQvZdBSuWVbEr6jWOFAdRCa8NJJV9+RYkwRN0x84a4mlnHBwLEQuJQN6Qu0enUtDFluW6q+obpso0q29aznBZ4XeF7geYHnBZ4XeF7geYGfvRfI1ziLP1b2+me0KW/YHrRbtDqfDSMeTkAThmhHc4jMH4XLi0sql3aURFZZnziKV4XtlMk+InG50Ukn9g0iK7lbJIkpRRsqq4QgOO7UoGhhucViq3Wb7IQKyfVeaA1fqCNaKj9iFdRBsQzzQgCml5PADtwTc6gl2ZYl2ZYl2X7zTVsoTV6s1A7IYLbg5iOFidQRvTjIjGZ3FCs6kCqD5LAEKlYr/eQiiekSk3h3saIB6Qkc8ZBq2I0iEJO4EPaGZBDtC5RoQZfuUbNSlSi4uWT+zG6xOMModnfZ76jRfIVoEvmDS8Olhd5RRmPz8o2dUaxUAKnzESWup6wTUlNezCbqFiqIL/RCKjCrq81EGxLe2Xf5FTQ/IAbzw+Egv2COiDS/MKLwg2L2d57R0ReSpnD9solejpJ5lMz8BohY9G/09tK6hgP78Kg7z7gIRbZWnRCl/AbJMQxLfu440hWfz5i7tSYv1rKllxMfMXGchvZtcZHz3rF16EVmZX7jTXvH1Hw6HyiTAXJEBNmBcF4sMwGmVS+iRco9b5Ga5r8JmUJdDwAxjskHWnoSUETuhXbB57bZKWRAohRfI5Oo6ZhLpIsx7T9gPk/K6SaVmvGdM7A1H9gK1IXMpJMZ4ThDkeBRF0forB3Jpe5bnCdq7wXmEkwK4BnOeROtHc4Z7L3PLVKTMyiKUcZUxoWQgmPlQQIsOQ7BIJiU/wbgDxaPgG/NqNp800BOGTm5lO+YD7ulqCKX82hBvOItoARM0fJ+Jma+kLlYOJVTD3/seYHnBZ4XeF7geYHnBZ4XeF7gp/YCv6SD5/tcvhfi+b6H80WRHc4XPXa+6y3likfbnerGR0x89gzsuXzXPGFOjbYj55YfkE/JEewHjZoImYXK+FTMmRAMTk3zJ6Sr/AaRuQqW/k7OhnrkxFRwyOiJN2d2G0Bu07AbLTsnl/K5G1lywzOOqvIjItDTegq/RualJqPAMWbtfMWZF+0Ko32zc15rF37M5Lxcn4tQlh2nlh2ZJySfmGSjA7YqfPlw9vIeRP87MjVGDWPJh0xPebeeFBGW/Buvih4MgDEamMd5IbtOgCWRI4NJBzfef16Qb0LGt+4Wc1eSHJJjew40PS9OTc6jpvnEt86nau4K0ZhBmjGZeeCbXiS3IcWLRZm+RJvOJZs/YnJwyqaeOJ/njlOEtYiS78M+DnULKSeiPzufh7MbLfzO/IKYHwqDhJglBMsvJDaO0P0To6iL1hv00kFMKQTtbhpOLDzajpLKpRdqFqUTfLF/9KYJR7csgWyYlT9ssg3HdpQUCRcrMqBBf2KSQt/RRF7K4LYjYjDrgMTlCxPvbuVc+wYVHb9ApUfSZMVKJPi4WMZjO9JT/hWSs+nA7XekGw2T2MiCmgXBpG7S4IlII0onTM3yQHIX6E231HBh4jjXkQiKbJi08RNOo72QnFi+RTVjsdgwpTWYIGhbTjpIYFsYHjz4VvMVJhe3hO0ulmFeCJSdeA6NuuOqSlF1ODlMYsNALHkcg9S6WS52a8imrO/YviMbfnRk1OwKJvWBUiRlNU+wIwGmXOwNI0mIDSzb6lpoD7c8cnct9kI963mB5wWeF3he4Kf8As/xzws8L/C8wC/uBdxvdNndRpeL3dlAKRtsx3w13DlBedGaeKGCB188g2x0SfYbSrL0vS6W7akDobIN+IxotoUYO6NYSQG6Q3JeySJc4RK7JfZbTzr5E0qRlBX9K09h8ieMYNlmwsstw8X+juqqyoYduKmHMsuArhCt+gFtIzkdxUS2ZRTgjNF29+TYXc1EwhfSnMjuLvuFrTJ7NJCIPDsxEgFGLHznJehfITnjU2WJ2PigWMOE1rliGcfeuSIk9yVS0DzIjPZcoL3yyeFnJg33GemxWCdEKV9InCY7XLIPKMFfLtZKV5es4QeUBMM3HNbdm7Zw4yckV74wMZ6BtoXhJhkz8aC8oQkNMSjWQhoNE+oZo6iLkjecSq3Ed/l1Mj8XXmPU/IR4xMyLNrhFYfV3YeM7rmD9AtmfJhNv3sukBo+WoR8YEaeE/XtsK1rYWcRgPlXPX2cOX7+SpqR6OEeE40TTQsAI9pUnGt4pYelemMboLxwWTj+ViaoRYD3jHRk2OomeVczGjAgNs3VSxJlMLkqayTKm7ICUwmKT/+TJxftL9QTZGZkOnDPaFTw5ZeULAS6VveUNaD9hyba9J8OPnrrwhQ3Zat2S6FmwYs+H5FpJFnfO2xCnsDrF85mjJwGite8W0z2eknaxYRWDmT2YecgIO0+M87hpB6aGoPwDuUx6kyxuvDjKmkDJG885UXekCR7jVjkKoAcrKVKzIeHUEkQDhkMwmqPgP8BjEY++aTeY0ptU5NedKMSOvB8pl2nACxTpWjj/XHPDNAbJYcNeHOmxXw4v8NzheYHnBZ4XeF7geYHnBZ4X+MYX4Jsfldnnm10iBL4Zbjxsfd9DwvavkRTFdp7vjPn6uCPZF89kPAJ6mmYWWo5AD2+YDf9eTg9ljJrKnPvizG3+iGSjpRwM5Cqo6wMSVTwgYa16N+gRE9945Bxwwpt25JSePOTUC+Heuex8VnhqcD5lJjRK8OJh6bhA2rEmB1cXZ+ycmAfGUIhz7uaZ2JjghR1H/cLk8BgTuN/ow6OEHzF3CAc5r9kdV1fSTFpyz4J+4pRnzxhKaMQWGc5efolpbQPBhoSbbdItksB6sR0JcvF45txg3jPpzenawuLGz8ibrWx1Zlf5wHxiKmLk8tG380qrd9Dp6lGaJxjsdNqPmJgBVeecsEYNyJ+QTPkVkojNYTMxnGgshHklQS6WuPDGNz25O2dcUzmPoH8DUPwo6NnYLTYs6MHulopiJQYuOFISL3+VjrZ+edQRE995upID7TVsob04udjGzmg5SfYiPSbWLYqU2WILU5sQFw7V5mI13tGT0wET37pWZqGvEA1drJ5FHKRRdoje0IuDcpLsG0qiB/ZCSeXSLWote1UutMPxIybencbGCwHtPASnnV16w5QdxUmbMkvdLxDJ5MacsoRnRI7Y+cQnJBHuhWm0y2Rbkl9/4JYWP2Li5RRgolTX6KUfkGLbDLDsl0NksaIB2lEafaE0XAKbuUdmtOoNtXOpccZEK0q6Q7GSS8EJv1Ok2ZK4c7GSE+UgpiwQE2LsgFaule0eLcmyLQlfaBNLsjdUV9jmFZ7teYHnBZ4XeF7geYHnBZ4XeF7gZ+oFrOMfldGoRDQAABAASURBVIk1qsotDRJgylfCa/TkKMCIj5xYeBKgQEuAZbEW1zsmhcdaR7AjtVBaRrGP6KUfkerUeDAhRdLiykp8i1fJaDceOcNBL9TCnVta0uDGi9Z2x6LCLd1iM8oyNRuaIA5UTRwPCWb2oCPJPmDiW9fUeqE0XDogsVipGRAhkcCJTCTWYHYP41yRszcullWqhZbKr1AsdC13AqMtdNEI+DYk2u6kGl8hGm3suippKjMTgBh1lu0XyrItybKtLPsNI+JL1mT1gaO7enaLRZNR7O7SQns4gETspEwcPLg0mnSD9EjKbmmhi2dmKWrgA8lUv0ISsV40+ZADMkvkLEdkH4RghotlPLZh4hvfSpiZivU3APNLIj8N8qtgovwkekJ+WSwvpm0Yv2emFAFO+4tXYkNhJm0JcKRyir8VaVmHAPRd8Wj4ZLkLcQ4r55wqXyE5hmN0xMqZcMCG5PJZtjhIFX3dD5gTcQrYafliZ2azX2Fyu1Pd+IiJK3KHiftr93b+QpLchccpP2BCPEYqMHVEnfOBc0Y/dRrw1h0wZ8WRKMvdOoQNi4g0hxBgFNW6LZ6y8hZyZhAxUWdfcjqoaWq2lCJimYsnHfES6clnyRlBuigtK5anJs4AxiXCVwYBozYc32qOSEFmI1HHbILh3xD3+agDaZ5zM6+c81Cgax8+qahwzmKnNZw5Vxwt96EoRnnqmFI9+PKpC2derVsE+gBuMkN+AMfDj85MEhTSFz2wkFMnRXZJcNTU0BfIbMKzHgGfu6U+lS9MDw1AdCJqe8TQHLV79MefF3he4HmB5wWeF3he4HmB5wV+Ki/wSz6Ub358n1s73/ESIWBEi+crIIzvhHwf5KThxAQYOtnUQvK98tYzlRo6p6ez6L1ACqhO5TglSBxCkPnA4vQfZiJi1KG17oR0ld8gcg9dyOR1eOYtsQXwK2R2G3ZcPZTvs5ILX7iNCeXiMUZQTU3I6TNQXH6LtJKbUzNgeKJ4UsGcFex8ijMzvEjy25H5rV/4Pquc3I58rsRcZD8vMTNS1XO/5GlmxjTn+mm7R2bVMp8eOqnPHnKDaVieNhpq3Wh74dxlSklgvcjC9mZbns+W/AlpLt+R6anv6AyCE8eWTGXZIGKrTsjnKicTPPh2fs4cZ37zR0y8nFNIZ0/rNY56vdPMbejtDjI3lVytEUhJdWSQumrZqGjyHVOTPDhN7Hf88FZTFWH3vEFJziF45+tvAJpfEi3xq6BlCTc+KNYwoVlZJlrooESrsjbUrhNgSmJHgnJQ+BYHj0N2HhGnlP17bCtyJkud4aLlC4wU/QrV1RFE12iNfkARL9fCT2VlHMS/wuR2t3KevVBBHFQ0ES9UkdlCU9aGQlGXu+vFl7BA9kT2Eb30heRsM8ToUjdLwYC6Sdf4ZVJqU2qW55xooItiWRMOJo7DRk+A03LgVrmu0FL1hcTlxYnE8s7VyGKxYcrsQcuREXYksC0MD37h773lksViwxoHUYiNC7eyTHTCHIpmG9myvRCQNfQdtXRQLL/csmLdGnaTIhIWE+s7qW7w4AmbRw6WE98iCUxcNBBUgvAgxE5g2WaQPhBFWfbKh+DDpHfUs54XeF7geYHnBX6KL/Ac/bzA8wLPC/ziX8DrG13RgnU7INpIyldCwgN6YhIYcfjBteIdM8vKso0q/B2jqcvsmxPKDtMbevGF1NhOEbqULfQSxUopoAOGDkfcyI7RbjzyNFINwQgUSVnhXzpJTFwYowPSwEgut48omT9ifSIiZjxWZMOUlkEnhB+Q+TYcF25PbIMS0juiSei49ImSLC33GTsTDUyFTUyFbanYXaWyikbDhX9wsaIDzc/GPqKJhN+jWMZjVudPmF2yZu1IgCmFt0iieVB4YtAmzrSF9uLR8I1do5mQoiu0xCzLg8TC7fBI7xhtXKxVlhY5f6zsGt2yhBvfMPGNe9WcEA0uVmcSBzPQtjDcUq2b7IUKmt3kfUBJ1FhZlgPsgyJS18ZL2OylLLTPfP0NQH6B5NfDMX5pTLA8LFlmYcM+OanNPkqWsH6B5CfQaQ9viq3xwswJP2EITgn799hWlF9PKd1m8XmqwM+Y69BT68YVN6Qfo4WdOuQEZ8606gekCMaJBOwTbztzqi2kF+PM1KJBsDNHeJ0ZkrqFzEpxpl9j5jZLsCH9sBhTArt/8NfBU3PiVIefnLLyhUCuGLjFJreNmQ2PmPjT+2kiZzD44gwoX0jckiskkevmRV44hfNreaYuTi0T2cPbEQpPPB4h2d0JsPyjmToOGZ6dnvDlKeqZR96BuQNBdCCD2s2GRYl0g1OxJlAX/vKehxrjNrVuKYkYPHpOueKbvvUcMXH+V4Drx+bEeyMBHCPoFb4PW8qbdDyI0cInbbAho8pfSEQd+6aXwW9wyQ/8NF/gOft5gecFnhd4XuB5gecFnhf4RbwA3wRbfYl8icTy1Xv7GvmGdFGQ78n5unjEFJKltztfIIMclUKAREqIlg5jFJzS7lc4FXvHmpVz0zJITXWqCHMOoxkGwU68Tdnw5IDW7ngpkj3qiTcndRwQ+U0KPZY0Tl2dDcsd+xGSDAe3z3ZGPha5zOTTBmBtAEvPSAprosghV5gzdj01m9O55V6YOyQxSOmcyQCscZAK4onOdw2LDqY5VTuurqSrw4mbTkiMvA4eKCcXZOJLTG3E5IoR3j3JaEdMvPw99cERsPzzmyMguezmERODeb9OLeeaC6ux0cmO3v0O+wmpWMiMRrfIHHIczxU5IXZwBqFTQ7DK3nin005TahpFC79CilqzMGWEmQ109gdS03yQ3lqEnROMyE6c3HEIauh8iolud9qb23EFa+b6G4DiF0R+Gaxlw1HEr4WJklXXMOkd9VrvKWY0ecTUhO9IALfBFC+0r/mb/HYbL76QYmcmqnGVWy8klIUs9hDZRCYEVUy8XNKSF/oTJaFq6hrpta+cNJpf2KicCBSrM4iDUNkhekMvDspJsm8oiR7YC2X+iLUh4TIv3MBeyiWSi35yOstvEHkdrpSFijHB4V70iJZQR8luaeOEJh5zZMI3hCKq84mDm6dhYk9eQfwW20H2CqO9uRff0dObQyXZ8OUQzBFfKFbyAKLISjsn1KzRpaJ0wFG8lEFL5ZZtSfiOYoUD1UFowksnXX1HijFF3DBx//Zf/hZgxHFXF8u4YOBYCFzKhvQFWnP1I5p6o1uSZVuSZVtdYCI7uzT7YOKj61nPCzwv8LzA8wLPCzwv8LzA8wI/Uy8w3+Xc73jZze1dJnYiB/FbtPI10f5EOX2WPU4googSkaKL9Y6R8Jiz4S+cyDKqZF8hWnWTl7pZukSxkgN0iYiYktxQWSUEwXGnBkULyy0WW63bZCdUyLqqBn1GLV609IFVUAfFMswLAZheTgI7cE/M4ZZkW5ZkW5Zk+803baE0ebFSOyCD2YKbjxQmUkf04iAzmt1RrOhAqgySwxKoWK30k4skpktM4t3FigakJ3DEQ6phN4pATOJC2BuSQbQvUKIFXbpHzZoqKbh5WGKjWizOcOJblGwqfIVoEvmDS8Olhd5RRmPz8o2dUaxUAKnzESWuoqwTUlNezCbqFiqIL/RCKjCrq81EGxLe2mrJmNZsPQvX3wBcv2zyq2Ci/Gz5wrSVEYD9AfEd+S2SXgpopQAjQMSif6Pf/mKcfoZv+UV7RLYcd0YUirhlLsDvpW+cXOuLKaGyJdne+Ss35YtnasvD8fKFieM05M5VE1dj/jsml1lFqveY2mrvmJpP72fqbHLg8NXL+20cJVkU6phPQIpDCXJf4Mypqf5NSDd1PQDEOI7ZGEOThAMUNAfGIm6cW1GQnSbEROm9RjqpyYy54zunizHtP2Bq00Y1qdSM75yBrfnAVqAuZCadzAjHGYoEj7o4QmftSC513+J5idRdYC7BpACe4Zw30drh9LL3PrdITe5HUYwypjIuhBQcKw8SYMlxCAbByGD0oTR3xMT9238/aA0bttXywZJnRpQVkq+xoZLLzLnLgbc1nAKSr89w4AysviNNqS1QF8RjYak9YvTHnxd4XuB5gecFnhd4XuB5gecFfuIv8Es+kK96+eaXr48nhGD57tivmJPni1+//31g6r7RMzWHLmQUs+nlE3R2cDlwym2cG1XfkXnpRcSYeOJ0ld8gMlfB0teJ2VCPnJgKho+eeHNmtwHsp0hpcuDOyVXaccaEZuYnppnuSVACZ0A/4wfmdGo7krraka+YWaQ66wOT+2bnvNYuzLnhO3IeB7BzFjW5b3IbtpbsBbY6+vLh7OUZkr537GGcdYOcS5I9efqJPjhaMpyUVA5IWOToIiULMychHYRtWNhatv5z+lbsqAzgSHqgjDxyzonIBapSE8wZQYqbGY6S/Jc+51BCK7PbsiG5TDtqGz8h9eUgg9jDxje+42FmKg6zoac73HGKsDZS8n3IY/XshZQT0Z+du5BrtDDvxtAkkPkk0Q8+fwOQnweNC7eyTHRELQ5aXesHRL1wEjaINQHa3TScWHi0HSWVSy/ULEon+GL/6E0Tjm5ZAtkwK3/YZBuO7SgpEi5WZECD/sQkhb6jibyUwW1HxGDWAYnLFybe3cq59g0qOn6BSo+kyYqVSPBxsYzHdqSn/CskZ9OB2+9INxomsZEFNQuCSd2kwRORRpROmJrlgeQu0JtuqeHCxHGuIxEU2TBp4yecRnshObF8i2rGYrFhSmswQdC2nHSQwLYwPHjwreYrTC5uCdtdLMO8ECg78RwadcdVlaLqcHKYxIaBWPI4Bql1s1zs1pBNWUGTNeToUNTsyt8CdCI2TNGLUkJlfXAETLnYG4ZK7MmBNrEk+w21+EKtNap2tZzeE+pZzws8L/C8wPMCP70XeE5+XuB5gecFfgkvwJc5TPmSd4sk+NqncZ9R4Qff+I6MptGSbMtSXawtvkNKZFsmsLNLdtBnRLOdJLqULbQoVlKA7pCcV7IIV7jEbon91pNO/oRSJGVF/8pTmPwJI1i2mfByy3Cxv6O6qrJhB27qocwyoCtEq35A20hORzGRbRkFOGO03T05dlczkfCFNCeyu8t+YavMHg0kIs9OjESAEQvfeQn6V0jO+FRZIjY+KNYwoXWuWMaxd64IyX2JFDQPMqM9F2ivfHL4mUnDfUZ6LNYJUcoXEqfJDpfsA0rwl4u10tUla/gBJcHwDYd196Yt3PgJyZUvTIxnoG1huEnGTDwob2hCQwyKtZBGw4R6xijqouQNp1IrYcOx4QYstt3nbwDyEyG/DYqfCYmAtb94tOXrF8fFUjLhpufXxShHTLx5ZifekeLyIxLHtpmJb30rWthZxGA/E9hLgsNhxD1+tvn1dFp6StIJrrFTSB+RZmaNkv3lFJ4zlGI98x1bi5hz4zRSF+H9zjOfJCXJH3mnoB+R/lCcavZPXpGtvxiDmT2QDvx1IZoXj0bY2g3blA2PBqzL0Bfy7ldF0TZPfeKFDdlq3ZLobFhMWmCEAAAQAElEQVSx50FyvSSLO+etiFNYneL5zNGTANHad4vpHk9Ju9iwisHMHsw8ZISdJ8bzbrvWA6d203ckl7rtLGjCANjMPeacZHdMGz0Yt8oRAAQrKVKzISHt2akbGE4B9iZSEPHoSNNA8AM8lvzCQxhlL911Aux1NwgWHuj5+2dbSjmZDdfQ9bo9JttUUxeCD9+qNiTx2E/3BZ7Tnxf4IV/g5/8Yvvj8kDOe9l8dL/D8u/Kr45/z8yl/dbzAfK9b3/MgWMkR81UxPP9vgcZsGN8c+R5IYnTiKCQSbd9Bm8tTVk/wclpLbpGeFGTGJ3JK80ekKloGggGuhIiVXCBSrflu0CMmvvHIOeCEN+3IKT15yKkXwr3zD2A+Mzw1OJ8yExolePGwdFwg7ViTg6uLM3ZO3H9WB8zZ8UwMpvaFHZcW7rLiFOKtWwiQj5KaI+YO4WDOTNWOqyvp6nDile6ZyC8kHR4IMjGHQdOUEEzi1ilt7oiJl6c94S2SwHqhHQly4Xh74ReY94y8+ara6MetJt9PSM1Czmj0geuz09RzNkxnY/Ig9HT1d57ZKTvjkTGHm6amUQPyJyRTfoUkYtyfMVgIdURj4cwrCfaG2Sh646mZzP3OuCZzXoIrjLb89m8Aplcyf8QyHgOxRLtvfMcV5JfHFAW/8q0GtM+99uLkYhs7o/c7ukWGW6LX8gVGig42D6Y2El4JRFJcrCBSucUfK7tGt77+s2qlqfMVoqGL1ZnEQRpkh+gNvTgoJ8m+oSR6YC+UVC7dotayV+VCOxw/YuLdaWy8ENDOQ3Da2aU3TNlRnLQps9R90MQ790SRPFv2iC+0FNL5xCckEe6FKbTLZFuSX3/glhY/YuLlFGCiVNfopR+QYtsMsOyXQ2SxogHaURp9oTRcApu5R2a06g21c6lxxkQrSrpDsZJLwR0m9+H57//F6W9O7AzAlAViQowd0Mq1sn2gWIi2NXlQlm1Jlm1l2WesxjaqdETDLHUP6lnPCzwv8DP/An/Gn/ZH/cx/hucD/GRe4Pl35Sfzzs8pzwv8uF8g3+Hcb3Pqnq+CFosN08Zf6NEQMOIjJxZOgl0qBsoSyGKhs0tguaRbpEYseyrsI1q2kz1gKBqGGFO3xZWV+BavktFuPLLYat2YPOilB+ImU0yAz9WtEyrcVFq2L1Ayf8Q6osvZsC0OpjSYUYOOJPuAiW9dU+uF0nDpgMRipWZAhEQCJzKRWIPZPYxzRc7euFhWqRZaKr9CsdC13AmMttBFI+DbkGi7k2p8hWi0seuqpKnMTABi1Fm2XyjLtiTLtrLsN4yIL1mT1Q26enaLZcsodndpoT0cQCJ2UiYOHlwaTbpBeiRlt7TQxTOzFDXwgWSqXyGJWC+afMgBmSVyliOyD0Iww8UyHtsw8Y1vJcxsxRVGW377NwDnh0R+gWzwjoyunh8pCbDTz6zr18XRSH7FGdU6sL/kgh88Gs6k7idkNrfLRfh9lMwVR8vMzm9JtrS8cJUgYpGXw9La2a1JRJAzM68Y7c4zJ7mvMLndmdj4iIkrcpeJczYkkwE0IoLsXDk8T7UwIR7j6oGpI+qcD6SvhQuJW3fAnBVH6nkdWNJhaEE8Ca5e4Q2nPOI4p1GWHU4yUc/ojLDoKVlYPZxzIuGVitRfIQX5LGQZ3YLiiacm3jswP3GPoIoWjJ7o+FZzRAp6xo7p+0bPOWtWDmFEgBskwXlE1UAU9rDRy+kt+wrJ5X4ZTEh57kY3BIMnHp+6xJxT6xZh6rhB5pS8Nx9z+38DkNbq6dhmoW0hMzCS73c68hTDOwdMA967op0xo6jPEdQAtSjx3P2I6Q3fsMXP9rzA8wI/0y/wF/45v/Zn+v7P5X9yL/D8u/KTe+vnpOcFvucFfqh0vvLxDTFf8/LNcCEj+ZKHwckS9PvejtFuPFMYSnZ6M6p8vmcyojpyBKoBSHRgz+W8F2caM1JZnfge6Wr+BpF76EImZyyMG2BDEtw4s1uzI60ZSPk+K7nwhUnHQ/mAMUZQTU3I6bNQWH6LtJKbUzNgeKJ4UsGcFex8ijMzvEjy25H5rV/4Pquc3I58rsRcZD8vMTNS1XO/5GlmxjTn+mm7R2bVMp8eOqnPHnKDaVieNhpq3Wh74dxlSklgvcjC9mZbns+W/AlpLt+R6anv6AyCE8eWTGXZIGKrTsjnKicTPPh2fs4cZ37zR0y8nFNIZ0/rNY56vdPMbejtDjI3lVytEUhJdWSQumrZqGjyHVOTPDhN7Hf88FZTFWH3vEFJziF451woh9/6d/ODofdfGs0QwXacQPnBUKwNtesEmJLYkaAcFL7FQWboAyPilLJ/j21FllPZWUSgo3ygZJsN+0B1RU5wjaa/2RcKbbkWfior4yD+FSa3u5V72AsVxEFFE/FCFZktNGVtKBR1ubtefAkLZE9kH9FLX0jONkOMLnWzFAyom3SNXyalNqVmec6JBrooljXhYOI4bPQEOC0HbpXrCi1VX0hcXpxILO9cjSwWG6bMHrQcGWFHAtvC8OAX/t5bLlksNqxxEIXYuHAry0QnzKFotpEt2wsBWUPfUUsHxfLLLSvWrWE3KSJhMfGd7zVifaeWiVX9Cklg4qKYgjpyiF0hkbLscMleqIU7V9eoDbuVU3OFtteUlj7b8wLPC/wMv8Bf9Zf8MfqT/4Sf+xn+BL9ar/6T/dz5dyT/rvxkT31Oe17geYEfywtY/R7H17kThpCSbZyaE0ZbrndctZJscpKyWzqg9jW6yKnLjiLZR/TiC8nZThG6lC30EsVKKaADhg5H3MiO0W488jRSDcEIFElZ4V86SUxcGKMD0sBILrePKJk/Yn0iImY8VmTDlJZBJ4QfkPk2HBduT2yDEtI7oknouPSJkiwt9xk7Ew1MhU1MhW2p2F2lsopGw4V/cLGiA83Pxj6iiYTfo1jGY1bnT5hdsmbtSIAphbdIonlQeGLQJs60hfbi0fCNXaOZkKIrtMQsy4PEwu3wSO8YbVysVZYWOX+s7BrdsoQb3zDxjXvVnBANLlZnEgcz0LYw3FKtm+yFCprd5H1ASdRYWZYD7IMiUtfGS9jspSy0z1zhl95mfcfvjkSz8zMhceydR1v+nlq/PPaXxpSEp2ZDfrVsrjwJihID1YvZ8JUm+sK2ovx6Stk2i3OqwM+YT0VPrRvHbkg/Rgs7dcgJzpxp1Q9IEYwTCdgn3nbmVFtIL8aZqUWDYGeO8DozJHULmZXiTL/GzG2WYEP6YTGmBHb/4K+Dp+bEqQ4/OWXlC4FcMXCLTW4bMxseMfGn99NEzmDwxRlQvpC4JVdIItfNi7xwCufX8kxdnFomsoe3IxSeeDxCsrsTYPlHM3UcMjw7PeHLU9Qzj7wDcweC6EAGtZsNixLpBqdiTaAu/OU9DzXGbWrdUhIxePSccsU3fes5YuJb3xsJftCjCb4Jc4282YzmE46AlADeBKN4t8yczwp/15PE0wXstvHBzCPFrPDMCqI89tN8gefs5wV+RC/wt/21v+FHNOkZ8yv1BZ5/R36l/pN9PtevyhfgSxzGd8Z8L8QhGEENne99CP2+94b5Gkl2akrCeMX1HZFE1AhviLSMkY1eONGaxIjFmZnC3KM3K6cq6cR32KZseGqAdZmOWRvqZXLpyW2OdBwQ+U0KPZY0Tl2dDeODxSiFYLnH9tnO2Ax1V1i54xOtMW+cN2ryjDlj6tF5v/IgtY1PmLMjDFI2ZzAAaxykgngipoYuHhYdTHPUHVMW/YCUNo1UhNPSwxM2Jheks3q392QKPnw1Bppr8No6A3qLJLD+w9uRIBeNZ+bCvCOTuBp5gp0Tx0YlHYJf837CZptndpVbZB65uQYdsYMz6Hx1hFW+9E6nnabkGkULv0KKWrMwZYSZCXTmB1LTfJDeWoSdE4zITpzccQhqKJ904Kud9qZ3XMFpJlr5wsSEufz+NwA7ROvXww+cbPePkiXkV8YUBCOdEAFug1sNaF/zN/ntNl58IcVmllCNq9xQK3/YMCIjEdVSEw4OJ1cOSlryQn+iJFRNXSO99pWTRvMLG5UTgWJ1BnEQKjtEb+jFQTlJ9g0l0QN7ocwfsTYkXOaFG9hLuURy0U9OZ/kNIq/DlbJQMSY43Ise0aSN7g9ExNBr3T45MqI6nzi4uWRNPDicWDgJdtndF7ZClnDjR0z85l58R08PM8Wy4ct1hdRUv0TJmlVkwyq8cCKvykFTM24PakdSQsO0YeI7Fys5IOXKVs6GlUe7cFcTy7hg8zcAy9iwiOhStmtuzdWPaOqt/CGQbUmWbWXZlgns7JpY2lGsZI4usuX0HFHPel7geYFfES/w5/9Zv1Z/+9/0x/6K+CzPh/jRv0D+3ci/Iz/6yc/E5wWeF/hpvABf5/hmJ72j+JKHyTae/CfKm27ZDpH5I+IXSsOlHfVaXuELJ7LcjH2FaNWtAUuYQt5RrGiALhERU5IbKquEIDju1KBoYbnFYqt1m+yECsm1XmgNX6gjWio/YhXUQbEM80IAppeTwA7cE3OoJdmWJdmWJdl+801bKE1erNQOyGC24OYjhYnUEb04yIxmdxQrOpAqg+SwBCpWK/3kIonpEpN4d7GiAekJHPGQatiNIhCTuBD2hmQQ7QuUaEGX7lGzpkoKbh42sauLMxLZ3WW/Ix3RfIVoUka8XJpYWugdZTQ2L9/YGcVKBZA6H1HiKso6ITXlxWyibqGC+EIvpAKzutpMtCHhra2WjGnN1nNCisoXJsZtv/4GYH4QzC+O+XHwE1EmwY+GVGIEiFj0b/T9F+LUa/WCnQVu+ZUeGZLjQl5IVP0GybW+OOc07PbO+dW3Yxby6+uUHTlx9YWJ4xTmzlUTV2P+Oya3n0H1HlN7ym08NZ/ez9TZ5MDhq4f32zhKsijUMZ+AFIcS5L7AmVNT/ZuQbup6AIhxHLMxhiYJByhoDoxF3Di3oiA7TYiJ0nuNdFKTGXPHd04XY9p/wNSmjWpSqRnfOQNb84GtQF3ITDqZEY4zFAkedXGEztqRXOq+xfMSqbvAXIJJATzDOW+itcPpZe99bpGa3I+iGGVMZVwIKThWHiTAkuMQDIKRwehDae6IiTc/DEx15WzM+IX8dwCL+bCMAzJrWn4hIeIVpin6G2Yu3s+2Y0ZQy+zR4Yk372FoGRUN3uqF6Tk6JY89L/C8wK+QF/hL/4I/Wv/43/Mn6C/6c3/dr5BP9HyMH/YF8u9C/p3Ivxs/7Kyn/3mB5wV+ZC/wQw/ia12/V75jxNH49kdw/M73Zby+Z9LFiOz5LvmGh1t3FjwItIeOM67zEbF8MWUeGiRGeTjdaNiZI3MlLH2kiGKJgnQSkitZmHjzGdiaqd0HUkE91kuA/QxFanakizg1MyocAdL6TCHmAErQP3gzqIMJmBDAqaeXvb23mJpvds5p7cJ8lPAdOZ2D2DmTmrlFd2S0Zi6x1Zm1fDh7eQ+g7x2ZGqOGQ8iHTE95tzmTJCz5N14VPRgA6l2vlAAAEABJREFUY0xJSw5MuJACLIkcGWwtBKOO2Qnw/vP7PsxUagBGZXBGHJF5SXJIVWqDmR2kqZnhKMl/6TOfElqZ3ZYNyWXaUdv4CakvBxnEHja+8R0PM1NxmA093eGOU4S1kZLvQx6rZy+knIj+7NyFXKOFeTeGJoHMJ4n+jZ7e9TcA9fUPiJJsfj2UBhOGg3a3JMa1+I6SUiPWjsQxSgNf+t6zisuJQcsSyIZZ+cMm23BsR0mRcLEiAxr0JyYp9B1N5KUMbjsiBrMOSFy+MPHuVs61b1DR8QtUeiRNVqxEgo+LZTy2Iz3lXyE5mw7cfke60TCJjSyoWRBM6iYNnog0onTC1CwPJHeB3nRLDRcmjnMdiaDIhkkbP+E02gvJieVbVDMWiw1TWoMJgrblpIMEtoXhwYNvNV9hcnFL2O5iGeaFQNmJ59CoO66qFFWHk8MkNgzEkscxSK2b5WK3hmzKCpqsIUeHomZXMKkPlCIpq3mCHQkw5WJvGElCbGDZVpa9UHeYKq3sG67eJNsNd0l2U2zZL9eznhd4XuBX1Av86X/qr9Hf9bf9Rv2mf/BP6t8I/Bv/6l+vv+Gv+vnHf9m9wY/vn0n+medv/OXfgfy7kH8nfkX9S/58mOcFnheQjF24+h2PnCz74FrxjtQkL8kmJ8nS97rWsj21YCTbgGX7hcQ2HMdEMjYoVlKA7pCcV7IIV7jEbon91pNO/oRSJGVF/8pTmPwJI1i2mfByy3Cxv6O6qrJhB27qocwyoCtEq35A20hORzGRbRkFOGO03T05dlczkfCFNCeyu8t+YavMHg0kIs9OjESAEQvfeQn6V0jO+FRZIjY+KNYwoXWuWMaxd64IyX2JFDQPMqM9F2ivfHL4mUnDfUZ6LNYJUcoXEqfJDpfsA0rwl4u10tUla/gBJcHwDYd196Yt3PgJyZUvTIxnoG1huEnGTDwob2hCQwyKtZBGw4R6xijqouQNp1IrYcOx4QYstoNLw6WiWOkBwtd/AzBs+frFcTF+WVzRpufXxUhHTLx5fo5MvCPF5Uckjm0zE9/6VrSws4hBfu/kfsTrrOGR0Grd5tfThHiOoTUwOtGZd0rUTF2YxugvHBbOeVQmqkaAdfY7Mmx0Ej2zmI0ZERpm66SIM5lclDSTZUzZASmFxSb/yZOL51ffYGYFh9PFGe0Knpyq8oUAl8re8ga0n7Bk296T4UdPXfjChmy1bkn0LFix50NyrSSLO+dtiFNYneLtM+6I1r5bTPd4SjIus4LvPDOjn5Di8LzxMbfxD+QyqdtmQxMGwGbukbNy056XqpazYaMzJjXhO0ZbDtCWPeUHpAF7E8lHPDrS9QAS1GEE12OS2O9EIZa36Th0jArEBvnnShylPCMXb8ORU4RNNjoEGz47dLqYVeWEcxZ7yh7/ab3Ac+7zAj/GF/gT/7jvlL/19df95T+vv/6v/PWP/yp6g/wzzz/7/DvwY/xX7Bn9vMDzAj/NF+DLHXb8Wtk4G1/5+A7ItzwK8v25HoUEKl8cu1M6SEB2PgwtDe6wSbbMBGidyjNnLmdx0MqHUx0t5WDgew+lpXZbnMSNR84BJ2Ra+cLEcWhKTx7SHBuWz8KHoTKfJcLLUdBTEe2IlTOpwWSTh0KwksE1ZX8bOHHO7NsSBzdnAilqCKoVOw59YTQ8ljM2Hx6WuiNmXjjIec3uuLqS5hMtuWdBP3HKs2cMJTRiiwxnL7/EtLaBYEPCzTbpFklgvdiOBLl4PHNuMO+Z9OZ0bWFx42fkzVa2OrOrfGA+MRUxcvno23ml1TvodPUozRMMdjrtR0zMgKpzTlijBuRPSKb8CknE5rCZGE40FsK8kiAXS1x445ue3J0zrqmcl+AKo+1OUeOFQB9s4fobgPxqGEEg1nDbNr7jCg6/IirxnWdOcqB97rUXJxfb2BktJ8lepMfEukWRMltsYWoT4sKh2lysxjt6cjpg4lvXyiz0FaKhi9WziIM0yg7RG3pxUE6SfUNJ9MBeKKlcukWtZa/KhXY4fsTEu9PYeCGgnYfgtLNLb5iyozhpU2ap+wUimVzshdJwqWjpFknkXC9MoV0m25L8+gO3tPgREy+nABOlukYv/YAU22aAZb8cIosVDdCO0ugLpeES2Mw9MqNVb6idS40zJlpR0h2KlVwK7jC5W6e/ObEzAFMWiAkxdkAr18p2j6belFiSZVuS+0cs2+ySvVBSorhYwZcn0p633VgL7XB8oZ71vMDzAs8LPC/wvMDzAs8LPC/wM/UCfI2TufEJl1CNDZPtcb1Q0dqLBm78A8kZj22YOG6PYl+hGWXKfMBQS5jowYghWLiyEt/iVTLajUcWW60bkwe99EDcZIoJ8O1uJ6TAJnmLSkZZJtrQBHGgauJ4SDAjBx1J9gET37qm1gul4dIBicVKzYAIiQROZCKxBrN7GOeKnL1xsaxSLbRUfoVioWu5ExhtoYtGwLch0XYn1fgK0Whj11VJU5mZAMSos2y/UJZtSZZtZdlvGBFfsiarG3T17BaLJqPY3aWFtlXFkRwZ3zDacgkdl26QHknZLS108cwsRQ18IJnqV0gi5mzJvyGzRM5ykuyDEMxwsYzHNkx841sJM1txhdFuna7mJNv6Lj8O8rvm+lGQXyT3XxjV1V9do6VwR4Lyb8BMSS3YWeA6DKA/fPkw7lC+kN5GXyE5hmFMiJXzqQ7YkFx+ZN3iIFX0dT9gTsQpYKfli52ZzX6Fye1OdeMjJq7IHSbuW23nLyTJXXic8gMmxGOkAlNH1DkfOGf0U6cBb90Bc1YcibLcrUPYsIhIcwgBRlGt2+IpK28hZwYRE3X2JaeDmqZmSykilrl40hEvkZ58lpwRpIvSsmJ5auIMYFwifGUQMGrD8a3miBRkNhJ1zCYY/g1xn486kOY5N/PKOQ8Fuvbhk4oK5yx2WsOZc8XRch+KYpSnjinVgy+funDm1bpFoA/gJmsInFz40ZlJgsKVCyQPcuqkyC4JjkouM6f1ilNAcu6W/IEzqHoQ72hqTwihY7LkGrNhHJu912g+szihQrA8PcsZ9djzAs8LPC/wvMDzAs8LPC/wvMBP5gV+JKfM97l8vePbHV/9+Fo33wEJJhf94HwrrL7j6uU2o784g6iCJ4fHUhNMLjh85qeyfJ2dmk9OV/M3iNxDFzI5Y2H5cECTxHfI7DbsuHpo2WclF75wGxU6d6YHgjGKrgR4PwvFXyMt1DCBnUMImEAcvWRiUhhisoEDrrNyzvf76mVYa3NE+k9ITXlwncMtaOHjhuP0NAvCql/zGUQZaSo7pCEb9s45p5YGcnS06EtMw/K00VDrxowXzl2mlATGxZsOtjfb8rzP6BSildN8RtrJMZlS6ghmjw7BhvcTVCyn54XkylGCB2cotvLVMyL8iImX937EX2Fyd54zktvxNavRXJE7zQfLW1AKT4KKknfMfZMHmU0x+x1n7mQJUg8cLOeV5hyCd57ZvzjvEC6MMfM7fgREEb8GqmvjWr802gSYTohQDgrf4mCmfGBEnFL277GtyJksdZaLli8wUvQrVFdHEF2jNfoBRbxcCz+VlXEQ/wqT293KefZCBXFQ0US8UEVmC01ZGwpFXe6uF1/CAtkT2Uf00heSs80Qo0vdLAUD6iZd45dJqU2pWZ5zooEuimVNOJg4Dhs9AU7LgVvlukJL1RcSlxcnEss7VyOLxYYpswctR0bYkcC2MDz4hb/3lksWiw1rHEQhNi7cyjLRCXMomm1ky/ZCQNbQd9TSQbH8csuKdWvYTYpIWEx853uNWBCMQC0X64MjYOKimII6cohdQXYwJW+oxXdU16ha6kJmVGfDELsLWY0InGghIBvFKWXTs54XeF7geYHnBX6yL/Cc9rzA8wLPC/xwL2Cb73PCN5wYAUMTnpodJ29JtmUJN37ExOoy++aEssOIFtrhXvpCNNtCjH2NYqUU0AFDhyNuZMdoNx55GqmGYASKpKzwL50kJu6P0QFpYCSX20eUzB+xPhERMx4rsmFKy6ATwg/IfBuOC7cntkEJ6R3RJHRc+kRJlpb7jJ2JBqbCJqbCtlTsrlJZRaPhwj+4WNGB5mdjH9FEwu9RLOMxq/MnzC5Zs3YkwJTCWyTRPCg8MWgTZ9pCe/Fo+Mau0UxI0RVaYpblQWLhdnikd4w2LtYqS4ucP1Z2jW5Zwo1vmPjGvWpOiAYXqzOJgxloWxhuqdZN9kIFzW7yPqAkaqwsywH2QRGpa+MlbPZSFtpnrvBLbzMbljzQ2mI2nFHfAWfjh8oKO66AXwtHh2Pzq2MUSHKbV0I7YQi+ZKIvbCtav4ZmbqvDycET5fxBfsnkF9Sx5OHUlEPTGnqPTGndASmGZcQeDc/OfDJpCcvsxtlSDWK5HoxaSGvACP0Fl3hHZqU4s66xXakiaBXI3O4vXHTVbYx8Dg+9xF4kRQenOLWkch8Yue73uNIDaUx0xMSf3k8TObcGX5z+8oXELblCErluLvfCKewbJ483X5yIybDUhb989BfPzFS9sLfkaaJSRyLnxBEx9KVBOIOJ4cCL01e+kJgu9is+mTk1+fCX99ycEukOk9s8p2xxcOM7ImI5KeOKDSJe+d5IQB4jmLYEX/CmeJsZzyccgWdKEB5kVGqYNZ8V3oYjksSmOjoEu+T7rFUH5yRIdpymnIPMKRDmPPZTeIHnyOcFnhd4XuB5gecFnhd4XuCX+AL7dzm+0GF8t+xXvdn4esc3PrTu1ZA+cf8mmLq5SOsIP/Gs5HzKesYLqcllMpeQJGeSjfbOkSnLPjWJUrPjiaBe8WibU3IcGPlNCj2WNE5dnQ3LnXPdXiqcovmsvFETG6aiBalYozdein5AUliFIrOuMGftemo2p3PLvTB3SGKQ0jmTAVjjIBXEE3H70MXDooNpjrpjyqIfkNKmkYpwWnp4wsbkgnRW7/aeTMGHr8ZAcw1eW2dAb5EEln9+bc8Fjx4xHMz7MYmrpSEwWI1tY19jP2GrW8fsKre4zqG45xejjTPofHUERnHbyWc2LfDsaI2OavQjZ0BrFiZNmJlAz/pAapoP0luLsHOCEdmJkzsOQQ3N7Qa/2GlvdscVnGailS9MTHh9eaYlB+Qanz8A8qtgctpxBcdfESOF70gAt8E0L7Sv+Zv8Oiq9sOkyEQLFBgQzrnJDrfxhw4iMRFRLTTg4nFw5KGnJC/2JklA1dY302ldOGs0vbFROBIrVGcRBqOwQvaEXB+Uk2TeURA/shTJ/xNqQcJkXbmAv5RLJRT85neU3iLwOV8pCxZjgcC96RJM2uj8RyWTGrA1PiFx+wJwVT0PQtjBJQfwWW0H2CqO9uRff0dM7h8mGL4dgpsEvFCt5AFE+oYZLgyQxZb1wIk8Fu0m/3F7xjqSpiinbSie8dLFSAzSfrZwNU/iNu7pYxgUDx0LgUjakL9Caqx/R1BvdkizbkizbyrItE7i7ulv6NqRXrEB7CJzOhTZs8+jUPva8wPMCz36VlGsAABAASURBVAs8L/C8wPMCzws8L/Cz8wJ2vs9J9oaJJQQcq56cQ2T+KJq8uKRyaUdJZJX1iWfFHm4fkbjcGrCEKeQdxYoG6BIRMSW5obJKCILjTg2KFpZbLLZat8lOqJBc64XW8IU6oqXyI1ZBHRTLMC8EYHo5CezAPTGHWpJtWZJtWZLtN9+0hdLkxUrtgAxmC24+UphIHdGLg8xodkexogOpMkgOS6BitdJPLpKYLjGJdxcrGpCewBEPqYbdKAIxiQthb0gG0b5AiRZ06R41a6qk4OZhE7u6OCOR3R36jnTYIj05HzmxhH5wabi00DvKaGxevrEzipUKIHU+opR7iHVCasqL2UTdQgXxhV5IBWZ1tZloQ8JbWy0Z05qt54QUlS9MjNvhdC204YsCCl3/DUB+i8yvhqjbr6799ZBfCoc3SNGX3lpmtBe84+uoKYMwvXNfSFT9BsmlufNbwi+6C/OrZvQpqZhSfNVQ0NwJyZUvTBynsLO2uMhV37F16EVm9NivMLlP55KZDJAjIsgOhPdByznphZxJpjW3SE0+B0VYL/cFMoX6HgBiHJeepScBRWQG2gWf22ankAGJUnyNTKKmYy6RLsa0/4D5PCmnm1RqxnfOwNZ8YCtQFzKTTmaE4wxFgkddHKGzdiSXum9xnqi9F5hLMCmAZzjnTbR2OGew9z63SE3OoChGGVMZF0IKjpUHCbDkOASDYGQw+lCaO2LizQ8DU105GzM2TsisGhtqBHxaN37ESb4+w4Ezu/qOGUlv3hMN6E7HIIc0PiH1iOx8tAREheA4CWzinLd55j/+vMDzAs8LPC/wvMDzAs8LPC/wY3+BH9kB2/e4F873R77sYZ/f91BG59tke7jJB0bDY69c2JpNL0MQmMb30MSpu8aUpe4GkTtuNvZ8cd3FxdGIMp8bkFz8qHEPTpl09YTUYe0D547oxC0p0vWBCJmHU007nIb2f2ArUAcTMDGA08cM9s64xdR8s3NOaxfmNcJ35HQOYudMauYW3ZHRmrnEVmfW8uHs5T2AvndkaowaDiEfMj3l3eZMkrDk33hV9GAAjDElLTkw4UIKsCRyZLC1EIw6ZifA+8/r+zBTqQEYlcEZcUTmJckhVakNZnaQpmaGoyT/pc98Smhldls2JJdpR23jJ6S+HGQQe9j4xnc8zEzFYTb0dIc7ThHWRkq+D3msnr2QciL6s3MXco0W5t0YmgQynyT6N/qpl3PKM4UY6JmH/wbg9usgiPXnQdDupuHEwqPtKKlceqFmUTrBF/tHb5pwdMsSyIZZ+cMm23BsR0mRcLEiAxr0JyYp9B1N5KUMbjsiBrMOSFy+MPHuVs61b1DR8QtUeiRNVqxEgo+LZTy2Iz3lXyE5mw7cfke60TCJjSyoWRBM6iYNnog0onTC1CwPJHeB3nRLDRcmjnMdiaDIhkkbP+E02gvJieVbVDMWiw1TWoMJgrblpIMEtoXhwYNvNV9hcnFL2O5iGeaFQNmJ59CoO66qFFWHk8MkNgzEkscxSK2b5WK3hmzKCpqsIUeHomZXMKkPlCIpq3mCHQmw5otsmLgoNoUNjGS4PlFL31Fdo2qpC5lV/YQotWzjpGUnpu+ADdmwyetZzws8L/C8wPMCP7kXeE56XuB5gecFfvgXsPjDlzl7ISNtZ5dtOdE7RvsGp0S2ZQKAXbLLEkiybAM+oASJDYplCet2iRJ5MjU2ZQ2ajL5yi8WGKXVFKaGywr/yFCZ/wgiWbSa83DJc7O+orqps2IGbeiizDOgK0aof0DaS01FMZFtGAc4YbXdPjt3VTCR8Ic2J7O6yX9gqs0cDicizEyMRYMTCd16C/hWSMz5VloiND4o1TGidK5Zx7J0rQnJfIgXNg8xozwXaK58cfmbScJ+RHot1QpTyhcRpssMl+4AS/OVirXR1yRp+QEkwfMNh3b1pCzd+QnLlCxPjGWhbGG6SMRMPyhua0BCDYi2k0TChnjGKuih5w6nUSthwbLgBi+3g0nCpKFZ6gBcPwWllP9l3/XUx0vpVsD8Lli/h/dfGNETbkeLyIxLH1oiE974VLewsYpDfO/dfPnOv4ZGSB3sHENowyEG0si+d6Mw7JWpaFqYx+guHhTOHykTVCLBcB5UcBCtnWDHnxVPQX10p2HFE9ooX2CnoR+ScUJwu9k9eka3ngL0IOJyu14VoXjwaYWs3pGcdTl0Inhyw64l3f0+GHz2F4QsbstW6JdGzYMWeA8n1kizunH8KxCmsTvH2GXdEa98tpns8JRmXWcF3npnRT0hxeN7tmNv4B3KZ1G2zoQkDYDP3yFm5ac9LVcvZsNEZk5rwHaMtB2jLnvID0oC9ieQjHh3pegAJ6jCC6zFJfNyJBqxvFMzs1IDzGRlVfkByHbVjGPmBpW6cfz+qL2TWfkx0eCoDrSDZcxdWZ8O4ImJ6Hv/JvsBz2vMCzws8L/C8wPMCzws8L/BDvEC+423f5fI9L9/ogvkOyBe8fncMj77xHFdO8L2Y4albhZkFZXwETm/+iGSjNY0O7SW+wuTi6bksTuLGI6fnhAwrX5g4Dk3pyUOaY8P4YFgC7p7PkfxylEyAJU8ZUYRh4WFvSBKrOLimMHvnxP1nc8C8czwTg6l9YcelpTdoLoX4Fgeh5Cdapy4eFh3MmVF3XF1JV4cTr3TPRH4h6fBAkIlzuSHsNLOPeBWnM/oREy9/T31wBKwX2pEgF45nzA3mPZPenK4tLG78jP2E5Bcyu9EH5hPTGSOXJ9jOK63OGKx8IXD+KDRS2v2FOXFjc05YowbkT0im/ApJxNYl6KQoFnHDqOHB3jAbyTfOLSfxxc6YZnNegiuMtjtFjRcCfaAThuDbbMLNvtP2q+COKzj+ipj4zjMpOdA+99qLk4tt7IxeV1hIT6NblGyzxRbCMXRJkQ4uVnM7WsMPKOJb18os9BWioYvV2cRBGmWH6A29OCgnyb6hJHpgL5RULt2i1rJX5UI7HD9i4t1pbLwQ0M5DcNrZpTdM2VGctCmz1P0CkUxuzClLeMLOTQpP8sQRwr0wjXaZbEvy6w/c0uJHTLycAkyU6hq99ANSbJsBlv1yiCxWNEA7SqMvlIZLYDP3yIxWvaF2LjXOmGhFSXcoVnIpuMPkbp3+5sTOAExZICbE2AGtXEtGwgXBSl5IAmKDsmxLsmwry35DxChxQgVf7sUX0muKgNETEAVcZB8iO7FOqGc9L/C8wPMCzws8L/C8wPMCzwv8TL2AffxOR8ztbWcXX/TUCB7UHUpqXvpEesRaIHtVFr34EVexB6cMglGMiCUGdIlXYrQbj5xBoBdq4c4tLWlw40Vru2NR4ZZusRllmZoNTRAHqiaOhwQze9CRZB8w8a1rar1QGi4dkFis1AyIkEjgRCYSazC7h3GuyNkbF8sq1UJL5VcoFrqWO4HRFrpoBHwbEm13Uo2vEI02dl2VNJWZCUCMOsv2C2XZlmTZVpb9hhHxJWuyukFXz26xaDKK3V1aaA8HkIidlIml0cJxaTTpBumRlN3SQhfPzFLUwAeSqX6FJGK9VPIhB2SWyFmOyD4IwQwXy3hsw8Q3vpUwsxVXGO3W6WpOstewDS7wu/7qml8Gj78iNkb8FhQrdQV6wO0XyM4OXz7Z16+i5fRW+QrJZWbn0XSFq4RfXbHWDLKnld9eOSV6Ioph6N2j3Pve00n0XGBqdmdm4yMmrkj/xPMZiHPyug9JGI9VfsCEeIxUYOqIOucDmdvChcStO2DOiiPxgXK3DmHDIiLNIQQYRbVui6esvIWcFURM1NmXnA5qmpotpYhY5uJJR7xEevJZckaQLkrLiuWpiTOAcYnwlUHAqA3Ht5ojUpDZSNQxm2D4N8R9PupAmufczCvnPBTo2odPKiqcs9hpDWfOFUfLfSiKUZ46plQPvnzqwplX6xaBPoCbrCFwcuFHZyYJClcukDzIqZMiuyQ4KrnMnNaNN9Vt7hSdQopOnEHlO6aFOs4YHZ54ec9JnDm3mLPSF2RWagvDO3fn1B3yjHzseYHnBZ4XeF7geYHnBZ4XeF7gx/sCP9Lp+W53cqaH8y2Pr458/1ucr38fHIFvoakcpxQplXC+I744cyoHCZJb3rOIX0hX+Q0i99CFTOSwnRAwvwU3yOw27EhL6infZyUXvjDpeCgfMMYIqqkJed29AtJXSGuGcSwT2IdPB5QAY0b08KnKGaPDuUj5NyFzWrewI5lxQnLlwZXjjvt5iZnRLJiKnH/NZxBlpKnskIZs2Dtndi0N5Oho0ZeYhuVpo6HWjRkvnLtMKQlsf1gaMUoRE+D9TO9Ic/Ud00JPRy8kjtEaoDLQT5Di4SRbXSS3MPfJ/M3fOWVIqc+oDRMvZ3prvsLk7pxmps4ZqeGSw9dnCF9OeurKs+UOV8gE5lJMS/Jwomu+zglQQ3Wjbcu7NM48gneemb847xAujq2ZHIsYHuCuvcTgdzY/C2L8XCjtSFAdjLjFQbE+EC2W8uCXvhU5k6XOctHyBUaKfoXq6giia7RGP6CIl2vhp7IyDuJfYXK7WznPXqggDiqaiBeqyGyhKWtDoajL3fXiS1ggeyL7iF76QnK2GWJ0qZulYEDdpGv8Mim1KTXLc0400EWxrAkHE8dhoyfAaTlwq1xXaKn6QuLy4kRieedqZLHYMGX2oOXICDsS2BaGB7/w995yyWKxYY2DKMTGhVtZJjphDkWzjWzZXgjIGvqOWjooll9uWbFuDbtJEQmLie98rxELghGo5WJ9cARMXBRTUOUTsssewQ6ivKPedM0aVSu7kN7qb2h76orETr0FJRi0XyhHdkDIsqSgnvW8wPMCzws8L/ATeoHnmOcFnhd4XuBH8wIWf/gixy47u4pi2YvrHYWiLrNvTig7TG9ouFhBqyR1OFZ+i2KlBdABQ4cjbmTHaDceeRqphmAEiqSs8C+dJCYujNEBaWAkl9tHlMwfsT4RETMeK7JhSsugE8IPyHwbjgu3J7ZBCekd0SR0XPpESZaW+4ydiQamwiamwrZU7K5SWUWj4cI/uFjRgeZnYx/RRMLvUSzjMavzJ8wuWbN2JMCUwlsk0TwoPDFoE2faQnvxaPjGrtFMSNEVWmKW5UFi4XZ4pHeMNi7WKkuLnD9Wdo1uWcKNb5j4xr1qTogGF6sziYMZaFsYbqnWTfZCBc1u8j6gJGqsLMsB9kERqWvjJWz2UhbaZ67wS28zG5Y80NpiNnyNIhor7wa3zP5df10kOGF+Icyvh8H8fNgYEnyvLc+GU8L+PbYV8QtkKreZnFMFfkZ+uSQ3Rm+MmnLi44jIn5xprTsgRbCM2KPh2ee8tIRlZuNsqQax83MhpI40eggzIjTM1kkROfOdtwv9iJSG4lSzv+yD55ykL5Hq6CenuHwhsA7/PJT2pM++iUdM/On51DObXK3bjNvCIJ66XOsDEaqfcBrm1/Kcsjg1GR7ljPPRUjX6i2d29BdO98ymjkTiOP9wMaqXBpkTwztFSbLOAAAQAElEQVR4eiNSRXMtmUg32EryR0w83nPJxjotcsgRE2+eU7Y4uPEdEbHTrMy79b2RgEaMoO3fhy3lbbbRCdO4faZBlEnwnO2gfOGm9yDqvsTt7Qczu1OYEQXo3CAHxXaeWghaKjmHRoxgHfjAT+4FnpOeF3he4HmB5wWeF3he4HmBH/IF8o0u3++CfMHL1zy+1/XbXXGiZjlpQ1Kw2OSPfJStMrNbNzJHJMDniyacbGKkknckPZciSA4480uRqqOeeHNSxwGR36TQY0nj1NXZsNw11+4nD6doPiufvIkNU9GCVKzRGy9FPyAprEKRWVeYs3Y9NZvTueVemDskMUjpnMkArHGQCuKJuH3o4mHRwTRH3TFl0Q9IadNIRTgtPTxhY3JBOqt3e0+m4MNXY6C5Bq+tM6C3SALLP7+254JHjxgO5v2YxNXSEBisxraxr7GfsNWtY3aVW1znUNzzi9HGGXS+OgKjuO3kM5sWeHa0Rkc1+pEzoDULkybMTKBnfSA1zQfprUXYOcGI7MTJHYeghuZ2g1/stDe74wpOM9HKFyYmvL4805ID9mskjm96Yjz0O338esjvglj1HQmos0EamwPta/4ma1Ut9BkpNrOEalzlhlr5w4YRGYmolppwcDi5clDSkhf6EyWhauoa6bWvnDSaX9ionAgUqzOIg1DZIXpDLw7KSbJvKIke2Atl/oi1IeEyL9zAXsolkot+cjrLbxB5Ha6UhYoxweFe9IgmbXR/IpLJjFmXiFzd0oY5K56GoG1hkoL4LbaC7BVGe3MvvqOndw6TDV8OwUyDXyhW8gCifEINlwZJYsp64USeCnaTfrm94h1JUxVTtpVOeOlipQZoPls5G6bwG3d1sYwLBo6FwKVsSF+gtV/dUohNgNugLNuSLNvKsi0T2Nk1sfQ96MnTY0m2ZUm21T8mTgQXjsn5Y/Qhso2Hj8t61vMCzws8L/C8wPMCzws8L/C8wM/YC9iWPU4g5/5wJQI3fkIpWWVVJ3jhRF4VtslKC8BwvILhUjdLlyhWcoAuERFTkhsqq4QgOO7UoGhhucViq3Wb7IQKWVfVoM+oxYuWPrAK6qBYhnkhANPLSWAH7ok53JJsy5Jsy5Jsv/mmLZQmL1ZqB2QwW3DzkcJE6oheHGRGszuKFR1IlUFyWAIVq5V+cpHEdIlJvLtY0YD0BI54SDXsRhGISVwIe0MyiPYFSrSgS/eoWVMlBTcPm9jVxRmJ7O7Qd6QjOV+hhExPcsul4dJC7yijsXn5xs4oViqA1PmIEldR1gmpKS9mE3ULFcQXeiEVmNXVZqINCW9ttWRMa7aeE1JUvjAxbofTtdCGLwpo0U9MEk/1+m8A8ltgf1X8GvuLLY3bL493PKP2MghT+TE0v8qilqN8heRyRue3lN6F+VUz+pRUTCm+aiho7oTkyhcmjlPYWVtc5Krv2Dr0IjN67FeY3KdzyUwGyBERZAfCt7cBUTmCAJ0zCVpzi9Tkc1CE0fklZwp5jsgHov7MEWvZUhZsLdvGuVWaopAOW2eiZGCUF6Yk+TukmnTrD5jPs59HMLwFlNLDWdU+kHOibTekpdVFcpmV3BGTC9+RjvJvwPdZB841MGZEIxo78Oicw636mW6RmnxWimKUMYO7hpCCY+VBAiy57bwgGYy+kPemaJsfcqmunI2ZGydkVo0NNQJ92A2nIIbnXq/PUgHpiBnBzP1t4Ik355BWn5D68oWJ49w7Z40zJxrOgTE89aNTeuDRxjn2secFnhd4XuB5gecFnhd4XuB5gR/fC/zIJ893v3zPW84J0fh2N9/3Fj99p4yGx1K75Ta+9e7Id0oMOmcwuHHwpdMNwZrbEbnfPWdj5zSMomWQKYYTU0FA14oPOU6fVGpI7zw14TtOe+j1HVtMCmRW3iCDr7EZqgYT5NzViRgW+AK5SGZ/m69ZHND6fJT078g5yXER5Ow4PezI/UxUXGKraOpccDg7MZaAvh50QKbGUnCFnJvinHmL1DQfZAYH1bJlbJBUDiakAOushc1RiDWf+0+eAsQveaZSA9BCPUHrd5ybMbjHUFRMTavpTcVwlPAvnUnNXyEa00lzDFMzbuMnJFcOUsweNr7xHQ8zU5GZyYHQ1zlod5wijAZqchaE0jvehyO/kDKitATAs5B3azGze9PgN/qpl7HlnJJ2gLO6f2JkDqVF678ByG+B+bkwrhXvSHX1IxLHKA186R+9acLRvZ9haecJw48oKRIuFqXs0qA/UVnoAQVN5EbqPnF2KEbklSkSHzHx7lbOtW9Q0fELVHokTVasRIKPi2U8tiM95V8hOZsO3H5HutEwiY0sqFkQTOomDZ6INKJ0wtQsDyR3gd50Sw0XJo5zHYmgyIZJGz/hNNoLyYnlW1QzFosNU1qDCYK25aSDBLaF4cGDbzVfYXJxS9juYhnmhUDZiefQqDuuqhRVh5PDJDYMxJLHMUitm+Vit4ZsygqarCFHh6JmVzCpD5QiKat5gh0JMOVibxhJQpxAC0A06YVafEd1jaqlLmRI9ROilC9MHE9nJQuKDxLEcLgEqqs1REeEPva8wPMCzws8L/Bjf4HngOcFnhd4XuBH9wJmlG35iMSxagR3SEq2ZQI7u2QHfUY0LEl0qZulYEBsGLzW7cQlSlBqbMoaNBl95RaLDVPqilJCZYV/5SlM/oQRLNtMeLlluNjfUV1V2bADN/VQZhnQFaJVP6BtJKejmMi2jAKcMdrunhy7q5lI+EKaE9ndZb+wVWaPBhKRZydGIsCIhe+8BP0rJGd8qiwRGx8Ua5jQOlcs49g7V4TkvkQKmgeZ0Z4LtFc+OfzMpOE+Iz0W64Qo5QuJ02SHS/YBJfjLxVrp6pI1/ICSYPiGw7p70xZu/ITkyhcmxjPQtjDcJGMmHpQ3NKEhBsVaSKNhQj1jFHVR8oZTqZWw4dhwAxbbwaXhUlGs9AAvHoLTyv5mm/iJUea/AZifDDfnl8H5yZDfB6Nl3AdGxClh/x7bihZ2FjG4/ZqaXz5z5nAYuV5jtqQQMdpyWNL32Cmkj5jG8BcOC2cu5ySqRoD1zHdk6OgkeodiNmZEaJitkyLOZHJR0kyWMWUHpBQWm/wnTy6+/cqbWS9OF2e0K3hyqsoXAlwqe8sb0H7Ckm17T4YfPXXhCxuy1bol0bNgxZ4PybWSLO6ctyFOYXWK5zNHTwJEa98tpns8Je1iwyoGM3sw85ARdp4YzxvvWg+c2k3fkVzqtrOgCQNgM/eYc5LdMW30YNwqRwAQrKRIzYaEtGenbmA4BdibSEHEoyNNA0F04MgvpFS8SijAXneDYOH9SCmcINK07jyFueE7tiydDSabutD1z4BsdWZ9IjXVycQSHzAXQQKoY2RiAD5nhFM+JInHfzIv8JzyvMDzAs8LPC/wvMDzAs8L/AheIN/j8v9+COYLXvEwd+O3mC+D1GcGwIipHM73x+aDzZIHo6UMDPBVFREruUCkWvPdoEdMfOORc8AJb9qRU3rykFMvhHvny+/2GRPH+ZSZQAc1RC8OwUZNJQQrZ8MqDq4uztg5cR6u5xEHN2cMqemphkAJd2AkA7CJ0WOfPAq1rdow86KDGUYus5uNXD7TVpo7wMl9cGTKs6edMEWhg5wAISbTgg8kXe2IiZenNeEtksB6wR0JctF4e+EXOJ85ifFVNYR942ecT5TPUp0zqnzgqqCo52yYuY3Jg9DT1d95ZqfsjEfGHN4vNY0akD8hmfIrJBHj/ozBQqgjGgtnXkmwN8xG0RtPzWTud8Y1mfMSXGG03SlqvBDog50wBN9mE75sEz8xyvw3APOL4p1nUnKgnd8MG7CJHyAX16yNndFy0x5kRqNblGyzxRbCMXRJkQ4uVnM7WsMPKOJb18os9BWioYvV2cRBGmWH6A29OCgnyb6hJHpgL5RULt2i1rJX5UI7HD9i4t1pbLwQ0M5DcNrZpTdM2VGctCmz1P0CkUxuzClLeEbkiJ1PvGGRRNAL02iXybYkv/7ALS1+xMTLKcBEqa7RSz8gxbYZYNkvh8hiRQO0ozT6Qmm4BDZzj8xo1Rtq51LjjIlWlHSHYiWXgjtM7tbpb07sDMCUBWJCjB3QyrWy3aOnHkhgJzAtVpb9hohR4oQKvtyLL6TXFNkevUh8xMSWbONSNkIALoHqqka0oQx57HmB5wWeF3he4HmB5wWeF3he4GfqBfIVzvZ8lTtgP8TGIcZjH0hN9Uu0bJM2CGhhNMNBTMq2uLIS3+JVMtqNRxZbrRuTB730QNxkignwXEtsmHaUZVuSZVuSZVuSZVtZlgPsL0wUTyK4OUUxpbUawQdGu3XRa3yhRAyXDkgsliVsd7FcJnYry0TCd+Tc8h3FImsgdUF8pfWBUyZRE/ds0sLhlsoXJt5drOhAtSMS36XQMSkXSgBi5TYCboOybEuybCvLfsOI+JI1Wd2gq2e3WDQZxe4uLbSHA0jETsrEwYNLo0lqrfTG6ZGU3dJCF8/MUtTAB5KpfoUkYutwOyR1C5klNMsR2QchmOFiGY9tmPjGtxJmtuIKo906Xc1J9hq2wSVaVpYv8fNvAPbXRn4b3DC9icH+kgtuv0DuPBpOV/cT0tvfSb9CcpnZeTRf4SrhV1esNYPsaeW3V06JnohiGHr3KPe+93QSPReYmt2Z2fiIiSvSP/F8BuKcvO5DEpYnin7AhHiM0sDUEXXOB9LfwoXErTtgzooj8YFytw5hwyIizSEEGEW1bounrLyFnBVETNTZl5wOapqaLaWIWObiSUe8RHryWXJGkC5Ky4rlqYkzgHGJ8JVBwKgNx7eaI1KQ2UjUMZtg+DfEfT7qQJrn3Mwr5zwU6NqHTyoqnLPYaQ1nzhVHy30oilGeOqZUD7586sKZV+sWgT6Am6wh8P+fvTMBtqTLqvJajYCKGiqCorbaHQLKIAaitoACQgTSIDig4MBkINGtqNAhItgoKNgKaDeCggiorcyzCoJAMAgqhIKgzIYGOCKhrdjSAz34rb1P5s3Mm3nfq7///6/3ynvq7LP2Wns4J/O9qrqVdd97xMKXRk8CJI5YIHGQXTtEdEhwVGLp2aV7nASCfbbEw6uUToPTsOJRyAVoSR5O1skQyUwtdYmRW7EVEis+MH6MyuzRNnp0cdpi5FdPFiYlqUAnN15y0a/zegeud+B6B6534HoHrnfgegeud+AJuQNPSNO8hKvXf3RfIpQXeeP1HyR5AK/92kvuiZOXF4f1mpA4fsVXSHbxRlK7P+k0zWxOuGID6Yw+E5wqOEb2qIIZSU1DyuZeiYUPTDgWmoOcYyUTAkmsazvE7J68NUaJUZZJr8Q5G5tFT88Zo93a6FO5A6tlXSl7TEis9ODQOMW8X3x6VBRMRs6zz7sRaYTJrCblsjC3nN41U0CMikq6iCkYljIKatZCjxP2WTqVAJOLrnCwarMMq2vCXyHFxWeknBw60yIN4SHYkMmEsFYU8Ry5utKJBBdGU+aIl07/IksRGwAAEABJREFUM4w2LPukzSVM7MjSO7EZ6Vt8XEN6D0MeZyOH/ImfY5+fZEJdjJKiHT72CXS0vGnpew/LfgX0A9M7UJjYrY2qys1xpl5ozMio1XKFxIrPmLpc0av1FOW5YJ4kTiZGfEAzhmDGbpxTkuXkVg880FHOULLNwjxD1YgcZx9NfUVPKLRhGniujIiD2CVMbDYr57AHKoiBiib8gSqkt9CUMaFQVMO16sSHMEB2e/YSPfSBxGzTxOhSLZaCAdUi7ePFoFRFyRmWfaKBLhTDarcxfgzWehyMkgW3imsPLZU+EL94YXtieOYqz2KwMJXejZYjI8yIY1tMLHjBtrXFJYvBwiw/iIJvTJiVYbwVZlM028iW7YGArKZb1NBBMXwyy8qspdxapIi4hfGPbM4RA8LEUaWLccYRmOKgTAW15BC7BNnBpEyoGpYbp3gxDXWD5FT2Bm13fiH+jNTHN0gGrmxj8KAYlpiCakIxmrs1VqNd5/UOXO/A9Q5c78ATfQeu/a934HoHrnfg8b0DeQ3n8VruhKc9jDsZruwwbdCDDyTHdpLQpSyhSxRhIQbEwiSv5lik1isihSgj/IIllNwVUld8YPxDI8BUzhYUC75AG/8MK6IME1tjmIY60Ft0x+ltMYIL08K3LVeKN6jBD1DquASO2vLg1RMNhMnGFwY2r1VFFV0CVNy4mLCZixEOlN4La4vGE3aMYhjLtKpvu1klq8eMOEwl8RAJVBwUFh+08dNtoD14NGxi+2g6JGkPLdHLciO+MDs80hajtYkx0lIi55eVVa1bljBjE8Y/MI+cFaLBxaie+ME0tC0mZqlmLbIHKmhWE/cCJZFjZVgOsDYKTzUmXoTFHspAe80VvmtVzMJMHKjcwizYaIXXs3gtcMusGmtw4i4tq/MAkKeBeXQ4mRjxgfEoMQ8Pw07Y7GClX0XyhBFn6lVPR4nBKzJj2kZfIDHST9sTptMBp1vFF0gyLC1mr3nW3iclYWOrVe+KZUk1WDkglDyczBK7FyJ7lbiDVYW+xNSFn7DZDs8+Ce5i75n9T0ZycgmVBh2bn5onttTjz7YNhu9b7l/3Jl6zlu40uUEseTnWGSKUvsIu6Kfn2WVwctI8yhr70pLV+omnd/QTdnX3Jo9A/Fju1xlWw66peHHqloifPYBxwhFHGJXondE8flvtRzSzqiKHLDH+ZPRMeLaJz0gic9VrTk5ga3MhDjEmTpXfhJXK/ev2XFkL3KY44UFaJYdmA0jf6MQyWyU/BFtz+qHRnHpyaFbxQmIzjhhB1KRjeOGVQ5P4QBrhEg/BIEwcetR6XZ60O3Dd6HoHrnfgegeud+B6B6534HoHHqc70K/neP1X/SYsUkvHT6/3powZec2YxH6dTl5xqgY2hJMVglsvKCdEzuvMwD4mMdFLmNhkm9zIGyl0tVdyZsNh5ow5LldUM0tfI1degQkrMlqmcMlLXm0V0lnJI06v4hvMXrOe2GRVwt4rnHo1kpptiqTHZJSghyW0xPQLB1OcrBlHVcKlw/ErHBcfOQ3LQosTC9Kx9Fq2wSSc2SgMVKyc01I9oIdIgJmPX5XnoEuLGA7mHtOJo6Ug0Fgay8QuY11hZVcevUs5xLEPybV/YbQ2Gq2PjkArTtvx9KYEnhWtvKUafclpUDkDE8ZNT6D2OkNyKh6ktmaEmeO0yIqf2LIJamhO13hhpbyiMw5n1ROt+MD4uPuHp1tiwHyM+LFJj4817TVnbW957/IOwDxdHGabMuZAe59v5HqeSNVAr5FkJ4hqTMWtE+LKQhZriGw844IqjD9M0pAH+hwloarzytNpHTGpNZ+wvOJ4oBjVAz8IlR2iDXpwUE6QdUJJ1MBOKPNLjAlxx/TACeyh7CKx6CujsvgBIo/NlbRQ0SbY3IMu0YSN7nNEMpGe1i4il77A7BVLQdC2mJKC2CFWBtE9jLYxDz6ju7Y3kw0fBmGaAp9QjMQBRHmFai41EmQq44TtuTNYTfhk9vBnJExWprKMcNxdEyM5QMWzFGdhKvzAXLoYxgQDe4bApSxIF9Dqoy/R5BvdkizbyhhQPIqdVcp6s7nzqLEk27Ik26pfS4wfS8QjZ4HIIkygZvtiJAfQAkOvdr0D1ztwvQPXO3C9A9c7cL0D1ztwf+4AL+UkXuytUKdROvSE7VlGlew9RCvdxKVaLO2iGIkB2kVEphKcUBlFcIJtTg6KBha3GCw1a+louwoZR1Wj16jBCy2dYSmojWIY5oEATCcjwFxwt8/mlmRblmRblmR7Y5M2UOq4GMltkMEswclaChOhJXpwkB4VnVGM6ECyDBJjxlFhaUXPuQgytYsJbE2MaEBqAktchMqthSSQKXEg5gaJINo7KFGCLh2jenSWFJwsrH2XLvaIZ9cK3SIViXkP0SRqFiYVJ32gZ5SJsXjYxNYoRjKA5HmJEkdRxgrJKV6YReQNVBAb6IFkMK0aVYw3Ie7hHCVpUzlTzQpJKj4wPmaHUzXQhg8KaNBzTBAb2TrHKEa3Vt8DsJ7YipEnkAX9zHB6EjnFR7hlSGWtEKX4ARJLcfWrFJ5KDsxTzeidUmJSsZFDQsVWSKz4wPgxEqvX5Bf2s1BCYfSFQ5j41OMwh7+NTXzKWyNFoyc6XvNRw/2cOEqiKORls3iXkFiuo+rxL2M1yxZY+q85Ys0saRXsw4xcCF6Kyqu98I6RDmlUH6osW0435KpfYK4nZWQTSk7bzNmzcs6wMlAH0pNKeoRjNEWCRx0coXrNSCx5t7HcieTtYA5BpwCW5uzX3ljh1LLWeQ6RnJyPpEzS6Eq7EEJwZvEgDjMxNmFCmESY1KFUbInxJ1s0THbJWegxcVx61WRBjUAd84CTQPB0DQtO79Lr/rEww8ngmFlpGW2y9Im/wpwBG72qPvGbrPLpX3knRGbvcAxCmB3xOU7tgjBhBa7L9Q5c78D1DlzvwPUOXO/A9Q5c78DjfQeesH68pOO1Xl7N5fXdwMVuvNTjFWDHIue1JaxqZiSp9F2kqvQ1jqYFWWpnDjNhep90AkUGxp+M3p2bSuLM5lkhTA4bAkAysZR3KXXFl4hAsK6JxMuY1tTm8sjtueTDT7/k7GG0Wxv7Ve7As57sl+NzENKyYuSyItc9IGMXK4uiXG+sOWtptRF1W6RrJjlsQTyka4rXUjtGhCW+4aWiBwNgJgX0Y7+QWcdhJpAtgwkHJ15nh9wKaV95h5izEmSTbFv7QFNz4uRkP3IqHv/QuKqK7SEaPQjTJj0XfNILiU1I8mBRui7epHPIii8xMThpnY+f6zniJDEriZSbsG4OeQNJx6M+K9fD3uUNnPbtBE4a/Za2qmWf4jRPOdAtOUnz9C4VZYEEieRg6NVkhU9Jqs4eJZYqWTePs9oUYehOA1ADm8OieYnSSFFGwie0mi8wQcFnNJ6H0jitiEyYtUD84gPjz2ZlP/sAFR3bQaVGUkfFiCd4mxjGMmekpvglJGZTgdlbpBqNKbEQBdUDwpRqkRpXRGpRWmFyhgUS20FPuqVyB8aPcRwJp5CFKU18hV1oDyQmhg9RFbEYLEylNBgnaFtOOIhjW0wsuLAp5xImFrPEnE0MwzwQKLbi2TTqjCMrSaXDiTElFibITBxjQmrWYrmwlnJZlBE0UUOWBkXNqmBCZyhFUkbFcWbEYSoH22AkCbEcy7Yy7A1q8ASxZhrqBqmt+ApRig+MPyxNbIuJbVBwSRWTZpTxJbVuWT2Chi2tI3dn/amf+im97GUv00tf+tI7YzlPzvWa3qX0SK+7dG05y8tf/nK98pWvfI0uL/Xpk353yXK/c99fo4ujOD3S63ptL33Sfl/m8ymfV9z+xzxTnz4P9+N2fs9yppztMV8YhalPn7t2bfl9kt8vHPE1mumRXnfp+nKenOs1ujCK0yO97tK15Sz5fMrnFUd8zDP16ZN+j4rlY5WP2WO+KU9Qoem7Z8g1+zWgZCdrQg8+kJjtBNGlLKGFYiQEaIGhM4d4kEK4wiVWS6yHlnDiK5QiKSP6JUti4iuMYNmmw8ksw8W6RdUolYW54CYfSi8D2kO00hdoG8mpKIxnW0YB1hhtNneM1aUZT9hAiuPZtco+YWWZNRqIR5wVHwmHiS9s5kXQLyExY51lCd9YoxjNhFZ9xTDG3HJFSOwiklBxkB5Vs4P2iCeGrZnU3GukxmKsEKX4QPwU2eGSvUAJfjIxRrh0yWq+QEkwbMJmtXrSBk58hcSKD4yPpaFtMTETzDR+ozyhcQ0xKMZACg0T6hqjqAYpG+xMjYANZzY3YLEsTGouFYqRGuDEQzBKWTdzEs+xlOqFB1pWzxP2A0CeEipjxhCMB4asN8wpaWD1wAenJ488fmSGRY87kGeRNaEzshulrMkrGE86J54+0ZfYDVrJerIpc87AYVbPLVYuYvaP9ZkiZO+BLbKG9z5pFq+xuhBfIvWhGFWs57xElukpb3pBgVRgpwNRPHg0XJLQyA4Hxuat7fFos6VByBLjT7aJRc4GYF9z4ljxxoRj83GInThV4QgdD4+wQGJ0Yo2ey9hitDaSMudbEJLs9G6kL81yX2dOMDxFs0bOxM+QWPKm3tC4AbAix8heOWntl6xKZ2G2TpvkhM8YbRhAWdakL5AC5kYkHnFpSPsNCJDHxNlvk8B8JhKZuTfVDp1JBmI53OdCWm2xCtDJzqQiMNStTp8RrTx6nSM5pRPJjL+H7IC8PDIKzRGZtTGdWkPODF9i/Ltg+QfDT/zET+gnf/In6wFDXnDfFcs/YnKunC/nfND79XIesKU2PdLrrlzXdI6XvOQlevGLX1z3vn8f3/4Kk5/rSn36TD3vCuZ+53y5/4/ax+5RvrZ8/uTzKZ9X+fjl8+z2n5X80cefmalLffqk312ynClnyxkftWt7lD8vH+Vry++PR/nzMtf3WO01/bg/yJ9dD5Jbr/Mo2CJSTf4YHNgZ0581jbwarIQlkh4t6WBgfgFZJHEsc+LxY8VrgS0x/oFFzgYrPChHTurKQla1EM7N3wC8LsZPfBhXmQ6w6JUxeAH6DpLKTHLH6d18dAvH2IxJBD/3drJ0LB/nhNWO/IGJYZl0qH2CzdsbuxELDxvIfumS3o2jKuFkB7GRVnsin7DTs6acUJJDG7NTBYjs48gNVE45p4U2RQ6RALMONCNODhxL8QH2NSehjap2xjrxNfYV5VpKp3cpZzgySKp9JqQ3qX1cNGj7ONGBFU/vpK1xyXqf5JRXDvEVEim+hwQys3kwH4MzpF/pwTphlmpGKn6vCPg3zDl1ONk3JUuMPxvB8gcCdYNWGIKNlniLOYnn2ErWtro63CX2A0CeDqajzZPBdrLKHryYNLE1eugDqSnvEOlDLEWd17wkS6WDM5dUvjTQ5yi0Q6OuYgO9h2joYtRe+EHKZIdogx4clBNknVASNbATSiouHaLGsEfmQDscW2L82SgsfyCgmYdglLNKG0zaUuywSbNU6w4imVhPJy3uGpEjViOv0C8AABAASURBVH/8FRII98AU2sVkW5JPv+CWBl9i/GEkMEWq9tFDXyDJtmlg2SeDyGJEAzSj1PpAqbkEVuQY6VFZG9TMpfLTJlqhpCMUI7EkHGFih0Z9xcRKA6YyQKYQMxdo5VhZjtHkmxRLsmxLsmwrw54wTAqbTIzJb/SID6TWyVmhZWPCgmWSHb5AwSUhy5ImFISJkGlFV4Yl80uMCXEf+syL8vzDo/6ifeinOT5Azpdz5rzHWetIclOT2nXk7rG8wyEPJW571uQlP3V372rWJ8pZ83HIx2MdOWbJTU1qj7MefiTnyzlz3tueJrmpSe1tax5WXj6/8nl227MmL/mpe1hnvu2+OWPOmjPfpiZ5yU/dbfIfZk7Oms+xfK7d9hzJTU1qb1vzMPJyvpwz573t/slNTWpvW/Ow8vL5lc+z2541eclP3cM685Oxb64zH8N8LJ+M/W7awyNhi0PW9NrP7gx7iSZuUr3AUEtMkcvEhzDDlRH/EPeC0Q4sslhq1kLnRg89EDORwjjYdLYVkmATPEQlogzjTWicGFBq/FhIMC0bHUn2AuMfmjrXA6Xm0gLxxUhOg3DxBLZnPDEas7oZ+4qYPXExrKIaaKn4HoqBrmGOY7SBLjQCNjWJNhuh8vcQjTJW7aVUKD3jgEzyLNsnlGVbkmVbGfYGI2JDVkd1gC49q8WgyCh2rdJAuzmAhO+EjB9cmNSadICWJbl+TbjHLCUncIZESt9DApl10MRDFkgvEbMckbURwjRcDGOZE8Y/sCmFnpWxh9EOjaqKSfZoNsEuWlaGL6BJMHFL9LQ8Yz8AzBNI8Xxz4PQEMn+YI8+Th4f49fzwhNSUcgmJpWf1o8kejhQOwaycRtaU8nyWXaLHIxmGXmuUY5trqhM1O5ic2ehZ/hLjl0h9+30N+Nl5nIcgLLcm+gLjYpmkBjoPr/qcIfWVOBC/8haYvWJIXFDOVk1YmBGRehMcJkk1axk8acUrkb2CiPGq9y6ngpwK9ZJURGb6YglH3EVqci3ZI0gVqcUKiycnRgPaxcNGBIFJbjg25SyRhPRGIo/eOM1v4dftIw+kuPdNv+LshwIda/MORYWzFyul4fTZ42g5D0mZpCePLqUHT9Z54fSrWUsE6gBOMprAiYUvjZ4ESByxQOIgu3aI6JDgqMTSs0v3OAkE+2yJLziNSp8xLYmzByWscNYosdonnGB4as+x92AlnTW5Z0bf0haYM1RvtBnpXjN9ojcSpvfgVUcSGP1h2ite8Yp6x9/DPMOD7p13A+TcN9UlJ7k35d2l+Kte9SrlHzi3OVPykn+b3LuSk49HPi43nSc5yb0p7y7Fc96c+6YzJSe5N+XdpXg+z/L5dpszJS/5t8m9Czk5a858m7MkL/m3yb0rOflcy+fcTedJTnJvyrtL8Zw3577pTMlJ7k15dymez7N8vt3mTMlL/m1yH4WcfCzzMb3FtTyhKdOruGA2yuvLYL3Yw+ElY1ZoMl7diFh5u5j05B0g8vyykZZk5kUlapHGSoDvIXtWwYyUJI/0uVdi4QMTjoVyAZm0IJuckNW1kFj8ECkl1rumQfN4sYSC2StY/UlOz/BCgrdH+lf+wG2v4sRm5Lric5B5v/j0SFbte5GnmB5dnOOn7BjpVTP9qaGS/KwhB5iCYSmjoGYtlJ2wz9KpBJh1kIFVm2VYri3xFVJcfEa6J79apxEcP3PIZBZrRKysFXJdxYkEFzbtnz3b6F/xJcYfxi6Es6Z0H1vdXynmNNTWCtI3mRytPJCU0pFB8krLQkYFt5icxMEuYj3ii3vVWRFmyz0okn1wtpwDZfMHsGpCPnP0ZFvE8ABn5qiwal0YmaSSC+ORh5+keEfYDwB5IFg9JixytExJznNEiSeKLMxw72Ck6HuoGtUCbx/dW2iB8YdpINHhTcpAB7FLmNhsVs5hD1QQAxVN+ANVSG+hKWNCoaiGa9WJD2GA7PbsJXroA4nZponRpVosBQOqRdrHi0GpipIzLPtEA10ohtVuY/wYrPU4GCULbhXXHloqfSB+8cL2xPDMVZ7FYGEqvRstR0aYEce2mFjwgm1ri0sWg4VZfhAF35gwK8N4K8ymaLaRLdsDAVlNt6ihg2L4ZJaVWUu5tUgRcQvjH9mcIwaEiaNKF+OMIzDFQZkKaskhdgmyg0nZoLZcNVrViA6kR+kbtN15hfgzUhffByiJsAifDMJU6/HIkfl1QjFcZvQ24ekhj8fyZZkP+ci1/W3OfZucanbHlryLI9/H6dKxEk/epZy7GrvNx+U2OXfx+m5z7tvk3MVry+dbPu8unS3x5F3KeXJjt9stZ87ZL2UnnrxLOXc1dpvPudvk3MXru825b5NzF68tn2/5vLt0tsSTdynnUYzdhY+pubGT4coOwxvY4KEPRLQtxMzLKEZSAS0wtDniRGaMdmCRu5BsCBNHkZQRftEIMsX5mVRAyjGSi9tLlMwvMc4RkWkss5CFqZQ0Oi58gfS34Zgwu30blJC2iCahY9I5SrI0zGusnmhgMmx8MmxLhbWqqKxCo2HCzrgY0YGK98LaovGEHaMYxjKt6t9uVsnqMSMOU0k8RAIVB4XFB238dBtoDx4Nm9g+mg5J2kNL9LLciC/MDo+0xWhtYoy0lMj5ZWVV65YlzNiE8Q/MI2eFaHAxqid+MA1ti4lZqlmL7IEKmtXEvUBJ5FgZlgOsjcJTjYkXYbGHMtBec4XvWhWzMBMHKrcwCzZa4fUsXgvcMqvGGpy4S8vqyLBj7AeAeWAoxoS4x3NKqueKPIBccnyeWlZkRlLqSeQCiZVEevYJPUa6Vd4CSYalxew1z9r7pCQsvcvPkmyQmQeiMHIhlQNGqCe4+DNmFxLSK0XnWFXJwqkoSN9aTzjoyJsYcXoX28U6SJIWRnZyCeU8MGK1HuMIN6Qw3hLjn1tdTeScGjxx6osPxK+UPSSQ4+ZwJ+zEuseJYxUvbI/OsOSFn6z1E0/PZJ2wTsmtiUoegewTQ2SiDw3CHnQMB06cuuID8ali3eMd6V0TDz9Z7ZtdIh1hYpNll8kPTnxGRGZ2SrvCciLu2VyIQ5yJ02VxLvAKcW+6PVfYArcpTniQVsmhV18rvArASSeW2dnoIdia0w+N5lWdXhWnRyLN8RDLD5JJmJKFTo/SwEzSiI89IczIVBaAk7Lk9CMyqjrwkNa78L/oj+XSb3Puynksze9ATf5Rd+kYN8Uv1T7s2G0+LrfJedjXsbf/bc59m5y93ndBu+nz7qb4XbiGozPcdPab4kd974J+m8+52+TchWvZnuE2575NzrbvXeE3fd7dFL8r1/F4n+MufEynV3cnPHm53rxWbGw9ry3rdV8FeB0YOf4RVnEWLDlAvXSccVckutTjT0Zo2SDyRgpdppSfvDIWZl705th9LanItVSA0BKTEb6HqYu+QFKZJRSyyR7mPs56ciajcoqdcOxBAZPzbXhqsEyuIsAlJzN5wagD2afUGZNOPOFUBbEKEyqEE0pZQS8JRiLIjNd6kQ6WEL40QqUvMf6wpMY9RALM+SbkgEtL73Aw9y+tKhdn5viZaXMzcm+SlH5BepdyiNwJYqSzLTtkLmy0SJg4uQgjffDqTpyixMqLFr6HJFXOwKThpidQPc+QnIoHqa0ZYeY4LbLiJ7Zsghrap2/vcKW8YjMOZ9UTrfjA+Lj7h6dbYsB8jPixSY+PNe01Z21vcw8Ro6TXHvYDwPEE0uZJIY0HaEa0zBHVCkk6cbziSxT5FrJYQ2TjGRdUYfxhkoY80OcoCVWdV55O64hJrfmE5RXHA8WoHvhBqOwQbdCDg3KCrBNKogZ2QplfYkyIO6YHTmAPZReJRV8ZlcUPEHlsrqSFijbB5h50iSZsdJ8jkon0tHYRufQFZq9YCoK2xZQUxAaWR+CElUF0D6NtzIPP6K6lpxg2fJj2kJzSd1GyehSyMEs4YXsemY0mp81u1IyEhMbUhPGPTIzEgKQrS3EWZvFoO+bSxDAmGNgzBC5lQbqAVh99iSbf6JZk2ZZk2VaGbRnHzqr2pRvQHafGkmzLkmyrfi0xfiwRj5wVRlMNZJGqYJZzLKVyszhJ2ITRHqZt/1J/mGd5kL1vc+7b5DzInk9m7k1fznVT/Mk864PudZuPy21yHnTfJyP/Nue+Tc6TcdbHssdNn3c3xR/Lnk9WzU1nvyn+ZJ3zsexzm8+52+Q8lr2f6JrbnPs2OU/0OR9r/5s+726KP9Z973rdXfiYetykE568hPLasLF1O4gNbAgnKwRXS0RWtEMkyFSSJlRGEZxgm5ODooHFLQZLzVo62q5CcpwTWs0HaomWii+xFNRGMQzzQACmkxFgLrjbZ1NLsi1Lsi1Lsr2xSRsodVyM5DbIYJbgZC2FidASPThIj4rOKEZ0IFkGiTHjqLC0oudcBJnaxQS2JkY0IDWBJS5C5dZCEsiUOBBzg0QQ7R2UKEGXjlE9OksKThbWvksXe8Sza4VukYrEvIdoEjULk5pLAz2jLMGAXskof41iJA4k6iVKHEUZKySneGEWkTdQQWygB5LBtGpUMd6EuIdzlKRN5Uw1KySp+MD4mB1O1UAbPiigQc8xQWxk6xyjGN0STSwvEBeOnFX9ADBPJMUzxBkhzKIsPERMMA8RB6KUfoDE8nSz/gKoFJ49DkyT6J1SYlKxkUNCxVZIrPjA+DESq9fkF3LELVYeeiE9attLmNi5cch0Bojh4WQFwvuG0TpO6exYMYTLOM5FEpMOFzndiNcGIJNtUjP0BKCI9ELb4X3arCTSIF6S95FO5FSbXaSKNlW/wPq4hFPYfvIiNLJSUusG2S81HL2ilJyQGGdAGjWDI/QeE6ciebex7JO8HeQYTHolhtdzwaNTy651nkMkJ+cjKZM0enDmEEJwZvEgDjOxab8gESZ1IduiaJMtYskuOQs9J45Lr5osqBGoYx5wEgiermHB6V36jGlBz/newONPlj7xV0h+8YHxb230r9wlxseyT50rfno35t7CgFqTQWbHci2l0jNKBa7L9Q5c78D1DlzvwPUOXO/A9Q5c78DjdQee8D79eo5XcvV6bsJ+/QrjNSBHIJa8kHOc4geIzAtIZnpWxyyoS45PRvp3cPClljMUp3RgXofGrTpK+mx0wI9OSZFzJAGx8km8jLRIDttO+wXp0Gr6JHYJE7u1sV/lDjzrze5szjouOx65fRq0cCw9oi2wssKHNWctXhtRv8XaDP0A2YMga+Lsi3fG0RJhp4SyQdxCti4kZWD6xKUCtwoGVi5Lfbxui9UqDdiSGigtl5x9InKAUskJZo8gyRVpjpL4Ret9SKGU3lUyIbF0W2oTXyH5xUEasYa1TXzGRc9kLHpDV2c44iQxq5CUm5CbVXsPJB2P+qychVh5A3PfaJoAMlcS/Za2qmWf4umCD4w907PYiYeyaaWxFxm1/yGSk+LqT1GwpVePB4DV8GDJo8KEVrh8oojPs0QRt6ya+GuUmqtGwnEgb8zfAAAQAElEQVQarTNMUOgzGs9DaZxWRCbMWiB+8YHxZ7Oyn32Aio7toFIjqaNixBO8TQxjmTNSU/wSErOpwOwtUo3GlFiIguoBYUq1SI0rIrUorTA5wwKJ7aAn3VK5A+PHOI6EU8jClCa+wi60BxITw4eoilgMFqZSGowTtC0nHMSxLSYWXNiUcwkTi1liziaGYR4IFFvxbBp1xpGVpNLhxJgSCxNkJo4xITVrsVxYS7ksygiaqCFLg6JmVTChM5QiKaPiODPiMJWDbTCShFiOZVsZ9gY1+IzJ0mAbpLayV4hSfGD8YWliW0xsByV0TDpHSVRga5xYx3oVozyLfCv7xdN1XO/A9Q5c78D1DjwBd+Da8noHrnfgegeeuDtg81qO9rZZxeu6IFbccCmL7YFSc6lQjIQAHSExj2AhXOESqyXWQ0s48RVKkZQR/ZIlMfEVRrBs0+FkluFi3aJqlMrCXHCTD6WXAe0hWukLtI3kVBTGsy2jAGuMNps7xurSjCdsIMXx7Fpln7CyzBoNxCPOio+Ew8QXNvMi6JeQmLHOsoRvrFGMZkKrvmIYY265IiR2EUmoOEiPqtlBe8QTw9ZMau41UmMxVohSfCB+iuxwyV6gBD+ZGCNcumQ1X6AkGDZhs1o9aQMnvkJixQfGx9LQtpiYCWYav1Ge0LiGGBRjIIWGCXWNUVSDlA12pkbAhjObG7BYFiY1lwrFSA1w4iEYpaybOYnnWEr1wgMtq+cGiZU+o9Rct3gAyJNG1eDRYTCPDqOB0xNHHj8yw8jJJFYpveThI3EmsbkFTtKAjuM0Tx8ItZ0eHm+NzaLTd+SWhsSsnlusrojZJ0YZeRHoEaHcLNUpIilbXl3Ql0hqKEY26zkvkSVPXwESOrM5fvZP1+DKyC4+EEha4BArOC30LneJ8SdLMP7Acllq1pIA563ZC3L2zrESLEQrJHCOBEsfiF91h3jaJilVxcKsQDB7NOZjhYww8/gYH9yUA52DU/wMOUxqEyyceGErowMpG559os5IETyTU2UrgBpmkUJyJsTtXJxoQHMIk+IoWJGB8SdD6gKcaMCS70jJOKWQwDydDcIMr0tKYjncgUJOtMXk0JQMVuK1HuEpK9vUPsmn54mTUxwlM/4RUku4TrBFQuj0wuk1Z6LRGW9tL0rqdT5Rd+Da93oHrnfgegeud+B6B6534HoHnoA70P++4pVdXhzSf+J53YnakFeJFedVYl4Kxh8YIEwls8gOItWseC3QJcY/sMjZYIUH5chJXVnIqhaS86P3tcLx61oL2+tWiYWHHSApzAo2co+Szh4zx8+NrP3wg5N1ateUhkBKnWTGaFhmek7WPCzbLzH9wsE0oVt6V1bk4qM6HBtpOWbSTthpWVunNnMQXIpZi+9iSpOzxPjDtqEzjsCsA82IkwPH0uYA+5qT0EZVO2Od+Bq5ZxUfSO/yzjBXTGUmsVz6tF/R0qvR6uhRKo7TWN0pX2J8GpTa+4SVVw7xFRIpvocEMnuz7hiO1zOEfkWCHCx+wYZPemJHRrsKZb84exhtNpLKHwjUDVthCDb1xj3NSTzHVrK21dXg3ojk5FJzrP4S4LGbd9F5WEhkIE8RyztEyTZL5kA4E11SpIWJUbEZreYLFP6haUQGeg/R0MWo3vhBCmWHaIMeHJQTZJ1QEjWwE0oqLh2ixrBH5kA7HFti/NkoLH8goJmHYJSzShtM2lLssEmzVOsOIplYTyct7hqRI1Z//BUSCPfAFNrFZFuS5192/ElZYvxhvglNP3KmXsFhGmiTgxUXA9/AiUvNB0rNJbAix0ivytqgZi6VnzbRCiUdoRiJJeEIEzs06ismVhowlQEyhZi5QCvHynKMJt+kWJJlW5JlWxn2BhGjxHAVPJkHH0itSbLdeiH+EuNbso1tUGpNOkMxqBi6pZosEu4S2281vkfcuo7rHbjegesduN6B6x243oHrHbjegft1B+x+DWevUcXdoKC5MKtlS0xBmPgQZrgy4h/iXjDagUUWS81a6NzooQdiJlIYB5vOtkISbIKHqESUYbwJjRMDSo0fCwmmZaMjyV5g/ENT53qg1FxaIL4YyWkQLp7A9ownRmNWN2NfEbMnLoZVVAMtFd9DMdA1zHGMNtCFRsCmJtFmI1T+HqJRxqq9lAqlZxyQSZ5l+4SybEuybCvD3mBEbMjqqA7QpWe1GBQZxa5VGmg3B5DwnZDxgwuTWpMOkBpJWS0NdOGaWYoaOEMipe8hgcw6aOIhC6SXiFmOyNoIYRouhrHMCeMf2JRCz8rYw2iHRlXFJHs0m2AXLSvDF9AkmLglelpeIG7xBXZYpK7fAZgHgzxjzcNBzchjwn6imJWMPY6Wp5r1hLhSstCh9MZykdN88oNEU4pMf+Ks8FpP2NH9da6pTtTsYHJmo3f5S4xfIvXt97XgZ1cOGo8gLLemGBsNjIRlkhroPLzqc4bUVeJA/MpbYPaKIdU+1bBINUMLYglw9BI22OkR29iNtKxwgvFqj+oRFj0pA0sPZ59IWEmF5O8hCbkWorSuhMIVT06szkD/+LUFWZQwqYmOTTlLJKH2mDF1t7TsM3plE1oEOEEC7IdXGojCGtZ6cWqLXUJiOV8a45Kes1ENYcLjt3VefPapWUuEzuME6VNkW7yMxY9R3rlZIUyahSQKbs+yxylirz5b4gtOl9JnTEvibNI6PP6wnD3RxI6x92AlnXXsXTWzT9/yN5h9aMykllida2BiS04S3Se1MT3JgTCJwqt6IOJ1Xu/A9Q5c78D1DlzvwPUOXO/A9Q48PnfgSemS15DL13PF89puWCAvHCf9xDkehEl5XhcODixeLuLWi0rUBaJS1NrW74anGGWVC7JLuTlPyvpMi1RyEusWZM8cB7HyKbyM2YL8anvCeDHKM7NNYZzo6Tnj2Ku0G332q5yB2Td8hcSKB7mu+Ow+7xefmoqCycje+zzFZHRxjp+0Y6R3TfoW1kL9JUxsWMp6A/aNln1nREtCtB2MVAeLg9U1bZFepc/IbuTQmdI0hodgQyYTwlpRxHPk+konElwYTZkjXjr9zzDasOyTNpcwsSNL78RmpG/xcQ3pPQx5nI0c8id+jn1+kgl1MUqKdvjYJ9DR8qal7z0s+xXQD0zvQGFitzaqKjfHmXqhMSOjVssVEis+Y+pyRSBF8VK0j1SSw6WRkvzwk63eAVj9xePBctxeHhPGA0s5Q8k2C/MMVSNynH009RU9odCGaeC5MiIOYpcwsdmsnMMeqCAGKprwB6qQ3kJTxoRCUQ3XqhMfwgDZ7dlL9NAHErNNE6NLtVgKBlSLtI8Xg1IVJWdY9okGulAMq93G+DFY63EwShbcKq49tFT6QPzihe2J4ZmrPIvBwlR6N1qOjDAjjm0xseAF29YWlywGC7P8IAq+MWFWhvFWmE3RbCNbtgcCsppuUUMHxfDJLCuzlnJrkSLiFsY/sjlHDAgTR5UuxhlHYIqDMhXUkkPsEmQHk7JBbblqtKoRHUiP0jdou/MK8WekLr4PUBJhEdY+WpYwY/u4Ut1MNaz0lE6o67jegesduN6B6x14nO/Atd31DlzvwPUOPLF3wDYbWLZPGH9YgGCmspxxMShlSizMQmVAHDH+Co1yYJGXucVHOlChaIdGgCkOyqQCUo6RXNxeomR+iXGOiExjmYUsTKWk0XHhC6S/DceE2e3boIS0RTQJHZPOUZKlYV5j9UQDk2Hjk2FbKqxVRWUVGg0TdsbFiA5UvBfWFo0n7BjFMJZpVf92s0pWjxlxmEriIRKoOCgsPmjjp9tAe/Bo2MT20XRI0h5aopflRnxhdnikLUZrE2OkpUTOLyurWrcsYcYmjH9gHjkrRIOLUT3xg2loW0zMUs1aZA9U0Kwm7gVKIsfKsBxgbRSeaky8CIs9lIH2mit816qYhZk4ULmFWbDRCq9n8Vrgllk11uDEXVpWR4bdgIRJUh0Df4k7DwB5SqiMep7YjwpDeYRYCk8T10gKsZ7UZpJTHD+locdIt8pbIMmwtJi95ll7v5SEpXf5WZINMnnaCWFWHCEIRQ+hR4Rys1SniOy55VWFvkRSQzGyWU/zjGefhHeR7OgrI7n4QGBsfr4p5QmvbRKXGP/cctXdm1jNWrrd5Aax5OVYZ4hQ+gq7oJ+eZ5fByUnzKGvsS0tW6yee3tFP2NXdmzwC8WN8cJlkDw3SO4ZX466NSBbFNROJdICVSXyJ8dtqX6KZ1S1yyBLjT5ZdJj848RkRmate6XdocyEOhUycKr8JK5V70625Ny1w2+KEB2mVHJr1tcKrAJx0YpmdjR6CrTn90Ghe1elVcXok0hwPsfwgmYQpWej0KA0knEl87Fk1CQyOSyVrOEG85lnDg4jVpTG9KzvhWU/sao/rHbg2u96B6x243oHrHbjegesduN6BJ+gO5LVkWq+RF3f1Qo/Xf7jzC8hoW17FWbDEgPllYfFaUC9hYpORumwQeSOFLlPKT14ZCzNnznHzWrXiLH2NuaZKICWYjCOsnahcIKnMEgrZZA+z16wnZzIqp9gJc4YEGkntPWnALD9IBn57XEXo4GHRwRRHnTFp0RdIaoWRCuGU1OZxyycWpLL0WrbBJJzZKAxUrJzTUj2gh0iAyQentmxEyEFj6Tkw949O5BHHmTl+ZquEQ7B9XldY0YrTu5RDpB+xPgYVmQujUR8ZZ6RteHWnnKLklBctfA9JqpyBScNNb6B6nyE5FQ9SWzPCzHFaZMVPbNkENZQrbbi0Ul7hGYez6olWfGB83P3D0y0xYD5G/Nikx8ea9pqztre5h4hR0usQyan4DtYDQB4Ksp3U6DXyuNDKMLql4ktEkoUs1hDZeMYFVRh/mKQhD/Q5SkJV55Wn0zpiUms+YXnF8UAxqgd+ECo7RBv04KCcIOuEkqiBnVDmlxgT4o7pgRPYQ9lFYtFXRmXxA0QemytpoaJNsLkHXaIJG93niGQiPa1dRC59gdkrloKgbTElBbFDrAxZSga2xPgbI5Gp9G60LMnO2mi7+R6KER0gSV6hmkuNBJnKOGF77gxWEz6ZPfwZCZOVqSwjHHfXxEgOUPEsxVmYCj8wly6GMcHAniFwKQvSBbT66Es0+Ua3JMu2JMu2MmzLOHZWtS/dgO44NZZkW5ZkW/VrifFjiXjkrDCaRDhTpIrwzEOKS7jtGU+MxqwerBHCtNJLOqGu417egZe97GV6+ctffi/PftOh/+///b968YtfzOuL/I1+U/Y1fr0DT/4dyO+/7T9YnvxTXHe8zR3Ix+lFL3qR8jG7Tf59y3npS196/bPy4IOWe3MQeiRk23Ud9hLxi1sNlpgK2aIY0QDtIiJTCU6ojCI4wTYnB0UDi1sMlpq1dLRdheRYJ7SaD9QSLRVfYimojWIY5oEATCcjwFxwt8+mlmRblmRblmR7Y5M2UOq4GMltkMEswclaChOhJXpwkB4VnVGM6ECyDBJjxlFhaUXPuQgytYsJbE2M7xGrYwAAEABJREFUaEBqAktchMqthSSQKXEg5gaJINo7KFGCLh2jenSWFJwsrH2XLvaIZ9cK3SIViXkP0SRqFiY1lwZ6RhmNxcMmFozWKEYzJc9iWBwB1D566IVZwgcqiA30QDKYVo1t8xIPllGSNpWxrS1O0hLjY3Z0qgba8EEBDXqOCWIjW+cYxeiWaGJ5gbhw5KwhKr9Tzvyn8DdjHg7ygLGeHw7kHxY8xSxlD9GqrjAlZFZJli0/xTp9cHY9cbTiA+PHSMiLk1Ljl0b/LSaWrQvJnn1yS9tics6trql6EwObj1ox0gtASRSPPDQcUtkUJ+cF1pyc0m+FVJNXG4BMtqM3k6YJwgESKgZmRpw4pyIhK0WI8VK7j1SSkx59xi2nijZVv8DkpoxsQslpmzkNK+cMKwN1ID2ppEc4RlMkeNTBEarXjMSSdxvLnUjeDuYQdApgac5+7Y0VTi1rnecQycn5SMokja60CyEEZxYP4jATYxMmhEmESR1KxZYYf7JFw2SXnIUeE8elV00W1AjUMQ84CQRP17Dg9C59xrSg57ifABE0HKo4+il24mjpT2Z6PZjRO7U067rwhVVP+B5G2xq9KnuBnI7TZ+KxDxeRSVpI9EfP/tJf+kt6znOeM9u/+Tf/5t5e5P/5P/9HX//1X69P/MRP1B/5I39Ev/23/3Y985nP1Lu927vpD/7BP6g/9+f+nL7zO7/zXl7ff/2v/1Vf8RVfUdfwh/7QH9I7v/M76z3f8z31Xu/1XnqXd3kXPetZz6p47sG9vMCdQ/+jf/SP9NznPndlP/RDP7STebelj/u4j1tdw/aalvzTPu3T7vbFXDjdT/3UT+kbv/Eb9bf+1t/SR33UR82///L5+bt/9+/Wd3zHd1yovluh/B3zZ//sn731x236GP7kT/7k3bqQG07z4z/+4/r0T/905c+UfJze+73fu/7MzMcrfy/k4/mKV7zihi53M5yP4dd8zdfUxzDX8+7v/u71Z2X+bviMz/gMPSp/Vn73d3/3/Pd3Pmb5+++mj0iu/bM/+7P1p/7Un6rfp7k37/u+71t/v3zxF3+xnqSP+U3HfNzi+VwQr/W2GC1GqF7nHWJOwstAXhmSl1kEtbF1fF5npl8yVtaNkZJJHhNCfVYIs+rAPiM6/qkddcWXiEDfyifxMtIvOexIh5BidCjM3uWnX3L2MNqtjS0qd+BZT07BhqzZus4APWFqw3aQjtRQmRjWnBWfGYd4bbhAumcmYQ/ZK8l07fo9jlbxID1IrJklbYOEsjEuCczqObBiJDIrXh8vyK0wXckFaJmGabHEPhlqbUNSYXpXFrXJaI4SftHoVPE9RKM7Ybaha9pNfIXEioMks4a1TXzGRc9kpGdiIPS0D9oRJ4lJATnZC0LqEedOVt5A0vBSEgDXQu4bzThkdLpTS1LzG/xVLeXF2SVlQLWh0TkmyKaUEGZP/CTF28U0xKo/RUEoqSHVAn9CukQmgamn1CPBbJjHhDP240LLUumNluHMaHFnlCqEJkZkQI0+xwSFPqPxPJTGaUVkwqwF4hcfGH82K/vaB6jo2A4qNZI6KkY8wdvEMJY5IzXFLyExmwrM3iLVaEyJhSioHhCmVIvUuCJSi9IKkzMskNgOetItlTswfozjSDiFLExp4ivsQnsgMTF8iKqIxWBhKqXBOEHbcsJBHNtiYsGFTTmXMLGYJeZsYhjmgUCxFc+mUWccWUkqHU6MKbEwQWbiGBNSsxbLhbWUy6KMoIkasjQoalYFEzpDKZIyKo4zIw5TOdgGI0mI5Vi2lWFvUIPPmCwNtkFqK3uFKMUHxh+WJrbFxHZQQsekA6RGUlZLG/TgC7QYVvaTGlnVA894WMVB2CM38w+Hr/u6r1NwsrwD5L5e6POf/3w973nP09d+7dfqB3/wB7X8x3geoH3rt36rPuIjPkIf//Efz1+E/O13jy70Qz7kQ/Spn/qpyjX8yI/8yNnJf/iHf7jiH/iBH6j/8l/+y1n8vgnf+73fq3w8//k//+da2v/8n//zvl2KvuVbvmV1Dcvr2fr39QH1f/7P/1l/7I/9sfq99QVf8AX1sG/5++9//a//pZ/4iZ/YfOzuLn3Vq16lb/u2b7v1x236OOYh6N29qvXJ/vE//sfKQ58v+ZIv0fbPlHy88ndC/qx89rOffe8elv23//bf9OEf/uH6pE/6pPoY5nqmq8/fDXnIlT8r7+vvt+la8u72/H7Lx2qy/Nk5xffwR3/0R5WP6ed93ufpX/2rfzX/PZmHwfn7JQ9HP/qjP/refcz3rnXSbF7EYfaERMpvRBUvAzOPUSJOZk0WZTSaiC6ZxWBhKnmFOo3wSzbXkMRU8TiWbUknc/lRrAzPPEzNPFAa3Ddj9sFsU2TZJxPDhq9QsiRkFUoL9PAPkKJE7FplnzBdoK1ZDONrNrn9FRZBv4TEjHWWJXxjjWI0E1r2V4azSFteQmIJHCKBioNixAeqdoH2iEfD1kxq7jVSYzFWiFJ8IH6K7HDJXqAEP5kYI1y6ZDVfoCQYNmGzWj1pAye+QmLFB8bH0tC2mJgJZhq/UZ7QuIYYFGMghYYJdY1RVIOUDXamRsCGM5sbsFgWJjWXCsVIDXDiIRilrJs5iedYSvXCAy2r5waJlT6j1Fw6Q4SkJRB8Cs8F1WP8wyiPBTdPHCsHnWeHwyW3Zi38o4oOcTG85jiUsFKy0qsL+hKTEH7CZuHUc554peEwa48t0rR1ArV3YRZ6RCg3S3WK2J2JRUkxUdoUWyCpsMyOn/PEYnn6GkyvYHOq2KOqgisjq/hAgENlrfRyKF9hkWnZBsOXlrzwgeWy1KwlgdoLVlj7Q3KsBAtnzr3BT2LpJE/XOCNa1R1iqtuSknbpFdzy9Iy+QpLDc4+XsYmfIYdJ3tQbGjcAVuQY2Ssnrf2SVekszNZpk5zwGaMNAyjLmvQFUsDciMQjLg1pvwEB8pg4+20SmM9EIjP3ptqhM8lALCcfV/woxWk5YRXAZySJ2dnRIczm9MGPWpwe50hO6UQy4x8hvQjXzluMSKcARoPk4gGsS34hq9JqoYy84WYvhEdm5mHEF33RF+nP//k/X+8aeKgX9pA2z7tavvzLv/wh7f7Ebpt/6OZdHU/sLk9s9zwoyruvnthdrt0frzuQP1Pe//3fX3kI/Xj1vPZ5Yu9AHhZ98id/8q02+ff//t/rL//lv3yr3LuQ9MpXvlKf8AmfoJvezZ4/K/Ou8Lwb7i6c+7ZnyMPNr/zKr6x32v7hP/yH62G7bjlyrX/0j/5R5T/ELpXkweBHfuRHXkq5V7HT6/a8sBuv7/Lirig8VxP/EiYWq7xaYEuMf2CReTWamdfEjZRPM/HJok3+hCmIv8IInD3XEX0YSjrAEs9uE5aMvoOkMJPccXo2H93Csfy7oe4lfnCydCwf54TVLiXVM/1ipOzwjozdiIeHDWS/dEvvxu5ScrI7rfaCnmOnZ005KRQwB2nOWnwXU1oFOBPiTnOSDpEAsw42I04uIJY+B9jXnIQ2qtoZ68TXmHuXhIH0Lu8Mc8VUZhLLpU/7FS09fciLjxsdWF8KhYRrPWF2nBj1Fa3Kqi0l4eiFKIdIIDObB6npWQQ3OPYjB8ZGvWaz9nplF2I3zDl1OPSsiiXGn41o+QOB7Bs4YbGD7cc+XElnnXh7WdtylUm7ETu9t8fP8aoOP4cojhDkAaB5JpitB/JYsLxDlGyzZA6EM9ElRVqYGBWb0Wq+QOEfmkZkoPcQDV2M6o0fpFB2iDbowUE5QdYJJVEDO6Gk4tIhagx7ZA60w7Elxp+NwvIHApp5CEY5q7TBpC3FDps0S7XuIJKJ9XTS4q4ROWL1x18hgXAPTKFdTLYl+fQLbmnwE7YWjkGYIlX76KEvkGTbVWxbdhuOLEY4oBml1gdKzSWwIsdIj8raoGYulZ820QolHaEYiSXhCBM7NOorJlYaMJUBMoWYuUArx8pyjCbfpFiSZVuSZVsZ9gYRo8RwFTyZBx9IrUmy3Xoh/hLjW7KNbVBqTTpDGY2FsqwhjdIGPfgOWoxaCtMLRxPGfxQsX/bzN//m39Q3f/M3PwqXc3gNb/zGb1xf2vQWb/EWuzmf+7mfu6vfB/FN3/RN69ryZW25zu2Z84+7vCNrq98HnhefeTCRf5zfh/M+ljP+3J/7c/XLf/kv37WnPvWpj6XlQ6vJw9qP+7iPO9s/v+/yZfcf+qEfWu8ye/rTn67Xfu3XPsu7q4Jt5cxHH6fod/XstznXV33VV52lvc/7vI/+2l/7a/XOuZ/5M3/mKp53OC7f0bkK3jGSbx3wfd/3fatTvf3bv31d2wd/8Aev9FzT3//7f3+l3XWSB+35OOWdf//pP/2nBzpuvkVGrnlZlN+r7/d+76c3eqM3Wsr1Lvrv//7vX2n3ldjm6Ob1nAcG8JmImaplcGXEP8S9YLQDiyyWmrXQGawVZCYci1sYB+ujWytUuLu6A7KXXDK/xFiii7MwJz+Y1GBaNDqS7AXGPzR1rgdKzaUF4ouRnAbh4glsz3hiNGZ1M/YVMXviYlhFNdBS8T0UA13DHMdoA11oBGxqEm02QuXvIRplrNpLqVB6xgGZ5Fm2TyjLtiTLtjLsDUbEhqyO6gBdelaLQZFR7FqlgXZzAAnfCRk/uDCpNekAqZGU1dJAF66ZpaiWzhElYUk5jxgnJJAZYQ9VIusahSJqUCX1ekIdjzl1OPSo5CXGPzSyKybZUw/VmOkkF1ru6AVMholboonlBeIWX2CHRWrEwvhtHrxxfA9AHg3yOLCfLGbdcGJ5nJgX6Tw4xE2cZ4mlN5aL3PFobazk17rA3iP9hkfZgUfPilzCxGYju/wlxi+RM7SfvSG9L4dH5ZC1nqOQsExSA9QV0IK+uNVvRvpU4kD8ii+QQpomXkX4A4GO4VRrFmYlbJB2IykBeuVUiPHSYx/pRE6l9pJURGa3GZzq4hukJteCSl4lFK54cmLsMzJg9GdFYsUnwBy14ekwkEDtMSMxClu7wc8dSS5I89VeIVQHMJqTEw6cOLWcgtLEie5xtJyFpEzSk0eX0oMn67xw+tWsJQJ1ADuPJnBi4UujJwESRyyQOMiuHSI6JDgqsfTs0j1OAsE+W+ILTqPSZ0xL4uzROjz+sNonfvodYu/BSjprcs+MvqVtsHqizZj68AuYXM5fWemJ32dPTa5liUmO1kh6yjhnOHad9+IOPOMZz9BnfdZnKV/G9GEf9mH6lE/5FL3whS88O3seMP3v//2/z/S7KrzO67yO8v258o++v/E3/oZybdP3ssr3Atye+74+APyyL/uy+tLL7fU8Sjzfb+1zPudztGd7D9Pu8rXnSym358s7UF/wghfogz7og/Q7f+fvVN6llO8L+A7v8A7b1DvLn/KUp9Q7rPY+RtHyJZLbw+dh/M/5OT9nK99J/j3f8z2rc/3SX/pLlW8z8OZv/uZ6j/d4j/qzZpUA+bEf+zHWuz+3/7mVh1iLdKQAABAASURBVJn5eOXaft/v+33Kw8DlVeRLoB/VH3yyvM58WfuXfumXLqV66JfvGZgvh957l+feg+JVg8dOntTKet3Hi7oTsj2cl4S8zsvrwOaR8qKvXgnWEp2UJBZnYUa5aN2IlCRjTMiYEGb2oTsAYWaLWJfunCkBrK6BxMuYrdJ0jVFilGeyd+KcIn0L2HfCaLc2+lTuwKnHCokVD459OEXOk2uJEqxoeiUG7vNu1GEqqwmZR0ivmikgh4pKvogpGJYyCmrWQo8T9lk6lQBzvrEUMklFjIPVNW6R4tJnTAk11XogfialATIDdQVJbk6wsguJDcx50n+yLScNKflpNWH8YXSvnEuY2JFRTNfeIzkcsvm4hvBhhDuveJacYQ/pQF+SKUkcjrfPxz4Bcsgub1pyX8pPP5wtT88Hs2rCwZmjJ9sihgc4ax1igZFJKrkwHnH87B3vGNOX/MzsVxitrepKo8sOPqUeB8oSjwct72Ck6HuoGpReQKvjCxT+MA08V0bEQewSJjablf3sgQpioKIJf6AK6S00ZUwoFNVwrTrxIQyQ3Z69RA99IDHbNDG6VIulYEC1SPt4MShVUXKGZZ9ooAvFsNptjB+DtR4Ho2TBreLaQ0ulD8QvXtieGJ65yrMYLEyld6PlyAgz4tgWEwtesG1tcclisDDLD6LgGxNmZRhvhdkUzTayZXsgIKvpFjV0UAyfzLIyaym3FikibmH8I5tzxIAwcVTpYpxxBKY4KFNBLTnELkF2MCkb1JarRqsa0YH0KH2DtjuvEH9G6uL7ACURFmHto2UJM3YZK+palV7lwc+wNElg5S1Qj8h4m7d5G/2m3/SbyvI//4/IZdVl/Mk/+SfrS7+e9rSnFZ+WX/JLfone7u3ebqIz3qcHgHnQku/b9AZv8Abz+SfnV/yKXzG5M+7lzcE76uR7c+Xh5nS8R+3zc7quRwXzED3fR2x5PfmhNO/6ru8qmz88l4Ez/34L+Q+G7RXk3WX2/bjuPPBbnj/vJFt+f83tu8Gmd60ua+6in3+45R1yy7P9xt/4G/W6r/u6s5QfCjWT4eTLaod75+EX/IJfUH9/T3+P5wHnbQ6dd4bHlrnv+I7vON+b/D35lm/5lsvwI/OVAvXbkoUp/nDKLFR+uyIG4m9RGYhOMP4KjXJgkZO7wpEOJFS29JM7Gw5TOVtQLPgCbfwzrIgyTGyNYRrqQG/RHae3xQguTAvftlwp3qAGP0Cp4xI4asuDV080ECYbXxjYvFYVVXQJUHHjYsJmLkY4UHovrC0aT9gximEs06q+7WaVrB4z4jCVxEMkUHFQWHzQxk+3gfbg0bCJ7aPpkKQ9tEQvy434wuzwSFuM1ibGSEuJnF9WVrVuWcKMTRj/wDxyVogGF6N64gfT0LaYmKWatcgeqKBZTdwLlESOlWE5wNooPNWYeBEWeygD7TVX+K5VMQszcaByC7NgoxVez+K1wC2zaqzBibu0rI4MuwEJk6Q6Bv4KZRXXGmGKXu8AVA2eEO4+ceRJYukLXDxpTGnoMdKXJ49VPSHJqOk6e82zVmbFwtI7ZUGS80CzYxERok8GJU4gs8TuhUhNiTtYVehLTF34CZvt8OyT4C72ntn/ZCQnl1Bp0LH5qXliSz3+bNtg+L7l/nVv4jVr6U6TG8SSl2OdIULpK+yCvOjKoWufxLE0b96R5vHbtjy9qxsLk1vS1d2bGhLixwgyyRoapHcMr8ZdG5EsimsmEukAK5P4EuO31b5EM6tb5JAlxp8su0x+cOIzIjJXvdLv0OZCHAqZOFV+E1Yq96Zbc29a4LbFCQ/SKjk062uFVwE46cQyOxs9BFtz+qHRvKrTq+L0SKQ5HmL5QTIJU7LQ6VEaSDiT+NizahIYHJdK1nCCeGu+ZpVVaegrpHDM7N2bIlQO+AjM6Rv155u754HZQ7ukJ2DjS/8QyjvotlvmHzxb7a7yvCNpe7b8wIF8L6/P//zPX4XyTqS9h4KrpDtG8r2p8v24pmPlGvK9qib+KOE3fMM36DM/8zPrnalf/dVfrXzT/vxZeN+u8Qd+4AfOjvxrf+2vrXfg5l2A+QETf+JP/Il6N+59effY2QXtCN/xHd+h7/qu71pF3uqt3kr5z5WVeIfJW7/1W5+d7gM+4AOUHwzykpe8RPk+qcuEd3mXd9Hen0HLnLvg58tbY8uz/PSf/tOXVHv/OXKfPj9/9a/+1fXDdvJ3eOxt3/ZtV9d3RPLl+tvYm7zJm6ykN3uzN1vx3MtXvOIVK+0+kn49xws55vxCMuLEc1HxD/FikKrEl4ZULyAHJjTcwBwqwpL4yiDMnDXHzGvWrslr1goQWmIywveQ/syOJt5kzemLTNOxTfP8vVR5HKL8CcktvsJ1b1JHr9bTJ0YJenu9S+LhYQNTnKwZR1XCpcPxKxwXHzmNykKLEwumc3A3WIFULG0UBipezmlJatghEmDmflZ5Drq0iOFg7mNaVS7OzPEz0+ZmrCskbSC9yztE7gQxtmdbdshcGI3QycEZaRte3SmnKDnlRQvfQ5IqZ2DScNMbqN5nSE7Fg9TWjDBznBZZ8RNbNkEN7ato73ClvGIzDmfVE634wPi4+4enW2LAfIz4sUmPjzXtNWdtb3MPEaOk1yGSU/E9zD7RScixax94eoXXOwBNkuT6JR4LxjvhiLhRweQMbE6sOCiJsKBq9DlKQtUcV7GxjpjU3CcsrzgeKEb1wA9CZYdogx4clBNknVASNbATyvwSY0LcMT1wAnsou0gs+sqoLH6AyGNzJS1UtAk296BLNGGj+xyRTKSntYvIpS8we8VSELQtpqQgdoiVQXQPJUsjNhCBqfRutCzJztpou/keihEdIEleoZpLjQSZyjhhe+4MVhM+mT38GQmTlaksIxx318RIDlDxLMVZmAo/MJcuhjHBwJ4hcCkL0gW0+uhLNPlGtyTLtiTLtjJsyzh2VrUv3YDuODWWZFuWZFv1a4nxY4l45KwwmkQ4U6SK8MxDTrw8pD300BdoMaz0lCbUPEo3dDLc67yfdyDfFP7bv/3bV4fPlwq/1mu91kq7LyRfTvnO7/zO+m2/7bfVD3LJT2+czp6HoHn4YucTd1LvNuYF7/Of/3wtr+NjPuZj5nem3O3TP/jp8tD2C7/wC/V3/+7f1V/5K39Ff/yP/3HlS/CiP3i3h1fx3//7fz/bPF/CnAfS+SEC+Xj+23/7b5V3r/7+3//760HnWcE9E/Jnyd67//JlzvfpUn7rb/2typ8VyzPnYU++/2a+BDgPOadYvjfgfbm+13u911PerTidPZgfBrJ8iPWzf/bPjryy7TvjVsFHhLzoRS86u5Ltl6xveQru0zvlc949q78Os+SvxT1MUWKHSJApXitmFiqjRJxgmzthaII5i4TXszmrMgpZcqyK4wvC1Iyyiito6QxLQW0UwzAPBGA6GQHmgrt9NrEk27Ik27Ik2xubtIFSx8VIboMMZglO1lKYCC3Rg4P0qOiMYkQHkmWQGDOOCksres5FkKldTGBrYkQDUhNY4iJUbi0kgUyJAzE3SATR3kGJEnTpGNWjs6TgZGHtu3SxRzy7VugWqUjMe4gmUbMwqbk00DPKaCweNrE1ipEMQBZb48ANMJtLKyRWvDBL4gMVxAZ6IBlMq0YV402IezhHSdpUzlSzQpKKD4yP2eFUDbThgwIa9BwTxEa2zjGK0S3RxPICceHIWUNUfqdc8N0xrbHeAZingXmaOWMeDWJ5gc6DQ0JE8tQQ7ZyfYh0enMQTRys+MH6MhOxRavzS6hkley4wsbF/5c8+OavYxOlY+hrTFAWoNcnsGAhXnOI4J6QPkao5RHJyLpKYdbgLSBfyawOQyXapGXoCUER6oO3wPm1WEmkQL8n7SCdyqs0uUkWbql9grifpVBNKTtvMaVg5Z1gZqAPpSSU9wjGaIsGjDo5QvWYklrzbGLeoancwh6BTAEtz9mtvrHD2YK3zHCI52YOkTNLoSrsQQnBm8SAOMzE2YUKYRJjUoVRsifEnWzRMdslZ6DFxXHrVZEGNQB3zgJNA8HQNC07v0mdMC3qO+wkQQcOhiqOfYieOlv5kpteDGb1TS7OuC19Y9YSvkP2KD4w/WXrlrGBVgZUFNieYXPbjYjIjRyzMGQijk8DswHW9j3cg3+Q9/7hdnj1fFrbk98l/6UtfunvcfFlfvjl8fnjBbsIdFf/BP/gHqy81e+5zn6v79O7Mx+O25kswn/Oc5+jf/bt/93i0e1J6POi7pvKTnZdfZvqkHPJx3uTrvu7r9CM/8iOrrvmecnlX1kq84+QX/aJfpBe84AX1g2guHTV/luSHDf20n/bTLqXdqdj2Y5HfW8973vOUH2iRn2j8T//pPz07bx7snomPmLD3AHD77sif8TN+xtlV79WdJT2Y8KRn98s+XgHmtRyEyes8CJMXeXmpB89EqFkL52ykkiB+Mru4Y+GxSQM7l3DplA3MPuWS05gc4tWWqjNEILdei1JwGemTHFrSKaQYHQqzd/npl5w9jHZrY4vKHXjWk1OwIWu2rjNAT5jasB2kIzVUJoY1Z8VnxiFeGy6Q7plJ2EP2SjJdu36Po1U8SA8Sa2ZJ2yChbIxLArN6DqwYicyK18cLcitMV3IBWqZhWiyxT4Za25BUmN6VRW0ymqOEXzQ6VXwP0ehOmG3omnYTXyGx4iDJrGFtE59x0TMZ6ZkYCD3tg3bESWJSQE72gpB6xLmTlTeQNLyUBMC1kPtGMw4Zne7UktT8Bn9VS3lxdkkZUG1odI4JsiklhNkTP0nxdjENsepPURBKaki1wJ+QLpFJYKKHL4y9qn5gvQNQPBUUjxF5Njhcb1BSJEwMUlmlRp+jMtADChrP5anW9rNCmXgekUL8Jcafzcq+9gEqOraDSo2kjooRT/A2MYxlzkhN8UtIzKYCs7dINRpTYiEKqgeEKdUiNa6I1KK0wuQMCyS2g550S+UOjB/jOBJOIQtTmvgKu9AeSEwMH6IqYjFYmEppME7QtpxwEMe2mFhwYVPOJUwsZok5mxiGeSBQbMWzadQZR1aSSocTY0osTJCZOMaE1KzFcmEt5bIoI2iihiwNippVwYTOUIqkjIrjzIjDVA62wUgSYjmWbWXYG9TgMyZLg22Q2speIUrxgfGHpYltMbEdlNAx6QCpkZTV0kAfo5ODgayqfWUFJy5Gcat1UBmgnUXojbqOe3kH/sW/+Bf1pZbLw+cneD7zmc9cSo+En3/o5vuQ5YHafbmgPPDKQ8vpvHn30Tu90ztN9JHDvDspdnRhe9+I/yj3Yet73zct318tP5zm9/ye33N2vHzPwH74cha6F0IevOfdt9vD5oe6bLX7wF/+8pcrdumseWD2e3/v71XeRXcp7y7FnvGMZ5wd55u+6Zv0oR/6ofUDaZbfZ3RKfP3Xf/3JfWRx+S7I6SK3X9adfxROsUcJeRUnsTBXqAxEZjxS8GqyDCVgIrpkFoOFqeR00rpTAAAQAElEQVQVSnGVEb5nUyyJia8wgmWbrJNZhot1i6pRKgtzwU0+lF4GtIdopS/QNpJTURjPtowCrDHabO4Yq0sznrCBFMeza5V9wsoyazQQjzgrPhIOE1/YzIugX0JixjrLEr6xRjGaCa36imGMueWKkNhFJKHiID2qZgftEU8MWzOpuddIjcVYIUrxgfgpssMle4ES/GRijHDpktV8gZJg2ITNavWkDZz4CokVHxgfS0PbYmImmGn8RnlC4xpiUIyBFBom1DVGUQ1SNtiZGgEbzmxuwGJZmNRcKhQjNcCJh2CUsm7mJJ5jKdULD7SsnhskVvqMUnPpDBGSlsAJ6Vf6wPjD6h2APDtk8pSQp4I169EhUhGQJ4rlBjX4IaYPQQo6PTzeGptFp9/ILQ2JyZPL6BiEWby6Qup4IGXoOJklkt8ia4k7WF3Ql5i68GPsKPHsEzKw/+LsvYgyh594GclLhI7NyQ3BKGE98SLTsg2GLy154QPLZalZSwLVG1ZY+0NyrAQLZ85HAT+JpZM8XeOMaFV3iKluS0rapVdwy9Mz+gpJDueDm3SAM9WGB0gsPZJcOPHCVkYlKRvOXjlp7ZdohVmYracJhMlBIq2NMGVZW4+X3IgTRgufMYHJIsY/wAuhVJzORCJzyevSsm853IFCjrnF5NCMDFbitR7hKSvbZb9zJIc9WKtJ7i2UVBSSV5y9KraDORYVAYzC5OABrEu+zaptSUOvtC0SL33g8GlaZwziEKTFdT5+d+BJ6pQfKvEJn/AJq93yZW8f+7Efq/v0jpbVBUDy/bjyZb75/mrv/d7vffalfJ/yKZ+i7/me7yHz7s+cdXnKfIP7fMloLN8fbxmL/83f/M31JaXLL1GMfpctn4N/5+/8HeXdY1/6pV+q2Fd8xVfUl29vz50HLtt3q25z7grPn9/Ls+TBZr6vaN4x9qxnPUvbj21yc33B+2hf9mVfpjzEXJ49DzzzHwpL7T74X/mVX1kPxKYvfc2fi3mH5m/5Lb9l9/gf9mEfpr3vIbeb/JDFd3/3d9eD/ifCG77hGz7kUz/x2/+8n/fzzjbJQ+2luPdA+Gf9rJ+1TLmXfr20q4XjHyGhmhWvBbrE+AcWOS8YV3hQjpzUsskPWdVC8oIYvf+chePnxeirC9vr8sTCww6QFGYFG0cX9pg5fl7v1n74wcnSuXycE1a7lNSJ0idGyg7vyNiVeHjYQPZLt/Ru7C4lJ7vTai/oOXZ61pSTQgFzkOasxXcxpVWAMyHuNCfpEAkw62Az4uQCYulzgH3NSWijqp2xTnyNuXdJGEjv8s4wV0xlJrFc+rRf0dLTh7z4uNGB9aVQSLjWE2bHiVFf0aqs2lISjl6IcogEMrN5kJqeRXCDYz9yYGzUazZrr1d2IXbDnFOHQ8+qWGL82YiWPxDIvoETFjvYfuzDlXTWibeXtS1XmbQbsdN7e/wcr+rwc4jiCIeY2LB6B6B5GigeFzYK1yyZAxOLiwmDajIxyp/RHdMC4x+aRmSg9xANXYzaCz9IoewQbdCDg3KCrBNKogZ2QknFpUPUGPbIHGiHY0uMPxuF5Q8ENPMQjHJWaYNJW4odNmmWat1BJBPr6aTFXSNyxOqPv0IC4R6YQruYbEvy6Rfc0uBLjD+MBKZI1T5almRblmR7NhzmhouRHICgXKg1Ss0lsDKOkV6VtUHNXCo/baIVSjpCMRJLwhEmdmjUV0ysNGAqA2QKMXOBVo6V5RhNvkmxJMu2JMu2MuwNIkaJ4Sp4Mg8+kFqTZLv1QvwlxrdkG9ug1Jp0hjIaC2VZQxqlDXrwCac43GJY6SFNiGfVKH34hGVDmDhSUNdxn+5AvvdY3om0fZjyF//iX9Qv+2W/7D5dytlZ8yVu7/qu76r3fM/31LOf/ezdBy3f8i3fclZ3F4XtQ4U8KMv3WIt9yZd8ydmR/8k/+Sf1QyW+/uu//ix2V4W8I+mpT33q6oco5PuQ5UHF+73f+50d+0c2X2J6lnBHhF/8i3/x6iR5ODb94yKBt3iLtzj7fmz39QFgvnT5sz/7s3NZK9v7+K0S7iD5H//jf2j5rtscMe9ifId3eAflB/H87b/9t5WPnTbjvvyes62P+IiPUK4pDzaXl5HryvdPXWrx/394AJgH9LnWpW3/ftzy5O7VRb9PxqeElCWv5YJixAe0i3titAOLnEagB2rgzC0NqTFcUh2HhVmkUJZtSZZtSZZtSZZtZVgOsJ4wXiyB4GQkZSqlpeGcYbRDE7XGBkr4cGmB+GJYYs4mhouJ1cownrAZ2bf4jGIQNZC8IDbCOsNOk8iJuRdpYHNLxQfGn02M6EBpS8Q/CqEzpRwoDsgsbiNgNijLtiTLtjLsDUbEhqyO6gBdelaLQZFR7FqlgXZzAAnfCRk/uDCpNekAqZGU1dJAF66ZpaiBMyRiSYycB9AJKciMsIcqkXWNQhE1qJJ6PaGOx5w6HHpU8hLjHxrZFZPsqYdqzHSSCy139AImw8Qt0cTyAnGLL7DDIjViYfw2Dz5Qe4hWulXvAKwXbzwubOQZIj4PCHnCyCPFTDgTLoLM0hpZS89Ty8qhMH2a1xrl2NIr0UuY2Gz0LH+J8UvkLO3nDJB0BtDwcLJy5PBcy8C4WGauoTALVn3OkLpKHIhfeQvMXjGk2q82LlLN0IJYAhy9hA12esQ2diMtK5xgvNqjeoRFT8rA0sPZJxJWUiH5e0hCroUorSuhcMWTE6sz0D9+bUEWJUxqomNTzhJJqD1mTN0tLfuMXtmEFgFOkAD74ZUGorCGtV6c2mKXkFjOl8a4pOdsVEOY8PhtnReffWrWEqHzOEH6FNkWL2PxY5R3blYIk2YhiYLbs+xxitirz5b4gtOl9BnTkjibtA6PPyxnTzSxY+w9WElnHXtXzezTt/wNZh8aM6klVue6AZODVVZ64mevidOSXtURhCWnaM4GZyIlnTgBZhPWBODVDyT1Ou/JHci7w/LuuOVx8w/BT/u0T9NbvuVbLuVHwn/a0552dh35cuAz8SrcuTuw966cV73qVXfunHsH2vs+jdsHutt3D22/5HCv713UPvdzP/fsWPky51/4C3/hmX7XhR/+4R8+O2K+198k5j9I/vSf/tMTnfE//sf/OPt33Xnd131d/YE/8AeUb4eQ/0h44QtfqK/92q+t/yzZfilsHnD9/J//8+/6Jb3G58t1bpv8h//wH1ZSviXDSoBsv08g0msyH0ptXs7xIi8zL+54pcgxptd1IK8I0dESgTeJc2DdkLQRD4zauVdy0OfXkPiVUkhWECFpOVjnRU/gJmRravvEyW8eL5ZQML2D1Z/k7BFeSPD2SP/KH7jtVZzYjJw/PgeZ94tPj2TVvhd5iunRxTl+yo6RXjXTnxoqyc8acoApGJYyCmrWQtkJ+yydSoBZBxlYtVmG5doSXyHFxWeke/KrdRrB8TOHTGaxRsTKWiHXVZxIcGHT/tmzjf4VX2L8YexCOGtK97HV/ZViTkNtrSB9k8nRygNJKR0ZJK+0LGRUcIvJSRzsItYjvrhXnRVhttyDItkHZ8s5UDZ/AKsm5DNHT7ZFDA9wZo4Kq9aFkUkquTAeefhJineMdMg+lNTZC6O1VV1pdNlD9kgdUVJrXeFTeBAo21LmGapG5Dj7aLW+QOEP08BzZUQcxC5hYrNZ2c8eqCAGKprwB6qQ3kJTxoRCUQ3XqhMfwgDZ7dlL9NAHErNNE6NLtVgKBlSLtI8Xg1IVJWdY9okGulAMq93G+DFY63EwShbcKq49tFT6QPzihe2J4ZmrPIvBwlR6N1qOjDAjjm0xseAF29YWlywGC7P8IAq+MWFWhvFWmE3RbCNbtgcCsppuUUMHxfDJLCuzlnJrkSLiFsY/sjlHDAgTR5UuxhlHYIqDMhXUkkPsEmQHk7JBbblqtKoRHUiP0jdou/MK8WekLr4PUBJhEdY+WpYwY0eYmCUyuocVnLgYK251fEJpwSOK0WhZPRt1HffiDuTLKz/qoz5qddY3eIM30F//639deefcKnBPyD/7Z/9MeefiD/3QD+2e+F//6399pt+XBxP5R2kezu7Z2UUNIbn5aZ+D3mnIu8a+/Mu/XC972cvOzpkHEXvvqrovX1KaHySxvajv+q7vmqWXvOQl2j6IfvrTnz7H74vzoz/6o8qXbG/P+77v+75b6V7wfN5tD5r/NFlqew/EXud1XmeZci9828pD9jyszrd9+KZv+qbVDxzKRXzQB32QbP6eD3mELX8n5M/O5SV++7d/+0zz7r/v/u7vnnmct3qrtwrce6uPLgtTYmEWKgPiiPFXaJQDi5zcFY50IKHLRiFTJPWnHqQcy7Yky7Yky7YyLAdYt1gy+gJJYSpio+PCF0hfG44Js9u3QQlpi2gSOiadoyRLw7zG6okGJsPGJ8O2VFirisoqNBom7IyLER2oeC+sLRpP2DGKYSzTqv7tZpWsHjPiMJXEQyRQcVBYfNDGT7eB9uDRsInto+mQpD20RC/LjfjC7PBIW4zWJsZIS4mcX1ZWtW5ZwoxNGP/APHJWiAYXo3riB9PQtpiYpZq1yB6ooFlN3AuURI6VYTnA2ig81Zh4ERZ7KAPtNVf4rlUxCzNxoHILs2CjFV7P4rXALbNqrMGJu7Ssjgy7AQmTpDoG/gplFdcaYZp1FRtrtgxvfAoPCJl5dMgTRbya8xNH1QiNs488VaS8qickGTWtZq951sqsWFh6pixIMk8nE8ciIkSfDEqcQGaJ5KUTfnoRhFVwgVUFX2Lqwk/YbIfTu2K72Htl35ORnVxCpUHH5qfmiS31+LNtg+H71tecQuI1a4lQe8Ea42A5Vs6yQoTiKyS5+ED8NKr96H6OibYRHtnN07u6sDC5JV2dp9KVS0L8GEEmWUODVK9z7N4Jkp02cQ+wM3rX1IWfrPZNdaQjTGyy7DL5wYnPiMjMTmlXWE7EPZsLcYgzcboszgVeIe5Vt+cKW+B2xQkP0io59OprhVcBOOnEMjsbPQRbc/qh0byq06vi9EikOR5i+UEyCVOy0OlRGkg4k/jYs2oSGByXStZwgnjNs4YHEekSVlntVM9zjjLilECY28MkUDkszHR/FCzfzD0/GCP2nd/5nWeX9AM/8ANKLPYv/+W/PIu/xsIT1OCVr3yl/upf/ava+wbvb/3Wb13v/sg38F9avtz0CTrO49r2RS96kb7hG76hvtw372z8rM/6LH3jN36jvol/zH7qp36q8n3Xthu+yZu8yVa6kzzfJ+4f/sN/qD37nM/5nLMz5/vpJTf34Sx4B4V8yWveeZrv1fiCF7ygPg/zgzDyrqQP/MAP1Pd93/etTp2Hf9t3za0S7hB5szd7M+Xh+vJI+fLRH//xH1ceMn36p3/6MlT+fXwIn99vdfjFkodGeXi9kO6Nu/eO4bxTLl9e/+IXv1h5cPuZn/mZZ9fzq37VrzrT7qrwVV/1VcpD2+///u9XHuDm77pP/MRP1F/4C39hJ3CHmgAAEABJREFUdeR8DPPtFFbiHSf5cvT8/TzZ9ofx5GM4xYI/9mM/VleUd0Xm2w4UGUteD+TzO5gfQJSHgCNUkG8zUc6jsEyv43ZxV+Sql3r8yQjlNWIgGDn+JUxsNhwmrzzn16hp0zwBXtPmNSliXkd36+iVEZrIwAL4AkllllBIrz1M71lPzmRUTrETZu8EGkntPWnALD9IBn57XEXo4GHRwRRHnTFp0RdIaoWRCuGU1OZxyycWpLL0WrbBJJzZKAxUrJzTUj2gh0iAWR+8GXFy0Fh6Dsz9oxNHI44zc/zMVgmHYPu8rrCiFad3KYdIP2J9DCoyF0aj9dERRvrQqzvlFCVWXrTwPSSpcgYmDTc9gep5huRUPEhtzQgzx2mRFT+xZRPUUK604dJKeYVnHM6qJ1rxgfFx9w9Pt8SA+RjxY5MeH2vaa87a3uYeIkZJr0Mkp+J7mH2ik5Bj1z7w9Jp5YrNVBqyx3wGYZ4NW1iyyjeGCcnBhkoY80OcoCVWdV55O64hJrfmE5RXHA8WoHvhBqOwQbdCDg3KCrBNKogZ2QplfYkyIO6YHTmAPZReJRV8ZlcUPEHlsrqSFijbB5h50iSZsdJ8jkon0tHYRufQFZq9YCoK2xZQUxA6xMojuYbSNuXl648q2LMnO2mi7+R6KER0gSV6hmkuNBJnKOGF77gxWEz6ZPfwZCZOVqSwjHHfXxEgOUPEsxVmYCj8wly6GMcHAniFwKQvSBbT66Es0+Ua3JMu2JMu2MmzLOHZWtS/dgO44NZZkW5ZkW/VrifFjiXjkrDCaRDhTpIrwzENOvDykJXrwHbRqpKeSteIogxOCMJNYGgtTE59Qj8b45E/+ZP2ZP/NnyrbfBypX+IVf+IUVS85HfuRHRroXlu8/ln/07R02X/r1BV/wBdra3/t7f28v/U5r+d6Gn//5n6+P//iPr3/M5h+52wPnoczRN/Pf5l75k3MH8g/rPLjMQ4iP/diPVR6OTT+AYXmC5zznOUt6p/08UMhPVl0eMu/4yzvj8lBl+/vxTd/0TbX3/deW9XfNz4ORb/u2b1sdK++i+l2/63ettPtE8r0b8/B2eeZ8fuYB0Hu913vpPd7jPerh2TKeP1Pe5m3eZindaT9/TuY/R/L5mYe1+Z6A+Xtge+j8R8Jrv/Zrb+U7zb/3e793/js6f0/nWpcHzt+F0SfLQ8Ap/sxnPnNyZ8zfJ/khL9/6rd86a3Hyef52b/d2cR8Ny+u6XMkuIjIlFmahMorgBNucHBQNLG4xWGrW0tF2FZKXkie0imsPLZW+xFJQG8UwzAMBmE5GgLngbp9NLcm2LMm2LMn2xiZtoNRxMZLbIINZgpO1FCZCS/TgID0qOqMY0YFkGSTGjKPC0oqecxFkahcT2JoY0YDUBJa4CJVbC0kgU+JAzA0SQbR3UKIEXTpG9egsKThZWPsuXewRz64VukUqEvMeoknULExqLg30jDIai4dNbI1iJANInpcocRRlrJCc4oVZRN5ABbGBHkgG06pRxXgT4h7OUZI2lTPVrJCk4gPjY3Y4VQNt+KCABj3HBLGRrXOMYnRLNLG8QFw4ctYQld8pF3x3THuIVvrA+MP6HYA8KmTywLMeHRae+KvhPC1EYPLkcPB4lR6OFR8YP0ZBnnqXGr80em0xsfQqJHv2yS1ti8k5txwUFag1RewUCFec4jgnpD+RqjlEcnIdJDHrcBeQLuTXBiCT7VIz9ASgiPRA2+F92qwk0iBekveRTuRUm12kijZVv8BcT9KpJpSctpnTsHLOsDJQB9KTSnqEYzRFgkcdHKF6zUgsebcxblHV7mAOQacAlubs195Y4ezBWuc5RHKyB0mZpNGVdiGE4MziQRxmYmzChDCJMKlDqdgS40+2aJjskrPQY+K49KrJghqBOuYBJ4Hg6RoWnN6lz5gW9Bz3EyCChkMVRz/FThwt/clMrwczeqeWZl0XvrDqCV8h+xUfGH+y9IoPVhVYWWDzvpCmRNiXdK5r0iOQmQTcnGkRxC1xIDXXeb0D9+QO5F0u+SET9+S412OOO/AhH/Ihuz98YYTvJLz927+98sMjbjpc3mmVhzCv9VqvdVPqnYnn74Q8qN0e6IM/+IPPfvL2Nucuc9v6mI/5mAe6hvyHw6P0Z0oeaObd4v+//UdJvr/j3jvGt5+vefiXd1s/zg9Ht9s8aZxXc7zYy8SrWQv7N/IKkSD+8kVi/MnyOjE+2LmUFqdsIC8WQwD6ZGIVKqTqDEvofBLz500a7GNFyGqMQ8cARp86F7FLmNitbfSq1tlpcC4754tCq9p7xsRKmXLJIsha1zgh0eaJYc1Z8ZlxiKcZFewfkj1pjYuQmcQldpC1xH0slXgwAGayIX3ZL2TWcZgJZKtgwsGJ95lyRhIRL3LaV/wQ6UOszhJMPzA1dEdOHCsdJXjRUpL8PUTjYijnckbOxFdIrDhIMmtY28RnXPRMRh2RChB62of8I04SkwJyqKRh1iNeNyetOo80FOqzRloLuY+VTG+i5BGPfwtb1VYZC9ukFKBXrecYmU0rm+RcTZIOkZyKF3JKkIlEh8yV0aX4EuMPy74Uw6p+F5MzrN8BaE6M8foAR1qjB1+gMuABBY3n8lRr+1mhTDyPSCH+EuPPZmV/+wAVHdtBpUZSR8WIJ3ibGMYyZ6Sm+CUkZlOB2VukGo0psRAF1QPClGqRGldEalFaYXKGBRLbQU+6pXIHxo9xHAmnkIUpTXyFXWgPJCaGD1EVsRgsTKU0GCdoW044iGNbTCy4sCnnEiYWs8ScTQzDPBAotuLZNOqMIytJpcOJMSUWJshMHGNCatZiubCWclmUETRRQ5YGRc2qYEJnKEVSRsVxZsRhKgfbYCQJsRzLtjLsDWrwGZOlwTZIbWWvEKX4wPjD0sS2mNgOSuiYdIDUSMpqaaCP0SMHLA90si2GlXPI0jESlIiDNbNgwijyCvXIjAf5B3j+EfDIXPg9vpBf9+t+nfIDB/IQ5dJlJCdfWvrGb/zGl9LuTcz22Vnv2w+R+B2/43foHd/xHc+uYynk+2zlS9Pf533eZynfGz8Pkz76oz/67Cf+TheQd5Tly+2f9rTzH1Yz5dxFzPdH+8Ef/MHV0fLg6N3e7d1W2n0kb/iGb6jP+7zP0/u///tfPH6+dP2LvuiL9Ct/5a+8mHdfgnkXaq4pX/Ya/76ce3nOB/0z0F7/OZrP3+c///nKtxtY9p38/HmULwH/Nb/m10zSvcfpDrhe14nV6tFoFF0yi8HCVPIKpbjKCL9kSUx8hREs23Q4mWW4WLeoGqWyMBfc5EPpZUB7iFb6Am0jORWF8WzLKMAao83mjrG6NOMJG0hxPLtW2SesLLNGA/GIs+Ij4TDxhc28CPolJGassyzhG2sUo5nQqq8YxphbrgiJXUQSKg7So2p20B7xxLA1k5p7jdRYjBWiFB+InyI7XLIXKMFPJsYIly5ZzRcoCYZN2KxWT9rAia+QWPGB8bE0tC0mZoKZxm+UJzSuIQbFGEihYUJdYxTVIGWDnakRsOHM5gYsloVJzaVCMVIDnHgIRinrZk7iOZZSvfBAy+q5QWKlzyg1l84QIWkJnJB+pQ+MP0wMl69aLa1wvANQPHZk8mQRjyeHWY/4q3l2mPgSUxh+wmbh9KEiXmk4zNpji9UVkQeYFacMjECPEsEWWaNXR8QlVhfiSyQlFKOK9ZyXyFJPfUE2zgqkAsv+6RpcGWnFBwJJCxxiBaeF3uUuMf5kCcYfWC5LzVoSqAuCFda+kBwrwcKZc6/wk1g6yX3N0RMA0aruEFPdlpSqYmGWGEzvxvRDRph5fIybm3Kgc3CKnyGHSW2ChRMvbGV0IGXDs0/UGSmCZ3KqbAVQwyxSSM6EuJ2LEw1oDmFSHAUrMjD+ZEhdgBMNWPIdKRmnFBKYp7NBmOF1SUkshztQyIm2mByaksFKvNYjPGVlm9on+fQ8cXKKo2TGP0JqCdcJthiRTgGMBsnFA1iX/EJWpRFfIddWfCB+9qYplwOpDcCataAsEb+SkR+Rme+rlu8ndxvLlyw+rpf9BDZ7/dd//fo+ebe5rmXOE3ikx611ftjCs571LOUHnHzxF3+x8qXbeXdGvpQ030MvX8KV79+VnHzD+8dt44fcKO9W+eqv/mot7df/+l//kE/1YNvnvHlAlo9PHqR8xmd8hp73vOeV5aHY13zN19T3rnz60+/fD8eY7oTt+tLefH7mGvNwIZ+fub582eWHf/iH6z6+e+wZz3jG2Z8p+TYC9/GHYUwfqyXmY/IBH/AByudmHgbm4/bc5z5Xn/RJn6QXvvCFyufms5/9bOXP1mXdffDzpb/5vZZrye+3XE+uM+/6yzXdl++zuXev82W5y7/DbvL3vo9fHu7ltUD+bM27XPOu8fDco3wv3Td6ozfa2/rR0F6dy6gFZ4nxDyzy/FoQwqSYF5a1NkaLRQou7ayW4HgxOv27a2rCq9h0oIIcvBOHMFvtbCh5rIjMEhtHFXvMHJ8XvkwU/Ow7GR1KJ7LAagcfSFLiQO0ZP9a8vbEr8fCwgeyXLtmvcVQlnOwgNtJqT+QTdnrWlBNKcmhjdqoAkX0cuYHKKee00KbIIRJg1oFmxMmBYyk+wL7mJLRR1c5YJ77GvqJcS+n0LuUMRwZJtc+E9Ca1j4sGbR8nOrDi6Z20NS5Z75Oc8sohvkIixfeQQGY2D+ZjcIb0Kz1YJ8xSzUjF7xUB/4Y5pw4n+6ZkifFnI1j+QKBu0ApDsNESbzEn8RxbydpWV4d7I5Izbkddco43c5zilzCxYTlo9uuW8dLyhE/hcaBsYyqTG5EUEyOIXNzil5VVrVuXf41cqfO8h2joYlRP/CAFskO0QQ8OygmyTiiJGtgJJRWXDlFj2CNzoB2OLTH+bBSWPxDQzEMwylmlDSZtKXbYpFmqdQeRTKynkxZ3jcgRqz/+CgmEe2AK7WKyLcmnX3BLgy8x/jASmCJV+2i17hEHSbZNA8s+GUQWIxqgGaXWB0rNJbAix0iPytqgZi6VnzbRCiUdoRiJJeEIEzs06ismVhowlQEyhZi5QCvHynKMJt+kWJJlW5JlWxn2BhGjxHAVPJkHH0itSbLdeiH+EuNbso1tUGpNOkMZjYWyrCGN0gY9+A5aDCs9pAnxrBql458QkkgEXFOTqSwWgyWxmSNd5/UOPOQ7kJ/O+eZv/ubKw4nf/Jt/c33JaN7N8yDv7HzIl/BA2+f7zC3N5vflA3W4G8n5+ORBSt6d+Rt+w29Q7KlPfaoelS+xm+5yrjEPF/L5mevLT16dYle8m3cgn5v5CbH5uL3TO72T8kOT8lNz7/Pn5uu93uspv9dyLfm9luvJdd7Nj8DDO1X+bM0PjHrbt33bekfgI32Ppr86Cmvhxi8x/oFFHq8FPVADZ25pSI0TL7Tqry4WpqRwS4dYEWWYnAmNEwNKjR8LCaZ3oyPJXmD8Q1PneqDUXFogvhjJaRAunsD2jPzqGmMAABAASURBVCdGY1Y3Y18RsycuhlVUAy0V30Mx0DXMcYw20IVGwKYm0WYjVP4eolHGqr2UCqVnHJBJnmX7hLJsS7JsK8PeYERsyOqoDtClZ7UYFBnFrlUaaDcHkPCdkPGDC5Nakw6QGklZLQ104ZpZiho4QyKl76FFumwSMreoElnXSCem0cUwljlh/AObUrJPUvYw2qFRVDHJHs0m2EXLyvAFNAkmbomelheIW3yBHRapEQvjt3nwgdpDtNKDaXGM4x2APBHkEWE9WRwYP1bPC6PlieKM5BcfGP/I5prqVA9Xq2qpx5+NaPlLjF8i9e33U2/87MtB4xGEiY2KnTASlklqoPPwqs8ZUl+JA/Erb4HZK4ZU+1TDItUMLYglwNFL2GCnR2xjN9KywgnGqz2qR1j0pAwsPZx9ImElFZK/hyTkWojSuhIKVzw5sToD/ePXFmRRwqQmOjblLJGE2mPG1N3Sss/olU1oEeAECbAfXmkgCmtY68WpLXYJieV8aYxL+v9j7/9abdmyLT+stV3/i6K+/8fwk7H9ZOMXv6hAFgaDjYURSCBVvQgkVELi6NdaHxEzYs6ItVberKvceYixex+tt9b/jDFjr7sz9jwn8+ZudEMweOLxqUvMObVuEaaOG2ROyXvzMZc4TvvUZodgDAtJFny/yxWnibPmbskfOFOq75iR5DlkdHji5bl7ssnd45zBTjn7Ors9e8zcxm+YcxiM0Uuu9/oGU4O3KjOJc9bGzzgHUIacu4U3ZMOS4PD2b5iSTWd2L7aQCWlKBQg89jyB5wk8T+B5As8TeJ7A8wSeJ/CXPoG/af28z+UKeflbmHe9O897YXI7rp62d+O9cHB7p0x5fFo4kXTeKV8cAdJ6Cr9GxlMzp9JHwMQqZWxYxldLMDxV9K5zcsbPfOtZmPMy44TkyoPrHE5/nYtGT7MgjGs1WzzzGUQZ5WSmjLroldiwTeecWhrQ6GjyS0zD8rTRUOvGjBfmTASsF3jD9mZbnueZuhNyTvmOTE99R2cgnDi2ZCrLBhFbdUI+XTmZ4MG383PmOPObP2Li5ZxCOntar3HU651mbkNvd5C5qeRqjUBKqiOD1FXLRkWT75ia5MFpYr/jh2c1VRF2zzMoyTkE75wL5fC/wDuEemzN5FjE8AB35qqwji5GpqhyMRF1xClKdI9MyDm09O7FaOPtq8aUK+SM9JGltPsbMic13LHZzAhf+Atd+WbxHvn20M2uOuv4SyeWzKYsdBD/CpPb3cp97IUK4qCiiXihiswWmrI2FIq63F0vvoQFsieyj+ilLyRnmyFGl7pZCgbUTbrGL5NSm1KzPOdEA10Uy5pwMHEcNnoCnJYDt8p1hZaqLyQuL04klneuRhaLDVNmD1qOjLAjgW1hePALf+8tlywWG9Y4iEJsXLiVZaIT5lA028iW7YWArKHvqKWDYvnllhXr1rCbFJGwmPjO9xqxIBiBWi7WB0fAxEUxBXXkELuC7GBK3lDvXF2jamUXMqP6G9qeuiLxjvQl9g1KIi3SukbLEm78DpOzRMXMsIIb/0Cj4MJbd8KQ5BemSGI/8EMTqkRWz3qewPMEnifwPIG/8gk87c8TeJ7A8wT+Nk/A+7uc1wWCX3hS6TkhreULE986CUy8U2LT0MBILrePKJlfYn0iImY8VmTDlJZBJ4QfkPk2HBduT2yDEtI7oknouPSJkiwt9xk7Ew1MhU1MhW2p2F2lsopGw4V/cLGiA83Pxj6iiYTfo1jGY1bnT5hdsmbtSIAphbdIonlQeGLQJs60hfbi0fCNXaOZkKIrtMQsy4PEwu3wSO8YbVysVZYWOb+s7BrdsoQb3zDxjXvVnBANLlZnEgcz0LYw3FKtm+yFCprd5H1ASdRYWZYD7IMiUtfGS9jspSy0z1zhl95mNix5oLXFbPgaRTRW3g1umV1rD27c1bI7MuwbJE2Reg3iE8oq1xlh2nWVrT1Hht+go+ML+wVgvoAU6xr53pBvC/s94oapzbeIYPXG1BU3ZSE9GN9Ktrj4wRFeZ4fQG6Fhtpmd5kRnzNyqBBvSD4vRHdj9g+ecZC+R6ugnp7h8IcDHzv55KO2TOO6beMTEn95PEzkHgC/OvPKFxC25QhK5bi73winMN8fVqXnhRExGTV34y0d/8cxM1Qt7S36LolJHIufEETH0pUE4g4nhwIvTV76QmC72Kz6ZOTX58Jf33JwS6Q6T2zynbHFw4zsiYjkp44oNIl753khAHiOYtgRf8KZ4NjOeTzgCjylBeJBRqWHWfFZ4G8BNJxebavQQ/MyZh8bwdmdW88xIZjgRYuMglaRpOejMqAaSjpFfZ7YnicUJ6WQPJ0k0PHt4EJEpYa1qgH5CMuULEy/PXWmfRLSSmTkhYi4cUlw5/jiNhT3+VzyBp/V5As8TeJ7A8wSeJ/A8gecJ/O/+BHi/64tcMIdfYbTN32oiv0mheV3cMTW7E2B56Z3XSQjGCyhSgry7HrGZNSr6kVc+HRUyVakjzyHlb5j33l1PbvO2cIcTbrMGKc0xJZmxOS3oYUkdMfPCwTSnasfVlXR1OHHTCYmRM7AeWk4uyMTq3d6TKfjw1RhorsFr6wzoLZLA+M3qkYMIuXA8MxfmGTOJOvIEOyeOjUo6BL/m/YTNNs/sKrfIPHJzDTpiB2fQXJlglb3xTqedptQ0ihZ+hRS1ZmHKCDMb6OwPpKb5IL21CDsnGJGdOLnjENRQPunAVzvtTe+4gtNMtPKFiQmvL8+05ID9Gonjm54YHzp77jrR2zNEjJJZt0hN81eYc6JTkGv3HHhm7Ty53VsB+wqTYzD2K3825pvE3REb72gNP2ByOnLi8Lq6WxokcCKLZc0sFcUqtw48JPyIJu+IMr9E0wul4dKOalbaUfvyHk1gL+USyUU/OX3lN4jMsdmVsgm6L2651Ac0iuH+RCSTGbMuEbn6AXN2PA1B28IkBfFbbAXZK4z25l58R0/vHCYbvlxXKFZ0oPkTStasIhtW4YUTeVUOmppxe1A7khIapg0T37lYyQEpV7ZyNqw82oW7mljGBQPHQuBSNqQv0JqrH9HUG92SLNuSLNvKsi0T2Nk1sfQNevL0WJJtWZJt9dcRE8eT8ao5YTSJdEyUivTOQ168EdIRvfgFWiwrM6UNiayu6omX2wSYjpjKjYtk4g9sUbbHnyfwPIHnCTxP4HkCzxN4nsDzBP6unkDe73LhA4bmfW9HcuXBiIOO5sVBL+6XpEoR8HmNtE6oxYuWPrAK6qBYhnkhANPLSWAH7ok51JJsy5Jsy5Jsv/mmLZQmL1ZqB2QwW3DzkcJE6oheHGRGszuKFR1IlUFyWAIVq5V+cpHEdIlJvLtY0YD0BI54SDXsRhGISVwIe0MyiPYFSrSgS/eoWVMlBTcPm9jVxRmJ7O7Qd6QjOV8hmkTPwaXh0kLvKKOxefnGzihWKoDU+YgSV1HWCakpt2SHiLqFCuILvZAKzOpKT4INE9/5asmYlmw9J6SofGFi3A6na6ENXxTQop+YJL6q9YlRjG6JIZYPSAhHzh6ixlPyRezJ6QrRqi9MvHuOiH7ExOr6lW9B801ivr0u8t3hJ/b7RkoXpiZOYfu2uJhvF6k7fEvZmvCtfo+prfaO6f90LpATAHJEBNmBcD5PZgFMq15Ei5Q73CI1zf8ImUJdDwAxjskHWnoSUETuhXbB57bZKWRAohRfI5Oo6ZhLpIsx7T9gPk/K6SaVmvGdM7A1H9gK1IXMpJMZ4ThDkeBRF0forB3Jpe4nziNq7wXmEkwK4BnOeROtHc4Z7L3PLVKTMyiKUcZUxoWQgmPlQQIsOQ7BIBgZjD6U5o6YePPDwFRXzsaMjRMyq8aGGoE+7IZTQPL1GQ6c2dV3zAhmrucJkEEjoIurv3Ivjpb5VGbWX+bMTi/Dpi/84J0JPyHnlS9MvHlmJQbbBbYKHJ4PgsJ5fJhY5AOSiKV+x9SXUAd2BEgNGfqJOZMkOzE6JRgx+2PPE3iewPMEnifwPIHnCTxP4HkCP34Cf/PC9/c7Xva4U97rlvddb8W8/cVagzS9lEcMT20RbUeqiPvuuCMBtXkfzqyvsRU5AU/fO2d+jsu8O0zux8781i78mMl5vcYBUzO342OiJ86MN2Ti5JPDh7MTYwnIZxgzOCOkz4b4FjmjdV8hOSZmcEqLSMWeG8IZXAAjwFLYXLY3PndhYnPfYE5J3S3ST46DcwtgeM7Isb0HmeEozGp8ixnBjJa+I7nOAtsPbvyE9JWDqUu8+cZ3vJiRHOfTwvUzgxq0O04RRgM1VKeY0jvOw2rdQsqI6M+e1rOQZ8WwJChgOr0t/gGeehlbninEQMcw+BOT5NCWcQ6nUpYd5YqjZUjnt4TahYxJ6uCv3LSFH5yGzEGhp/snpmbznJP4hL0uqvRL+abQYln5JlIClXVEI3hlBrcdEYNZByQuX5h4dyvn2Deo6PgFKj2SJitWIsHHxTIe25Ge8q+QnE0Hbr8j3WiYxEYW1CwIJnWTBk9EGlE6YWqWB5K7QG+6pYYLE8e5jkRQZMOkjZ9wGu2F5MTyLaoZi8WGKa3BBEHbctJBAtvC8ODBt5qvMLm4JWx3sQzzQqDsxHNo1B1XVYqqw8lhEhsGYsnjGKTWzXKxW0M2ZQVN1pCjQ1GzK5jUB0qRlNU8wY4EmHKxN4wkITawbCvLfkMtvmOqtNgb0tvqE6KUL0y8PENsC8MvUELHpRukR1J2Swt9j141YCPQqbZYVu4hS/eYZPILFTS7Iw5KgwxBlYZJB1TXZBs+2/MEnifwPIHnCfwFT+ApfZ7A8wSeJ/C3ewLmnU5fucXqBvavwyC2SUdM/O6ZHe2EESzba9CgZbjY31FdVdmwAzf1UGYZ0BWiVT+gbSSno5jItowCnDHa7p4cu6uZSPhCmhPZ3WW/sFVmjwYSkWcnRiLAiIXvvAT9KyRnfKosERsfFGuY0DpXLOPYO1eE5L5ECpoHmdGeC7RXPjn8zKThPiM9FuuEKOULidNkh0v2ASX4y8Va6eqSNfyAkmD4hsO6e9MWbvyE5MoXJsYz0LYw3CRjJh6UNzShIQbFWkijYUI9YxR1UfKGU6mVsOHYcAMW28Gl4VJRrPQALx6C08r+Zpv4iVU6iwi0rLE3JFd9R2m49IEIKUvihcyrvjDxcrHcWN0tnREBU2ZdIX/izbeBYuUbR1i/GTwjXx+i5vvG0RON03bOUIrxrWQqcQhW3lpIzonTiB4hdQtHZA9fZ1CciGL0TnlD+iPjdLF/8ops+fYUoGAqhxNzBiK24vA61UeErsOpDcFpYX/xkm17T4YfPXXhCxuy1bol0dmwYs+H5FpJFnfOkyJOYXWKt8+4I1r7bjHd4ynJuMwKvvPMjH5CisO336/Eqdn4B3KZya8zN15shmNvkLPSlTMGaaI6tvPUpH1HasrBWOIPRMQyI6kzJrF5solv8ItUOvIsetf9bjRg0SP13Ab5fU0CpfyAHQDB3TluAAAQAElEQVTfsZMXi37kzCldyKxOPSG5cjKxxHfILNI96x0jMimAMyC1RAD7kX9R1TLyJ+QzlS8kztkM5bGFcEKEP4y0OFGMDpKx6HjC3Tf+jnvBE/wlT+CpfZ7A8wSeJ/A8gecJPE/geQJ/kyeQd7l3l/Jm2HfBpObFUC8+IXulD0zP5ulNfMIIeWcdnCHw1DAsEQBLfrLDs79xSrCKg6ub99udE/Pii6EQ5+9Cm2diY4IXdhz1C5PDY0zgXqMPjxJ+xNwhHOS8ZndcXUkzack9C/qJU549YyihEVtkOHv5Jaa1DQQbEm62SbdIAuvFdiTIxeOZc4N5nklvTtcWFjd+Rp7ZylZndpUPzCemIkYuH307r7R6B52uHqV5gsFOp/2IiRlQdc4Ja9SA/AnJlF8hidgcNhPDicZCmFcS5GKJC29805O7c8Y1lfMSXGG03SlqvBDoAzthCL7NJnzZJn7iKNnH+2kIv0Vq8lFzrQ9EqP4VJrc898x5MzIRv0fNHTHxcgqx/RH0C8Dzt4PW8AOK+Na1Mgt9hWjoYnU2cZBG2SF6Qy8OykmybyiJHtgLJZVLt6i17FW50A7Hj5h4dxobLwS08xCcdnbpDVN2FCdtyix1v0AkkxtzyhKeETli5xOfkES4F6bRLpNtSX79glta/IiJl1OAiVJdo5d+QIptS0Y7eLlY0YAXlywWG0ag4RI4ionE+kBmiZxt6YDaudS4aTZMX7lYyafoDpO7dfqbEzsDMGWBmBBjB7Tmql+hqTd1lmTZlmTZVpb9hohR4oQKvtyLL6TXFNkevUh8xMSWbONvKI0mfaCMxkZb9pBB6Q29+AVaLCszpA2JrK7qxC8MIRWhYbcIol2aTQqmRlnUBKJdYsVne57A8wSeJ/A8gecJPE/geQLPE/i7eAJ5t3v3XBwt73+A1nufgxaLrdZNkeOwxmkrjwDB0K2igpZusRllmZoNTRAHqiaOhwQze9CRZB8w8a1rar1QGi4dkFis1AyIkEjgRCYSazC7h3GuyNkbF8sq1UJL5VcoFrqWO4HRFrpoBHwbEm13Uo2vEI02dl2VNJWZCUCMOsv2C2XZlmTZVpb9hhHxJWuyukFXz26xaDKK3V1aaA8HkIidlImDB5dGk26QHknZLS108cwsRQ18IJnqV0gi1osmHzLIGCzcH0gFFl0s47ENE9/4VpLzUnKF0W6dpuYkew3b4BItK8tfoCkweUvMtHxAwvIDTlqURiwmHvfiC3WFaNWDGfEdpma5XygWXwDyrSFfCbL3W8HB7vCF/UbxJv7ozTeN1B71xLuvHF9zYnMGQb/dXpg4TnJOjk40nFuXHzAhHiMVSPXgEjoPZTB34EJUlVPzjjkrTooPRC0WzogDDyOBIda6Ld5ezqgGciphdgpIJsrMM6YkeZCeGvQT6ar+hhTms6AyugXFE09NvHeYc1YlteE4AgZPZ/gBSfSMHcll1k+cR9ZekOHcIrPx8iCziGcfDqWOwwjSW5WzbpFc64ptylGUMzVjDj51U8MhGEmM4lo35pyQqvLglkscP/Ry2pQx/pVCTQ19GPkrTgHJuVvyB86g6jtmBHnOGB2eeHk+eLLJ3eOcwU45+zq7PXvM3MZvmHMYjNFLrvf6BlODtyoziXPWxs84B1CGnLuFN2TDkuDw9l8hs3MxOlMM+4M/OplBNPqKA9EuseKzPU/geQLPE3iewPMEnifwPIHnCXz9BH6T7B/c490jLS2w3vvmHZFcOPr2Thmq/LdJ0PrO+IEIvIe2Xkwh5mWTUvQP3kwOSWbHqYQSYPSmLpx5hQMyP2f9zJnT+oXvs8rJ7bjOWbfrGYmZkarv+Qyacmb1w9B5h8yupYEaOlr8JaZhedpoqHVjxgvnLlNKAtsfLI0YpYgJ8Hy25E9Ic/mOaaGnoxcSxxgRoDLQT5Di4SRbXSS3cDsvZ8TfOWVIqc+oDRMvZ3prvsLk7pxmps4ZqeGSw9dnCF9OeurKs+UOV8gE5lJMS/Jwomu+zglQQ3WjbeszCck88J1n5l/mHcLFsTWTYxHDA9y1lzhgZIoqFxORJ87Zie4xc6mP5bxitPH2VWPKFXJGPjNZSru/IXNSwx2bzYzwE1JTHkzVC/kC0Mo3j9IBEy+vvmIqiDZloYP4V5jc7lbOsxcqiIOKJuKFKjJbaMraUCjqcne9+BIWyJ7IPqKXvpCcbYYYXepmKRhQN+kav0xKbUrN8pwTDXRRLGvCwcRx2OgJcFoO3CrXFVqqvpC4vDiRWN65GlksNkyZPWg5MsKOBLaF4cEv/L23XLJYbFjjIAqxceFWlolOmEPRbCNbthcCsoa+o5YOiuWXW1asW8NuUkTCYuI732vEgmAEarlYHxwBExfFFNSRQ+wKsoMpeUO9c3WNqpVdyIzqb2h76orEO9KX2DcoibRI6xotS7jxO0zOEhUzwwpu/AONggtv3QlDkl/YIvgJDTOiQbGMx/zBoz7+PIHnCTxP4HkCf80TeHqfJ/A8gecJ/K2fgLnA0aGxSHn7KyJcYbQPR8DEiyg2jQ2M5HL7iJL5JdYnImLGY0U2TGkZdEL4AZlvw3Hh9sQ2KCG9I5qEjkufKMnScp+xM9HAVNjEVNiWit1VKqtoNFz4BxcrOtD8bOwjmkj4PYplPGZ1/oTZJWvWjgSYUniLJJoHhScGbeJMW2gvHg3f2DWaCSm6QkvMsjxILNwOj/SO0cbFWmVpkfPLyq7RLUu48Q0T37hXzQnR4GJ1JnEwA20Lwy3VusleqKDZTd4HlESNlWU5wD4oInVtvITNXspC+8wVfultZsOSB1pbzIavUURj5d3gltm19uDGXS27I8O+QdIUqdcgPqGscp0Rpl1X2dpzZPgNOjp+i2ZO8oN8Acg3gnw7yHeCfLMoFnztlfNt4slbibKQImz1okGwM0fIl5+MRQ9J3cJMItlTL7FdqSJoFUh/9xcuuuo2Rp6ZZZeYO7w71alF5rIQLDGwD3/nye3+ngy/9n6apDIYfHGGlS8kbskVksh1+aTrukypcEBqmi9OxGRYBoa/fPQXz6hUvZC5FOVbaYAz4STLr3CKOIsgeSAkM3dEK7/EyXAK2dwr/OU9dx+EjqUq0o7RNs+ULQ5ufEdEbO/toAh3vjcSUIMRtP07bCnPZI7gE47QZ5oB89mIUsOwnbfhoJOLtZ3gGplPjuHtzqzWMTuZ4USIjYNUkqbloDOjGkg6Rp67HPgKA+QZRMQE9tSFh20YOXxh5HSdkL7yhYmX566UT4J/SktQ65aaJHPhHeec7K1p0EKiDQl/E7P9m9zkL7uGf3Bv++/zs+VJ/PrFf3QmuPHv8jdtv4Vsf//7Yn9f81t8mLdL2N/f2/6+5m3sb0O/+7n7Lv/bfJCLi3x39+/yFyN/G8n+/mfO/r7mt/lAh4vY39/b/r7mMPK3Cr/7ufsu/1t9mP+El7F/h9/TvNMd/fgB0bEqX2Fyy513yca8s769b/ZdlPfMM+YtMw1X2JPpOCClWIUi511hztj11GxO55Z7Yc5OYpDSOZMBWOMgFcQT8elCFw+LDqY56o4pi35ASptGKsJp6eEJG5ML0lm923syBR++GgPNNXhtnQG9RRLY/peWXPDomRkO5vkxiaulITBYjW1jX2M/Yatbx+wqt7jOobjnF6ONM+h8dQRGcdvJZzYt8OxojY5q9CNnQGsWJk2YmUDP+kBqmg/SW4uwc4IR2YmTOw5BDc3tBr/YaW92xxWcZqKVL0xMeH15piUH7NdIHN/0xPjQ2XPXiY7PDqXWjXE3iExyrkOc6+0856B1/gF7ysYpLi+2kugrTI7BWM7KmCB07kCw8V/m+8D8OX1CCs68LJW48PCFfmGjciJQrM4mDkJlh+gNvTgoJ8m+oSR6YC+U+SXWhoTLvHADeymXSC76yeksv0HkdbhSFirGBId70SOatNH9iUgmM2ZdInL1A+aseBqCtoVJCuK32AqyVxjtzb34jp7eOUw2fDkEMw2WvVAsYphI6oxImjW6Ji8dsBn4EROP24PaUSw0TGLDArcuVmqA1mQrZ8MUfuOuLpZxwcCxELiUDekLtObqRzT1Rrcky7Yky7aybMsEdnZNLH2Dnjw9lmRblmRb/XXExPFkvGpOGE0iHROlIr3zkBdvhHREL36BFsvKTGlDIqureuLlNgGmOxTJ5G4xY6kJpKY426YO+9vs//Sf/tO/zcF/5ak/ufdPav7Ka/yjtf+Tf/JPvpz9Xf7L5r9x8ie/Lz+p+Rt/jMvjf3Lvn9RcDv8NxO9+7r7L/wYf4fYK3939u/zt4N8g8ZOfuZ/U/AYf5eMKP7n3T2o+Bv8mwnc/d9/lf5OP8Z/8Gr/H72ne4sb98X5njTToEJ+kkvProzV8oY5oqdzZZVtZVn5p7YOWDjzxchIYuY17YmZZkm1Zkm1Zku0337SF0uTFSu2ADGYLbj5SmEgd0YuDzGh2R7GiA6kySA5LoGK10k8ukpguMYl3FysakJ7AEQ+pht0oAjGJC2FvSAbRvkCJFnTpHjVrqqTg5mETu7o4I5HdHfqOdCTnK0ST6Dm4NFxa6B1lNDYv39gZxUoFkDofUeIqyjohNeXFbKJuoYIWCmaYi2wYsVhtPiDhra0WBk3Je285RUdMjNvRaVtowxcFtOgnJomvan1iFKNbYojlAxLCkbOHqPGUfBF7crpCtOoLE++eI6IfMbG6ejZRENA7/uo3i3wdeEK+X9z5e46vEyeXbxmJwlOz45VG7UdN6s6erydRgO5p4iaBcK6fGQBK9SJapH5bTnCJ1FT/EXZIRuOcy+fiQsRLz8nRQMZFnNyB01W9SNHXSDs1tHMMg2MnTjcayViKi/k8KUOAp2Z85wxszQe2AnUhs+lkRjjOUCR41MUROmtHcqn7iedJpO4CcwkmBfAM57yJ1g6nl733uUVqcj+KYpQxlXEhpOBYeZAAS45DMAhGBqMPpbkjJt78MDDVlbMxY+OEzKqxoUagD7vhFJB8fYYDZ3b1HTOCmet5AmTQCOji6q/ci6NlPpWZ9Zc5s9PLsOkLP3hnwk/IeeULE2+eWYnBdoGtAofng6BwHh8mFvkCKYilb8f0lVC/kLMg7Ge+D+2fiOQ4drQGDVf0N4V//s//+d/0/H/o4T+5909q/qHn/2P2/bN/9s/03V/qkk/dP+Y9/rFm/+T35Sc1/1j3+2vm/uTeP6n5a+7wj9Wbn7f83H01P/nUfVXzO+Zy59z9q7sln7qvan7X3E9+5n5S8zt+vp/c+yc1v+Nny89bfu6+ulvyqfuq5k+W68f5LX5P837I29/Y9p7H9Qh5W5z3vNSEb0i69WgvpLo8SEBt3oczYMcU4zunZkbRQ9A9ranZeVVeUb9A5mTmz5wbtX5hzgnfkXO2O2yY3Han1qYGj3bgTJx7RsOHsxNjCchnGL3MDsmdGUOIEEvhESfJXvEaq5IPBsAYBzKX80J2nQBLIkcFkw5ufO6UO1KI+CVnrlsHxAAAEABJREFUfPO3yBxyvUsw88D0MB05ebw6SvBLT0vqrxCND0M7H2fVbPyE5MpBitnDxje+42FmKnpFOkDo6xzq7zhFGA3U0MnA7He8Dyejpo4yFPqzRzoLeY4tZjZZ6sgn/oGfetvGxjFpBZjV/RMjc2irKc6nSdEtUtN8kVuCGBITYidnSvkREy/PuTTD2n+Jqdk8sxKfMHfA+Rx5BoybWamBjMZk4l9Svj209IbeuFfmhGjlCxPvbuXv1PYNKjp+gUqPpMmKlUjwcbGMx3akp/wrJGfTgdvvSDcaJrGRBTULgkndpMETkUaUTpia5YHkLtCbbqnhwsRxriMRFNkwaeMnnEZ7ITmxfItqxmKxYUprMEHQtpx0kMC2MDx48K3mK0wubgnbXSzDvBAoO/EcGnXHVZWi6nBymMSGgVjyOAapdbNc7NaQTVlBkzXk6FDU7Aom9YFSJGU1T7AjAaZc7A0jSYgNLNvKst9Qi++YKi32hvS2+oQo5QsTL88Q28LwC5TQcekG6ZGU3dJC36NXDdgIdKotlpV7yNI9Jpn8QgXN7ogXKJbRAXYHwMKOw7pPga5S+hus/FP0f/kv/+Xf4OR/+JG5b+793YTUpPa7ut8pn/8617/6V//qR1dKXep/VPybFOX3I78v310nNan9ru53yue+ufd3d0pNar+r+53y+TnLz9tP7pS61P+k9h9W85+2K3fNnX8yNXWp/0nt71KTn7X8zH13n9Sk9ru63ymf++be390pNan9ru53yufnLD9vP7lT6lL/k9o/Q01+L/N7+jf/LH2fY8OUl7qilFBZ4e9+1Lc4DakrJrBsXKZi3I3FbmWZaDC7hnmhtLi/R84RbpsmE75cLBt+QsmSkFWUDugV3yBNydjdZb8wU6CjWSwTa3d54hOWoH+F5IxPlSVi44NiDRNazleWs0nvvEJySdwiieZBsRID7T2gvfLR8DOThvuM9FisE6KULyROkx0u2QeU4C8Xa6WrS9bwA0qC4RsO6+5NW7jxE5IrX5gYz0DbwnCTjJl4UN7QhIYYFGshjYYJ9YxR1EXJG06lVsKGY8MNWGwHl4ZLRbHSA7x4CE4r+5tt4idW6Swi0LLG3pBc9R2l4dIHIqQsiRcyr/rCxMvFcmN1t3RGBEyZdY2eHAUYcfjL+QKQbwL5BjHfFybaMHFcrCBfHlJFRIDxjWIqcQhWTmmRLxaLNIBkYxWpH5G94gV2CvoR0xd+j5Mln3NCFubbTlSM8zI1+skpLl8IpCxwi01uW+YmPmLizd9ykTMY5Glyr+Tx8sGk47kWCs+QPXk8DaPTvfME4QvT3JbwdsCOmHg8panKzOA7z/OLfkKKw3OxY27jH8jpqdtmQxMGwGbukbNy056XqpazYaMzJjXhO0ZbDtCWPeUHpAF7E8lHPDrS9QAS1GEE12OS2O9EIZZn03HoGBWIDbbfP0aVH7AN8B1pw+hkj17Ys6MzLzKzyk9IrpxMLPEdMoN0Z79jRCYFcAaklghgP/IvqlpG/oR8pvKFxDmboTy+EE6I0LBbBIqBKSKIjhOtBNEdJ7XZVrLx3wD/xb/4F8pfIGz/Bre5v4Lt3vNfcN/7qnPm7+Wz5db5tzj+zb/5N/0P0fDv3LZSn77vav/WefvP+3tn/3k/W35u8vOVnzP7Z38+2H8/P5d/5s9m/3l/Lu0/72f7s//fXD7fP9Ttv/z3/R961o/6+j7HhvU9sEjnERPHkfP6GCieNAg2MxLknXWwGg0oqzV61A0rU3GBlGApnjzvtcPXtHCcF1+MDHH+LrR5JjYmeGHHUb8wOTzGhJ4THD7ROo1ceNhCzsuUzB5cXUmnOoivsp6J/MIpz552UikOHcxJTZC5xlUbaE2D18aYklskgfVCOxLkwvE03+B85hSM0zXB2jd+xvlE+SzVmV3lA1cFRT1nQ2ZTOtdFg05MEB048cxO2RmPbM5JTaMG5E9IpvwKScRyeDC/Bx/IvOrB3jBbh1FKPDsC8Te2l64g56bliIl3J9l4IdAHdMIQfI0kOtgmfuIo2cf76Qi/RWrW4+hHzvV2TlD+FSa3PBfNeTMyUUa+Y7TlFGKHR7Bq51B0srFwcP43AOUvfmnlFvoK0dDF4s9/bS40O5tkH9GLg3KS7BtKohb2Qknl0i1qLXtVLrTD8SMm3p3GxgsB7TwEp51desOUHcVJmzJL3S8QyeTGnLKEZ0SO2PnEJyQR7oVptMtkW5Jfv+CWFj9i4uUUYKJU1+ilH5Bi2wyw7JdDZEmKJtaO0ugLpeES2Mw9MqNVb6idS40zJlpR0h2KlVwK7jC5W6e/ObEzAFMWiAkxdkAr18p2j6belFiSZVuSZVtZ9hsiRokTKvhyL76QXlNke/Qi8RETW7KNv6E0mvSBMhobbdlDBqU39OIXaLGszJA2JLK6qhO/MIRUhIbdIoh2KVtyO4pFDbuiKeudR1u+pRb9XSD/dZp/+2//rf71v/7Xyj9dzxdnv4vnPrlX7pd7/qXPLD3pzYzM+l0+13aPfPmaL1hyP/sv+wGx3d+z9GfONvN3wTzvfK48//w+/Jl+7/7Mny0/P/l5ys9Vfv/sP9fP5Z/5s/2Zfy7/zJ/tz/5/c/l8/1D/a3/f/9L/3PlxPX8s2tnE299gIghmJSVL8cAJI+BTYxUVtHSFaGL5Al2dDdviYEqDmT3oSLIPmPjWNbVeKA2XDkgsVmoGREgkcCITiTWY3cM4V+TsjYtllWqhpfIrFAtdy53AaAtdNAK+DYm2O6nGV4hGG7uuSprKzAQgRp1l+4WybEuybCvLfsOI+JI1Wd2gq2e3WDQZxe4uLbSHA0jETsrEwYNLo0k3SI+k7JYWunhmlqIGPpBM9SskEetFkw85ILNEznJEdktwCGZZWbNrMX219tIVdBYNR0x866uWdpsNuh27000ueqW/QjPF1FliiOUDEpYfcNKiNGIx8bgXX6grRKsezIjvMDXL/UKxbDNJsq0sG4wtnP8NwPVtY74r/HC+Jaz2FSa3O9WNj5i4Yr+BzDfecciczLeRVPAVZvdP5OZ0szc12D18Mp2HNsgcZpLlCPLE1Q9IgnTq2kS8EJgcAa1N3CDjVlEKmMWnSW+ie2RiGmmZuvAZE3mNqDicKmo7L0hBPgsqUgQiCtlfPDXx6oxK3COoogWjNjq+1RyRgp6xY/p+6DlnzcohjAhwgyQ4j6gaiMIeNno5vWVfIbncL4MJKc/d6IZg8MTjU5eYc2rdIkwdN8ickvfmYy5xnPapzQ7BGBaSLPh+lytOE2fN3ZI/cKZU3zEjyXPI6PDEy3P3ZJO7xzmDnXL2dXZ79pi5jd8w5zAYo5dc7/UNpgZvVWYS56yNn3EOoAw5dwtvyIYlweHtv0Jm52J0phjWon0IbGJ2CrqfcApOEn9awrfEavlNIP9GTF7S88L9u3juk3v9tY8oMzLrd/lc2z3yxVj+d5z+ms+X/szZZv4umOed5/7XfLb0ZkZm/S6fK/fIfXKv3O+v8czIrMz8nTw/T/m5+ms+W/oz53f6XLlL7pS7/Rk/W36W8jP113y29GZGZuV5/S6e++Reud9f45mRWb/L59ru8Wf+udw+4z8E83uV3zNJf81v+3/63r7GsdW6zbtdwvVuyUsjGobWOLcgTjp83j15w1xCOYkPRJtWmgnoYGcuepQ4YSyvrMUE0TNrR84p/xEyv3ULObG9JyRXHpxbZd/P4ybpaTazvuQziDLKmdIhDdmwd86sWhrI0dGiLzENy9NGQ60bM144d5lSElie58bbm215PyPxCSku35Hp1DCZURkID8GXTCWEvVnET+TTVScTPDhDsZWvzvwPjLY852TMV5jcnWd2cjsyt3x9hsxejrzuRg31G//EuT/FpKYZJU0XfJ0TmGyjbZtnD8t5BeaBmR0oJvdjp6u1uc42Cw2LjNqRJyRXvmP68olAmhKl6RrppIaPRknqw1+OGMPpTppa7MVpzDMgO9oHZ1Y07jY1i2dW9CLajqkKP2ByHIrNGQQ5E6Jfkt9+bcpCB/GvMLndrX65yIYJJrt7hzQ6cWRFFWtDoajL3fXiS1ggeyL7iF76QnK2GWJ0qZulYEDdpGv8Mim1KTXLc0400EWxrAkHE8dhoyfAaTlwq1xXaKn6QuLy4kRieedqZLHYMGX2oOXICDsS2BaGB7/w995yyWKxYY2DKMTGhVtZJjphDkWzjWzZXgjIGvqOWjooll9uWbFuDbtJEQmLie98rxELghGo5WJ9cARMXBRTUEcOsSvIDqbkDfXO1TWqVnYhM6q/oe2pKxLvSF9i36Ak0iKta7Qs4cbvMDlLVMwMK7jxDzQKLrx1JwxJfmGL4Cc0zIgGxTIe8+L8MRda5kbb1vNCNnnHLUjy8ecJPE/geQLPE/j+CTwVzxN4nsDzBH6TJ7C9xh0xcV78itzzFIfHrciSMRy0r5A0ObH8gYiY8ViRDVNKB50QfkDOseG4cHtiG5SQ3hFNQselT5RkabnP2JloYCpsYipsS8XuKpVVNBou/IOLFR1ofjb2EU0k/B7FMh6zOn/C7JI1a0cCTCm8RRLNg8ITgzZxpi20F4+Gb+wazYQUXaElZlkeJBZuh0d6x2jjYq2ytMj5ZWXX6JYl3PiGiW/cq+aEaHCxOpM4mIG2heGWat1kL1TQ7CbvA0qixsqyHGAfFJG6Nl7CZi9loX3mCr/0NrNhyQOtLWbD1yiisfJucMvsWntw466W3ZFh3yBpitRrEJ9QVrnOCNOuq2ztOTL8Bh0dv0UzJ/kDevEdLdsR8wVgvik8Ot8e5ptFLcy3h4lBIF8akiV35MR8qZg0+ZDkF6aaZE4gCYsetmHawo9IfyhOFfvLPjizm71EqqOfnOryhQCXyv55KO2TOO6beMTEn95PFTkHgC/OvPKFxC25QhK5bi73winst7jJ480XJ2IyLHXhLx/9xTMzVS/sLfmtikodiZwTR8TQlwbhDCaGAy9OX/lCYrrYr/hk5tTkw1/ec3NKpDtMbvOcssXBje+IiOWkjCs2iHjleyMBeYxg2hJ8wZvi2cx4PuEIPKYE4UFGpYZZ81nhbQA3nVxsqtFD8DNnHhrD251ZzTMjmeFEiI2DVJKm5aAzoxpIOkZ+ndmeJBYnpJM9nCTR8OzhQUSmhLWqAfoJyZQvTLw8d6VdzhbtEpPAc/Ecl5orNDXVv9go4Y/GdZEv6p7U9RN41OcJPE/geQLPE3iewPMEnifwt34CvM/1Cl9hch/+eked18nwKeo7KeIgr4rEOYOKwGLRS8+cEVgTRd5ZrzCzdz01m9O55V64zqIB+3hfr0Zf7HXHqOkLRl3IOVV3XF1J80mW3DOaiX7whJQllTGEKNgi6CULE787Kbqyt2eC157ysFskgfWCOxLk4vHMXpjnl1GtJdg5cYyuQDq+wDy7pBcyu9Et8qnIZWjP45DShZ2UmKD6B3Y67RQl1yha+BVS1JqFKSPMbGD76GekpqBOJuUAABAASURBVPkgvbUIOycYkZ04ueMw1FA+6cBXO+1N77iC00y08oWJCc+XZkp04Pb49CS/fOjsuetEb88QMUpm3iI1zV8hZ8216E6ewnDYun6jqMvnJimdzBWPxmBsZsHTsDiwZkcnEVuF8zPH5PI/dPG/ASj+sm18oV/YqJwIFGt9kaggFCQRi7Cjlw7KEjnLCyWVSzvK/BJrQ8JlXriBvZRLJBf95HSW3yDyOlwpCxVjgsO96BFN2uj+RCSTGbMuEbn6AXNWPA1B28IkBfFbbAXZK4z25l58R0/vHCYbvhyCmQa/UKzkAUT5hFK5NAjBlPXCiTwV7Cb9cnvFO5KmKqZsK53w0sVKDdB8tnI2TOE37upiGRcMHAuBS9mQvkBrrn5EU290S7JsS7JsK8u2TGBn18TSN+jJ02NJtmVJttVfR0wcT8ar5oTRJNIxUSrSOw958UZIR/TiF2ixrMyUNiSyuqonXm4TYLpDkUxuoX3mHZpcA3LF2bzrGwfTDwh08PHnCTxP4HkCzxN4nsDzBJ4n8DyBv68n0Jc4tlo3sSvbjglwXvnQrRNq8aKlD6yCOiiWYV4IwIQbB41LE0uyLUuyLUuyLUuyLUuy/eabtlCavFipHZDBbMHNRwoTqSN6cZAZze4oVnQgVQbJYQlUrFb6yUUS0yUm8e5iRQPSEzjiIdWwG0UgJnEh7A3JINoXKNGCLt2jZk2VFNw8bGJXF2cksrtD35GO5HyFaBI9B5eGSwu9o4zG5uUbO6NYqQBS5yNKXEVZJ6SmvJhN1C1UEF/ohVRglrLaTLAh4a15ZXZcwdZbRDtiYtyOTv9CG74ooEU/MUl8VesToxjdEkMsH5AQjpw9RI2n5IvYk9MVolVfmHj3HBH9iInV1bOJgoA+0VIsiR0t2+jWr3wjyPeBfGPYHeRbw3wXmW8NN+TbQowcNQTYiqmFYG98qzsjRZkIoBMRZAfClWHlBC/M8Ka40B1Sk8/BIIy6L3mH5AiccymniXjpOTkayJiIkztwuqoXKfoaaaeGdo5hcOzE6UYjGUtxMZ8nZQjw1IzvnIGt+cBWoC5kNp3MCMcZigSPujhCZ+1ILnU/8TyJ1F1gLsGkAJ7hnDfR2uH0svc+t0hN7kdRjDKmMi6EFBwrDxJgyXEIBsHIYPShNHfExJsfBqa6cjZmbJyQWTU21Aj0YTecApKvz3DgzK6+Y0Ywcz1PgAwaAV1c/ZV7cbTMpzKz/jJndnoZNn3hB+9M+Ak5r3xh4s0zKzHYLrBV4PB8EBTO48PEIl8gBbH04blbij6Qs6q/4TaUETkQj8GwRPGGzE48M4jCl/cspMeeJ/A8gecJPE/geQLPE3iewPMEbp/A75f4g7/o9n2Oq+WFDw+F5ZWP18T3d9HwKcr7X/6bJ0EKqUen8YPz7pkMnSkre/Gq7a3G4R8Y7cfOEa1duO7zmsl5EHbOpKa3OWB6o11gq6IvH85e3oM6MxtSEoQ97B45iyR76nqr6UPZdeJkSETKQQmLPYd8rGIERqUwYbA5CEYJkxLg/X36DnMKNQCjMjgjjsi8JDmkKrXBzA7S1MxwlOS/9JlPCa3MbsuG5DLtqG38hNSXgwxiDxvf+I6Hmak4zIae7nDHKcLaSMl3yMPq2QspJ6I/O3ch12hhnhtDk0Dmk0T/oZ96Oac8U4iBdWZmlr14KIe2jLOo6Pm3SE2aO5+m4EghbU16OVMiU4ChhR8855JAmdwVj7Z5ZiU+4TqTz3G8C2NnJsHonPJFTLF+iT8fzdYvBHeUhi/0ET05CjDiN65w/AJFgyW5v8RKJNi4WMZjO9JT/hWSs+nA7XekGw2T2MiCmgXBpG7S4IlII0onTM3yQHIX6E231HBh4jjXkQiKbJi08RNOo72QnFi+RTVjsdgwpTWYIGhbTjpIYFsYHjz4VvMVJhe3hO0ulmFeCJSdeA6NuuOqSlF1ODlMYsNALHkcg9S6WS52a8imrKDJGnJ0KGp2BZP6QCmSspon2JEAUy72hpEkxAaWbWXZb6jFd0yVFntDelt9QpTyhYmXZ4htYfgFSui4dIP0SMpuaaHv0asGbAQ61RbLyj1kKehfg1p8MCT6woq/2MN9gWJFByZLYDxmlODBfYgT5iIbJj75r2Qef57A8wSeJ/A8gW+fwFPwPIHnCTxP4Dd6Annfu/JcMXreEEEvVNESaA8mjhtNLNvsgm2orjI27MBNHZQeA3pD20gWG/ZC28OloqUDEktwXFJz0kJ/jZlLhZ06/ICZAJUdXaxBKFrpJ8oa+wIpMJ7CTxRrVFGTs5TlbNI7r5BcErdIonlQrMRAew9or3w0/Myk4T4jPRbrhCjlC4nTZIdL9gEl+MvFWunqkjX8gJJg+IbDunvTFm78hOTKFybGM9C2MNwkYyYelDc0oSEGxVpIo2FCPWMUdVHyhlOplbDh2HADFtvBpeFSUaz0AC8egtPK/mab+IlVOosItKyxNyRXfUdpuPSBCClL4oXMq74w8XKx3FjdLZ0RAVNmXaMnRwFGHP6FS1MjFg39Gy7fE/IdI98qsvOFITtxv3E8Iy350nD3FOabxhMOYc+ANZmhidKIypiyA3IOLDb5T55cvOdNkJ2R6cA5o13Bk1NWvhDgctlb3oD2E5Zs23sy/OipC1/YkK3WLYmeBSv2fEiulWRx5zwb4hRWp3g+c/QkQLT23WK6x1PSLjasYjCzBzMPGWHniXEebtqBqSEo/0Auk94kixsvjrImUPLGc07UHWmCx7hVjgLowUqK1GxIOLUE0YDhEIzmKHjJwsSbI00DQTTgyC+kVLxKKMBed4Ng4f1IKWzAEyhyo3dMDUOpYCff/Q5fVTmm56SemS9OTTlKLPEd0ku6N3jHiEwK4AxILRHAfuRfVLWM/An5bOULiXM2Q/k4IZwQoWG3CBQDU0QQHSdaCaIj94ETYpZfpfBazklwh8k9/rMn8FQ9T+B5As8TeJ7A8wSeJ/A8gd/lCeS1MJ77BOONeR/s+2QIXp2t74J5ZyVOfjkKRXmFjH7Eyq1KNNnkYRCsZJApPRYkzQsvRoYz+/e8hYnjUzK14VRS33EvpCg60Dskjg+faCakLzxsIedV3XF1Jc20Jfcs6CdOefaMoYRGbJHh7OWXmNY2EGxIuNkm3SIJrBfbkSAXj2fODeZ5Jr05XVtY3PgZ8+ySXsjsRh+YT0xnjFw++nZeafXMoS4xYXTg/FFoJN39hTlxY/Q32872Vkk6ehHlFknEcniQnrESwuA6jxoYB82ewyaanVPIfWN76QqY2Y4jJt6dbOOFQM4NvLDs5vh1Dp9kql58ouzj+ZQp+xanfI4nzvXaR5xLlCPcYnLLc6ecl9Z7zNTlFGJzNs35mRqenZocShidI6greSE9kKRSrF/5s8j8xdgkHLSyiy8H5fxyOA6KVZ04SFp2iN7Qi4NykuwbSqIH9kJJ5dItai17VS60w/EjJt6dxsYLAe08BKedXXrDlB3FSZsyS90vEMnkxpyyhGdEjtj5xCckEe6FabTLZFuSX7/glhY/YuLlFGCiVNfopR+QYtsMsOyXQ2SxogHaUYqerSglVJZXdIvMEDW2pQNq51LjptkwfeViJZ+iO0zu1ulvTuwMwJQFYkKMHdCaq36Fpt7UWZJlW5JlW1n2GyJGiRMq+HIvvpBeU2R79CLxERNbso2/oTSa9IEyGhtt2UMGpTf04hdosazMkDYksrqqE78whFSEht0iiHYpW3LF/vMLKbGyqA0ceEurrW0v8VRtBf71xld+tT3wPIHnCTxP4HkCzxN4nsDzBJ4n8Hf0BPKOZ+3vd+svvYqcbZA8NexICXyDrVAWFQEFTRQH4No9QfScMehIsg+Y+NaZ1dxC6dwrwXGxLGG7i+UysVtZJhK+I7PLdxSLrIHUBfGV1gdOmURN3LNJC4dbKl+YeHexogPVjkh8l0LHpFwoAYiV2wi4DcqyLcmyrSz7DSPiS9ZkdYOunt1i0WQUu7u00B4OIBE7KRMHDy6NJt0gPZKyW1ro4plZihr4QDLVr5BErBdNPuSAzBI5yxHZByGY4WIZl7SYvlp76QqY3fIjJr51qpuT7G2Guna6yUXLk/0CU2Hylhhi+YCE5QectCiNWEw87sUX6grRqgcz4jtMzXK/UCzbTJJsK8sGYyf05NGIBMFc/DVfGPLdY74o5HvBS57c7quWQowvE8PHIdjE8w0kcWcOkoSp3zwy7oWR8FhmFrPhnfOBzGvhQuLWHTBnxZF6Tg8u6TC0IJ7EXGa0A5/yJMc5jZrscJKJekZ7wqKnZGH1cM6JhFcqUn+FFOSzkGV0C4onnpp478D8xD2CKloweqLjW80RKegZO6bvh55z1qwcwogAN0iC84iqgSjsYaOX01v2FZLL/TKYkPLcjW4IBk88PnWJOafWLcLUcYPMKXlvPuYSx2mf2uwQjGEhyYLvd7niNHHW3C35A2dK9R0zkjyHjA5PvDx3Tza5e5wz2ClnX2e3Z4+Z2/gNcw6DMXrJ9V7fYGrwVmUmcc7a+BnnAMqQc7fwhmxYEhze/itkdi5GZ4phLdqHwCZmp4CdP9ioIsDIYgSTSpDzFjZVThQ8OjW9E/jY8wSeJ/A8gecJPE/geQLPE3iewOUT+H1FXu/yShjou2QC3vUw3gvzZokQG4ESCA3z/kf+pNNCLh+WTAA2UbogMWakjjS90TNrx2g/dua0dmFHrvOil5PbceW4xX5eYmpTNfeg5pbPoEmnLpzODrtAZtfSQA0dLfoS07A8bTTUujHjhTkbAdsfaBoWTzg6AiSfLfyEnFO+I9OpZTKl9BHMHh2CDe8nqFhOzwvJlaMED85QbOWrZ0T4ERMv772Iv8Lk7jxnJLfja1ajuSJ3mg+WZ0EpPAkqSt4x900eZDbF7HecuZMlSD1wsJxXmnMI3nlm/2XeIVwYWzM5HjE8wB24Kqxji5EpqlxMRB1xihLdIxNyDi29ezHaePuqMeUKOSN9ZCnt/obMSQ13bDYzwk9ITXkwVW+YHHfEZjZBzoRg1B85sxGxNukXXwoqf2X+EilovmhNvFBBHBSJRguHS9WUlSgoNHW5u158CQtkT2Qf0UtfSM42Q4wudbMUDKibdI1fJqU2pWZ5zokGuiiWNeFg4jhs9AQ4LQdulesKLVVfSFxenEgs71yNLBYbpswetBwZYUcC28Lw4Bf+3lsuWSw2rHEQhdi4cCvLRCfMoWi2kS3bCwFZQ99RSwfF8sstK9atYTcpImEx8Z3vNWJBMAK1XKwPjoCJi2IK6sghdgXZwZS8od65ukbVyi5kRvU3tD11ReId6UvsG5REWqR1jZYl3PgdJmeJiplhBTf+gUbBhbfuhCHJL2wR/ISGGdGgWMZj5g8wsV4ccrb3VC8g2SsR9K8I165nPU/geQLPE3iewNdP4Mk+T+B5As8T+L2eQF7vlFe93QkwkcC4LKSBkSw2DJRlGx4DJZlfYr0QghmPFdkwpXQ0CuSJAAAQAElEQVTQCeEHZK4Nx4XbE9ughPSOaBI6Ln2iJEvLfcbORANTYRNTYVsqdleprKLRcOEfXKzoQPOzsY9oIuH3KJbxmNX5E2aXrFk7EmBK4S2SaB4Unhi0iTNtob14NHxj12gmpOgKLTHL8iCxcDs80jtGGxdrlaVFzi8ru0a3LOHGN0x84141J0SDi9WZxMEMtC0Mt1TrJnuhgmY3eR9QEjVWluUA+6CI1LXxEjZ7KQvtM1f4pbeZDUseaG0xG75GEY2Vd4NbZtfagxt3teyODPsGSVOkXoP4hLLKdUaYdl1la8+R4Tfo6PgtmjnJH9CL72jZjih22ZbFusD1bwDmG0UKML4szHeEfEMIwcrny0JY6kIOmGqK+J4xIiz5sA3TFn5ESkNxqthf9sGZ3ewlUh395FSXLwS4VPbPQ2mfxHHfxCMm/vR+qsg5AHxx5pUvJG7JFZLIdXO5F05hv8VNHm++OBGTYakLf/noL56ZqXphb8nvb1TqSOScOCKGvjQIZzAxHHhx+soXEtPFfsUnM6cmH/7ynptTIt1hcpvnlC0ObnxHRCwnZVyxQcQr3xsJyGME05bgC94Uz2bG8wlH4DElCA8yKjXMms8KbwO46eRiU40egp8589AY3u7Map4ZyQwnQmwcpJI0LQedGdVA0jHy68z2JLE4IZ3s4SSJhmcPDyIyJaxVDdBPSKZ8YeLluSvtk4gW8oER8Fw8x6XmS2xybf2jb8XANuMr5CgnH6flsR88gafkeQLPE3iewPMEnifwPIHnCfwuT4B3ubwuuv/fgLlU3ukak8BQePfMnnfWCMGNB1eakAx7eOry/x+4lPHzjhkVEmti+Ori3CPPe+/Ok9uczi33wpyZxCClcwYDsMZBKognWqcuHhYdTHPUHVdX0tXhxE0nJEZeBw+Ukwsy8SWmNmJyxQjvnmS0IyZe/p764AjY/peWXPToOTcczPPr1HKuubAaW8YAVGYnP/DG+wnJLGRGo1tkDrkM6fkcUrqQQeerIzS/Y6fTTkO0RtHCr5Ci1ixMGWFmAj3rA6lpPkhvLcLOCUZkJ07uOAQ1lE868NVOe9M7ruA0E618YWLC68szLTlgv0bi+KYnxofOnrtO9PYMEaNk1i1S0/wV5pzoFOTaPQeeWTtPbvdWwL7C5BiMZQbj7h/FKnj9rFGNNjy3mCGoDP3k698AtPhykMpBJ8q2MLk4lDoSsQg7eumgLJGzvFBSubSjzC+xNiRc5oUb2Eu5RHLRT05n+Q0ir8OVslAxJjjcix7RpI3uT0QymTHrEpGrHzBnxdMQtC1MUhC/xVaQvcJob+7Fd/T0zmGy4cshmGnwC8VKHkCUT6jhkkZ/4xL5Zt4w2rg9qB3FQsMkNixw62KlBmhNtnI2TOE37upiGRcMHAuBS9mQvkBrrn5EU290S7JsS7JsK8u2TGBn18TSN+jJ02NJtmVJttVfR0wcT8ar5oTRJNIxUSrSOw958UZIR/TiF2ixrMyUNiSyuqonXm4TYLpDkUzuFjOWmkBqirNt6jBNtrMkgc37lwb9QnLCbetZzxN4nsDzBJ4n8DyB5wk8T+B5An9nT4BXuL7G7ei82ilbdS1eJC6KRWwAczRwvSmWGW4ioLsJ6my/tjjIIUiyLd/x5HaXbOMLJWK4WNEHZDBbcPORwkTqiF4cZEazO4oVHUiVQXJYAhWrlX5ykcR0iUm8u1jRgPQEjnhINexGEYhJXAh7QzKI9gVKtKBL96hZUyUFNw+b2NXFGYns7tB3pCM5XyGaRM/BpeHSQu8oo7F5+cbOKFYqgNT5iBJXUdYJqSkvZhN1CxXEF3ohFZjV1WaiDSXBrm21ZEwLtp4TUlS+MDFuh9O10IYvCmjRT0wSX9X6xChGt8QQywckhCNnD1HjKfki9uR0hWjVFybePUdEP2JidfVsoiCgT7QUS2JHyza6P1EscgZIav4NwH5jmC8I+YbwFG/aO251Z8zXlChA9zTNN52ZmQM3RO03kkG0SS3liqPt32gScwBGPfGnzjR0Rs/5lFFMvPQkooEpa+KN5/bRixR9jVRSwziOYVDsxOlGIxlLcTH3ThkCPDXjO2dgaz6wFagLmU0nM8JxhiLBoy6O0Fk7kkvdT7yPjfoLzCWSYSwhey0K56LQ0nuUcdYtksv9KI5RxgxmhZCCY+VBAiy5HEElYk8Cw0i+N6Vw80Mu1ZWzpW1H5pUHqSLOedN6xSkg+foMB87M6jvmmszoaOqCR8+c8BNSX74w8Y99ncdRuQdt+Sgv772oOSHnlC9MvDkDqoLtAs+8l+/8bKRTlnBhLkKYRMIiE+6Qc9NMRZpgaeIMotFXrPyRtuXQtjBzoS0PbgH6NjNz4nk+KSkmj4c//jyB5wk8T+B5As8TeJ7A8wSeJ/DxBH5fgXc4jPvxtsc7Yd/z1jtg3/OIX0hZ+RF57YyGxISQsowaUnXXMiu5E3KB8h8hU1u3MOeG78h5HMCej/I6t9HWQ7Y9ZyRLz9LID2cnxhKQ70EH7GHwG+RckuzJM5vog6MlwwFJ5YCExZ5LPlYxAqNSmDDYHASjhEkJ8DzT5L/EnEItQGkGZ8QRmZckh1SlNpiZQZqaGY6S/Jc+8ymhldlt2ZBcph21jZ+Q+nKQQexh4xvf8TAzFYfZ0NMd7jhFWBsp+Q55WD17IeVE9GfnLuQaLcxzY2gSyHyS6D/0Uy/nlGcKMbDOzMyyFw/l0JZxFhU9/xapSXPn0xQcKaStSS9nSmQKMLTwg+dcEiiTu+LRNs+sxCdcZ/I5jndh7MwkGJ1Tvogpxl41EE7q0B3n3wDk7858Kahxf41KHr9AMcDMt/KLYKEJ4wBKdr2QHrHsqbAvEM1Gx+13bLMiZyMrdZOCDbtJ4WuThkiXmIblgdRcoDfdUsOFieO9E0GRDZM2fsJptBeSE8u3qGYsFhumtAYTBG3LSQcJbAvDgwffar7C5OKWsN3FMswLgbITz6FRd1xVKaoOJ4dJbBiIJY9jkFo3y8VuDdmUFTRZQ44ORc2uYFIfKEVSVvMEOxJgysXeMJKE2MCyrSz7DbX4jqnSYm9Ib6tPiFK+MPHyDLEtDL9ACR2XbpAeSdktLfQ9etWAjUCn2mJZuYcs3WOSyS9U0OyOeIFiGR1gdwAsgMOHdUfYzh6OkKAiQXBz+rXFC1udmNLmgo8/T+B5As8TeJ7AzRN45OcJPE/geQK/4xP4Jc1LHZhg89AtHvQUsltZJhrMLpizgXot3hVRpa+QXPMHtI1kZdmWCWwv1Bml4RK4ahpd8M6g5gJbbfbkQCIR7i608BOWtDIbLEUJD1gVfolimQzA3vkTZtc7r2BSSdwiieZBSttzgfbKJ4efmTTcZ6THYp0QpXwhcZrscMk+oAR/uVgrXV2yhh9QEgzfcFh3b9rCjZ+QXPnCxHgG2haGm2TMxIPyhiY0xKBYC2k0TKhnjKIuSt5wKrUSNhwbbsBiO7g0XCqKlR7gxUNwWtnfbBM/sUpnEYGWNfaG5KrvKA2XPhAhZUm8kHnVFyZeLpYbq7ulMyJgyqxr9OQowIjDv3BpasSiwQXLoBZvmA2ffwOQgC8S2dc3j/k2Es/XhPmm8YRD2Cmgie8X2/TCjCkj2JASWIyuAP2FHYdRx8zGC3t+qsrpDp6c6vKFQMoDt9jktjGz4RETb55k4oUN2WrdkuDitdmQc3aulWQRrUjiE0lWX0jcvlt8HZOSdrFhTQRzxuD8HuQ57pxk+PaNcOLkNv6BXGbyHQ87YjNc4wY5K9U5YzDt1GI7T034jtSUg7HEH4iIZUZSZ0xi82QT3+AXqXTkWfDhGE8hduS5LgmsCVLB0DfsAPQdO3mx6Ec+v19RO4VDPpGa6mRiie+Q0aR71jtGZFIAZ0BqiQD2I/+iqmXkT8jtyxcS52yG8oyYDm8A0kkRWpMbkigPLg2wz3wa+0cb2WVbyaI9J3EvQHBE/kBsvhqNGBWMTfA2t4lnu3wCj/g8gecJPE/geQLPE3iewPMEfqsnwLscxktdbf6X+yrw6gfyTjlvenkThXP3RAC2cUKsjOIivAbBOvuMawrvlv27zxtGi2dGML2U5K2Xe3XcCylKHpg8wYtPtE4jHx62MEOj7khz+QEpXemeSfqFU5a9l8rk5BchpJm9/BLTmpojJl7+nvrgCFgvtCNBLhzPmBvMc016c7q2sLjxM/YTkl/I7EYfmE9MZ4xcPvp2Xml1xmDlC4HzR6GR0u4vzIkbm3PCGjUgf0Iy5VdIIrYuQSdFsYgbRg0P9obZSL5xbjmJL3bGNJvzElxhtN0parwQ6AM6YQi+zSZ82SZ+4ijZx/tpCL9FavJRc60PRKj+FSa3PPfMeTMyEY+1uSMmXk4hdngEq2cORScbC9+RmnKwB36D1NDKLs2/AUiYvwsD+ZJwd1mys72jlw7KSbJvKIke2AsllUu3qLXsVbnQDsePmHh3GhsvBLTzEJx2dukNU3YUJ23KLHW/QCSTG3PKEp4ROWLnE5+QRLgXptEuk21Jfv2CW1r8iImXU4CJUl2jl35Aim0zwLJfDpHFigZoR2n0hdJwCbTEMhHA7sALmaGwN9TOpcZpi1aUdIdiJZeCO0zu1ulvTuwMwJQFYkKMHdDKtbLdo6k3JZZk2ZZk2VaW/YaIUeKECr7ciy+k1xTZHr1IfMTElmzjbyiNJn2gjMZGW/aQQekNvfgFWiwrM6QNiayu6sQvDCEVoWG3CKJdypbcjmJRw65oyjrzlkeON9WNapAkJrHBAP6JsFjwRqBNJv9bgEVRE75Qz3qewPMEnifwPIHnCTxP4HkCzxP4u3oCvNPZeZ8z73W5edAEhvsCJfNLrCO6nA3b4mBKgz0iOYLhTko2+KVr1SyUhksHJBbLEra7WC4Tu5VlIuE7cnb5jmKRNZC6IL7S+sApk6iJezZp4XBL5QsT7y5WdKDaEYnvUuiYlAslALFyGwG3QVm2JVm2lWW/YUR8yZqsbtDVs1ssmoxid5cW2sMBJGInZeLgwaXRpBukR1J2SwtdPDNLUQMfSKb6FZKI9aLJhxyQWSJnOSL7IAQzXCzjsQ0Tv/wUbSXMrH6F0W6druYkew3b4BItK8tfoCkweUvMtHxAwvIDTlqURiwmHvfiC3WFaNWDGfEdpma5XyiWbSZJtpVlg7ETevJoRIJgHhSr+hElst3m3wDk68D1BWK/YZyYbxGrB8dJYhP3224KYaPxrSZBdr7KjKoXJsRjtASmjqhzPpD+Fi4kbt0Bc1Ycqed0YEmHoQXxJPgcFd5wyiOOcxpl2eEkE/WMzgiLnpKF1cM5JxJeqUj9FVKQz0KW0S0onnhq4r0D8xP3CKpoweiJjm81R6SgZ+yYvh96zlmzcggjAtwgCc4jqgaisIeNXk5v2VdILvfLYELKcze6IRg88fjUJeacWrcIU8cNMqfkvfmYSxynfWqzQzCGhSQLvt/litPEWXO35A+cKdV3zEjyHDI6PPHy/t0DDwAAEABJREFU3D3Z5O5xzmCnnH2d3Z49Zm7jN8w5DMboJdd7fYOpwVuVmcQ5a+NnnAMoQ87dwhuyYUlwePt35J/DbjqzczE6Uwxr0T4ENjE7Bd1POAUH6SU0Wuf0jMaoRVqKnIxk4v2OOQUtPQkff57A8wSeJ/A8gecJPE/geQLPEzg9gd+b8F7Hmx6W9zxe6vibb97zeANdr3dL75snef5qjMJnosLhtDYXREb6IzV/bHyqMxOJmXDOLP8RMqd1nBfMER9ITfUg8xNvd2otGtgsCOs9rnmaqZjLUhdOZfkFck6NucVu9H+FyS1PG1Nr3XJOcsWcTYD1Im/Y3mzL80xTd0Jmle/IKanv6AyEE8eWTGXZIGKrTsjnKycTPPh2fs4cZ37zR0y8nFNIZ0/rNY56vdPMbejtDjI3lVytEUhJdWSQumrZqGjyHVOTPDhN7Hf88KymKsLueQYlOYfgnXOhHP4XeIdQj62ZHIsYHuDOXBXW0cXIFFUuJqKOOEWJ7pEJOYeW3r0Ybbx91ZhyhZyRPrKUdn9D5qSGOzabGeEnpKY8mKo3TI47YjObIGdCMOqPnNmIWJvCMuwNkbhPxPk3APlDkS8JNe4zKhwHRUGjhcOlaspKFBSautxdL76EBbInso/opS8kZ5shRpe6WQoG1E26xi+TUptSszznRANdFMuacDBxHDZ6ApyWA7fKdYWWqi8kLi9OJJZ3rkYWiw1TZg9ajoywI4FtYXjwC3/vLZcsFhvWOIhCbFy4lWWiE+ZQNNvIlu2FgKyh76ilg2L55ZYV69awmxSRsJj4zvcasSAYgVou1gdHwMRFMQV15BC7guxgSt5Q71xdo2plFzKj+hvanroi8Y70JfYNSiIt0rpGyxJu/A6Ts0TFzLCCG/9Ao+DCW3fCkOQXtgi+cPsDyOXdpcTKOnIjxIGjbdKOezBVudCXTlnzkj299hn1rOcJPE/geQLPE7h4Ao/0PIHnCTxP4Hd9AnmXi/9a73d+QwlF6m5lmXhwdgObJ9WYDZPy3xwRy05KCh58+JxtT409mHdfSynRlyhNXgKNH7Cz0MCqIEy2JVkB9uLGZSL8EsUih6n52dhRamxldyhWckDqXmEEIalr1wkwzUV1jRQ0DwpPDNrEYi20F0eKbewazQSq6DGgE6KULyRuvijC6EdMPC7WKqNOcn75DaWo+IYmvnGvmhOiwcXqWcRBhsg2LtxssYXoapjNhCbpA0qixsqyHGAfFJG6Nl7CZi9loX3mCr/0NrNhyQOtLWbD1yiisfJucMvsWntw466W3ZFh3yBpitRrEJ9QVrnOCNOuq2ztOTL8Bh0dv0UzJ/kDevEdLdsRxS7bslh3mBQeax3Bhqd/AxB9fXPIN4R8q5hvCPl+MYRw+0bxHdtF/oi0hOJUs7/sg+ecpC+R6ugnp7h8IbAO/zyU9qTPvolHTPzp89nTTa7WLULPgg0mwHOt3OWECOUnpLh8IXEG9Tymf2Ky46RX9fDM7hQ2rL9/G7aWgnxbHCeJkV0apLM+cWYnSXXGJLzBqTjfOdp4z0136B0mt3lO2eLgxndExHrDDTP31vdGAhowgrZ/hy3lWc1oPuEIPK4E4UFGpYZh81nhbQA3nVxsqtFD8DNnHhrD251ZzTMjmeFEiI2DVJKm5aAzoxpIOkZ+ndmeJBYnpJM9nCTR8OzhQUSmhLWqAfoJyZQvTLw8d6V9EtFCPjACnovnuN3RGr9jxYuNP9bWDP556uQX70PIH5PlzAvGNy1S7rZxupsGH/viCTyp5wk8T+B5As8TeJ7A8wSeJ/DbPQFe7HonsC90h3dX3vfM+x5KK3hJLW6cjsUD640SEYtAN8DM8jfMe++uJ7d5W+aErYbUmjU3+ODpwWPTmbpOpy8YdWGao+64upKuDiduOiExcgbWQ8vJBTM5eJlsIh1HX42B5hu8tpSG3SIJrO/rOxLkwvHMXJjnl1GtJdg5cYyuQDq+wH5C8guZ3egWeRLkMrTncUjpQgb1OtAb7HTaU8GsRtHCr7ATqVqYMsKcCfSMD6Sm+WA6gxGC5QQLc+LHkOQydMeS6y2jktlxBTmvejhevjAx4ce50duTDU8NsNsbHzr7PMlU5hNFW0iYKB/lFqlp/goZOdeiO3kKw2Hr+o2iLp+bpHQyVzwag7GZBU/D4sCaHZ1EbBXOzxyTy8FVTEmKuQMCuROPhMeqJ1iefwghvjisR7MtxU5o2Ua38kvEL5SGSzuqWWlH7ct7NIG9lEskF/3k9JXfIDLHZlfKJui+uOVSH9AohvsTkUxmzLpE5OoHzNnxNARtC5MUxG+xFWSvMNqbe/EdPb1zmGz4cghmGvxCsZIHEOUTarg0SBJT1oaeDLsjL0w8bg9qx5ShYRIbFrh1sVIDtCZbORum8Bt3dbGMCwaOhcClbEhfoDVXP6KpN7olWbYlWbaVZVsmsLNrYukb9OTpsSTbsiTb6q8jJo4n41VzwmgS6ZgoFemdh7x4I6QjevELtFhWZkobElld1RMvtwkw3aFIJneLGUtNIDXF2TZ1mCbbWZKu/smsWLZ+kRNoGxgnwH4py7YgGKhnPU/geQLPE3iewPMEnifwPIHnCfw9PQHzrpfXOcky8aAlWbaVZeWX1j6YN8FRw5cbjGsWoWzLUNvF/IXaB25b9tG1+EJpuFipG5DBbMHNRwoTqSN6cZAZze4oVnQgVQbJYQlUrFb6yUUS0yUm8e5iRQPSEzjiIdWwG0UgJnEh7A3JINoXKNGCLt2jZk2VFNw8bGJXF2cksrtD35GO5HyFaBI9B5eGSwu9o4zG5uUbO6NYqQBS5yNKXEVZJ6SmvJhN1C1UEF/ohVRgVlebiTYkvLO0N7datfWckGT5wsS4HU73Qhu+KHA9isRUSYO+QEuoxsXMM66MBxX8kVuMErs+sSr6Qh1xzrG01OC4WDNLCor1iXTGktjR1Fts2BuKRS2qSGqQUCwIRvCyX/lGkS8M+caRbxP5enB44k+niG8Yl040PF88omUmgxhBtDg1mYdA6cpQ88HRWvcjpJs6Rudg5p45Yi1byoKtZdv43C47d0JMlEHXyARqaKck9e+cLmSSsSSL+TxpQ4CnZnznDGzNB7YCdSGz6WRGOM5QJHjUxRE6a0dyqfuJ9/FRf4G5RDKMJWSvReFcFFp6jzLOukVyuR/FMcqYwawQUnCsPEiAJZcjqETsSWAYyfemFG5+yKW6cra07ci88iBVxDlvWq84BSRfn+HAmVl9x1yTGR1NXfDomRN+QurLFyb+sa/zOCr3oC0f5eW9FzUn5JzyhYk3Z0BVsF3gmffynZ+NdMoSLsxFCJNIWGTCHXJumqlIE6xNOWRxQtTsCAPZ/9j+iSz1/WOuEyiBn86K9AcV5E96OIPQ8tx6BDEK10n99P3H//i/Rnr8eQLPE3iewPMEnifwPIHnCTxPYJ7Ab73/z//xf+F+6z2PFzwiOHZ4z4NNhr8ZN/8H731VBnkZhBHTQwraqggHHS35nzgH5n2T0n1W+aYztbkjJhceJMlpq5fowLnU6NHw4ezEWALyHXJAPlUsBVfIuSnmpOm/4mjNB5lBYS1bxgZJ5WBCCrDOXNgchVjzeR6TpwDxS56p1AC0UE/Q+h3nZgzuMRQVU9NqelMxHCX8S2dS81eIxnTSHMPUjNv4CcmVgxSzh41vfMfDzFRkZnIg9HUO2h2nCKOBmpwFofSO98GRX0gZUVoC4FnIc2sxs3vT4A/91MvYck5JO8BZ3T8xMofSwpH5REQ0JUrxB5KrXkwLFW3JFn70V67lbLnX7jk32leY3OY9Ys2MVr7O43PM3PBVk9k/9O0zzYwMZgYzq5+Q+eVB6ohXpfgHFhZfGOILFcQvUBSaZiu/CBaaMA6gZNcL6RHLngr7AtFsdNx+xzYrcjayUjcp2LCbFL42aYh0iWlYHkjNBXrTLTVcmDjeOxEU2TBp4yecRnshObF8i2rGYrFhSmswQdC2nHSQwLYwPHjwreYrTC5uCdtdLMO8ECg78RwadcdVlaLqcHKYxIaBWPI4Bql1s1zs1pBNWUGTNeToUNTsCib1gVIkZTVPsCMBplzsDSNJiA0s28qy31CL75gqLfaG9Lb6hCjlCxMvzxDbwvALlNBx6QbpkZTd0kLfo1cN2Ah0qi2WlXvI0j0mmfxCBc3uiBcoltEBdgfAAjh8WPae2yAbvgR7VQYvnX+mG50WBVMeLM+myjroSf+Hf/8/6VnPE3iewPMEnifw/gQe/jyB5wk8T+D3fAL/4b/9H7lYX+h4rXMd4RJNwmTGrBdavDlKvAyiXiO55vNvGBLbho7TMLF0QGIJjkuydHCv+AYzmwo7efyAmQKVHV2sQSha6SfKGvsCKTCewk8Ua1RRk7OU5WzSO6+QXBK3SKJ5UKzEQHsPaK98NPzMpOE+Iz0W64Qo5QuJ02SHS/YBJfjLxVrp6pI1/ICSYPiGw7p70xZu/ITkyhcmxjPQtjDcJGMmHpQ3NKEhBsVaSKNhQj1jFHVR8oZTqZWw4dhwAxbbwaXhUlGs9AAvHoLTyv5mm/iJVTqLCLSssTckV31Habj0gQgpS+KFzKu+MPFysdxY3S2dEQFTZl2jJ0cBRhz+hUtTIxYNLlgGtXjDbHj1E45iGVXqvwHIF5N8acg3g7Vs+X7wDtOX/BHzzWL4PU6WPN9uNl6Yby9RMc6bi0ycfJ3qI0JTFrjFJrctcxMfMfHmb7nIGQz2U4KpWBJ3g0XDcy0Yz45953QRp3Dy4REOmGFtid5K2BETj6c0VZkVfOd5ftFPSHF4LnbMbfwDOT1122xowgDYzD1yVm7a81LVcjZsdMakJnzHaMsB2rKn/IA0YG8i+YhHR7oeQII6jOB6TBL7nSjE8mw6Dh2jArHB9vvHqPIDtgG+I20YnezRC3t2dOZFZlb5CcmVk4klvkNmkO7sd4zIpADOgNQSAexH/kVVy8ifkM9UvpA4ZzOUxxfCCREadotAMTBFBNFxopUgOnIfOOFmW8nOl5Dzoi3KRcIYjZBcPGfnD77GpBc62k5NDwT7A/3/91/+90SPXT6BR3yewPMEnifwPIHnCTxP4HkCv9kT+C//P/+BG/2xPK91f/BGF0TiNY+99kf3pROfOARr8oy8E1Ob98z+3Yd3ySMmjk/J1IZnBqV9E92RoujA6AQvPtFMyDXCwxZmCF2Z3WzkcoZsiLbKct2UvXDKso9OT2wRQprZyy8xrak5YuLl76kPjoD1QjsS5MLxjLnB+cwpGKdrgrVv/Ix5dilYyOxGH5hPTGeMXD76dl5p9cyhLjFhdOD8UWgk3f2FOXFj9DfbzvZWSTp6EeUWScRyeJCesRLC4DqPGhgHzZ7DJpqdU8h9Y3vpCpjZjiMm3p1s44VAzg28sOzm+HUOn2SqXnyi7OP5lCn7Fqd8jifO9dpHnEuUI9xicstzp5yX1nvM1OUUYnM2zfmZGp6dmhxKGJ0jqCt5IT2QpNSYRmgAABAASURBVFJ8jdTQxU5J9yOeM/03APOnos2fiLGiZVtsMr9E/EJpuLSjJGvWHU5WslfFQjscP2Li3SWacKkoVnNBPEZ7QG+YMh3ESRvFUvcLRDK5Macs4RmRI3Y+8QlJhHthGu0y2Zbk1y+4pcWPmHg5BZgo1TV66Qek2DYDLPvlEFmsaIB2lEZfKA2XwGYuUSw7ect22I4EiwfIYdWK0W4cWanJdofJ3fo+gAoGYFEgMWWrxIbBrbn6V+hVB8qyLcmyrSz7DRGjxAkVfLkXX0ivKbI9epH4iIkt2cbfUBpN+kAZjY227CGD0ht68Qu0WFZmSBsSWV3ViV8YQipCw24RRLuULbkdUcrFopZdySlr44mXH6SGWy/4wSNEx4XbCDHQNpIZ6oUCf8mSSEmyfkH+i//83+tZzxN4nsDzBJ4n8DyB5wk8T+B5An8fT+D/9e/+Gy76i/c4XuR4qbNBFPNuB7A7UEwUj/CLLXGcJGal1dEJXmj071yrZqFU3jP2WWhiWcJ2F8tlYreyTCR8R2aU7ygWWQOpC+IrrQ+cMomauGeTFg63VL4w8e5iRQeqHZH4LoWOSblQAhArtxFwG5RlW5JlW1n2G0bEl6zJ6gZdPbvFoskodndpoT0cQCJ2UiYOHlwaTbpBeiRlt7TQxTOzFDXwgWSqXyGJWC+afMgBmSVyliOyD0Iww8UyHtsw8Y1vJbZawewPjHbrVDcn2WvYBpdoWVn+Ak2ByVtipuUDEpYfcNKiNGIx8bgXX6grRKsezIjvMDXL/UKxbDNJsq0sG4yd0JNHIxIE86BY1Y8oke1WlIZL4FnpvwGYbxvj/WaRbyATx8v5jjFxvt0cLr5OLHthJDxGe4CuAi3zjWNmRBmkv4ULiasfkMaZn3b0DgzOEHIEySVxg1Oe5Din0ZcdTjJRzjljSpIH12xKQ1J6QLooizj5xenJZ4GRakHxxFMTp3FVwDKaKgSMnnB8qzkiBT1jx/T90PPY1qwcwohAz8/GlACeDOcT0cK+OL1Vv0JyuV8GE1LO1LRDMDgTywkjNGardZsCQiqwBHhquQnC5BO/a5Q1D3JqQ4qLSCBqAvqwG04ByddnOHDOrL5jRpDnkNHhiZf3GSTOvFvMnfA1M3M+nbmZwVGTW7wziXdkTmo6K/oFTw5vNjOJM3PjZ5zBlCHPLMrzseBYEjnvDlcxnSmGtThDFydEzY4wcOSUVyzyh1fOiQBWAnsZcDtj4x0TPYXgcE5ZceuZ1c/OH6LFcP6YBDrmP/t3/53+/fNfA87jePx5As8TeJ7A8wSeJ/A8gecJ/NZP4D/8t/+D/t3/47/ijrzl5f2Pl7+89iHoD1cQGagV/gfvfH/AILG++w2fquzhfUdkUPBnPu+btOg4Y5s1SA1nn2pajY7YPhDGvcqK13wGTTm1PYDKO+ScWhqooaPFX2IalqeNhlo3Zrxw7jKlJDAu3nSwvdmW53mOTiFaOc1npJ0ckymljmD26BBseD9BxXJ6XkiuHCV4cIZiK189I8KPmHh570f8FSZ35zkjuR1fsxrNFbnTfLA8C0rhSVBR8o65b/Igsylmv+PMnSxB6oGD5bzSnEPwzjP7L/MO4cLYmsnxiOEB7sBVYR1bjExR5WIi6ohTlOgemZBzaOndi9HG21eNKVfIGekjS2n3N2ROarhjs5kRfkJqyoOpesPkuCM2swlyJgSj/siZjYi1KSzD3hCJ+0SkOxEh9USde8Bf5g8+u7u00D5yZIWLtaFQ1OXuevElLJA9kX1EL30hOdsMMbrUzVIwoG7SNX6ZlNqUmuU5JxrooljWhIOJ47DRE+C0HLhVriu0VH0hcXlxIrG8czWyWGyYMnvQcmSEHQlsC8ODX/h7b7lksdiwxkEUYuPCrSwTnTCHotlGtmwvBGQNfUctHRTLL7esWLeG3aSIhMXEd77XiAXBCNRysT44AiYuiimoI4fYFWQHU/KGeufqGlUru5AZ1d/Q9tQViXekL7FvUBJpkdY1WpZw43eYnCUqZoYV3PgHGgUX3roThiS/sEXwExpmRINiGY/5g0c9uRfbcQXHiyT2L9nkPpz+alp5SdSKZVMPCsC00V/RcGt+/Z/+j/9/2GPPE3iewPMEnicwT+DZnyfwPIHnCfyeT+D//H/4f8u855nr2d1lfgkPjqvr9b4HtaiQRA8hYFmsxRU8uPI36MV/BVtq+YRa/AalyUug8QN2JhpYFYTJtiQrwF7cuEyEX6JY5DA1Pxs7So2t7A7FSg5I3SuMICR17ToBprmorpGC5kHhiUGbWKyF9uJIsY1do5lAFT0GdEKU8oXEzRdFGP2IicfFWmXUSc4vv6EUFd/QxDfuVXNCNLhYPYs4yBDZxoWbLbYQXQ2zmdAkfUBJ1FhZlgPsgyJS18ZL2OylLLTPXOGX3mY2LHmgtcVs+BpFNFbeDW6ZXWsPbtzVsjsy7BskTZF6DeITyirXGWHadZWtPUeG36Cj47do5iR/QC++o2U7othlWxbrDpPCY60jeOFEngmyTVY7/uo3hPmGke8I+VqRnW8KT1ysVh1wfcNYhe1gdB8YdcyqcIlURz851eULAS6VnWEDH3zJA8xscMTEn95PFTkDwRdnQPlC4pZcIYlcN5d74RTOt62Zuji1TGQPb0coPPF4hGR3J8DyWzN1HDI8Oz3hy1PUM4+8A3MHguhABrWbDYsS6QanYk2gLvzlPQ81xm1q3VISMXj0nHLFN33rOWLiW98bCRiMEfQK32FLeSYzmk84Ao8xQXiQUalh2HxWeBvATScXm2r0EPzMmYfG8HZnVvPMSGY4EWLjIJWkaTnozKgGko6RX2e2J4nFCelkDydJNDx7eBCRKWGtaoB+QjLlCxMvz11pn0S0kA+MgOfiOS41yh9EaIvPn0sbr8iWGuBozGgtWPkKMyY63glgjsxdd57m1BWrpgTGPxFmz/Um/Yf+r/+3/1r/z/88/3sySTzeJ/BszxN4nsDzBJ4n8DyB5wk8T+A3egL/xX/23+j//n/5//JenDe4vM8Fc8FB3m5D5n2PV79ReYVFhY5OXJ0NI5kusrxLhgNTR5D3SqDnTS61admQmHlpSP4d/+Bl84/k8elI/SjDs4eDOYgBObNVkctp3hCtZUhFOKmUF2ZLMhJJLNHoJZOsEH50UtWPmHh5ShPeIgmMh9UjBxFy0XhmL5zPyLByyhei1Oj6AfLMVlXrmVHlFtc5FPf8YrTxjKI1t5yrI5x5p5OnMblG0cKvkKLWLEwZYWYCPeMDqWk+SG8tws4JRmQnTu44BDWUTzTw1U570zuu4DQTrXxhYsLryzMtOWC/RuL4pifGh86eu0709gwRo2TWLVLT/BXmnOgU5No9B55ZO09u91bAvsLkGIxlBuPuH8UqeP2sUY02PLeYIagMveEpwWOtS7B8dcC2zBn5hxb8ocbfqO2F/GEkYstSUfpAmV9ibUi4zAs3sJdyieSin5zO8htEXocrZaFiTHC4Fz2iSRvdn4hkMmPWJSJXP2DOiqchaFuYpCB+i60ge4XR3tyL7+jpncNkw5dDMNPgF4qVPIAon1DDpUGSmLJeONH/xt7f9Vy3rdl5UGvzb/IL4IQzJA44QHwqEhIcBIkDgkhE4rJd3mvtHYQUERNQxIGJkFNVrnK5ggMhhINIVsAB4QCaXK31e4w5xpxjzPXuUE6ceI233/262/3V+5zPu5711HyWt70q2E3aEl7MHr1TPMRYSk34zcSTPEi5slWzsaoTuzA3Jh5jQsG1ItBSNkJfaK2rH2nqTdySLNuSLNvKY1vGsbNr+dIv0CtPjyXZliXZVv8cGT+WjKfmxMQk0lmiVKR3HfHS9Qgd6dEXtHiszJQ24ll9Go8/ZuOwdEeRTO6WGUtNkJpybVt0Ka0sv9VVHmY2f0ViwmwqqLcPlGVbytqpPnwzLFfYCqUHf6T/yT/3p/r3/i//j+Z/3X59B359B359B359B359B359B359B359B/7JeQf+vf/z/13/wv/wb3Ehfm7LD3CW3D+LuKxEoh/44aahow/GDJZsy5Jsy5Jsy5Jsv9kWC2d+asQzBDIyW7jZCkWJ1JEeDdMctVM8iYPGITlWHJWuK8EP3aB4kgQnTSz6ZFMTNB4ndcN390Nb6w5HWgnaF5RIEZfuqfWsKincLGr5blycEc/ujnwnHcn5isQkeg4mLS0NvVMmxuaxTZ0pnlSA1PlIiasoz4nUVJfZRN1QITb0kAqW1afNeBtxb9e0ZExrpkcnUlQ9jI/Z0XQNbfRIcB5BYNJaVRr6gpaIGhNNZ07Giwp/yCxGiV2fbJT4UEeucyxNNFwmnjVLCsXzSTqzkthp6i021hvFQy1RkdQirngQLJzX8qogYCzrzM//DUA+28ynj/3kMJ9E0rN0HbKQfX2OSBU1jXwjuczIx6C/TKZRzxHrE88cdNAEu7IlHLaWbdPcKkMSIR3FEJLxegcyL6Yk+TvSRbr1B+Z1MHKdg7N0CyilhzMa+yDnJLY6qR1NKwudXmKZmZqQRGftpKbxH+A244Jcg8WM5PDWOujEOYfb9F63pCb3oyiLMmZw1whSaFZ1iMNKbjsvJMOiL+K9KbHNDrlUN5yNmZvGZVYXG9EE6GPdaApIvl7DQTO78Z0Zwcz9vUHH3yxz4p9IffUw/g8b81t7ZPyx3gv/RM6pHsbfLLPiw3bBVsGle/l+ebJNOG7SMO8NbhJxSybckbNoYm/xTiaw6OM4nO4lZRWQRah7WW/OIcBYIlkTCy7jnEoxi2KG99QnvxmmwXyDBESjA7LkOgdJE91P/cP/8P+t/8F//2/r3/77/zDRX+3Xd+DXd+DXd+DXd+DXd+DXd+DXd+Cftnfgn8jX+3/8i3+gf/a//b/WP/y//b+4X36OA6z1U19+onuJxKgg2J0f847Mz4IHzQ+I+b8BYhSyyCWWnwzDk2Vk8sMcmbw3Pbn2EgtTszG18S/Y6sTHlmavzpA1mwtmJQF5pVnUMPZTryB7i67ZKPkwgFkcwDzOjdjjOKwkcmSYdLjp4/u44jSQvIwzvvFb8prJ9S5h5sD0MJVw8ljjRMKvlpbUX5EYL4Z2rj01mz6RXDWkmD1q2aZ3HmamolekAyJf51B/pyli0UANnQzMfqf75mTUqqOMCP3ZEzoH8j62mNlkqSMf/wfs1Ns2No5JK2BW908mzKGtpjivJkW3pKb5kltCFiEmZJ2MKdVHxh/LuTSj2n/J1GyWWfFPzB0wXkfeA8atWalBrBiTf8GnifWqQ3BSh75xnZUg1RREcxhezqrirCs+zP8BbHeXSqBo8Sy6HhsrPqAiu2SviP2F5GzymP1OiSFZi+KhhF2CrFJ5PgXRBt+Y2FhwHHTQ3uJe7blaQptVI0o2Vgs/uQbYQ3ooZI/WBRNbRjJLaW01TmhblmQbe2diYxJ5fOmekiyJUSqlUjzG8xBUnXSaEt05VSlqHE2OJbGxICt5jIXo6ma57FZ+VdUCAAAQAElEQVSXTXlCkzXiaEii2RUm9UEpIeVpHmcnDku52BsTkgjWsWwrj/1Gjd6ZKo16I72tPpFI9TD+WIbYFgu7oEQck25Ij6Tsloa+p6cG1oNOtcVj5R6ydM8kkx8qNLsTvKB4TBywO4AFXHqp7ltg5zi9EBVhjF6Fb9bqxChtHr7JLbxTbdJg/dY2qh7NVjzrH/yD/0j/rf/m/05/81/9d/Xr8+s78Os78Os78E/nO/Drq/71Hfj1Hfj1Hfgn5x341/4Xf6F/5r/6v9Q/+Pf/n/wcl5/XJDs/2FlWHivShpGCxsn/CxEg4o9hwidNTqkzGcw26WWrxfyEqBWTICa9KMnSmL8zs6mwU4cdmAlI2YmLZxFJrPKTstb6QgqMpfCT4llRUZOzlMfZpHfdQHJJ3JJE81A88UF7D7Qnnxh2VtLSPpMei+dEItVD/DTZ0ZJ9oIR+mXgm3bhkLX2gJBS2canu3mLDTZ9IrnoYH8tA22JhJpll/EV5o3GNMBTPkEajRPTMRNSHkjeuSk3CRrOWNrDYDiYtLZXiSQ946QiMVva3tQU/2Uhn4UHLWuuN5BrfKS0tfZBAypJ4kXmND+OPicf11d3SmQRYyqxreuUoYOFHfzFp1YiHBheWoUbXzYY1fuKKWCYq2aFvefG/ASie988R89khYdb6XPFTk+panzji9hNH6kq6joy/29RSkk84UTR1v+ekF9IY78j4m73lEl4flbIjWKlAZK0zE8NyxeTKXfPe4KewcbrWa048CUisfbdM97KUtIuN1WCY2YuZR5jAruNjeb/2WA9ctVt8J7nUbWch4wawmXvmnGR3po0eFrfKEQDBqiip2YhLe3bqFpamgPUWpCDBoxFaDTiJg6O+CKXiVUIB63U3BCu6LymFdXjvSm70ztQwlAp28t3v+KrKMT0n9cx8aWqqiWTFvyO9pHuDdybIpABjQGrxAPtRf6lqGfkTeW3VQ/yczVBeTgQnJFC3WwIUg1WEkziGNwm8O01qW1vJrieQ8xIb8jvaKEaTT2yzRomFiZXOzt0X1f/CL61LW155mLmTVqeQKqeCLv2L/7M/13/jv/639K//6/9X/aN/9P9t5p+q7dcX++s78Os78Os78Os78Os78Os78Os78J/SO/Af/aP/j/63f/Pf1n/nv/Kv6A/+x/97fl7LT2r9CU7i//Dlp1odn2SjN8anKYsf6+jjZz1+SByd7gYI0ZGfJccWyMdhSEBF6xYZd4zHx7KaxwkBZy2PaZGjoxKHGZ7ozpQlfiClk+YOxI8aSXv2XorOslvqmsS5ZVqTPzL+2HvqQxNg9WI7cXLhWMbccP3f1SlYRtdyZt/0mX2FVAyZXe+DeQfozCKXl7+dV9k4Y1jVQ3B+KTRS2v3FnLipdU5UvTrkTyRTfUUSWXMJOinKSnBjotFhb5iN5JvmlivxZWdMszkvzhUT242i+kPQN+jECGybjftaW/CTK5J9WV8N7i+SmrzUXOuDBBr/xuTGcs+ct0bG421t7sj4YxSyDm/B9KxDiZPNit5JTTXsgb9AamhlX2fGeemX13jmxuHOC8ljjT/V/wIw3ywtS3zTZP+kpMalW2oeeyqHdjR2ZPzdaKw/BNp1BEY7u/TGlB2DK23KLHW/ICGTW8spi3sm4QQ7H/9EEtEeptGukm1Jfv1BWxp9ZPwxCliiVNf0xA+k2DYDLPtlCFk8iQHtlFZ8KC0twWbuyYxWHRitXUv1MyaxUtIdxZNcCu6Y3K3R35zYGcBSHsgSwawDrVwr2z1NvSmxJMu2JMu28thvJJhIDFfhyzx6SK8psr3iJf6R8S3Zxt4orZj0QZkYG23ZIxalN3r0BS0eKzOkjXhWn8bxX4wglUDdbgmIdilbcjvFQw27ElOeTfd3rgm8bEsRqctvXnElZi6dHTtopyYaE2aZeha+eOx3LTVEWDwFG6vqoXhmH7MOfrLWv/N/+g/1P/3n/lT/pf/i/0r/zH/339C/8M//mX76zf9BP/+02b+FP/YbeLCffvMX1I79jXf+PXLY3zjan+unv/FpvyH2sr+r5Yd/ifaHM+sbk/vHYD+9zdz0Xy7/TGvemT/94VHH/0H761P3+zC1/7mxP9VPfS1Hxv9B+2tT943J7fZ39FP9I+P/58X+hNeX13Jk/P+M2F+de17w579GLvGxD73F/zHwZ2bGfhrGj73rxP7/sz/W6j8y/g/aH0zdNyb3n5j9kX7uWd+Y3F+W/Zucl1nfmNyN/ZWJf2Ny/6nZ39bPPfsbk/vHabxHfyXzN8b/j2PpP9tvmftbXl/sd8P4sd/9lT9SYsvw/2CzP9bv+Dv2L2Mb/+U/+BPFfvsv/bH+xf/Rv6H/3n/tX9V/+b/wh/rn/9m/pX/n7/8HUn5Cy8+Bkh78AUTys5oWHbJJaKs//8kR2cX/IVyaGUTRliXZvjYa7OS2mqG06qUD8cVjibWbeKyH8rhRsVvqPuSM6p3isSo1tFR9RfEQ15jjmNjQpQlg25DEdiNV/4rEaGPXVUlTmRkHsqizbL8oy7Yky7by2G9MEJuwVlY3dOPZLR6aTMTuLg3tpQEhfCdl/PBg0opJN6RHUnZLQ5dnZSnR4INkGr8iiaxeNPmIA5klcpYTZF9EsIwWj7GsjfFvbCthZisuqMRuja7mRNkM23BJy8rjLzQFJm+J2ZYPxK0+cKVFaYJl/GUePdQViTUeZsQvMTVjflE8tpkk2VYeG2ad6JUnhicEy4viafxIiWy3UlpagueIfdaqJjbsfwGYT76f+YSQTwX5bJCPFateFC6WRUmQ6sUJZEYCi/Q3PsRv/EA+CmVo8nQR78AQuXI46zLU4afgTa/yBJcxjdrsaJLxMuvMlCQPZyalESk9kC7KElz50fTktaBItaA86dTEaJwKVEZTRYBFTzS21RxJQc/Ymb4fNN6q9sIcwoig52djSoAlw/l4Ld3IPRr9RnI5I4NxKWdqxiFYaCZW4yZQn62r2yrApYIVB0tt74G/8T2WVHKQU+llVFY1DvUs4mSJXd+RBEWv13DQzG58Z0aR7+hh/LHOj595t8xdsJmZ+Z+2zmEMI6nlqNZ0Jrmdk+usxC90clizDKSiMzd95hpMGWEqOTetSydEICuBK04xnSlGtShDR+MSzU5g4agpb3DnOJxXD3J5Wjnh4CdG5BTP+7VG05mFZXbifMujJQF+0xtoIyMoah5mTZpReDmTYM5CUcxOcWbiyWx//uf/gf61v/nv6nc//339dvsAMB8Gjv3007+lWj/4+3v6uR8Gzgd/P/09/fSbMT7Qq58P/yb2m9/8uX6Dvxu534z1Q8E/nA8G//Dv6ef0w5/I/wR/Lsnj/0Tdz8Of8H/YOpMZ35jcZnxo91P9v6uyGv8bk7uw37zFNn3mn2npI9eHcL/ph3iJHzQfTjW+8+/S/2d8aPV3X0zurx81fnSNeR9MbIwzf5P+34epvbU/7b1+84dHxv9T/dTY8pPf9D9W/vV17k/D3wxf+s9Un/fgxcTujHnHWl5T+74xud2YW3+YWbyXP+1kfvWByeXeO8lV/2WQD+s6a/jXrkis8Rsmtxt3qn9k/D/Vz28ffG76k+ucnzvn79D3d/qhYvVf/TtLfyO5n7CfsZ/6gRk9w3f9c+N/op18yFf/gu1NfOxDJ/5X/5i7Zt4XUvMz9hP2o0xtbKuPH3vXiX01PqRo/pZ/op+S4wOMFxPbjNd1yr30z4nzmtoH88Hb8axNb3e+JGc3vvOP+NrkjAPJ/cSHLz9jd0wu9hO14c/Dd73if6wXOWdqV+xKJ3ZnmZXcNya32VvtX43GvjG5zXgPfo7/w+QDr9T+wZHxf9S426n3pX+7xxP7I/025+RDtA9yVuND/Hyo+NsfZj7s+zf1Wz6s2/p+S29sac6uLqlL7ZX9bf3uX8Ko7Yd63P+3fMiX19FZ3Lua2O+w31L3W/5uLMvsP9bviC9jPrnf0fO7nX+k//lf/xP9b/6Vv9Bf/Om/35/n+FGsP52x7fqZH8r4+Y4f1hJWND+m1RcOq6nFJyF+FmSP7s91/MzH6rylKSewfOpPPmOrp6aSGs5vfTW5nclFD9Obs2GjMJn0Xus1iDLSVPbSddlY75rZXWkgR0eLvjINY2mjoasbM15cd1mlJFi8aU2H7c021teEfyLN1Ttpp4bJjMhAdAQ2YSoR7M0S/CSvrnEy4cEYypp848z/YGJjOSdjvjG5O8vs5HYyt3peQ2aPEZ67UUP9pj+57k8xqdVMJE0Xes4JVrbetq33HpXzCubBzA7K5H7Y6GptrrPNIsZKmGhHnkiuemf68oogTfHSdE06qeGlUZL66JcRzMLoTppa1kvTmPeA7Ip9aGYlxt1WzejMSrwktjNV0Qcmx6GsdQZOzkSwqDtqZhJktSkqw95IiPskSHc8XOrxOveDVHFGupqPP8bvMcS3KmPi2ajRF7T6DGQvzz7SEx+Ssy2CWaWQIhaom3TNr0mpTakZY2Zj0MlZPGxd3ZRwDFWf0gtajeuKlhof4leXyxOPd616Fg8bS5m9aDlhAjtxbIuFhV/svbdasnjYWPVDIvjGhFl5jHdiDiVmm7BlewhkLflOTRyKxy+zrKxudbtJCeKW8e9srxEPgoWjlovnQxNgiYuyFOqoEXYDssOUvFHvWn1WVJMdMqPxN9pedSX+Tvri+4aSSIu0rmlZwozdMTlLVKwZVrjpD5oIJqx1J0YkP2wR+kSjTNBQPMay/KETPZlH7RynFyEX3phNLUtDO2LrEeFNi8dowDKWtcotR7Aftast9TfClocyvizxndMh+oFVh9jDabNsK88D5ve8fpjYA5PwaLHy22obFXskhxElsmrYWwNTbZOpSTa1nUkMKnGIwrUky6lJHGpo/GXkhSX+jcn9qGV2a7lbWI1/y5yf/Dcm92mP3Dtzhy+debxrzb3xYT0SP5HZ1UN8Y4/MfVCPVZfMgw++Vg9oR2PDd/1gRs47k5mN/wgzO3VHxn+9xjV/07yG3IX5vYui6f9GcnSzTx3erc5c8jZz4cNit5Bi571F+/ewdKX+REfJHupIZldL647Ryx6SaCF+pEcfaFFn9e40PDA72sqfarxFUWeUDsQXZq24pJy9zOMPM1fkT7Qy+0H3JVN7Z4cemznK34VFe5ga4t5JTfUF6WnXiUSqh/i5px3NraH5O2Z/aiJycjmv5BbvTE7Ed8a/sffeK53YhzGvsSsm9pdkD8lm1jcmd2dfenl7ZjbzqdMjnPMskcy6YENsLM4VtbwVCBYzlk5wNDVOHPsgZTk3PWGuEZ50amLMaTz+bjgspfGWJJo/077W9orbUJZtSZZtSY9PEmv8kpYbHzIj2j5q/OorrvPsI+OPMbu5nZlBTgcmF72THFrY8tZezTmfZF7jQ3xjwmxTnvgNlbjZTZ13IlijlSe+mo+3W8/I/GXi75B6pnis+rJsTIIxq3WtlRK0HdSv88g8pB5slmQ5Z2lxivZUugAAEABJREFU00iWleeBp8zR0tsemphTlHyccPRjaGqU+Ga9H9FNhxpNj41fLXbMmCTCwtUHJbl/DqSoMdgoPOtGRVgSGUtA1fgfFE/iQGU33AOr0JecxiD5lMW/JQmWcpFbkmgeCosPbfzOXrQXE4pt6ppmAlX0GOhEItVD/OZL4SZ+ZPxl4pky6iTnj98oJYptNP6NeWpOJIYWT8/CDxki25gws2UNiatuNuOapA+URI2Vx3LAvig89dl0BZs9kaF91oq+tDazsZIHrS2zYTMKb63qbmjL7Jo93LQby+6EUb9A0hSp18A/UVa1zkRpj6tq9hwZfUMnjt3SzEn+QI/eadlOUOyyLYvnjklhWa3DeXF5XhNkm6ze6NGhhMCk8DGfG/IJonj4pJA9a8XzmWHUy7b4FuknihH5RPGDVCd+Moqqh2AOfx1GW8J7vGLb3pPR19ZXk1QGwZdmVvUQvyVXJJHr5nIvrsL12jN1NLVMZI9uRyQ6/rIEkt0Nh8UnviufmUtnJ8ahjcEUxT+xA3MHHGraxcaiuYvEN7aSOx4Zf1nPI5vVKQlHHBl/s5y2+eGmdxJknWZl3q3tjTg0snDa/ktsKe/JGs17tAK8fXGiQ0alhmHrtaLbALc4uaxVTTwCO2vmEWN4uzOreWYkszQewfohlaRpOcSZ0RgknUV+zmxPEqNx6WSPJom3dPbokCBTolpVh/iJZKqH8cdyV9pXIrGIDyaA5eI5LjVf2eTH1u9d24xvTI7j+sZkSjW/xQ2rJStXThFegN7Ws9kocvy2eOknATR3fzb/XJqZ8ZimhlWv/+Vf/7cCSbJemqJnEjFqxYt6UvAUsycWf7ncmfO0BDOoEV+b3Cku9qQ/Y0R/qsVDuHv5dDOCwivbYySm9TwDZBlf8ZhIrHLYMQmMzsiTJf7VmNv8MOdEn0iuOsxhv8TUfNrWtWXu9BZf5DW3YcgLfuYFfiM5YU9MT77+8DnMqGc0zpMY6F/LuNFPZj8JPk/M2XlTFlfupdXa0U/xUHfJ3IU0uZy13e1EZqn3Y96BOsbj7yYeatnVmL4/zGzBifRXD+PfWZqTOzEC43Wxvy1mNsJ7MlTvGU2OWc8rvcWfvGfJH4kvrO+hyOODfh1F7Yozv/EQa5zzwq/GvObFk77oZQRy7G6b/socSQEvh505V5pY8wdyBcW2ePzYM98rqNNGIeJ/Y3K7iYcediV2cJWns3COTE30TpzqHyCjlNoTIzDa2Wdt4oqJ/ahlXGqPjD/2fMttGjYDJTzoofBjDqX5vv+N6uP5++elMg3PF0xsWc+hwpyVyEsrUc6GyTE7eYdHS1X0NyYXy5zwZMyvvmFnk7ugeI73UWqwE6mp3kkBq/+kbSRXvfPJjZ6oJwQMcHBgZfRzebjLudKJXVju3qbkcJZ233Nx8q6Vh3iQOCZsRbJb2vXyxGNigN3BgcJflj1ZE7HU/UT+WXKit6QnOUuCemffmHmBypMCUWYMkrLysKc/Udy0Gd/5O0NNtNCax40ZFcdq6yri+/JTJsN3v32PZtRZpyqJkMwTO65qtvbxTR6Xkdn527LrhIhFxxjAT2i9SX42JsN9qCGe4KUmlzhgLS8zELRERw05I9Mye3Gqkk51iLWMVIkmlfJibUkmRJIVb8UrVrKB6KORavzI+GMpjXtLEqz9TckFj5bZ0XC9RoZVc8Mhka6MifOdee9WVeuY0cgt5xyKe36Z2LJOSgyHEdxyxQnNS+p04omQq5dY9BUZ1JphynAzG3TmB6lpPqS3K4Fd46wgO35yxyFEI3O7xS877c3uHOc0k1j1MD7u9eWZlhzYrxE/tsXjY0uuPXdd3tt7SDCRzLolNc1fMeckTkGu3XPQmbXr5HZrBeobk2MwKzMYd/9WTMHr7xrVxJbOLdYQogy90SnBsloXZ2w6UFvmjZzFYFbiGAvRlS2/45D47rq+T1pWHr8xsWVe2Hd7Ipckl/jJaK2+IeE5XCmLFGPCpT3ySJM2cX+SkMmsZV2ScOMH5qxYGkLbYkkKsVu2guwVE3szj97p1bsOk40eQ7BMg18UT/KAoHyilpYWSbKU58XleVWwm/TL7PGHFKx8whHhN6M6ZcEixSxFbIx/YW5MPMaEgmtFoKVshL7QWlc/0tSbuCVZtiVZtpXHtoxjZ9fypV+gV54eS7ItS7Kt/jkyfiwZT82JiUmks0SpSO864qXrETrSoy9o8ViZKW3Es/o0Hn/MxmHpjiKZ3C0zlpogNeXatuhSWtnOkgSbL/FKqXH8jbZx/YpLo4cSWn3s1Omg8fkNM1F5Y3/LrJfOb6JRbt5y84sPQb6DssueCktOLLSFq2ocJ6bEMNhlpiRXIfb1X+lkd3LioZElRTtD6DlSlo0JM2WSkMKV7dojlLnP0p5Z+a/Hlp+ZPVVOTqkjdsXEbm16NLycRY54T8u98O3cLfEr5i6JQ849vZYrTSyVTKt3pnqzhxY5dmnrQHwLjVl6WAfz+FdM7MfNPtfaS9sH5u9f9CV5BxPH8l8kurRO9OgTiVW/zrGJ8UI9X4szH3LjF9x6vjG5O8vc5E6cc3g9n+dyz9Tmvh8k11mwebjpnZmd+IE5584yJ7lvTO7W5hzuqtZELxMxH2xp65OWbeL+pLzi35jcmIc0SfhWnrULnfWitLR0Ysp3w2Gp95MWCaBtKGxo44tnaC+9dqVSeb5qepo/kUj1MP6YhrZxzXiX9lC/RL5WqdGR8cfy9Wtu08yLZr6GTn81HrQXVT50Ij3VJz7k6iH+S1uq9oHxl9mLGtqbflCPz/2bC7VpctFXttWcSF/1MD5mTNxNQ1+RM5yaW9JFTtzbOy1VX/FBytii6LFf2tXJbfaee9P7943EsSud2IXpLVbNXc6Ulj7QUsp0yQST/8bklq058SVF4J4onsRA40KkbudDqj5Q1OjBbiyMeSJqLLt5r8V7oNCNyLb6p5QUYqkLTO1jOQpULR7OwJdM6UMyUzat+BgkoQesSk39RGPWw2oElI/WEGNWYrt+mHziMDU1JnuLhfz7V5JtWTxD26MlXFmqicfjnRnllU0DNfamCVcfSI5FwCpdV4IfukHxJAlOmlj0yaYmaDxO6obv7oe21h2OtBK0LyiRIi7dU+tZVVK4WdTy3bg4I57dHflOOpLzFYlJ9BxMWloaeqdMjM1jmzpTPKkAqfOREldRnhOpqS6zibqhQmzoIRUsq0+b8Tbi3q5pyZjWbD0nUlRtKRyzE6draKNHgpZeMkFsqvXJREzcEjMtH4iLJpw9QvVXyRffK6crEmt8GH+3HJH4kfHVp2fjhUCftJSVxE7LNnF/UjzkDEhqUWfq9XhlCBjLeiOzlJob9r8AzKeR64PB7fPEA/sJIp8VfiO5zMjHoL9MZRi2SCs+p7PSj+jK1lw+i00ObnrdLjsJgvHSe00mUUM7Jal/13QRJpmVZJnXkTYC6NQs2zUDW/PBVhAdMptOZkRjDCWETnQ0gc7aSS51P2J9G6m/YC6RDGNx2bsS4VwitPQeVZx1S3K5H8VZlDGDWRGk0KzqEIeVXI6gkmBPglEk35tSuNkhl+qGs6VtJ/OqQ6rwc95qvdIUkHy9hoNmZuM7c01mdDR14dEyJ/pE6quH8X/Y5jyOyj1oy0t5We9FzYmcUz2MvxkDGoXtgmfdy3d+NtIpizvMRXCTiFsy4Y6cm2Yq0oRqUw4ZjUs0O4Gu+imLA4M1Q3yrInB31l0888nl/RNPuX6ti+LI+qGYvygeWpbg1825PydXpzwz7jStnEhHCmIEgjWPb8CIJyfVnkkmFoffLMdNCGNIds4EWzyMEcodlMvgXzMzk1wjOFKJPHGeDXMejB/Dbf4r+y8K5n0juScmrHNhZr50lTSvQzdPe1PU/Lqr0Ft8kbsQE88z7Ew21kuTrB7ip/QZEjqTc4ind8XRqaHhufMqtu6xauL/JRl/aTrzG5O7sP4zc4gvnRex/d2EyMZPXHfPX4ac3dRsJ02M8ezUT2LT6U3imTcxueG7bt3kdMUOyYZlDtA7E9ssM+Jfsl9Ysm9MbWbupKT6B8jfi3Wft5l7nBnxgzBzP0iy8WH8GLKz4+825+x3jT4aTZNziNRw084s4jvxs5gS5HYHevQVPXWfTMR7p+pZOlE8+dbQeLZqr5okRgvftkrx4KP00rjiIcjCkX6JmmerGylGb+7i/ia9v2nRY6nZTMTi3zJjqQlSUx6391z0wQ6z+13oSieGNc9o4wNeW+YIqs/2Wrf34EO3StrzWs+VTiwmhoS25ZSXlo0Js2Qbk7JZChRmu6SUlPI0j/Pi8jwVi9ndquwid6b2Z8V3+enMPzv6xuR2Y0T9I+P/oFGm9WXim2oEN6w+kNcjzNiqdWs92uKhZyd+6vrXAP9Mr//ikDuv+JtmpskxcdUxyJkxzMF+PqnCnk+oZZbqiCc+WGMQGRCNmaCfYjZxyFhG4tP8xBDKkxpR239XcV5isfwdX5J/l+HwV0t4SVE6Exj3JBLLnLCjqKQoe6Acx4jRa0r2xtjy8xagligOqz4b6xzbcj0L8WLq8qoO1NJgzeEGPYvAYmo7YeUzD2sX4dZAklmEU99mNIms1F+Rsyhib/KajZIPA5jFQWnNQXGHFLCSyJFhaxEs6nI3ChC5d/JfmanUAkrpw2n9TubhM7jHUFSmptX0pmJpItFfjUnNX5EY00lzDFMzbtMnkquGFLNHLdv0zsPMVGRmchD5OofYnaaIRQM1OQtB6Z3mzWrdkDK8tATwHMj7xjAumTjT6aVo6V/wT720V3NK2kDHMOiTSXIoLaQ5Ez9F8S6ZgVjn0xQiKY3oCPyNTEmYAhbx6INxVvu/MbnNMiv+iXMWr6OzkuMw1ud5BFfN4Q4To5j1iiM4qUPfyHmEE6Q6Hi6H4mV2sl/5dl7O2YzfcyjfF2vi4Xspu14633El2StjX5CYTRyz3ynRnLUoHkrYJcgqledTEG3wjYmNBcdBB+0t7tWeqyW0WTWiZGO18JNrgD2kh0L2aF0wsWUks5TWVuOEtmVJtrF3JjYmkceX7inJkhilUirFYzwPQdVJpynRnVOVosbR5FgSGwuyksdYiK5ulstuddmUJzRZI46GJJpdYVIflBJSnuZxduKwlIu9MSGJYB3LtvLYb9TonanSqDfS2+oTiVQP449liG2xsAtKxDHphvRIym5p6Ht6amA96FRbPFbuIUv3TDL5oUKzO8ELisfEAbsDWMCll+q+BXaO0wtREV7aQ0pcPDuJIbdlb7NWpHJCkvkjHmiAMiaKLOaUVvRDkO+MDom/a5tMTdLwET6sPLYzUZX5zTLhROzucv40nslVRPLb5NjUWHJqGGJb3mh8SUDxbHbsgeFxJjPw13/Z59GJcZah3klX4wcymSp2+rt/Ib10ysOeO2ekqzq53aiuf2T8Mb2Tm/B6Mssml9mpOZGa6gtuPScyp3oY/8OYlVjmhtudq8ndkpnJne6Y2I1lbnP6xGkAABAASURBVGq/MbkLU2KH3k3L66ydutFb/BuZpeQtHqtSVla2amQ1fNdKgPh3UtC6K0qn3ockyniLlZZQJ22t+IHpeaB3Wqo2syzjp+mW9qo70DYtJv4o7eHlfy1IrvHQcnzObE+46Z2pGfM7ZwbnKb3QpgZqJzXVofc7iph9pU2rqfMFHxMPk18UsyiWFY3ttJojszO56J3UVF8wc5M7kflopx92LjQmM2PoUJZD4qWiLd3ykYzEbOPpxIfELDf2IPuQbDl6qKF9iMe/s0OvvfU8tGYOU4OpZ08NFSJm2FqoaFvCt7+QnH3I49tozH6jeIgRlQ5UHoKseLu9a2mLDJnR2C0lJZfyN9oEWRqLFM+Z1tIHyqli/wHSbCr1RjtRq/H4u/E1qj/s1yD+2KZ3mhHkdGD8HzAOl7e/A3DTmtk7yaVOpSnjPB9p2SbuL3xMflHMopgVfTS3jk3S8t37GPWQHWKlJEvLcIiJ71l6SInZBgi4ApI41/k+SMb4EnmZP/zsUk1JY2I3wuTEY7Qko60+D+FEQ3MuSqqW5MyTqk0Ge2DVD4Mxafka7WhMEmVE9WY9lZjVcYJSd0uyrf65IFkRxqiweIyv3eTln1hB/BvJGVtVlvCNLYpnKRHL+crjbNK7biC5JG5JonkonvigvQfak08MOytpaZ9Jj8VzIpHqIX6a7GjJPlBCv0w8k25cspY+UBIK27hUd2+x4aZPJFc9jI9loG2xMJPMMv6ivNG4RhiKZ0ijUSJ6ZiLqQ8kbV6UmYaNZSxtYbAeTlpZK8aQHvHQERiv729qCn2yks/CgZa31RnKN75SWlj5IIGVJvMi8xofxx8Tj+upu6UwCLGXWNb1yFLDwo7+YtGrEQ4MLy1Cj62bDGj9xRSwTlezQXyiRzDpRlkRv/wtA8azPE/NZIoL1rgl1rU8acflUkZ0PElOJVQ/j70ZV/SHg48vsv3xYq5j5wcQ2SzL+sC5bV7ckehaq7PmIXCvJctd8xoqfwsYpXq858SQgsfbdMt3LUtIuNlaDYWYvZh5hAruOj/Hmph2sGpzqD3KZ9CZZbrpckZlAyZvOOYnupAmdxa1yFKCHVVFSsxF31eIkBpZGsGhOBKsYxt+M0GrASQwc9UUoFa8SClivuyFY0X1JKazDO1Byo3emhqFUsJPvfsdXVY7pOaln5ktTU00kK/4d6SXdG7wzQSYFGANSiwfYj/pLVcvIn8hrqx7i52yG8nIiOCGBut0SoBisIpzEMbxJ4N1pUtvaSnY9gZyXGOT7EiMPcWJc7Byb2iDfy8KUhbli+OTXwFuuOluTRPlV8TqB94Y4ETJEup78xprjqCGYNZrCJ3FsBdMVze+pOWuLrfSKsdPETumTBKuaTYSUra0VzNIykVghj2ftD2/Qk6gumSrOC7Rxmwm3McMnM1bpClQndmWXMbobHwJFl9mwNVoqu0lLSGViY+3Fv6Wk5Ch5UVK19EkSLG09QsT/xuQ2o3wNFQ+ChaOmxfOhCbCUM3biVJ9po4UNbfyM/CBB1oTTgdIiwXadSKR6iC/MMk2W/TI5IYsQtjGxMYk4psldMbEftpklTUf4zThXOtRGL2v0uXzDTZ+p/qX380j1n+f882rxkPtKSpo/ELdri3NI9QfzD30Ogv2nkbNaA3dNLiX5L20WGZU8hrfuitPXcEViWdtdzjTvnbDF5a3d4uF9c7K3FOdTwV2cmndK5DFpOLWdSSyUulsa+gu3mmHOSzVsBFrqWeI53qnvHbUldy2rzW7edl+QISuKkzz40Ikty3n1Mh/nXatxn85qjPh77aY/yNws81r1cRcTEc+RHv2iqYqR2L0rbQpOxjeC6kta9i+ZpuaGEnlMGmYevg6UopSHaP1Q8Tj/TPGQNWgeUsOS2FiQlTz2i1o81LFLkFUqT0W/KKjh+iKNJla92H++tx646V+8A7U9O2Ry63+YTiu2qPGifsy2jiPj3xgvlb/sXcrD33Nx5qcRMUbeY9p7kyBHX9+jxhmZ74sU9fU7P6clkYrnqqRNPEtRTzTrScw4oTiLlaSexPJzZLimUPgklXMwVgP5v/fihwRoydmrjnI0PrNaQ0FjMGvzw6Vf3ktnXuIwQ7jZOit6qpJuHI0/ZT2b8Iuko4OQCbkcMk1xYRK3RmlzR8YfS3vcW5Jg9UI7cXLhWHvRF1yvOYllU7UE+6bP7CtstnHOaOSD89op6jkb01mfPEServ6uMztlZx4Vc3j/UlOvDvkTyVRfkUQW92cMK4I6vLWimVcR9obZKHrTqVmZ+51xTea8OFdMbDeK6g9B37ATI7BtNu5rbcFPrkj2ZX01uL9IavJSc60PEmj8G5Mbyz1z3hoZj7e1uSPjj1HIOrwF07MOJU42K3onNdWwB/4CqaGVfZ0Z56VfXuOZG4c7LySPNR4m+sbkCHHZ/hIjFXw7K265spJt9Rna0diR8Xejuv4QMESipSae+OBdp02H4CozEUvdL0jI5NZyyuKeSTjBzsc/kUS0h2m0q2Rbkl9/0JZGHxl/jAKWKNU1PfEDKbbNAMt+GUIWT2JAO6UVH0pLS7CZezKjVW/UrqX6ll6UlLFXJp7EU3DH5G6N/ubEzgCW8kCWCGYdaK2rfqOpN3WWZNmWZNlWHvuNBBOJ4Sp8mUcP6TVFtle8xD8yviXb2BulFZM+KBNjoy17xKL0Ro++oMVjZYa0Ec/q0zj+ixGkEqjbLQHRLmVLbqd4qGFXYsrzrhMb21LIuodZLy2ZX69u2sbD7JDckZxpH+LV6pNwnJ3khFHdPZSOv7E1aZMjRhO/IxZptGUbF+Ze+Da+iIWNSbaFi5HDQYqI7O56NLZmUyESsnJKzBJ1tsGqkaEsYWtH21WPW66a/Jd3FMo27f4ggRUXT2pAYh4G0eXXrR1UDA+zJGLVR0pKrKFs0rtOWklh4qneaS19oJws+w+QZqdyqKHdKBLG3229n87XIjG+XvVvmX56dGBqo99M0Z2ZWkvVD+mDD5nzlTkhVl2a8uSHOtIok/eZKIISNDMFdeJDS0POqL/TK8e9lZ7wB832qdfeNOcwy3OG8YUtWp+0RNSYmPGdD0pM+ZHxl4kzfTRZjtaR+NXD+B/GvMbe2FnEoPKaoIdLW07MlnZattH+SyODZp60fCnkSChxJcnSJ63GHtYlc8/kLujGmZmcpZeWcpaJfdJa8SEzqk+0VG2V+O/MWbEMC20rfNd2vjbkvjI1Y493Ti936KySGJQXjR9bd6S/+qFqX/FB64P8A5r36pfoqXuRAH3Rj1I5x59ajadmM1Mff6grEmt8GH83eus/2JN/SHjSg9244eNAE48+sHdC7zT1lu1PZm7ib/RRx9/Nao79ksxKhd1d9jsfK8bdbHInkss5iUGVUyNr0x8kZ4wCdkvdh/59KSk9bXPdbpZK8cQHuuRV8EH1hfH6xN9lDW16KbMtFqnwYLK6gCiwLfPPEwuJb0t61Jes/AxjZtuWlDgWj5gsFht7ooYtk1KJEmYhsmRblmT7oF1tE2Om/dL25osaTjDktQK0DzOExsRDkqXNiOAbE2blMZ4wrwmyLcmyLckq9EaTwQirefyd4kFrzHFMbOjSBLCtKbHdSNW/IjHa2HVV0lRmxoEs6izbL8qyLcmyrTz2GxPEJqyV1Q3deHaLhyYTsbtLQ3tpQAjfSRk/PJi0YtIN6ZGU3dLQ5VlZSjT4IJnGr0giqxdNPuJAZomc5QTZFxEso8VjLGtj/BvbSpjZiismdmFqjK6hPcM2XNIyLWK/ZzJeFcyMp53T6QPjj2lIuZb5TI0+kVh1uOZaSgS7YmJjFLKUs8RjWx4C2aisEz1xKEvk7KF48FFqXDwIlsTGUp4XX17j9IZKsXiqqdlJLDlC2phcNPz8LwDzyaAOnzzm08LoE/kEs3qIvz5lf+l8uhgjxTCGsqIZddBRJFgEu7qNbm8/2UyA2fEJxsusazKBmpauLaUEWWvMaLqr30hPXgtR6lpQnnRqYpwzFSjmsxNixyfBmt7oTBiS6Bk7ydG4Yr/g85a1DjL8dFYE3QHGcGqiwUtzDregNXmyV5pYzqAoi/LUMaXx8GWrLpp5Xd0SoA9w8gxBk4s+GjNJUDi5IHnIqStFdkJoouQyc7VeaQpIrrslf9AManxnRpLnjBVHxx/rOfEz75brDHbK2VP7Ycxt7I2dSWxn+qO/MHfHWpWZ+Ovu6clrOXINpozyxKPrsrGSoKX9V2Q2L4q9yZ10spjHOJzul6StyZ3jcG49mPmxdQeiE9v0i0xqOhunpS4hmO9nratmYxFmn9XfIC+f7uUQ67morXf9ZpjXRRG7zK+Pw8yK8QZQnbNfltiTb65PMql50pO5SoyLZfaWUx9U4vgtZQARVBaJgF5OqBf3mY1U+OQbd6gyVbl1SuHzSYAbQ+MymtdADv9Syyv/jcmNdV59rT1zpc6wdM3U7OZV8zT3TL0/tMgZK8WDb/DS4mytfpDVPM6PktKurb6iGxf9YGJj/iWmmZoOHqYnOpb0LzE12FaG27XpM73eC3anir8TL+JVh1oVcYkhZEcQB8IixRMiFSLLl7ZM0Oze6arrXZMTDxUWGoPiyRlxQ6RKAi9GiPhQodmdIJREMepFmT/i2ajRL2oeD3cwq/6JVFWHZOPjKkR+MkEsNUDvTGy392T0Mr81bvqTa5gXzl3zV1A7vfLHf6bwhRlT6qCH73rFNf/MQmn50gfby2mW1p6Z9dy9UWK/SGpybufh/whTE7N40gOWRrD6zWNjcknuTGKM76Or9k7TlJqm2VgdtROH1X8fXDHF6b8l85MLrpiZyX1jcj9svGOtHfKVWsceNX7jYQ6/5rM1yWPPvovdcA/Mv7OS/0bm83fyieUuJ6a1Axl5YNxntuRPxjnV35jcZszldWTUc2diN5arZv7OzKGW7xXPxl8aqWfiYwoT/CD9jQ/xMwvokxxM4qkbMlvJDZ8tY2OtuJT00fK/MWk/VUoQk5QWM2CjeKJ7KeJ9/58E8UX1E0tt/PUuqC9oq8vPSSsv5Xr8FKM8ybf+iSKx4qsye8I5Isz54ZMAi+9Jqab7GXIcyXg5a7P8s1mfi5epoX7F00PHxEDCVE6cK7W05BwyrTE9jYVYipKDKGa0qjzrNhE/MmdFX5CZXcwtu3Vii+Nl2ImpGUsbhV3dcq3kypyJw8qMhI9sb7axvHfJn0hT9U5OSX1HZzAaP2vCVFYtEmzVibyaajLhwbbzc+Yy5jd/ZPwxTiGdPa3XXNHrnWZuQ293yNxUcrV6kJLGCUPqGstGRZPvTE3ycDWx3+nDe7WqEtgt70FFzsF511woh/8e1iHUs2YmxxKMDrgzV0V1dJkwRQ2X8ajDT1G8ezIh59DSu5eJLWtfY0y5Imekjyyl3d/InNRwx2YzI/pEaqrDVL0xOe7IWrNxciaCRf1RM5sgq01RGfZGQtwnQbrj4VKP17kfpIoz0tV8/LGAw5LCmME6an6URTTgAAAQAElEQVSnwTRWvpGCfuMts2H2ythHmjonu0jORmMsEcSkkCjUeipwTzyJ9+To1IytA7RmE2MhZiFYGgviH1pWXRIEWRIFn2yB7KGObIfyuHF1t1Rmq8/Gkm1Zkm1Zkm3snYndmEQ9OelAfPFYYu0mHqM8BKP0IudXfVA81gq/UxOH4vHLLCurW91uUoK4Zfw722vEg2DhqOXi+dAEWOKiLIU6aoTdgOwwJW/Uu1afFdVkh8xo/I22V12Jv5O++L6hJNIirWtaljBjd0zOEhVrhhVu+oMmgglr3YkRyQ9bhD7RKBM0FI+xLH/oRE/mUTvH6UXIhbWHVJIfOt+dkCuedIRULYF3rT6Wh4FRm216I2dyRrLyo3UyCpPFemRTfhOtuI1bwSN9xFJgO2k9oDPHkvWQ3V39/6HVS1v5g09+7VLm25ZPNZJFReLxDnxIelhEBS1SmBvwgyy2k5mK9sRTXE39RnI2GrOvyQHMtzrXxmceXBqfWWKOPkhtYrnwFZ08dkGnx8xODtqpi15mYsLOtExMPtLc14T8A3y0zsywqVc0NtTQO6367C8mdmPMbOYbk8OE2VSPLS2dKB5LrG6XlMg3c0NPHHJWqjUs5IayVSMT+iFLUepPTAD7hWFOz8Gq6TkzXxtztQOp0fb1Kx8rj6/5ur1oufEj8YXZUniyx6ghvU7kRHLVV6Q6OWZ7Z2JjelGp6X2JwU2vOz0kTZycMWEfZEbjJ1q2JVm2gQ9kbmOL5o6qXlqcocR2mn5yOjC56J3kqi/YWcShUwMZyHqgXPY84sbiL1quvqLps2xfkLmNn2lm2alP/GXie1Bz35jcnWVucl855/H90bac2q9MzVhn439jcndm3qLkvjG52IPa8GQWV8Vu2NnkdmZGtHhrLV4qtvhIDWc8sMRLS2d69IF2z3/8HkxtzGbOV3v0nvl3dOoXExvTOzOPmA5MTfROcmhuTWT5j017eTmn+WrmHYnffEnVN2ZuXt8b6ZKds9d58Ro73Si5h0RsNyPFxtJOKW43ZupgflhmhE0W0y4elDXQhInn5yTZLEucaWKu95D2uOXkJCgetIXvFR0fkSXNDNnqn9wnfuIl0fhbPFXEOVE2OWFmzGaSCAupnZKqJWjsxQdFidiWyNhmf8i2JCtgLzct42GXFA85lppfGzuRLraqO4onOZC6l5uACKnPHsdhaV1U16SgeSgsPrTxxTO0RxPK2tQ1zQSq6DHQiUSqh/jNl8JN/Mj4y8QzZdRJzh+/UUoU22j8G/PUnEgMLZ6ehR8yRLYxYWbLGhJX3WzGNUkfKIkaK4/lgH1ReOqz6Qo2eyJD+6wVfWltZmMlD1pbZsNmFN5a1d3Qltk1e7hpN5bdCaN+gaQpUq+Bf6Ksap2J0h5X1ew5MvqGThy7pZmT/IEevdOynaDYZVsWzx2TwrJah/Pi8rwmyDZZvdGjQwmBSWHLs1mKVilt3P8LQM2TDwjHLfqJYrx+lIhzItXRJ5saUv2kEcnHl9n5BHLhQ094IY3xjoz/aXzuOTPJdXVLc+OoxThYrpmzTyRQfSLF1UP8DOp5TP9ksstIT/XSmd0pbCzektW9va/hZiRZVNGUGKKzPrlmJ0l1jox7w1WxTk1f9Mt6TroTumNym+WUzQ83vZMgKydlXFknwSvbG3HIs3BWW5wvuineqzWeV7gCvF1xokNGpYZZ67Wi2wC3OLmsVU08Ajtr5hFjeLszq3lmJLM0HsH6IZWkaTnEmdEYJJ1Ffs5sTxKjcelkjyaJt3T26JAgU6JaVYf4iWSqh/HHclfaVyKxiA8mgOXiOS41X9nk9bbN+MbkdmNM/VyRO+Q7V3TD0XGwbfENbkXz29gEeS+CGDmmcPs4K84vavXMpmg6WSmNJSJ+jRw6XG18vZidOmLim2uu89TE9KQVP7V4Uc/UETc1WZEx0o2GImGth5FSNgJPseGXyu3ZiK2ZnPMUv+WmJiTOwGpHzyH1JeLiccn+4orS3eg196jGG+acRE4kVx0yMz536T3e2V5qLqjUSslg4kmd8BeXpz7urubEYzzAazTwd+YcrOdx11BD063kSq2pyYmnbAXiyPim1hNfNBFhJzKj+pLqFzzvm5LHxF2Wpis684jpjWRfrzm53VqJOjL+nWVSckfG/0Hz9J5IrHoY/8JySf7qazOlRjwhdtKEl+ZNIcc/Gdq1nrhP5c3Mf8VyJuHk6VnxaKxaytmKf2vMbW7ILN54ZdY1SaUm6BcyzsEyK/Ibk/tho5ClvJBQbPG/Mbnd3i5DeyJNx+ksnCNTE70Tp/o7n6lhlIYvnSDvKO3xeKdBv8I3TGHyP0LmKrWLDOxXJ2fE9HzlovN9d2Nrm6cGKnNga+DW+8vM2er2ZAaevnO9LlGbs0LlvJMWD3VPkFxIXuHRttg3JhfLnPBkzK++Yc5Kaid3quY9G647oVPDGX1NG5ldvZO3iVxbN5Kr3hlF3ULHx834jfFjSYZPNhb/bl99L82//Unk56TG2FjUJZja5LEOCjmBArIkR5Or3kmKsqwVP+oV2TuZ1boTqammCpfLrAGJves2Z8OSA1wj++qpN1+Tef/0QfXJP5a2xcKGCrFS7JgxPBsnX6OTcQnW+tZnpYRduUyuj9OXw9+GhJSC9fPZSOVhgKhYzQSMrbw4i0U2mjhDU61syAx/ku3XM11P6lJTw2+M9xUSahslZbYnvYspWPXPuhkeHfXOzEscZigDcn6rEq5myEZiLSNUokmlvFhbkgmRZMVb8YqVbCD6aKQaPzL+WErj3pIEK+9jx+SCR0swGq7XyLBqbjgk0pUxcb6T9yxFmRcyo5FbzjkM7fllYstmBNOWJn1+KWQag62FOS9GR9WZW9Uwzbhcj53KK02s+ZCJXQnsGmcF2fGTy7SNRCOZvvBtp73pneNss0piR8Yn1DcmzdEnRmCpAft600uuPXddXt7JeEPceHlJt6Sm+Sty+Loe3clTGI2a69dLdGzdJKUrc6UTYzBrzUKnYTSY2YmTyJrC9XeOydVwiilJMXcgQO6kE8KyGo8zNhNQW+aNzGIwK3GMhejqFp2aE2ccscf6tkVg1ofON9nkLkl14iejuPqGhPM9tKA9PGuPPNKUmbg/Schk1rIuSbjxA3vFaBLLt8IMsPGFXbIVZK+Y2Jt59E6vXmaLx0aP6YrUNH5JyVpPycZq4MXleSoXTc0ye1E7SYkYSxstxb008bR2I4KlFG+Mf2FuTDzGhIJrRaClbIS+0FpXP9LUm7glWbYlWbaVx7aMY2fX8qVfoFeeHkuyLUuyrf45Mn4sGU/NiYlJpLNEqUjvOuKl6xE60qMvaPFYmSltxLP6NB5/zMZh6Y4imdwtM5aaIDXl2rboUlrZzpIEmz+RSDTW/BUlUqkbSmjxeKg3EpeU3eJhZmh+PxwKze/XgdUYul5+KxzfmrjaYb5jEpZtTELqweYHdYnpseKy7NjSJk5AIRGUpQceNfKQrDE1azxu5lDiCNl0YzjyCsBHk2bWii+taGoar5/4gxKrOVuI/xj2mJ5hZmfWieTQdsg5+NrvYvlDW2renW182Vp8fNKmjvjOx+jQtD6wxc41mpneSa56GH+3qeWOTsxHjV99ZGZEH5ia/W7E8W1zR8v2mZxDUL4kcxPHmi/pP9KjTyRWbUa75+FIvB5xt/onPqi5M0/uG5MzY03ty2x8Ze6ivZEYcecOISbMmGT+JH9FkzZ5S90hM42vnQ9Fm9mhwm8mqpL/xuRubc7j7kySO4vYLalKzjA94TcTdcl/Y3K3tr9Tq8KjS/wrJrabxfHYkfGtBwm8ldOmJTtRTR5KsqQHZuwr6W3+RMs2/cP4Yzbxg1Gh3Gs3Tf6WfI9NTkfGH+NrNV4rOjceZzJZS+NVLzYWja3/Uivxh2yoK64TPGetqtQl3leULq149MtyVhWzw5emnw4z0yYTahj/zraaE+mrHsbH1glrf93t7c6c08gt6SRnH8k51VdkWnOLpjevOe/zi8lttua+cm/6EY3dkjnJ8T338UbvOjW8Dw/od/IaGj+w90dfkv7Gh/Taud9R4zfOedzB8e9Ir5P7SsnmPo+h3+mVFwWyNHRIXzXctFNjZe9mW7b1wMxdHw9LGFI4zW20TIpz/JCpEdrCh9kFHW3Vc/f4MdRDZMeXZFv5kzMtyX5o0dRZNsY5NqxpxTyUlhYP+ceCSCtbuJl4PMFy08SWZud8RTNrUTyJg8YhOVYcla4rwQ/doHiSBCdNLPpkUxM0Hid1w3f3Q1vrDkdaCdoXlEgRl+6p9awqKdwsavluXJwRz+6OfCcdyfmKxCR6DiYtLQ29UybG5rFNnSmeVIDU+UiJqyjPidRUl9lE3VAhNvSQCpbVp814G3Fv17RkTGu2nhMpqh7Gx+xoumyl30aPBBr5ySSxqdYnEzFxSwyxfCAumnD2CNVfJV98r5yuSKzxYfzdckTiR8ZXn56NFwJ90lJWEjst28T9SfGQMyCpRZ2p1+OVIWAs643MUmpuKSm5tO2UhI589BNL8VlhPiW8I7nW/RA7hIGLtODzUSNrfWyKwyK4ZD4TfdPrU8/sJBgQL8XXZBI1HXNJuhjT/gPzelJON6nULNs1A1vzwVYQHTKTTmZEYwwlhE50NIHO2kkudT9ifRupv2AukQxjcdm7EuFcIrT0HlWcdUtyuR/FWZQxg1kRpNCs6hCHlVyOoJJgT4JRJN+bUrjZIZfqhrOlbSfzqkOq8HPear3SFJB8vYaDZmbjO3NNZnQ0deHRMif6ROqrh/F/2OY8jso9aMtLeVnvRc2JnFM9jL8ZAxqF7YJn3ct3fjbSKYs7zEVwk4hbMuGOnJtmKtKEalMOGY1LNDuBrvopi5O5Q0Lk2RPD8n50Nv4Pk1mrL6OYVc3Gyhh+Lzy34cb5VTBBPGLZpfz/tBkvM9o9+Z6fKoLNEUcqz9JM3mPxc/5GqtLHd9U5sq0pp4okO99wKSGe09GJrgAeDot28sxs7UZqGfrERMEzdfGhhzRRRJZYfH+QAI157eLZiZ/FcQHTizPTRzg9rat+9n3khpw7fuJvlvc0d2nvkyHNX1HME7O0zqZ2nXWjpVUnrT7pwHYya9H7e4RmrqqPvlbtnos+GK6awwlB9c6ZlRs1j04uOtxi35jcDxvzWzvMOdE7OTSvEWhjcicdMdZe/FvOOZmVmg+md9U833LVpJU++LwjuaymmXHPOSevh6LnRnpyxnMnX9LnshVf/nNiJzKj+pb0JscFn+Fz9InEqofxY+kJT8Y/NdVHxt8sM+KnGQa8LlpILN3XRHwnfvOX5D1r/IozL6+LGh2oPlu+4mPrmWusaM114AT46XLlmYEv7ImJ55MEWc9pbV80lnWlE4tt+fgxMSPczfP99pLJYcltxqvIf3FEVNfky6Bkj4y/2Xsu+mA5J/0wHcczdk0u8eq8wOgTkyEwrxWPiezvmlDeB7DyOHeaVNdzvkYaLs3g6pCy62h55gAAEABJREFU+LgrF42xnsSAPpggdn02fz/ISUdmUHSY1/rOxJaJJ3Nvjcs0943J7cbc+kfG/0HLfTiQlX/96ZnX9aT3yPiYsOP3nk2LJ3HQGQz5Qt6bzOfOq+5Nc4bIUcIl8p4yFc1+0FXo4RFtVHP5W6xqtq5u/XevMxPpnIe9uA1r95pDXeas14jA8VaGM5V9zUgy1DAzO0Lrn42VSVHiMUqYn25eJzMTA7QQw2FRvnyR7M91OOVo5NTMDI5pPlNSQ0HnHJlcdEiSE9aMxA6ay614YtjS7PisOOQ75MAeir4hZ5BkT74nrzlE9jh+MiQSygFxy55LPqvBBBiVwrhhcwgWJUyKg+V9Sf4rcwq1gNIMzogjmZckhzRKbZiZIU3NLE0k+a+25lNCK7PbspFcph1jmz6R+mrIIPaoZZveeZiZisNs5OkOd5oiVhsp+SXyZvXsIeV49GfnLuTqDfO+MTQJwrySxH/QTr2cU50p+GDOzMyql47k0JZxFhU9/5bUpLnzaQpXKKKtSY8xJWEKWMSiD5ZzSRBZuSud2GaZFf/EOZPXcbwLY9dMnBXnlC8+xaxXDYKTOvSNnEc4Qarj4XIhvJyT7FfOHTofP9wscvkdllG7Jfew+Q5Hzv5CcjZ5zH5nm5VwNrJSNyms202Knk1aQrpkGsaC1FzQW9xS3WH8WO+EU7KxpE2fuBrtITnx+JZqxuJhYymtYZzQtpx0iGNbLCw82FbzjcnFLLF2E49RHoKqk86hie6cqhQ1jibHkthYkJU8xkJ0dbNcdqvLpjyhyRpxNCTR7AqT+qCUkPI0j7MTh6Vc7I0JSQTrWLaVx36jRu9MlUa9kd5Wn0ikehh/LENsi4VdUCKOSTekR1J2S0Pf01MD60Gn2uKxcg9ZumeSyQ8Vmt0JXlA8Jg7YHcACLr1U9y2wc5xeiIrwmzFTyVMa1n0bkfikg90s45vf7EqiMUr8xtWyhBmL5pseMsowK7RsR0B+zxsXQ4gRAdYAlDIj8TTYlsVv4y12PBK2ZWMrMntyxI751iSGaeU5XQ9Li5YRMTn+Q/H9eEiNP9DLmrd1onhMXokP8Y0J+0XSmzoNXT4IYXrI0SfzyvnI+GP6AaYGM8YwaXipnWw3qjZKiKxFwhG50ovW0ldMbFmK7OXbnnlOGNtI2DeWr1Fy35jcnV32zlmPYWpi1eZeiX9jcmM5l9flb0zuzvyQk/MXJndruQe9HnYWPnwk9sAfPsr8c0aMv/+7fozeybzkMdvK/7aU/YXkbPKYvfgY2uu8/b8wYmZzJ1JTHdIf/wHTG256J7nGYc6Jv3Nm0OvG0cmZ17QzseiQ107uQW676yfXOfYVMyfxMzPDJt5/xsntXOexy5xbJqd4qQu/2NZzIn1oXo0MN8t7bjOrMe4Saki8+Wpqbtmpyc4tj/p1bqIxm/lU5v280o2n5s4Ova2tziSM+7MnUnP1nKe8hmTfNOc0843kctZet+krSrLN+TrRElorLslS7SGVmzbKUveSWY66JbXJ+ZO9c+PJSQ9D6Y0efWDOwx6YsTOlpYcWWuIKJ+ash7TilqotaOxARR9s09+Y3A+YU7P9HYCb5jTu8Eh2kVz/rpdUHUmVnY7Eb0hN/2a1LnOp1WLj9aMvjDfGnOcT6a9epF27WVKNjfOUxIEmaWfnZHMeplpilpKnJx5ZqRqVVfNkRUZKr23ZmLy0eEZ77ikzzclbD2hbflh5bHI4D1uGthcfWpSghSwtvdEv/RifGY9EYSNQTAhsiyVpMX4MqQ/KKWP/wmbJX1I8JgPYO3+52fWuGzCpJG5JonlIaXsuaE8+OeyspKV9Jj0Wz4lEqof4abKjJftACf0y8Uy6ccla+kBJKGzjUt29xYabPpFc9TA+loG2xcJMMsv4i/JG4xphKJ4hjUaJ6JmJqA8lb1yVmoSNZi1tYLEdTFpaKsWTHvDSERit7G9rC36ykc7Cg5a11hvJNb5TWlr6IIGUJfEi8xofxh8Tj+uru6UzCbCUWdf0ylHAwo/+YtKqEQ8NLixDja6bDWv8xBWxTFSyQ3+hRDLrRFkSvYG6SVf8/N8AzMeC4hlunzz2U0Q+lyyT221q84FlYsiUBbdsctvSGP/I+Ju95RLOYNhPS2EqJrR/ulk9uV4LvyTxSZKND/Ezs/NxPvk6JqXtYmM1EeaMxdWd93HXJKPzXu4xztn0B8mlbjsLGTeAzdyTs3KpnpeqlrOxVpwxqYnemdgYoC17yg+kgfUWJJ/g0QhdDyBBHQvnekwS+50oZOW96TjiLCoI1uF9Lhn1zjYQ30kbi072xIs9u+LMS5hZ1SeSqyaTFf+OzCDd2e9MkEkBxoDU4gH2o/5S1TLyJ/Kaqof4OZuhvH0RnJBA3W4JUAxWEU7iGN4k8O40qW1tJbueQM5L7IqJbXZZkyC3mFG5YiJpCTc7p3lPmjiSCprYySSOx2+u420z871yaX4DnO+YlIga4ccVzxNdH/I9VvHTs8WjKaODGQxsLgHsSRR0kZIyAHtiIvBUHvqeCAKZaSj0ovobd76QB9L1fKZKecwWA1Lmimf4DH8vk9T614zXTGJZ22FlN6JHxh/LLOHfMq3J8/VODW7KY8+D/9K8V40PSTzT943khG3v2Cc5W8uAnmybqX3JcZ42xv80pfY5cbi0eIhlYPNIFl8+duYljlWH1OQCzxPprx7ir/xLi1jsqTx5g46MP7YKOPiLTs2dpS25nQhWB27MC7i1vRGnDXCtqm5oyDqNXZp/uuLwhrHIRxNArH/nJYTOCGKAf3TedILYilI//pVO7GQIFjNpYj35Oi+93vNqAmHegkW+TtQJe+br9JUMpeYZ7Fx3TOhJLNTwQzO7uVuKYdz1eUPCSm7n1Oa8xtHJRe9M7M5SlNxwmwGfmfFMHIOs092eDeS9S35Iz3Ne2zUZQQ0dvIx17vNDp2aZmPWkOLPCd73iOTuzFhuj77120x/MfEwc8Py4S+bmLkdyTute1K7Fs2pF7Kk8Lx11sn5vJHJJ+hL/atNLqVr3ppFKbieCpQQ3Kk9ey6KSw56YmHnmvBf0rjiaGkXvlJaWRCxfijMpbhyKc+MPadDzoJ9ifnIbaXnumlz1IiX04uM8iYNqyn+ceqr1l+R7WeNHioce9py8nZsZDc09TjqxWApMb/wTE9uMouaH2wEnUlA9jB/LoSHW8RnJ/R1NqZM3c7M8ryk+tofx18rXCY8E7XTisBNhYnby6ESjRBHH8ZZkrskQNfZEJ1E++ZlpaXa+Zz8pYA45nOonnZFPAjvjY1mN44RALy4vc7kE8WhUhkTtXF2VjaMprb4iacqyZyxuiiIXOQGBT6YFHyTd2JHxx9Ia95YkWLw5Mx6Ry27WXmIX3P79m1RsquLWNn3mekU5rHHOaeSDU0FRz9nIZErXdYkhl4+TODjpzE7ZmUe1zklNvTrkTyRTfUUSWTk8zNfig8xrPOwNs3UYpfhrJ4D/C2svHSfnpuXI+LuRrD8EfYNOjMBmJN5hbcFPrkj2ZX11uL9Iaubt6EvO9XaNU/2NyY3lojlvjYyXke9MbIxC1uEtmNp1KHGyWdE7qamGPfAXSA2t7OvMOC/98hrP3Di8noXkscbDRN+YHCEum+TVIXuc31csf9vtfNdEDe1o7Mj4u00tJUoMWVZHYPGB3rjKX8HlmTJT7WtaK36iRDBrkVxE5+OfSCLawzTYVbItya8/aEujj4w/RgFLlOqanviBFNtmgGW/DCGLJzGgndKKD6WlJdjMPZnRqjdq11L9jEmslHTgyRdPcgneMblbo785sTOApTyQJYJZB1q5VrZ7mnpTYkmWbUmWbeWx30gwkRiuwpd59JBeU2R7xUv8I+Nbso29UVox6YMyMTbaskcsSm/06AtaPFZmSBvxrD6N478YQSqBut0SEO1StuR2iocadiWmPO86sbEthazbWRFe3RfatoTZYdwHGyta0mO+S9lGKaWSrJGy1rPo6uwrX4/YogjGe4SYLNZDyzW0+tv2h4SSzW58rD2J49teOZn62EN+CLXFK/QgknkxmZyk7DE16+qHBPNbceNYfviN6mNP3HTgu3zIbxQ6MYs/8YdUygdNVt+tHdQMT73Eqo9kWmK28prtT/1oLHlymRy9c70HZOlPHi3mY/Eax39xeVulvXTOaH01sSPj70ZV/SGzc2+UrplZyR6o0XkNB+udMjsxuHRey+p9afrznmVOiOVsl1QdqdElc66Y2BiTd49O/Jx/MGZ3ys5Uke99h/F/wPKer1lrxkszZ3ttIZa67W6fTH8qIOem277TdJMz9+95ZWLLVnz5eU9T80lmM2Plfk//MfXQxoePoR0t5fvX4yH5YS0mJjT0sHmJknPclsk9fCB+9YE2eexh5kGWbKvnJcYMpPxBrxiNzb3TyWMXfKTW6jmk9dKJab0W640ePWQGS2ZjDX0mieYPzFkxmznEH0P7rD+/1vm7QI2PjD/2eOfUPo7ER9uLD/yYS/qH1X7I0T6SmuqQ14r/8DdyTvMv2qmPZm79xbxeO7mlzeyzveU0+kRi1cP4uzG3/g1znsjtzIzoA5M73ZFc9QU7i/g3Jrfb1N7dMeckd8u568cdE8dyTnJQJecNN/3BnIcJo1o6kt7qS3Je40ea8ge2aC9qo6KxW9KbXO6/M7HNTPRg5qhE4GPo4dIozrbNxOXn77Ie+JgeVD0kkWdJeuBisH9XZT2asOyHpNBBvBr/lMCGJDzHLPok0Wvxx7iSzIxOaXxp27JN/QNij6XtUMQOlC71QzyWWLuJx1Vid7ZF9geWgE0c39xrafFYDWtoqfqK4iGuMccxsaFLE8C2IYntRqr+FYnRxq6rkqYyMw5kUWfZflGWbUmWbeWx35ggNmGtrG7oxrNbPDSZiN1dGtpLA0L4Tsr44cGkFZNuSI+k7JaGLs/KUqLBB8k0fkUSWb1o8hEHMkvkLCfIvohgGS0eY1kb49/YVsLMVlwxsVujqznJXsO04ZKe9DdaosqYmHnmysgHxh9rfHxaZRujdqNGn0isOqQ2vtTd0gUTG6OAJcYrj20Zx84u2TDrRE8cyimSPRQPPkoEtYgrHgQLRysuwXPEPmtVE9spnmigYXK42kmuGmbFh0nf/G8A8glmPkXkU8f16fpoYpvup4vVTIKU8kljPnY8avwkGmZjUdSVLW3hZpyCm51CkvFyzpkpSR7ObEojUnogXZQluPKj6clrQJFqQXnSqYnROBWojKaKAIueaGyrOZKCnrEzfT9ovGXthTmEEUHPz8aUAEuG8/FaupF7NPqN5HJGBuNSztSMQ7DQTKzGTaA+W1e3VYBLBSsOltreA3/jeyyp5CCn0suorGoc6lnEyRK7viMJil6v4aCZ3fjOjCLf0cP4Y50fP/NumbtgMzPzP22dwxhGUstRrelMcjsn11mJX+jksGYZSEVnbvrMNZgywlRyblqXTohAVgJXnGI6U4xqUYaOxiWanRExewQAABAASURBVMDCUVPe4M5xOK8e5PK0csLBTyzvzydTSmdW6hneuhMRrCe/9aV6bsN8YkvnOxwDmkkcQ7KTzo6hW86W+Zm1mBKSzKYq18PyW+LEU4wJzexnypCLIzgaL1n66Em+lihOvuumBnIEdVMTQfpZtoBTQvpYKTQRSk4rqQRuyTnNf2NyY51Tny64NH6Ws2HvJPRar2R79zvnPUtVmJoh7jM1J1JXPcRPSd8aQmcyJ3kKVhydmpNObLO83/GPjD/GrGf6bzm98948w9SWyWHxez5+Z70xMSyrZ+GEIF/m4ECGE3kyDyjnvchczhK5Z8uiJRGr3slrSx57igeyS/BTE1SeI+Pf2av2mYEpm9BzGCS16XW37U5vd6bwyb21M3Vr6IqjyYnnuRPBemJZ4Wbv+knPk+DzRO5QHa75z60G55ncc+Il/jcmtxsz6x8Zn9f0hDknpIYvrgJFE3+R86qH+K0Lx3nuZG7jB2Ye1nmpq58izn/Tqk5uDDR2wXXmOkfzHoWbPYml9xf5VF9Y5+H/CFMTo/P1fZbeDEp8/97NBRKupnjxsFNcdUsmJseQ178fEtuM7lPupTmaFY3h5aL1Mm/XXAqfETjJgqNeibQmcU1qGMmFWPi0rzr8LZ5Y7Hn42lfP10gn5muKpVZ58IPUvJMzGrolvcll1i1TsxnTjrXI3DO4ZZOzpTfuV85ZeT2Xd2JA4xckdL5HZiX4SWdGzhhzSOyT9Dc+xM8Z7cc/k25i4vWt+JvmDCc3ZKKW1osS2XvT9jiO1WI2xkpQffjeUb62XCvqmZpn/i6aM4ngGxPWridOwgsJa7U8ZVt5LAe1/FNBhjqvqAlzmcTyF/0ZyfZsdlXniGXoOrkPPlPWP8f4zzTGlj9lqcC2eg6jjpWjiFOblnq8GpoSyUw6qKkqr3WaqZmBtKeM+sRxGz+Qc7pSSI7OJr8yDWNpo6GrGzNezJkEWL3AG9ubbayvEf9EzqneyXRqmMzIDERHYBOmEsHeLMFP8uoaJxMejKGsyTfO/A8mNpZzMuYbk7uzzE5uJ3Or5zVk9hjhuRs11G/6k+v+FJNazUTSdKHnnGBl623beu9ROa9gHszsoEzuh42u1uY62yxirISJduSJ5Kp3pi+vCNIUL03XpJMaXholqY9+GcEsjO6kqWW9NI15D8iu2IdmVmLcbdWMzqzES2I7UxV9YHIcylpn4ORMBIu6o2YmQVabojLsjYS4T4J0x8OlHq9zP0gVZ6Sr+fhjAYclhTGD9akzcIyTsihu2cPmGxw5+0jLdqKL+DYaY4kgJoVEodZTgXviSbwnR6dmbB2gNZsYCzELwdJYEP/QsuqSIMiSKPhkC2QPdWQ7lMeNq7ulMlt9NpZsy5Jsy5JsY+9M7MYk6slJB+KLxxJrN/EY5SEYpRc5v+qD4rFW+J2aOBSPX2ZZWd3qdpMSxC3j39leIx4EC0ctF8+HJsASF2Up1FEj7AZkhyl5o961+qyoJjtkRuNvtL3qSvyd9MX3DSWRFmld07KEGbtjcpaoWDOscNMfNBFMWOtOjEh+2CL0iUaZoKF4jGX5Qyd6Mo/aOU4vQi78aluNZB97fdDJLROPsaxFyxHsZ+Z3sJa9DEfWQ2ws77QtP7y0k7dsJPbAYS0ty8aEWUx6qOXVZkcTGE/97Xa0mUXWNWpK6yFhVs6I+WHJVmgprvLYD9nGHmJjPU7W345TQ5S49ZA+Ka+4dEuTiz1yVn3TJS1t2ZiwD0p24jeUyGPSBx8mJvNnsXdHJRJ7jH+ipWrrQPot9NBDSVxNPYfYoqsfJB7ErGhs+K5z1u9lmTuz2jdfm/x92HVimLHGh0tzg+qhwnU/+4bU9O/BLZPt6bz2RXNGpj2YGdqcI+rC38fosVevvfF8RuenrjY1SjR10cuqmHEmd6LW3HfF0dRU7ySTPNapJxKpPhJfWPrDkzG/ekgv09WvU+LV5G6ZuckfGX+sM/ChHU6tOGV03g2iqSBKvPsN6emUE4lUD/H7dS6ZA8397eTPmoicHGcucpvqA5MTemf8G3vvvdKJfRjzGrtiYnf29nouZ6Rm7JE5+N+Y3J1lfnIX1B5nPnnlv4biPbejLd3Ssk3eMjMQ30lN665oKfeQFz086cRiD2rCkyFYSuMVObO5nZlBIbPsxZ4fnZqSmo2UGF87raUPtCXMvmJSiQ+ZZVuZYVuqJndLq7Xc7cXExvzOzCLmA1MTvZMcWhghbaZozvmk5caH+NU/QltK3Ru166sXntidmcsnB7URP/M0xLct+84YQY5rSTILY5bNvI3knQJS1vqT73niiQKNKntqLaVc8eWEs0NDjPie90P2itmmbzQFlsihZdmYBDHhG24mybYekggdzOM/FqlJxMxOpW16iEBRETgRi8eKlqVbiid5oLIb7oFV6EtOY5B8yuLfkgRLudAtSTQPhcWHNn5nL9qLCcU2dU0zgSp6DHQikeohfvOlcBM/Mv4y8UwZdZLzx2+UEsU2Gv/GPDUnEkOLp2fhhwyRbUyY2bKGxFU3m3FN0gdKosbKYzlgXxSe+my6gs2eyNA+a0VfWpvZWMmD1pbZsBmFt1Z1N7Rlds0ebtqNZXfCqF8gaYrUa+CfKKtaZ6K0x1U1e46MvqETx25p5iR/oEfvtGwnKHbZlsVzx6SwrNbhvLg8rwmyTVZv9OhQQmBS2PJslqJVSjvFkxhoLFs1G2v/LwD7cWCK+pEiTsnHieHJJkfq1UMsK7ErJrbbVVFin8bnnvmgkk5yXd3QrM0NsXyqmWt+kEDjJ66GfpqaOJaDel5HJ78iyMlGRy2mosbG6luxuKas2dRyePxYij6Ykak5kb7qIX5mg97lzJVZp6Y++mU9L10J3TG5zbbh73qLX81I7Nb2RhyGsnBy0aJt8S7iDfHetAayqOSV1tnIqOoD23DUtLE675bMI9evEcz71npmJ7M0HsH6IeeQpuUQby9nQ9JZ5M96UgF5BuExgT110VEbE44eJpyuE+mrHsYfy10pX4nEIj6YAJYXk2NS85VNXm/bjG9MbjfG1M8VuQOybxjs3eF2nZQd5BYeHt6jFBF95ptdm57Kr6Jb0d8co7u6aXtWPvfIb3bDZPguCWjrtegYPhlJjkW6p7FljZGvZ+X78zMbvwZ/phh7yuw5YzGl9Z6SHc8lUhL3EQ/x3hGXzllU9DUSjEttZulI5THbjxhl6Q1CZuqD6tnskJmped6wveQu+ExPhyTPqNRc6IxPeHHeC2qrmfHE1zeSa77kHPh8LnZuNE5iYL6+yWMEKNWVkTrFN31mOjPnivlqJn7k6k60XeutEVdMYmdecgKNp2Y3OusfGf/GMoS/lwF/oYtt9s4Vvd4/ejlHWOPD+Lsxpj6vbthzuHNfC+nyXW9xZjd/JD7T2Nd5eTfzWhZXJme8NLHMZ2bj8W+NruYym76cwr2Jajsj/79SvrR4qrTy6kP3IrPirNfAvCtNrPkDc8/YFo8fe/I9IdRG0RT/G5PbLbehJ0js4K7QBDqTSJjQiQSqf4CMUGpPjMBoZ5+1iSsm9qOWcak9Mv7Y8y23adgMlPCgh8KPOZT4Mlt57nWyok48zpRfYGqW9Rw6MjuRl1aindkcf8GSd3i0VEV/Y3IxXk9nxN9tzpEm8sbOJrYzE6KtPM7M5KB2mnu7f/nNVJF7ka7qA6kxUjvjqY+JxXmntjiz6t9SvYe4m1JzYO5Olnx37hxyUmqY740JR+80nifyTk18yIxU6ERy1erZOefWKGnulk/OE/aNyW32VvuMxt6Y+yoPcfV9M3eNEYwOODVL2bhkvytC8VBJvcjUU57miWSkQlLbt4pqYiLJUp4nmhIBZVj0lj/+7Bg/sxf5+eHwL/pnOrlviJv2+fe/+/VOfLOVj1qnvXSnI2FnH0mYqQ1vZMTSzMEnjEMdPmv5yMSZNJoMawTZiCsjlcZgZ8Xa0hLvliRY8yZwHCKX3Swz48O8nxnVWpxd42fRGVBZ3LCvkIIhs+vdMldichY1GVpUM4ZVfctOp42G1NRLLPqKFLVmmDLcnAG2l34mNc2H9HYlsGucFWTHT+44jGgkr3Th20570zvHOc0kVj2Mj3u+NFMSB7fHpyf5sSXXnrsu7+09JJhIZt6SmuavyFnrWnQnT2E0aq5fL9GxdZOUrsyVTozBrDULnYbRYGYnTiJrCvt3HH/nFFOSYu5AIHmQIY3jv5NQV+5YZ3XivlUyi8GsxDEWoqtbdGpOnDGJ4Z5HE2RtvQ/bKZEuSS7xk0mtJXVJ8SQXDDXMGCGWNJ54Qt+TlFNpsXf7JGGC6nz8cLN2NeaVV4jdsh1kr5jYm3n0Tq/eXECSjR5DsJzgi+JJHhAUWWnXuFrPikuldOCKeCKLlqot25KwneKJBo1DZNwrI6vGxZO6iHcmdmFujL5htbXUD9NaVz/SDDFxS7JsS7JsK49tGcfOruVLv0CvPD2WZFuWZFv9c2T8WDKemhMTk0hniVKR3nXES9cjdKRHX9DisTJT2ohn9Wk8/piNw9IdRTK5W2YsNUFqyrVt0aW0sp0lCTZ/RWLNX1EiRWeWH8qTsvCxJPkoDa3XH/FEaWKSmJHIIxHjxfobWfzGKIF8I1SMtJaRN7maV+4hOX8osCqiZKM4pyH81lQ8FF/sD6n7OuMhygiQtXiM9gWlVT+kIv8lkm3qmfGwHrwpPtgjOTQFIqlLUtP4JR+rx8PLWeSIOzUPS/iCvqWl5t3ZxhdnLz70QaeO+M4HfQ9aHtClvdi5fsjMtDeSqx7G321quKsT81HjVx+ZGdEHpsbmLhPHt6Mt28R94GP0FR/UPcg/DvTooa5IrHGzW2Kv5Ww9pOoj49/Y1vONyWE2Zx3MRue8ob20eX9EfCd+dWn5lpaYYVnCjGnTOx9K3JwRKvxmoir5b0zu1ua87c6dRQyKmKGHS1vrTrBxaMs2cX9SXvFvTG7MQ5okfCvP2oXOelFaWjox5bvhsNT7SYsE0DYUNrTxxTO0l167Uqk8XzU9zZ9IpHoYfyxDbYuFOeOhXiYtX7qhZQkztjH+GIPHI4/nqYH1IEuUKU+4mUjY2SR7qCuaqFO02P1Cb3FIsQRt6qCG9qYfkvD5+6fEQm2aXPSVbTUn0lc9jI8ZE3+Hew706BM5w+R0S6rJyUdaS1+QWbbloYabLhPbzauWfeXedGcRu+VDdvKfJMFKfJl4HTnjTGvpA+X+IXHBh9TokJnVJ5Krfsg26Qd2QyWO3XJ6eb+UWaFST3xn/AfqIbFrahxuPfPvSpXWiWnD1pWt0KYbY6eUmB7qzy56yLYky7Ykv/7QmNCD7WGlUtqz8TBjxJii1NhGEUuvJHvpdRY+RY4lbro8NRtl2TEJR5ZkWw/xIFjajAj+UsbbNfVLWw98kbMtnSgea4WHGropIbXykibmOBYPG0snncC7iScxkNrgyEOqbjeKIEviAqw3kiFoX1Cihbh0T61nVUnhZlHLd+PijHiSVPAzAAAQAElEQVR2d+Q76UjOVyQm0XMwaWlp6J0yMTaPbepM8aQCpM5HSlxFeU6kprrMJuqGCrGhh1SwrD5txtuIe7umJWNas/WcSFH1MD5mR9M1tNEjgSIvmSA21fpkIiZuiSGWD8RFE84eofqr5IvvldMViTU+jL9bjkj8yPjq07PxQqBPWspKYqdlm7g/KR5yBiS1qDP1erwyBIxlvZFZSs0tJSWXtp2S0JHKg1+UbCxRkPz6LwD5BHH/RBO/n1zeUnx4yEeIrFV31iS7smVEuD6B5LPO9CDw0lSvM/DuyYQMonfd8V0zjVz7D0xt2qgmlZplu+bM1nywFUSHzKSTGdEYQwmhEx1NoLN2kkvdj1jeidRdMJdgUoBlOOctb3Y0vey9zy2pyf0oyqKMqYyLIIVmVYc4rOQ4hIVgkWHRR6S5I+NvdhiY6oazMWPTuMzqYiOaAH2sG00ByddrOGhmN74zI5g57ycgQwyHLq7+yr00scynMrN+P2N2ehm2+qIP1pnoEzmvehh/s8yKD9sFWwWXzgshwnm8mKyEDySRlfqdqa+g7o2cRZB94njR21CiORDLQrHitSxOzhk2FT2W9yOzfi8ya9Vzg8ypZmNFmt8gh2QzGvDauEzOjpdgmBnh0inbKogygEUq/sotzSGsVrI985vhctUIzfdN0bUsudQ/V4QgipVvsFijew2/eSZFKWUJUoBWBmJPTHxHbo84jypxXuufaExY9FeKudQJ8lZJO/HaDLUeKjs4NLmQN4WOJ7/9xuag5pJ/s9Y+tWrhps8kwcqMjOu7EB2x89kz25c41rqQM7lkz1gUzzNu2deYGkLpp2XlqlvyXVNy6tn0Tt6VzOKGrQuT2/ie+/9xdjZqbuPIDgX8/u/sPUBRsiRL7swqLJ5C/ZFyMj253fPtvdOJ3djcnWErN9q8a2KLnNP4TpG38pg/HyW5ctdRmiizW32hd23mUUtvYlr0zudca6XpF88+U+ezpdEStVaezP+myTd65rpLz+MMHcwH/xjf/ZycmkfOedn1q6YzdP6zhNzPSb7mVXNk/M1o4n3S5xCpxU07c4jvxM9iQmef6dya+IHpZ6Yx4d/Rp7j6eU/s47dXmpx40sNprYOTNwmjvAiW0s546pOqOH8xNTEzI9Siban+YhB9S82T3GaJxH/kXTKxze4aE1uWsriQpVxNeRAsVcfBWMrTV8K557st/AZr8tFvqt/av0bmNwL7pZOL0cSil8M/WspsQnDl5jdZqcm/c8P8Qbjlz7PFw0z2vkMp5qpP5+HtzLnMy1mtv+jGE9uM3sZ+Mbnd3ss7Mv4/Ws493G9ehN58eI0zPj6WzzTvsNVsOp9n4jvTh81n8Kb8zZD3on4z54iHe+Eqn0WY2eFoZjW/GH+znBsfTi0jqum2ONsYsdPXEmLVoXiVKxMjnH8vMzd/FyPSfz2fiOhn4jgYtWLuG/fNqW+YpjCj3sQSCva/J71zToxIixJYWhPbw3WYAFkZTQW17HShqSeNZOETZMc/1iyfAZNbOzq/f3nXzVqZGeRYSGrRHJS1NIGsFNwxp5Ojc+rvNLHmQ2ZQ2JWNVt6IICu6B8cnwSKEYCW+6dx/NAmCP3WmUwNooR6n9TvnZhzE7RosU9NqelMxmkj0T2NS83ckxnTSvUu56RN74qpZfvIxmhrZeZjZPDo5ropcMyb2pCli0ZC+KWJ/0p/PiKYsAplfoOmLy6wBmkUCyc0T/0fLZ85FZjgzqjMFH8xICjKOoo9OMvGQJKeSzk7jnSaW5s5vCbWLjEnqYJ/ctEUfjIbMIUJP92+mZrOcE//EXpdoyIzkOIw1s3B6xh+kmJX+MURnfpNz+lmFHIZPBzuaM9hpSZzonSaW+1DEog6NQ1vqGVN9ZPymlwO4WcqIsphR/c4PLPjqy1dh+4k0k2NJbFRBzYNgSd2k4UlIE5ROTM2yILkbeotbqrsYP8Z1JJySjSVt+sRptBfJicePVDMWDxtLaQ3jhLblpEMc22Jh4cG2ml9MLmaJtZt4jPIiqDrpHJrozlWVosbR5FgSGwuyksdYiK5ulstuddmUJzRZI46GJJpdYVJflBJSnuZxduKwlItdmJBEsI5lW3nsC7X0zlRpqQvpbfWJRKoX4y/LENtiYTeUiGPSA+mRlN3Sop/pVQPrQafa4rFyD1l6ZpLJLyo0uxO8oXhMHLA7gAUcPar7Fti5nF6IivCXUaLkT4zQHtZp5BLSCvtMZk0kOz+33fTO9JnN9GHGfWWD1BBUkRBGNF8UMbylbau/TAyPn2XLtswcdlmvZVHCH6bulRqjX4lj8VNxpCXKiIZ0ketPsAnmv/CL+cUAzLZE3LaGkvBZH0qy5vkwnombhD80c1FadElssTr+blZrfWT8J8us5L5pb/HkXvJ+xqtnVPdd0SfSV72I38/ijpzhY3xp22rcQ3soc3T8ExN7MGZTrsxyeu50YjfWOx96Ni1eN7N2pgYbjZOVgkdatnvh3AshM/PIzNp1cstat/yt5k96zsq8P43PoTXQpg+e9QuZ+IGpyZ/9nS+pGjLD+DTpkfZ8FgfapsXEX6W9yCzbyix7I7nGwxXjLu0JkzsxNcs6A3/nmsF5Sg+0k39xl40vmbgw28SjF+lR4ieakKnzkJyxzudud9QW90uK742Wqi29iBn6ysSe7FobPba9kzrvJZeZ85q7R8ty6EWFlh75SkbSHV8Ss9zci7qXZMvRi1q0D/H4T3botbeel2bmYmow9exVQ4WIGbYWKtqW8O0nvkhbZhaOHGKPlCl7sZ9JkOWJsyMkmEj4sZdEXNyt5Kz6jzRl9OT+qTnQu06NZVuSZVuSZVviHNtnEhNm7JvWxBfpjacL7UStxuPv9iJkbJEzzD132/TOVasD4/+Dcbic2ZreTWvN3pkaTJhtyuZuiqZXtvJLT1SyL/oW0eIMAnjE6z+Qma090WlVH1yG6NGSSM1OzuHe4kyHy2zLjkmvjbKEGdvpeOrjxOl/Qb9Mn6T0iseNqjoxLH9nUuLUOmZLsmxMot8ytA0xS7gCy6w1FW1M2MbJ2NFYuFmq8FttdnyWlGmW4se0/BMrqPlFcsamyhK+saF4RolYzxGPMdZVK4HkfpKC5iEz2nNDe+WTw85KGu0z6bF4TiRSvYifJjtasg+U0B8Tz0o3LlmjD5SEwjaO6u4ttrjpE8lVL8bHMtC2WJhJZhl/KG80rhGG4lmk0SgRPTMR9aHkwqnUStho1mgDi+1g0mipFE96wEdHYLSyX9YW/GYjnYUHLWvWheQa3ymNlr5IIGVJfMi8xhfjLxOP66u7pTMJsJRZ9/TkKGDhR/8waWrEQ4MLy1BL182GNX7iRCwTlezQPyiRzDpRlkRvoG7SPUmymtzYwghr/gtAvhvY7yhuzLcKd9N8x7DfNMwWjWUtmbbInRXbdleU2Gapi79Yl62rWxLcoWs2wjkrV0yyJFaS+CbJxhfx2/fIzzEpaRcbq4kwZwz5LizD8h3aXZOMzme6x6jZ9BfJpW47Cxk3gM08k7NyqZ6XqpazsSbOmNRE70xsGaAte8oPpIF1CZJP8GiE7geQoI6Fcz8mif1OFLLy2XQccRYVBOvwOZeMurINxHfSxqKTPfFiz06ceQkzq/pEctVksuI/kRmkO/vKBJkUYAxILR5gP+ofVS0jfyLvVL2In7MZyscXwQkJ1O2WAMVginASx/BWAu9Jk9rWVrLrFch5id0xsc1uaxLkFmtUrphIWsLNJs2er10U4ZHis2GneyIEG6F5OBmSWREYRfR0z0+ccSjnsyPIqt8vkgh+Gj46bf0Z78xpioskH1vRN31vcjE6GqWKiGW7FJg8FXWYyz1EImcJf5g8BRFY/ys6KT+op3LIPj47Y6WQc2zL/hejo3WL0vRJsiWWSOtDj89uqbv/0771iCedontMPD4YLrlE9CGfTdUvkjOWz7Hd+OZj/GjNQ2zyI1XdCIEj4z8Ys8XttFM81DJLjWueatzwaHvNsQe/8cX4se2M+Lsxs/6R8ZflrLjtxbljYk+W2cntvJlB6P9ZvVo3uiGLP/Bd3UbzT3Ec/vyziEcTQMy/8xJCZwQxwD/HF50gNlHql3/WzG38QmYmMmfh0cTOGRQLLzo1MEHcHrBzyqjEoYY1eWSCTIiH28xiotFh0vGH482eQT1nUtkTupBaVu7GcPII1q4T7BCCJe1XpoYwzd1/b8xpweJhViPVeLBvh7vdZT5jTiGXIz+6A1sWL+kPOwX5i8mNdS5bZiSCy8LjHuw9A7dkaNnaBrlbqvFTi8uqOLMq8VYx5i9mLmWsnAX2wK1mNEdMzdXvP6eZwNeO5E6aWPRPW71B6+Kkb7Ez8XeuXL9GJI5ODt27Qy17h8w8k9do/EBqmKT3zijyBf+u/CJnUtt6ZoU5I9RFv9/MSWwjs967Jlc9VGoyd3HTSgz7J9LbultyTuNH8i6Jcaf9vPg574nJxZoXDzPYlZj+eLaeE+mvXowf6zxiRyKNnr8j4PEv2vwO5b9A5K3IvLHjHZKN3piq6I2JMyddVnb16HfyBHauf6beDSTJP6v4Ik4sXzuA+iynMSZGTmXb6AhNJvxYepkGcqd0JBcmuphhmbBYoE+ktPqOTKc8e4bjpihymJOaIHPPVRu0ps5nY0zFI0mw+PDWeEQuu1ma498wn2fCm9G5ueWmz5w3ymGNM7uRL64KinrORiZTOtclhhwfJ3Fw0pmdsjOPas5JTb065E8kU31HElk5PMzvwReZ13jYG2brMErxZyeA/8faS5eTc9NyZPzdSNZfBP2ATozA1ki8w9qC35xI9rG+He6fpGZ9HH3lXG/XONW/mNyyXDTnzch4GXllYssoZB0+glU7hxInmxW9k5pq2AP/IDW0ss+ZcT764zWeuXF4n0HyWONhohcmR4jLJnl3yCFOIatFG5ut0Ms2Ejsy/m5JJ78I1BwOYXbpgSk7JqfMlFvqfkNCJjfLKYt7JuEEOx//RBLRXkyjXSXbkvz5hba09JHxl1HAEqW6p1f8QIptM8CyP4aQxZMY0E5p4ovSaAk280xmtOpC7VqqnzGJlZKeKJ7kZLUm21Un9mj0Nyd2GlnKA1kimHWglWtle6apNyWWZNmWZNlWHvtCgonEcBV+zEsv0muKbE+8xD8yviXb2IXSxKQvysTYaMseMZQu9NI3tHiszJA24ll9Gsf/MIJUAnW7JSDapWzJ7RQPNexKTHmuOrFlWwpZt7MiPN032raE2WHcAyVSaOlA9Ul5HMvBvkfZPmtUI43z09rSIsyykGKXzY69TAqyViz6ahaT5Jfk/HL4kstuMhWvWIusLYcnEbcM3V3sW/6FY1uvlyXol6S62XCJCXMS2JUiFrNM8d4chSYmHi/iPq+tZnHrKYl9kUmJNZXtWyedi5QrDTTa35RJm91/kyFO5aIW7UaRMP5urxVbzO8Jn50fmX5qdWBqo+8s5yS+89J7d1Ziu61ziP+IkAAAEABJREFU0p9YZ20zyFVfmNhuq3a/Y/TBOhO9M7OiD+zZ6D/4Sj7nLH4084jnv8DI55p/Hj4cj+mp6K1TPZqdWdWPZBo5c/+eVyY2NvHxc35mfTN3wJjTvPC/jBmNXZjzcnOYrplNza6J4n/utt6Js2xyzLQhZsNN7+RGjR+Y87BUcxKV5HbN/PrDnkuFHY19kd7EuKOd/EVnVnI3zLvSwXR6srduItknmltGbZwbRzVPzzeJNL6Ib6zncccw7xVmcn0xkdxV5zSmcPt41NS7MrllOSc1O1cts1tREoP7Wfi5g504VYv2aPvK1HCrnEHOfzL9nEZt/n1g478weKuTezTJzS36jsQaX4y/m2UnbjEG35gwjyb4oiBnDEXc8ksfvjx6p5a+oa0XvfaZr6OOv5t6zsu6J7Oae+Sc86LolZoTyeWcxKBLzlnc9Bct7iI+oxvSyyi9bukVP1Jyarlb+Fr0RiePPdK9h31k/AfL3NTC16JN7VHj5/yX59wz3fNEgW1JL/TrQqNN3FAyv8QzzM4/L8ReWEZs802NCFj8KiUbX9ILpr5fI/D9smqGJlMzdZoeh8Slg7YsybZe4kGwtBkR/ChdaNmWZNmYMDhaPBdtaaW/KR7yWuY4Jrbo0gSwbUhiu5Gqf0ditLHrrqSpzIwDWdRZtj+UZVuSZVt57AsTxFZYk9UD3Xh2i4cmE7G7S4v2aEAI30kZPzyYNDHpgfRIym5p0eVZWUo0+CKZxu9IIqsXTT7iQGaJnOUE2YcIltHiMZa1Mf6DbSXMbMUdE3s0upqT7DVsw4WTtqw8/kFTYPKWaLJ8IG71gZMWpQmW8ce89KLuSKzxMCP+YmqW+UPx2GaSZFt5bJh1oidPDE8IlofiafxIiWy3UhotwXPEPmtVE9spnmigxeRwtZNcNcyKD5OWEKxw18pjRc9/Ach3FOe77HxnE7/fWVwMRtNUsZhvIMbyncsHTnmSY0znG5HZ0STjZfaZKUkertmURqT0QLooS3DyS9OTd0GRakF50qmJ0bgqUBlNFQEWPdHYVnMkBT1jZ/r+0frxUQtzCCOCnp8tmcYiqIkGqETnPuz0RJPlXl+aWO5HURbp1DGl8fBjUxfNvK5uCdAHOHkNQZOLPhozSVC4ckHykFMnRXaF0ETJZea03mkKSM7dkj9oBjW+MyPJc8bE0fGX9Zz4mffIOYOdcvbUfhlzG7uwM4ntTH/0D+buWKsyE3/unp68y5EzmDLKE4+uy8ZKgpb235HZvBR7kzvpZDGPcTjdb0lbkzuXw7n1YObH5g5EV2zTZ3JK84sMb/5EBCtlVHFnBIvJ3T+Ml3fAKGanPDtGih3NSi56Z2IZ1YpcHeOnvPyoOXehDE0uPZT1Avxkmwgu+4q3diLdUyq5K+j/d9C9lrhyLueUbKzMoJmEZM4Xz1TiHBanorIzkIZ4aZqWUYRZdFPy7gVSgY6/LO+m+uLhLm+Q9YvJ7ca8+qs3F7jod2PJU8vs6hMRrHf6Qiyrko2Vi/MuRBGssyaQXjBxnOqSz+KLiS1jaj5z1Pwef2lGMowRK49OzVyFWDRGAQudSdEHph8jySKOnzMRLLpOOoNTswgo4kSclIIIKjgkiyCx6p1RiX+Yylgi4WapGp/mDA5+2nSkp56zY7CzYXL84WXaiieG5c9//qidyFn54wE0ZEr/mByYpNA7mVv9YbKxnB3uxqz6J1JVHZKN3/uhMzf6RGqqH5jcbmsGd53q6DFCyrtvt970N+nkPulKfT/LaIyMqsWUamm0tFPpZGO1Hm6Rq544szIvxszGbthePpuc09/H1jO8MbpCYo+/j1ueGqrZ59zOrbrT58o5lxizUp27hPmcdibH/XOPxutzSphzfpLZqeG16MCLPlqi0d+khfrEx7aqUb0d+a3qgSkjxZcEdibcaWLN/2APaj4fBqP6YTBv+wBPpKY6pDZ+cOE7+t1EBvWIbA2xsYjn6zw1nDd3vNOc03xIC37nhGntoMQRrMxJKESm9GP0TI5zSL5vNbnGw8y9MrEH60xyO1cvn8Wbg98H5lLViWHCUvNN5r3Vp3n8Z958Rq1fcc4Q76ZFUgwnJ57G4a/VBgp2fnobyow4b+dfQzO7sXwO1JJ7V5PamXn8qX+T1B3Js5rOvfEdWsr/Edp/pvEzTmxvzVlhLvFWzmIujBaBzMq/UxOtEWBN+uMsnf7MpDLnMIAR5NCchcxCU4fX3EZEqnJWs8zu1xi469TumkumB8vAFY6b8m/S25VCenJWin4yDcvSNoM5NzFmfDSxFCR2w4Ry1mZ9R4InMrN6J9OpYTJtGYyOwFaYSgR7swS/yds1TiY8GENZK98487+Y2LKckzG/mNyTZXZyO5lbvd4hs5cRXnejhvpNf3PuTzGpaSaSphu9zgkmW2/b5rNH5byCeTCzgzK5fza6WpvrbLOIsRIm2pEnkqvemb68EaQpXpruSSc1vBolqY/+GMEsjO6kqWV9NI35DMhO7EszKzHuNjVLZ1biJbGdqYo+MDkOZc0ZODkTwaLuqJlJkNWmqAy7kBD3SZDueLjU43XuF6nijHQ1H39ZwGFJYcxgfesMXMZJWRS3LBznc0ZjFOWsl81XRMzeyKD6Q6LK10jlqcA58SSuyaVTsyyzMxC6pGRx1yaGsdRUHIyWg7aqdUdLjS/iV5fjice7Vj2Lh42lzB5aTpjAThzbYmHhD7v2VksWDxurfkgE35gwK4/xTsyhxGwTtmwvAlkjr9SKQ/H4Y5aV1a1uNylB3DL+k+014kGwcNRy8XxpAixxUZZCHTXCbkB2mJILddXqM1Gt7CIzGr/Q9tSV+Dvpi+8HSiIt0rqnZQkz9sTkLFExM6xw0180EUxY606MSH6xRegTjTJBQ/EYy/KXTvRkXmrncnoRcuFP22ok+9xrb1p9LlKT9YGm7rVrvnihjbZEs2WYtfEVIXvpnYTxWSIjflg8RJifBbu0PsQnnp8250w7OvZS9vZIy9/odOj1osKSXxIFcnxZtiVZJmGHjpQdurShMNifkVP7qq6SN52TqLGtF2Z/07aE+fUqRe9HE2v8jvQl93qgE8du6PSYmclBO3XRYyYm7ER6qk+kr3oRX5h90cTEXQ29KL9Y2CKC9dG25eROTOzBMju1OzOL2pzXODo+JmzuMbHR1on0aM16JDW5ox7JfL/4fX1R8iq1ay89tMP/YMo86k8kVr0Yf7dVK/MreUt4MYecf+aLqEkfSI24v73i+MKMiXPOtNz4kfjCbCk82ZzjzEmcXn+RmsbvSHVyzPbOxJbpQ6Um5yxuWqKG+IecU31DekXOtrTTso32EN+2EKxXKe6GYJ21mNHcTlNPjQ5MTuid8R8s56xeLzKQ9UK57HnUGYs/tFx9oaItPXLN5W6mRoteHJ2aMdlq7heTe7LMTe6G2uPbWeE6T5bSc0sTNXnL9t+kxqYOsy+kmyHZFZItlYfa6vixk0ggtgUfyAyJ3E7xRIvoUMnF3SmpWn0SjjO0viiTNrtvqBVfpMSJ+Kjxq+9o5Tz7yPjLdGVmEJNkL+pKcprHYDNc2VG60EsvUmM7RcSlbJG3FE9KgQ6MHE1wEzsTe7CEp5FqBAtHCSlP9E8jyRIXtuO8pPxznD/r0DB/T9ppPIylFxuLVvpmSXJ/7XQ8iWCWbOsly8wOBf1CL5PxTaaGL+mVGLSt/rIg9sIkERYh2RYh1ZcWfSA+NeyyLcnyCwttCSLZrUqm2U54dFxMWMKleKLB6BEewW4y/kHSZLMLdq54jGV9kQBLKXwkieahsPjQxu/MoT1MKLape5oJVNFjoBOJVC/iN18KN/Ej44+JZ5VRJzm/fKGUKLbR+A/mVXMiMbR4ehZ+yBDZxoSZLWuRuOpmM65J+kBJ1Fh5LAfsQ+Gpz6Yr2OwVWbTPWtG31mY2VvKgtWU2bI3Cm1XdDW2ZXWsPN+3Gsjth1B8kTZF6DfwTZVXrTJT2uKrWniOjH+jEsUeaOckf6KV3WrYTFLtsy+J5YlJYVutwPhzPM0G2yepCLx1KCEwKW57NUrRKaad4EgONZatmYyn6h7363cF8m3E38Q1Cvs3Iag7JNwuzEx986RUepDHekfG/je9JrpnkurqluXHUMA6WK+bsEwlUn0hx9SJ+BvU8pn8z2THSq3p0ZncKG4uPZLrz3dPWUhA/RpJF1YohOuubMztJqjMm7gOnYk5NX/THem66E3picpvllM0PN72TICsnZVxZJ8E72xtxyLNwpi3OD90Un9WM5w0nwMcVJzpkVGqYNe+KbgPc4uSyppp4BHbWzCPG8HZnVvPMSGY0HsH6IZWkaTnEmdEYJJ1Ffp3ZniSWxqWTPZok3ujs0SFBpkS1qg7xE8lUL8ZflrvSPonEIr6YAJaL57jU/GST99s24xeT240x9XNF7oDsBwZ7d7hdJ2UHucJ8Fgmipvus+bnuyiRORVe3ifcnykede2zWr5AIFi5V7Xm3h0MJdOoiySwSLBPE2BGpYkC9MBpB9ZsC5wswM0t820kKNxUczqIugdSLWkXDoL54EO9pQjDjDbp2p+ppo4PuNyZskQMbP/EtV1Pzpjb+E6X8AJ9538y98/vT+RESdW9sKJ7keXtib9QbAmrT0/g7Wj1DPHzk7Dprahov2Vj9MwY7H2ZWYqMTwHgv9cE/sWLdZfzscyft8WpmPJO5yWM9u6T/SOn8LlJ1ZvadpJ5XLeG/sSsTe7D3qj2RWPVi/CfL70VyJ765A8Z75PM8GzNTqzzUgO3uuH23Mhu2v+Mbwfr871xOoDrnYP0MmX0mTeRyxsSjsSxGNB7/0Shq7s074TDr6c9K3jPHz51E/bulfQfcUvq8IzHxfMWJZW13Czfb4h9tzhG2yNeEeP7F5Hajt/6i1PtZWvQ3pc95y6PqT69dvHNr4UfjVS/i5/7zWXp9houcotz3F8kZY1r3UH0mWndtPae+u2d2nZ6BB5Up0IuticbEs814JkUs815ihpXHeE9Mbixn1eOs8KNFPxFmOrkwkfBoW+wXk4tlTniydY60ohfmLGn9GQm5k4S28ux3Y7ZSW3ry+Hj8/mb3Il2NH9iT0TuFpz5e3pXa4syq/0j13NxNqeGOG3N3suS7c+eQk1LDfG9MOHqn8bwiV2rFF5mRCp1IrlqcTTY+d8t5vjLTEnukksF+MbnNOE+i/sj4N8bfU76jn17x5H/rz4u8jPIh9m8/zs6LqVH2fvW8MJ1bfkgbNer9sudz26bwMShV0fm745uq5vM1e7NU4CcHkh7LUe90Y6Vz1cmlB8vKrcVcSpRndHYiXC7nMoF/1bxblTNGr+o3xCZOBv94SGQ1ZWEmh1R2rY1sKu+M1DTgJA+Oaws9kgSLF5ijctGjZXY0nHdleDXli0S6MibOb/YNKVtkRr1HrnMY2vPLxMYYdL46AUZx28lnNi3o7MTqHaOJHzUDWrOYNG5mgp71RWqaD+ntSmDXOBNkx0/uOIRoZHnlVwQAABAASURBVG43/LHT3uzO5ZxmEqtejI97f3mmJQf2a8SPbfH42MjZc9fxjp8dka5ujHsgYZJzHfxcb9c5h1jnH9hTNk1xddlKvF9MjsGsnJUxIXLugPPRZLMS2Mlp1ZDaNJFi6IOmpvkDcbtWB/61Yumck7fZSWn1gcmlfCe5apgVfyeCxWW71ka2wcX4Yy/xRf5s1DT2QMJyNillynPSlhNj/zCeV+RCa+K/SI4i9Tz8cLN2N+bJK8Qe2Q6yd0zsYl56p6c3F5Bko5chWE7wQ/EkDwiKrLRrXM0zcamUDpyIV2RoqdqyLQnbKZ5o0DhExr010o3vpNiSEsQt49+YGxOPMaHgrAi0lI3QD1pz9SNNvYlbkmVbkmVbeWzLOHZ2jS/9QU+eHkuyLUuyrf46Mn4sGa+aExOTSGeJUpHedcRH1yN0pJe+ocVjZaa0Ec/q03j8ZTYOS08UyeQembHUBKkpZ9uiozTZzpIEm78jsebvKJGiMyt5Ca0+S160ZbJmN1TptUuiaVPlpndS0p/MhlQYnswZofwkN2aPZm9hSEghGyteLF86X+0TBSxJiYuHHL4EjWRNXvrQyq/+tJyD85NlAipfkohV29LBUKPFk7iIOA0HJvZoq1aL195qctCpyRn4gn5kzrZsS7JsS7JsS8ywfaaW3sl5qcNEzNCLorf6RLLVi/F3e9GS+GJmNReNVR+5anVgatBaNH5Md8xnkvgtOSdxzJgw24xJfFF3JNa42S2x19LLneqf+JKqb7j1/GJymG3pYDY6cxft0eY9RHwnfnVp+ZGWmGFZwoxp0ztfStycESr8ZaIq+V9M7tHWedudO4sYFDFDL4625k6wcWjLNnF/U574Lya3zIs0SfhWntmFzvpQGi2dmPLdcFjq/aQhAbQ93GJ2tDQ6GJ2w4mJ/kq9brT+RxurF+Mv4COX6nAc7/xV/GS2OfqRlU8vGwvfZmGkfYp2FhhTqOFtmDvHG4Ha3E00ROftIy7a0zkKwrNESIutASZZiOSsUM8OPpoAlZiq5cNc40XdGSomfKGW2MifxZbmyslW7braEdjLLtvRIRpMTs71T1EsmNnF9tK3E7WHPoc4ebcOTiZLEHtheco+kNznu1nMPnLslP6bkOPtMafSBFneSdMsESWVOXGa27kQS1VbulPnijkrsSktKzE8k0fyBuDIba4iDtkPmLNr32k7cyi/h29aHL9zoRS5no8uX9EVrfqkUz1Eb/SKzmW1UTMKV+Uzs+JYl2am0XEZbLwrsxDajxpJtbFE80XLrX+KxUB8Tj9UMcZLSMH1Y1RfFY9leDIyGWjT+slUmUjXHsXjYWDrpBK4mnsRAaoMjD6m63SiCLIkLsC4kQ9C+oUQLcemZmmeqpHCzqPHduDgjnt0deSUdyfmOxCR6DiaNlha9UybG5mWbOlM8qQCp85ESV1GeE6mpLrOJukWF2KIXqWBZfdqMtxH3ca2WjGnN1nMiRdWL8TE7mq5FG70k0JLflNR8NplfcY40ARO3xBDLB+KiCWePUP0p+eF7crojscYX4++WIxI/Mr769Gy8EOiblrKS2GnZJu5vioecAUkNdaY+jydDwFjWhcxSah4pKbm07ZSEjlQe/KJkY4mCyVtflCXM2M3/BqD4piHfHWT1O5+L+aZkNMmubPmGZNgc26bnu57ZaSYYL733ZAI1tFOS+qumizDJrCTL/HQgbQTQqRnbNQNb88VWEF1kNp3MiMYYSgid6NIEOmsnudT9i/XjpP6GuUQyjMVl70qEc4nQ0ntUcdYjyeV+FGdRxgxmRZBCs6pDHFZyOYJKgj0JRpG8NqVws0Mu1Q1nS9tO5lWHVOHnvGm90xSQ/LzDQTOz8Z25JjM6mrrwaJkTfSL11Yvx/9nWeRyVe9CWV/lY70XNiZxTvRh/MwY0CtsFz7qX7/xspFMWdzEXwU0ibsmEJ3JumqlIE6pNOWRpXKLZCXTVT1mczF0kRJ49MSyfR2fj/zOZNX0ZxaxqNlbGEM2oqCHB3H2zBOuveHR+lNsY77Ez+RoTS34CXUYfjQ5+tEyqo8jMlPXT3tywuURxqI43Fk0vl6XNmnvEpYpGdmbm3DEK0ESTo5chSydAFiTG0QxBax4mj9NkXAobZNYdifVa4bGHVjq69wByV73Fw8lRTt3snIuzxYezTz1JLt+qE4lUL+L3swqZnf9NnfZX40EqNXG05ozsjXPMx493rUlsWWctP3M2vXP1rs8qn1vO3dmem5pjPP6Nra49M5rLN7LIuY3vzBsS4X6tCMnlTh/N+zQOmdXP8kImaOLimZmJjTd79Bgl9E909sTr5RxyM4sIOqeeNLHqkFGnu540gln5bDuf9yoTTnxnThib/Pi3OzMafyTZ5LhbzkXpm40SX9RiejZ/53ajI+Nvlt74fFa8Tz6LeCFSQ2qY3aoQazwU1SfSVX0gNVQR6IRbJpMEJ4FUf9s1N5py5s+enm3SIiFWxSOTwPIlLqPumFhM/GaE70Xxl9Lx52smY/gaiS+OTM2JiWGJbUYDi54VR7AOmlkE5gxqMvNkW+zI+MtyTvqhFt+LuyZHiAYWs5Gczx9CnHd17hAdJrjYd49O339jzo69mRFqcfScpZ4tnmjOWDUEIvSOw8Y66wSwN5aiM9fdmT3xaOZXh4zCnz40Z6Suo7JddEIno7f6F5Pbbc7rGY1F/wf7uk/eh34+q84Mlynkcu/FTYsntYDfd/Y3/dh8BlfNZ0LuzV0nf9HMFjlKGMJdaI8OwolXkV88ogUEIIsa5iM/vegkcsaH1LGq+arwRQLvxKH+Yg/Lhr351wTn4SnvJZ435xTMIcUurqIy8Z5DTepq3Y4BPmOqT2F0ejslpUtTg6K++4dftdTn3Pbjh+h2wfn7a4aRA9GESY/O4I9OQVIPZHbrf5Eck+eWjGFaV7aeQz4rOrPqk2ARooGV+KZz39EkCP7UOZUaQAv1OK3fOTfjoB5LUZmaVtObitFEon8ak5q/IzGmk+YYpmbcpk8kVw0pZo8a2/TOw8xUZGZyEPk5h9iTpohFAzU5C0Hpk+4HR36RMry0BPAcyOfWYmb3puE/2qmXsdWcknbAWd2/mTCH0sKReSM8muKl+IvkGi/TQkVbskUf7ZNrOVvutVvOTewXk9usR6yZiVWv83iPmRu9ajL7H217p5mRwcxgZuMnMr86pA5/VVIajeLMZu9ILGdQzKIejUN5+jIssSPjN70csN6dKIv66geSo4j9rfzwROJbhKyhePhCzC5BVqk834Jogxcmtiw4Djpob3FP+9xh/KYSx5m4VeqObpO9SA0B9mjdMLExkllKa6txQtuyJNvYlYktk8jjS8+UZEmMUimV4jGeF0HVSacp0Z2rKkWNo8mxJDYWZCWPsRBd3SyX3eqyKU9oskYcDUk0u8KkviglpDzN4+zEYSkXuzAhiWAdy7by2Bdq6Z2p0lIX0tvqE4lUL8ZfliG2xcJuKBHHpAfSIym7pUU/06sG1oNOtcVj5R6y9Mwkk19UaHYneEPxmDhgdwALOHpU9y2wczm9EBXhL6NEyZ8YoT2sy0itZ8Je6UVmjZfd0qb7E+BoQrIIry9mo2WIbUzeTmDi8UZaITvsrpdc82v07FtUZBNZdIiV1othrXwJXzK0ISYeE7AtQy3a0Va1rpSUvARe8uXXFnkk57QnZE7/i8P6dMCrtqkmbh8Zf1nOT25n5pDTgcmhieBlH3sR88GqmfVN5jW+iG/Tidkb6cJHKZ+5uXOpxLHFyR91I2SPjP9gmStyv5jcjTkxfXq9tE1M691CLJ+QnXg97veL8z6tZuaQeeliRrR90PGX9TNavj019h9kbmfecvXyDq3pLGKwbwBRspuFuTsR7j15NDlH7yRTDUUfPh3qn9U7Taz5A9MZo1shpwyZVX0i2eqQjvjcBaV8Xjn3zNQs48zmdtK1em1qhE4Ozh17OmrjJ9pqer5JpPFF/JxpRzPnhuYdbPKcVH8n5yWnA5OL3kmu+obMbPQXk9tNsunwonSjiUnEMelCyxJm7EpimU0Gb3avml9M7skyJbkTHSV7UUNVr/OUJ3Epu5XHoiTOD1rKWoV2hewHioccWVGkjcqDYMXb7ao1HdJGZtV/pKTkMuhCmyBLyyLFc6Y1+kA5Vex31IovUsKKIC5li87MsBqnurTGX1R4sE3vZCQNlmRblv7ZxGN76iFStoHPJGZbBLPOFE9SQE8k55Us0YqW2C2xP1rSyR8Yt9eRVBJ4pKzmdCQ+ul+D+jWDr0FwvtK5Xio2HV/Ul8bDkMpcvTxEWDwl3voapdCmxpQO7Q+l+Dkfr3H4wiQhZQmzXuwvid3YHV/EydHELpt9M42fLq6rV+PiSVyyh3J86cSKhJJ8IDXGJmsJ39hQPKNEjKPUx9111Q0kl8QjSTQPMyb+De2VTw47K2m0z6TH4jmRSPUifprsaMk+UEJ/TDwr3bhkjT5QEgrbOKq7t9jipk8kV70YH8tA22JhJpll/KG80bhGGIpnkUajRPTMRNSHkgunUitho1mjDSy2g0mjpVI86QEfHYHRyn5ZW/CbjXQWHrSsWReSa3ynNFr6IoGUJfEh8xpfjL9MPK6v7pbOJMBSZt3Tk6OAhR/9w6SpEQ8NLixDLV03G9b4iROxTFSyQ/+gRDLrRFkSvYG6SfckyWpyYwsj7kw8iQPqXnwbkG8G8p1CVr/rmHj8X0xut7vixDZLYfzFumxd3ZLgDl2zEc698o3QJEtiJYlvkmx8Eb99j/wck5J2sbGaCHPGkO/CMizfod01yeh8XnuMmk1/kVzqtrOQcQPYzDM5K5fqealqORtr4oxJTfTOxJYB2rKn/EAaWJcg+QSPRuh+AAnqWDj3Y5LY70QhK59NxxFnUUGwDp9zyagr20B8J20sOtkTL/bsxJmXMLOqTyRXTSYr/hOZQbqzr0yQSQHGgNTiAfaj/lHVMvIn8k7Vi/g5m6F8fBGckEDdbglQDKYIJ3EMbyXwnjSpbW0lu16BnJfYHRPb7LYmQW6xRuWKiaQl3GzSfBYN3JEKmprZydwMTArOlzYEM7qzUcrnRh2++KJXrU0zjTj71CSemswizo+slf86J3k69G4uXk6aKC3EsxN/b0we48fZNiQcbB3955naDymIBp9hzOO80czg4pSk4j/Y1rHIjDaXxL4oKTFShw8kFxlLc3KP/CTHyz427z5+ho0eb8aRm5XgvPadJpZkrpnCko3FGKbisHP9Kcxn/NHtSDuWaPS9MYwZK5dRBDILEJ/AaOZwZiqr8XdOMWfhJA4i2s3GSiShtA8bmY3J4+yZdByMmZ9G4qwvndiTZXpyOxGs04yeneCd7Y04yYO1qroRgKzT2NG8YRzeg0U+mgCin2Fa8cHlM08pdSRmR+NnRW/20cxFZJ9cPHqYHW/OwiPJzlkU896k8YkQx8miiVUNp4xKHGKsBj+sR/5I5hFJ4Ralm5U4aG6Y8+MdQpXvE1McAAAQAElEQVQfzQRWL3bHFHYIyZL2K1NDOPcpfm7MaX7xOqua3E6K4xPqHZHlSSeIJQbO17kNUnWMx18WZMBPTjtfUeeVU4sZa2Bx01/MfKz/W5CMWv9dFl+p23hDiljbeWFmhoyhXvnXTFnNmObvSFVzt3SifxhnteKBOVPa7+P8+0tCZ/ZiaojPXYnjp04hs88UHyk1YOJxlqbWkdiH45kcYXYDf8gZQmVW2HMPWtxNqdkonl3jZyUHXZr7IZixaeML+ycyo3W3VGcbqHkc7pJzvKicE/8Xk4u1rh2oI+M/2NZzYCvRO+PHMjU8mniigXZG8Gq8E38wtFn+njQjSPDSHy1NXCo1z7si//S0WKOZS3r/Z6tfO94E+dq4/IV+GaGUPnIZUa+leOGaTRET2Imxx4/hUhcvdWHyYeYt5jCqclirEkY3vJFY9R3nkOwZno6yW+qJ1H9kWikMWlPns11TX5oAK/dvey56tEyKvuH8OzGJsYwZb/ZNn8ln1/Qis+t9MW9NZxa53G07r7LxDjpdPZHmcYadTvuR8RnQ6JwTVa8O+RPJVN+RRNYcNhOj8WZFMK8i5GLxi4ve4sk9GeOaynlx7pjYbhTVXwT9wE6MwLbZuJ+1Bb85kexjfRvcP0lNXjXX+iKBxn8xuWW5Z86bkfH4PWruyPjLKGQdPoLVM4cSJ5sVvZOaatgD/yA1tLLPmXE++uM1nrlxuPMgeazxMNELkyPEZZO8O+QQp5DVoo3NVuCFRyO03QXmxx5S/i9TvoCW4tk1flZyN0yZ9EmOZyKWut+QkMnNcsrinkk4wc7HP5FEtBfTaFfJtiR/fqEtLX1k/GUUsESp7ukVP5Bi2wyw7I8hZPEkBrRTmviiNFqCzTyTGa26ULuW6mdMYqWkJ4onuRQ8UMk9mnjaSAVkERAi64ZWrpXtmabPlFiSZVuSZVt57AsJJhLDVfgxL71IrymyPfES/8j4lmxjF0oTk74oE2OjLXvEULrQS9/Q4rEyQ9qIZ/VpHP/DCFIJ1O2WgGiXsiW3UzzUsCsx5bnqxJZtKWTdzorwdN9o2xJmh3EPlEihpQPVJ+VxJisNfctEY6IptLO/2hQPqZ2Il5OycG8s8dihRled2cSIv2JrUIG28iQTL4y2kq/n7DroBMxPj6ml6PWCXPKFeRlJxQ/baMvigeyS6UkEIlgvKfqnbTWLp15i1UdyYmK2vKjFTdvmWMu2JMu2JMu2pNc3iTV+S8uNLzIj2j5q/OrF+LvNeeaONnlm1X8kNanVgamNvpiiOzO1lqpf0hdfMjOVOSFWXZry5Bd1pFEm7zNRBCVoZgrqxJdGQ86ov9OT495KT/iPZvvUa2+ac5jldYbxhQ2tb1oiakzM+M0XJab8yPhj4kwfTZajdSR+9WL8L2NeYxd2FjGovBP04mjLidnSTss22sov4ds+a236teIHZj4mzFi4mdPXmCVoG2KPnLnibnLqLpoZSu6Gbpye5GR51+6Zlm/4Ipr4Ij0mkjM+fGn0IjXVJVXQHlIoG18YvGpzNzJkX1i8Oya2LLPTs3P1MLuzSmJQmQjtpUvmLCpk1jepaTy0hG/5B03W5C3bJU5p3+jEHi1t9LBmxtLgoyOw1IDz2oKWm5hdqHqca3ztXBkfSE7RO6XR0jetlGU70j7G42/GiJWzE7voVzT2SHqS679TU3fU+JmZHFS5aixt+otWrs/GwheW9pIZz7Tc/JFS5os7ipwXtdHJY48kwZLZWEOc6htmbnLQJg/bA+2l8XN+ZLnp0truWDraygxzfxxctCzbyuMMkfmVAcPsMRENx1DGJKU11S+c0LYsyTb2uhix12ZbzaLUWjr0ovcloTHxWGLtFmWlQsSSWaTPRKqWb1siVpxIPAsjrObxd4oHrWWOY2KLLk0A25oS241U/TsSo41ddyVNZWYcyKLOsv2hLNuSLNvKY1+YILbCmqwe6MazWzw0mYjdXVq0RwNC+E7K+OHBpIlJD6RHUnZLiy7PylKiwRfJNH5HElm9aPIRBzJL5CwnyD5EsIwWj7GsjfEfbCthZivumNij0dWcZK9hG25pWXm805GoD+N5IsyMp53S6AONv4ykKD2Yl7+oOxJrPGRWfKm7pRsmtowClnKmeGzLi0A2KutErziUJXL2onjwUWpcPAiWxMZSng8/XuP0hkqxeKqp2UksOULamFz0TimpmniSC0o2lkimPFQfa9N4RLIbSuaXeMJXvtnY7zT2m4TZyCQYN8Z3CbNO32Fc8ZQ13oJ815QEwXiZeU86qEnL5KNz5pVkGdc5R9KYnxSQJdVEedKpiXHOqkAxn50QOz4J1uqNzoRFEj1jJzkaJ/aHn1dJLWT46awIugOM4dREg4+ml1vQmjzZO00sd6Eoi/LUMaXx8GNTF828rm4J0Ac4eQ1Bk4s+GjNJULhyQfKQUydFdoXQRMll5rTeaQpIzt2SP2gGNb4zI8lzxsTR8Zf1nPiZ98g5g51y9tR+GXMbu7Azie1Mf/QP5u5YqzITf+6enrzLkTOYMsoTj67LxkqClvbfkdm8FHuTO+lkMY9xON1vSVuTO5fDufVg5sfmDkRXbNNnckrziwxv/kQEK2VUcWcEO5NxPneuR1GYGWHvkdoVFz+Vbo7mK7fZpNK2jCkEpjY/06VqzWpMyWM7ye+3ohE/P/Hm2FTMzHgJkHvDVL2zVTMLP7Mpo77iwBSNmVRqSkK9ncWXaxKLjFdudCI5gl09Z7zZexH6fzG53WirzymLXBbBWjrIPUucb3Je44v4dLOjKeYTQWaPxiUza+nU1O02x8et0ffFxJYxKJ8Bir7uF3Je5vc1k0enJzqW2SeummNPfIzBLPL4ORPByoCJIbI4IHqGkh2N5NgsdBaZLjZydLCvOFWj2Tkr0TUYpB5b8UE07RG4tLflnhSwGJSVJmobQA9xGu87MoRbjMbHYU8dbXijs0eHUx11rfroeKn7cNS3zp/75vgz/yHTq0Oi8fmH6L42eYy75r9QqZfao46/GzPrHxk/7wbbC6lJJDO/ySnUtSrEWhem70S6qw/EzScBqP54dzpnnIxZ1TfkVuKLC8bMfGZMHy2F+fzS+yfTh3Xen+xEqoY9R/g9H4d7chvl89mZXOI7OakaCov/SGYnx2gq8aKPlmj0N2nR3IMcZ7QKohofTVVi3G3798KJpLd3HPJW1GbGrqmpVnbyN8xZsWRDWljUM6v6RFLVIR3xuWPOy902br+vjeXM1Hwx05nBKE5jv9MN0xneVaU/8Q9Hfev5kkWWFHu/9HyTOzQfko1PI4v66B/GLfN1jIqp5cqj16yDpoBq4olhWan9JtNyONXN4z+T7uYfSJgx2Xswk8tuvGfZgogbY3ZrdmYUdfxms5PiD0Oc6EXhx96leO2p+WhmUPvG8MhnZ9Stzt9aJtG7t3R03P4Ri7OFDkMTyuc2NvOTHp1pByMx8dQR5+6EmJy7o/GaL6nZuXLRMZoSSW2q6oudeHReFgV6O9imRSom/KyZ1ZV51GZWin8yDcvSxild3Zjx4dxlSkmwMnvT7c22rO+IfyLF1TuZTg2TGZWB6AhshalEsDdL8Ju8XeNkwoMxlLXyjTP/i4ktyzkZ84vJPVlmJ7eTudXrHTJ7GeF1N2qo3/Q35/4Uk5pmImm60eucYLL1tm0+e1TOK5gHMzsok/tno6u1uc42ixgrYaIdeSK56p3pyxtBmuKl6Z50UsOrUZL66I8RzMLoTppa1kfTmM+A7MS+NLMS425Ts3RmJV4S25mq6AOT41DWnIGTMxEs6o6amQRZbYrKsAsJcZ8E6Y6HSz1e536RKs5IV/PxlwUclhTGDNa3zsBlnJRFccvCcT5nNEZRzwqxxKgIUBzSlf8NQOb2LwSP5Atqcj+LUrOs33bEh06P08zW1U0Jx1D1Kb2h1bjuaKnxRfzqcjzxeNeqZ/GwsZTZQ8sJE9iJY1ssLPxh195qyeJhY9UPieAbE2blMd6JOZSYbcKW7UUga+SVWnEoHn/MsrK61e0mJYhbxn+yvUY8CBaOWi6eL02AJS7KUqijRtgNyA5TcqGuWn0mqpVdZEbjF9qeuhJ/J33x/UBJpEVa97QsYcaemJwlKmaGFW76iyaCCWvdiRHJL7YIfaJRJmgoHmNZ/tKJnsxL7VxOL0Iu/GlbjWSfe+1Nq89FarL+QUs0WT4Qt/pA81Pc1GFNTbmWFFL1cSx+eXobq35ll219/1q1zaRu9EtSfsK8jhatRFRa/GpgGNc2SVZp2Y6Q+SX8D6XRkhjeuF4aennftKnA+l8WQqcXjqb/haH9mroPpfqvBzpx7JGWnbwPjP9gOYcGn0h/9WL8mC86sdz/yM4yZ2PJfWlmJOYj4z9YZqd2p5lNbWcvxseE+WCjpRMdrc7QmvlFauxsqbuj6XeSynkIiXNDMzPUYnX8fzVbW++H7llaZ3R+6i5mr7pFe7R95Iv26F98cd6Lupek14Ve+kh8YTknPBn91Yt8IFTKJ5KrviPVyTG7PWViy/Shkut9icFNS0vv5JzkMWPCdjKj+kTLtiTLNvCBr2pxR4Kssxazm9tp6qnRgclF7yRXHV4s5yQHvchA1gvlsuclj8V3afmOStzSI9dc7mZqtOjF0akZk63mfjG5J8vc5G6oPb6dFa7zZCk9tzRRk7dsX/ha+kBq3M/qJV8p+hNb9KIWq+PHmNN4/N1eUv0Hdja5nZZ4LzHLi0rOJpS60EKwoCzbkizbEj22zyQmzNg3rYkv0httHzV+9R1fshM/Mv4yzjT3n5nEtGqPTE30TmrQwsabvZpZ32Ru44v4xoTZpjzxBypxs5s670Swol8SUXG3DxN7sJyX2hM9reLB7bhHWmm1FxVij1QymDjVFyY3Jh5jKTjzRYhIPis8hTXLtsS/g7wZ2sywLe+0bOsliTIZIs9MbDeT20yylw8RrI+uZ2pkJV3PUoSNk4UJiyzFEw1Gj/AIdpPxD5Imm12wc8VjLOuLBFhK4SNJNA+FxYc2fmcO7WFCsU3d00ygih4DnUikehG/+VK4iR8Zf0w8q4w6yfnlC6VEsY3GfzCvmhOJocXTs/BDhsg2JsxsWYvEVTebcU3SB0qixspjOWAfCk99Nl3BZq/Ion3Wir61NrOxkgetLbNhaxTerOpuaMvsWnu4aTeW3Qmj/iBpitRr4J8oq1pnorTHVbX2HBn9QCeOPdLMSf5AL73Tsp2g2GVbFs8Tk8KyWofz4XieCbJNVhd66VBCYFLY8myWolVKO8WTGGgsWzUbS9E/TTwtpAqyhDfLytfNfldQefiuYMC3CIudo9Z+V5TYt23fcewBpD+aUdWL+DlrvhtK9VGTaPzEKbj9DmdHJs8cepDdE4lddWYn/mFvyTdVE2UGiZwTI8givmKIzv4mfesgquNNHd63nsicmr7oj/XcdCf0xOQ244yU7bbpnRSyclJruiXwZHsjDjUsnLb/xZbyWc0RvOEE+LjisDYW1QAAEABJREFURIeMSg3D5l3RbYBbnFzWVBOPwM6aecQY3u7Map4ZyYzGI1g/pJI0LYc4MxqDpLPIrzPbk8TSuHSyR5PEG509OiTIlKhW1SF+IpnqxfjLclfaJ5FYxBcTwHLxHJean2zyfttm/GJyuzGmfq7IHZD9wGDvDrfrpOwgV5jPIkHUdF80TRPJTkVXt+mo2w3NoPWTYNq2axDkbuxUUcMcHPYGw9aSJ8lqpEwBpWQSA432KyheSJYVL9l8UUXWzcw45bqTKBgtRlPZlQ1jYi4cL6Riasbp/m9bJ1C62AMjo7lpgMxxgbibEtt4JXdWYo/MFOYGqbllg2u71P6cTW3yJ2NM9SKY++HkPYBOZEZip7slZiIm8zETEXYis6pvKX6PtP0HNItUUyvuOP+1Q7SlzCW20Ucdf7dWoI6M/2DMtMTZnp5q/CPjP5l06Y3GJOKYNHOlL4rHB8NtT5kNm89An/j683j933iqJpf/fiR//j8Un/G7Z088Gst6a+L69VDU9HtqOYOBrOh3ycZ6k39DcddFLYK43++iPuf4mzkJHxl/LAfk3TZL5fiij5p3iP1icru9uW/qF7loPsvO5F37+3NlaqQ5T4L/ZuKZ2eLMt/KMfi+9mPPeZO9ImON75iOpyb0BdRkUb5j3yme42Xz2k2usLhurtTDdx7Pix7bev5kh7/WO2u/U+dKNTmys50j0YuJ5i3osn41E/I0tSvjRB5MmJj1TWjMXpdESZJb0zN6Dmp2r9i2eN2cKG/afv7f6Mfczw+/v04kIVj+bjbRU73z3PhnUfj6kKyllUfcGWY8kwcrdGMNIBCu6d0yQdyPR98io/Jk9MTUEPndEsOZO4q7qM/q99CKzGz+RXPU7x/bc3CXnfpHJjT3y3fNyt5xzz9RsJurjL75D7BeT2w2Hlc9vPhYEqy/CO31TPC2g/MqbG/PvoTc3FFYy8y2eMOWZAvM3Lko5Di+5zaaUqhahWAxgUdv1dfXkYuqZ6sPUD/kNyH/pm+75OyvVnDc6ZVQTqpdL4TdNoERzoZQXsyWZEElWvIlXTLKB6KORavzI+MtSGveRJFj7h5ALHi2zo+G8K8OqueEika6MifObfDYpyryQGY08cp3D0J5fJja2RjBtNOnzq5BpDLYW5rwYHVVnblWLacbleuxU3mlizYdM7Epg1zgTZMdPLtM2Eo1k+uDXTnvTO5ezzSqJHRmfUD+YNEefGIGlBuzrokfOnruOl08y3iJuvLzSI6lp/o4cPtejO3kKo1Hr+vUSXTY3Selk7nRiDGbNLHQalgZrduIkslbh/JljcjVcxZSkmDsQIHfSCWFZjcdZtiagtsyFzGIwK3GMhejqFp2aE9e4xHDnUjjVbKy995xcRSnYjNCqud41+sXXROn4HUjx8LWVveFQJ+0ljzRlJu5vEjKZWdYtCTd+YK8UTWJ8K8wAG1/YLVtB9o6JXcxL7/T0Mls8NnqZ7khN47eUrHlKNlYDH47nVTk0NWP2UDtJiRhLG+M/mXiSAylXtmo2VnViy47ajYnHmFBwVgRaykboB625+pGm3sQtybItybKtPLZlHDu7xpf+oCdPjyXZliXZVn8dGT+WjFfNiYlJpLNEqUjvOuKj6xE60kvf0OKxMlPaiGf1aTz+MhuHpSeKZHKPzFhqgtSUs23RUZpsZ0mCzd+RWPN3lEjRmZW8hFafJS/aMlmzG2rRi6Jp/LVveud0INUKoxG2xdrt89PhFZcpzLJaJyPM/jGRsPJYDtjP5MsnNUqcBEs9B+f1kggrP70uTVCSDWsUQDv8mOUUqQ/5Wzb4tNHf1OLtDHLE3bMoxq/7yNRISYvnTKaYoKyJw0gdaSK+jRBkkbMOxK9ejL+blXPsRS1W41cfmRnRB6ZGeVYc11jWF5nb+C0t22JjbZQQWUPxUENWCQ41D4I1fvaKbqgj4z9YwmJj6YnJYVyjJSmLVdcRj7Vp20sv6kihou8okcxSnlaxsZTg0HFlD3FY+NF3Jk1eeqYkSw/mFbfy2EZjUPEgSrYlWYNFLZoMhtTkD1o85FgSm2dj90ejKqCxzQ+tPLMrubpsLOW5Y2K74bCUi+3EQdtQ2KKN35lDezExbJTSoTy3mp7GTyRSvRh/WYbZFgtzxkJ9TBpfeqBlCTO2Mf4yBi+PPJ5XDawHWaJMecLNRMLOJtmLuqOJOkXD7psWj4kAdgcHy9jKlfjoQyDulgh/WYYlf2IEljlgWyNn134344lnkVn1HinZZmPtlJQQ9kUCU2aFKQxR1aWOeyuIPNCJY4+0Op+Nhf/RcvosewxHeAkeKCl58WyMi2U5G/bheJaJSvYdiTXuycd/MjlDpEfm7wbU6MDURu8khzamPWY84jk3ceidlqoX8avLF27ii/TY6PIlfdFyYuyhFhONiceb4fSvO+Fm/IUp4x2mDkFKtuVN+yUvexEfk2zLkmzL4lkES6s0e0w8X0zxnieLZpftqQ7yfkeNz/rkU7Os8eULerbWxlU2i4ftWpwcGf0ibcoDWTqWjrZm7JGmzsT9TWni0jM1D911ws0k82t2i4fDTcTuLvtKTcx3JCaRP5g0Wlr0TpkYm5dt6kzxpAKkzkdKXE95TqSmuswm6hYVYotepIJl9Wkz3kbcx7VaMqY1W8+JFFUvxsfsaLoWbfSSQEt+M0lsVetIoYztZEj1zpXxMKWk9Ld5anRHYo0vxt9tzrG0IuGYeHruIlD0mXRmJbHT1FlsrAvFQy1RkdQQVzwIFs5neSoIGMu6kFlKzSMlJZe2nZLQkcqDX5RsLFEweeuLsoQZ++ZExJP8zf8GIN85ZOU7jPnGZDjfQOT7hVu8AXRIUbx8y/WeTKBmShmQddJ0EWv/gflObcroJpWasV0zsDVfbAXRRWbSyYxojKGE0IkuTaCzdpJL3b8YH2R7b5hLMCnAMpzzxls7mjPYe59HUpMzKMqijKmMiyCFZlWHOKzkOISFYJFh0UekuSPjb3YYmOqGszFj07jM6mIjmgB9rAdNAcnPOxw0sxvfmRHMXJ8nIEMMhy6u/sl9NLHMpzKz/psxO70Mm77og3Um+kTOq16Mv1lmxYftgq2Co/MiRDiPl8lK+EASWanfmfoK6i7kLILsK44XvQ0lmgOxLBQrXsvi5JzFpqKX5fPIrP9EZk09N8icajbWyLwLggtUsxGJqvW8eCt+1Zl9tjmHckqZxEuMnzg/L0ewmsupRDNd+Ylv5yg92M5ULKORlQz9iVGX+YkcGT8/GeYLbuvxM5sfLNNEknqcZPFGM4nrZEfTlPocgkopdX5mJ5EP24C/yCjmsqoZET5Ya7krh1GYzyp9V5JaNe8wJV8kyHrnnBDLqmRjMaSLjfkk38yYOBqneuddjNb0tCb+ss5afnKb3rlmrc/qHSa38U1v/F9M7sbyub0P8dHze/HmrtXMPjOHcycgamjHu+rciTDrPQX5o4EivrQW38yov3jVv3KtzdR9VsTnjPcWn3BHiXMavuV69+s7Uyua3jvnjDexiX90YidjVvUj6U2OO77D99InEqtejB9LT3gyfi+qj4y/WWbETzMMeC9aSIzuOxHfid98uJy8E5LfVz4znDczwGhqqom98XVDneJ0Vp/ZXkKthaM5L7Xrs1KI7ST3jn7zOjsVMWMSxyI6D/+OicW07v5eFDPH57NKTIx+ZHJYajbLefEfmbn0ZGZqysQ2u+aiD3aYrfTf6cSw5plf98Q5S31XMTwa7poQs6efOP4b+6WTi72ZEWpxNL+n1aF4hpNDZr0584nkMvP+DuvuvN/ko5lfHTIXf/rRnJG6jsx20QmdjN7qX0xutzmvZzQW/R/s6z55H/r5/DozXKaQy70XNy2e1AL+eWV/04/NZ/AfNeXtm42dQSwmroXoYQdS1WR4yOVvEwk1l/II2EvC+TsGWfymSro+bLJ1FJCR+EvMb9KSGn7r83cq8YT81igkC7trjuk0rnQg75Azx6ilkBA1GRb7BCZOb0Ow6SPxk+O0N5fAxWMme/03+fow99405E8ChcTxcxcEdyBa3YPQVzI1ixrGko+gc9MTZE+c2XgUsR90FToMYBZTUpoD4y5SwEoiR4StRbCo44w4WN/hL2YqNYBRGZwRRzIvSQ5plNows0OamhlNJPmfNvMpoZXZbdlILtOOsU2fSH01ZBB71Nimdx5mpuIwG3m6w5OmiNVGSv4iH1bPXqQcj/7s3IVcvcV8bgxNgjBvkvg/2qmXc6ozBR+sMzOz6qMjObRlnEVFz38kNWnufJrCCUW0NellTEmYAhax6IPlXBJEJnenE9sss+KfuM7kPY53YezMxJk4p/zwKWZ9ahCc1KEXch7hBKmOh8uF8HJOsj+57tD5+OFmkeN3WEbt1hwnZSX40TmbmzRwwzYQD6mJlzOGnZSN7O3/BiBfybmL+Jee+tzpxJYFqb2ht7gZhPU7lTDhWDVOycZq4TenyV6kh0L2aN0wsTGSWUprq3FC27Ik29iViS2TyONLz5RkSYxSKZXiMZ4XQdVJpynRnasqRY2jybEkNhZkJY+xEF3dLJfd6rIpT2iyRhwNSTS7wqS+KCWkPM3j7MRhKRe7MCGJYB3LtvLYF2rpnanSUhfS2+oTiVQvxl+WIbbFwm4oEcekB9IjKbulRT/TqwbWg061xWPlHrL0zCSTX1Rodid4Q/GYOGB3AAs4elT3LbBzOb0QFeEvo0TJnxihPazLSK1nwl7pRWaNl93SpncSUuIHkmuI8MaGoiXVl0r20uKXq/Lz3CjZHhPcbWosEclPng3xjUmiRbg6kUC0eGxPjp9YxzG0E7MEmQg8d6iW/LJYymZLwk6UElIeUsFHt5DQop0KbNFe/s5VS1iNRR8MV8ntRLCU4EblcSI43s2N+KyRTtxi7walbKhhHCzXaRxfCJYkq2RjSYrGFr91I2SPjP9gDLUk27Ik27Ik27Ik249GQpZkWxbPTi29KB10K9G/6JWHzEx3kajFw8bSpuMva93ySUvZon8xuUcTTwcMr+6XdieJi5iOMk70TpxqSI39B6nJmiop3CxqfE+cWZZkW5ZkW/21c8UMkwmTO5FcNZREWkgNvVMmxwbWPnr272jjCaf6RDLVi/g5izLZEYmfSYJgVuKYsNSK58rkCGunHh7C197qme30Ry+zrYS0aI+2r5SUEPZNK+XZvmnN10STHtOLURR68aobT+7JDr2trZ7Z5ouwvXyo6nWeJS6RhRmTsplzZNxHkiRnZk1dtFVN7IuWtnOPTK8yx+QP5oPfmgQaY2OJM5TYI5mXHLNbe+DcLfkxJ8fMM63RB9rKmfYdk0p8kZkp04WZuceT281qjjuXjj7YpndyTmp9YPx/MKXm0Ltprdk7U4MJy51OZIZy918kZ7O1DrIyW9DuxuUfSI9Sc6KUM+XF5J7sq5cm3kM02/gwfsz1xxPPRyNYxlJS4pfM+CYRPii3+CXHx16Ybb0OJh67lbI3SraqP78AABAASURBVJaEVCkdaPwYc6XlH/giR6MNk118wVaZHZ8lNc/emIRU40etiKR+kBpjU2UJ39hQPKNErPPFY4x11UoguZ+koHnIjPbc0F755LCzkkb7THosnhOJVC/ip8mOluwDJfTHxLPSjUvW6AMlobCNo7p7iy1u+kRy1YvxsQy0LRZmklnGH8objWuEoXgWaTRKRM9MRH0ouXAqtRI2mjXawGI7mDRaKsWTHvDRERit7Je1Bb/ZSGfhQcuadSG5xndKo6UvEkhZEh8yr/HF+MvE4/rqbulMAixl1j09OQpY+NE/TJoa8dDgwjLU0nWzYY2fOBHLRCU79A9KJLNOlCXRG6ibdE+SrCY3tjDizsSTOEjd1b3oV8r4VmCxc9Ta893GuEfG3+ySSziD4PYdx1SsUL/zGD/GNycnRe1H0xVNYPLRCRxILo1EAlTyGb0x/hjJrHwDtMyWqswezpR8B3fXJKPTtMdyUuJ3JJa6bTYybgCbeSYzc9Oel6qWs7EmzpjURO9MbBmgLXvKD6SBdQmST/BohO4HkKCOhXM/Jon9ThSy8pl1HHEWFQTr8DmXjLqyDcR30saikz3xYs9OnHkJM6v6RHLVZLLiP5EZpDv7ygSZFGAMSC0eYD/qH1UtI38i71S9iJ+zGcrHF8EJCdTtlgDFYIpwEsfwVgLvSZPa1lay6xXIeYndMbHNbmsS5BZrVK6YSFrCzSbNZ9HAHamgqZmdzM3ApDaSW26SfGYgeSyjV7rxj2Yqefa0En7nyyM+kfwkGGMKevY3FePF4afArSYyidPsVOTMIQVZCZxINhr0kEVC+9D8bwQlnK/RJ0Pw7wrFhH82JjS2mOHRJbEv5oTEj4wvKWgvziPpTY7Pix+wK/+FwGb9iT/xs+b1GltUyMZq/x2JZXGSMqvkPUpm8TumnBVOHm/F89k0xx0/nDNz3tFaq5WDozklvTqS+dWL+PHoVOZ9kwgzMrJ5/JJAic5ZsdwxzHt8mLOXaSPNvCO7WiueTeM+rpyV5E7mVR+YOY9GcXNHxv+8Y+9NqO/2xfmkqM6bJAtzduKQe8XLjEdS0/yBOSu2xfM5Rn8xp3H/md1dreEm+Ry5gRINP3eMlwKYM3EzG+ibdFKTmXOXaCZyZueTC5ML298c0yDVak48qQVn3QqiD2QGt1RmD8VDbWctpiZ6JyXVd7z0aGnYu8PtrL4zI3ou5K3Zo+jB+2gEa6LJI1ijP1XPOjVjOb4exeFVry+7p6/PjVF/rd30FwnM7O69adpz83smQxkrZ4E9MH+vI7IS1RkSvROnGlJ6uvxJR/xlawbvMJUXnXOS25kqali9dJgc/NyVmmrIShqsa/IZkUvvxNFJckbDZbzEw1ZeKiqphJSwOjtMMMzsIXNwcreJHTU+Dc3BDKEUJJ7Zi3GxrOR/ModQkJmgsz5kXvNHkk0sg2GQqxDNixdfeqIr3w4iR8Z/sIQz8MSHdsIpPVnEqRfBvXOZeWd0ajDeMhPqxfnoqHSE29+VFvmi8eYLmqFK9dn/rpOzlvU8/HCzFNfH+XDOopS7LJ/ZwnLWWxMD5KPQhnzNmztnR5PlN7RdmU1VJG3kk44XYjlrlads6hKnJvEgpLP5bs2zJfFo6UzNkfGXXVNfmgCrF9qJkwvHMuaB884pGKNrnLVv+sy+IRWLzK73xXwCdGaRy+tv51U2zhhW9SI4vwqNlHb/MCduas6JqleH/Ilkqu9IImtdgk6KshLcmGh02BtmI3nR3HISP3bGNJvz4twxsd0oqr8I+gGdGIFts3E/awt+cyLZx/o2uH+SmrxqrvVFAo3/YnLLcs+cNyPj8bE2d2T8ZRSyDh/B6plDiZPNit5JTTXsgX+QGlrZ58w4H/3xGs/cONx5kDzWeJjohckR4rJJ3h1yiFPIatHGZivwwqMR2u4SJrVCdbsRgCzNNwD5wkhIfCVUn6X7f3AeghM2EVPme1oTP1EimDUkF9H5+CeSiPZiGuwq2Zbkzy+0paWPjL+MApYo1T294gdSbJsBlv0xhCyexIB2ShNflEZLsJlnMqNVF2rXUv2MSayU9ETxJJeCJyZ3Y2pMPG1EQRYBIbJuaOVa2Z5p+kyJJVm2JVm2lce+kGAiMVyFH/PSi/SaItsTL/GPjG/JNnahNDHpizIxNtqyRwylC730DS0eKzOkjXhWn8bxP4wglUDdbgmIdilbcjvFQw27ElOeq05s2ZZC1u2sCE/3jbYtYXYY90CJFFo6UH1SHmey0tC3TDQmmkK7e5vqOa6Txha1aHJP1hpnFyNVz9TjZb3YYoaigKX4Vh7jH0llCogWpL5pkZZ9pJf+kAB1aBm+pEUvbrpMTPMYnM3NZndynPuhZWPCdkp2tJSfeuN+6ZdTI/JQV3rFD5T769Wd+InSxBet6pzRuIXGrA8tNW9B5lkfMvvFpdN7z1WrA9MTfTFHs70WcXvON73iizkfs6Ml2+Q1lA6UMpv0mZIs1V7s4xsvsfBgNFftXDU+MP4/2Cs1nMKo7PpoL71YZW13+6aoEHlo/UGr53Doh4mN2cPXRjEv/onEqhfjf5n1UvI+s7OIQXPrnrM4WmrMkm18QX0o3Wtp4rJo00sH4lcfSBZl6lRaKl84LGXGPT05Clj4F61o7IYvGiwlg0kfnRhamrh0oPWS0B4yo/pEy05+Ed9GYyzlnJdVWoLYohczszWy6v9kapZxwCu1O0U/OetAfIsqqWdYJS3QWLRVrTtS03ioeHpJP6iVh04dtvjiEFzZliVVW7KNbYy/2RZblKgjJx2IL6ExSZYO5uU/MOdSYSePOb0WUuwq2Vj4REz+l8lqrX4wuX81hjFJdvcbvia2/msxn0hOWGJQJXMWN/1FUYPxpuyWui/SW33LOUuc5eajTfkLG9pDbVQ09kh6k2MmQ6QysQfL3NRAL7bnqPGFWZZC7MMXbuKLzOh/ifdIJyPz64W3ke6lBD+Wo16SQkvQsiTbsiTbf9hWsyhNvQRfolt2dknuCmrisSfoFRmaO8bDkidnWyrFY9leLNAPJKwpVejZpMXRlqoX4+8mnsRBY0fiP6WIs6TcMw5kVdsEMBvKsi3Jsq089oUJYiusyeqBbjy7xUOTidjdpUV7NCCE76SMHx5Mmpj0QHokZbe06PKsLCUafJFM43ckkdWLJh9xILNEznKC7EMEy2jxGMvaGP/BthJmtuKOiT0aXc1J9hq24ZaWlcc/aAosp4KZZ4qos30YuYygaDmYl7+oOxJrPMzov5iaZf5QPLaZJNlWHhtmnejJE8MTguWheBo/UiLbrZRGS/Acsc9a1cR2iicaaDE5XO0kVw2z4sOkJQQr3LXyWJvGI5DdUDK/xFNaqG4HSogsvg7u3yXk+4Gs43ca843K6tRg/b4pwd+kgxrKWQzMwhDzDU/8pCNuSWF+UpAzQqZRWlVWpybGAMbFw1aGAIvaaGyrOZKCzCZEHbNxRv+Dr89MmufczCMewYQAI0gsGnw0ZzGB1uTJ3mliuQ9FWZSnjimNhx+bumjmdXVLgD7AyWsImlz00ZhJgsKVC5KHnDopsiuEJkouM6f1TlNAcu6W/EEzqPGdGUmeMyaOjr+s58TPvEfOGeyUs6f2y5jb2IWdSWxn+qN/MHfHWpWZ+HP39ORdjpzBlFGeeHRdNlYStLT/jszmpdib3Ekni3mMw+l+S9qa3Lkczq0HMz82dyC6Yps+k1OaX2R48yciWCmjijsj2JmM87lzPYrCzAh7j9SuOC4hMjS35pac0nh4qWVA+3JyanadOiwaozMV4/HT4vzAutm9hzRZrsVOdQr4ElqNnzOSGNI5id6djZVBN/GOJf6LyXGWsIwN1YefsjO27i8mtxv/Mqi/erl77i3Y2WVqkocMfxMDvMOmo/IZLA6UsdnOZE7yzJg4GiczAUOij0YotSRbUya2jFnvxB6ZWdSuz+odprZMDoufM8pL7Ru9rO+y/Jy56TP5TFqzyMzmyzlLPSuXiIbkaMHZNGeisnpOnWzEpxBn03NOZio5Zuun0dc8I0Kk0gefzlrpVbbdcZEZb+6vncytPpCc3uidOSz6w5wdm7rJRb+Z9c2cjTHv3RH4Gwm8v3rWvNS88a9MbDdm1T8yfj5n2F5Ijdb535wzRA2LjqXx8i6Af3ayE2dGvPeR+NUlWZhZgu8MhDoxNctAczdsL59NUoIfzbtFY+l9/8W3uDjrnzif1Zs7v1PP7Hf8RSbxWVCDM3HmJhe9M7FlzGDR86SZRUFn7UxsM/py/p77aCWec5ODWnwvjs5nRQ93m5KLZobIvXeKJ2eDxiG5NzM774HJxd7Uhlp8M0NvZpyYO2CpSSq5J7aX5CMzJ/lfTG6zSy1y7ofzdAapfT3VPMZJsM5/AAi8HyyXSW4nJ1d/c/uv0Mh08Yb8Rr/n06Tno98rvkgu92k//pnS6AdK5DGpZHDJn5gPuXv1HXNe4juZUy2e98xI7h35XlolZfCdIy98RxOHFPXvMI+kjJx41t9aUOO9iSGy8vGUcRLPzJ3cr/qfyHmt4xNhwJvfHSSzo9e5b2o4e+Irtv0djmAiOa9V6HDT4TH/zj9TmYf17iUdT+QmXW8KurJ1Ypvidc4UsZNnJ5kbJ1U2lC3pnUkRYLXwwhw5cRKIvEv0icyq3snJ1DKZUvpwZk8cwRrdmzdYTc+H5KqJhAdjKGvlG8+I6CPjL+u98H8xuSfLGcnt/MyqN1fkTvNi+SwoRSdBRcWVuW/ykNkUsz9p5k4WJ/XgsHJeZc7BuerM/m/WIVyYtWZyPMHogDtwVVTHlglT1HAZjzr8FMV7JhNyDi29e5nYWPsaY8odOSN9ZCntfiFzUsMdm82M6BOpqQ5TdWFy3JE1s3FyJoJF/VEzmyCrTVEZdiEh7pMg3fFwqcfr3C9SxRnpaj7+soDDksKYwfrWGbiMk7Ioblk4zueMxijqWSGWGBUBikO6un1rwgQ79iW+oKpP/3WHd8fElvXbjvjQ6TUti14MYt5ScTBa1Di+ECxJ1jctybItyf314XjiSQaQ125xLCmtQ8uSbMuSbGNXJvZgEvXkpAPxxWOJtZt4jPIiWEofcn7VF8VjTfhKrTgUjz9mWVnd6naTEsQt4z/ZXiMeBAtHLRfPlybAEhdlKdRRI+wGZIcpuVBXrT4T1couMqPxC21PXYm/k774fqAk0iKte1qWMGNPTM4SFTPDCjf9RRPBhLXuxIjkF1uEPtEoEzQUj7Esf+lET+aldi6nFyEX/rStRrLPvfam1eciNVn/oCWaLB+IW30gNQ3tJDctyrPCGvqGxIRRYH7mMYZOTOpuqeQL4qpAp55Ac9kkEVLcUDy2xcJSGD98fbQsUWB5UVK1tFPml/q4u7601mOfK+xo7JE0JkeJ7khayd0w5Tokpyz7mJvLbgnf2CxH4m6UEFlDwhFBGQfreWws2cbEE2LCiGkRJTt7I7KEGQt/mFdup6dnmxUu06JNDTZaOlGde0ZNAAAQAElEQVQ8lljdbimRb+aBXnGYc1BaLOQMkGA1Ejfyb0th6k9MALsdJh5y3Ye4XVVsLH3GOS76QEtiNmuRAMKGsmxLsmwrj32llMgKjy8t+kyKLMm2LMm2+uuRq8ZHxl8miVaRxsmyRjtC5pd4zozyil4YSU9maCde44v4zZfZJCUQd3HTJFgkhCUnniuTI6yden72Xk/1nU4Msy1hdhj3hlJKlCdl37ScIPuRPulR2Qmz8KxnJvdk6UruhoRYlo3JHODs2JAAvniuWisOrT6MWJyAfSCu3U32helKbJGsKFIf4tUVbCeB7tqCD2SGRG6neKJFdKjk4u6UVK0+CccZWl+USZvdN9SKL1LiRHzU+NV3tHKefWT8ZboyM4hJshd1JTnNY7AZruwoXeilF6mxnSLiUrbIW4onpUAHRo4muImdiT1YwtNINYKFo4SUJ/qnkWSJC7PoQNQxIVfbR0rml3i+SZBlLKtkYyktQ8dFH8h8G40Js8e3oTDz96cTiUkiLUv6oqQ9TpKFNkYckWn9L2+J2IljkKwCFLSUv/kZYInrjqQb35kiETqwCn1L8SQHkv+4CYiQ+uxxHJZyoUeSaB4Kiw9t/AxbtJdODNvUPc2EFN3RErMsD/GF2dEJXZnYmHhWWVrk/LKya+KWJczYxvgP5lVzIjG0eDoTP8xA22Jhlrq6yV5UaHaT94GSqLHyWA7Yh8JTn01XsNkrsmiftaJvrc1srORBa8ts2BqFN6u6G9oyu9YebtqNZXfCqD9ImiL1GvgnyqrWmSjtcVWtPUdGP9CJY480c5I/0EvvtGwnKHbZlsXzxKSwrNbhfDieZ4Jsk9WFXjqUEJgUtjybpWiV0k7xJAYay1bNxlL0TxNPC6mCLOHNQrCUB7LUeBws13rp68m3BxM8Mv63bd9xXN925JuK1LDSjciaVGLYfDeUEH6S1TjfnILb73AyvOeeyMxqNtZ0rxiC1e92Dqd7ZlPD4fFjKfoi8xo/kb7qRfzMBrxN9mN8MnNq4tEf63npSuiJyW2W8ZsfbnonQVZOyriyToJ3tjfikGfhTFucH7opPr8ZzxtOgI8rTnTIqNQwa94V3Qa4xcllTTXxCOysmUeM4e3OrOaZkcxoPIL1QypJ03KIM6MxSDqL/DqzPUksjUsnezRJvNHZo0OCTIlqVR3iJ5KpXoy/LHelfRKJRXwxASwXz3Gp+ckm77dtxi8mtxtj6ueK3AHZDwz27nC7TsoOcoX5LBJETfdF0zSR7FR0dZuOut0+OnJZRjOCXO6H4Y1OwYNOTRoxqrrfkZ8xz6vyxXLyzFtOzqCRPIGsFehngiZBcSZQFQ0Sq7tqoxOmcPBPeydQuXidVU1uZ0qjH0iYj0O6YUcckkyhavbcebz1+0ZdPArq7aSIlXLiRBGss04A63lsLD4aphFLYTXd/WwXyU5NR0a1kmw4RupWb/Eyw3FmNn0nzdxorPmyxZy9CHLIumpchiSIEWThHNcWOTL+gyWcqScyr3ox/pN99VLIe/SSG1OzGzPrp4LayGVVbKxGSjZWiqeLmaP57FIVjeUD62dI1Zm0Jk/txKOxajZW5j3bnDM7fcyKP7PwvnQGJg57F8hwymju6kbogc2kk8aURH+MycSPGkl19lQf3cZSGufI+LvhsPL5TS9ivyx+ey+cQjIrjvcvq9WdTTX8aLzqRfwc0c+4oWy8XeLTyh5d9OrxVjqtkYvbJzaki3j8MQQr/sr0KDRsBLJOZ+ScGI0ssl3dHjTzyGQIVdwtGhC718mN9Zy4U5gRUVztEIi7FYZHS3X0LyYXy5zwZFvwgZ1Nbmeao7ki75fVSyeUmpKajXHxQcvaVc1ntDFJBlWW8cjjJxXvyq0iJfXZWD3jTLoJ5M9ar8fGoi7B3qY+VYju3+QQqrnCytdjY02cFvysrWJnDiOR80HPanXjVGVA/Ce2KRuWGsB1snfM2tC3yRVPbjNCxwEJX0KRx5L6qauxsXiRLEoRrNxj3jHvlMDGZqi7Y8MdHy9dESWBks/mjjnrnf9r9M3co6Vv9UzNyhPfZpOOS4KVv5stmxKG4XB79qzoqMU0053ZdPMZ0ExZw41HkEl53PBgcSkjw0Jk8uiKCbIzgZ1Yk0cSbuzI+MtSGveRJFhcfB2ByOU3y+z4cN6RYdWULxLpovMf2DekbpEZ9R65zmF4zy8TG2PQ+eoEGMVtJ5/ZtKCzE6t3jCZ+1AxozWLSuJkJetYXqWk+pLcrgV3jTJAdP7njEKKRud3wx057szuXc5pJrHoxPu795ZmWHNivET+2xeNjI2fPXcc7fnZEurox7oGESc518HO9XeccYp1/YE/ZNMXVZSvxfjE5BrNyVsaEyLkDzkeTzUpgJ6dVQ2rTRIqhD5qa5g/E7Vod+NeKpXNO3mYnpdUHJpfyneSqYVb8nQgWl+1aG9kGF+NvRijngetdq1NGLiV12VgdG843AOdroPIdQcn8Es+RXvqGhJwOi73bNwkTVOfjh5u1qzFPXiH2yHaQvWNiF/PSOz29uYAkG70MwXKCH4oneUBQZKVd42qeiUuldOBEvCJDS9WWbUnYTvFEg8YhMu6tkW58J8UsJbgx/o25MfFYbCiLLes/0JqrH2n6TdySLNuSLNvKY1vGsbNrfOkPevL0WJJtWZJt9deR8WPJeNWcmJhEOkuUivSuIz66HqH/UXYGaozbuo4G5v3fec4PUHZkx870eET9BEhRTnq320373d3ppR9o8ViZKR0ks/rUT77CJmHpjaKY2iszlp4gPeVshztKU+0sSbD1J+K1/kSJEiezUpfQ6rPkTVumanZDLXpRHJp87Yc+OSeQaofRvyJdqcNZ1nFW5iybV4hCcuXf/CqP5YD94B8SlmiVSPiX00Ny8dgkWeGmFX34zSP+yPzROeRPTki2+hyseNtWrxaPMxdSQzs9Zg5501emR0pZPFd6+RvpkdDKE5rEjw4mi5q1kbx6MfkZVu63F7VYTV69MzOiN6ZHeZZPaiLri8yt/0jLtthYByVE1lA89FBVzKHmQbAmz17RDbUz+UvEFhtLb0yN4DXakrZEdRPxWIe2vfSidgoV/USJYpbytIuNpZhDJ5U9JGGRRz+FNHXpnZIsvYSXb+WxjSagkkGUbEuyBotaNBUCqalvWjzUWBKbZ2P3R6MqoIkjD608syu1pmws5XlivDNIWMqLnSRB21DEok3emUN7MR4xSjmhPI+aM/UvxKleTL4iw2yLRThjoT4hTS690LJEmDiYfAWDV0adzKsHNoMs0aY84RGiYGeT7EU90bhO07D7ocVjHMDuYIuMrVyFj96MpEch/BUZlvqFEUTmgGONnF3nu5lMPIvMavZKyTYb66SkWMQXMabNCtMYoqpL7Xs7cF7o+MQrrc5nY5F/tJxzlj1BIrKYGyWlLp6DSYksZyM+nMwyrmQ/Ea++qUvdLD1SPKkBPRKTpRQPKk8FSTjh9OBosdriYevqNtVJFbFeVUNfqaVLS1+sgzsUj1FeBCitsGxCW/DPOlWP5Fz6L3F4i5LsTJDEP4yRilF40ZKlM8TjKukP9Kn9Ufa4GZKuyFR30sNafYVoadRP7wqnYPGwsXTRMe4hnnggvcHOrdS0G02QJfECrBupYNoPlDiCL71T80yXFB4RNbnrizuS2d2Rd3IiNT8RT+LMFtJoadEnZTw2rzjUleJJB0ifd0q8ivJcSE91mU30LSokFr1IB8vq08NkB0lf1zqSMe05zlxIU/VicsKO5tSijV4SaMlvpkisbn0zjvEtMcSyPsQSjoekouU/hKdHT8Srv5j8jLnH0nLCCfH07kWg6Cs5mZXCSdNnsbFuFA+9uKKoIal4ECySz/J0YJjIupFZSs8rJaWWYycloSOVh7wo2ViiYerWF2WJMPHNccTTutWubKQVO/+cPwXyE2F+oIzuL4fRxPx6ym+FFOt/kRN405q+u+YUdudszL8dyDG6KaVn4tQMbM8X24G7yExOMiOaYCgWOu7SGJ11klr6/ktozXhgXoJJAZHh9E62djR3sPd9XklP3o+mLNqYyrgISmhWdUjCSo1LWAgWFRbncFrbmfyIbWC6a2djxqFJmdXFhhuDc6wXTQPFz2fYNLPrn8wIZq7vE1DBI+EUr/6pfTRe5tOZWf9fMDtnGTbnorfoTPSF3Fe9mPyIzEoOewq2C47OB8HhPj5MVuyNFLLSfzL9FfTdyF2Y7Msniz6G4uZCIgvFSta2JLlnsaXoFfk+Muv/IrOmnzfInGo21sh8FgQvUM2GE9XofcmWf9eZfY25h3ZamcSHmDx+4vAWt9md86TjJRjESsbs+a/1PprZqaz7SPP3UPo+96xPSQmPnSJrDuRuBOumeyj9JFxGNRdxmr8tI/72lrwLmpwWGsn/glOTV3M0PIMkB1bMO6Q3fnqfyLtg86JZaX5gG/AXeVumsaO5iwnI7NGkqTTt1nO0baQHg7V5nE87Zt77jM5KbcWhT65ZefOcDVM7eHi/mNpD8HKsdS91RFYu/JB7Inj18bl7Fk4XGz1MoZ4VHbWYuRzI52116cwcncP0suJNGcGKnpiee62a2e2B9ztOTa13hczN201aQXpw3QMyE5djdCfhMtbS8SbaRyF3PQaz6r+SOanNWzBu6cyMX+LtTJ7ImfASecX070x+xKfGcdbSZLP4sJlXQS0kkjGh73clL5k6x8ZH53w0kc9Oec5tGiPtoCb5N3t2Dmfo9JKRZAecIZudEeRt/xdzgOA1e+iJ8RL6y9+r2jtU/x6VfIX4ZtLzyNSI1I5gaJ1X8kqp9U46y3j/MbT6IFdm8T3h7ZqcsTX/8u5Ievh7MMno+WzqZxV90fDUWBlA/CVyyb+YnsRfZoRaHJ27ifUurYk7Vg9pxBz727Qb6TAJ8fwO692ZPfXouesvXoZeyGV/M2sR8N30mg8xaclRPOZFM6veE+OdwazmO5P/x+hd9J7kfi7+y3c1741OTog4vb/ioVZyfid5+vKBvpnvKv0v5A7l8zB9Z+RHVzFkcQd3V0IWPdwTY5upFKJP0lMdcoQ8PX9PMoDevwQZf40UvJDvhOpfPsdfKGaEf0/N/OR/Q4KhpMzi/2zSn79H/X+xZjAkE7hOJzsbddQO5p52JcFMfvbSvzSTeS92WvJOZEvTgxfBMexdU8hK4YnM7rlfpMbEvFxaS6wyY7mwq1sM7klj0rC9CBYtTEpC9DP8i7mFHsCoDM6IncxLkUvq0htmdsihVkbjpP4zZj4tHGV2jxyklmm7d+gL6a+GDGKPmjj0yW1mOrbZyMs7vGmaWD1Iy7/Il9W7F2kn43x23oVas8V8bwxNAZtPEv8/xuUs91RnCjlYd2Zm1UdHcmnbuIuO3v9KenK48zkUjhXRoymvYEpsGlh40VvkXgo4U3vS8Y7IrOQXrjv5HPu7MHZmkozPLT9ymlmfHgQ3deiN3Icdk+5kpLwQWe5J9SfXO3Q+eXhE5OQdRPPR8QAAEABJREFUllFntMZNWTE/OnfzJjUe2AP4IT3Jcsewk7JRZU4WgUgLPl3VQ34A5P+S4N3E38TVJ3qLpKk90IdvDhL9pRLGTlSTlGysNn5zDtmLnKGRPVoPjDdBMUs52m6S0LYsyTZxZ7wVEnVy6Z2SLIlRKqVSPCbzIqi66ByKe3J1pak+mhpLYmNBVuoEC9HVzXLZrSmb8oSmasQeSNzsClP6ohRLeVonOUnCUl7sxlgSZhPLtvLYN2rpk+nSUjdytt0X4lQvJl+RIbbFIh4o4RPSCzkjKbulRb/Tqwc2g063xWPlPWTpnSmmvqjQ7I75QPEYH7A7gAUcPar7YZxcSV+IjvBX0KLUL4zQaes2UusZ26u8yKzJsls69Eksxd9IrRb2wVrRkppLJXtp8cdVySZo9GTbfvQsOiROenqNJ4kRZ4jnD8Yfan+goG3ZE/rzQM7QIO8kr/4vZDZt0qKdk8SivfIyfzuPvjPeCt25erUxPWgvijzhxeSJau79pqX6i+TVF/7Bos5MG/Jv5G1YTW1Ri16UzJ/UdyZ/iczlhH8xtYdQPDF38dAynsyrmN1Sd1j/j1T9i3/o+COdn+mPbC89xPjo1FbY1PdgxtH7yvS8BvNaW8xskUMvanE071q9kV7lO7JpxScXYQJD/hfFOcJE+2HyhHg3VzM3ZFb1hdSqQ6rJDXM2PPRJavVhZ+5cMzir9MCp/pGULPxD9kdatQs5U32hZZt+D8ltC8FiDrl5N23Uobmj+cmc44w2phZ9klr1A728C/HQzhmoFbZ5R2l0gJaQMCt1Ca0+S970H9FK/Yl/JD6nee8jZKv5ohbtzU/+FqIvtV9MjVD7JE4Q4kkm8mEzqw+tL6QhazXYFbJfmCnUqIomHVQeBCvZGXetOSEdZFbzV0pKLYNutDFZWhEpniut0RvldLE/UctfpIUVgS9li87MsJqkurQmX1S4xaFPMpIDlmRblv5ziMf29EOkbANfiWdbmFlXiicloDdS8yqWaEVL7JbYXyPl1C+UYilP/F+RxtQvjGHZZsInLKPFfqf61GVjbdr0I5lloCfi1d9oW+afl2SVvhAvOiGlZQuv/EP+LrL+DkIvg1Kxu8s+uLq8eiAZdXZy2khY5CJOXYH/i9RMTJclchND8YwSXueKxwTrrhUjtZ+koXXIjJ55oL3qqRFXJY32lZyxeC7EqV4kzyE7WrI3SuhPiGeV60vW6I2SUMTBUd19eIuHvpBa9WJyIgNti0WYYpbJh/JBkxphKJ5FDhol3CvjqA8tN06nVsFGs0YbWGxbSKOlUjw5Az46guAo+20d5jfrdBYZtKxZN1Krf1IaLX0RI20pfMi8+ovJV4jHzdXd0pUYLGXWMz01Gljk0T9Cmh7xcMCFZailm2Yj6l84jmVcyQ79gxLFrAtlSZwN1E16JkVWiwfbGPEU4okP0ndPn3Q8gteR2Fgn+btifg4Uz87kR1DKz4dBGHuR3xD5RbGF8iilnODHyRZLiiWFb1Ksv0ieg51P8s1eN10cYfXXzTBmmDuGczq/4J6aYnQOnR73HPqL1NJ3zEYmDWAr7+SuvG3vS1fb2VjjMyY90SfjrQAcy572jRxg3UzqMffAeh5AgT4WyfOYFM53opGV76bj8Fl0YDbhey4ZdWcP4J/kGIuT7PGLszo+82Izq/pCatVUspK/kRmUO/vOmEwKCAaklwyw7/pHV9uoX8hnql4kz90M5euL4IYYTbvFoBlME0l8gmwVyN40pWMdLadeRu6L98R4Rzz2xOQt1qi8YpwcCY+YMt9FjSfSwaFWTjI3A1M6SG2lKfKdgdSJjF7l+lTKzBw/Wd1sjImeiJERhzp0Z2YjMgMwk79jin/7nQMYHx8jC8OQxs//D3p4mZn/XwA5ScpNGcNbMCpTlH+j3Tz+EVTeVy5JdbF3oEu8L64apbybyngrQL2d6Tn1R0yWfYJPQ9fkfDjGJJ+MwmgsVkw0LoJ11TGIvjpdJRurB/L3ytwV5mD40XU4tTP5dzDs8xVw3+hJMvOjmd7LF8lbD6ep92VYT7OxemFJT8nGQn0WE5c4KuEW3PEZhM/60vHeItNTO4lgXWb07WM+xXmQJHWwVlU3DMi6jB3NJ0zC52BRj8ZA9DvMUXLA14dP8uXjZU2VEYjkCdL19sxFZI9/ktnNYU4Go2nmZDUbizKVOcy7UCdn4Xd1+9Z1MokDaYlmDs6hwhbxUr3oMXbraF2kgdUXeiIzWzvJsX6YjakhP5dUvGy5JKXFbVadajKYT9nR5OHlr1tb2BiVMpjXJLnqTombES9Mz0SamjE6vOvMpnS5q17NfAOcImeP4HjFlVXx2/XyTtjtCzuqSe6apDvvwZykq9DvKFb0SZJquPVyOIrhhz/y9756ebfpu+nck9rJdNHD4qKu3ov+vCs91ZDVoyf5jqjl4PhoatUn0xA/vFbSMm58FIJ1vELNXeedcs9JPstHzx2t4WfInI2f2YtJiazUfzLDachMwMg5MZp5re+kK17aYJBXwe1neWRNttfmFF4idi648Ji1mFoCmdZLRLTGxupL8t7h8RmTJ/iUmcCJNm6sreOfXS6kVH2SKfnnGm0k/8zHR3fve1CBuTHvM8TLPASLbFbHTtp99HRkXsxh9vgwoJDZmcpVUfx1BnmP1In6T5y27DmeE2W39OM0f2WO0hi0p8lnu5e+NAarL3ySJC+cyKQXzmdOwwSnJln7oa/kO2t9kdnNvphPzcksavlox32V9Tvo8upxWicZdjrHdyZnQN25J6pZE+oXUql+IoWsuWwmRpPNimBeRciLJS9u+vBTewvGtZT7kjwx3hk0NV8E/cIujCCO2aSfdZjfHCf7RD8N6T9JTz5qXuuLGPV/MbUVec/cNyOT8deotZ3JV9DI2r6CdWYuxaeaFX2SnmrYC/9BejjKPncm+ehPVj9zk/DOg9SJ+mHcG1PD4mVTfLpk82lktelgqxVk4R5Yx7uEKS2raTcMyOrYtCVG890k4R1Z/IuT/r9GOQDnb6he2QutqV8oYWYNqUXML41Yu6YQ34tUZVeV1fpoS0vtTL6CBpYYoWd6+Rtpts0Ay/4EQhZPPKCT0viL0mgJtvJOZrTrRp1aap4x8UpJbxRPaml4Y2qvwfnWxM4AS8pzpF+08lrZ3mlNHcqyLcmyrTz2jZhxEqQKP+GlFzlrmmyPX5LvTG7JNnGjNJ70RRmPjWPZI4bSjV76gRaPlRnSQTKrT33yDyMoxWjaLYY4LmVL7aR46GFXPOW563grjhKyaWdFeE4/aNsSYYdJN0qU0NJG9Ul7kqlKQz8ybkIcCu3uPdTMSZ0ysahFU3uLo+eBWCyfwRTy2a08rha7lcfitZJsNNpXbaGzHfTSH2KwnL/BlpZK/o1LGU2iPhGvQYHV3nD9W3OVGDuFZikfAtrZuGHRHh0oKUFV1SRDL71RTpX9iVr+Ii2O412TVy8mP8PKvfaiQuKVmZH6xvRK7NcQD2PHN4JlT2LvtGynOiS30QRLmFlD8WBSldhY39TncZoq3V3VyVcwq95J8VBjKb3hf4yOOM7Aj54B9iK1zHY5mXg+GsEykZbftGbszuQTKdqT25CZ9p2SJWGrlB7o5d3IoTi2JTpsZ5dtSVZgDyNIYycdisf61uKJr27sG6vQG0WeiBuqj9X7kjsb8UUMVhufKMwO+aaNx0ilR5J9aPU51JWWV7XkzDdx6i+Si7CjRWpiKJ5l10OWJhnfcnL2d7rV7hy6UlPzTnK0eGjXEcKzLRZhqasb6U4vHYrnXxT96pPZk3SX7SMpbTSLgnSSpH4oqblUiicafHQEQTv7bR2m5VZmF6oZs0yuk6vijdQUfVIaLX0RI20p7PTuJz+jnagXOj7xSiv32E/EE5EaVJlZeOJZ+vBPpkRkORtxkjNIWsexd3r5O+lOj4dJaZKWVp7kr3wqxnuJ2BkOvajFU1ta1vDQpXW844emz/h+YKz4V+YsrvKER4iEpaNuW6bJ9ofJX0P8o4yJRX2To52VzdSPIMWK0o1G55+0/si2JMu2JKvQjaZCYKt18pPiQWuFkxhv0aUxiONQvDMoNX8iHsfY9dTSUmYmgSz6LNsfyrItybKtPPaNMYlla6p6oetnt3g4ZBy7u7RojwZY5E7J5OEW0njSCzkjKbulRZdXZSlu8EUq9Z9IIasvmnrERmaJmuWY7EMEy2jxmMg6mPwljhZmtuOJ8V6DU61J9hp24JGWlcc/aBpM3RIzLW+UXI110OQraq2co7JNpL6oJ+LVD+lNLnW39MB4K2hgiWuUx7ZMYmeXbJh1oZcP5TTJXhQPOUqYGpKKB8Ei0fgSvDr2Vasa76R4ooEWUyPVSWrVMCs5TFlCsMJTK491aDKM7IaS+SOe0kJ12yghsoaUIwIxlIXvpPqz/0TIb4PI7PxEyM+DyfIr5pVpSR2unxVpjUjrRk7RFnPqS3Mm/6YARakN5UWnJ8HB1YHKaLowWJyJJo6enTT0jpM59x9Dn5m5hBFB78/GlIBIhV4yjrAvzXvU/UVqeb8MJqWdqTmOYKGZWE0aozlbV7dpIKWDlYRIL2+CMfXkd4+21iG3NqW5xIK4STjHetE0UPx8hk1zZ/2TGUGdS8ZHJ1/R7yB55r0y70SsmZnzHczNDK6a2tKdSX6SOenprPgPOjWi1cwkz8xDXzmDacOeWbTnY6FZKeS+N65mTqYZ1eYMXZoUNzvGYNe01zy5Eu5rBvsysJ8B3vXhD7mlPYsMr38hgpU2utbb9BPE3TRvQFMqmRHm7vCjmZCetlJ5ZHqOuPVw2zHrlek5gznNF3NfNKwDWXlNPgvO+W5I/lU3MiZ1uhC5E8F60RyjyA0k6QeHzn8pGOlsKzqvOfPgaHLOcjGLPNN2nTwRnzM0rT29SYd8cxHXLi/3QvqrF8lF/CUy+0qc+hu5gZOaPnxurS7nvuzjTXbuzGr+ysyjgy+NnTvQ6Y1O5I4L6areKHKCk+yTZz/0lQxs1yKzWi/JTubTREO8fvaTTOcd+x0yK6RTIZXyo8XDDPZ65a/t09ss96w7vmfTQX3ejSq5znfktmiu4n/M2aOD9N0YyR1MI6NOTjd7nNHHfviHzuzmuTcnSrpOUk3Ouzz3pk707AtTO4PZzXcm59VZ+S6Ot0Yq+pvcw/vkVOvkJ8Xp6JOcrt5IShd7J5TJkjA5ID4dU4smmFX9wJ7lu8r/HPWvY9+BUfU4FeLle0TpleIeovP+yU6iazj3knNXpuRdwnw/J1Pj/XN//ebcFjKp3iuZnRofixNk0XvEjf4mR7TPbtd252i64vGOffc7KR+fccinoqe3HaSnWtmpPzB3JVINOcKinxnVF1KqDjmRnHfM/XnHg/k+5yw9uTM9X0xH6r/IPazHLmbylsq9O4/vtX56jhD3JP9JeloPOzVvTRw63kt0NrWT6wzfEa7ynRxsJf6KfG+pfTMun37N7DmhiVSumhev/0LuSuz6vfoAABAASURBVCV3hPmewnxPJ7mn+onMbu0kp9IHzlmpRS+SduWN510j581HpxL9SKbs/px4noBLKyv/CMO56MzlDP/8MT46+T9iBnAiq723GR3NrJLayeVxO0cZE00wgxb00dsqmlp6WyevfSdn6j+Qs105Tw8n2/STObAixzjQ1Y0ZH/LGaYj3wFh8ANppQPSfBe/knvon005/Ry+SZ3E0oDPoJ0jzaIrtLqkt5v7MP+KuacNKf0YdTL6C6e35xdTegsNMnTvSw0uOXp8hegXl6avOlnd4IhOYSzNHUkeTPet1T0AP3c2OLd9L88wjuevM/P+iQ3hx1prJtZjRAe/al9gYm6baZTLq5Lk72Tszl/6s3FfGm+i5ekx5InfkM1OltfuNzEkP79hqZkRfSE91mK4bU+PdWDObJHciWPTvmtmYrB6KyrAbsXifmJxORko/Wed+kS7uyKnWk68IuCwlghmsb52BK7gpi+a2hZN87qhHU+8KiXh0BCgu6er2rbEx11hOVT/xb34AzP+NtcX8PChBy1A8Qx/ap6Vah77QYoSkJ1qqv0heXU4mHp9azSweNpYye2g5NsZJEttiEeGPuJ+tliweNlbzEIfchAgrj8kuzKV4trEt24tA1sg7tXwoHn/CsrK6Ne0mxSQtk7/F2SMeBItEbRfPl8ZgiRdlKdSuEXYN2WFabtRdq8+4WtVFZtS/0fb0leQnOZfcL5REWZT1TMsSYeKNqVmiY2ZY4aG/aBxCRPsujEh9sU3oC40ypqF4TGT5S8e9hJc6uZK+CLXwZxw9kn09ax9afW5SU/UPWuKQ5Y2k1RvpqXWS2hxRnmVr6AfiiaCBPdkWWvkLHZ+A4mEE/VIoHtvNbUtZ5R/Zf9B/5P4tNGwRLYke1Icyf9TH3fWoU/uzzpoOSxpt2YSIL0p2/CtlSfjKk/yBU/4UJ8s+YZlTZveHpMaZZQ2lC7EfdX0r99rDHLTJRcC7tpQKsTP5S3CApYwaWpZkW5Zk+wwS1l1LmFlD8VhidXukRL2VF3r5kPvTrcVCrpWtGhnrP0Wa0n9hDOJxmHiodR+SdlWxsfQZ56TojZbEbNYiBsKGsmxLsmwrj32nFGfZk0uLvpImS7ItS7Kt/nnl6vHO5CskcVSUSbKs0Y6Q+SOeK6O83BsjOZMZOklWf5G89TKbpBhJFw9NgUVBRGriuTM1bJ3U+7OdZaL0pXHjEfbkdpjWB0r7COVJ+4eWI9h3+qJHZcdmkVnvTO0tciq1B2KxLJuQucDZiSEGuXjuWsuHVh9GLI5hbyS1u8m+MafiLVIVTeqDX13BdhHorsN8ITMkaifFEy3coVJLelJStfrETjK0vihTNrsfqOUv0uI43jV59ROt3GfvTL5Cd2YGniR7UXdS0zwGR5DKjtKNXnqRHttpwpeyRT5SPGkF2hg5GvMQJ+O9ROw5SDeCRaJYyhP9MyiyxAuzOIFoYixX2zsl80c838RkecWfEHGlNXoj8/PPLQkbfw9J9aHt3gx+M71nrDP6wxly/jnMyaHiMAxXtiVZAXt5aJmMeKR4qLHU+mzsOF1sVW8UT2ogfZ80hrDU5/RJWJoX1TNpaB2KSA5tcvEs2ktjZR3qmWYCXZwx0IU41YvkrZcijb8z+YR4Vht9kvPHN0pxiYMmfwmvngvx0OLpXeQhQ2SbEGG2rEV8Nc1mUlP0Rkn0WHksB+xDkanPoSvY7OUs2let6MfoYTZW6qC9ZTZijSKbVd0NbZldaw8P7XrZHRv1D1KmSX0N8gtlVetKlE5fVWvPldEvdHzilWZO6hu99EnLdkyxy7YsnjemRGS1j+TDyTwTZJuqbvTSoYQgpLDt2SxFq5ROiiceqJetmo2l6J8hnjbSBVkim4VgKQ9kqX4SIq8lNha+k95o/s6Znwpfgt8M+4tjN35F/Ggd1pBaRsyvoVi7plD/wml4/IWzo1NnDmeQ3eMk7jqz43/Yt+TXz7jMoJB7Epgs/OUhOvubnFsX0Z1s+si+9Thza85Ff6L35nSsN6Z2BHek7YxDn6SRlZva0y3GW5wHSehhkfT4v9hWvqu5gk84Bl9XkuiQUelh2HxWdA/Aw6eWNd34EcRVMw+P4T2dWa0zI5XRZJjNQzopc2TzmVEPUs6ivu7smRSWJuUkezRFstHZo0NMpkS1qwn+hVSqF5OvyLtyfArxIr4Yg8iL57r0/GSLz9sx4xdTO4MxzfOKvAOyXxjsu8PjddK2yWXzXcREzemb5tA42eno6jYnmnb76MgVGc0Iank/gmx0Gl50eoipdkLVo2ZMO15JISuX0tjvBN3vCOZTNaeWS/7KuQYV/oVZB5P/K47exXXv5474RP2QeclJ27OY/2gg/4Uhb9H/oOCJeV+ztQaZxNv/JUT8VZ7+7zKk9mHcv9QX/4bqHeLJveCq6alfsrGOd+3caO6INzoGkc+VYaldWLHeYfLs+RxfZEb9R84d+Z56Nz25arT4DNQlqD79DGRhZobIvkc1Iu8/+d/lhz/ir+j72zt69m80sTP5W/DCeY/P2b/MIuovJj+D2c3Fk7q4f0I8mQXqlX+zi5nq0++G7EK+t+qQ2f0uT9Jcfyd5FrPzXSV9D5pa/DvvxKz+HzCYz5y7rlq8699aU4/WaGwy6tn1wr9zD+8/7xb9iQzK3CPEM7k4R9/fkPjF1M742/fI95fvvrPWZ6snUadH+nC9W3sl7v1vIZ59JnLNZD539rOFRN4l3+0Xc+iveiev8UxpfAnSrDzDvHPuOaLzMygtYdvYWO2FR6l/PaJXHGf/zTmQz55ZnUvyTvHeE3ml3Js7wo/+Oz3ru8rs1Mt61ENpfcc/KK1Zi9JoCTJHemfvoOfk6v0rnr/cLWL4+esZT/1LkHc+PtPw7/I30nr9rv72fdLY8xy8kyMs+v6CrFdSYOXdGMNIBCs63zkGq0Y/R0blO76wB7XeKVSfeSfhq8/ov0sv9nujfCG16r/crd6bd8m9X5SoE9IL//a+fH+5/5npOYI5fJ6z92808YupnfF33oP3Zwx3Lx2Bl/v73Z5aPPSw58Pm3g/FeZ3P32RsrGSZQGv/CeiL+eek9nFn84OcrL6Q4+gMzBlak9as5i3+EiL+Kk8+xWRze/ZomMOczh0ZUFmdc6lDWseng5wyyfJB9SInphYzvWFqZYx7pBhvZ/IV99KXxmDlr9FcgcjLHhEzOZzPyNxqXnMRp4uT/4H9hPQtMqPZK9c9DO/9ZbwJBl1fHYNRvO3UM5sj6Ox4zXY3/q4Z0J7FlEkzE/SuL9LTesjZrhinJhmTnTy1fQhuZN5u+GPneKsnV3KZiVe9mJz0+eWZlho4XyN54vCTEyNnz7tOtn93OF3dGPdCbIrzOuR5vVPnHrzO39hbDk1zddlOsl9MjcGs3JUxIXLegeSjqWbFOMlt1ZDeHKLE0BdNT+sbSbvWCfJ7x9K5J5/mJK3VG1NL+0lq1TAr+UkEi5ftWhvVmovJj8DKfeD+rtVpo5aWpmysjh3SlYR3Y+Ff9R/xN1UTr/RU0uLZ2B3zQyRC80sjJXTyBKq+7XI0uYh4X2wH7hPj3cJLn/ScZbZ4bPQKPZGe+o+UrHlKNlaNDyfz6hyangl7qJOUhMfSweRvIZ7UQNqVrZqNVR3vIVxPPCaEgrMi0FI2rB/amlffafqNb0mWbUmWbeWxLZPY2TW59A966pyxJNuyJNvqn53JE6l49VwYT6KcJVpF+dQRH90Ma6eXfqDFY2WmdJDM6lM/+QqbhKU3imJqr8xYeoL0lLMd7ihNtbMkwdafiNf6EyVKnMxKXUKrz5I3bZmq2Q216EVxaPK1H/rknECqHUb/inSlDmdZx1mZs2xeIQpWHssB+xfHEK3T8aUxslaDHUHroh39CTJ9hvG3V+Gsfzutg/Euoe2hv2rRT8TDd2aYZvKmr0yPlLJ4rvTyN9IjoZUnNIkfHUwWNWsjefVi8jOs3G8varGavHpnZkRvTI/yLJ/URNYXmVv/kZZtsbEOSoisoXjooaqYQ82DYE2evaIbamfyl4gtNpbemBrBa7QlbYnqJuKxDm176UXtFCr6iRLFLOVpFxtLMYdOKntIwiKPfgpp6tI7JVl6CS/fymMbTUAlgyjZlmQNFrVoKgRSU9+0eKixJDbPxu6PRlVAE0ceWnlmV2pN2VjK88R4Z5CwlBc7SYK2oYhFm7wzh/ZiPGKUckJ5HjVn6l+IU72YfEWG2RaLcMZCfUKaXHqhZYkwcTD5CgavjDqZVw9sBlmiTXnCI0TBzibZi3qicZ2mYfdDi8c4gN3BFhlbuQofvRlJj0L4KzIs9QsjiMwBxxo5u853M5l4FpnV7JWSbTbWSUmxiC9iTJsVpjFEVZfa93bgvNDxiVdanc/GIv9oOecse4JEZDE3SkpdPAeTElnORnw4mWVcyX4iXn1Tl7pZeqR4UgN6JCZLKR5UngqScMLpwdFitcXD1tVtqpMqYr2qhr5SS5eWvlgHdygeo7wIUPoEBdamPTmXW5JtWZJtWZLtWxxe+EdUZf65KNSiHeU0yP1Dqnmik10ZZWzL9o1IWbW1iGBROHRTUVZ9S1rhJBYPG0sXHeMe4okH0hvs3EpNu9EEWRIvwLqRCqb9QIkj+NI7Nc90SeERUZO7vrgjmd0deScnUvMT8STObCGNlhZ9UsZj84pDXSmedID0eafEqyjPhfRUl9lE36JCYtGLdLCsPj1MdpD0da0jGdOe48yFNFUvJifsaE4t2uglgZb8ZorE6tY34xjfEkMsbyRFY2cXm5pPy4/cU9MT8eovJj9j3SctJ5wQT+9eBIq+0lJWCict2/j+pnioGVDUUFfq83gqGCaybmSW0vNKSanl2ElJ6EjlIS9KNpZomLr1RVkiTHxzHPG0brUrG2nFlVbm28MIUjD6z/x6yk+E/DzIb4PzC2F/ToyKH+sX6aPcORvzbwcYKU5TSs/EqbmjPV9sB+4iMznJjGiCoVjouEtjdNZJaun7L5E3TN8D8xJMCogM577J1o7mLHvf55X05P1oyqKNqYyLoIRmVYckrNS4hIVgUWFxDqe1ncmP2Aamu3Y2ZhyalFldbLgxOMd60TRQ/HyGTTO7/smMYOb6PgEVPBJO8eqf2kfjZT6dmfX/BbNzlmFzLnqLzkRfyH3Vi8mPyKzksKdgu+DofBAc7uPDZMXeSCEr/SfTX0HfjdyFyb58suhjKG4uJLJQrGRtS5J7FluKXpHvI7P+LzJr+nmDzKlmY43MZ0HwAtVsOFGN3pds+Xed2deYe2inlUl8iMnjJw5vcZvdOU86XoJBrGTMZlayzL8zHtFPxQEW/RhZiN4DMVk13zlDuIGEM3RzMe+O5ND45PVDeiTToz65q6I+58KXaG8Gtc6pR2YGo6mxkuQ1buwQ/MW+JedCDiWjiKLehbOISWnp9MZv3L1dJ1/BgHyOMw59cj4XI+eeeXOq+Ow9Fy93vzG1h2Aga70HdUQWg+N1GDekTHWzAAAQAElEQVTcyZt0daMO00I2K5rzEUTej4HMXX7uwceYU7XZWPGmjGBFT6SVmae36cusNnDkxvQQTMirNGNj0dfVDb3mAoZ8NOXqk0ziRfvZFpM/BrPqv5JZqXHbjF86c+OXeDuTJ3ImvAQfsXpn8iMyKzm3dS3NrFkx8SoWyZNxiq+BejR3jOYlqzdSY6U8/RzJd0DbqUm2ehvQV/bMHGI4b9ChSekrFsmzquj5Jk79RfLc3/nkT4yXmOtzd16P81zEkRyfoKH6kTlHpHYEzXVeOfdQZj6dXDl5/MTh7Uy+IvdwAJXmqJlDRsKeykQ182lMmk+2iFM/JMliJg3UK/5vciDDuJ8pa1Y8puHjZd3EyOwEZ/LWc+amqdV/JOPr7+SyGREzRz/kDfPXPXeFFKhXfZieIzIn+S+mdgazmu9M/h+jd9F7kjfk8zFyvR96Ph47+VaLsX8mqj3DxmJCegkE69CcwmPRzr3YFLNGU+ZVWBS6uuEOOdE+NhYenSRTTz6DsdJJnYVYC8HqZbDvXs7xOco5vPR8NAai/dzxgwzKVcwg656jOXPquoz/wXVX7vl3cF/u+OuXmdyTet7h4HoX5DqTHqI9HzJ56ut9RrNXZwi9M4S+Q2Nk0cM4/Ig5U92Nc79ILR2c4jxz0VlPug1cEebKsL0IFkeYlITId5n6T3Jd669kHjUG95rOQ+dMXmM0PbkvHeHPYFLrT8RjBmXGZuamD7+kdpDmpeLMuWSHz0u2vjM1NG3TT57P86ZpYrWJln+xXw59i7STcT47n4e7my0e904Dbxr/P8blLPdUMzzHwYzkTUZndl2cjRSp5MXwO+Sb9GRY57eFE4s0p7TFpzbHorfgQObgcKb7N9NzRO5JfmFfFzdkRmpcxppZJL3jH6SZlfMTiM78JvfMV0ady8g5wY7PHewciY/7pPHyPjSx6EOTcCz9jKnembzllYDczFFcVpKcfSG9NLFTZzadyOzRpFRmLQ2qS/q+GG8i753PckT+FQxvx/8DlKX8P0Q3+tCWmi4mT+SXxBRKNpZE4Ztz0F6kRzx+pVqxeNhYytEwSWhbTjkksS0WEW5x9PxiaglLrDPEY5QXQdVF59K4J1dXmuqjqbEkNhZkpU6wEF3dLJfdmrIpT2iqRuyBxM2uMKUvSrGUp3WSkyQs5cVujCVhNrFsK499o5Y+mS4tdSNn230hTvVi8hUZYlss4oESPiG9kDOSslta9Du9emAz6HRbPFbeQ5bemWLqiwrN7pgPFI/xAbsDWMDRo7ofxsmV9IXoCH8FLUr9wgidtm4jtZ6xvcqLzJosu6VDn8RS/I3UamEfrBUtqblUspcWf1yVbIJGT7btR8+iQ+IXUyPEY1sswlIWwrZso638EfmH0mjppCRrnn+SWe0sLfNvwZX/zQyL1cnPsNR8Z/IVuvMP/XiduZgetBdFnvBi8kS1TdfM+GhL9RfJqy/8g0WdmTbknW1YTW1Ri16UzJ/UdyZ/iczlhH8xtYdQPDF38dAynsyrmN1Sd1j/j1T9i3/o+COdn+mPbC89xPjo1FbY1PdgxtH7yvS8BvNaW8xskUMvanE071q9kV7lO7JpxScXYQJD/hfFOcJE+2HyhHg3VzM3ZFb1hdSqQ6rJDXM2PPRJavVhZ+5cMzir9MCp/pGULPxD9kdatQs5U32hZZt+D8ltC8FiDrl5N23Uobmj+cmc44w2phZ9klr1AzM3tQuZh3bOw94H7fjMIJfNQmvxoi3Vf+KfVCRmm0wX/pGY7Xp/qP6RbDl6UYv25id/i+2sfZz5o5m5mB5CvXv10CE8w/ZCRdsSuf3GP5QtM4tEDolXyrT9Yb8Sk+Xx2RESjBN+4o+EL96t5K7mrzRtnMn7p2ejT50ey7Yky7Yky7bEPbavxBNh4pvW+IucTaYb7bhW/eRn/MEyscgd5j3POPTJ1auNyf9DcLmc2Zqzh9aafTI9hAjbtM27KZqzspU/eqNS/cO5RbS4A4MMv/kLmdneC81RgtOK/ysyO/UL5y7z/oq/wqX1TUu4JsSsUtmN/aeZmGWyR1Krv9HkCQbIycXpk3EJExKVPbz0Cx2feGCmYMtOXTxDJF7lN2XN+kEaTKTxm+IZV/TkLuVxNumua6SWwisptA7Fkxz07EZ71eMRVyWN9pWcsXguxKleJM8hO1qyN0roT4hnletL1uiNklDEwVHdfXiLh76QWvViciIDbYtFmGKWyYfyQZMaYSieRQ4aJdwr46gPLTdOp1bBRrNGG1hsW0ijpVI8OQM+OoLgKPttHeY363QWGbSsWTdSq39SGi19ESNtKXzIvPqLyVeIx83V3dKVGCxl1jM9NRpY5NE/Qpoe8XDAhWWopZtmI+pfOI5lXMkO/YMSxawLZUmcDdRNeiZFVosH2xjxFOKJD9J3T590PILXkdhYH8qyLcmyLcmyLcmy3f8bQflNkY3FT4esashvhk0plFhlfm1M8OPklFIgRnOKPI0fHSP+Yg5zEoe9nTfGm0hrT7GxaoaZPZwp/UWTKSXFsL92Hh489BepZdZxFzJpAFt5J3flpXpfutrOxhqfMemJPhlvBeBY9rRv5ADrZlKPuQfW8wAK9LFInsekcL4Tjax8Nx2Hz6IDswnfc8moO3sA/yTHWJxkj1+c1fGZF5tZ1RdSq6aSlfyNzKDc2XfGZFJAMCC9ZIB91z+62kb9Qj5T9SJ57mYoX18EN8Ro2i0GzWCaSOITZKtA9qYpHetoOfUycl+8J8Y74rEnJm+xRuUV4+RIeMSU+S5qPJEODrVykrkZmNJBaitNke8MpE5k9CrXp1Jm5vjJ6mZjTPREjIw41KE7MxuRGaAzn8mErDSeZGI15MY53GIU15CvYSuL+o9xnFjMPTlZ4n2RYjxKfY8y3gowL0WSGrjqj/k3tRbjrc/2pfl49RZpZUWMi2BddQwir5lCycbiRu4hYef1aWJK/t750T2BuzP5dzCMGcvPKIzMAvhjjGY6d6azmvzkNPc+Di2mkwIjWCTfuiYbk9mz9s7kK7irpyMz/Ynx3uI++mlGvNf4GhCjkSt7LArBenhVPmEKfA4W9WgMRL9Dzv6T9GRxKuiVyRMxQqYuPxnXoOrnnuSwLmY6KuvjIlhJ8pcQsuijnIXo6hY75ofNsHb2Bl4tBFSzZ8DRdeoxUjqsG2lg9cWemNnz8sxIA8erN6YHSUP339uacZzZZrVSTQb76UiPd7v8dcT/6LmRI02u7BT8X0xtIq/VLPNHsOMsndmkfSWGlvVq5hv49HKQRaGr2+ju0fRmSHWSN525qUOONVs8voO+CIXq1PpSNeZQdQrLA8eZD2P+K9YM3nk6bzr3pHYyXfSweJGu3of+vCs91ZDVoyf5Tqjl4PhoatUn0xA/vFbSMm58FIJ1vELNXeedcs9JPstHzx2t4WfInI2f2YtJiazUfzLDachMwMg5MZp5re+kK17aYJBXwe1neWRNttfmFF4idi648Ji1mFoCmdZLRLTGxupL8t7h8RmTJ/iUmcCJNm6sjX4grawcnzqzR69p0QRfLIsKee49IhObk3zYcfQvpkZkMaH3hKMnW7dRi45a5L5MyezhOpVyukNitfVO7A+nPXuOU0pz5DA3tUDlmas3aE+Tz8aYildSYPWFTpLkhRM5/ML5zGmY4NQkaz/0lfOJ8lnqM7vOF1cHTb3nILNpndfFQ05OEh9cdGan7cpdzT3padaE+oVUqp9IISuXh/lr8EXm1Q/7htk6jFby2THI/7HO1pXk3hzZmfwMis0XQb+gCyOINZJsW4f5zXGyT/TTkf6T9Kyvox85r3dqkupfTG1FXjT3zchkGXlnvBU0sravYPXOpfhUs6JP0lMNe+E/SA9H2efOJB/9yepnbhI+zyB1on4Y98bUsHjZFJ8u2XwaWW062GoFWbgH1vEuYUrLatoNA7I6Nm2J0Xw3SXhHVhs/bIHX/vCPxC+BxElPFsuzZY/5oaUIfkD8JoX4XkyDXSXbkvz5g7a09M7kK2hgiVY908vfSLNtBlj2JxCyeOIBnZTGX5RGS7CVdzKjXTfq1FLzjIlXSnqjeFJLwxtTew3OtyZ2BrCUB7KEmVWOtvJa2d5p+k2LJVm2JVm2lce+ETNOglThJ7z0ImdNk+3xS/KdyS3ZJm6UxpO+KOOxcSx7xFC60Us/0OKxMkM6SGb1qU/+YQSlGE27xRDHpWypnRQPPeyKpzx3HW/FUUI27awIz+kHbVsi7DDpRokSWtqoPmlPMlVp6EfGTYhDod29h5o5qVMmFrVoam9x9DwQi+UzmEI+u5XH1WK38li8VpIftJSVxpOWbXyfJBktntRAPC8G0eXPrSfoWNxmSXjVOyXFq5VNuuuUlRIhnuqT1uiNcqrsT9TyF2lxHO+avHox+RlW7rMXFRKvzIzUN6ZXYr+GeBg7vhEsexJ7p2U71SG5jSZYwswaigeTqsTG+qY+j9NU6e6qTr6CWfVOiocaS+kN/2N0xHEGfvQMsBepZbbLycTz0QiWibT8pjVjdyafSNGe3IbMtO+ULAlbpfRAL+9GDsWxLdFhO7tsS7ICexhBGjvpUDzWtxZPfHVj31iF3ijyRNxQfazel9zZiC9isNr4RGF2yDdtPEYqPZLsQ6vPoa60vKolZ76JU3+RXIQdLVITQ/Esux6yNMn4lpOzv9OtdufQlZqad5KjxUO7jhCebbEIS13dSHd66VA8/6LoV5/MnqS7bB9JaaNZFKSTJPVDSc2lUjzR4KMjCNrZb+swLbcyu1DNmGVynVwVb6Sm6JPSaOmLGGlLYad3P/kZ7US90PGJV1q5x34inojUoMrMwhPP0od/MiUiy9mIk5xB0jqOvdPL30l3ejxMSpO0tPIkf+VTMd5LxM5w6EUtntrSsoaHLq3jHUtFW3plK8pjeg6aJAHqJk9EhJk9dCzZG5O/hqbXi9JoaSO5eNIzECmZ4GQmE88wu0dxr6jZhxaPValFS9VPFA++VjiJ8RZdGoM4hsQ7g1LzJ+JxjF1PLS1lZhLIos+y/aEs25Is28pj3xiTWLamqhe6fnaLh0PGsbtLi/ZogEXulEwebiGNJ72QM5KyW1p0eVWW4gZfpFL/iRSy+qKpR2xklqhZjsk+RLCMFo+JrIPJX+JoYWY7nhjvNTjVmmSvYQceaVl5/IOmwdQtMdPyRtLqjVMWrTEVfsJLL+qJePXDjPgX07PCH4rHNpMk28pjw6wLPXU8MiFYHoqn/k6JardSGi3Bq2NftarxToonGmgxNVKdpFYNs5LDlCUEKzy18liHJsPIbiiZP+IpLVS3jRIia0g5IhBDWfhOetKOtiTLJkTAh/8dgPyomJ8M+ZGQ3xIRLPL+wngh1eobacy/McC9/NJ40elJcE9HJBf3hBgszkYTR89OGnrHSaan/l8i96QP5hJGBNyMgWBS8xCHHJPk1JzlrTgTH/dJ4+X9aMqiPX0ZcjD5xPQlZ15XtxicA7zBg70d3wAAEABJREFUGoKmFr0Hd1GgcdWC1CG3TYnqstC41DJzjj5pGijOu6W+aQbVP5mR1LljfHTyFb0neea9cu5gp509vV/B3Ho3dibeyZyP/sG8O9GuzCSfd8+ZfJadM5g22uNHN2VjpcCRnn8is/lQ7C2e5CSLeYwj6f5IjrV4ciXc2wxmfmLeAXd5h76SW1pfZHjrFyJYaaOLd0awM5nk887NaAozI+x7pHf5pFhUONyeR3JL/fDWy4Ce+8XUzmBG88XMjYZ1IIt34qOwOhsjpA2/4r+TGTTnKON59ycdb0Xvac49cDQ53xcDWOSZtuvkZ/QQfax63zr2OYKk+sK547h73jo7Ps3J5jNFcw9nZy2dnqbd0roFp2MfPWW8FQzKvSjOdL+R+3KmHyt1dM5EJzL7wtWzn0lOMJhFnTx3IlgZMB4iiwuiZyjV0UiuzUJnUelio8YJ9uXTNZqdu+KuwSD9xPIH0RyPIOV4jzyTBhaDsnKI3hroIUn9fkaG8BajyUnY08cxsrUiksLpzox28U6s8WMgOvfGeImeW7XoOTIzP5pxvAht3LlqzfAxv8/QU/+FqZ2xZjCk95XxciHMPfWyjcZi7Zp7cPpZQiJOu7nnSuamzvHx0eSrjRER8YZ5J9ppHU3DyqOJFD+Hc3Dq+D2LgzF7+5p2y+nM+ydzjui8f5Lb2jPMRUjeJroqV6L5hriYnZwaO7L7eGvncLNXcjY1Duf9SGd+9VONaa1lo54bOYSLyE5c9HrnIL13MiYWRwLuHiPvEqPEGs5smlg1T5LM/diTc5qhkdXIDyOIKZJkVZB82IwZDGZxN++fGck+TInOrPQ+csam3HP0nGRmP9uNueP0UzuCs1Pj3niPmlr9kO7kXM7i2ugf0ZnUT64Z+QgMYNTMQJPQRZ08PsCabN6dGmfYl8/caKL1RzKl/guxe+kiEzMexb2sEUlegtntOcnRDKT9nJVa9GLKiUg+SBYj6KYn4vJZaKx+JUepSWLPgNHJEphZGVsmiZ+ZJ3mR6v9E5rdvkY/bsxdSqw75XMm5/bwvOTNahenIjGedw3TM4bx+2t7J7C7mlt04/4uprcixuYB74+Xek3hpiPfAWH2xJEQ/053Mqn+S2+hhMkczGB1BLJtOBHurmN/k89WnEm7BUNaq12f+F+OtyD0Z84upvUVmp3aSudXrM2T2Cuz1bvTQf+hvzvvTTGkO4+TQg173BFNtdmzz3aNyX8E8mNlBmdp/Dk61N69zzMJjxcbtyAupVZ/MuXwiyKFkOfRMTtLDR6Ml/dGfwMwiOJ0yvayP5mC+A6rjfWlmxePdpmfpzIpf4p1MV/TG1LiUNXeQ5E4Ei75dMxOT1UNRGXYjFu8Tk9PJSOkn69wv0sUdOdV68hUBl6VEMIP1rTNwBTdl0dy2cJLPHfVo6l0hEY+OAMUlXd2+NTbmGsup6idS4APkniNyQXMGhH/4IZA3t0LP1vxIS0vftPgBUdITLdVfJK8uJxOPT61mFg8bS5k9tBwb4ySJbbGI8Efcz1ZLFg8bq3mIQ25ChJXHZBfmUjzb2JbtRSBr5J1aPhSPP2FZWd2adpNikpbJ3+LsEQ+CRaK2i+dLY7DEi7IUatcIu4bsMC036q7VZ1yt6iIz6t9oe/pK8pOcS+4XSqIsynqmZYkw8cbULNExM6zw0F80DiGifRdGpL7YJvSFRhnTUDwmsvyl417CS51cSV+EWvgzjh7Jvp61D60+N6mp+gctccjyRtLqjfTUOkltjijPsjX0A/FE0MCebAut/IWOT0DxMIJ+KRSP7ea2pazSso228kfkH0qjpZNqVXmcjbgTq8u+Vuxo4pUcS40WPZGyUntg2rUVpy37hFvLboncxCxHkh6UEFlD7IigTEL0PjaWbBPiCQkReFpEyc5eR5YIE+GP8Kqd9Jw5ZoUrtGjTQ4yWLhSPJVa3R0rUW3mhlw9zD0qLhZwBEqxGkkb+O9KY/gtjEI/DxEOt+5C0q4qNpc84J0VvtCRmsxYxEDaUZVuSZVt57DulOMueXFr0lTRZkm1Zkm31zytXj3cmXyGJo6JMkmWNdoTMH/FcGeXl3hjJmczQSbL6i+Stl9kkxUi6eGgKLAoiUhPPnalh66Ten+0sE6UnHY+w6SDsMK0PlPYRypP2Dy1HsO/0RY/Kjs0is96Z2lvkVGoPxGJZNiFzgbMTQwxy8dy1lg+tPoxYHMPeSGp3k31jTsVbpCqa1Ae/uoLtItBdh/lCZkjUToonWrhDpZb0pKRq9YmdZGh9UaZsdj9Qy1+kxXG8a/LqJ1q5z96ZfIXuzAw8Sfai7qSmeQyOIJUdpRu99CI9ttOEL2WLfKR40gq0MXI05iFOxnuJ2HOQbgSLRLGUJ/pnUGSJF2ZxAtHEWK62d0rmj3i+ickykVWysZQjQydFb2S+jSZE2JPbUMK6E0/CJ6RvSrK0wld2Jh5Mh01Oh22p7K5KWaXxCBFfWjzxQeuzsY9pMhHvFI+JLKvzJ80uWfOcJGEpja+k0DoUkRza5Jm2aC8djzjUM82END3RErMsD8lF2NGx7ow3IZ7VliNy/ljZNb5liTBxMPlLePVciIcWT2eShxloWyzCUlc32YsKzW7q3iiJHiuP5YB9KDL1OXQFm72cRfuqFf0YPczGSh20t8xGrFFks6q7oS2za+3hoV0vu2Oj/kHKNKmvQX6hrGpdidLpq2rtuTL6hY5PvNLMSX2jlz5p2Y4pdtmWxfPGlIis9pF8OJlngmxT1Y1eOpQQhBS2PZulaJXSSfHEA/WyVbOxFP0zxNNGuiBLZLMQLOWBLNVPQuS1xMbCd9IbLcmyLcmyrTz2h3/4IRAvvxT2t8FsaNZY1fyI+E4GtH4hh6sXyTOA3ygZPFmSj443Mf7kPc3G6q+dwzmVXy/by+XJE2n64jT1DVqvnvkxM3NZQawbp2NuzbnoT/S+nIr1xtSOyPQjDw99EpOVmzKubBLzKc6DJNRZJHMsyQ/dEt/fjOcTjsHXlCQ6ZFR6mDWfFd0D8PCpZU03fgRx1czDY3hPZ1brzEhlNBlm85BOyhzZfGbUg5SzqK87eyaFpUk5yR5NkWx09ugQkylR7WqCfyGV6sXkK/KuHJ9CvIgvxiDy4rkuPT/Z4vN2zPjF1M5gTPO8Iu+A7BcG++7weJ20bXLZfBcxUXP6pjk0TnY6urrNiabdPjpyRUYzglrejyAbnYYXnR5iqp1Q9agZ045XUsjKpTT2O0H3O4L5VM1zAz1YXNP9w9Q4+9/WOnucYWbPXUhPdUg1OWnf407Kx6g7c4yXTAfRT1KySTRnVOpTyf5x0hOHtqy0vTPHiN7HxuJVOY2Xg9Wc7ne7SHV6uKj5hTmFwcqII5Cczr7VMxxrZuNfNJOjidbLNnP3IsjQ3LEz9qkrjq2diJ3JXyL2OQjB4jAv2n0Y7y2+ztLI5+jBg+k5I3PpAXx69s+qy8aqWbKxZlxcZo5ep6OJfGH9DrnnSo6mztnxo4lqNlbmvcfcMzvnmJV8ZpF96QyMD/sukOG0cbirG9YLW8lJDqYl+hNMxt81ku7s6d7TemlNsjP5GSSsfH9zFnG+LHnP3jiNVJZP9l9WuzubbvjRZNWL5Lmi33GtbHy6+HOUPbroqydb5RyNXDy+sSGn8JNPIFjJV6VXoWEdyLrckXsSHGRR7er2oplHJUPo4t2iAd6zTm2i9ySdxoyI4tU2I+nRGO6R7uhfTC2ROeElDvOFnU3tZA5H84p8vqy+dKz0lPQcTEoO2tZT1XxHB1NkUGWZjDp5SsnuPDrS0pyN1Tuu5DRG/metr8fGoi9m36Y5XYju3+QSunmFVW/GxhqfI+RZR8fJXEYh94Pe1e76dGVA8jf2UDYiPYDXyd4xa0M/Fpef2hFY+4DYNytyb2mevgYbiw+SRSuClfeYz5jPFONgK/Q9sXbHJ8upiBKj5Lt5Yu46/fQckXPJL8zdMYaUc01FZhxBB35USjv5LFTq5jB57h+9TrWdvpBoG6USzZG0F7OlGIsiK9n4FVOsEb0Hpfo7k69Ia9JXUmD1L95JkrxoIrMX5zMyrJo3XMTp4tR/IN/J6mo/M+q8ct1Dc+8v401kFEfzltePQGH8TqfOwXjN4kU/kab2LKaNNLNA7/giPa2HnO2KcWqSMdnJU9uH4EbyiQa/do63fHIll5l41YvJSZ9fnmmpgfM1kicOPzkxcva862S37xAzTma9kp7Wn5h74tOQ1+496Mw6dWpntAP1i6kxmJUZjHv/KlbD53/W6MYbnbeYIbgMfdFpIbLal2TFOoE6KjdyF4NZ8QkWoqtbdHouXOPikfbLOInJOs9ei3SluAfW6rm/a3VaV0tTNtY2nq4YvCML/6aZ3e/yZFpyYNj/AtCyZr0Qu/WN+RExkYOhbbEkhcQr20H1ifFu4aVPes7OZbLRKxAsc8Afiid1gClfqNHSkCJLeT6czNPBbsqfsFd+kjJdWcq2ykkfQzzpAa1nq2ZjKfolXF88JoSCsyLQUjasL358a159p+k3viVZtiVZtpXHtkxiZ9fk0j/oqXPGkmzLkmyrf3YmT6Ti1XNhPIlylmgV5VNHfHQzrJ1e+oEWj5WZ0kEyq0/95CtsEpbeKIqpvTJj6QnSU852uKM01c6SBFt/Il7rT5QocTIrdQmtPkvetGWqZjfUohfFocnXfuiTcwKpdhj9K9KVOpxlHWdlzrJ5hShYeSwH7F8cQ7ROx5fGyFoNdgSti3b0J8j0Y5j+/XQCbYuZj7rOpIZvWVkiV9JXSlNXn7QlGVpfTFH4J03mRweTRc3aSF69mPwMK/fZi1qsJq/emRnRG9OjPMsnNZH1RebWf6RlW2ysgxIiaygeeqgq5lDzIFiTZ6/ohtqZ/CVii42lN6ZG8BptSVuiuol4rEPbXnpRO4WKfqJEMUt52sXGUsyhk8oekrDIo59Cmrr0TkmWXsLLt/LYRhNQySBKtiVZg0UtmgqB1NQ3LR5qLInNs7H7o1EV0MSRh1ae2ZVaUzaW8jwx3hkkLOXFTpKgbShi0SbvzKG9GI8YpZxQnkfNmfoX4lQvJl+RYbbFIpyxUJ+QJpdeaFkiTBxMvoLBK6NO5tUDm0GWaFOe8AhRsLNJ9qKeaFynadj90OIxDmB3sEXGVq7CR29G0qMQ/ooMS/3CCCJzwLFGzq7z3UwmnkVmNXulZJuNdVJSLOKLGNNmhWkMUdWl9r0dOC90fOKVVuezscg/Ws45y54gEVnMjZJSF8/BpESWsxEfTmYZV7KfiFff1KVulh4pntSAHonJUooHlaeCJJxwenC0WG3xsHV1m+qkilivqqGv1NKlpS/WwR2KxygvApQ+QYG1aU/O5ZZkW5ZkW5Zk+xaHtyhNXTzpHcgwW3jEWFGitNNLQ2a0elI88UG6DKmxkqisV/mtRZGlR6ZwD/HEAzkT7NxKTbvRBFkSL8S6kQqm/UCJI/jSOzXPdEnhEVGTu764I5ndHXknJ1h35NIAABAASURBVFLzE/EkzmwhjZYWfVLGY/OKQ10pnnSA9HmnxKsoz4X0VJfZRN+iQmLRi3SwrD49THaQ9HWtIxnTnuPMhTRVLyYn7GhOLdroJYGW/GaKxOrWN+MY3xJDLG8kRWNnj1DzaTnzb89T0xPx6i8mPyNXxN+ZXH16D1kI9E1LWSmctGzj+5vioWZAUUNdqc/jqWCYyLqRWUrPKyWllmMnJaEjlYe8KNlYomHq1hdliTDxzXHE07rVrmykFVdamW8PI0jB0gqJF/a/AOwvhPwo+MzbL4r8zMjiF93lr18WczbB74pTO/wvtgN3MfeiOlN4JFhrxtIYmU1pfJLReYd/xNtMfK5lcZ68e+6pw70Qu/dVcecrqeV9aM6ijWnMiqCEZlWHJKzUcgWdmL0JRlG8H0rjEVst3bWz5dhJ5lWHdJHnvjn6pGmg+PkMm2Zm/ZN5TWZ0NH3hHpkTfSH91YvJ/3Os+7gq78GxfJRP9L3ouZB7qheTH8GAurCn4FX35Ts/G+W0JV3Mi5CmkLRkwhu5N4fpyCFUD+WSpUlxs2N0NU9bksxdxKLOHo/I99HZ5P+ZzJpzGcWsajZWxuBmVNQQM+9+RMzmy7/rzL4GE9PLVeNH78G0vcZ30b5fTC1xzG3OzDd2Ph+J1dnV2TjTGXmH6P9AZsxnJslZ8KXxmMY+81eykArBWaocXXn0LfKufCTa0hM8Me/MaM6ykjATcPCjOVe9SM40djRNTEBmjyZNpWk35lFLmt6SnjO/16K36KwHffi8aj4nY+ee6NQO5p7kv5jaQzCQ9bkbkZWX/5DZEbl/SNbVbb0JR8hm4ZMwlZPs3NvqjZk1fto4w4o3bQhW9MT03GvV3NUemO9pZvYw9iK1+iEWbxWJqti47gEcxifhEhb9nKK9PkbuStx1vEt0BGdfuWrcNuOXzh3nGbzqxeSJnAkvkVdN387kR3xqHGctTTaLt8i8CmohkYwJfFzq0fSM5iWrN1JjpTz9HMl3QtupSbZ6G9BX9swcYjhv0KFJ6SsWybOq6PkmTv1F8tzf+eRPjJeY63N3Xo/zXMSRHJ+gofqROUekdgTNdV4591BmPp1cOXn8xOHtTL4i93AAleaomUNGwp7KRDXzaUyaT7aIUz8kyWImDdQr/m9yIMO4nylrVjym4eNl3cTI7ARn8tZz5qap1X8k4+vv5LIZETNHP+QN89c9d4UUqFd9mJ4jMif5L6Z2BrOa70z+H6N30XuSN+TzMXK9H3o+Hjv5VouxfyaqPcPGYkJ6CQTr0JzCY9HOvdgUs0ZT5lVYFLq64Q450T42Fh6dJFNPPoOx0kmdhVgLweplsO9ezvE5yjm89Hw0BqL93PGbuYoZHZlz1Zwadm5qmffG1P5zMLe9i18zeZe+xsb08EbYvA5+8sy4kYlTT40YzU7OSkI9w5gxw9AkWWl4InfQxN7iM+tSDwOYxYU5mguTLtLASiFXhu1FsOjLu9GA6F+3fzFT6QGM4hxJz51kHjmDew1NZXrazdl0jMaJ/hlMav2JeEynzDVMzbhDX0itGtLMHjVx6JPbzHRkZmoQ+bkH703TxOIAPbkLQeub5stq3yJtZDkSwKuR741hvGR8pnOWptH/yC9nOV7NLTkGOoZB30yRSzlCmTvJ05TskRlIdD6HQiStER1BfpApsWlg4UdvwV09/4upHZFZyS9cd/E5Ois1LmN934c5Pds7LI9m1sdHcFOH3sh92DHpTkbKpWSZnepP3u7LPUdQ4jizWONl6ERr3JRFU8vhJLxJGx7YA/ghPclyZpgJXNbVLaWYi3RhR3AUP/oT42+aO/LZcSh1v7D/BSA/DiqRXw7DI6oRJRtLOvSFlqoXycXjV6oVi4eNpcwOk4S25ZRDEttiEeEWR88vppawxDpDPEZ5EVRddC6Ne3J1pak+mhpLYmNBVuoEC9HVzXLZrSmb8oSmasQeSNzsClP6ohRLeVonOUnCUl7sxlgSZhPLtvLYN2rpk+nSUjdytt0X4lQvJl+RIbbFIh4o4RPSCzkjKbulRb/Tqwc2g063xWPlPWTpnSmmvqjQ7I75QPEYH7A7gAUcPar7YZxcSV+IjvBX0KLUL4zQaes2UusZ26u8yKzJsls69Eksxd9IrRb2wVrRkppLJXtp8cdVySZo9GTbfvQsOiR+MTVCPLbFIixlIWzLNtrKH5F/KI2WTkqy5vknmdXORTsniEV75Sfpbr4z+QpwvTznl0mqrVhZncxkltiPcHJHdUMdlBBZQ+yIvNaHVrUWESypGm/xW9ehujP5SzDUkmzLkmzLkmzLkmy/BgVZkm1ZPCe19KK06Xaif9GrDpmZ00Vci4eNpUMnX9G+lVOWskX/YmqvIZ4OGN7TL+1OEi9iTpRJok+SVEN67H+QnqzpksIjoib3+MyyJNuyJNvqn5PLM0wlTO1CatVQEmUhNfRJmRobWPvo2b/d+rHTfSGV6kXy3EWb7Ij4V1LAzIpPiEiveO5MDVsn9f7cz1bPbOd89ArbiqVFGy3JhlmnVp8l2x5jtOUI9m/i0OTWZidlkVslG8uiTewqTe0tZLVHO8mrF5MTotGS3D/iSaYqK49FS5IftJS1Gu0K2S8UDzWqokkHlQfBSnbGXWtOSAeZ1fyVklLLoBttTJZWRIrnSmv0Rjld7E/U8hdpYUXgS9miMzOsJqkurckXFW5x6JOM5IAl2Zal/xzisT39ECnbwFfi2RZm1pXiSQnojdS8iiVa0RK7JfbXSDn1C6VYyhP/V6Qx9QtjWLaZ8AnLaLHfqT512VibNv1IZhnoiXj1N9rGck6UyWzLOODKeGd4auyuZzIRixxOZneX/WG7zB4PklFnJ8ciYZGLOHUF/i9SMzFdlshNDMUzSnidKx4TrLtWjNR+kobWITN65oH2qqdGXJU02ldyxuK5EKd6kTyH7GjJ3iihPyGeVa4vWaM3SkIRB0d19+EtHvpCatWLyYkMtC0WYYpZJh/KB01qhKF4FjlolHCvjKM+tNw4nVoFG80abWCxbSGNlkrx5Az46AiCo+y3dZjfrNNZZNCyZt1Irf5JabT0RYy0pfAh8+ovJl8hHjdXd0tXYrCUWc/01GhgkUf/CGl6xMMBF5ahlm6ajah/4TiWcSU79A9KFLMulCVxNlA36ZkUWS0ebGPEU4gnPkjfPX3S8QheR2JjfSjLtiTLtiTLtiTLtvJYDtjvlPpfALbKr4osflFEJSH6C2MkOT8k8sshgmR8fk2MX50kehFvdQao+Bl9MPkExazObpWNder59ZJeLh1/7omfptPLTavn8E9SS18uKg9djsNUFPekiezUzKx7kmJ6eoyuMLUL6amGWcm/iMnK7JSuTOGIVJO/8EcpJ/Id5HWfmNfuvU3yWWZYv1sOn+yAdK46taxR8aMOMqdykdntu5BaNZWs5G9kFuW+wZ0xmRQQDEgvGWDf9Y+utlG/kM9SvUieuxnK1xjBDTGadotBM5gmkvgE2SqQvWlKxzpaTr2M3BfvifGOeOyJyVusUXnFODkSHjFlvosaT6SDQ62cZG4GpnSQ2kpT5DsDqRMZvcr1qZSZOX6yutkYEz0RIyMOdejOzEZkBujMZzIhK40nmVgNuXEOtxjFNeRr2Mqi/mMcJxZzT06WeF+kGI9S36OMtwLMS5GkBq76Y06WfSKfjg8j9UBU/DgbSVkx25XtS8cg8pppLNlYvA1zSdh5fZoYkL+PfHRP4O5M/h0MY8byMwojswD+GKOZzp3prCY/Oc29j0OL6aTACBbJt67JxmT2rL0z+Qru6unITH9ivLe4j36aEe81vgbEaOTKHotCsB5elU+YAp+DRT0aA9HvkLP/JD1ZnAp6ZfJEjJCpy0/GNaj6uSc5rIuZjsr6uAhWkvwlhCz6KGchurrFjvlhM6ydvYFXCwHV7BlwdJ16jJQO60YaWH2xJ2b2vDwz0sDx6o3pQdLQ/fe2ZhxntlmtVJPBfjrS490ufx3xP3pu5EiTKzsF/xdTm8hrNcv8Eew4S2c2aV+JoWW9mvkGPr0cZFHo6ja6ezS9GVKd5E1nbuqQY80Wj++gL0KhOrW+VI05VJ3C8sBx5sOY/4o1g3eezpvOPamdTBc9LF6kq/ehP+9KTzVk9ehJvhNqOTg+mlr1yTTED6+VtIwbH4VgHa9Qc9d5p9xzks/y0XNHa/gZMmfjZ/ZiUiIr9Z/McBoyEzByToxmXus76YqXNhjkVXD7WR5Zk+21OYWXiJ0LLjxmLaaWQKb1EhGtsbH6krx3eHzG5Ak+ZSZwoo0ba6MfSCsrx6fO7NFrWjTBF8uiQp57j8jE5iQfdhz9i6kRWUzoPeHoydZt1KKjFrkvUzJ7uE6lnO6QWG29E/vDac+e45TSHDnMTS1QeebqDdrT5LMxpuKVFFh9oZMkeeFEDr9wPnMaJjg1ydoPfeV8onyW+syu88XVQVPvOchsWud18ZCTk8QHF53ZabtyV3NPepo1oX4hleonUsjK5WH+GnyRefXDvmG2DqOVfHYM8n+ss3UluTdHdiY/g2LzRdAv6MIIYo0k29ZhfnOc7BP9dKT/JD3r6+hHzuudmqT6F1NbkRfNfTMyWUbeGW8FjaztK1i9cyk+1azok/RUw174D9LDUfa5M8lHf7L6mZuEzzNInagfxr0xNSxeNsWnSzafRlabDrZaQRbugXW8S5jSspp2w4Csjk1bYjTfTRLekdXGD1vgtXdmRPQT8wOgxS+DUjbSYRKiPyDeSWN8L+aAXSXbkvz5g7a09M7kK2hgiVY908vfSLNtBlj2JxCyeOIBnZTGX5RGS7CVdzKjXTfq1FLzjIlXSnqjeFJLwxtTew3OtyZ2BrCUB7KEmbXRymtlO/hN029aLMmyLcmyrTz2jZhxEqQKP+GlFzlrmmyPX5LvTG7JNnGjNJ70RRmPjWPZI4bSjV76gRaPlRnSQTKrT33yDyMoxWjaLYY4LmVL7aR46GFXPOW563grjhKyaWdFeE4/aNsSYYdJN0qU0NJG9Ul7kqlKQz8ybkIcCu3uPdTMSZ0ysahFU3uLo+eBWCyfwRTy2a08rha7lcfitZL8oKWsNJ60bOP7JMlo8aQG4nkxiC5/bj1Bx+I2S8Kr3ikpXq1s0l2nrJQI8VSftEZvlFNlf6KWv0iL43jX5NWLyc+wcp+9qJB4ZWakvjG9Evs1xMPY8Y1g2ZPYOy3bqQ7JbTTBEmbWUDyYVCU21jf1eZymSndXdfIVzKp3UjzUWEpv+B+jI44z8KNngL1ILbNdTiaej0awTKTlN60ZuzP5RIr25DZkpn2nZEnYKqUHenk3ciiObYkO29llW5IV2MMI0thJh+KxvrV44qsb+8Yq9EaRJ+KG6mP1vuTORnwRg9XGJwqzQ75p4zFS6ZFkH1p9DnWl5VUtOfNNnPqL5CLsaJGaGIpn2fWQpUnGt5yc/Z1utTuHrtTUvJMcLR7adYTwbItFWOrqRrrTS4fi+RdFv/pfT7zqAAAQAElEQVRk9iTdZftIShvNoiCdJKkfSmouleKJBh8dQdDOfluHabmV2YVqxiyT6+SqeCM1RZ+URktfxEhbCju9+8nPaCfqhY5PvNLKPfYT8USkBlVmFp54lj78kykRWc5GnOQMktZx7J1e/k660+NhUpqkpZUn+SufivFeInaGQy9q8dSWljU8dGkd71gq2tIrW1Ee03PQJAlQN3kiIszsoWPJ3pj8NTS9XpRGSxvJxZOegUjJBCczmXiG2T2Ke0XNPrR4rEotWqp+onjwtcJJjLfo0hjEMSTeGZSaPxGPY+x6amkpM5NAFn2W7Q9l2ZZk2VYe+8aYxLI1Vb3Q9bNbPBwyjt1dWrRHAyxyp2TycAtpPOmFnJGU3dKiy6uyFDf4IpX6T6SQ1RdNPWIjs0TNckz2IYJltHhMZB1M/hJHCzPb8cR4r8Gp1iR7DTvwSMvK4x80DaZuiZmWN5JWb5yyaI1ZJp+wLpRVrZ3k1WFG/IvpWeEPxWObSZJt5bFh1oWeOh6ZECwPxVN/p0S1WymNluDVsa9a1XgnxRMNtJgaqU5Sq4ZZyWHKEoIVnlp5rEOTYWQ3lMwf8ZQWqttGCZE1pBwRiKEsfCc9aUdbkmUTIqB4bPKdqUXD/heA/QWRHwmvvP3SSJHFsfgEP0n23xws1mlDs7j9JZKxk89JvPwSSVBgodMfvZFCZmfckBriP+W5J72Q4dyd2UR1yCzy2Ucj6eNSktxRlxmvpNa+sodyFe1MzZgtpm96uIRFkUVzVzfmXEhXdXjUkie2s9w2bYz/lHDTwzkW9SdNA8V5t9Q3zaD6JzOCOneMj06+Ih881dTeOXew086+7u6ZM2du8xtzD4NZnKXW9/oH00O0KzPJc9ehr5wLaMPOu0U3ZWOlwOU9/0Rm58U4mWZUm84hqMnZaeh+4TRs1jK4txnM/MS8A+7yDn0lo1pf5MbWL0Sw0kYX74xgZzJJP8kiDk1xMiPse6R3+aRYVNr6Rm5pPbz1MOCY/cr0nMGM5ouZGw3rQBbvxEdgdSZGSBt+xX8nM2jOUcbz7k863ore05x74Ghyvi8GsMgzbdfJz+gh+lj1vnXscwRJ9YVzx3H3vHV2fJqTzWeK5h7Ozlo6PU27pXULTsc+esp4KxiUe1Gc6X4j9+VMP1bq6JyJTmT2hatnP5OcYDCLOnnuRLAyYDxEFhdEz1Cqo5Fcm4XOotLFRo0T7MunazQ7d8Vdg0H6ieUPojkeQcrxHnkmDSwGZeUQvTXQQ5L6/YwM4S1Gk5Owp49jZGtFJIXTnRnt4p1Y48dAdO6N8RI9t2rRc2RmfjTjeBHauHPVmuFjfp+hp/4LUztjzWBI7yvj5UKYe+plG43F2jX34PSzhEScdnPPlcxNnePjo8lXGyMi4g3zTrTTOpqGlUcTKX4O5+DU8XsWB2P29jXtltOZ90/mHNF5/yS3tWeYi5C8TXRVrkTzDXExOzk1dmT38dbO4Wav5GxqHM77kc786qca01rLRj03cggXkZ246PXOQXrvZEwsjgTcPUbeJUaJNZzZNLFqniSZ+7En5zRDI6uRH0YQUyTJqiD5sBkzGMzibt4/M5J9mBKdWel95IxNuefoOcnMfrYbc8fpp3YEZ6fGvfEeNbX6Id3JuZzFtdE/ojOpn1wz8hEYwKiZgSahizp5fIA12bw7Nc6wL5+50UTrj2RK/Rdi99JFJmY8intZI5K8BLPbc5KjGUj7OSu16MWUE5F8kCxG0E1PxOWz0Fj9So5Sm1szYHSyhP6q1dw1mntozszokuJ/J/Pbv3ifVU3t5LqPtzjvS86MdPXen3oGTTuzOoSTb2RWVw7Qw4k2/2QOrMgxDnR1Y8aH8y7TSoGVv16H7tlsK/LZUr+Q5uqTTE9/R2cgmjxr2XRWDTHbdSGfrppKuMVxf+6cYH7rO5Ov4BbK2XP0meM+7xzmbTjbHTI3nbxaM0hLfWxIX71sdLR4Z3pSh3OI/U1v39V0xTgj30FF7iG5a14ol/8f0SH0s9ZMrsWMDnhnXhXV0WVsmmqXyegjT1OydzIh93Ck717Gm+i5ekx5InfkHFVau9/InPTwjq1mRvSF9FSH6boxNd6RNbNJcieCRf+umY3J6qGoDLsRi/eJyelkpPSTde4X6eKOnGo9+YqAy1IimMH61hm4gpuyaG5bOMnnjno09a6QiEdHgOKSrm7fGhtzjeVU9RMp8AFyzxG5oDkDQt6aOZwlieZEKkQ71f8dgPxAKH4M1JX8amjxeHzt9PIXqYkwIZ5vqhWLh42l3DW0HBvjJIltsYjwR9zPVksWDxureYhDbkKElcdkF+ZSPNvYlu1FIGvknVo+FI8/YVlZ3Zp2k2KSlsnf4uwRD4JForaL50tjsMSLshRq1wi7huwwLTfqrtVnXK3qIjPq32h7+kryk5xL7hdKoizKeqZliTDxxtQs0TEzrPDQXzQOIaJ9F0akvtgm9IVGGdNQPCay/KXjXsJLnVxJX4Ra+DOOHsm+nrUPrT43qan6By1xyPJG0uqN9NQ6SW2OKM+yNfQD8UTQwJ5sC638hY5PQPEwgn4pFI/t5ralrNKyjbbyR+QfSqOlk2pVeZyNuBOry75W7GjilRxLjRY9kbJSe2DatRWnLfuEW8tuidzELEeSHpQQWUPsiKBMQvQ+NpZsE+IJCRF4WkTJzl5HlggT4Y/wqp30nDlmhSu0aNNDjJYuFI8lVrdHStRbeaGXD3MPSouFnAESrEaSRv470pj+C2MQj8PEQ637kLSrio2lzzgnRW+0JGazFjEQNpRlW5JlW3nsO6U4y55cWvSVNFmSbVmSbfXPK1ePdyZfIYmjokySZY12hMwf8VwZ5eXeGMmZzNBJsvqL5K2X2STFSLp4aAosCiJSE8+dqWHrpN6f7SwTpScdj7DpIOwwrQ9UfPVJW5IrLcdk3+mLHpUdm0VmvTO1t8ip1B6IxbJsQuYCZyeGGOTiuWstH1p9GLE4hr2R1O4m+8acirdIVTSpD351BdtFoLsO84XMkKidFE+0cIdKLelJSdXqEzvJ0PqiTNnsfqCWv0iL43jX5NVPtHKfvTP5Ct2ZGXiS7EXdSU3zGBxBKjtKN3rpRXpspwlfyhb5SPGkFWhj5GjMQ5yM9xKx5yDdCBaJYilP9M+gyBIvzOIEoomxXG3vlMwf8XwTk2Uiq2RjKUeGToreyHwbTYiwJ7ehhHUnnoRPSN+UZGmFr+xMPJgOm5wO21LZXZWySuMRIr60eOKD1mdjH9NkIt4pHhNZVudPml2y5jlJwlIaX0mhdSgiObTJM23RXjoecahnmglpeqIlZlkekouwo2PdGW9CPKstR+T8sbJrfMsSYeJg8pfw6rkQDy2eziQPM9C2WISlrm6yFxWa3dS9URI9Vh7LAftQZOpz6Ao2ezmL9lUr+jF6mI2VOmhvmY1Yo8hmVXdDW2bX2sNDu152x0b9g5RpUl+D/EJZ1boSpdNX1dpzZfQLHZ94pZmT+kYvfdKyHVPssi2L540pEVntI/lwMs8E2aaqG710KCEIKWx7NkvRKqWT4okH6mWrZmMp+meIp410QZbIZiFYygNZqp+EyGuJjYXvpDdakmVbkmVbeewbtfRJNYv7478A5BfC/FzIb4X8yCgUvySC6hT4VbEFiNd6OdnqDOrOicqLzojW2FjckXnMSIH2/mpJHlJk0bVrejA780PO118k5xT7k57K3Jp69Cd6b6bHemNqR+SWIw8PfRKTlZsyrmwS8ynOgyTUWSRzLMkP3RLf1YznE/6Psn9Rll3XdS1RYP//P8/dAMpO2WlnH0uDJAjwITnninMjep1bNQI/U5LwIKvSw675VngHwEOnFptu9BD8ytmHxvJOZ1fr7EhlOBli8yCdlBnZdHZUAynHqK87O5PC4qRMEsMpkg1PDA8isiWsXU3QL0ilfGHy5Xkr41OIFvKFEfA8PNel5ye2+ByOHb8wtdNZ0zxP5A3Q/mBg3w4ez0nbRpfMbxERNtM3ztAoiXTUGmaiacOHhy7PalZQy/twsuFpeOHpwafaDWWPnDXteEUKsVxKY38TeH8jMF/VPDfQg8Q1jR9Mjdl/szV7zLCzcxekpzxINTlp33FHyseqO2aMR6YD75cUCdiHT5b4n3SrZGeu/IlpwHsfAeOp7EPL/eUs6G+7kOr0rPvSWq08UyTY6FeOzJZE9Cwnnd13zsbU8daLbebuhUCW5Z4dI5+85AjthOyY/MUjn4sgGMM8tHEw2pt/zdLId3TwwPScnr30AHw98WNVCVjFIgGbdVHZOXxNh+P5wfobcs8VGU2d2dHD8XICln3vPvdMZI5dyWcX2RfPwuhg3wKynDaGaw1IL9hKJhlMS/jH2Yy+cyjdiene02ppTbJj8tNJsPx+Mws5H0ve2RtOI5Wlk/2Ltbu76QY/nKx8IXmu6G9cKYGviz6jxPBCn55slTMauvD4xQaZQk8+DsGSr0qvgoNVQOxyR+6JM4hRrTW8cPZRyRK6eFs4gPbMUxvvPUmnMSvCeNomJD0ag7unO/wXphbPnuDFD/EFu5vaiRkO54l8X6yPjpSeIj0HJiUH2tapcn6jA1NkUWkxGXXylJLd8ehIS3MC1juuyDRC/rfW5xEw+iL2Nc3pgjR+I5fQzRNWvRkBG50R8tjRcWIuo5D7gd7V7up0ZUHyN+xQAp4egOckds0K8Mfi0lM7HGlfEPkmhe4tzdNXJ2B8SIxWCJZ3zDfmmyIc2Ap9T1i565NlKqSIUOS3ecLcderpOTxzyS+YuyMMUs41JdlxOB3oYSntyLdQqZph8tw/fE21nb4g3jZKRTgjaS9MSDESRSzZ6CVTrBC+O6XqOyZfntakr0gB63+8E0ny0Hh2L5xvZFk5L1yIUmPqH5DfZHW1nx1VXnHdQ3PvL0YbzypG88rrJ1AYvdupMxitWbTwJ6SpPQvTRppdQO/4QnpaDzJbi3BykhGJ5KntS1BD+aKBX5Hxlk9cyWUnWvnC5KTPj2dbasD5jOTxQ0+OD52Yt052+w0Ro2TXK9LT+hPmnug05Nm9B55dJ0/t9HbAfmFqLMayg3XvP8Vq+PxvjW604XnFLEFl6QtPCx5rX5LlawJ2VG7IXSzGouMYpNYQnp4LrnXRSPtjnIiInbPXIl0p7o60eu5vLU/ramlKwLb1dEXgjRj6jbO7v+WJacnAhtTmiqVDksVf/28A5o+IcfG3wqBtYZKC+Cu2g+oTRru5Fz/RMzuXyYYvh2BmwB8UJ3UAUb6ghkuDFDHlfHAyTwfRlD9ur/xEynTFlLDKSR9dnPQArSeUEzCFv7iri2NcMHAsBC4lIP1Aa54+GGKbfpNakmVbkmVbObZlEjtRk0t/oKfOjCXZliXZVv/tmDyeilfPBaNJlGOiVZRPHvLhzZB29OIPaHGs7JQOJLN6qidfbpNgekNRTO0Vs5aeQHqKEw51mKbaXZLA1p8QrfUnlCgxGUtdgqtn0Ru3TNVEFHl34QAAEABJREFUg1rohWJo8hUPfuJMQNUOw395ulIHx6xjVmaW4OWiYOVYDhC/cATROh1fHCG2GuwQWhfa4R8n049l+vt0A20Lsx923UkN3bJiIlfSV5Smrp60JRm0vjBFoZ9oMj8qiBg1a0Py8oXJT7dyn71QC8vJy3fMjvAN06OcpZMaj30he6s/omVbBOxACRIbFIceqoo4qDkQbPLEkgbYjslfPLIImN4wNZxntCVt8fIm4lgHt734Qu0oWPgTShRjymkXAVPEQSeVPUiCkYc/uTR16R0lWXpxL93KsQ3HQSUDYbItyRpYqIWmgkM19Y2LQw2TCJ5A9IfDSkDjRx60ciYqtaYETDlPGO10Ekx52IkkcBsUvtAm785Be2E0fJgyoZxHzkz1C6KUL0y+PMtsC8OdtaA+Lk0uvaBlCTd+YPLlLF4ZdTKvHrAZiIk25QQPFwU7QbIX6gmN6jQNNh5cHKMARAc2z9rSVfjwTUh6FIK/PMtSv2AInj3AYUMn6nybycRZyK5mryjZJmAnSoqEfyHCtFnBNAZh5UXtsR0oL+jo+Cta3U/AyD9czpxlj5OILOKGklIX58CkeMwJ+Acns4wq2U+IVt3UpQZLjyhOaoAeERFTigcqp4QkOO70oGhhucUh1BqmOqlC1lM16Ctq8aKlL6yCOiiOYV4IwPRxCtjGPTmXW5JtWZJtWZLtmx/aQmnq4qR3QAYTgoePFCZKO3pxkB2tnihOdCBdBqlhSVSsVvrNRRHTI6Zwd3GiAZkJ7LiVmjbQBGISD8JuSAXRfkCJEXTpHTVnuqTg4WGTu7q4I5ndCL0jE6n5CdEkZjaXhksLfaKMRvDyg11RnHQA6fOOEk9RzgXpKS8miL6FCuILvZAOzOrpMNmBpK+2RrKmPcfMBWkqX5gct8OZWmjDFwW06DemiK9ufWMUo1tiieUNSeHIiSFqPi0/crdGfMCq6Au1Y64I3zG5eno3WRDQN1qKpXCiZRvd3ygONQMUNagr6nM8FQTjsRuyS+l5RUmpZexESfBQ5ZAXigRMNEzd+kJZwo1/4yjitG61K4G05IpW9tuDIaTA4grir5iVqe+YfPz/8qfbp78s5q+K1fnr4eT5y2P+ZjhIZLTxhvzlMTNayEi7imgsJV0ziyPMHQdnIn3/4rknfQ/IMzB2pUY2tvHozHJr3/OK9OR9NMVoYwdvDqEEx8qDJFhqx31BKhhzIfehaIdvtXRXTmDnwUnZVSOgRmAOe+E0UPx8w8bZXf3ErGDn+dvAkx+ePckvSH/5wuT/7Oxv747Jl/dd5BfknvKFyQ/PruRgp8B2gcP7+P7nSVhy0pTB/DakKSQtsuENuYshYptPZAPGHNeRNBZpKwExpMZis3VPd668/33I/wlZPn1Z2Y1ZhRoe4E2VF2ZvXw0H09xs6Xee3VfPXibYOXr47rcad7TvF6YWzxuytzk73zA9eL/umAFp5/m5fxyC0Ugtb4BgNz5LMsqFzD1xNKaIaVkZOyN0b6bLmQ++eHsz3vraBT/0wexgMz1YEt4McMeHM1S+kJxtRDhNbIAmhpOm0rSBfdSSprdIz5nfa+Gbd9cDP3Semu9g7dwTntqBuSf5L0ztwVmIfe6GxPL4D7I7JPcPktUa1ksYIRtDJ2Erk0TubfWG2TV62pjBok0bBAsfn557rZy72gPmd5qdHUZeSK16EIlXhcJKNlz3AAyjk3AJRj9TtFdHyF3xO4928a5g9hVXjdtm/eK545xBK1+YPJ6Z4MXz1PTtmPzwT41xbHGyMV6RfSXUgngyNvC51MPpGc4jyzekhqU8/YzkN6Ht5CRbvQ3wK3ZmhljOC7o0KX2FheSxMnq+EaX6QvLc3/3kTxgtPtfn7jyPeS5iJOPjNJQ/Yubw1A6nucorzj2U2U8nV04ePX5oOyZfnnsYgKU5bPaQkRBTGS9nP41J82ULUaoHSWLspIF6yf+MDGQZ97Nl7YrGNnS02I0MTcSZyatn5sapVX9E1lffkctmRcSMfpAX5r977gpSoF72wfQcnj3Jf2Fqp7Or+Y7J/9F7F70n8kK+j5XrffD5PCL5VouwfxPVzhAwNqQXh2AHZwoNo517kSnGhlPmKRiFWgPqIBPtI2BodJJMPfksRkondQyyDIL1MrBvL874jDKHlp4PR4C0nzt+Y65iR1dm7s5XLfskrnngqf2zs7+9C3Nv+Ins7zM2TC3fEWxvani0jbNx3hcNH04kx5JQ75INexn8BbmDIjH1ufOLt0o9GABjXJjWXJh0IQ1YCseb2gvB6OOOJHj/u/2F2UoPwMoszood2Zcil1SlN5jdQYZaGY6S+k+f/bQwyu6OHEgt23bt4BekvxxkETFs/OAnbjvTse2GXt7wxmnCOkjLX8iP1bsX0k7GfCJvodZsYX43lqaAzJdE/0e/zHJPebaQA+vO7Cz78FAubRt30dH7X5GeDHc/Q8GRQjqa8nK2RKYBQwvfPPdSQJnaE492eHYlv+C6k+/Y38La2UkyOrf8yGnGPj0QburSG3IfckS6k5HyILLck+pPXG/ofvLg4aGTd1lWnd4aN8Uifnju5iUVHrAD6EF6kuWOwW5KoMqeGA5JCzpd5TsmH09TvvVwBpCosaDaF7YDdSG7scWl/1P/ciiJPytikqxvtCTLtiT3nzjJgAcutPEklpTRYJKgbVmSbfyO0ZZL1Mmld5RkSaxSUSqKYzIvBMouPENRT1xdaaoOp4ZJBAzEUscxSK3BcrGhKUE5QVM1ZHcoaqKCKX2hFEk5rZOcSIIpD7thJAmxiWVbOfYNtfiJ6dJiN2S23RdEKV+YfHmW2BaGP6CEjksvyIykREsL/Y5ePWAz0Om2OFbeIUvvmGLqCxU00REfUByjA0QHwAI4fFjjIZy4kj6IjuAvp0WpXzBEp6zbSq0zsld5IbsmS7R08BORFH1DapWQD6wULqm5VCQWLf65LNk4jZ5si0fPQgfxX5gaLo5tYbilGMS2bMOt/BP5B6Xh0omSrDl/IrvaudDOBL7QXvmJdDffMfly4Hp55pdIqq1YWp7MZJaIhzu5wxpgB0qQ2CBySJ71QatcCyGYVI628JtXobpj8hdnqSXZliXZliXZliXZfnUKsiTbsjgnavGF0sbbCf+FXnWQnZkuRLU4BEwHT768fSunLCWE/8LUXl2cLhi8p1/c3SQeYiaKScJPJCkH6bH/QHpi0yUFDw+b3KOzy5Jsy5Jsq/9OXJrBVIKpXZBaOSiJsqAa9IkyNQKw4vCJ32r1yOm+IJXyheS5izbZIdGvSAExFh0Xnl5x7pgask7U+7nPls9uZz58uW1F0kIbLkHB2MnVYxeo72i51A9oiR3W5x8pBjclsjGLNhFVNLU3l9Ue7UhevjA5Lhotyf0nTjKVWTkWLUl+oKXYarRLZL+gONSoiiYdqBwIluz0O9dMSAeyq/krSkoti25oI2JaHirOFa3hG8rpIj6hlr6QFiwEXUoIz85gOUl50Zp8oYKbH/xEVjJgSbZl6Z9dHNvTD0JlG/AV0WwLMXZFcVIC9IbUvIpFuMIloiXiq6ec+gWlSMqJ/svTmPoFI1i22fBxy3AR76ieqgRs46Yfyi4DekK06hvaRnImislsyyjAFaOd7qkRXc1kwhcynMxulP3BdpkYDSSjTiRHIsHIhZ+8BP0XUjM+XZbIjQ+KM0xo3SuOcezOFSG1n0hD6yA7OvOA9qqnhl+ZNNxXZMbiXBClfCF5huxwyd5Qgn9cnFWuLlnDN5QEww8c1uhDW3jwC1IrX5gcz0LbwnBTjJl8UD7QpIYYFGchg4YJ9YpR1EPLDadTq2DDseEGLMLm0nCpKE5mgA8PwRkl3uwQv7FKd5GBljV2Q2rVT5SGS1+IkLYUPsi+6guTLxfHzdVo6YoImLLrGT01GjDy8B8uTY84DLhgGdTiTRPw6hccxTKqZAf9AyWKsQvKkpgNqEF6RopYiwe2MeTJxYkOpO+ePvFoOM+RCNgHZdmWZNmWZNmWZNlWjuUA8Y6V0XV6knQdzh8A+cvg+pMgf6wUjL8oAvyN8MOnIX9hbJ3a6gjAUp9KhLDDKca6M1pIMLsH89dLZhFOnhzP0Kl18fQe+onU0nfshiYNgK28Y+5J9cSMMYPxqlwBQLCSIj0HkjKeSN/AcBqwm0hDxN2RZoAkOrDzBykdnxYasM/bIFh4PymNTfjtirzojulhKR1E6o1v+OnKNb0n/ez8cHrKUWLJ35BZyn3BHSOyKYCzIL1kAHHnP7raRv2CfFv5QvLczVI+J4QbIjRtiEAzME0k0XGyVSB745QOO1pOvoTcF+0Jox3+2BORV6xVeWKUjAQPnzK/RYUnpIOhVk5kbxamdCC1labIbwakjmf1KlenUszO0ZNVTWBN+HiErDjYwbszAc8OoDufkQ2xNJ7IxnKQG2e4xTCuIV/LVhb2j35MLMw9mSyifSHFaJT6jmK05cA8iiQ14Mo/4mSJ4/k6PoaJnUcJl/7LIlIsYtgzpgHPM9NQJGDdnf/fgdwVnHoZn8PQdHT3qOl4dlqZWbUZhU8yu6n1UjbtSN56cC3p1MmZq76QfOofjlRjc/FTSefm7GwtUr7qCaO9ebandiIEu+zM3lc/B0k6CI6VNcBB7LJ2OF+YhO/AqIcjQPobZpQcePntGUkRZ4o4PHk8QpCt6wuSpWchu5PNXWQ0E7lrJimTo6CTxDL8wWnr7oS0XbEK0o7sQ8miQ82aRz4NKR0tN6QB64OeMPfkI05kvHzD1KCfS0peQi5JaeG2q0o5GZiv7Gry4PzG3PLFsy/6E3YLhV+Y2njvIcwVeQd7Nz46GiWWzs9GHp02jD3hZGMlpBuWhdObJeVJ3jj3pYz3HpCRRO5nT7JV6G8UKfxEknJw62U4jOWHPvR3XL3HA+6Ye6KdmG3MYFxU673wz1vpKQexjp7Ib0Itg6PDqZWfmIbowWslLaNGh0Gw4wkVd5435Z4T+ZYPnztaQ8+SmY2e3QuT4rHUf2KW05CdACtnYjj7Wt+RrmhpAwN5Cmq/5RErEl6bU3jxyLnggseuhanFoWm9eEhrBKyP5N3B4xuTx/nKbGCijRtWhj8grVjGp87u4WtbOM4Pi1Ehz72HZ2Nzkg92Hf0LU8NjbOg9weGTrduohYct5L5sye7BNZVyuoP4auudyB+c9sSMU0pz6GBuaoHKM67eQHuafAJrSl6RAtYHnUiSB8cz/ILzzWkYZ2qSFQ9+xfmifEt1dlf5wtVBU+85kN20znPRoJOTRAcuPLvTdsWdzT3padaE+gWplD8hhVguD+a/wReyr3qwL0zoMlrJJyKQ/2Fn60pyb0Z2TH46xeYLgf5AFwzB10qyzQ7xG0dJHO/Xkf6J9Kyfo5+c552cpPwXprY8D819szJZVt4x2nIase0nWL1zKTrVWPiJ9JSDvfAPpIdR4tyZ5MM/WfXsTcL3DKSOVw9GvWFqSDw2xadLNp1GrE0HtlpCFhWUvpUAABAASURBVNwd6XhLMKUlNW1AALGuTVt8OL9NEt6ItfGDLfDsHbMi/AkZx1I9HJqrTv+//kVw/Tlw/qBoBYlFiQyBKNuS/PkHt7T4jsmX04CJVj2jl74hzbZZYNkfh8jiRAN0ojT6Qmm4BLbyjuxo1w11cql51kQrSnpDcVJLwxum9urMtyYiCzDlgJgQYxtaeVbCO5p+ywZl2ZZk2VaOfUPEKHFSBT/uxRcya5psj14k3zG5Jdv4DaXRpC+U0QiMJYYMSjf04g9ocazskA4ks3qqk38whFKEpg0RxLiUkNqJ4tBDVDTl3Hm05UcJ2rS7QjzTD9y2hNvBpBtKlODShupJe5KpSoN+xKhxMRS0GzvUzEmdMr5QC03tzY+eB0TCfDpbyCdaOS4X0cqxeFaSH2gplsYTLdvoPpFkuDipAdG8MBBe/Bk6QcfCbZeEVr6jpGiVEqQ7T1kp4eKUn2gN31BOlfiEWvpCWhzFOycvX5j8dCv32QsVxF8xO1LfML0S8erisHZ0QzB7EntHy3aqg+Q2HMeEGBsUB5GqRMC+UZ/jNJW6UeXJl7Or2oniUMOU3uA/elccM+CHzwJ7IbXsdnEycT4cghlPy2+0Zu2OycdTtCe3QXbad5QsCVlF6QG9tBsyFMW2RIftRNmWZAXswRDSyEkHxbG+uTjR1UDcsAy+ocjjUYPqsXpfcifgX4iAtfEJhdgl32ijsVLpkWQfXD0Hu6LlVS0y840o1ReSC7fDRWp8UJwlV4MWTTK65eTEd3SrjQxdUVPzjuRwcWjX4UKzLQy3VGsg3dGLB8X5C0W/erJ7kkbZPpKiDccoSCeSVA9Kai4VxQkHPjwEp514s0O03MpEwZqxy+Q6cVW8ITWFnygNl74QIW0p7OhdT356O2Ev6Oj4K1q5x35CNOGpgSpmF5o4ix/6iSnhMSfgJzIDpXUUe0cvfUe60+PBpDRJiysn+Ss+FaO9eOQsB71QC09uaUmDBy9axxuLCrf0iq0ox/QcaJI4UDV5PCSY3YOOJHvD5K+u6fVCabi0Ibk46RkQKZnAyUwmzmCih3GvqNkHF8cq1UJL5U8oDrqWO4nRFrpoBPxYEu10Ss2fEI0xop5aWsrOJCBGn2X7g7JsS7JsK8e+YUR8yZqqXtDVEy0OQ0axG6WF9nAAidwpmTy4uTSa9ILMSEq0tNDFK7MUNfCFVKo/IYVYH5p6yIbsEjXLEYmDEMxwcYzHDkz+4kcLO9vxhNFenanWJHstO+ARLSvHP9A0mLoldlrekLR8wymL1ojF5ONefKE+2Ho52olZEf4LU1vuD4pjm02SbeXYYOyCnjoamSCYB8WpvqNEtaEoDZfAq2JfucrRThQnHNDC1Eh1IrVyMJYcTFmCYMGTK8c6OBlCokHJ/BOnaMEaNpQgsUHKIQGxFEN30hPtcEuybFw4KI5NvmNq4SeK7Nm//98ByN8G8//EgL9DXv7SeOHpifOnyfnLYqrzF0gkKuQUsO74QoTecSLzDI72R67spgdk+eWukFRYS5pIL1lbD+Seqr+QWt7S/VlTzpYTk49PX3Iaaw0Rcs1CtNzP/IiLP2kpVU8nBGNJSFSQL4zGLuyF00Bx3pb+jbOl+olZQZ1LRocnX97fIHn2veLcQaSdmN4vZ2+1G3Yn2omZD/+BeTveruwkn7dnJt+y4yymjfbo4U0JWAqMdP4J2c1HEVs8kUmMfawjaXxExlo8cSXc2wzM/vi8AXVpB78it7S+kOWtXxCCpY0u3gwhspnk8+ZmNAWzI9h3pHfppEhUGG7PI3JL9eCtlwWd+4Wpnc6O5guzNxysAmK8iU/BuhshSBt6yb8jO2jOKOt5+xOPtrz3NOcecDg5vxcLMPJs23ny0ztEH1btm0c+V5CUX3DuOO6eVyei05xsvimce5gdWzw9TRvSujnTkY+eYrTlLMq9MGYab8h9melnpQ7PTHg8uy+4evaZ5DiLMerkuROCZcFokBgXhM9SqsOhXBuDx6jUCNSYIC6druFE7oq6FgPpx5c+EM54CCnjHXlGGjAWxTJEbwX4IEn1fiNLeMVwchJi+hgjWxaSFJzu7GgXb8JGjwDp3htGi3du1cJnZHZ+OOt4CG3cuWrN0BG/Z+ip/oKpnb52sKT3FaPlQjD3VEsYjoTtnHtQ+i1BPEq7ueeK7E2d8dHh5KuNFSHRBvMm2mkdTsPKw/EUP8MZnDp6Z1EQJravaUOms+9PzBzefX8it7VnMBdBeU14Wa6E8wtxMZGcGhHaONqKDDd7RWZTYzjvI5395U81trWWQD03MoQKScQvfL05kN47siYSIwHuHiFviVBEGpzdNGEVTySZ+5EnZ5qloeXQD4bgUySJlZB8sBk7WIxxN+/PjmQfTInOWHofcdam3Dl6TmRnv+2GuePUUzuc2alxb7RHTq16kO7kXI5xbfgP707qJ64d+QQWsGp2wEnook4eHUCabN5OjRni0tkbjrf+iGyp/oLIvXQhG7Mexr3YkCQvzu72nMhoFtJ+7kotfGHK8VA+JMYKuukJuXwLjeWvyCi1uTULhieLpxTMXcHup/m///5LCZp7/xdnP8uwmb3vKqfnRHYn57bcn2+JEkxX8DfPMB0zzJ3hTJY/IPfU+kDqQ4gMoLEJMXHjVBG7mJZipQTaWiumRIL1ITfsbMLyfFv6LsjO8hPZnv6uzkI4eWzJdJYNIrbrgnxPOZXg5sf9uXOc/a3vmHw5t1BOzOgzjvocGeY1zDaC7E0nT2sG0lIdGaSvWgIdLd4xPamDM0R849tvNV0RTs9vUJJ7SO6cB+Xy/8G7hH5s7eRaxPAAb+apsK4uRqapcjEZfeRpSvaObMg9jPTtxWjjnavGlifkjsxRpbXxhuxJD29sNTvCL0hPeTBdN0yNN2KzmyR3QjD6d85uRKxDYVl2QyTeE5HpZKT0k3XvF9LFHZlqPfnyAJelhLMD++ZZuJybYjS3LTjJ545qNPWuIB6NjgCMS2oN3xwZca1lqvwJKfABuefwXNCcBUFezR5mScKZSAVv58Lky7Nv6/0/8bdB/oAoXdBS+ULy8uJk4vjkamZxCJiyc9ByZIQTSWwLw4M//D5bLlkcAtY8iEJuXLiVY7IL5lI028iW7YWArKF31NJBcfxxy4o1NG2QIpIWk7/52SMOBCNR28X54giYeCimoHYOsSvIDqblhrpz9YyqVV3Ijuo3tD19RfITmUvuF5REWZT1jJYl3PgbpmaJjtlhBQ/+hUbBhbfvgiGpL2wT/IKGGdGgOMZj/uJRL+7FTlxJH0It+NOPHsm+ztoHV8+Naqr+gZYYsrwhafmG9FQ6kdqMKGfJGvQDogmngZhsc638BR0dB8VhBf1SUBzbzW1LsaJlG27ln8g/KA2XTlSrynECfkekmn2t2OH4KzKWGi16QspK7QHTrq04bYnjbi3RErnxMYeSHihBYoPIIYFiErz3ETDZxsUJ4sLRtBAmO7GKLOHGgz/cq3aiZ+bYFVyuhTY9+HDpguJYwhoeUaLeygt66WDugWlhQc4CCSyHkob+7WlM/wUj4I/LxKHWOEhaKyNg+qxzUviGlsRubCECxAZl2ZZk2VaOfUcpypInlxb6ijRZkm1Zkm313yuuHu+YfLkkRkWZJGYNd4jMP3GuGOal3jCUmezQiWTVF5K3XkyQFCHpwoNTwCgIT02cO6aGrBP1frZZNkpPPBpu04HbwbQ+oLSvUE7aJS3dsnJ8wTBHRvXmpBiK9Y6pvXmmUntAJMyycZkLnIgPIpCLc+daOmj1sGLhCPaGpHaD7BtmKtpCqqJJPejlJYQLgdcO8QXZIVE7UZxwoQ4qtaQnSipXT+Qkg9YXypRN9ANq6QtpcRTvnLz8Ca3cZ++YfLnumB1okuyFuiM1zTFwOKnsMN3Qiy+kx3aa0KWE0EcUJ62ANgwdjniQE6O9eOQZpBuCkSiScsJ/OkVMPBhjAtLESC63d5TMP3G+EREzHisSMGVk0EnhG7LfhuPC7cltUEK6I5qEjkvfKMnScl+xO9HAdNjkdNiWio0qlVU0Gi78i4sTHWh9AnFEkwl/R3GMx6zunzRRsuacSIIpja9IoXVQeHLQJs+2hfbi0fCDPaPZkKYntMQuy4Pkwu3wSHeMNi7OasuInH9Woka3LOHGD0z+4l49F0SDi9Od5MEstC0Mt1RrkL1QQRNN3RtKosfKsRwgDopMPQcvIdhLWWhfucIfvcMELHWgvcUEfK0iGytvgFsmasXgwV0t0ZFhfyBlmtRnkF9QVrmuCNOpq2zFXBn+go6Ov6LZk/qGXvxEy3ZEEWVbFucNU8Jj7SP54GSeDbJNVTf04kEJgkvBtidYCldROlGcaEC1hHICpvCfLk4b6QIxkY1BMOWAmKonwfMsETB0J72hJVm2JVm2lWPfUIufqGajfvJw21NbyB8A+eth/mzI3wr546Dyd8L8JfGC1MqLk9EI6yAYbXz0yVPNzityH01zB300JI/zp0yM7qVBuvsbmWNHinQnS/qC0zG3Zi78470305HeMLXDc8uRBw9+IiKWm7Ku2CTik5+DJNQxkhlL8oO3xG816/nCEfi5koQHWZUeds23wjsAHjq12HSjh+BXzj40lnc6u1pnRyrDyRCbB+mkzMims6MaSDlGfd3ZmRQWJ2WSGE6RbHhieBCRLWHtaoJ+QSrlC5Mvz1sZn0K0kC+MgOfhuS49P7HF53Ds+IWpnc6a5nkib4D2BwP7dvB4Tto2umR+i4iwmb5xhkZJpKPWMBNNGz48dHlWs4Ja3oeTDU/DC08PPtVuKHvkrGnHK1KI5VIa+5vA+xuB+armuYEeJK5p/GBqzP6brdljhp2duyA95UGqyUn7jjtSPlbdMWM8Mh14v6RIwD58ssQsz8SGpJhEwFKcayDY8CR47yNgPJV9aGkoZ6q/7UKq07NektZq5ZkiwUa/cmS2JKJnOensvnM2po63Xmwzdy8Esiz37Bj55CVHaCdkx+QvHvlcBMEY5qGNg9He/GuWRr6jgwem5/TspQfg64kfq0rAKhYJ2KyLys7hazoczw/W35B7rsho6syOHo6XE7Dse/e5ZyJz7Eo+u8i+eBZGB/sWkOW0MVxrQHrBVjLJYFrCP85m9J1D6U5M955WS2uSHZOfToLl95tZyPlY8s7ecBqpLJ3sX6zd3U03+OFk5QvJc0V/40oJfF30GSWGF/r0ZKuc0dCFxy82yBR68nEIlnxVehUcrAJilztyT5xBjGqt4YWzj0qW0MXbwgG0Z57aeO9JOo1ZEcbTNiHp0RjcPd3hvzC1ePYEL36IL9jd1E7McDhP5PtifXSk9BTpOTApOdC2TpXzGx2YIotKi8mok6eU7I5HR1qaE7DecUWmEfK/tT6PgNEXsa9pThek8Ru5hG6esOrNCNjojJDHjo4TcxmF3A/0rnZXpysLkr9hhxLw9AA8J7FrVoA/Fpee2uFI+4LINyl0b2mevjoB40NitELbYSFHAAAQAElEQVSwvGO+Md8U4cBW6HvCyl2fLFMhRYQiv80T5q5TT8/hmUt+wdwdYZByrinJjsPpQA9LaUe+hUrVDJPn/uFrqu30BfG2USrCGUl7YUKKkShiyUYvmWKF8N0pVd8x+fK0Jn1FClj/451IkofGs3vhfCPLynnhQpQaU/+A/Carq/3sqPKK6x6ae38x2nhWMZpXXj+BwujdTp3BaM2ihT8hTe1ZmDbS7AJ6xxfS03qQ2VqEk5OMSCRPbV+CGsoXDfyKjLd84kouO9HKFyYnfX4821IDzmckjx96cnzoxLx1sttviBglu16RntafMPdEpyHP7j3w7Dp5aqe3A/YLU2Mxlh2se/8pVsPnf2t0ow3PK2YJKktfeFrwWPuSLF8TsKNyQ+5iMRYdxyC1hvD0XHCti0baH+NEROycvRbpSnF3pNVzf2t5WldLUwK2racrAm/E0G+c3f0tT0xLBjakNlcsHZIsTtpq8jqXFKvq8/8VYNvC6A/iwhGIshsXSsOeMNrNvfiJZh6NneLY8OV6QnqqP6JkzSkSsAofnMyrc9D0jNuDOpGS0DAdmPzNxUkNSLsSyglYebQHdzVxjAsGjoXApQSkH2jN03c0/Ua3JMu2PkhmNGnpoCRLf7invs1akm31347J46l49VwwmkQ5JlpF+eQhH94MaUcv/oAWx8pO6UAyq6d68uU2CaY3FMXUXjFr6QmkpzjhUIdpqt0lCWz9CdFaf0KJEpOx1CW4eha9cctUTTSohV4ohiZf8eAnzgRU7TD8l6crdXDMOmZlZgleLgpWjuUA8QtHEK3T8cURYqvBDqF1oR3+cTL9WKa/TzfQtjD7Yded1NAtKyZyJX1FaerqSVuSQesLUxT6iSbzo4KIUbM2JC9fmPx0K/fZC7WwnLx8x+wI3zA9ylk6qfHYF7K3+iNatkXADpQgsUFx6KGqiIOaA8EmTyxpgO2Y/MUji4DpDVPDeUZb0hYvbyKOdXDbiy/UjoKFP6FEMaacdhEwRRx0UtmDJBh5+JNLU5feUZKlF/fSrRzbcBxUMhAm25KsgYVaaCo4VFPfuDjUMIngCUR/OKwENH7kQStnolJrSsCU84TRTifBlIedSAK3QeELbfLuHLQXRsOHKRPKeeTMVL8gSvnC5MuzzLYw3FkL6uPS5NILWpZw4wcmX87ilVEn8+oBm4GYaFNO8HBRsBMke6Ge0KhO02DjwcUxCkB0YPOsLV2FD9+EpEch+MuzLPULhuDZAxw2dKLOt5lMnIXsavaKkm0CdqKkSPgXIkybFUxjEFZe1B7bgfKCjo6/otX9BIz8w+XMWfY4icgibigpdXEOTIrHnIB/cDLLqJL9hGjVTV1qsPSI4qQG6BERMaV4oHJKSILjTg+KFpZbHEKtYaqTKmQ9VYO+ohYvWvrCKqiD4hjmhQBMH6eAbdyTc7kl2ZYl2ZYl2b75oS2Upi5OegdkMCF4+EhhorSjFwfZ0eqJ4kQH0mWQGpZExWql31wUMT1iCncXJxqQmcCOW6lpA00gJvEg7IZUEO0HlBhBl95Rc6ZLCh4eNrmrizuS2Y3QOzKRmp8QTWJmc2m4tNAnymgELz/YFcVJB5A+7yjxFOVckJ7yYoLoW6ggvtAL6cCsng6THUj6amska9pzzFyQpvKFyXE7nKmFNnxRQIt+Y4r46tY3RjG6JZZY3pAUjpwYoubT8iP31PSEFqrsRl1jroiyY3L1MEK/FBTnGy3FUjjRso3ubxSHmgGKGtQV9TmeCoLx2A3ZpfS8oqTUMnaiJHiocsgLRQImGqZufaEs4ca/cRRxWrfalUBackUr++3BEFJgcQXxV8zK1HdM/uIst5Rtyln/NwDzV8dx/q7IX3vJ+Qth/vLYrH81JCu2g+pC/pxIhZlw/OjZMT3hJzJR/g/IK+cd37vzCDYE8CynZ7IV4dxD5H3Uoz5xtNxBU4x2trb9wEoEjF7WJMFjNGLJMswEaQQ8vdOcrxg/NHB6kdOT9hPRyoN0kXf3K1LIPnz6Ns7OftuJeR47u5q+4O7siJqZD9JffWHyf/Z1H8u6sxhted9FfkHuKV+Y/PDcmxzsFNgucHg+BoV75rcIp1IeJIml/8T0lzByQ+5CJC6dLJxNGHOsJ2ks0lYCYkiNxWa9lwzM75Fd/xOyfPqzkj3lBIyViVn5QcS88vAUmy/9zrP76nMP7bQyyZWTR48f2kJ+n87/wtTiLMKSsZtdybL/jtFwPoq+dc8MLh6NBrTcjYi98FnCDSTpB2i+cjSmibyJnpUsSAWv/rk3O+4+b2EsvR1JWDuTVs+O6Qml2jVXpJkXdl8Qbz3IEBugifTVyBdOy+LpjV6/aztPvpwFuff0g5+Yq+ntJyxMLTyYO5P/wtQePD/EeS/14V2WNBdzw+JAxL4g35fKgdQuOrXyYPY+YHZxwYIugjJFWvFEEizarIJgJ2d3coaBFr4xPTjb09aMgNFfa4DnQ9pF34aUWRobnYccv1vEI3/ErpxdrX/xVeP2uWbx3HH2opUvTB7PTPDieWL6dkx++KfGOLY42RivyL4SakE8GRv4XOrh9AznkeUbUsNSnn5G8u20nZxkq7cBfsXOzBDLeUGXJqWvsJA8VkbPN6JUX0ie+7uf/Amjxef63J3nMc9FjGR8nIbyR8wcntrhNFd5xbmHMvvp5MrJo8cPbcfky3MPA7A0h80eMhJiKuPl7Kcxab5sIUr1IEmMnTRQL/mfkYEs4362rF3R2IaOFruRoYk4M3n1zNw4teqPyPrqO3LZrIiY0Q/ywvx3z11BCtTLPpiew7Mn+S9M7XR2Nd8x+T9676L3RF7I97FyvQ8+n0ck32oR9m+i2hkCxob04hDs4EyhYbRzLzLF2HDKPAWjUGtAHWSifQQMjU6SqSefxUjppI5BlkGwXgb27cUZn1Hm0NLz4QiQ9nPHb8xV7OjKzN35qmVfep7wv/+4nr7U/nT2t2fh187sodZ3L0xPeDCzyR+w3dGXDyeWd5h33nF9Mz2spX7jIxKj8zYymogbL4MHA2CMm9OaC5MupAFLIVcG2wvB6OOOJHj/u/2F2UoPwKoszood2Zcil1SlN5jdQYZaGY6S+k+f/bQwyu6OHEgt23bt4BekvxxkETFs/OAnbjvTse2GXt7wxmnCOkjLX8iP1bsX0k7GfCJvodZsYX43lqaAzJdE/0e/zHJPebaQA+vO7Cz78FAubRt30dH7X5GeDHc/Q8GRQjqa8nK2RKYBQwvfPPdSQJnaE492eHYlv+C6k+/Y38La2UkyOrf8yGnGPj0QburSG3IfckS6k5HyILLck+pPXG/ofvLg4aGTd1lWnd4aN8Uifnju5iUVHrAD6EF6kuWOwW5KoMqeGA5JCzpd5TsmH09TvvVwBpCosaDaF7YDdSG7scXR+r47sq/6f8f/DcD1N0H+Oqj+bTB8MnGMBhAdAHV6kqgZDYokaFuWZBu/Y7TlEnVy6R0lWRKrVJSK4pjMC4GyC89Q1BNXV5qqw6lhEgEDsdRxDFJrsFxsaEpQTtBUDdkdipqoYEpfKEVSTuskJ5JgysNuGElCbGLZVo59Qy1+Yrq02A2ZbfcFUcoXJl+eJbaF4Q8ooePSCzIjKdHSQr+jVw/YDHS6LY6Vd8jSO6aY+kIFTXTEBxTH6ADRAbAADh/WeAgnrqQPoiP4y2lR6hcM0SnrtlLrjOxVXsiuyRItHfxEJEXfkFol5AMrhUtqLhWJRYt/Lks2TqMn2+LRs9BB/BemhotjWxhuKQaxLdtwK/9E/kFpuHSiJGvOn8iudi60M4EvtFd+It3Nd0y+HLhenvklkmorlpYnM5kl4uFO7rAG2IESJDaIHJJnfdAq10IIJpWjLfzmVajumPzFWWpJtmVJtmVJtmVJtl+dgizJtizOiVp8obTxdsJ/oVcdZGemC1EtDgHTwZMvb9/KKUsJ4b8wtVcXpwsG7+kXdzeJh5iJYpLwE0nKQXrsP5Ce2HRJwcPDJvfo7LIk27Ik2+q/E5dmMJVgahekVg5KoiyoBn2iTI0ArDh84rdaPXK6L0ilfCF57qJNdkj0K1JAjEXHhadXnDumhqwT9X7us+Wz25kPX25bkbTQhktQMHZy9SxKvXShZYU/oZUm6/OPFIObEtmYld3EQVN7c1mXXoXjOybHRaMluf/ESaYyK8eiJckPtBRbjXaJ7BcUhxpV0aQDlQPBkp1+55oJ6UB2NX9FSall0Q1tREzLQ8W5ojV8QzldxCfU0hfSgoWgSwnh2RksJykvWpMvVHDzg5/ISgYsybYs/bOLY3v6QahsA74imm0hxq4oTkqA3pCaV7EIV7hEtER89ZRTv6AUSTnRf3kaU79gBMs2Gz5uGS7iHdVTlYBt3PRD2WVAT4hWfUPbSM5EMZltGQW4YrTTPTWiq5lM+EKGk9mNsj/YLhOjgWTUieRIJBi58JOXoP9CasanyxK58UFxhgmte8Uxjt25IqT2E2loHWRHZx7QXvXU8CuThvuKzFicC6KULyTPkB0u2RtK8I+Ls8rVJWv4hpJg+IHDGn1oCw9+QWrlC5PjWWhbGG6KMZMPygea1BCD4ixk0DChXjGKemi54XRqFWw4NtyARdhcGi4VxckM8OEhOKPEmx3iN1bpLjLQssZuSK36idJw6QsR0pbCB9lXfWHy5eK4uRotXREBU3Y9o6dGA0Ye/sOl6RGHARcsg1q8aQJe/YKjWEaV7KB/oEQxdkFZErMBNUjPSBFr8cA2hjy5ONGB9N3TJx4N5zkSAfugLNuSLNuSLNuSLNvKsRwg3rEyuk5Pkq7DxY7mFzQyLucPgPPXQP5G2L80Fvv3w8nEoYO48+Tjae1fHAlYxSB/YEypO4fPlv4Vk2KQ4qXn4F/I7dmR5uLBi6PM9lx/49xV9USGzkVMpT21C9JTDsaSfyEilt0pXTGFw1NN/oI/SpnIb5HnPmGe3Xub5FtmWX9bhk/sgnSuOrXYsOhhB7KndCG723dBauVUYsnfkF2U+4I7RmRTAGdBeskA4s5/dLWN+gX5lvKF5LmbpfyMIdwQoWlDBJqBaSKJjpOtAtkbp3TY0XLyJeS+aE8Y7fDHnoi8Yq3KE6NkJHj4lPktKjwhHQy1ciJ7szClA6mtNEV+MyB1PKtXuTqVYnaOnqxqAmvCxyNkxcEO3p0JeHYA3fmMbIil8UQ2loPcOMMthnEN+Vq2srB/9GNiYe7JZBHtCylGo9R3FKMtB+ZRJKkBV/4RJ0scz9fxMUzsPEr4QlIsZNZC/mMihHT0JHieGaFIwOjkFhIiz6eJwfyfIx/eCdQdk387y9ix9KxCyC4AfYThbOfOdJaTnzjNvY+hhemkwAqM5JtXJLCZGNs7ky/nrk6HZvsTRnvz++qnHdFe/WtBhHqu7FgYBHt4Kl+YAt+BUQ9HgPQ3ZPZPpCfGVKBXJo9HCLJ16cm4BlY99yQHqyKmo7Q6KgRLkv+EIEYf5Rik1hA54gebIe3YxZ4sbQAAEABJREFUG3haEKCamAVH18lHSOmQbkgD1oc9YXbP49mRBsbLN0wPlIbG32HtOGa2Xa2Uk4H9OtLjbZf/jugfPjcy0uSK3YL+C1Mbz7OaZf8QIsri2U3aJ7G0WK1ifoFPL4MYhVrD8MZwerOkPMkbz97UQcaaLTx+gz6EQnlqfVSFGSpPYWnAMfPBiH/52sGbp/PGc09qJ6aLHoyH1Hof/PNWespBrKMn8ptQy+DocGrlJ6YhevBaScuo0WEQ7HhCxZ3nTbnnRL7lw+eO1tCzZGajZ/fCpHgs9Z+Y5TRkJ8DKmRjOvtZ3pCta2sBAnoLab3nEioTX5hRePHIuuOCxa2FqcWhaLx7SGgHrI3l38PjG5HG+MhuYaOOGleEPSCuW8amze/jaFo7zw2JUyHPv4dnYnOSDXUf/wtTwGBt6T3D4ZOs2auFhC7kvW7J7cE2lnO4gvtp6J/IHpz0x45TSHDqYm1qg8oyrN9CeJp/AmpJXpID1QSeS5MHxDL/gfHMaxpmaZMWDX3G+KN9Snd1VvnB10NR7DmQ3rfNcNOjkJNGBC8/utF1xZ3NPepo1oX5BKuVPSCGWy4P5b/CF7Kse7AsTuoxW8okI5H/Y2bqS3JuRHZOfTrH5QqA/0AVD8LWSbLND/MZREsf7daR/Ij3r5+gn53knJyn/haktz0Nz36xMlpV3jLacRmz7CVbvXIpONRZ+Ij3lYC/8A+lhlDh3JvnwT1Y9e5PwPQOp49WDUW+YGhKPTfHpkk2nEWvTga2WkAV3RzreEkxpSU0bEECsa9MWH85vk4Q3Ym38YAs8e8esCH9CxrFUD4fmqtNZNjmXtGfD9P6f+CugPX8NtC2FHw7/KEcluDkNmGjVM3rpG9JsmyWW/XGILE40QCdKoy+UhktgK+/IjnbdUCeXmmdNtKKkNxQntTS8YWqvznxrIrIAUw6ICTG2oZVnJbyj6TctlmTZlmTZVo59Q8QocVIFP+7FFzJrmmyPXiTfMbkl2/gNpdGkL5TRCIwlhgxKN/TiD2hxrOyQDiSzeqqTfzCEUoSmDRHEuJSQ2oni0ENUNOXcebTlRwnatLtCPNMP3LaE28GkG0qU4NKG6kl7kqlKg37EqHExFLQbO9TMSZ0yvlALTe3Nj54HRMJ8OlvIJ1o5LhfRyrF4VpIfaCmWxhMt2+g+kWS4OKkB0bwwEF78GTpBx8Jtl4RWvqOkaJUSpDtPWSnh4pSfaA3fUE6V+IRa+kJaHMU7Jy9fmPx0K/fZCxXEXzE7Ut8wvRLx6uKwdnRDMHsSe0fLdqqD5DYcx4QYGxQHkapEwL5Rn+M0lbpR5cmXs6vaieJQw5Te4D96Vxwz4IfPAnshtex2cTJxPhyCGU/Lb7Rm7Y7Jx1O0J7dBdtp3lCwJWUXpAb20GzIUxbZEh+1E2ZZkBezBENLISQfFsb65ONHVQNywDL6hyONRg+qxel9yJ+BfiIC18QmF2CXfaKOxUumRZB9cPQe7ouVVLTLzjSjVF5ILt8NFanxQnCVXgxZNMrrl5MR3dKuNDF1RU/OO5HBxaNfhQrMtDLdUayDd0YsHxfkLRb96snuSRtk+kqINxyhIJ5JUD0pqLhXFCQc+PASnnXizQ7TcykTBmrHL5DpxVbwhNYWfKA2XvhAhbSns6F1Pfno7YS/o6PgrWrnHfkI04amBKmYXmjiLH/qJKeExJ+AnMgOldRR7Ry99R7rT48GkNEmLKyf5Kz4Vo7145CwHvVALT25pSYMHL1rHG4sKt/SKrSjH9BxokjhQNXk8JJjdg44ke8Pkr67p9UJpuLQhuTjpGRApmcDJTCbOYKKHca+o2QcXxyrVQkvlTygOupY7idEWumgE/FgS7XRKzZ8QjTGinlpays4kIEafZfuDsmxLsmwrx75hRHzJmqpe0NUTLQ5DRrEbpYX2cACJ3CmZPLi5NJr0gsxISrS00MUrsxQ18IVUqj8hhVgfmnrIhuwSNcsRiYMQzHBxjMcOTP7iRws72/GE0V6dqdYkey074BEtK8c/0DSYuiV2Wt6QtHzDKYvWiMXk4158oZ4QrXpQSrQUBX/CaMtpxJS7xLEtLwRkw2IX9NJBWaJmLxSHHKbq4kAwiYAp54OfrDqzQaVZnHJ6TkRLDUkHphZ+opRSXZzUAkUCJoppD6rHOjgZSqJByfwTp2jBGjaUILFByiEBsRRDd9IT7XBLsmxcOCiOTb5jauEniuzF77MbF4c/AOYvkjh/J+z/k4Tg4cdfC8vnL5BIMHL+nIjxB8bMhm9IIbvaS5ic+r/kPKr9IMsvd4WwJYBzCT3hwIdzB69hNHWqTxwtd9AUoz19bKke/Pj0hbOv1hCBOYCb1xI4tfDd2UmBxlULpA5y65SoLgmOSi07Z/SJ00Bx3pb6xllU/cSspM4do8OTL+89ybPvFecOIu3E9H45e6vdsDvRTsx8+A/M2/F2ZSf5vD0z+ZYdZzFttEcPb0rAUmCk80/Ibj6K2OKJTGLsYx1J4yMy1uKJK+HeZmD2x+cNqEs7+BW5pfWFLG/9ghAsbXTxZgiRzSSfNzejKZgdwb4jvUsnRaLCcHsekVuqB2+9LOjcL0ztdHY0X5i94WAVEONNfArW3QhB2tBL/h3ZQXNGWc/bn3i05b2nOfeAw8n5vViAkWfbzpOf3iH6sGrfPPK5gqT8gnPHcfe8OhGd5mTzTeHcw+zY4ulp2pDWzZmOfPQUoy1nUe6FMdN4Q+7LTD8rdXhmwuPZfcHVs88kx1mMUSfPnRAsC0aDxLggfJZSHQ7l2hg8RqVGoMYEcel0DSdyV9S1GEg/vvSBcMZDSBnvyDPSgLEoliF6K8AHSar3G1nCK4aTkxDTxxjZspCk4HRnR7t4EzZ6BEj33jBavHOrFj4js/PDWcdDaOPOVWuGjvg9Q0/1F0zt9LWDJb2vGC0XgrmnWsJwJGzn3IPSbwniUdrNPVdkb+qMjw4nX22sCIk2mDfRTutwGlYejqf4Gc7g1NE7i4IwsX1NGzKdfX9i5vDu+xO5rT2DuQjKa8LLciWcX4iLieTUiNDG0VZkuNkrMpsaw3kf6ewvf6qxrbUE6rmRIVRIIn7h682B9N6RNZEYCXD3CHlLhCLS4OymCat4Isncjzw50ywNLYd+MASfIkmshOSDzdjBYoy7eX92JPtgSnTG0vuIszblztFzIjv7bTfMHaee2uHMTo17oz1yatWDdCfncoxrw394d1I/ce3IJ7CAVbMDTkIXdfLoANJk83ZqzBCXzt5wvPVHZEv1F0TupQvZmPUw7sWGJHlxdrfnREazkPZzV2rhC1OOh/IhMVbQTU/I5VtoLH9FRqnNrVkwPFk8pWDuCnY/zdkZXqS4IS15y5uzv/0L77vKqZ3InuQ85LwvOTvS1Xt/8gyzY4Z5WziT5Q/Irlr208Nkm35iBpZnjIFaAzs+mLsRsD7khp1NWJ5vS98Fuaf8RLanv6uzEE4eWzKdZYOI7bogX1dOJbj5cX/uHGd/6zsmX84tlBMz+oyjPkeGeQ2zjSB708nTmoG0VEcG6auWQEeLd0xP6uAMEd/49ltNV4TT8xuU5B6SO+dBufx/8C6hH1s7uRYxPMCbeSqsq4uRaapcTEYfeZqSvSMbcg8jfXsx2njnqrHlCbkjc1Rpbbwhe9LDG1vNjvAL0lMeTNcNU+ON2OwmyZ0QjP6dsxsR61BYlt0QifdEZDoZKf1k3fuFdHFHplpPvjzAZSnh7MC+eRYu56YYzW0LTvK5oxpNvSuIR6MjAOOSWsM3R0Zca5kqf0IKfEDuOTwXNGdBkFezh1mScCZSwdu5MPny7Nt7y5nfMfly/gCYvy6aEfNXRIN6wGjjFGPiD4lKt+1vNL3RT7TsF5emJm1ILo4l7HRxDPNCYDF9kHvKvlAca+Q7aumgOP64ZcUamjZIEUmLyd/87BEHgpGo7eJ8cQRMPBRTUDuH2BVkB9NyQ925ekbVqi5kR/Ub2p6+IvmJzCX3C0qiLMp6RssSbvwNU7NEx+ywggf/QqPgwtt3wZDUF7YJfkHDjGhQHOMxf/GoF/diJ66kD6EW/OlHj2RfZ+2Dq+dGNVX/QEsMWd6QtHxDeiqdSG1GlLNkDfoB0YTTQEy2uVb+go6Og+Kwgn4pKI7t5ralWNGyDbfyT+QflIZLJ6pV5TgBvyNSzb5W7HD8FRlLjRY9IWWl9oBp11actsRxt5Zoidz4mENJD5QgsUHkkEAxCd77CJhs4+IEceFoWgiTnVhFlnDjwR/uVTvRM3PsCi7XQpsefLh0QXEsYQ2PKFFv5QW9dDD3wLSwIGeBBJZDSUP/9jSm/4IR8Mdl4lBrHCStlREwfdY5KXxDS2I3thABYoOybEuybCvHvqMUZcmTSwt9RZosybYsybb67xVXj3dMvlwSo6JMErOGO0TmnzhXDPNSbxjKTHboRLLqC8lbLyZIipB04cEpYBSEpybOHVND1ol6P9ssG6UnHg236cDtYFofUNpXKCftH7QcQhw0mfDBIwuLU8DIvCpPGO3NM53aAyJhlo3LXOBEfBCBXJw719JBq4cVC0ewNyS1G2TfMFPRFlIVTepBLy8hXAi8dogvyA6J2onihAt1UKklPVFSuXoiJxm0vlCmbKIfUEtfSIujeOfk5U9o5T57x+TLdcfsQJNkL9QdqWmOgcNJZYfphl58IT2204QuJYQ+ojhpBbRh6HDEg5wY7cUjzyDdEIxEkZQT/tMpYuLBGBOQJkZyub2jZP6J842ImPFYkYApI4NOCt+Q/TYcF25PboMS0h3RJHRc+kZJlpb7it2JBqbDJqfDtlRsVKmsotFw4V9cnOhA6xOII5pM+DuKYzxmdf+kiZI150QSTGl8RQqtg8KTgzZ5ti20F4+GH+wZzYY0PaEldlkeJBduh0e6Y7RxcVZbRuT8sxI1umUJN35g8hf36rkgGlyc7iQPZqFtYbilWoPshQqaaOreUBI9Vo7lAHFQZOo5eAnBXspC+8oV/ugdJmCpA+0tJuBrFdlYeQPcMlErBg/uaomODPsDKdOkPoP8grLKdUWYTl1lK+bK8Bd0dPwVzZ7UN/TiJ1q2I4oo27I4b5gSHmsfyQcn82yQbaq6oRcPShBcCrY9wVK4itKJ4kQDqiWUEzCF/3Rx2kgXiIlsDIIpB8RUPQmeZ4mAoTvpDS3Jsi3Jsq0c+4Za/EQ1G/WTh9ue2gXRyhcmX84fAPnr4Po7YjJxvnH9dZFabP4KuTQIxl8pDz7T+Wtle9dfGstXnuaTT1NfUL18dkXM7iUFIt1wOubWzIV/vPdkKtIbpnZ4th958OAnImK5KeuKTSI++TlIQh0jmbEkP3hL/Gazni8cgZ8pSXiQVelh13wrvAPgoVOLTTd6CH7l7ENjeaezq3V2pDKcDLF5kE7KjGw6O6qBlGPU152dSWFxUiaJ4RTJhieGBxHZEtauJugXpFK+MPnyvJXxKUQL+cIIeB6e69LzE1t8DseOX5ja6XhJCHQAABAASURBVKxpnifyBmh/MLBvB4/npG2jS+a3iAib6RtnaJREOmoNM9G04cNDl2c1K6jlfTjZ8DS88PTgU+2GskfOmna8IoVYLqWxvwm8vxGYr2qeG+hB4prGD6bG7L/Zmj1m2Nm5C9JTHqSanLTvuCPlY9UdM8Yj04H3S4oE7MMnS8zyTGxIikWc9RDswyG950T2NB9MY+ownk+BLfmND74U1HYuTM4TsalfOXL7illOkp3AuoP+6twSxFsv0rUjNMtyz46RT15yhHZCdkz+4pHPRRCMYR7YOBjtzb9maeT9HTwwPadnLz0AX0/8WFUCVrFIwGZdVHYOX9PhOD8slgp6OPf1N2XmG7uOforYTC3ti7OvWrroYXeU2Un2xdMcHewbQEZpY7jWgPSCrWSSwbSEf5zN6DuH0p2Y7j2tltYkOyY/nQTrjxHMgvOxFVh7w/Rk54klf4Zu6W5awQ8nK19IntX9jSsl5BngjBLDC316sowVE/DVnVX4/HJMrTycjlryVTk4WAXELnfknjiLMKq1hhee/akHedh0kbxxSst6T3LGCwuvD6JyNAZ3p3TpfeLR4sfu5Kcf4gvmLr5n7qAHy+9WaQIUMZbeIssPTEoOzApm0sbQh6cY/cQM5LcLtvOsJDkqQcZi3ZXu7L4iXQj531prBIz+iLO7tWyhgIrITC9aSK36ibSkjo++81HOSXbSNveR5K52V6cr7cnfkBmuTexYk/QmKTbAfmFqh9O6L4x8k0L3lubpqxMwPihGKwTL445vu2Ir9D1h5a5PttbcOL9Ri1fMHdOPzu9XHqS3+QVzd4RB2uYOFmDNg3SQT8bW0MXDooMZjnpi2qJvSGvLSEU4I708aXNqQSarN9yLafjyNRhorckndAf0FSlg/Y93IkkeGs/Ohfkd2cTTqJOcnDw2KuUQ/Jn3C1ttnd1VXpF91OYZTMQ2Z9H16QirfendzjhDqTWLFv6ENLVnYdpIsxPozi+kp/Ugs7UIJycZkUie2r4ENZQvHfgVGW/5xJVcdqKVL0xO+vx4tqUGnM9IHj/05PjQiXnrZLffEDFKdr0iPa0/Ye6JTkOe3Xvg2XXy1E5vB+wXpsZiLDtY9/5TrIb+b5vGQW6vDrIjw5RY+sLpaX1D0tqaIL93LJ578jUn0lq+YWppP5FaORhLfiIE47G1FahWXJj8cKTcB9zfWp42amlpSsC6dpCuJLwNQ79xBvubnpiWDGxIba5YOiRZnLTV5HUuKVadHeXo7QV5Af/Jqur/+Jug7MaF0rAnjHZzL36imUdjpzg2fLmekJ7qjyhZc4oErMIHJ/PqHDQ94/agTqQkNEwHJn9zcVID0q6EcgJWHu3BXU0c44KBYyFwKQHpB1rz9B1Nv9EtybItybKtHNsyiW0Bk5NUe0VPn58QrfrC5HEmANnRtWFySa6JskhLvrEK9R29+ANaHCs7pQPJrJ7qyZfbJJjeUBRTe8WspSeQnuKEQx2mqXaXJLD1J0Rr/QklSkzGUpfg6ln0xi1TNdGgFnqhGJp8xYOfOBNQtcPwX56u1MEx65iVmSV4uShYOZYDxC8cQbROxxdHiK0GO4TWhXb4x8n0Y5n+Pt1A28Lsh113UkO3rJjIlfQVpamrJ21JBq0vTFHoJ5rMjwoiRs3akLx8YfLTrdxnL9TCcvLyHbMjfMP0KGfppMZjX8je6o9o2RYBO1CCxAbFoYeqIg5qDgSbPLGkAbZj8hePLAKmN0wN5xltSVu8vIk41sFtL75QOwoW/oQSxZhy2kXAFHHQSWUPkmDk4U8uTV16R0mWXtxLt3Jsw3FQyUCYbEuyBhZqoangUE194+JQwySCJxD94bAS0PiRB62ciUqtKQFTzhNGO50EUx52IgncBoUvtMm7c9BeGA0fpkwo55EzU/2CKOULky/PMtvCcGctqI9Lk0svaFnCjR+YfDmLV0adzKsHbAZiok05wcNFwU6Q7IV6QqM6TYONBxfHKADRgc2ztnQVPnwTkh6F4C/PstQvGIJnD3DY0Ik632YycRayq9krSrYJ2ImSIuFfiDBtVjCNQVh5UXtsB8oLOjr+ilb3EzDyD5czZ9njJCKLuKGk1MU5MCkecwL+wckso0r2E6JVN3WpwdIjipMaoEdExJTigcopIQmOOz0oWlhucQi1hqlOqpD1VA36ilq8aOkLq6AOimOYFwIwfZwCtnFPzuWWZFuWZFuWZPvmh7ZQmro46R2QwYTg4SOFidKOXhxkR6snihMdSJdBalgSFauVfnNRxPSIKdxdnGhAZgI7bqWmDTSBmMSDsBtSQbQfUGIEXXpHzZkuKXh42OSuLu5IZjdC78hEan5CNImZzaXh0kKfKKMRvPxgVxQnHUD6vKPEU5RzQXrKiwmib6GC+EIvpAOzejpMdiDpq62RrGnPMXNBmsoXJsftcKYW2vBFAS36jSniq1vfGMXollhieUNSOHJiiJpPy4/cU9MTolVfmHy5pZXtmFw9vZssCOgb2RBL4UTTZxGwG4pDL6ooapBUHAhG8jFPB4Lx2A3ZpfS8oqTUMnaiJHiocsgLRQImGqZufaEs4ca/cRRxWrfalUBackUr++3BEFJgcQXxV8zK1HdM/uIst5RtyrFNLtlWjm31Hyiy/zv+GvhB/mrIXw/n74OoJET+Yhgd718Qb5ie6CcyUf4PqNuujfMMjB3RyMY2Hp172MD7uJyG619T6U0dr17sEP07smHG0UkwEsQYBEsWjY2kEXD2QbLo44cGTi8l3jWWmZkYTi19yN39ihTa94As6redyP70djX9wd23WqqZzTsvmJ5/9nUfy7qjGG1530V+wd7IJy9M7fDcmxzsFNgucHg+BoV7WBCLvCGFWPpPTH8JfTfkLkTi0snCj6WouRCPwbBkbUuSexa2FL48v0d2/U/IrunnBdlTTsCG5lsgPKCcgBJW733Jln7n2X31uYd2WtnER0wePX5oC7fd3fPEo8VZhCVjN7uSZf8do+H9KgYw+hFikN4DImIV33GWcAMJM3RzMW+HMjQ6efUgPUB7grkLgqWDudRfvL1tI8Tal9GQA7ODzdSwJHnGDennZd0XxJkmojPEBmhiOGkqTRvYRy1peov0nPm9Fr55dz3wQ89Ls2vH1MKD99oTj/bgPBz73A2J5fEf5J4QPmt07hxDqRHoYQv1WHjYQu6tesPsHD3D9GLRpg2ChY9Pz71W3se0mdYXTA+eVwEYfbWGja97AJahk3AJxlOZpr06Qv63Er/zaBfvCmZfcdW4bdYvnjvOGbTyhcnjmQlePE9N347JD//UGMcWJxvjFdlXQi2IJ2MDn0s9nJ7hPLJ8Q2pYytPPSH4T2k5OstXbAL9iZ2aI5bygS5PSV1hIHiuj5xtRqi8kz/3dT/6E0eJzfe7O85jnIkYyPk5D+SNmDk/tcJqrvOLcQ5n9dHLl5NHjh7Zj8uW5hwFYmsNmDxkJMZXxcvbTmDRfthClepAkxk4aqJf8z8hAlnE/W9auaGxDR4vdyNBEnJm8emZunFr1R2R99R25bFZEzOgHeWH+u+euIAXqZR9Mz+HZk/wXpnY6u5rvmPwfvXfReyIv5PtYud4Hn88jkm+1CPs3Ue0MAWNDenEIdnCm0DDauReZYmw4ZZ6CUag1oA4y0T4ChkYnydSTz2KkdFLHIMsgWC8D+/bijM8oc2jp+XAESPu54zfmKnZ0ZebufNWyLz1PGO3ZeRbzlxr7yxd+7Uw/tb57YXrCg5lN/oDtjr58OLG8w7znjuub6WEt9RsfkRidt5HRRNx4GTwYAGPcnNZcmHQhDVgKuTLYXghGH3ckwfvf7S/MVnoAVmVxVuzIvhS5pCq9wewOMtTKcJTUf/rsp4VRdnfkQGrZtmsHvyD95SCLiGHjBz9x25mObTf08oY3ThPWQVr+Qn6s3r2QdjLmE3kLtWYL87uxNAVkviT6P/pllnvKs4UcWHdmZ9mHh3Jp27iLjt7/ivRkuPsZCo4U0tGUl7MlMg0YWvjmuZcCytSeeLTDsyv5BdedfMf+FtbOTpLRueVHTjP26YFwU5fekPuQI9KdjJQHkeWeVH/iekP3kwcPD528y7Lq9Na4KRbxw3M3L6nwgB1AD9KTLHcMdlMCVfbEcEha0Okq3zH5eJryrYczgESNBdW+sB2oC9mNLY7W992RfdUXJn/x/+Nn4++ADmwo8vEkqeYPhkGRBG3Lkmzjd4y2XKJOLr2jJEtilYpSURyTeSFQduEZinri6kpTdTg1TCJgIJY6jkFqDZaLDU0JygmaqiG7Q1ETFUzpC6VIymmd5EQSTHnYDSNJiE0s28qxb6jFT0yXFrshs+2+IEr5wuTLs8S2MPwBJXRcekFmJCVaWuh39OoBm4FOt8Wx8g5ZescUU1+ooImO+IDiGB0gOgAWwOHDGg/hxJX0QXQEfzktSv2CITpl3VZqnZG9ygvZNVmipYOfiKToG1KrhHxgpXBJzaUisWjxz2XJxmn0ZFs8ehY6iP/C1HBxbAvDLcUgtmUbbuWfyD8oDZdOlGTN+RPZ1c6FdibwhfbKT6S7+Y7JlwPXyzO/RFJtxdLyZCazRDzcyR3WADtQgsQGkUPyrA9a5VoIwaRytIXfvArVHZO/OEstybYsybYsybYsyfarU5Al2ZbFOVGLL5Q23k74L/Sqg+zMdCGqxSFgOnjy5e1bOWUpIfwXpvbq4nTB4D394u4m8RAzUUwSfiJJOUiP/QfSE5suKXh42OQenV2WZFuWZFv9d+LSDKYSTO2C1MpBSZQF1aBPlKkRgBWHT/xWq0dO9wWplC8kz120yQ6JfkUKiLHouPD0inPH1JB1ot7PfbZ8djvz4cttK5IW2nAJCsZOrp5FqZcutFzqB7TEkPX5R4rBTYlszKJNRBVN7c1ltUc7kpcvTI6LRkty/4mTTGVWjkVLkh9oKbYa7RLZLygONaqiSQcqB4IlO/3ONRPSgexq/oqSUsuiG9qImJaHinNFa/iGcrqIT6ilL6QFC0GXEsKzM1hOUl60Jl+o4OYHP5GVDFiSbVn6ZxfH9vSDUNkGfEU020KMXVGclAC9ITWvYhGucIloifjqKad+QSmScqL/8jSmfsEIlm02fNwyXMQ7qqcqAdu46Yeyy4CeEK36hraRnIliMtsyCnDFaKd7akRXM5nwhQwnsxtlf7BdJkYDyagTyZFIMHLhJy9B/4XUjE+XJXLjg+IME1r3imMcu3NFSO0n0tA6yI7OPKC96qnhVyYN9xWZsTgXRClfSJ4hO1yyN5TgHxdnlatL1vANJcHwA4c1+tAWHvyC1MoXJsez0LYw3BRjJh+UDzSpIQbFWcigYUK9YhT10HLD6dQq2HBsuAGLsLk0XCqKkxngw0NwRok3O8RvrNJdZKBljd2QWvUTpeHSFyKkLYUPsq/6wuTLxXFzNVq6IgKm7HpGT40GjDz8h0vTIw4DLlgGtXjTBLz6BUexjCrZQf9AiWLsgrIkZgNBPZt/AAAQAElEQVRqkJ6RItbigW0MeXJxogPpu6dPPBrOcyQC9kFZtiVZtiVZtiVZtpVjOUC8Y2V0nZ4kXYeLHc0vaGRcePSLs6t8sH8A5O+Eyvkgf1FEyF8a86fGIH9ATNrCzuevlsg0jM6W5Dh/2uzM0XPwL7zdBe3cYLayfylsjwxbeu4JOzFlalingqldkJ5yMJb8CxGx7EjpiikcnmryF/xRykR+C57PehqxnefZFLAWKAVDb9gF6Cd282LRd377Bbmk2y5ITzmVWPI3ZDXl3nXHiGwK4CxILxlA3PmPrrZRvyDfVL6QPHezdH4jOAnFGARLlvpgBLxD85rE1ppQu2DJhKM0jJElHLueMNrhmUt+wZDPqnnnxqe8ZH6L8ifkLexu5UT2ZDKlA6mtNMX5qVLHs3qVq6dhOFupEzOKlxRHg5d1gqybFkYLB9NGmp3AumPXaYil4URuKAezMflCWvbhqFn7P3g30L+wu0PD8fIdVw2pjy9GWw6cj0jti3/EyRLH83V8DBM7jxK+kBQLmWsg2JVHwP/DU5hPYPvJyZnO/7k89Z1Xobpj8m/noZ+foLvp6WV3ZH/1heS9O7iWdPzkzFdfSD71D0eqsbH4qaRzc3a2Filf9YTR3jzbUzsRgl12Zu+rn4MkHQTHyhrgIHZZO5wvTMJ3YNTDESD9DTNKDvDfAp3kS0eLTZUVkORx0vVy9kISo5/I7uZgJgPDaWaynIBRpjLDvIU6OYZea/jmVbKJgbSEswflYMEW0VK98BF26WhdSAPWBz0hO1s7kbF+zIapQT+XlLyEXJLSwm1XlXIyMF/Z1eTBy3+3thBYlTIwzyS58m6JmhUvmJ7xNDVjdfDOs5vS5a5qFfMLMEVODGG85Ipl0dv18ibk9gW7qknumqSRd7An6Sr0N4oUfiJJObj1MhzG8kMf+juuXt42fTeee1I7MV30YFxU673wz1vpKQexjp7Ib0Qtg6PDqZWfmIbowWslLaNGh0Gw4wkVd5435Z4T+ZYPnztaQ8+SmY2e3QuT4rHUf2KW05CdACtnYjj7Wt+RrmhpAwN5Cmq/5RErEl6bU3jxyLnggseuhanFoWm9eEhrBKyP5N3B4xuTx/nKbGCijRtWhj8grVjGp87u4WtbOM4Pi1Ehz72HZ2Nzkg92Hf0LU8NjbOg9weGTrduohYct5L5sye7BNZVyuoP4auudyB+c9sSMU0pz6GBuaoHKM67eQHuafAJrSl6RAtYHnUiSB8cz/ILzzWkYZ2qSFQ9+xfmifEt1dlf5wtVBU+85kN20znPRoJOTRAcuPLvTdsWdzT3padaE+gWplD8hhVguD+a/wReyr3qwL0zoMlrJJyKQ/2Fn60pyb0Z2TH46xeYLgf5AFwzB10qyzQ7xG0dJHO/Xkf6J9Kyfo5+c552cpPwXprY8D819szJZVt4x2nIase0nWL1zKTrVWPiJ9JSDvfAPpIdR4tyZ5MM/WfXsTcL3DKSOVw9GvWFqSDw2xadLNp1GrE0HtlpCFtwd6XhLMKUlNW1AALGuTVt8OL9NEt6ItfGDLfDsHbMi/AkZx1I9HJqrTmfZ5FzSng3bG768vTTl/zxB4sL/8v8OQOXvhPiOyZf7L/TM5q+Kkmz4cgh24+KkDlCUi7qiNFwC2/GO7GrXDXVyqXnWRCtKekNxUkvDG6b26sy3JiILMOWAmBBjG1p5VsI7mn7TYkmWbUmWbeXYN0SMEidV8ONefCGzpsn26EXyHZNbso3fUBpN+kIZjcBYYsigdEMv/oAWx8oO6UAyq6c6+QdDKEVo2hBBjEsJqZ0oDj1ERVPOnUdbfpSgTbsrxDP9wG1LuB1MuqFECS5tqJ60J5mqNOhHjBoXQ0G7sUPNnNQp4wu10NTe/Oh5QCTMp7OFfKKV43IRrRyLZyX5gZZiaTzRso3uE0mGi5MaEM0LA+HFn6ETdCzcdklo5TtKilYpQbrzlJUSLk75idbwDeVUiU+opS+kxVG8c/LyhclPt3KfvVBB/BWzI/UN0ysRry4Oa0c3BLMnsXe0bKc6SG7DcUyIsUFxEKlKBOwb9TlOU6kbVZ58ObuqnSgONUzpDf6jd8UxA374LLAXUstuFycT58MhmPG0/EZr1u6YfDxFe3IbZKd9R8mSkFWUHtBLuyFDUWxLdNhOlG1JVsAeDCGNnHRQHOubixNdDcQNy+AbijweNageq/cldwL+hQhYG59QiF3yjTYaK5UeSfbB1XOwK1pe1SIz34hSfSG5cDtcpMYHxVlyNWjRJKNbTk58R7fayNAVNTXvSA4Xh3YdLjTbwnBLtQbSHb14UJy/UPSrJ7snaZTtIynacIyCdCJJ9aCk5lJRnHDgw0Nw2ok3O0TLrUwUrBm7TK4TV8UbUlP4idJw6QsR0pbCjt715Ke3E/aCjo6/opV77CdEE54aqGJ2oYmz+KGfmBIecwJ+IjNQWkexd/TSd6Q7PR5MSpO0uHKSv+JTMdqLR85y0Au18OSWljR48KJ1vLGocEuv2IpyTM+BJokDVZPHQ4LZPehIsjdM/uqaXi+UhksbkouTngGRkgmczGTiDCZ6GPeKmn1wcaxSLbRU/oTioGu5kxhtoYtGwI8l0U6n1PwJ0Rgj6qmlpexMAmL0WbY/KMu2JMu2cuwbRsSXrKnqBV090eIwZBS7UVpoDweQyJ2SyYObS6NJL8iMpERLC128MktRA19IpfoTUoj1oamHbMguUbMckTgIwQwXx3jswOQvfrSwsx1PGO3VmWpNsteyAx7RsnL8A02DqVtip+UNScs3nLJojVhMPu7FF+oJ0aoHs+IZo1qic3METLlLHNvyQkA2LHZBLx2UJWr2QnHIYaouDgSTCJhyPvjJqjMbVJrFKafnRLTUkHRgauEnSinVxUktUCRgopj2oHqsg5OhJBqUzD9xihasYUMJEhukHBIQSzF0Jz3RDrcky8aFg+LY5DumFn6iyF78PrtxcWx2L1dRQDSJRP/HHwT5CyJ/tRR/EEyGgOWPhTA0/lQ4fPWEIxx/RRykVv0fMPekF8wlrAr0rgQ2BPBUuJ+srQcyW/UXUsu7spiUdrZmHQSDs7GcNEJzQq1hGkjpwJLg6e07yA+8aymlBnIrs6yKlZPQj6FTRXt+IwWaPt+wcXZXPzGrqHf1wuTLuz959r1i3oKvndn/7XMPa1hJL1e1pzupnbhq3RX9gaeGt8pCOrrz4FecxbQh08m9GR0eCSEW4QlXM5NphrUpSxcnRU1EGNg57RVPXAn3NQN5PKPcsOXR8vt8Y1qZjKWf5e27IASbMnvJmVqv2nmXoKPRTKQtET95pPBfmNrht95sX7vyTqp8UuMH03M6e5ovzBPDwSogxmw/CmQXQnbTVk7AKv6NWdP3kbwhpcN6Twn7weHkzOZ9XBiVFG0eNHnq9ZSpxV545GOU4VmJUL3I8I7k7QvSxC8CTaSv1kB1YXqaNnQ/0kLmIiNgaOGbZwsFlKl98Vyd6obpyWfHs/uCt97sXs4FGPUbR8SyKLVZRksu5KbFgRC60GNkNQI1JolLp3E4cRZRSN8TZyw9LRMwxumP/uQ0YDw4Ng2ZZ+j+v52Dc2v7BrM6CxaSYiFsSNvqYufo8CThJ5KUfzB3xfOo4OldyY4L9rq0cueqNUPP3ktv6nj1F0zt9LWjT0t/+DhXYIeWBnSUsZ3TU3EhebJ2c88VeWzqjI8OJ19tfGNItMH8LrTTOpyGlYfjKX6GMzh19M6iIExsX9OGTGffn5g5vPv+RG5rz2AugvKa8LJcCecX4mIiOTUitHG0FRlu9orMpsZw3kc6+8ufamxrLYF6bmQIFZKIX/h6cyC9d2RNJEYC3D1C3hKhiDQ4u2nCKp5IMvcjT840S0PLoR8MwadIEish+WAzdrAY427enx3JPpgSnbH0PuKsTblz9JzIzn7bDXPHqad2OLNT495oj5xa9SDdybkc49rwH96d1E9cO/IJLGDV7ICT0EWdPDqANNm8nRozxKWzNxxv/RHZUv0FkXvpQjZmPYx7sSFJXpzd7TmR0Syk/dyVWvjClOOhfEiMFXTTE3L5FhrLX5FRanNrFgxPFk8pmLuC3U9zdoYXKf4DMjpvnF7uydx9Vzm1E5lJzkPO+5Izm67u+skzzI4Z5g3hTJY/ILtq2U8Pk236iRlYnjEGag3s+GDuRsD6kBt2NmF5vi19F+Se8hPZnv6uzkI4eWzJdJYNIrbrgnxdOZXg5sf9uXOc/a3vmHw5t1BOzOgzjvocGeY1zDaC7E0nT2sG0lIdGaSvWgIdLd4xPamDM0R849tvNV0RTs9vUJJ7SO6cB+Xy/8G7hH5s7eRaxPAAb+apsK4uRqapcjEZfeRpSvaObMg9jPTtxWjjnavGlifkjsxRpbXxhuxJD29sNTvCL0hPeTBdN0yNN2KzmyR3QjD6d85uRKxDYVl2QyTeE5HpZKT0k3XvF9LFHZlqPfnyAJelhLMD++ZZuJybYjS3LTjJ545qNPWuIB6NjgCMS2oN3xwZca1lqvwJKfABuefwXNCcBUFezR5mScKZSAVv58Lky7Nv7y1nfsfkr86e1gb7/xdgs/BwkWDij4Ua9Ddaso0fmPzFJfqoSRuSi2MJO10cw7wQWEwf5N6yLxTHGvmOWjoojj9uWbGGpg1SRNJi8jc/e8SBYCRquzhfHAETD8UU1M4hdgXZwbTcUHeunlG1qgvZUf2GtqevSH4ic8n/n5Jzy5Yc2XEscOc/5+4NkJJL7tKJLAuSIMCHmTyr6+OsWu0XlERZlPWMliXc+BumZomO2WEFD/6DRsGFt++GIakvtgl+Q8OMaFAc4zH/8Kg397ITN+lDqAX/9KNHsu+z9sHV80U1Vf+BlhiyfEHS8gvSU+lEajOinJU16AdEE04DMdnFtfkLOjoOisMK+qWgOLab25ZiRcs23Mo/kX9QGi6dqFaV4wT8G5Fq9r1ih+OvyFhqtOgJKSu1B0y7LsVpSxx3a4mWyI2POZT0QAkSG0QOCRST4L2PgMk2Lk4QF46mRZjsxCqyhBsP/uHe2omemWNXcF2LNj34cOmG4ljCGh5Rot7KC3p1MPfAtFiQs0ACy6Gkof/2NKb/hhHwx2XiUGscJK2VETB91jkp/IKWxG5sEQFig7JsS7JsK8f+RinKypNLi74jTZZkW5ZkW/33itvjKyZfl8SoKJPErOEOkfknzh3DvOoXhjKTHTqRrPoieevFBEkRki4enAJGQXhq4nxjasg6Ue/nMstG6YlHw206cDuY1geUriuUk/YPWg4hXtE3HjaOjJFb75jam2cqtQdEwiwbl7nAifggArk431yrg1YPKxZHsC9IajfI/sJMRVukKprUg15eQrgReO0QX5AdErUTxQkX6qBSS3qipHL1RE4yaP2gTNlEP6BWX6TFUXzl5OVPaOU++4rJ1/WN2YEmyV7UN1LTHAOHk8oO0xd6+SI9ttOELiWEPqI4aQV0wdDhiAc5MdqLbC3beAAAEABJREFUR55BuiEYiSIpJ/xPp4iJB2NMQJoYyeX2FSXzT5xfRMSMx4oETBkZdFL4Bdlvw3Hh9uQ2KCF9I5qEjku/KMnSuu/YnWhgOmxyOmxLxUaVyioaDRf+w8WJDrQ+gTiiyYS/ozjGY1b3T5ooWXNOJMGUxlek0DooPDlok2fbor08Gn6wZzQb0vSElthleZBcuB0e6RujjYuzbRmR889K1OiWJdz4gclf3NtzQzS4ON1JHsxC28JwS7UG2YsKmmjqvqAkeqwcywHioMjUc/ASgr3Kon3nCn/0DhOw1IH2FhPwXUU2Vt4At0zUxuDBXS3RkWH/QMo0qc8gv6Gsct0RplNX2cZcGf6Cjo6/otmT+gW9/ETLdkQRZVsW5w1TwmPtI/ngZJ4Nsk1VX+jlQQmCS8G2J1gKV1E6UZxoQLWEcgKm8D9dnDbSBWIiG4NgygExVU+C51kiYOhO+oWWZNmWZNlWjv2FWn6imo36ycNtT+2GaOWLyU9nvvmiJDt9g/0D4PzVkb8Ias6V88fC+SskInb7a2W6+1dLmoIUMbqufJq6g+Li3pXW1HFS4upkHz4Zf+NETT384703WyO9YWqHZ8uRBw9+IiKWm7Ku2CTik5+DJNQxkhlL8gdvid9q1vOFI/AzJQkPsio97JpvhXcAPHRqselGD8HvnH1oLO90drXOjlSGkyE2D9JJmZGLzo5qIOUY9b2zMyksJ2WSGE6RbHhieBCRLWHtaoJ+Qyrli8nX81bGpxAt5Acj4Hl4rkvPn9jiczh2/IWpnc6a5nkib4D2BwP7dvB4TtoudGV+i4iwmf7iDI2SSEetYSaaNnx46HpWs4Ja3oeTDU/DC08PPtVuKHvkrGnHK1KI5VIa+5vA+xuB+armuYEeJK5p/GBqzP4329ljhp2duyE95UGqyUn7jm+kfKz6xozxyHTg/ZIiAfvwyRKzPBMXJMUiznoIducR8N5HwPT/CNjckxrT/W0XexsNlKLgWRk1OM7w6nd+6EV2vCP7Usd7d5HuK0JzSd5xxcgnLzlCOyFXTP7ikc9FEIzh+wdFe/OfWRp5fxccmJ7Ts50egK8nfqwqAatYJGCzLio7h+90OJ7/2etvyD13ZDR1ZkcPx8sJWPa9+9wzkTl2JZ9dZD88C6ODfQvIctoYrjUgvWArmWQwLeEfZzP6lUPpTkz3Na2W1iRXTH46CZbfb2Yh52PJO/uF00hldbL/Yu3ubrrBDycrXyTPFf2NKyXwddFnlBhe6NOTbTmjoYvHLzbIFHrycQiWfCu9Cg5WAbHbHbknziBGtdbwwtlHJUvo4m3hANozT2289ySdxqwI42kXIenRGLx6usP/wtTi2RO8+SG+YHdTOzHD4TyR74v10ZHSU6TnwKTkQNs6Vc5vdGCKLCotJqNOnlKybzw60tKcgPWOOzKNkP9Z6/MIGH0R+5rmdEEaf5FL6OYJW29GwEZnhDx2dJyYyyjkfqB3tbs6XVmQ/A07lICnB+A5iV2zAf5YXD21w5GuCyJ/SaHXlubpqxMwPiRGKwTLO+Yb800RDmyFvies3PXJMhVSRCjy2zxh7jr19ByeueQ3zN0RBinnmpLsOJwO9LCUrsi3UKmaYfLcP3yn2k5fEG8bpSKckbQXJqQYiSKWbPSSKVYIvzql6ldMvp7WpK9IAet/vBNJ8tB4di/ON7KsnBcuotSY+g/Ib7Jd7WdHlVfce2ju/cVo41nFaF55/wQKo3c7dQajNYsW/oQ0tWcxbaTZBfSOH6Sn9SCztQgnJxmRSJ7adQlqKF808FdkvOUTN7ntRCtfTE76/Hi2pQacz0geP/Tk+NCJeetkX78hYpTsekV6Wn/C3BOdhjy798Cz6+Spnd4O2F+YGoux7GDd+0+xDZ//WaMbbXheMUtQWfrC04LH2pdkfSdgR+ULuYvFWHQcg9QawtNzw10XjbQ/xomI2Dl7L9KV4tWRtuf7reVp3ZamBOyynq4IvBFD/+Ls7m95YloycEFqc8XqkGRx0laT17mkWHV2lKO3F+QF/PeuCqJGK03lzv9nuJV/Ij64VzvR08dfEcWx4et6QnqqP6JkzSkSsAofnMzbOWh6xu1BnUhJaJgOTP7m4qQGpF0J5QSsPNqDu5o4xgUDx0LgUgLSH2jN069o+o1uSZZtSZZt5diWSexETS7dMJW7e+rMWJJtWZJt9d8Vk8dT8fbcMJpEOSZaRfnkIR/eDOmKXv6AFsfKTulAMqunevJ1mwTTG4piaq+YtfQE0lOccKjDNNXukgS2/oRorT+hRInJWOoSXD1Lv7hlqiYa1KIXxdDkGw9+4kxA1Q7D//J0pQ6OWceszCzB66Jg5VgOEH9wBNE6HT8cIbYNdgiti3b4x8n0xzL9+3QDbYvZD7vvpIZuWTGRK+krSlNXT9qSDFo/mKLQTzSZHxVEjJp1QfLyxeSnW7nPXtRiOXn5FbMj/ILpUc7qpMZjP8je6o9o2RYBO1CCxAbFoYeqIg5qDgSbPLGkAXbF5C8eWQRMb5gazjPakrZ4eRNxrIPbXr6oKwoW/oQSxZhy2kXAFHHQSWUPkmDk4U8uTV16R0mWXtyrWzm24TioZCBMtiVZA4taNBUcqqlfuDjUMIngCUR/OKwENH7kQStnolJrSsCU84TRTifBlIedSAK3QeGLNnl3DtqL0fBhyoRyHjkz1W+IUr6YfD3LbAvDnbWgPi5NLr2gZQk3fmDydRZvRp3M2wM2AzHRppzg4aJgJ0j2op7QqE7TYOPBxTEKQHTg4llbuoUPvwhJj0LwL8+y1G8YgmcPcNjQiTrfZjJxFtnV7BUl2wTsREmR8B9EmDYrmMYgrLyoa2wHygs6Ov6KVvcTMPIPlzNn2eMkIot4QUmpi3NgUjzmBPyDk1lGlewnRKtu6lKDpUcUJzVAj4iIKcUDlVNCEhx3elC0WG5xCLWGqU6qkH2qBn1HLS9a+sEqqIPiGOZFAKaPU8Au3JNzuSXZliXZliXZ/vJDW5SmLk56B2QwIXj4SGGidEUvB9nR6oniRAfSZZAalkTFaqW/XBQxPWIK3y5ONCAzgSteSk0baAIxiQdhX0gF0X5AiRF06R01Z7qk4OFhk7u6uCOZ3Qj9RiZS8xOiScxcXBouLfpEGY3g9YPdUZx0AOnzFSWeopwb0lNeTBB9iwrii16kA7N6Okx2IOmr7UjWtOeYuSFN5YvJcTucqUUbvhTQ0l9MEd9u/WIUo1tiieULksKRE0PUfFr+yD01PSFa9cXkp+eK6FeUrDm9mzQI6BfpjKVwoumzCNgXikMvqihqkFQcCEbyMU8HgvHYF7JL6XlFSall7ERJ8FDlkBeKBEw0TN36QVnCjf/iKOK0brUrgbTkjlb224MhpMByBfFXzMrUr5j8xVluKduUY5tcsq0c2+o/UMksiRx7xP/xx0H+lshfBvkLIcZfDMl1/8tiewjY1EnyV83/5N+7LpyLsb2PbOzCt5fX9N5X3PfQFKONHfMxyysRMHpzTwv00InIRRGpDaewfIrLr9rZe8ymk76xkHSDbETLfYy8cBoo5vecvgtnS/UTs4KdXDs6PPnh2ZP8hvSXLyb/z87+9l4x+XrfRX5D7ilfTH54diUHOwW2Cxzex+dngFLhp6B9eSSEWPpPTF8JfV+4w3RkGDZ1CFY1F+Kx1IL4keYeKIuZJQlf7+9P/n/CrpjlnSsnYKxKzFUfRMwrD0+x+erfPDvvns9kIldmphjt8K8aX9n5vzC1+LGvOfvecO/ko3ju5z7al0ebptyNiL3wWZJRLmTuiaMxTUzLZrw1Qvdnupz54Iu3N+Ot7y74oQ9mB5vpwZLwdoA7Ppyh8kVythHhNLEBmhhOmkrTBvZRS5reIj1n/l0Lv3h3PfBD56n5DtbOPeGpHZh7kv+FqT04C7HP3ZBYHv9Bdofk/kGyWsO+hBGyMXQStjJJ5N5WvzC7Rk8bM1i0aYNg4ePT810r5672gPmdZmeHkRepVQ8i8apQWMkF9x6AYXQSLsHoZ4r26gi5K/7No928K5h9xa1x26xfnjvOGbTyxeTxzARvnqem74rJD//UGMeWk43xiuwroRbEk7GBz6UeTs9wHll+QWpYytPPSH4T2k5Ocqm3AX7HzswQy3lBlyalr7BIHiuj5xdRqi+S5/7uJ3/CaPG5PnfnecxzESMZH6eh/BEzh6d2OM1VXnHuocx+Orly8ujxQ7ti8vXcwwAszWGzh4yEmMp4OftpTJovW0SpHiSJsZMG6iX/Z2Qgy7ifLbsrGtvQ0WJfZGgizkxePTNfnFr1R2R99Sty2ayImNEP8sL8d89dQQrUyz6YnsOzJ/lfmNrp7Gp+xeT/0XsXvSfyQr6Plfs++HwekfxSi3D9JqqdIWBsSC8OwQ7OFBpGO/ciU4wNp8xTMAq1BtRBJtpHwNDoJJl68lmMlE7qGGQNgvUysG8vzviMMoeWng9HgLSfO/7GXMWOrszcN99a9qXnCaP9Z2f///t/eS7+tButz7hg7s13BHNP8gdk8+xMDR9OJMeSUO+SC/Yy+AtyF0Vi6ryJ7IejpcIFKeWCpMXeSz1WMQKr0pg02BoEo4VNSfD+d/sX5hZ6AFZlcVZckX0pcklVeoPZHWSoleEoqf/ps58WRtndkQOpZdtVO/gN6S8HWUQMGz/4iZed6bjsht7e8MZpwjpIy7+QH6t3L9JOxnwib6HWbDG/G0tTQOZLov9Hv81yT3m2kAN7Z3aWfXgol7aNu+jo/a9IT4a7n6HgSCEdTXmdLZFpwNDCL557KaBM7YlHOzy7kt9w7+Q7rm9h7ewkGZ1b/shpxj49EG7q0i/kPuSIdCcj5UFkuSfVP3Hf0P3kwcNDJ++yrDq9NW6KRfzw3M1LKjxgB9CD9CTLHYPdlECVPTEckhZ0usqvmHw8TfnWwxlAosaCaj/YDtRFdmPL0fq+b2Rf9cXkr76zLO39X/g/8RdCTPkLYTBJ0LbMb25bGH7F5OtHz1+YWtwSdro4hnkRKLvxXB71xO1KU3U4NUwiYCCWOo5Bag2Wiw1NCcoJmqohV4eiJiqY0g9KkZTTOsmJJJjysC+MJCE2sWwrx/5CLT8xXVr2hcy2+4Yo5YvJ17PEtjD8ASV0XHpBZiQlWlr0O3p7wGag021xrLxDlt4xxdQXFTTRER9QHKMDRAfAAjh8WOMhnLhJH0RH8C+nRanfMESnrK+V2jOyt7zIrskSLR38RCRFvyC1SsgHVgqX1FwqEosW/1yWbJxGT3aJR8+ig/hfmBoujm1huKUYxLZsw638E/kHpeHSiZKsOf9EdrVz0c4EvmhvfiLdza+YfB24X575FUl1KZaWJzOZJeLhTu6wBtiBEiQ2iBySZ33QKtciBJPK0RZ/eRWqV0z+4iy1JNuyJNuyJNuyJNuvTkGWZFsW50QtX5QuvJ3wv9BbB9mZ6UJUi0PAdPDk6+3bnLKUEP4Xpvbq4nTB4Hf6w91N4iFmopgk/D8r+EwAABAASURBVESScpAe+x9IT2y6pODhYZN7dHZZkm1Zkm3134mrGUwlmNoNqZWDkigLqkGfKFMjABuHT/xVq0dO9w2plC+S5y7aZIdEvyMFxFh0XHh6xfnG1JB1ot7P92z57Hbmw9dtK5IWbbgEBWMnV89S6qWLlkv9gJYYsj7/SGXBTWkI0aJNRBVN7c1ltUdXJC9fTI6LRkty/4mTTGVWjkVLkj/QUmwb7RLZLygONaqiSQcqB4IlO/2bayakA9nV/BUlpZZFX2gjYloPFeeO1vALyukiPqFWX6QFC0GXEsKzM1hOUl60Jl9U8OIHP5GVDFiSbVn6zy6O7ekHobIN+I5otoUYu6M4KQF6Q2reYhGucIloifjqKad+QymScqL/5WlM/YYRLNts+LhluIjfqJ6qBOzCTT+UXQb0hGjVL2gbyZkoJrMtowB3jHa6p0Z0NZMJX2Q4md0o+4PtMjEaSEadSI5EgpELP3kJ+l9Izfh0WSI3PijOMKF1rzjGsW+uCKn9iTS0DrKjMw9obz01/M6k4b4jMxbnhijli+QZssMl+4IS/OPibLm6ZA2/oCQYfuCwRh/a4sFvSK18MTmehbaF4aYYM/mgfKBJDTEoziKDhgn1jlHUQ8sXTqe2YMOx4QYswsWl4VJRnMwAHx6CM0r8skP8xSrdRQZa1tgXUqt+ojRc+kGEtKXwQfZVX0y+Lo6bq9HSHREwZdczemo0YOThf7g0PeIw4IJlUMubJuDVbziKZVTJDvoPlCjGbihLYjagBukZKWItHtjGkCcXJzqQvu/0iUfDeY5EwD4oy7Yky7Yky7Yky7ZyLAeI31gZXacnSdfhYkfzGxoZFx795uwqX5QElSU94f/yp0b+KMhfKflLoTgQ7OT9q2Hk/IXxwOR4mqaXv0RSO/gPUkvfcRc0aQBs5R1zT6onZowZLC8eGYLlXlojf3zbA60lSW/IgdHCT0zh8IjJX/CPUiY+b6IRu/K+Pfc24Tcs8vRvTA/L6CBSb3zDT1euy32/SA93ELuk/41pekTuorUv+MaI2cEoaWLWPeEfXW2nfkP2lC+S524u4XNCPo9ikiZ4iwfSUx5cLRDtEStOOEaGsXuFPgDxCaMdTguPTLzM3unxjIxMZeLc1C9CeEI6GGrlRK7JwpQOpLZpin1OJXpYPJwkWhqC2XliarugOnmwvVubVaMi0ZFIxxR6R5TsvCMNsRROZE85mE3JF2m5LS3Pwv/sx8RidzNcRPvBrVHqRxSjrQN5WuAZM5BqvmWQDyAJT+3jUSiwJlq6wLEQdKpPHC3FPp2kSMA68P9Isjv/7zmLgh9ehakrJv91ln1+gtyJkF0A+gjD2c6d2VBOfuI09z6GFtNJgRUYyS+vSGAzMXbtTL7OXZ0OzfYnjPbm36ufdkR79Z8FEeq5smNhEOzhqXxhCnwHRj0cAdLfkNl/Ij0xpgK9Mnk8QpCtqyfjGlj13JMcrIqYjtLqqBAsSf4Tghh9lGOQWkPkiB9shnTF3sDTggDVxCw4uk4+QkqH9IU0YH3YE2b3PJ4daWC8/ILpgdLQ+HfYHcfMZVcr5WRgv470eNvtvyP6h8+NjDS5Y7eg/4WpjedZzbJ/CBFleXaT9kksLVarmF/g08sgRqHWMLwxnN4sKU/yxrM3dZCxZovHb9CHUChPrY+qMEPlKawGHDMfjPgv3x28eTq/eO5J7cR00YPxkFrvg3/eSk85iHX0RH4TahkcHU6t/MQ0RA/eK2kZNToMgh1PqHjleVPuOZFv+fC5ozX0LJnZ6Nm9mBSPpf4nZjkN2QmwciaGs6/1K9IVLW1gIE9B7bc8YkXCa3MKLx45F9zw2LWYWhya1puHtEbA+kjeHTy+MXmcr8wGJtp4wcrwB6QVy/jU2T18t4Xj/LAYFfLce3g2Nif5YNfRv5gaHmND7wkOn2xvoxYetsh92ZLdgzuVcrqD+Lb1TuQPTntiximlOXQwN7VA5Rm3N9CeJp/AmpJXpID1QSeS5MHxDL/gfHMaxpmaZOPB7zhflG+pzu4qP7gdNPWeA9lN6zwXDTo5SXTgxrM7bXe8srknPc2aUL8hlfInpBDL5cH8N/hB9lUP9oUJXUYr+UQE8n/Y2bpJ7s3IFZOfTrH5ItAf6IYh+K4ku9gh/uIoieP9OtJ/Ij37c/ST87yTk5T/hamt56G5b1Ymy8pvjLZOI3b5CbZ3LkWnGgs/kZ5ysBf+A+lhlDh3JvnwT1Y9e5PwPQOp49WDUb8wNSQem+LTJRedRqxNB7ZaQha8OtLxlmBKKzVtQACxrk1bfDi/TRLeiLXxgy3w7CtmRfgTMo6lejg0V53Ossm5pD0XbG/4entpyv8+QeJC3tom0hf839NfBe9/LbTMsO0PJseF2+jr5fT+omRxCBiJhkvgKCYT5wfZLWq2pQvq5FLzlgmY/nJxUk/TG6b26sy3JiILMOWAmBBjF7TmqX+h6Td9lmTZlmTZVo79hYhR4qQKftya3KMza5psXzh5+WJyS7bxL5RGk35QRiMwlhgyKH2hlz+gxbGyQzqQzOqpTv7BEEoRmjZEEONSQmonikMPUdGU882jrR8laNPuCvFMP3DbEm4Hk15QogSXLqietCeZqjToR4waF0NBu7FDzZzUKeOLWjS1Nz96HhAJ8+lsIZ9o5bhcRCvH4llJ/kBLsTSeaNlG94kkw8VJDYjmxUB48c/QCToWL7sktPIrSopWKUH65ikrJVyc8hOt4ReUUyU+oVZfpMVRfOXk5YvJT7dyn72oIP6K2ZH6BdMrEe8uDmtHNwSzJ7GvaNlOdZDchuOYEGOD4iBSlQjYL+pznKZSN6o8+Tq7qp0oDjVM6Q3+R++KYwb88FlgL1LLbhcnE+fDIZjxtPyN1qy9YvLxFO3JbZCd9jdKloSsovSAXu0LGYpiW6LDdqJsS7IC9mAIaeSkg+JYv1yc6GogXrAMfkGRx6MG1WP1vuROwH8QAWvjEwqxS37RRmOl0iPJPrh6DnZHy1stMvOLKNUXyYXb4SI1PijOytWgRZOMbjk58R3daiNDd9TUfEVyuDi063Ch2RaGW6o1kF7Ry4Pi/AtFv3qye5JG2T6Sog3HKEgnklQPSmouFcUJBz48BKed+GWHaLmViYI1Y5fJdeJWfEFqCj9RGi79IELaUriir3ry09sJe0FHx1/Ryj32E6IJTw1UMbvQxFl+6CemhMecgJ/IDJTWUewrevUr0p0eDyalSVqunOSv+FSM9uKRsxz0ohZPbmmlwYMXreONRYVbesVWlGN6DjRJHKiaPB4SzO5BR5J9weSvrun1ojRcuiC5OOkZECmZwMlMJs5goodxr6jZBxfHKtWipfInFAdd605itEUXjYAfS6KdTqn5E6IxRtRTS0vZmQTE6LNsf1CWbUmWbeXYXxgRX1lT1Qu6eqLFYcgodqO0aA8HkMidksmDF5dGk16QGUmJlhZdvDNLUQM/SKX6E1KI9aGph1yQXaJmOSJxEIIZLo7x2IHJX/xoYWc7njDaqzPVmmTvsgMe0bJy/AeaBlO3xE7LFyQtv+CURWvEYvJxL1/UE6JVD2bFvzA965YsKXeJY1teBGTDYjf06qAsUbMXxSGHqbo4EEwiYMr54CerzmxQaRannJ4T0VJD0oGphZ8opVQXJ7VAkYCJYtqD6rEOToaSaFAy/8QpWrCGC0qQ2CDlkIBYiqE76Yl2uCVZNi4cFMcmv2Jq4SeK7MW/Zy9cHJvd6yoKiCaRxO4ojiWs4X/9a6H4CyF/MuSPh/wRkb8aklQ/Mdp/9Msulu1fL9mPHsKWAM5ytHDgw3lHunP/K9LTepHpH4w2Pn3Jua/WECHrF9F4Qd474vInLaXq6YRgLAmJCvJF0X7edNVpaP0B2dI3n5iV9HHJ6PDk63lzqqm9Y+7Gd2d79/5Pzt5qX5h7WIzlqmz4N05XJun93Mvm8jumjZ69gCekTF900gjU8k7Woodc9BGJ0dlDRtMxHDY5kanGGzJW8cRNuLcZ2H3gvAGVPNrB78j21hdZ3voNIVja6DrfyOaoF45CU79qsffSkZ3RSZHI2vqG3NJ68KuHBceuV0zP6exovpi94WAVEONNfArWnQhB2tBL/juyg+aMsp63P/Fo672nOfeAw8n5/ViAkWfblSc/vUP0YdV+eeRzBUn5DeeO4+55dSI6zcnmm8K5h9mx5elp2pDWizMd+egpRltnUe6FMdP4hdyXmX5W6vDMhMez+4bbc51JjrMYo06eOyFYFowGiXFB+CylOhzKtTF4jEqNQI0J4up0DSdyV9RdDKQfX30gnPEQUsY78ow0YCyKZYjeCvBBkur9RpbwiuHkJMT0MUa2FpIUnO7saBdvwkaPAOneL4wW79zWwmdkdn4463gIbdy5tWboiL8z9FR/wdRO3x0s6X3FaLkQzD3VEoYjYVfOPSj9liAepd3cc0f2ps746HDybWNFSLTBvIl2WofTsHk4nuJnOINTR+8sCsLE9jVtyHT2/RMzh3ffP5Hb2jOYi6C8JrwsV8L5hbiYSE6NCG0cbSPDzV6R2dQYzvtIZ3/5U41trSVQz40MoUIS8RvfNwfS+42sicRIgLtHyFsiFJEGZzdNWMUTSeZ+5MmZZmloOfSDIfgUSWIlJB9sxg4WY9zN+7Mj2QdTojOW3kectSl3jp4T2dlv+8LcceqpHc7s1Lg32iOnVj1Id3Iux7g2/A/vTuon7o58AgtYNTvgJHRRJ48OIE02b6fGDHF19objrT8iW6q/IHIvXWRj1sO4FxuS5MXZ3Z4TGc1C2s9dqYUvphwP5UNirKCbnpDbt9BY/oqMUptbs2B4snhKwdwV7H6aszO8SPG/I/vbvyixkrffdlIrD26Nh5z3JWdHq2A6cv8zn0W0UaazS5oSsG/O7loGqDHRpj8xA+sZY6DWwI4PzlumlQLGx7cc7GzCer+J/IYMl5/IOD1sZkUWwkPwlemEEFtF/EW+rjqV4MVZim29Ovt/MNp67smavzC1N8/u1E5kb/l+Q3avI+/b6KH/4L8476eZ0gyjZOiB7z2BqTY7wvz2sNxXYB+Y3YFiav/ZmWpvnnPsQsMio3blDamVn5i5fBHIULIMPSOT9PBptKQ//OOIMZzplOnFPpzB/AZUR/vh7IrG26ZneXZFL6KdmK7wC6bGpdjcQZI7IRh9V85ORKxDYVn2hUi8JyLTyUjpJ+veH6SLOzLVevL1AJelhLMD++VZuM5NMZrbFpzkc0c1mnpXEI9GRwDGJbWGX46MuGuZKn9CCnxA7jk8FzRnQZBXs4dZknAmUsHbuZh8PfuuveXMXzH5q7OntV/kIXMfj8BokP5nu38NtC9oyTZ+YPIXl+ijJl2QXBxL2OniGOZFYJk+yL1lPyiONfI3anVQHH/csmINTRukiKTF5G9+9ogDwUjUdnF+OAImHoopqCuH2BVkB9Pyhfrm6hlVW11kR/UvtD19RfITmUvuF5REWZT1jJYQfqrkAAAQAElEQVQl3PgbpmaJjtlhBQ/+g0bBhbfvhiGpL7YJfkPDjGhQHOMx//CoN/eyEzfpQ6gF//SjR7Lvs/bB1fNFNVX/gZYYsnxB0vIL0lPpRGozopyVNegHRBNOAzHZxbX5Czo6DorDCvqloDi2m9uWYkXLNtzKP5F/UBounahWleME/BuRava9Yofjr8hYarToCSkrtQdMuy7FaUscd2uJlsiNjzmU9EAJEhtEDgkUk+C9j4DJNi5OEBeOpkWY7MQqsoQbD/7h3tqJnpljV3BdizY9+HDphuJYwhoeUaLeygt6dTD3wLRYkLNAAsuhpKH/9jSm/4YR8Mdl4lBrHCStlREwfdY5KfyClsRubBEBYoOybEuybCvH/kYpysqTS4u+I02WZFuWZFv994rb4ysmX5fEqCiTxKzhDpH5J84dw7zqF4Yykx06kaz6InnrxQRJEZIuHpwCRkF4auJ8Y2rIOlHv5zLLRumJR8NtOnA7mNYHlK4rlJP2D1oOIV7RNz4sERkjsxYfMLU3z1RqD4iEWTYus9iJ+CACuTjfXKuDVg8rFkewL0hqN8j+wkxFW6QqmtSDXl5CuBF47RBfkB0StRPFCRfqoFJLeqKkcvVETjJo/aBM2UQ/oFZfpMVRfOXk5U9o5T77isnX9Y3ZgSbJXtQ3UtMcA4eTyg7TF3r5Ij2204QuJYQ+ojhpBXTB0OGIBzkx2otHnkG6IRiJIikn/E+niIkHY0xAmhjJ5fYVJfNPnF9ExIzHigRMGRl0UvgF2W/DceH25DYoIX0jmoSOS78oydK679idaGA6bHI6bEvFRpXKKhoNF/7DxYkOtD6BOKLJhL+jOMZjVvdPmihZc04kwZTGV6TQOig8OWiTZ9uivTwafrBnNBvS9ISW2GV5kFy4HR7pG6ONi7NtGZHzz0rU6JYl3PiByV/c23NDNLg43UkezELbwnBLtQbZiwqaaOq+oCR6rBzLAeKgyNRz8BKCvcqifecKf/QOE7DUgfYWE/BdRTZW3gC3TNTG4MFdLdGRYf9AyjSpzyC/oaxy3RGmU1fZxlwZ/oKOjr+i2ZP6Bb38RMt2RBFlWxbnDVPCY+0j+eBkng2yTVVf6OVBCYJLwbYnWApXUTpRnGhAtYRyAqbwP12cNtIFYiIbg2DKATFVT4LnWSJg6E76hZZk2ZZk2VaO/YVafqKajfrJw21P7YZo5YvJT2e++aIkO32LEhwXxxImygom/I8/Ft7+Knj+lTIF8UdCsBrYvyB+Iz3Vb8hc+SJ5/+L4iFPhb5xU0x/+8dwdtY9MSOkbox2eLUcePPiJiNhtZ/a9+jlIwiBG0vF/YVv7e9EJYkn4uVLhi0dYzsqD9y1XzhiWKWCr1EPw0dlHzrLW87tVZ2cqw8kQmwfppMzIRWdHNZByjPre1ZkUlpMySQynSDY8MTyIyJawdjVBvyGV8sXk63kr41OIFvKDEfA8PNel509s8TkcO/7C1E5nTfM8kTdA+4OBfTt4PCdtF7oyv0VE2Ex/cYZGSaSj1jATTRs+PHQ9q1lBLe/DyYan4YWnB59qN5Q9cta04xUpxHIpjf1N4P2NwHxV89xADxLXNH4wNWb/m+3sMcPOzt2QnvIg1eSkfcc3Uj5WfWPGeGQ68H5JkYB9+GSJWZ6JC5JiEWc9BLvzCHjvI2A8lX1oaSxnur/tItXp2ZektVp5pkiw0e8cmS2J6FlOOru/ORtTx1svtpm7F4Esyz1XjHzykiO0E3LF5C8e+VwEwRjmoY2D0d78Z5ZGvqODB6bn9OylB+DriR+rSsAqFgnYrIvKzuE7HY7nB+tvyD13ZDR1ZkcPx8sJWPa9+9wzkTl2JZ9dZD88C6ODfQvIctoYrjUgvWArmWQwLeEfZzP6lUPpTkz3Na2W1iRXTH46CZbfb2Yh52PJO/uF00hldbL/Yu3ubrrBDycrXyTPFf2NKyXwddFnlBhe6NOTbTmjoYvHLzbIFHrycQiWfCu9Cg5WAbHbHbknziBGtdbwwtlHJUvo4m3hANozT2289ySdxqwI42kXIenRGLx6usP/wtTi2RO8+SG+YHdTOzHD4TyR74v10ZHSU6TnwKTkQNs6Vc5vdGCKLCotJqNOnlKybzw60tKcgPWOOzKNkP9Z6/MIGH0R+5rmdEEaf5FL6OYJW29GwEZnhDx2dJyYyyjkfqB3tbs6XVmQ/A07lICnB+A5iV2zAf5YXD21w5GuCyJ/SaHXlubpqxMwPiRGKwTLO+Yb800RDmyFvies3PXJMhVSRCjy2zxh7jr19ByeueQ3zN0RBinnmpLsOJwO9LCUrsi3UKmaYfLcP3yn2k5fEG8bpSKckbQXJqQYiSKWbPSSKVYIvzql6ldMvp7WpK9IAet/vBNJ8tB4di/ON7KsnBcuotSY+g/Ib7Jd7WdHlVfce2ju/cVo41nFaF55/wQKo3c7dQajNYsW/oQ0tWcxbaTZBfSOH6Sn9SCztQgnJxmRSJ7adQlqKF808FdkvOUTN7ntRCtfTE76/Hi2pQacz0geP/Tk+NCJeetkX78hYpTsekV6Wn/C3BOdhjy798Cz6+Spnd4O2F+YGoux7GDd+0+xDZ//WaMbbXheMUtQWfrC04LH2pdkfSdgR+ULuYvFWHQcg9QawtNzw10XjbQ/xomI2Dl7L9KV4tWRtuf7reVp3ZamBOyynq4IvBFD/+Ls7m95YloycEFqc8XqkGRx0laT17mkWHV2lKO3F+QF/PeuCqJGK03libMHOSvTdsX/HX8N/KDzh0HZzkjRdpGAWQRsUZzUAUShSicn1ZzRpaJ0wVG8yqClcsu2JPxEccKB6iA06aNTrn4izZgiHpj8wV1NHOOCgWMhcCkB6Q+05ulXNP1GtyTLtiTLtnJsyyR2oiaX/oFu3X5CtOqLyeNMALKjs//E5JJcE7JIS36xCvUrevkDWhwrO6UDyaye6snXbRJMbyiKqb1i1tITSE9xwqEO01S7SxLY+hOitf6EEiUmY6lLcPUs/eKWqZpoUIteFEOTbzz4iTMBVTsM/8vTlTo4Zh2zMrMEr4uClWM5QPzBEUTrdPxwhNg22CG0LtrhHyfTH8v079MNtC1mP+y+kxq6ZcVErqSvKE1dPWlLMmj9YIpCP9FkflQQMWrWBcnLF5OfbuU+e1GL5eTlV8yO8AumRzmrkxqP/SB7qz+iZVsE7EAJEhsUhx6qijioORBs8sSSBtgVk794ZBEwvWFqOM9oS9ri5U3EsQ5ue/mirihY+BNKFGPKaRcBU8RBJ5U9SIKRhz+5NHXpHSVZenGvbuXYhuOgkoEw2ZZkDSxq0VRwqKZ+4eJQwySCJxD94bAS0PiRB62ciUqtKQFTzhNGO50EUx52IgncBoUv2uTdOWgvRsOHKRPKeeTMVL8hSvli8vUssy0Md9aC+rg0ufSCliXc+IHJ11m8GXUybw/YDMREm3KCh4uCnSDZi3pCozpNg40HF8coANGBi2dt6RY+/CIkPQrBvzzLUr9hCJ49wGFDJ+p8m8nEWWRXs1eUbBOwEyVFwn8QYdqsYBqDsPKirrEdKC/o6PgrWt1PwMg/XM6cZY+TiCziBSWlLs6BSfGYE/APTmYZVbKfEK26qUsNlh5RnNQAPSIiphQPVE4JSXDc6UHRYrnFIdQapjqpQvapGvQdtbxo6QeroA6KY5gXAZg+TgG7cE/O5ZZkW5ZkW5Zk+8sPbVGaujjpHZDBhODhI4WJ0hW9HGRHqyeKEx1Il0FqWBIVq5X+clHE9IgpfLs40YDMBK54KTVtoAnEJB6EfSEVRPsBJUbQpXfUnOmSgoeHTe7q4o5kdiP0G5lIzU+IJjFzcWm4tOgTZTSC1w92R3HSAaTPV5R4inJuSE95MUH0LSqIL3qRDszq6TDZgaSvtiNZ055j5oY0lS8mx+1wphZt+FJAS38xRXy79YtRjG6JJZYvSApHTgxR82n5I/fU9IRo1ReTn54rol8xuXp6N1kQ0C9arJJ9RS9/QHHoNUCTBnVHfY6ngmA89oXsUnpeUVJqGTtREjxUOeSFIgETDVO3flCWcOO/OIo4rVvtSiAtuaOV/fZgCCmwXEH8FbMy9Ssmf3GWW8o25dgml2wrx7b6D1QySyLHnlEcejCJgN3wf/nrJX9A5C+J/PWQPw8OT/4fXfx1kQWMzo4Ln780sifaEOKFR2eWDZ19RXryLppitLFjLlxeiYDRyyVJ8BiNWLI0M0kaAU/vNOcl44cGTi9yetJ+Ilp5kC7y7n5FCtmHT9+Fs7PfdmKex86upi94dXZEzcwH6a++mPw/+97Hsu4sRlvvu8hvyD3li8kPz73JwU6B7QKH52NQuGd+i3Aq5UGSWPpPTH8JI1/IXYjE1cnC2YQxx3qSxiJtJSCG1Fhs1nvJwPwe2fV/QpZPf1ayp5yAsTIxKz+ImFcenmLz1b95dt997qGdVia5cvLo8UNb5Pfp/F+YWpxFWDJ2sytZ9n9jNJyPom/vmcHl0WhAy92I2AufJdxAkn6A5jtHY5rIm+jZZCEVvPrn3uz49nkLY+ntSMLuTFo9O6YnlGrX3JFmXth9Qbz1IENsgCbSVyNfnJbl6Y1e/9auPPk6C3Lv6Qc/MVfT209YTC08mDuT/4WpPXh+iPNe6sO7LGku5oblQMS+IN+XyoHUbjq18mD2PmB2ccFCF0GZIq14IgkWbVZBsJOzOznDQAu/mB6c7WlrRsDorzXA8yHtou+ClFkaG52HHL9bxCN/xK6cXa3/8K1x+1yzPHecvWjli8njmQnePE9M3xWTH/6pMY4tJxvjFdlXQi2IJ2MDn0s9nJ7hPLL8gtSwlKefkXw7bScnudTbAL9jZ2aI5bygS5PSV1gkj5XR84so1RfJc3/3kz9htPhcn7vzPOa5iJGMj9NQ/oiZw1M7nOYqrzj3UGY/nVw5efT4oV0x+XruYQCW5rDZQ0ZCTGW8nP00Js2XLaJUD5LE2EkD9ZL/MzKQZdzPlt0VjW3oaLEvMjQRZyavnpkvTq36I7K++hW5bFZEzOgHeWH+u+euIAXqZR9Mz+HZk/wvTO10djW/YvL/6L2L3hN5Id/Hyn0ffD6PSH6pRbh+E9XOEDA2pBeHYAdnCg2jnXuRKcaGU+YpGIVaA+ogE+0jYGh0kkw9+SxGSid1DLIGwXoZ2LcXZ3xGmUNLz4cjQNrPHX9jrmJHV2bum28t+9LzhNH+s7O/vYv3nXltPuWO6alyzPCm7Ih2QarMbg19OJEcS0I9y9Jz4H5zGpJ+I3dkiImZf+JorQfZQWMtIeuClHIhKQ1Ydy62RiPWev97Qf4TZiu9ACuzMCuuOC9D7TU0FbO7XcymYzhK+J/OptafEI3tlLmGrVl38BtSKwdpJoaNH/zEy850ZGdqIPRzD9obpwljgJ7cBaH1jfNLtm+RNrKMBMC7kN+NZTwyOtuZpWn4P/LbLOPl3JIxoGtY9IspcikjlLmTPE3JHjEL8e5nKAilNaQrWwqY+QAAEABJREFUyA9kS2QaMPTwi3NX5//C1A7PruQ33Lv4ju5Kjcuw3/sQp+fyhtVoxj46hJu69Au5Dzki3clIuZQsu1P9E7/uyz2HU2KcXdhoWTreGjfFaGo5OAkvacMDdgA9SE+yzAxmA5fVGlKKuEgXcgij6OEfH/3CuSPfjkKp8QtZkZ5+EnV2YyjRcS4pv2H6cLq6O7VX3x0smd4vnntTA1mHsbe8Yf//AOTPgraF4cGLM2jD/8LU4paw08UxzItA2Y2zW1FPFMcq1SIEkwgYiFkSjn0hCnaITpNyTDDMRZGNixMNiNaUgOnkUlLlVCc5kQRTHvaFkSTEJpZt5dhfqOUnpkvLvpDZdt8QpXwx+XqW2BaGP6CEjksvyIykREuLfkdvD9gMdLotjpV3yNI7ppj6ooImOuIDimN0gOgAWACHD2s8hBM36YPoCP7ltCj1G4bolPW1UntG9pYX2TVZoqWDn4ik6BekVgn5wErhkppLRWLR4p/Lko3T6Mku8ehZdBD/C1PDxbEtDLcUg9iWbbiVfyL/oDRcOlGSNeefyK52LtqZwBftzU+ku/kVk68D98szvyKpLsXS8mQms0Q83Mkd1gA7UILEBpFD8qwPWuVahGBSOdriL69C9YrJX5yllmRblmRblmRblmT71SnIkmzL4pyo5YvShbcT/hd66yA7M12IanEImA6efL19m1OWEsL/wtReXZwuGPxOf7i7STzETBSThJ9IUg7SY/8D6YlNlxQ8PGxyj84uS7ItS7Kt/jtxNYOpBFO7IbVyUBJlQTXoE2VqBGDj8Im/avXI6b4hlfJF8txFm+yQ6HekgBiLjgtPrzjfmBqyTtT7+Z4tn93OfPi6bUXSog2XoGDs5OpZSr100XKpH9ASQ9bnHykGNyWyMYs2WYum9uaybr0Kx6+YHBeNluT+EyeZyqwci5Ykf6Cl2DbaJbJfUBxqVEWTDlQOBEt2+jfXTEgHsqv5K0pKLYu+0EbEtB4qzh2t4ReU00V8Qq2+SAsWgi4lhGdnsJykvGhNvqjgxQ9+IisZsCTbsvSfXRzb0w9CZRvwHdFsCzF2R3FSAvSG1LzFIlzhEtES8dVTTv2GUiTlRP/L05j6DSNYttnwcctwEb9RPVUJ2IWbfii7DOgJ0apf0DaSM1FMZltGAe4Y7XRPjehqJhO+yHAyu1H2B9tlYjSQjDqRHIkEIxd+8hL0v5Ca8emyRG58UJxhQutecYxj31wRUvsTaWgdZEdnHtDeemr4nUnDfUdmLM4NUcoXyTNkh0v2BSX4x8XZcnXJGn5BSTD8wGGNPrTFg9+QWvlicjwLbQvDTTFm8kH5QJMaYlCcRQYNE+odo6iHli+cTm3BhmPDDViEi0vDpaI4mQE+PARnlPhlh/iLVbqLDLSssS+kVv1Eabj0gwhpS+GD7Ku+mHxdHDdXo6U7ImDKrmf01GjAyMP/cGl6xGHABcugljdNwKvfcBTLqJId9B8oUYzdUJbEbEAN0jNSxFo8sI0hTy5OdCB93+kTj4bzHImAfVCWbUmWbUmWbUmWbeVYDhC/sTK6Tk+SrsPFjuY3NDIuPPrN2VW+KAkqS3pFSamLYzIvApr/C0Cy/vXwwP1rI3/K5C+G+xdFagf/QWr8PZHGGuyKrbDnBbkr3bl/MOP0YidPT/iJ9JSDseQ/iIhlR0p3TOHwVJO/4B+lTOS34ONYTyN25XkuBawFSsHQL+wC9BO7eVn0K+cvuKWLXNJtN6RWTiWW/A3ZRbl3fWNENgVwFqSXDCBe+R9dbaN+Q76pfJE8d7N0fiM4CcUYBEuW+mAEvEPzmsTWmlC7YcmEozSMkRWOXU8Y7fDMJb9hyGfVvPPCp7wyv0X5E/IWdrdyInsymdKB1DZNcX6q1PGs3nL1NAxnK3ViRvGS4mjwsk6QddNitHAwbaTZCewdV52GWBpO5IZyMBuTL9JyHY6atf8H7wb6F7s7NBwvv+LWkPr4YrR14HxEaj/8I06WOJ6v42OYuPIo4YukWMhcA8HuPALep9NVJGDdnf9dmbuCGQyWT0Mm8FYWk/86yz4/AfcNnyQ7P5zt3b1I3npwmnpPlnWagPXCIj1FAgb7GBuXHJXgxbnjswgd++HR3jzbUzsRgt129PURn/wcJEkdWCtrQACx29rhfGESvgOjHo4A6W+YUXKAnw+d5EdHi02VFZDkcdJ9PXshidFPZHdzMJOB4TQzWU7AKFOZYd5CnRxDrzX88irZxEBawtmDcrBgi2ip3vgIV+loXaQB64OekJ2tnchYP+aCqUE/l5S8hFyS0uJlV5VyMjBf2dXkwdt/t7YQWJUyMM8kufNuiZoVL5ie8TQ1Y3Xwm2c3pdtd1SrmF2CKnBjCeMkdy6K36+VNyO0LdlWT3DVJI+9gT9It9DeKFH4iSTl46WU4jOWHPvTvuL28bfq+eO5J7cR00YNxUa33wj9vpaccxDp6Ir8RtQyODqdWfmIaogfvlbSMGh0GwY4nVLzyvCn3nMi3fPjc0Rp6lsxs9OxeTIrHUv8Ts5yG7ARYORPD2df6FemKljYwkKeg9lsesSLhtTmFF4+cC2547FpMLQ5N681DWiNgfSTvDh7fmDzOV2YDE228YGX4A9KKZXzq7B6+28JxfliMCnnuPTwbm5N8sOvoX0wNj7Gh9wSHT7a3UQsPW+S+bMnuwZ1KOd1BfNt6J/IHpz0x45TSHDqYm1qg8ozbG2hPk09gTckrUsD6oBNJ8uB4hl9wvjkN40xNsvHgd5wvyrdUZ3eVH9wOmnrPgeymdZ6LBp2cJDpw49mdtjte2dyTnmZNqN+QSvkTUojl8mD+G/wg+6oH+8KELqOVfCIC+T/sbN0k92bkislPp9h8EegPdMMQfFeSXewQf3GUxPF+Hek/kZ79OfrJed7JScr/wtTW89DcNyuTZeU3RlunEbv8BNs7l6JTjYWfSE852Av/gfQwSpw7k3z4J6uevUn4noHU8erBqF+YGhKPTfHpkotOI9amA1stIQteHel4SzCllZo2IIBY16YtPpzfJglvxNr4wRZ49hWzIvwJGcdSPRyaq05n2eRc0p4Ltjd8vb005X+fIHEhb20T6V9IjTFi+ibbyf2/AKRkm78NSja4DsG+uDipAxTlou4oDZfAdrwju9r1hTq51DxrohUlvaE4qaXhDVN7deZbE5EFmHJATIixC1p5VsI7mn7TYkmWbUmWbeXYX4gYJU6q4Me9fJFZ02RbH7SGLzqo0fyFEjou/aDSS2A8kYYYojRcWvQ7WhwrO6QDyaye6uQfDKEUoWlDBDEuJaR2ojj0EBVNOd882vpRgjbtrhDP9AO3LeF2MOkFJUpw6YLqSXuSqUqDfsSocTEUtBs71MxJnTK+qEVTe/Oj5wGRMJ/OFvKJVo7LRbRyLJ6V5A+0FEvjiZZtdJ9IMlyc1IBoXgyEF/8MnaBj8bJLQiu/oqRolRKkb56yUsLFKT/RGn5BOVXiE2r1RVocxVdOXr6Y/HQr99mLCuKvmB2pXzC9EvHu4rB2dEMwexL7ipbtVAfJbTiOCTE2KA4iVYmA/aI+x2kqdaPKk6+zq9qJ4lDDlN7gf/SuOGbAD58F9iK17HZxMnE+HIIZT8vfaM3aKyYfT9Ge3AbZaX+jZEnIKkoP6NW+kKEotiU6bCfKtiQrYA+GkEZOOiiO9cvFia4G4gXL4BcUeTxqUD1W70vuBPwHEbA2PqEQu+QXbTRWKj2S7IOr52B3tLzVIjO/iFJ9kVy4HS5S44PirFwNWjTJ6JaTE9/RrTYydEdNzVckh4tDuw4Xmm1huKVaA+kVvTwozr9Q9KsnuydplO0jKdpwjIJ0Ikn1oKTmUlGccODDQ3DaiV92iJZbmShYM3aZXCduxRekpvATpeHSDyKkLYUr+qonP72dsBd0dPwVrdxjPyGa8NRAFbMLTZzlh35iSnjMCfiJzEBpHcW+ole/It3p8WBSmqTlykn+ik/FaC8eOctBL2rx5JZWGjx40TreWFS4pVdsRTmm50CTxIGqyeMhwewedCTZF0z+6ppeL0rDpQuSi5OeAZGSCZzMZOIMJnoY94qafXBxrFItWip/QnHQte4kRlt00Qj4sSTa6ZSaPyEaY0Q9tbSUnUlAjD7L9gdl2ZZk2VaO/YUR8ZU1Vb2gqydaHIaMYjdKi/ZwAIncKZk8eHFpNOkFmZGUaGnRxTuzFDXwg1SqPyGFWB+aesgF2SVqliMSByGY4eIYjx2Y/MWPFna24wmjvTpTrUn2LjvgES0rx3+gaTB1S+y0fEHS8gtOWbRGLCYf9/JFPSFa9WBW/AvTs+4PimObTZJtiVO0hp/o5aCcoqbPsjj2F2r5ojRcAq05g/agqCinHO3EippydEmpkX5QUrnmJCdLm1Iot06unA8nQ0g0KJl/4hQtWMMFJUhskHJIQFyCoTvpiXa4JVk2LhwUxya/YmrhJ4rsxb9nL1wcm93rKgqIJpHE7iiOJazhF6tQH5z/C0D+nDh/VeTvgv/KxV8R0wP2L5IgtH/FTGBDAL//pTE6rYxEh2UoXU+IlvfQHMuFX8imWYNOgpHQF4NgyVg/jewbnsKXH7U2U8OmNxGCsSSkHblnRvINVCAY9StnCPHzDRfOluonZpR6Vy0mX+99ybPvFXM3vjuz/9fnHtawkl6uak93Ujtxa90V/YGnhrfKQjq68+B3nMW0IdPJvRkdHgkhFuEJt5nJNMPalKXLSVETEQaunPaKJ27Cfc1AHs8oN1zyaPl9fjGtTMbSz/L23RCCTZm95Eztq668S9DRaCbSloifPFL4X5ja4V+92b678k6qfFLjB9NzOnuaL+aJ4WAVEGO2HwWyCyG7aSsnYBX/jVnT95G8IaXDek8J+8Hh5MzmfVwYlRRtHjR56vWUqcVeeORjlOFZiVC9yPAVydsXpIlfBJpIX62B6mJ6mjZ0P9Iic5ERMLTwi2cLBZSp/fBcneoF05PPjmf3Db96s3udCzDqXxwRy6LUZhktuZCblgMhdKHHyGoEakwSV6dxOHEWUUjfE2csPS0TMMbpj/7kNGA8ODYNmWfo+392Ds6t7RvM6ixYJMVC2JC27WLn6PAk4SeSlH8wd8XzqODpXcmOG/a6tHLn1pqhZ++tN3W8+gumdvru6NPSHz7OFdihpQEdZezK6am4SJ6s3dxzRx6bOuOjw8m3jW8MiTaY34V2WofTsHk4nuJnOINTR+8sCsLE9jVtyHT2/RMzh3ffP5Hb2jOYi6C8JrwsV8L5hbiYSE6NCG0cbSPDzV6R2dQYzvtIZ3/5U41trSVQz40MoUIS8RvfNwfS+42sicRIgLtHyFsiFJEGZzdNWMUTSeZ+5MmZZmloOfSDIfgUSWIlJB9sxg4WY9zN+7Mj2QdTojOW3kectSl3jp4T2dlv+8LcceqpHc7s1Lg32iOnVj1Id3Iux7g2/A/vTuon7o58AgtYNTvgJHRRJ48OIE02b6fGDHF19objrRKP6NgAABAASURBVD8iW6q/IHIvXWRj1sO4FxuS5MXZ3Z4TGc1C2s9dqYUvphwP5UNirKCbnpDbt9BY/oqMUptbs2B4snhKwdwV7H6aszO8SPG/I/vbv/i9q5yalKu4nu+K1gw9s8lBGD2p4688w6lfkck+/gHZXcs+ephs05+YgfWMMVBrYMcH5w3TSgHjA1oOdjZhPb/p6DSilTN8R8apsZlW+kgmRodgw/sFFcuZ+SC1cpTgxVmKbb16VoRfMfl630f+F6b25rkjtRM/u5rNE3nTfFh+C1rhKdBR8o15b+ogu2kmvnH2TpUk/cDFcl9p7iH55tn9f/Mu4cHY7uR6xPAAb+CpsK4tRqapcjEZfeRpSvaObMg9jPTtxWjjnavGlifkjsxRpbXxC9mTHt7YanaE35Ce8mC6vjA13ojNbpLcCcHov3J2I2IdCsuyL0TiPRGZTkZKP1n3/iBd3JGp1pOvB7gsJZwd2C/PwnVuitHctuAknzuq0dS7gng0OgIwLqk1/HJkxF3LVPkTUuADcs/huaA5C4K8mj3MkoQzkQrezsXk69l37S1n/orJX509rf0iD5n7eARGQyy7B1OE5XbSdPy//b8A7F8WLfvBabfRbyhZHALWPIhCbly4lWOyG7JLaLalG4pjjfyNWh0Uxx+3rFhD0wYpImkx+ZufPeJAMBK1XZwfjoCJh2IK6sohdgXZwbR8ob65ekbVVhfZUf0LbU9fkfxE5pL7BSVRFmU9o2UJN/6GqVmiY3ZYwYP/oFFw4e27YUjqi22C39AwIxoUx3jMPzzqzb3sxE36EGrBP/3okez7rH1w9XxRTdV/oCWGLF+QtPyC9FQ6kdqMKGdlDfoB0YTTQEx2cW3+go6Og+Kwgn4pKI7t5ralWNGyDbfyT+QflIZLJ6pV5TgB/0akmn2v2OH4KzKWGi16QspK7QHTrktx2hLH3VqiJXLjYw4lPVCCxAaRQwLFJHjvI2CyjYsTxIWjaREmO7GKLOHGg3+4t3aiZ+bYFVzXok0PPly6oTiWsIZHlKi38oJeHcw9MC0W5CyQwHIoaei/PY3pv2EE/HGZONQaB0lrZQRMn3VOCr+gJbEbW0SA2KAs25Is28qxv1GKsvLk0qLvSJMl2ZYl2Vb/veL2+IrJ1yUxKsokMWu4Q2T+iXPHMK/6haHMZIdOJKu+SN56MUFShKSLB6eAURCemjjfmBqyTtT7ucyyUXri0XCbDtwOpvUBpesK5aT9g5ZDiFf0jQ9LRMbIrHdMzdSfMFPRHxAJs2xc7gIimXFx3lBbB60eViyOYF+Q1G6Q/YWZirZIVTSpB728hHAj8NohviA7JGonihMu1EGllvRESeXqiZxk0PpBmbKJfkCtvkiLo/jKycuf0Mp99hWTr+sbswNNkr2ob6SmOQYOJ5Udpi/08kV6bKcJXUoIfURx0grogqHDEQ9yYrQXjzyDdEMwEkVSTvifThETD8aYgDQxksvtK0rmnzi/iIgZjxUJmDIy6KTwC7LfhuPC7cltUEL6RjQJHZd+UZKldd+xO9HAdNjkdNiWio0qlVU0Gi78h4sTHWh9AnFEkwl/R3GMx6zunzRRsuacSIIpja9IoXVQeHLQJs+2RXt5NPxgz2g2pOkJLbHL8iC5cDs80jdGGxdn2zIi55+VqNEtS7jxA5O/uLfnhmhwcbqTPJiFtoXhlmoNshcVNNHUfUFJ9Fg5lgPEQZGp5+AlBHuVRfvOFf7oHSZgqQPtLSbgu4psrLwBbpmojcGDu1qiI8P+gZRpUp9BfkNZ5bojTKeuso25MvwFHR1/RbMn9Qt6+YmW7YgiyrYszhumhMfaR/LByTwbZJuqvtDLgxIEl4JtT7AUrqJ0ojjRgGoJ5QRM4X+6OG2kC8RENgbBlANiqp4Ez7NEwNCd9AstybItybKtHPsLtfxENRv1k4fbntoN0coXk5/OfPNFSXb6FiU4Lo4lTJQVTDDB0sYDvdz7/wdg/6LIXwSfUJzowPEXRv58GMufFQepMU2s9IVTmb88ph7+8fzVNOosQsd+eLTDs/3Igwc/ERG77ejyiE9+DpJQx0g6/i9sK7/NrOcLR+BnShIeZFV6WDbfCu8AeOjUYtONHoLfOfvQWN7p7GqdHakMJ0NsHqSTMiMXnR3VQMox6ntnZ1JYTsokMZwi2fDE8CAiW8La1QT9hlTKF5Ov562MTyFayA9GwPPwXJeeP7HF53Ds+AtTO501zfNE3gDtDwb27eDxnLRd6Mr8FhFhM/3FGRolkY5aw0w0bfjw0PWsZgW1vA8nG56GF54efKrdUPbIWdOOV6QQy6U09jeB9zcC81XNcwM9SFzT+MHUmP1vtrPHDDs7d0N6yoNUk5P2Hd9I+Vj1jRnjkenA+yVFAvbhkyVmeSYuSIpFnPUQ7M4j4L2PgPFU9qGlsZzp/raLVKdnX/L/bpgpBCwrDocynXipZznS7Ea/cW4Jx1svtpm7F4EszR1XjHzykiO0E3LF5C8e+VwEwRjmoY2D0d78Z5ZGvqODB6bn9OylB+DriR+rSsAqFgnYrIvKzuE7HY7nB+tvyD13ZDR1ZkcPx8sJWPa9+9wzkTl2JZ9dZD88C6ODfQvIctoYrjUgvWArmWQwLeEfZzP6lUPpTkz3Na2W1iRXTH46CZbfb2Yh52PJO/uF00hldbL/Yu3ubrrBDycrXyTPFf2NKyXwddFnlBhe6NOTbTmjoYvHLzbIFHrycQiWfCu9Cg5WAbHbHbknziBGtdbwwtlHJUvo4m3hANozT2289ySdxqwI42kXIenRGLx6usP/wtTi2RO8+SG+YHdTOzHD4TyR74v10ZHSU6TnwKTkQNs6Vc5vdGCKLCotJqNOnlKybzw60tKcgPWOOzKNkP9Z6/MIGH0R+5rmdEEaf5FL6OYJW29GwEZnhDx2dJyYyyjkfqB3tbs6XVmQ/A07lICnB+A5iV2zAf5YXD21w5GuCyJ/SaHXlubpqxMwPiRGKwTLO+Yb800RDmyFvies3PXJMhVSRCjy2zxh7jr19ByeueQ3zN0RBinnmpLsOJwO9LCUrsi3UKmaYfLcP3yn2k5fEG8bpSKckbQXJqQYiSKWbPSSKVYIvzql6ldMvp7WpK9IAet/vBNJ8tB4di/ON7KsnBcuotSY+g/Ib7Jd7WdHlVfce2ju/cVo41nFaF55/wQKo3c7dQajNYsW/oQ0tWcxbaTZBfSOH6Sn9SCztQgnJxmRSJ7adQlqKF808FdkvOUTN7ntRCtfTE76/Hi2pQacz0geP/Tk+NCJeetkX78hYpTsekV6Wn/C3BOdhjy798Cz6+Spnd4O2F+YGoux7GDd+0+xDZ//WaMbbXheMUtQWfrC04LH2pdkfSdgR+ULuYvFWHQcg9QawtNzw10XjbQ/xomI2Dl7L9KV4tWRtuf7reVp3ZamBOyynq4IvBFD/+Ls7m95YloycEFqc8XqkGRx0laT17mkWHV2lKO3F+QF/PeuCqJGK03libMHOSvTdscqSHfcifv/BaD406Ft3VAcNFRVF+fkUnVpEIIp54OTeTqIpvxxe/MTKdMVU8KWkz66OOkBWk8oJ2AKf3FXF8e4YOBYCFxKQPoDrXn6FU2/0S3Jsi3Jsq0c2zKJnajJpX+gp86MJdmWJdlW/tmNssHDlXx7fMXkEuWYaBflk4d8eDOkK3r5A1ocKzulA8msnurJ120STG8oiqm9YtbSE0hPccKhDtNUu0sS2PoTorX+hBIlJmOpS3D1LP3ilqmaaFCLXhRDk288+IkzAVU7DP/L05U6OGYdszKzBK+LgpVjOUD8wRFE63T8cITYNtghtC7a4R8n0x/L9O/TDbQtZj/svpMaumXFRK6kryhNXT1pSzJo/WCKQj/RZH5UEDFq1gXJyxeTn27lPntRi+Xk5VfMjvALpkc5q5Maj/0ge6s/omVbBOxACRIbFIceqoo4qDkQbPLEkgbYFZO/eGQRML1hajjPaEva4uVNxLEObnv5oq4oWPgTShRjymkXAVPEQSeVPUiCkYc/uTR16R0lWXpxr27l2IbjoJKBMNmWZA0satFUcKimfuHiUMMkgicQ/eGwEtD4kQetnIlKrSkBU84TRjudBFMediIJ3AaFL9rk3TloL0bDhykTynnkzFS/IUr5YvL1LLMtDHfWgvq4NLn0gpYl3PiByddZvBl1Mm8P2AzERJtygoeLgp0g2Yt6QqM6TYONBxfHKADRgYtnbekWPvwiJD0Kwb88y1K/YQiePcBhQyfqfJvJxFlkV7NXlGwTsBMlRcJ/EGHarGAag7Dyoq6xHSgv6Oj4K1rdT8DIP1zOnGWPk4gs4gUlpS7OgUnxmBPwD05mGVWynxCtuqlLDZYeUZzUAD0iIqYUD1ROCUlw3OlB0WK5xSHUGqY6qUL2qRr0HbW8aOkHq6AOimOYFwGYPk4Bu3BPzuWWZFuWZFuWZPvLD21Rmro46R2QwYTg4SOFidIVvRxkR6snihMdSJdBalgSFauV/nJRxPSIKXy7ONGAzASueCk1baAJxCQehH0hFUT7ASVG0KV31JzpkoKHh03u6uKOZHYj9BuZSM1PiCYxc3FpuLToE2U0gtcPdkdx0gGkz1eUeIpybkhPeTFB9C0qiC96kQ7M6ukw2YGkr7YjWdOeY+aGNJUvJsftcKYWbfhSQEt/MUV8u/WLUYxuiSWWL0gKR04MUfNp+SP31PSEaNUXk5+eK6JfMbl6ejdZENAvWrJkX9Gyje5fFIeaAYoa1B31OZ4KgvHYF7JL6XlFSall7ERJ8FDlkBeKBEw0TN36QVnCjf/iKOK0brUrgbTkjlb224MhpMByBfFXzMrUr5j8xVluKduUY5tcsq0c2+o/UMksiRx7RnHowSQC9oVVKN2xTdL9/wIwf+n8cZqqPSB/VsTmr5KN/JExCFRnhL9gLuOvmPmrY3b9ILXqRaZ+kIlZM/uaE2oNGWpT7qfp5IiT86Lm7D5weimn1jUNYdPSEl3I2TmjT5wGip9vuHC2VT+R1ell9+jw5IdfamzhWu7b2Wap/5+c/e2/YvL17ia/YW/63J3a4dmVHOwU2G5weD4EZR7PjnAq5UGSWPpPTH8J/V/IXYjE1cnC2YQxx3qSxiJtJSCG1Fhs1nvJwP7+/1dk+cxlJXvKCRirEud5vLOckFcenmLz1b95dt997qGdVia5cvLo8UNb7L3kf2FqcRZhydjNrmTZ/43RcD6OPnaT5420LY9WsZyAvfBZklEuZO6JozFNTMtmeShK7810OfPBF29vxlvfXfBDH8yOLubNILvTTveFM1R9kbz1IM1sgCZSr5EvTsvy9Eavf2tXnnydBXnn6Qc/MVfTy9PbE0ztwNyZ/C9M7cHzA3Tn1oZ3WdJczE3LgYh9Sb4vlQOp3XRq5UF2s4hRmi8cYaYqE7Bo0w7BwsfTysZTu3B2tgfMtzzdxWQG0pHyH5i26c7OXFdMwsMw5qmT5K741O9a9NO7kvr3065wAAAQAElEQVQrbm1exbrlueOcQStfTB7PTPDmeWL6rpj88E+NcWw52Rgfm30l1IJ4Mjb0fXfkkakzNjo88+F4fgfKM3fhCGkHKpL/YmdnOEunl4wkEWCGbCIryBEzAZkXD6cjb0oliFf/A3N3fEbY1RUE7tixrKC8tWSUYRcdRjMx1fGDv2KezkR2pacY7fDvWvjFc0vmwDyECtDYBZNNpBDLF31hW9GDecAiyvwmzHNHhv4rT2+cbVnGJowdw8ljX2RoIt7eF6TW3Y+Y6zJ3RS6LhM9ceL4J5HfLN8EotaF48GJ6Dqel2l+Y2ul0N79i8v/ouZfvpHvfNd/Fyg/nM8KBj8bMwZmofiK1fDMixuSNM1X+gsg8CctcNyagXjk5HSwfPfnh7O4AmG+qnMDIyalVOnHWhGbnL2aY6SnQAmdBv/EHczu9XUlf7co3Zxel7vrB1P6zc197F3Nv+IncxwVE7qIn75UakdFaecR2Z9f6cGJ5L2DuG9kao4dLqIfMTHnD3EkRlvoXr4oeDIAxtmQkFyZdpAFLIVcG2wvB6GN3Erz/vf6F2UoPwKoszoorsi9FLqlKbzC7gwy1Mhwl9T999tPCKLs7ciC1bLtqB78h/eUgi4hh4wc/8bIzHZfd0Nsb3jhNWAdp+RfyY/XuRdrJmE/kLdSaLeZ3Y2kKyHxJ9P/ot1nuKc8WcmDvzM6yDw/l0rZxFx29/xXpyXD3MxQcKaSjKa+zJTINGFr4xXMvBZSpPfFoh2dX8hvunXzH9S2snZ0ko3PLHznN2KcHwk1d+oXchxyR7mSkPIgs96T6J+4bup88eHjo5F2WVae3xk2xiB+eu3lJhQfsAHqQnmS5Y7CbEqiyJ4ZD0oJOV/kVk4+nKd96OANI1FhQ7QfbgbrIbmw5Wt/3jeyrvpj81XeWpb3/Gy8/ay5lI+9lZgixSrEq91zxf2aBbf5CKNkvKMmSKKsoFcUxmReBshvPUNQTtytN1eHUMImAgVjqOAapNVguNjQlKCdoqoZcHYqaqGBKPyhFUk7rJCeSYMrDvjCShNjEsq0c+wu1/MR0adkXMtvuG6KULyZfzxLbwvAHlNBx6QWZkZRoadHv6O0Bm4FOt8Wx8g5ZescUU19U0ERHfEBxjA4QHQAL4PBhjYdw4iZ9EB3Bv5wWpX7DEJ2yvlZqz8je8iK7Jku0dPATkRT9gtQqIR9YKVxSc6lILFr8c1mycRo92SUePYsO4n9harg4toXhlmIQ27INt/JP5B+UhksnSrLm/BPZ1c5FOxP4or35iXQ3v2LydeB+eeZXJNWlWFqezGSWiIc7ucMaYAdKkNggckie9UGrXIsQTCpHW/zlVaheMfmLs9SSbMuSbMuSbMuSbL86BVmSbVmcE7V8UbrwdsL/Qm8dZGemC1EtDgHTwZOvt29zylJC+F+Y2quL0wWD3+kPdzeJh5iJYpLwE0nKQXrsfyA9semSgoeHTe7R2WVJtmVJttV/J65mMJVgajekVg5KoiyoBn2iTI0AbBw+8VetHjndN6RSvkieu2iTHRL9jhQQY9Fx4ekV5xtTQ9aJej/fs+Wz25kPX7etSFq04RIUjJ1cPUuply5aLvUDWmLI+vwjxeCmRDZm0SaiiqZ28wuX1R5dkbx8MTkuGi3J/SdOMpVZORYtSf5AS7FttEtkv6A41KiKJh2oHAiW7PRvrpmQDmRX81eUlFoWfaGNiGk9VJw7WsMvKKeL+IRafZEWLARdSgjPzmA5SXnRmnxRwYsf/ERWMmBJtmXpP7s4tqcfhMo24Dui2RZi7I7ipAToDal5i0W4wiWiJeKrp5z6DaVIyon+l6cx9RtGsGyz4eOW4SJ+o3qqErALN/1QdhnQE6JVv6BtJGeimMy2jALcMdrpnhrR1UwmfJHhZHaj7A+2y8RoIBl1IjkSCUYu/OQl6H8hNePTZYnc+KA4w4TWveIYx765IqT2J9LQOsiOzjygvfXU8DuThvuOzFicG6KUL5JnyA6X7AtK8I+Ls+XqkjX8gpJg+IHDGn1oiwe/IbXyxeR4FtoWhptizOSD8oEmNcSgOIsMGibUO0ZRDy1fOJ3agg3HhhuwCBeXhktFcTIDfHgIzijxyw7xF6t0FxloWWNfSK36idJw6QcR0pbCB9lXfTH5ujhurkZLd0TAlF3P6KnRgJGH/+HS9IjDgAuWQS1vmoBXv+EollElO+g/UKIYu6EsidmAGqRnpIi1eGAbQ55cnOhA+r7TJx4N5zkSAfugLNuSLNuSLNuSLNvKsRwgfmNldJ2eJF2Hix3Nb2hkXHj0m7OrfFESVJb0ipJSF8dkXgTKvFHBLLng//iDIn8xzF8JxR8GXzAlnD8jxpJdMBsYXWU3wFb/+otjKdVYp9IW8YZcUQ7Gkv8gIpYdKd0xhcNTTf6Cf5QywY8zq3/eyJd2lpAaH5S/0GbmB6lVPzFs1iZjQ+CsDmd/VHaX35BaOZVY8jdkB+Xu/saIbArgLEgvGUC88j+62kb9hnxb+SJ57mYpP2cIN0Ro2hCBZmCaSKLjZFsge+OUDjtaTr5C7ov2hNEOf+yJyCt2VZ4YJSPBw6fMb1HhCelgqJUT2ZuFKR1IbdMU+c2A1PGs3nJ1KsXsHD1Z1QTWhI9HyIqDHbw7E/DsALrzGdkQS+OJbCwHuXGGWwzjGvJdtlnYf/RjYjH3ZLKI9oMUo1HqO4rR1oF5FElqwJ1/xMkSx/N1fAwTVx4lfJEUC5m1EOzOI+B5ZgpFAtbd+d8fuSs49TI+h6Hp6O5Rpf9XLZ13R2ZmtRmFTzK7qfVSNl2RvPXgLunUyZmrvkg+9Q9HqrG5+Kmk8+LsbC1SvuoJo715tqd2IgS77czeVz8HSToIjpU1wEHstnY4X5iE78CohyNA+htmlBx4+e0ZSRFnijg8eTxCkK37BcnSs8juZHMXGc1E7ppJyuQo6CSxDH9w2ro7IW13rIJ0RfahZNGhZs0jn4aUjpYvpAHrg54w9+QjTmS8/IKpQT+XlLyEXJLS4mVXlXIyMF/Z1eTB+Y255YdnX/Qn7BYKf2Fq472HMFfkHey98NHRKLF0fjby6LRh7AknGyshvWBZOL1ZUp7kjXNfynjvARlJ5H72JNtCf6NI4SeSlIOXXobDWH7oQ/+O23s84BtzT7QTs40ZjItqvRf+eSs95SDW0RP5TahlcHQ4tfIT0xA9eK+kZdToMAh2PKHiledNuedEvuXD547W0LNkZqNn92JSPJb6n5jlNGQnwMqZGM6+1q9IV7S0gYE8BbXf8ogVCa/NKbx45Fxww2PXYmpxaFpvHtIaAesjeXfw+Mbkcb4yG5ho4wUrwx+QVizjU2f38N0WjvPDYlTIc+/h2dic5INdR/9ianiMDb0nOHyyvY1aeNgi92VLdg/uVMrpDuLb1juRPzjtiRmnlObQwdzUApVn3N5Ae5p8AmtKXpEC1gedSJIHxzP8gvPNaRhnapKNB7/jfFG+pTq7q/zgdtDUew5kN63zXDTo5CTRgRvP7rTd8crmnvQ0a0L9hlTKn5BCLJcH89/gB9lXPdgXJnQZreQTEcj/YWfrJrk3I1dMfjrF5otAf6AbhuC7kuxih/iLoySO9+tI/4n07M/RT87zTk5S/hemtp6H5r5ZmSwrvzHaOo3Y5SfY3rkUnWos/ER6ysFe+A+kh1Hi3Jnkwz9Z9exNwvcMpI5XD0b9wtSQeGyKT5dcdBqxNh3YaglZ8OpIx1uCKa3UtAEBxLo2bfHh/DZJeCPWxg+2wLOvmBXhT8g4lurh0Fx1Ossm55L2XLC94evtpSn/+wSJC3lrm0j/QmqMEdM32U5yd3jYHdMZ/5/N3wfXFcyaH5QsDgEj0XAJHMVk4vwgu0TNtnRBnVxq3jIB018uTuppesPUXp351kRkAaYcEBNi7ILWPPUvNP2mz5Is25Is28qxvxAxSpxUwY97+SKzpsn26EXyC9rhkv2AEjou/aCMRmAsMWRQ+kIvf0CLY2WHdCCZ1VOd/IMhlCI0bYggxqWE1E4Uhx6ioinnm0dbP0rQpt0V4pl+4LYl3A4mvaBECS5dUD1pTzJVadCPGDUuhoJ2Y4eaOalTxhe1aGpvfvQ8IBLm09lCPtHKcbmIVo7Fs5L8gZZiaTzRso3uE0mGi5MaEM2LgfDin6ETdCxedklo5VeUFK1SgvTNU1ZKuDjlJ1rDLyinSnxCrb5Ii6P4ysnLF5OfbuU+e1FB/BWzI/ULplci3l0c1o5uCGZPYl/Rsp3qILkNxzEhxgbFQaQqEbBf1Oc4TaVuVHnydXZVO1EcapjSG/yP3hXHDPjhs8BepJbdLk4mzodDMONp+RutWXvF5OMp2pPbIDvtb5QsCVlF6QG92hcyFMW2RIftRNmWZAXswRDSyEkHxbF+uTjR1UC8YBn8giKPRw2qx+p9yZ2A/yAC1sYnFGKX/KKNxkqlR5J9cPUc7I6Wt1pk5hdRqi+SC7fDRWp8UJyVq0GLJhndcnLiO7rVRobuqKn5iuRwcWjX4UKzLQy3VGsgvaKXB8X5F4p+9WT3JI2yfSRFG45RkE4kqR6U1FwqihMOfHgITjvxyw7RcisTBWvGLpPrxK34gtQUfqI0XPpBhLSlcEVf9eSntxP2go6Ov6KVe+wnRBOeGqhidqGJs/zQT0wJjzkBP5EZKK2j2Ff06lekOz0eTEqTtFw5yV/xqRjtxSNnOehFLZ7c0kqDBy9axxuLCrf0iq0ox/QcaJI4UDV5PCSY3YOOJPuCyV9d0+tFabh0QXJx0jMgUjKBk5lMnMFED+NeUbMPLo5VqkVL5U8oDrrWncRoiy4aAT+WRDudUvMnRGOMqKeWlrIzCYjRZ9n+oCzbkizbyrG/MCK+sqaqF3T1RIvDkFHsRmnRHg4gkTslkwcvLo0mvSAzkhItLbp4Z5aiBn6QSvUnpBDrQ1MPuSC7RM1yROIgBDNcHOOxA5O/+NHCznY8YbRXZ6o1yd5lBzyiZeX4DzQNpm6JnZYvSFp+wSmL1ojF5ONevqgnRKsezIp/YXrW/UFxbLNJsq0cG4xdkCJWUeafqNlWURxymD6cVBxEjET64CcTx75zlaOdSJPCL5gakk6kVg7GkoMpSxAseHLlWAcnQ0g0KJl/4hQtWMMFJUhskHJIQCzF0J30RDvckiwbFw6KY5NfMbXwE0X24t+zFy6Oze51FQVEk0hidxTHEtbwi1WoX9HLP9hh1P/NXxv5CyF/cmwu/i6YHOxfJEEof0lMQo3s+FsiyrLRy9Mc9S+klru6v8tyP9PVgx+fvnAaaw0RcukiGndm34jLn7SUqqcTgrEkJCr4/ZYnzlDf+oBs6ZtPzEr6uGR0ePL1vDnV1N4xb8B3Z3v3/k/O3mpfmHtYjOWqbPg3Tlcm6f3cy+byO6aNnr2AJ6RMX3TSCNTyTtaih1z0EYnR2UNG0zEcNjmRqcYbMlbxxE24txnYfeC8AZU82sHvyPbWF1ne+g0hWNroOt/IXwlqIQAAEABJREFU5qgXjkJTv2qx99KRndFJkcja+obc0nrwq4cFx65XTM/p7Gi+mL3hYBUQ4018CtadCEHa0P8/Je+WLbuy41gC2f8+35wAKbnkLq19wjZJEODDTH5i5MeqO6rkvyM7aM4o63n7E4+23nuacw84nJzfjwUYebZdefLTO0QfVu2XRz5XkJTfcO447p5XJ6LTnGy+KZx7mB1bnp6mDWm9ONORj55itHUW5V4YM41fyH2Z6WelDs9MeDy7b7g915nkOIsx6uS5E4JlwWiQGBeEz1Kqw6FcG4PHqNQI1Jggrk7XcCJ3Rd3FQPrx1QfCGQ8hZbwjz0gDxqJYhuitAB8kqd5vZAmvGE5OQkwfY2RrIUnB6c6OdvEmbPQIkO79wmjxzm0tfEZm54ezjofQxp1ba4aO+DtDT/UXTO303cGS3leMlgvB3FMtYTgSduXcg9JvCeJR2s09d2Rv6oyPDiffNlaERBvMm2indTgNm4fjKX6GMzh19M6iIExsX9OGTGffPzFzePf9E7mtPYO5CMprwstyJZxfiIuJ5NSI0MbRNjLc7BWZTY3hvI909pc/1djWWgL13MgQKiQRv/F9cyC938iaSIwEuHuEvCVCEWlwdtOEVTyRZO5HnpxploaWQz8Ygk+RJFZC8sFm7GAxxt28PzuSfTAlOmPpfcRZm3Ln6DmRnf22L8wdp57a4cxOjXujPXJq1YN0J+dyjGvD//DupH7i7sgnsIBVswNOQhd18ugA0mTzdmrMEFdnbzje+iOypfoLIvfSRTZmPYx7sSFJXpzd7TmR0Syk/dyVWvhiyvFQPiTGCrrpCbl9C43lr8gotbk1C4Yni6cUzF3B7qc5O8OLFP87sr/9i9+7yqmdyHcl5yF7X7Pcl65gOoLPPMN0zHCen7Z3ZHuNNxYbmP8LU1vP2FzAvdFy74loaYj2gJH6sCR4v+kb2VX9RG6jh82MZjE8BF+ZTgixVcRf5PuqUwlenKXY1quz/wejreeerPkLU3vz7E7tRPaW7zdk9zryvo0e+g/+i/N+minNMEqGHvjeE5hqsyPMbw/LfQX2gdkdKKb2n52p9uY5xy40LDJqV96QWvmJmcsXgQwly9AzMkkPn0ZL+sM/jhjDmU6ZXuzDGcxvQHW0H86uaLxtepZnV/Qi2onpCr9galyKzR0kuROC0Xfl7ETEOhSWZV+IxHsiMp2MlH6y7v1BurgjU60nXw9wWUo4O7BfnoXr3BSjuW3BST53VKOpdwXxaHQEYFxSa/jlyIi7lqnyJ6TAB+Sew3NBcxYEeTV7mCUJZyIVvJ2Lydez79pbzvwVk786e1r7RR4y9/EIjIZYdg+mCMvtpOmAsWuqX3z1/2fabfO3QMk+kFwcS9jp4hjmRWCZPsiOsh8Uxxr5G7U6KI4/blmxhqYNUkTSYvI3P3vEgWAkars4PxwBEw/FFNSVQ+wKsoNp+UJ9c/WMqq0usqP6F9qeviL5icwl9wtKoizKekbLEm78DVOzRMfssIIH/0Gj4MLbd8OQ1BfbBL+hYUY0KI7xmH941Jt72Ymb9CHUgn/60SPZ91n74Or5opqq/0BLDFm+IGn5BempdCK1GVHOyhr0A6IJp4GY7OLa/AUdHQfFYQX9UlAc281tS7GiZRtu5Z/IPygNl05Uq8pxAv6NSDX7XrHD8VdkLDVa9ISUldoDpl2X4rQljru1REvkxsccSnqgBIkNIocEiknw3kfAZBsXJ4gLR9MiTHZiFVnCjQf/cG/tRM/MsSu4rkWbHny4dENxLGENjyhRb+UFvTqYe2BaLMhZIIHlUNLQf3sa03/DCPjjMnGoNQ6S1soImD7rnBR+QUtiN7aIALFBWbYlWbaVY3+jFGXlyaVF35EmS7ItS7Kt/nvF7fEVk69LYlSUSWLWcIfI/BPnjmFe9QtDmckOnUhWfZG89WKCpAhJFw9OAaMgPDVxvjE1ZJ2o93OZZaP0xKPhNh24HUzrA0rXFcpJ+wcthxCv6BsfloiMkVnvmNqby8r9xB+Uj50mNcQgQLRyTPaEWh20enJHEnsE+4KkdoPsL5yhRFEU1aJy6C1PHr+RCPFDfEF2KFtPFIfeWoOUWtITJZWrJ3KSQesHZcom+gG1+iItjuIrJy9/Qiv32VdMvq5vzA40SfaivpGa5hg4nFR2mL7QyxfpsZ0mdCkh9BHFSSugC4YORzzIidFePPIM0g3BSBRJOeF/OkVMPBhjAtLESC63ryiZf+L8IiJmPFYkYMrIoJPCL8h+G44Ltye3QQnpG9EkdFz6RUmW1n3H7kQD02GT02FbKjaqVFbRaLjwHy5OdKD1CcQRTSb8HcUxHrO6f9JEyZpzIgmmNL4ihdZB4clBmzzbFu3l0fCDPaPZkKYntMQuy4Pkwu3wSN8YbVycbcuInH9Woka3LOHGD0z+4t6eG6LBxelO8mAW2haGW6o1yF5U0ERT9wUl0WPlWA4QB0WmnoOXEOxVFu07V/ijd5iApQ60t5iA7yqysfIGuGWiNgYP7mqJjgz7B1KmSX0G+Q1lleuOMJ26yjbmyvAXdHT8Fc2e1C/o5SdatiOKKNuyOG+YEh5rH8kHJ/NskG2q+kIvD0oQXAq2PcFSuIrSieJEA6ollBMwhf/p4rSRLhAT2RgEUw6IqXoSPM8SAUN30i+0JMu2JMu2cuwv1PIT1WzUTx5ue2o3RCtfTH46880XJdnpW5TguDiWMFFWMMEESxsP9HIwzWWWgoEL9v8fgMdfFj+YvxmqIX83JOMviomVmnz0yfhb4+rhH89fTTsVKVueMNrh2XLkwYOfiIjddmbvq5+DJAxiJB3/F7Y1fylNAmKM8KVNDmRV+QX7litnDMsaYKvUQ/DR2Ud+/DfI71ad3akMJ0NsHmQTZUYuOjuqgZRj1PeuzqSwnJRJYjhFsuGJ4UFEtoS1qwn6DamULyZfz1sZn0K0kB+MgOfhuS49f2KLz+HY8RemdjprmueJvAHaHwzs28HjOWm70JX5LSLCZvqLMzRKIh21hplo2vDhoetZzQpqeR9ONjwNLzw9+FS7oeyRs6Ydr0ghlktp7G8C728E5qua5wZ6kLim8YOpMfvfbGePGXZ27ob0lAepJiftO76R8rHqGzPGI9OB90uKBOzDJ0vM8kxckBSLOOsh2J1HwHsfAeOp7ENLYznT/W0XqU7PviSt1cozRYL97+KkTCde6lmONLvRb5yN4XjrxTZz9yKQpbn/ipFPXnKEdkKumPzFI5+LIBjDPLRxMNqb/8zSyHd08MD0nJ699AB8PfFjVQlYxSIBm3VR2Tl8p8Px/GD9Dbnnjoymzuzo4Xg5Acu+d597JjLHruSzi+yHZ2F0sG8BWU4bw7UGpBdsJZMMpiX842xGv3Io3YnpvqbV0prkislPJ8Hy+80s5HwseWe/cBqprE72X6zd3U03+OFk5YvkuaK/caUEvi76jBLDC316si1nNHTx+MUGmUJPPg7Bkm+lV8HBKiB2uyP3xBnEqNYaXjj7qGQJXbwtHEB75qmN956k05gVYTztIiQ9GoNXT3f4X5haPHuCNz/EF+xuaidmOJwn8n2xPjpSeor0HJiUHGhbp8r5jQ5MkUWlxWTUyVNK9o1HR1qaE7DecUemEfJ/a30eAaMvYl/TnC5I4y9yCd08YevNCNjojJDHjo4TcxmF3A/0rnZXpysLkr9hhxLw9AA8J7FrNsAfi6undjjSdUHkLyn02tI8fXUCxofEaIVgecd8Y74pwoGt0PeElbs+WaZCighFfpsnzF2nnp7DM5f8hrk7wiDlXFOSHYfTgR6W0hX5FipVM0ye+4fvVNvpC+Jto1SEM5L2woQUI1HEko1eMsUK4VenVP2KydfTmvQVKWD9j3ciSR4az+7F+UaWlfPCRZQaU/8B+U22q/3sqPKKew/Nvb8YbTyrGM0r759AYfRup85gtGbRwp+QpvYspo00u4De8YP0tB5kthbh5CQjEslTuy5BDeWLBv6KjLd84ia3nWjli8lJnx/PttSA8xnJ44eeHB86MW+d7Os3RIySXa9IT+tPmHui05Bn9x54dp08tdPbAfsLU2Mxlh2se/8ptuHzf2t0ow3PK2YJKktfeFrwWPuSrO8E7Kh8IXexGIuOY5BaQ3h6brjropH2xzgRETtn70W6Urw60vZ8v7U8rdvSlIBd1tMVgTdi6F+c3f0tT0xLBi5Iba5YHZIsTtpq8jqXFKvOjnL09oK8gP/eVUHUaKWpPHH2IGdl2u5YBemOO7F6auNcxSZyLD39XwCKvxLOHwYtU9bJpXJpEIIp54OTeTqIpvxxe/MTKdMVU8KWkz66OOkBWk8oJ2AKf3FXF8e4YOBYCFxKQPoDrXn6FU2/0S3Jsi3Jsq0c2zKJnajJpX+gp86MJdmWJdlW/10xeVwWIJsOb28xuaTkkiiLlKTW8OHNqF/Ryx/Q4ljZKR1IZvVUT75uk2B6Q1FM7RWzlp5AeooTDnWYptpdksDWnxCt9SeUKDEZS12Cq2fpF7dM1USDWvSiGJp848FPnAmo2mH4X56u1MEx65iVmSV4XRSsHMsB4g+OIFqn44cjxLbBDqF10Q7/OJn+WKZ/n26gbTH7Yfed1NAtKyZyJX1FaerqSVuSQesHUxT6iSbzo4KIUbMuSF6+mPx0K/fZi1osJy+/YnaEXzA9ylmd1HjsB9lb/REt2yJgB0qQ2KA49FBVxEHNgWCTJ5Y0wK6Y/MUji4DpDVPDeUZb0hYvbyKOdXDbyxd1RcHCn1CiGFNOuwiYIg46qexBEow8/MmlqUvvKMnSi3t1K8c2HAeVDITJtiRrYFGLpoJDNfULF4caJhE8gegPh5WAxo88aOVMVGpNCZhynjDa6SSY8rATSeA2KHzRJu/OQXsxGj5MmVDOI2em+g1RyheTr2eZbWG4sxbUx6XJpRe0LOHGD0y+zuLNqJN5e8BmICbalBM8XBTsBMle1BMa1WkabDy4OEYBiA5cPGtLt/DhFyHpUQj+5VmW+g1D8OwBDhs6UefbTCbOIruavaJkm4CdKCkS/oMI02YF0xiElRd1je1AeUFHx1/R6n4CRv7hcuYse5xEZBEvKCl1cQ5MisecgH9wMsuokv2EaNVNXWqw9IjipAboERExpXigckpIguNOD4oWyy0OodYw1UkVsk/VoO+o5UVLP1gFdVAcw7wIwPRxCtiFe3IutyTbsiTbsiTbX35oi9LUxUnvgAwmBA8fKUyUrujlIDtaPVGc6EC6DFLDkqhYrfSXiyKmR0zh28WJBmQmcMVLqWkDTSAm8SDsC6kg2g8oMYIuvaPmTJcUPDxsclcXdySzG6HfyERqfkI0iZmLS8OlRZ8ooxG8frA7ipMOIH2+osRTlHNDesqLCaJvUUF80Yt0YFZPh8kOJH21Hcma9hwzN6SpfDE5bocztWjDlwJa+osp4tutX4xidEsssXxBUjhyYoiaT8sfuaemJ0Srvpj89FwR/YrJ1cZqOj4AABAASURBVNO7yYKAftFSLIUTLdvolv2F4qChiiYNkooDwUg+5ulAMB77QnYpPa8oKbWMnSgJHqoc8kKRgImGqVs/KEu48V8cRZzWrXYlkJbc0cp+ezCEFFiuIP6KWZn6FZO/OMstZZtybJNLtpVjW/0HKpklkWPPKA49mETAvrAKpTu2SVo9tfHegxpLtf8LwPwFNH8Q/Eb+fIjNXyUbaQoC1cXJTP6S+CfyZ8fWix36+ssnG2YpOglGghiDYMmi5f7gwYu85kTuaA5OL/elzo6Dk05LS6gR0v+KFFp/QHb3205kdXrZPTo8+eGXGtv4FO7f2Wap/5+c/e2/YvL17ia/YW/63J3a4dmVHOwU2G5weD4EZR7PjnAq5UGSWPpPTH8J/V/IXYjE1cnC2YQxx3qSxiJtJSCG1Fhs1nvJwP7+/1dk+cxlJXvKCRirEud5vLOckFcenmLz1b95dt997qGdVia5cvLo8UNb7L3kf2FqcRZhydjNrmTZ/43RcD6OPnaT5420LY9WsZyAvfBZklEuZO6JozFNTMtmeShK7810OfPBF29vxlvfXfBDH8yOLubNILvTTveFM1R9kbz1IM1sgCZSr5EvTsvy9Eavf2tXnnydBXnn6Qc/MVfTy9PbE0ztwNyZ/C9M7cHzA3Tn1oZ3WdJczE3LgYh9Sb4vlQOp3XRq5UF2s4hRmi8cYaYqE7Bo0w7BwsfTysZTu3B2tgfMtzzdxWQG0pHyH5i26c7OXFdMwsMw5qmT5K741O9a9NO7kvorbm1exbrlueOcQStfTB7PTPDmeWL6rpj88E+NcWw52Rgfm30l1IJ4Mjb0fXfkkakzNjo88+F4fgfKM3fhCGkHKpL/YmdnOEunl4wkEWCGbCIryBEzAZkXD6cjb0oliFf/A3N3fEbY1RUE7tixrKC8tWSUYRcdRjMx1fGDv2KezkR2pacY7fDvWvjFc0vmwDyECtDYBZNNpBDLF31hW9GDecAiyvwmzHNHhv4rT2+cbVnGJowdw8ljX2RoIt7eF6TW3Y+Y6zJ3RS6LhM9ceL4J5HfLN8EotaF48GJ6Dqel2l+Y2ul0N79i8v/ouZfvpHvfNd/Fyg/nM8KBj8bMwZmofiK1fDMixuSNM1X+gsg8CctcNyagXjk5HSwfPfnh7O4AmG+qnMDIyalVOnHWhGbnL2aY6SnQAmdBv/EHczu9XUlf7co3Zxel7vrB1P6zc197F3Nv+IncxwVE7qIn703twPZSHaSHPDV4u8F8Z3w4sVqW0MtuhmIpgAgxeljzy0cktukZq1IPBsAYF7CPe0NOnQRLIVcGUw4evG+H/CdkfftekW+m1rcEsxfMTJ7Re3nAcJTU/3Q2tf6EaN0FHj0Hv2HehLcHTO3waMlPZFf5BVPjqcg8n3nyvP+N04S1iZZ/YX8c+hZpJ2M+kTdwd7PF495pyFsYSO0/+G22YwSWZxSYlbxkeHZXRbkgRSp5GDrzTxwty477giOlv6Mpr7MtMg0YWvjFcwsFlKk98WiHZ1fyG+6dfMb1LaydnSSjc8sfOc3YpwfCTV36hdyHHJHuZKQ8iCz3pPon7hu6nzx4eOjkXZZVp7fGTbGIH567eUmFB+wAepCeZLljsJsSqLInhkPSgk5X+RWTj6cp33o4A0jUWFDtB9uBushubDla3/eN7Ku+mPzVd5alvf8bLz9rLmUj72VmCLFKsSr3/I2zsG1M9X8BOH8blPLXwTPXHCv/tHHQ0odnKOxEcaxSLUIwiYCBmCXh2BeiYIfoNCnHBMNcFNm4ONGAaE0JmE4uJVVOdZITSTDlYV8YSUJsYtlWjv2FWn5iurTsC5lt9w1RyheTr2eJbWH4A0rouPSCzEhKtLTod/T2gM1Ap9viWHmHLL1jiqkvKmiiIz6gOEYHiA6ABXD4sMZDOHGTPoiO4F9Oi1K/YYhOWV8rtWdkb3mRXZMlWjr4iUiKfkFqlZAPrBQuqblUJBYt/rks2TiNnuwSj55FB/G/MDVcHNvCcEsxiG3Zhlv5J/IPSsOlEyVZc/6J7Grnop0JfNHe/ES6m18x+TpwvzzzK5LqUiwtT2YyS8TDndxhDbADJUhsEDkkz/qgVa5FCCaVoy3+8ipUr5j8xVlqSbZlSbZlSbZlSbZfnYIsybYszolavihdeDvhf6G3DrIz04WoFoeA6eDJ19u3OWUpIfwvTO3VxemCwe/0h7ubxEPMRDFJ+Ikk5SA99j+Qnth0ScHDwyb36OyyJNuyJNvqvxNXM5hKMLUbUisHJVEWVIM+UaZGADYOn/irVo+c7htSKV8kz120yQ6JfkcKiLHouPD0ivONqSHrRL2f79ny2e3Mh6/bViQt2nAJCsZOrp6l1EsXLZf6AS0xZH3+kWJwUyIbs2gTUUVTe3NZ7VGQviL5FZPjotGS3H/iJFOZlWPRkuQPtBTbRrtE9guKQ42qaNKByoFgyU7/5poJ6UB2NX9FSall0RfaiJjWQ8W5ozX8gnK6iE+o1RdpwULQpYTw7AyWk5QXrckXFbz4wU9kJQOWZFuW/rOLY3v6QahsA74jmm0hxu4oTkqA3pCat1iEK1wiWiK+esqp31CKpJzof3kaU79hBMs2Gz5uGS7iN6qnKgG7cNMPZZcBPSFa9QvaRnImislsyyjAHaOd7qkRXc1kwhcZTmY3yv5gu0yMBpJRJ5IjkWDkwk9egv4XUjM+XZbIjQ+KM0xo3SuOceybK0JqfyINrYPs6MwD2ltPDb8zabjvyIzFuSFK+SJ5huxwyb6gBP+4OFuuLlnDLygJhh84rNGHtnjwG1IrX0yOZ6FtYbgpxkw+KB9oUkMMirPIoGFCvWMU9dDyhdOpLdhwbLgBi3BxabhUFCczwIeH4IwSv+wQf7FKd5GBljX2hdSqnygNl34QIW0pfJB91ReTr4vj5mq0dEcETNn1jJ4aDRh5+B8uTY84DLhgGdTypgl49RuOYhlVsoP+AyWKsRvKkpgNqEF6RopYiwe2MeTJxYkOpO87feLRcJ4jEbAPyrItybItybItybKtHMsB4jdWRtfpSdJ1uNjR/IZGxoVHvzm7yhclQWVJrygpdXFM5kWgzBsVzJIbikOHgeogedtI+78ABPlbIDF/fQRipAH0yfJ3xgg/2D8lop44XQySRA+wA9s/XeYPlB+nPL0k6QGGQ7BpPEWSiFdHmgGS6MCVP0jp+LTQgH3eBsHC+0lpbJJvSYEXlV8wPSylg4je+Iafrm5j1y/SU51KLPkbchflvuAbI7IpgLMgvWQA8cr/6Gob9RvybeWL5LmbpfxsIdwQoWlDBJqBaSKJjpNtgeyNUzrsaDn5Crkv2hNGO/yxJyKv2FV5YpSMBA+fMr9FhSekg6FWTmRvFqZ0ILVNU+Q3A1LHs3rL1akUs3P0ZFUTWBM+HiErDnbw7kzAswPozmdkQyyNJ7KxHOTGGW4xjGvId9lmYf/Rj4nF3JPJItoPUoxGqe8oRlsH5lEkqQF3/hEnSxzP1/ExTFx5lPBFUixk1kKwO4+A55kpFAlYd/f/Sw/TwannZnwaUsFbWUz+68q23LMI8JMgkMxuZrrz2L2I1nqQXoZ6zweZq75I3q0EDPYxNi45KsGLc0e3RMotTxjtzbM9tRMh2G1n9r76OUjSQXCsrAEOYre1w/nCJHwHRj0cAdLfMKPkAD8fOsmPjhabKisgyeOk+3L2QhKjn8ju5mAmA8NpZrKcgFGmMsO8hTo5hl5r+OVVsomBtISzB+VgwRbRUr3xEa7S0bpIA9YHPSE7WzuRsX7MBVODfi4peQm5JKXFy64q5WRgvrKryYO3/25tIbAqZWCeSXLn3RI1K14wPeNpasbq4DfPbkq3u6pVzC/AFDkxhPGSO5ZFb9fLm5DbF+yqJrlrkkbewZ6kW+hvFCn8RJJy8NLLcBjLD33o33F7edv0ffHck9qJ6aIH46Ja74V/3kpPOYh19ER+I2oZHB1OrfzENEQP3itpGTU6DIIdT6h45XlT7jmRb/nwuaM19CyZ2ejZvZgUj6X+J2Y5DdkJsHImhrOv9SvSFS1tYCBPQe23PGJFwmtzCi8eORfc8Ni1mFocmtabh7RGwPpI3h08vjF5nK/MBibaeMHK8AekFcv41Nk9fLeF4/ywGBXy3Ht4NjYn+WDX0b+YGh5jQ+8JDp9sb6MWHrbIfdmS3YM7lXK6g/i29U7kD057YsYppTl0MDe1QOUZtzfQniafwJqSV6SA9UEnkuTB8Qy/4HxzGsaZmmTjwe84X5Rvqc7uKj+4HTT1ngPZTes8Fw06OUl04MazO213vLK5Jz3NmlC/IZXyJ6QQy+XB/Df4QfZVD/aFCV1GK/lEBPJ/2Nm6Se7NyBWTn06x+SLQH+iGIfiuJLvYIf7iKInj/TrSfyI9+3P0k/O8k5OU/4WpreehuW9WJsvKb4y2TiN2+Qm2dy5FpxoLP5GecrAX/gPpYZQ4dyb58E9WPXuT8D0DqePVg1G/MDUkHpvi0yUXnUasTQe2WkIWvDrS8ZZgSis1bUAAsa5NW3w4v00S3oi18YMt8OwrZkX4EzKOpXo4NFedzrLJuaQ9F2xv+Hp7acr/e4LEhby1TaR/ITXGiOmbbCe5OzzsjumM9x66Yh/OqrQD/V8A8ofBmBL446ByPjiZU6Twg/1TIuoX6uQZsoQpWlHSG4qTWhreMLVXZ741EVmAKQfEhBi7oJVnJbyj6TctlmTZlmTZVo79hYhR4qQKftzLF5k1TbZHL5JfMbkl2/gHbbg0mvSDMhqBtsSQQekLvfwBLY6VHdKBZFZPdfIPhlCK0LQhghiXElI7URx6iIqmnG8ebf0oQZt2V4hn+oHblnA7mPSCEiW4dEH1pD3JVKVBP2LUuBgK2o0dauakThlf1KKpvfnR84BImE9nC/lEK8flIlo5Fs9K8gdaiqXxRMs2uk8kGS5OakA0LwbCi3+GTtCxeNkloZVfUVK0SgnSN09ZKeHilJ9oDb+gnCrxCbX6Ii2O4isnL19MfrqV++xFBfFXzI7UL5heiXh3cVg7uiGYPYl9Rct2qoPkNhzHhBgbFAeRqkTAflGf4zSVulHlydfZVe1EcahhSm/wP3pXHDPgh88Ce5Fadrs4mTgfDsGMp+VvtGbtFZOPp2hPboPstL9RsiRkFaUH9GpfyFAU2xIdthNlW5IVsAdDSCMnHRTH+uXiRFcD8YJl8AuKPB41qB6r9yV3Av6DCFgbn1CIXfKLNhorlR5J9sHVc7A7Wt5qkZlfRKm+SC7cDhep8UFxVq4GLZpkdMvJie/oVhsZuqOm5iuSw8WhXYcLzbYw3FKtgfSKXh4U518o+tWT3ZM0yvaRFG04RkE6kaR6UFJzqShOOPDhITjtxC87RMutTBSsGbtMrhO34gtSU/iJ0nDpBxHSlsIVfdWTn95O2As6Ov6KVu6xnxBNeGqgitmFJs7yQz8xJTzmBPxEZqC0jmJf0atfke70eDApTdJy5ST0JuSAAAAQAElEQVR/xaditBePnOWgF7V4cksrDR68aB1vLCrc0iu2ohzTc6BJ4kDV5PGQYHYPOpLsCyZ/dU2vF6Xh0gXJxUnPgEjJBE5mMnEGEz2Me0XNPrg4VqkWLZU/oTjoWncSoy26aAT8WBLtdErNnxCNMaKeWlrKziQgRp9l+4OybEuybCvH/sKI+Mqaql7Q1RMtDkNGsRulRXs4gETulEwevLg0mvSCzEhKtLTo4p1Zihr4QSrVn5BCrA9NPeSC7BI1yxGJgxDMcHGMxw5M/uJHCzvb8YTRXp2p1iR7lx3wiJaV4z/QNJi6JXZaviBp+QWnLFojFpOPe/minhCtejAr/oXpWfcHxbHNJsm2cmwwdkNPHY1MEMwiyOJUv6JWX5SGS2AnJDJx7DtXOdqJNCn8gqkh6URq5WAsOZiyBMGCJ1eOdXAyhESDkvknTtGCNVxQgsQGKYcExFIM3UlPtMMtybJx4aA4NvkVUws/UWQv/j174eLY7F5XUUA0iSR2R3EsYQ2/WIX6Fb38gx2OanEImB54/xeA+Sth/yBIuP4tUZxwgD8gUiTJXy/nL4nhVDOc6hXJ21fsUP74yVj6wz8+feHsqzVEoB9g9w7DqYVfnTso0Li1QOogt02J6kpwVGrZOaNPnAaK87bUL5xF1U/MSurcMTo8+XrvSZ59rzh3EGknpvfH2VvtC7sT7cTMh/+BeTveruwkn7dnJt9yxVlMG+3Rw5sSsBQY6fwTspuPIrZ4IpMY+1hH0viIjLV44ibc2wzM/vi8AXW1g9+RW1pfZHnrN4RgaaOLN0OIbCb5vLkZTcHsCPYd6V2dFIkKw+15RG6pHvzqZUHn/sLUTmdH88XsDQergBhv4lOw7kYI0oZe8t+RHTRnlPW8/YlHW+89zbkHHE7O78UCjDzbrjz56R2iD6v2yyOfK0jKbzh3HHfPqxPRaU423xTOPcyOLU9P04a0XpzpyEdPMdo6i3IvjJnGL+S+zPSzUodnJjye3TfcnutMcpzFGHXy3AnBsmA0SIwLwmcp1eFQro3BY1RqBGpMEFenaziRu6LuYiD9+OoD4YyHkDLekWekAWNRLEP0VoAPklTvN7KEVwwnJyGmjzGytZCk4HRnR7t4EzZ6BEj3fmG0eOe2Fj4js/PDWcdDaOPOrTVDR/ydoaf6C6Z2+u5gSe8rRsuFYO6pljAcCbty7kHptwTxKO3mnjuyN3XGR4eTbxsrQqIN5k200zqchs3D8RQ/wxmcOnpnURAmtq9pQ6az75+YObz7/onc1p7BXATlNeFluRLOL8TFRHJqRGjjaBsZbvaKzKbGcN5HOvvLn2psay2Bem5kCBWSiN/4vjmQ3m9kTSRGAtw9Qt4SoYg0OLtpwiqeSDL3I0/ONEtDy6EfDMGnSBIrIflgM3awGONu3p8dyT6YEp2x9D7irE25c/ScyM5+2xfmjlNP7XBmp8a90R45tepBupNzOca14X94d1I/cXfkE1jAqtkBJ6GLOnl0AGmyeTs1Zoirszccb/0R2VL9BZF76SIbsx7GvdiQJC/O7vacyGgW0n7uSi18MeV4KB8SYwXd9ITcvoXG8ldklNrcmgXDk8VTCuauYPfTnJ3hRYr/Hdnf/sXvXeXUTuS7kvOQ877k7EhX7x0+XeiZiD71yCgznOdHfkd21dhTbGD+L0xtPWNzAfdGy70noqUh2gNG6sOS4P2Gb2RX9RO5jR42M5rF8BB8ZTohxFYRf5Hvq04leHGWYluvzv4fjLaee7LmL0ztzbM7tRPZW77fkN3ryPs2eug/+C/O+2mmNMMoGXrge09gqs2OML89LPcV2Admd6CY2n92ptqb5xy70LDIqF15Q2rlJ2YuXwQylCxDz8gkPXwaLekP/zhiDGc6ZXqxD2cwvwHV0X44u6LxtulZnl3Ri2gnpiv8gqlxKTZ3kOROCEbflbMTEetQWJZ9IRLvich0MlL6ybr3B+nijky1nnw9wGUp4ezAfnkWrnNTjOa2BSf53FGNpt4VxKPREYBxSa3hlyMj7lqmyp+QAh+Qew7PBc1ZEOTV7GGWJJyJVPB2LiZfz75rbznzV0z+6uxp7Rd5yNzHIzAaYtk9mCIst5OmA8auqX7xQ4+c7itSwxj7n/q/AMwfB+Nszt8IceGjmEycE/krptBsSzcUxxr5G7U6KI4/blmxhqYNUkTSYvI3P3vEgWAkars4PxwBEw/FFNSVQ+wKsoNp+UJ9c/WMqq0usqP6F9qeviL5icwl9wtKoizKekbLEm78DVOzRMfssIIH/0Gj4MLbd8OQ1BfbBL+hYUY0KI7xmH941Jt72Ymb9CHUgn/60SPZ91n74Or5opqq/0BLDFm+IGn5BempdCK1GVHOyhr0A6IJp4GY7OLa/AUdHQfFYQX9UlAc281tS7GiZRtu5Z/IPygNl05Uq8pxAv6NSDX7XrHD8VdkLDVa9ISUldoDpl2X4rQljru1REvkxsccSnqgBIkNIocEiknw3kfAZBsXJ4gLR9MiTHZiFVnCjQf/cG/tRM/MsSu4rkWbHny4dENxLGENjyhRb+UFvTqYe2BaLMhZIIHlUNLQf3sa03/DCPjjMnGoNQ6S1soImD7rnBR+QUtiN7aIALFBWbYlWbaVY3+jFGXlyaVF35EmS7ItS7Kt/nvF7fEVk69LYlSUSWLWcIfI/BPnjmFe9QtDmckOnUhWfZG89WKCpAhJFw9OAaMgPDVxvjE1ZJ2o93OZZaP0xKPhNh24HUzrA0rXFcpJ+wcthxCv6BsfloiMkVnvmNqbZyq1H6wYVbaVfyruPcqpSvKNkjWHkSYfnIp9QVK7QfYXZjraIlXRpB708hLCjcBrh/iC7JConShOuFAHlVrSEyWVqydykkHrB2XKJvoBtfoiLY7iKycvf0Ir99lXTL6ub8wONEn2or6RmuYYOJxUdpi+0MsX6bGdJnQpIfQRxUkroAuGDkc8yInRXjzyDNINwUgUSTnhfzpFTDwYYwLSxEgut68omX/i/CIiZjxWJGDKyKCTwi/IfhuOC7cnt0EJ6RvRJHRc+kVJltZ9x+5EA9Nhk9NhWyo2qlRW0Wi48B8uTnSg9QnEEU0m/B3FMR6zun/SRMmacyIJpjS+IoXWQeHJQZs82xbt5dHwgz2j2ZCmJ7TELsuD5MLt8EjfGG1cnG3LiJx/VqJGtyzhxg9M/uLenhuiwcXpTvJgFtoWhluqNcheVNBEU/cFJdFj5VgOEAdFpp6DlxDsVRbtO1f4o3eYgKUOtLeYgO8qsrHyBrhlojYGD+5qiY4M+wdSpkl9BvkNZZXrjjCduso25srwF3R0/BXNntQv6OUnWrYjiijbsjhvmBIeax/JByfzbJBtqvpCLw9KEFwKtj3BUriK0oniRAOqJZQTMIX/6eK0kS4QE9kYBFMOiKl6EjzPEgFDd9IvtCTLtiTLtnLsL9TyE9Vs1E8ebntqN0QrX0x+OvPNFyXZ6VuU4Lg4ljBRVjDBBEsbD/RyMM1lloKBV6QjdXzH1P8FoDj9A+EjToW/NVLlj4b8NTHx8PzVtHnbCNgPj3Z4thx58OAnImK3HV93tnZq5yAJgxjJtCT5g7eUP4UmATEm+NImB7Kq/IK9+8oZw7IG2Cr1EHx09pF//sp75eTcQUwZJ2OISM6e1MKD7ADmjmgPHGnqJNkBwGkmGZ4YHkS8ViOH3zBvSN9iauv979+cgNFRazh5EjwP7xryP7HF53Ds+AtTO501zXlRENofFezbQT438ZAPuvjwG0331Nk5HYl8V62B+gtGXs8qVtCb9+Fkw9PwwtODT7Ubyh45a9rxihRiuZTG/ibw/hhgvqp5bqAHiWsaP5gas//NdvaYYWfnbkhPeZBqctK+4xspH6u+MWM8Mh14v6RIwD58ssQsz8QFSbGIsx6C3XkEvPcRMJ7KPrQ0ljPd33aR6vTsS9JarTxTJNjod46s/yXgs5N6LvnhbIyOt6/YJu5eBHhSjCW1DRS4HCO52qFcMfmLR872G7KvfDH5m//M0sh39JEHpud0djZPB72h62UErEqRgKV5ptg5nN8uXeF4frD+hnTdkdHU6R09HC8nYNn37nPPRObYlXx2kf3wLIwO9i0gy2ljuNaA9IKtZJLBtIR/nM3oVw6lOzHd17RaWpNcMfnpJFh+v5mFnI8l7+wXTiOV1cn+i7W7u+kGP5ysfJE8V/Q3rpTA10WfUWJ4oU9PtuWMhi4ev9ggU+jJxyFY8q30KjhYBcRud+SeOIMY1VrDC2cflSyhi7eFA2jPPLXx3pN0GrMijKddhKRHY/Dq6Q7/C1OLZ0/w5of4gt1N7cQMh/NEvi/WR0dKT5GeA5OSA23rVDm/0YEpsqi0mIw6eUrJvvHoSEtzAtY77sg0Qv5vrc8jYPRF7Gua0wVp/EUuoZsnbL0ZARudEfLY0XFiLqOQ+4He1e7qdGVB8jfsUAKeHoDnJHbNBvhjcfXUDke6Loj8JYVeW5qnr07A+JAYrRAs75hvzDdFOLAV+p6wctcny1RIEaHIb/OEuevU03N45pLfMHdHGKSca0qy43A60MNSuiLfQqVqhslz//Cdajt9QbxtlIpwRtJemJBiJIpYstFLplgh/OqUql8x+Xpak74iBaz/8U4kyUPj2b0438iycl64iFJj6j8gv8l2tZ8dVV5x76G59xejjWcVo3nl/RMojN7t1BmM1ixa+BPS1J7FtJFmF9A7fpCe1oPM1iKcnGREInlq1yWooXzRwF+R8ZZP3OS2E618MTnp8+PZlhpwPiN5/NCT40Mn5q2Tff2GiFGy6xXpaf0Jc090GvLs3gPPrpOndno7YH9haizGsoN17z/FNnz+b41utOF5xSxBZekLTwsea1+S9Z2AHZUv5C4WY9FxDFJrCE/PDXddNNL+GCciYufsvUhXildH2p7vt5andVuaErDLeroi8EYM/Yuzu7/liWnJwAWpzRWrQ5LFSVtNXueSYtXZUY7eXpAX8N+7KogarTSVJ84e5KxM2x2rIN1xJ1ZPbZyr2ESOteeGUyK2FOz/AjAJfxQUfziMKaecxKvc0a2Imr35ieKgYaIe+9PFae+BEEwZOjD5g7uaOMYFA8dC4FIC0h9ozdOvaPqNbkmWbUmWbeXYlknsRE0u/QM9dWYsybYsybb674rJ46l4e24oUaZQU3LKJb9YReafOIOJXvaFofRmp04kq76YfN0mwfSGopjaK4pDD1Hp0ecc6qGUdxcKePAfpCbcpoLbF+xouGgBJVA9aUtyR8uIJhrUohdF8+QbD37iTEDVDsP/8nSlDo5Zx6zMLMHromDlWA4Qf3AE0TodPxwhtg12CK2LdvjHyfTHMv37dANti9kPu++khm5ZMZEr6StKU1dP2pIMWj+YotBPNJkfFUSMmnVB8vLF5Kdbuc9e1GI5efkVsyP8gulRzuqkxmM/yN7qj2jZFgE7UILEBsWhh6oiDmoOBJs8saQBdsXkLx5ZBExvCC+9ZwAAEABJREFUmBrOM9qStnh5E3Gsg9tevqgrChb+hBLFmHLaRcAUcdBJZQ+SYOThTy5NXXpHSZZe3KtbObbhOKhkIEy2JVkDi1o0FRyqqV+4ONQwieAJRH84rAQ0fuRBK2eiUmtKwJTzhNFOJ8GUh51IArdB4Ys2eXcO2ovR8GHKhHIeOTPVb4hSvph8PctsC8OdtaA+Lk0uvaBlCTd+YPJ1Fm9GnczbAzYDMdGmnODhomAnSPaintCoTtNg48HFMQpAdODiWVu6hQ+/CEmPQvAvz7LUbxiCZw9w2NCJOt9mMnEW2dXsFSXbBOxESZHwH0SYNiuYxiCsvKhrbAfKCzo6/opW9xMw8g+XM2fZ4yQii3hBSamLc2BSPOYE/IOTWUaV7CdEq27qUoOlRxQnNUCPiIgpxQOVU0ISHHd6ULRYbnEItYapTqqQfaoGfUctL1r6wSqog+IY5kUApo9TwC7ck3O5JdmWJdmWJdn+8kNblKYuTnoHZDAhePhIYaJ0RS8H2dHqieJEB9JlkBqWRMVqpb9cFDE9YgrfLk40IDOBK15KTRtoAjGJB2FfSAXRfkCJEXTpHTVnuqTg4WGTu7q4I5ndCP1GJlLzE6JJzFxcGi4t+kQZjeD1g91RnHQA6fMVJZ6inBvSU15MEH2LCuKLXqQDs3o6THYg6avtSNa055i5IU3li8lxO5ypRRu+FNDSX0wR3279YhSjW2KJ5QuSwpETQ9R8Wv7IPTU9IVr1xeSn54roV0yunt5NFgT0i5ZiKZxo2Ub3L4pjywBFDeqO+hxPBcF47AtzT3pekZnUMnZiNClUOamBwyGYZB38B2UJN/6Lo4jTutWuBNKSO1rZbw+GkALLFcRfMStTv2LyF2e5pWxTjm1yybZybKv/QCWzJHLsGcWhB5MI2BdWoXTHNkmrpzbee1BjqT6jNLryvwCcv0o28tfCILB/WeQPhf2TIupfSK1/ZS0qQ19/+axEwOhheRI8xm1YsgxxE2kEPL3TnKXjhwZOL3J60n4iWnmQLvLufkUK2YdP34Wzs992Yp7Hzq6mL3h1dkTNzAfpr76Y/D/73sey7ixGW++7yG/IPeWLyQ/PvcnBToHtAofnY1C4Z36LcCrlQZJY+k9MfwkjX8hdiMTVycLZhDHHepLGIm0lIIbUWGzWe8nA/B7Z9X9Clk9/VrKnnICxMjErP4iYVx6eYvPVv3l2333uoZ1WJrly8ujxQ1vk9+n8X5hanEVYMnazK1n2f2M0nI+ib++ZweXRaEDL3YjYC58l3ECSfoDmO0djmsib6NlkIRW8+ufe7Pj2eQtj6e1Iwu5MWj07pieUatfckWZe2H1BvPUgQ2yAJtJXI1+cluXpjV7/1q48+ToLcu/pBz8xV9PbT1hMLTyYO5P/hak9eH6I817qw7ssaS7mhuVAxL4g35fKgdRuOrXyYPY+YHZxwUIXQZkirXgiCRZtVkGwk7M7OcNAC7+YHpztaWtGwOivNcDzIe2i74KUWRobnYccv1vEI3/Erpxdrf/wrXH7XLM8d5y9aOWLyeOZCd48T0zfFZMf/qkxji0nG+MV2VdCLYgnYwOfSz2cnuE8svyC1LCUp5+RfDttJye51NsAv2NnZojlvKBLk9JXWCSPldHziyjVF8lzf/eTP2G0+Fyfu/M85rmIkYyP01D+iJnDUzuc5iqvOPdQZj+dXDl59PihXTH5eu5hAJbmsNlDRkJMZbyc/TQmzZctolQPksTYSQP1kv8zMpBl3M+W3RWNbehosS8yNBFnJq+emS9Orfojsr76FblsVkTM6Ad5Yf67564gBeplH0zP4dmT/C9M7XR2Nb9i8v/ovYveE3kh38fKfR98Po9IfqlFuH4T1c4QMDakF4dgB2cKDaOde5EpxoZT5ikYhVoD6iAT7SNgaHSSTD35LEZKJ3UMsgbBehnYtxdnfEaZQ0vPhyNA2s8df2OuYkdXZu6bby370vOE0f6zs7+9iz87ua/PuGB68h3BzCZ/QDbyM2Tuf8XhxPSyEzEW4YIUYvSwFj0kLYsjEsPZTUYT8cLL4MEAGGNLWvPqpIs0YCnkymB7IRh93JEE73+3f2G20gOwKouz4orsS5FLqtIbzO4gQ60MR0n9T5/9tDDK7o4cSC3brtrBb0h/OcgiYtj4wU+87EzHZTf09oY3ThPWQVr+hfxYvXuRdjLmE3kLtWaL+d1YmgIyXxL9P/ptlnvKs4Uc2Duzs+zDQ7m0bdxFR+9/RXoy3P0MBUcK6WjK62yJTAOGFn7x3EsBZWpPPNrh2ZX8hnsn33F9C2tnJ8no3PJHTjP26YFwU5d+IfchR6Q7GSkPIss9qf6J+4buJw8eHjp5l2XV6a1xUyzih+duXlLhATuAHqQnWe4Y7KYEquyJ4ZC0oNNVfsXk42nKtx7OABI1FlT7wXagLrIbW47W930j+6ovJn/1nWVp7//Gy8+aS9nIe5kZQqxSrMo9f+MsbFumuC8LywlYxiMV/5/5U6CZMQgQJ5so2ZZk2ZZkFfSFiBjl1d2UUGtAWiTDlmST5kT0ciMdToqaqGDkH5QiKad1khNJMOWBXxhJQmxi2VaO/YVafmK6tOwLmW33DVHKF5OvZ4ltYfgDSui49ILMSEq0tOh39PaAzUCn2+JYeYcsvWOKqS8qaKIjPqA4RgeIDoAFcPiwxkM4cZM+iI7gX06LUr9hiE5ZXyu1Z2RveZFdkyVaOviJSIp+QWqVkA+sFC6puVQkFi3+uSzZOI2e7BKPnkUH8b8wNVwc28JwSzGIbdmGW/kn8g9Kw6UTJVlz/onsaueinQl80d78RLqbXzH5OnC/PPMrkupSLC1PZjJLxMOd3GENsAMlSGwQOSTP+qBVrkUIJpWjLf7yKlSvmPzFWWpJtmVJtmVJtmVJtl+dgizJtizOiVq+KF14O+F/obcOsjPThagWh4Dp4MnX27c5ZSkh/C9M7dXF6YLB7/SHu5vEQ8xEMUn4iSTlID32P5Ce2HRJwcPDJvfo7LIk27Ik2+q/E1czmEowtRtSKwclURZUgz5RpkYANg6f+KtWj5zuG1IpXyTPXbTJDol+RwqIsei48PSK842pIetEvZ/v2fLZ7cyHr9tWJC3acAkKxk6unqXUSxctl/oBLTFkff6RYnBTIhuzaBNRRVN7c1nt0RXJyxc1KBotyf0nTjKVWTkWLUn+QEuxbbRLZL+gONSoiiYdqBwIluz0b66ZkA5kV/NXlJRaFn2hjYhpPVScO1rDLyini/iEWn2RFiwEXUoIz85gOUl50Zp8UcGLH/xEVjJgSbZl6T+7OLanH4TKNuA7otkWYuyO4qQE6A2peYtFuMIloiXiq6ec+g2lSMqJ/penMfUbRrBss+HjluEifqN6qhKwCzf9UHYZ0BOiVb+gbSRnopjMtowC3DHa6Z4a0dVMJnyR4WR2o+wPtsvEaCAZdSI5EglGLvzkJeh/ITXj02WJ3PigOMOE1r3iGMe+uSKk9ifS0DrIjs48oL311PA7k4b7jsxYnBuilC+SZ8gOl+wLSvCPi7Pl6pI1/IKSYPiBwxp9aIsHvyG18sXkeBbaFoabYszkg/KBJjXEoDiLDBom1DtGUQ8tXzid2oINx4YbsAgXl4ZLRXEyA3x4CM4o8csO8RerdBcZaFljX0it+onScOkHEdKWwgfZV30x+bo4bq5GS3dEwJRdz+ip0YCRh//h0vSIw4ALlkEtb5qAV7/hKJZRJTvoP1CiGLuhLInZgBqkZ6SItXhgG0OeXJzoQPq+0yceDec5EgH7oCzbkizbkizbkizbyrEcIH5jZXSdniRdh4sdzW9oZFx49Juzq3xRElSW9IqSUhfHZF4EyrxRwSy5oTh0GKgOkrctKTmyysm/8f/l74v05W+FgV/cPxnmr5f5k2EpXbGTR9y/NFZvzrogUO0HKWLZkdIdUzg81eQv+EcpE/1TZ3p+3siXR8/jUgPnG3lJ+QWpZRcTgWXUy77x0zXrl7Pzw9HKUWLJ35A7KPfOb4zIpgDOgvSSAcQr/6OrbdRvyDeVL5Lnbpbyc4ZwQ4SmDRFoBqaJJDpOtgWyN07psKPl5CvkvmhPGO3wx56IvGJX5YlRMhI8fMr8FhWekA6GWjmRvVmY0oHUNk2R3wxIHc/qLVenUszO0ZNVTWBN+HiErDjYwbszAc8OoDufkQ2xNJ7IxnKQG2e4xTCuId9lm4X9Rz8mFnNPJotoP0gxGqW+oxhtHZhHkaQG3PlHnCxxPF/HxzBx5VHCF0mxkFkLwe48Ap5nplAkYN2d/3ckdwWnXsbnMDQd3T1qOp6dVma2NqPw/0kUZje1XsqmK5K3HqSXod73QeaqL5J3PQGDfYzNS45K8OLc0S2RcssTRnvzbE/tRAh225m9r34OknQQHCtrgIPYbe1wvjAJ34FRD0eA9DfMKDnAz4dO8qOjxabKCkjyOOm+nL2QxOgnsrs5mMnAcJqZLCdglKnMMG+hTo6h1xp+eZVsYiAt4exBOViwRbRUb3yEq3S0LtKA9UFPyM7WTmSsH3PB1KCfS0peQi5JafGyq0o5GZiv7Gry4O2/W1sIrEoZmGeS3Hm3RM2KF0zPeJqasTr4zbOb0u2uahXzCzBFTgxhvOSOZdHb9fIm5PYFu6pJ7pqkkXewJ+kW+htFCj+RpBy89DIcxvJDH/p33F7eNn1fPPekdmK66MG4qNZ74Z+30lMOYh09kd+IWgZHh1MrPzEN0YP3SlpGjQ6DYMcTKl553pR7TuRbPnzuaA09S2Y2enYvJsVjqf+JWU5DdgKsnInh7Gv9inRFSxsYyFNQ+y2PWJHw2pzCi0fOBTc8di2mFoem9eYhrRGwPpJ3B49vTB7nK7OBiTZesDL8AWnFMj51dg/fbeE4PyxGhTz3Hp6NzUk+2HX0L6aGx9jQe4LDJ9vbqIWHLXJftmT34E6lnO4gvm29E/mD056YcUppDh3MTS1QecbtDbSnySewpuQVKWB90IkkeXA8wy8435yGcaYm2XjwO84X5Vuqs7vKD24HTb3nQHbTOs9Fg05OEh248exO2x2vbO5JT7Mm1G9IpfwJKcRyeTD/DX6QfdWDfWFCl9FKPhGB/B92tm6SezNyxeSnU2y+CPQHumEIvivJLnaIvzhK4ni/jvSfSM/+HP3kPO/kJOV/YWrreWjum5XJsvIbo63TiF1+gu2dS9GpxsJPpKcc7IX/QHoYJc6dST78k1XP3iR8z0DqePVg1C9MDYnHpvh0yUWnEWvTga2WkAWvjnS8JZjSSk0bEECsa9MWH85vk4Q3Ym38YAs8+4pZEf6EjGOpHg7NVaezbHIuac8F2xu+3l6a8v+eIHEhb20T6V9IjTFi+ibbSe4OD7tjOuO9h67Yh7Mq7UD15C/e/wVg+iwHiF+4fzK0o1u26cMXB8IjH5j8xZFFmxLeMLVXF6eDdIAYgiCxB7SON76jmTN9lmTZlmTZVo79hYhR4qQKftzLF5k1TeIvPVQAABAASURBVLZHL5JfMbkl2/gXSqNJJ9Imi0Mw2XCLFAOlL/TyB7Q4VnZIB5JZPdXJPxhCKULThghiXEpI7URx6CEqmnK+ebT1owRt2l0hnukHblvC7WDSC0qU4NIF1ZP2JFOVBv2IUeNiKGg3dqiZkzplfFGLpvbmR88DImE+nS3kE60cl4to5Vg8K8kfaCmWxhMt2+g+kWS4OKkB0bwYCC/+GTpBx+Jll4RWfkVJ0SolSN88ZaWEi1N+ojX8gnKqxCfU6ou0OIqvnLx8MfnpVu6zFxXEXzE7Ur9geiXi3cVh7eiGYPYk9hUt26kOkttwHBNibFAcRKoSAftFfY7TVOpGlSdfZ1e1E8Whhim9wf/oXXHMgB8+C+xFatnt4mTifDgEM56Wv9GatVdMPp6iPbkNstP+RsmSkFWUHtCrfSFDUWxLdNhOlG1JVsAeDCGNnHRQHOuXixNdDcQLlsEvKPJ41KB6rN6X3An4DyJgbXxCIXbJL9porFR6JNkHV8/B7mh5q0VmfhGl+iK5cDtcpMYHxVm5GrRoktEtJye+o1ttZOiOmpqvSA4Xh3YdLjTbwnBLtQbSK3p5UJx/oehXT3ZP0ijbR1K04RgF6USS6kFJzaWiOOHAh4fgtBO/7BAttzJRsGbsMrlO3IovSE3hJ0rDpR9ESFsKV/RVT356O2Ev6Oj4K1q5x35CNOGpgSpmF5o4yw/9xJTwmBPwE5mB0jqKfUWvfkW60+PBpDRJy5WT/BWfitFePHKWg17U4sktrTR48KJ1vLGocEuv2IpyTM+BJokDVZPHQ4LZPehIsi+Y/NU1vV6UhksXJBcnPQMiJRM4mcnEGUz0MO4VNfvg4lilWrRU/oTioGvdSYy26KIR8GNJtNMpNX9CNMaIemppKTuTgBh9lu0PyrItybKtHPsLI+Ira6p6QVdPtDgMGcVulBbt4QASuVMyefDi0mjSCzIjKdHSoot3Zilq4AepVH9CCrE+NPWQC7JL1CxHJA5CMMPFMR47MPmLHy3sbMcTRnt1plqT7F12wCNaVo7/QNNg6pbYafmCpOUXnLJojVhMPu7li3pCtOrBrPgXpmfdHxTHNpsk28qxwdgNPXU0MkEwD4pT/YNKCXoiORJRSJ9MHPvOVY52Ik0Kv2BqSDqRWjkYSw6mLEGw4MmVYx2cDCHRoGT+iVO0YA0XlCCxQcohAbEUQ3fSE+1wS7JsXDgojk1+xdTCTxTZi3/PXrg4NrvXVRQQTSKJ3VEcS1jDL1ahfkUv/2CHo1ocAqYHjhT51X//F4D9kyJ/cfwLqeWvnMdfPH9R+WNkffrC+RNkrSFC6w3su+H1z5ZH7dAYn95ECMaykHb8viXfQgd7MPrCGYLM2744W6qfmBH6u2Ix+XrvS559rzh3EGknpvfH5x7k7VneneQnZj78D8zb8XaxkM7uPPgdZzFtyHTmE/HhkUL+wNxDM5NpgqUfJ+PSxFyAx6J/4Y+0QnfSC2ZPvP9dHvihD+YZ7IiltysgN4RgU+7Lw863bjecjKZ0ZHew70hldVIkKm19w7zp8K8eFhy7XzE9p7On+WLuDQergBhv4pOw7kQI0oZe8t+RHTRnlPW8/YlHW+89zbkHHE7O78UCjDzbrjz56R2iD6v2yyOfK0jKbzh3HHfPqxPRaU423xTOPcyOLU9P04a0XpzpyEdPMdo6i3IvjJnGL+S+zPSzUodnJjye3TfcnutMcpzFGHXy3AnBsmA0SIwLwmcp1eFQro3BY1RqBGpMEFenaziRu6LuYiD9+OoD4YyHkDLekWekAWNRLEP0VoAPklTvN7KEVwwnJyGmjzGytZCk4HRnR7t4EzZ6BEj3fmG0eOe2Fj4js/PDWcdDaOPOrTVDR/ydoaf6C6Z2+u5gSe8rRsuFYO6pljAcCbty7kHptwTxKO3mnjuyN3XGR4eTbxsrQqIN5k200zqchs3D8RQ/wxmcOnpnURAmtq9pQ6az75+YObz7/onc1p7BXATlNeFluRLOL8TFRHJqRGjjaBsZbvaKzKbGcN5HOvvLn2psay2Bem5kCBWSiN/4vjmQ3m9kTSRGAtw9Qt4SoYg0OLtpwiqeSDL3I0/ONEtDy6EfDMGnSBIrIflgM3awGONu3p8dyT6YEp2x9D7irE25c/ScyM5+2xfmjlNP7XBmp8a90R45tepBupNzOca14X94d1I/cXfkE1jAqtkBJ6GLOnl0AGmyeTs1Zoirszccb/0R2VL9BZF76SIbsx7GvdiQJC/O7vacyGgW0n7uSi18MeV4KB8SYwXd9ITcvoXG8ldklNrcmgXDk8VTCuauYPfTnJ3hRYr/Hdnf/sXvXeXUTuS7kvOQ877k7EhX7/2TizZ2zHCeD8fKH5Bdteynh8k2/YkZWM8YA7UGdnwwH4KA9SFf2NmE9Xxb+m7IPeUnsj39XZ2FcPLYynSWDSK264Z8XTmV4MWP+3PnOPtbv2LydW6hnJjRZxz1OTLMa5htBNmbTp7WDKSlOjJIX7UEOlr8xvSkDs4Q8Y1ffqvpinB6foOS3EPyzXlQLv8/eJfQj+1OrkUMD/Bmngrr6mJkmioXk9FHnqZk78iG3MNI316MNt65amx5Qu7IHFVaG7+QPenhja1mR/gN6SkPpusLU+ON2OwmyZ0QjP4rZzci1qGwLPtCJN4TkelkpPSTde8P0sUdmWo9+XqAy1LC2YH98ixc56YYzW0LTvK5oxpNvSuIR6MjAOOSWsMvR0bctUyVPyEFPiD3HJ4LmrMgyKvZwyxJOBOp4O1cTL6efdfecuavmPzV2dPaL/KQuY9HYDTEsnswRVhuJ00HjF1T/eKHHjndV6SGMZb5riMfzG9AO5wB7Pd/AchfMcWfDe38SdGyLckqaBGCIR+8KaE2wRLtGAm25IdXR33FY1Y5ECxZR5L8cARMPBBTUFcOsSvIDqblC/XN1TOqtrrIjupfaHv6iuQnMpfcLyiJsijrGS1LuPE3TM0SHbPDCh78B42CC2/fDUNSX2wT/IaGGdGgOMZj/uFRb+5lJ27Sh1AL/ulHj2TfZ+2Dq+eLaqr+Ay0xZPmCpOUXpKfSidRmRDkra9APiCacBmKyi2vzF3R0HBSHFfRLQXFsN7ctxYqWbbiVfyL/oDRcOlGtKscJ+Dci1ex7xQ7HX5Gx1GjRE1JWag+Ydl2K05Y47tYSLZEbH3Mo6YESJDaIHBIoJsF7HwGTbVycIC4cTYsw2YlVZAk3HvzDvbUTPTPHruC6Fm168OHSDcWxhDU8okS9lRf06mDugWmxIGeBBJZDSUP/7WlM/w0j4I/LxKHWOEhaKyNg+qxzUvgFLYnd2CICxAZl2ZZk2VaO/Y1SlJUnlxZ9R5osybYsybb67xW3x1dMvi6JUVEmiVnDHSLzT5w7hnnVLwxlJjt0Iln1RfLWiwmSIiRdPDgFjILw1MT5xtSQdaLez2WWjdITj4bbdOB2MK0PKF1XKCftH7QcQryib3xYIjJGZr1jam+eqdQeEAmzbFzmAssCyK0ckz2hVgetHlYsjmBfkNRukP2FmYq2SFU0qQe9vIRwI/DaIb4gOyRqJ4oTLtRBpZb0REnl6omcZND6QZmyiX5Arb5Ii6P4ysnLn9DKffYVk6/rG7MDTZK9qG+kpjkGDieVHaYv9PJFemynCV1KCH1EcdIK6IKhwxEPcmK0F488g3RDMBJFUk74n04REw/GmIA0MZLL7StK5p84v4iIGY8VCZgyMuik8Auy34bjwu3JbVBC+kY0CR2XflGSpXXfsTvRwHTY5HTYloqNKpVVNBou/IeLEx1ofQJxRJMJf0dxjMes7p80UbLmnEiCKY2vSKF1UHhy0CbPtkV7eTT8YM9oNqTpCS2xy/IguXA7PNI3RhsXZ9syIueflajRLUu48QOTv7i354ZocHG6kzyYhbaF4ZZqDbIXFTTR1H1BSfRYOZYDxEGRqefgJQR7lUX7zhX+6B0mYKkD7S0m4LuKbKy8AW6ZqI3Bg7taoiPD/oGUaVKfQX5DWeW6I0ynrrKNuTL8BR0df0WzJ/ULevmJlu2IIsq2LM4bpoTH2kfywck8G2Sbqr7Qy4MSBJeCbU+wFK6idKI40YBqCeUETOF/ujhtpAvERDYGwZQDYqqeBM+zRMDQnfQLLcmyLcmyrRz7C7X8RDUb9ZOH257aDdHKF5OfznzzRUl2+hYlOC6OJUyUFUwwwdLGA70cTHOZpWDgFelIHd8xHSi0uCdIi7//C8D586D4E2G9fzGMxl8Lqz1htMOZSvvpBz+RRuy262xO4dvPQRJqGEnH/4VtzZ9Ck4AYI/mraAX+IBtk1RQ+vO+56EzFphs9BL9z9qKxpNP53VpndyrDyRCbB+mkzMhFZ0c1kHKM+t7ZmRSWkzJJDKdINjwxPIjIlrB2NUG/IZXyxeTreSvjU4gW8oMR8Dw816XnT2zxORw7/sLUTmdN8zyRN0D7g4F9O3g8J20XujK/RUTYTH9xhkZJpKPWMBNNGz48dD2rWUEt78PJhqfhhacHn2o3lD1y1rTjFSnEcimN/U3g/Y3AfFXz3EAPEtc0fjA1Zv+b7ewxw87O3ZCe8iDV5KR9xzdSPlZ9Y8Z4ZDrwfkmRgH34ZIlZnokLkmIRZz0Eu/MIeO8jYDyVfWhpLGe6v+0i1enZl6S1WnmmSLDR7xyZLYnoWU46u6X/3Tgbw/HWi23m7kUgy3LPFSOfvOQI7YRcMfmLRz4XQTCGeXjjYLQ3/5mlke/o4IHpOT176QH4euLHqhKwikUCNuuisnP4Tofj+cH6G3LPHRlNndnRw/FyApZ97z73TGSOXclnF9kPz8LoYN8Cspw2hmsNSC/YSiYZTEv4x9mMfuVQuhPTfU2rpTXJFZOfToLl95tZyPlY8s5+4TRSWZ3sv1i7u5tu8MPJyhfJc0V/40oJfF30GSWGF/r0ZFvOaOji8YsNMoWefByCJd9Kr4KDVUDsdkfuiTOIUa01vHD2UckSunhbOID2zFMb7z1JpzErwnjaRUh6NAavnu7wvzC1ePYEb36IL9jd1E7McDhP5PtifXSk9BTpOTApOdC2TpXzGx2YIotKi8mok6eU7BuPjrQ0J2C9445MI+T/1vo8AkZfxL6mOV2Qxl/kErp5wtabEbDRGSGPHR0n5jIKuR/oXe2uTlcWJH/DDiXg6QF4TmLXbIA/FldP7XCk64LIX1LotaV5+uoEjA+J0QrB8o75xnxThANboe8JK3d9skyFFBGK/DZPmLtOPT2HZy75DXN3hEHKuaYkOw6nAz0spSvyLVSqZpg89w/fqbbTF8TbRqkIZyTthQkpRqKIJRu9ZIoVwq9OqfoVk6+nNekrUsD6H+9Ekjw0nt2L840sK+eFiyg1pv4D8ptsV/vZUeUV9x6ae38x2nhWMZpX3j+BwujdTp3BaM2ihT8hTe1ZTBtpdgG94wfpaT3IbC3CyUlGJJKndl2CGsoXDfwVGW/5xE1uO9HKF5OTPj9+rgARAAAQAElEQVSebakB5zOSxw89OT50Yt462ddviBglu16RntafMPdEpyHP7j3w7Dp5aqe3A/YXpsZiLDtY9/5TbMPn/9boRhueV8wSVJa+8LTgsfYlWd8J2FH5Qu5iMRYdxyC1hvD03HDXRSPtj3EiInbO3ot0pXh1pO35fmt5WrelKQG7rKcrAm/E0L84u/tbnpiWDFyQ2lyxOiRZnLTV5HUuKVadHeXo7QV5Af+9q4Ko0UpTeeLsQc7KtN2xCtIdd2L11Ma5ik3kWHtuOCViSyem53A2xtqA9vu/AMxfBi9umz34idDUkXRg8jcXJzUg7UooJ2Dl0R7c1cQxLhg4FgKXEpD+QGuefkXTb3RLsmxLsmwrx7ZMYidqcukf6KkzY0m2ZUm21X9XTB5Pxdtzw2gS5ZhoFeXyX6xC/Ype/oAWx8pO6UAyq6d68nWbBNMbimJqr5i19ATSU5xwqMM01e6SBLb+hGitP6FEiclY6hJcPUu/uGWqJhrUohfF0OQbD37iTEDVDsP/8nSlDo5Zx6zMLMHromDlWA4Qf3AE0TodPxwhtg12CK2LdvjHyfTHMv37dANti9kPu++khm5ZMZEr6StKU1dP2pIMWj+YotBPNJkfFUSMmnVB8vLF5Kdbuc9e1GI5efkVsyP8gulRzuqkxmM/yN7qj2jZFgE7UILEBsWhh6oiDmoOBJs8saQBdsXkLx5ZBExvmBrOM9qStnh5E3Gsg9tevqgrChb+hBLFmHLaRcAUcdBJZQ+SYOThTy5NXXpHSZZe3KtbObbhOKhkIEy2JVkDi1o0FRyqqV+4ONQwieAJRH84rAQ0fuRBK2eiUmtKwJTzhNFOJ8GUh51IArdB4Ys2eXcO2ovR8GHKhHIeOTPVb4hSvph8PctsC8OdtaA+Lk0uvaBlCTd+YPJ1Fm9GnczbAzYDMdGmnODhomAnSPaintCoTtNg48HFMQpAdODiWVu6hQ+/CEmPQvAvz7LUbxiCZw9w2NCJOt9mMnEW2dXsFSXbBOxESZHwH0SYNiuYxiCsvKhrbAfKCzo6/opW9xMw8g+XM2fZ4yQii3hBSamLc2BSPOYE/IOTWUaV7CdEq27qUoOlRxQnNUCPiIgpxQOVU0ISHHd6ULRYbnEItYapTqqQfaoGfUctL1r6wSqog+IY5kUApo9TwC7ck3O5JdmWJdmWJdn+8kNblKYuTnoHZDAhePhIYaJ0RS8H2dHqieJEB9JlkBqWRMVqpb9cFDE9YgrfLk40IDOBK15KTRtoAjGJB2FfSAXRfkCJEXTpHTVnuqTg4WGTu7q4I5ndCP1GJlLzE6JJzFxcGi4t+kQZjeD1g91RnHQA6fMVJZ6inBvSU15MEH2LCuKLXqQDs3o6THYg6avtSNa055i5IU3li8lxO5ypRRu+FNDSX0wR3279YhSjW2KJ5QuSwpETQ9R8Wv7IPTU9IVr1xeSn54roV0yunt5NFgT0i5ZiKZxo2Ub3L4pDzQBFDerEcn2Op4JgPPaF7FJ6XlFSahk7URI8VDnkhSIBEw1Tt35QlnDjvziKOK1b7UogLbmjlf32YAgpsFxB/BWzMvUrJn9xllvKNuXYJpdsK8e2+g9UMksix55RHHowiYB9YRVKd2yTtHpq470HNZbqM0qjS8UZ3RyCKYvA/3f/6yl/weyfGL8QrX1F8cfD1K9YiYDR078wLtKJSG9EtOH86XH5FJdftbP3mE0nfWMh6QbZiJY/xTLywmmg+PmGC2dL9ROzgp1cOzo8+eHZk/yG9JcvJv/Pzv72XjH5et9FfkPuKV9Mfnh2JQc7BbYLHN7H5+eCUuGnoH15JIRY+k9MXwl9X7jDdGQYNnUIVjUX4rHUgviR5h4oi5klCV/v70/+f8KumOWdKydgrErMVR9EzCsPT7H56t88O++ez2QiV2amGO3wrxpf2fm/MLX4sa85+95w7+SjeO7nPtqXR5um3I2IvfBZklEuZO6JozFNTMtmvDVC92e6nPngi7c3463vLvihD2YHm+nBkvB2gDs+nKHyRXK2EeE0sQGaGE6aStMG9lFLmt4iPWf+XQu/eHc98EPnqfkO1s494akdmHuS/4WpPTgLsc/dkFge/0F2h+T+QbJaw76EEbIxdBK2Mknk3la/MLtGTxszWLRpg2Dh49PzXSvnrvaA+Z1mZ4eRF6lVDyLxqlBYyQX3HoBhdBIuwehnivbqCLkr/s2j3bwrmH3FrXHbrF+eO84ZtPLF5PHMBG+ep6bviskP/9QYx5aTjfGK7CuhFsSTsYHPpR5Oz3AeWX5BaljK089IfhPaTk5yqbcBfsfOzBDLeUGXJqWvsEgeK6PnF1GqL5Ln/u4nf8Jo8bk+d+d5zHMRIxkfp6H8ETOHp3Y4zVVece6hzH46uXLy6PFDu2Ly9dzDACzNYbOHjISYyng5+2lMmi9bRKkeJImxkwbqJf9nZCDLuJ8tuysa29DRYl9kaCLOTF49M1+cWvVHZH31K3LZrIiY0Q/ywvx3z11BCtTLPpiew7Mn+V+Y2unsan7F5P/Rexe9J/JCvo+V+z74fB6R/FKLcP0mqp0hYGxILw7BDs4UGkY79yJTjA2nzFMwCrUG1EEm2kfA0OgkmXryWYyUTuoYZA2C9TKwby/O+Iwyh5aeD0eAtJ87/sZcxY6uzNw331r2pecJo/1nZ397F392cl+fccH05DuCmU3+gGzkZ8jc+HBietmp//2PepdckEKMHtaih8xMeQP7/kJq6WCKefbDY0+8DVwRzJXB9kIwRtiUBO9/t38h17XvFdlHjcW9JvfN9atnP5XsqBL+p7Op9SdE6y7w6Dn4DXMT3h4wtcOjJT+RXeUXTK0fgbZ53k8bn8c+aleOiFWk5V/Ij5WdAEOxZBdkPgo9A3BsGnI3JLX/4McbO9sxAkszClTmC38xxfkSytxJnqZkj5iF+HFfEEor98VuzpbyKyZf567O/4WpHZ5dyW/YZ6MGs/cbo/3b+QDs0wfpzl9kf36zfcOkEJJ8S6p/Ij9W6xfMHXEkxtmFhfcBzUcm1hLam4Ym8+7RZ6B3UKeSlzXLznJmBjuRsHXSGU9rCa1fyCRi9y8mj9PIHPVsS+0H24G6yF3YcrTOfCP7qi8mf/WdZWneQ9u85+D5JZKDuZSN1JkZQqxSrJoFYa/IImpYku5KKCdgWRNpcS9PIWmxCfX/6f/Z/BlQlm0WGgT0hdQwiYCBmCXh2BeiYIfoNCnHBMNcFNm4ONGAaE0JmE4uJVVOdZITSTDlYV8YSUJsYtlWjv2FWn5iurTsC5lt9w1RyheTr2eJbWH4A0rouPSCzEhKtLTod/T2gM1Ap9viWHmHLL1jiqkvKmiiIz6gOEYHiA6ABXD4sMZDOHGTPoiO4F9Oi1K/YYhOWV8rtWdkb3mRXZMlWjr4iUiKfkFqlZAPrBQuqblUJBYt/rks2TiNnuwSj55FB/G/MDVcHNvCcEsxiG3Zhlv5J/IPSsOlEyVZc/6J7Grnop0JfNHe/ES6m18x+TpwvzzzK5LqUiwtT2YyS8TDndxhDbADJUhsEDkkz/qgVa5FCCaVoy3+8ipUr5j8xVlqSbZlSbZlSbZlSbZfnYIsybYszolavihdeDvhf6G3DrIz04WoFoeA6eDJ19u3OWUpIfwvTO3VxemCwe/0h7ubxEPMRDFJ+Ikk5SA99j+Qnth0ScHDwyb36OyyJNuyJNvqvxNXM5hKMLUbUisHJVEWVIM+UaZGADYOn/irVo+c7htSKV8kz120yQ6JfkcKiLHouPD0ivONqSHrRL2f79ny2e3Mh6/bViQt2nAJCsZOrp6l1EsXLZf6AS0xZH3+kWJwUyIbs2gTUUVTe3NZ7dEVycsXk+Oi0ZLcf5KUTGVWjkVLkj/QUmwb7RLZLygONaqiSQcqB4IlO/2bayakA9nV/BUlpZZFX2gjYloPFeeO1vALyukiPqFWX6QFC0GXEsKzM1hOUl60Jl9U8OIHP5GVDFiSbVn6zy6O7ekHobIN+I5otoUYu6M4KQF6Q2reYhGucIloifjqKad+QymScqL/5WlM/YYRLNts+LhluIjfqJ6qBOzCTT+UXQb0hGjVL2gbyZkoJrMtowB3jHa6p0Z0NZMJX2Q4md0o+4PtMjEaSEadSI5EgpELP3kJ+l9Izfh0WSI3PijOMKF1rzjGsW+uCKn9iTS0DrKjMw9obz01/M6k4b4jMxbnhijli+QZssMl+4IS/OPibLm6ZA2/oCQYfuCwRh/a4sFvSK18MTmehbaF4aYYM/mgfKBJDTEoziKDhgn1jlHUQ8sXTqe2YMOx4QYswsWl4VJRnMwAHx6CM0r8skP8xSrdRQZa1tgXUqt+ojRc+kGEtKXwQfZVX0y+Lo6bq9HSHREwZdczemo0YOThf7g0PeIw4IJlUMubJuDVbziKZVTJDvoPlCjGbihLYjagBukZKWItHtjGkCcXJzqQvu/0iUfDeY5EwD4oy7Yky7Yky7Yky7ZyLAeI31gZXacnSdfhYkfzGxoZFx795uwqX5QElSW9oqTUxTGZF4Eyb1QwS24oDh0GqoPkbUtKjqxy8h9URBoXXTQCTvPD/wKQGn+BjPEnwv1LYv5iiN6/HgYvTjq9JLQRMwZAsCXDicNTODxi8hf8o5SJPjA959sgWPRIva8Jf2ktonzjfgAds7KRvkf8dOWa3pM+dn44PeUoseRvyCzlvuAbI7IpgLMgvWQA8cr/6Gob9RvybeWL5LmbpXxOCDdEaNoQgWZgmkii42RbIHvjlA47Wk6+Qu6L9oTRDn/sicgrdlWeGCUjwcOnzG9R4QnpYKiVE9mbhSkdSG3TFPnNgNTxrN5ydSrF7Bw9WdUE1oSPR8iKgx28OxPw7AC68xnZEEvjiWwsB7lxhlsM4xryXbZZ2H/0Y2Ix92SyiPaDFKNR6juK0daBeRRJasCdf8TJEsfzdXwME1ceJXyRFAuZtRDsziPgeWYKRQLW3f3/0sN0cOq5GZ+GVPBWFpP/Oss+PwH3DZ9kdjPTnbubbdXRTpwhKiTRgZBuIWBRIrGsVn4ENm967Uy+zs5OhWbLE0Z782xP7UQIdtuZva9+DpJ0EBwra4CD2G3tcL4wCd+BUQ9HgPQ3zCg5wH8LdJIfHS02VVZAksdJ9+XshSRGP5HdzcFMBobTzGQ5AaNMZYZ5C3VyDL3W8MurZBMDaQlnD8rBgi2ipXrjI1ylo3WRBqwPekJ2tnYiY/2YC6YG/VxS8hJySUqLl11VysnAfGVXkwdv/93aQmBVysA8k+TOuyVqVrxgesbT1IzVwW+e3ZRud1WrmF+AKXJiCOMldyyL3q6XNyG3L9hVTXLXJI28gz1Jt9DfKFL4iSTl4KWX4TCWH/rQv+P28rbp++K5J7UT00UPxkW13gv/vJWechDr6In8RtQyODqcWvmJaYgevFfSMmp0GAQ7nlDxyvOm3HMi3/Lhc0dr6Fkys9GzezEpHkv9T8xyGrITYOVMrA3jgAAAEABJREFUDGdf61ekK1rawECegtpvecSKhNfmFF48ci644bFrMbU4NK03D2mNgPWRvDt4fGPyOF+ZDUy08YKV4Q9IK5bxqbN7+G4Lx/lhMSrkuffwbGxO8sGuo38xNTzGht4THD7Z3kYtPGyR+7Iluwd3KuV0B/Ft653IH5z2xIxTSnPoYG5qgcozbm+gPU0+gTUlr0gB64NOJMmD4xl+wfnmNIwzNcnGg99xvijfUp3dVX5wO2jqPQeym9Z5Lhp0cpLowI1nd9rueGVzT3qaNaF+QyrlT0ghlsuD+W/wg+yrHuwLE7qMVvKJCOT/sLN1k9ybkSsmP51i80WgP9ANQ/BdSXaxQ/zFURLH+3Wk/0R69ufoJ+d5Jycp/wtTW89Dc9+sTJaV3xhtnUbs8hNs71yKTjUWfiI95WAv/AfSwyhx7kzy4Z+sevYm4XsGUserB6N+YWpIPDbFp0suOo1Ymw5stYQseHWk4y3BlFZq2oAAYl2btvhwfpskvBFr4wdb4NlXzIrwJ2QcS/VwaK46nWWTc0l7Ltje8PX20pT/9wSJC3lrm0j/QmqMEdM32U5yd3jYHdMZ7z10xT6cVWkHqid/8zSk9oiP/wtA/jJ4+SshfySUEioTMP3l4qSepjdM7dWZb01EFmDKATEhxi5o5XkJ72j6TYslWbYlWbaVY38hYpQ4qYIf9/JFZk2T7dGL5FdMbsk2/oXSaNIPymgExhJFwBClL/TyB7Q4VnZIB5JZPdXJPxhCKULThghiXEpI7URx6CEqmnK+ebT1owRt2l0hnukHblvC7WDSC0qU4NIF1ZP2JFOVBv2IUeNiKGg3dqiZkzplfFGLpvbmR88DImE+nS3kE60cl4to5Vg8K8kfaCmWxhMt2+g+kWS4OKkB0bwYCC/+GTpBx+Jll4RWfkVJ0SolSN88ZaWEi1N+ojX8gnKqxCfU6ou0OIqvnLx8MfnpVu6zFxXEXzE7Ur9geiXi3cX5/5Sc27brOo5DgfP//9w9AcqO7NhZu7RIggAvUrKr+yGjRrF2dEMwexJ7R8t2qoPkNhzHhBgbFAeRqkTAvlGf4zSVulHlyZezq9qJ4lDDlN7gP3pXHDPgh88CeyG17HZxMnE+HIIZT8tvtGbtjsnHU7Qnt0F22neULAlZRekBvbQbMhTFtkSH7UTZlmQF7MEQ0shJB8Wxvrk40dVA3LAMvqHI41GD6rF6X3In4F+IgLXxCYXYJd9oo7FS6ZFkH1w9B7ui5VUtMvONKNUXkgu3w0VqfFCcJVeDFk0yuuXkxHd0q40MXVFT847kcHFo1+FCsy0Mt1RrIN3RiwfF+QtFv3qye5JG2T6Sog3HKEgnklQPSmouFcUJBz48BKedeLNDtNzKRMGascvkOnFVvCE1hZ8oDZe+ECFtKezoXU9+ejthL+jo+Ctaucd+QjThqYEqZheaOIsf+okp4TEn4CcyA6V1FHtHL31HutPjwaQ0SYsrJ/krPhWjvXjkLAe9UAtPbmlJgwcvWscbiwq39IqtKMf0HGiSOFA1eTwkmN2DjiR7w+Svrun1Qmm4tCG5OOkZECmZwMlMJs5goodxr6jZBxfHKtVCS+VPKA66ljuJ0Ra6aAT8WBLtdErNnxCNMaKeWlrKziQgRp9l+4OybEuybCvHvmFEfMmaql7Q1RMtDkNGsRulhfZwAIncKZk8uLk0mvSCzEhKtLTQxSuzFDXwhVSqPyGFWB+aesiG7BI1yxGJgxDMcHGMxw5M/uJHCzvb8YTRXp2p1iR7LTvgES0rxz/QNJi6JXZa3pC0fMMpi9aIxeTjXnyhnhCtejAr/sL0LPcHxbHNJsm2cmwwdkFPHY1MEMyD4lTfUaLaUJTKxfGWQWU7gC8sJz+RksI3TA1JJ1IrB2PJwZQlCBY8uXKsg5MhJBqUzJ84RQvWsKEEiQ1SDgmIpRi6k55oh1uSZePCQXFs8h1TCz9RZC9+n924ODa7l6soIJpEEruiOJawhm+sQn1HL/7BDke1OARMDxwp8runIbO8PWkbw0PQHv4bgPxcyM+O+ZXz+MXzG5UfI+vTF565SIPJ8qPjIFoIe8uTH37X0poamN9Fk7K9Y0ggahLmsBdOA8V5W/o3zsLqJ2YFdS4ZHZ58eT978ux7xbmDSDsxvV/O3mo37E60EzMf/gPzdrxd2Uk+b89MPsuOs5g22qOHNyVgKTDS+SdkNx+K2OKJTGLsYx1J4yMy1uKJK+HeZmD2x+cNqEs7+BW5pfWFLG/9ghAsbXTxZgiRzSSfNzejKZgdwb4jvUsnRaLCcHsekVuqB2+9LOjcL0ztdHY0X5i94WAVEONNfBSsuxGCtKGX/Duyg+aMsp63P/Foy3tPc+4Bh5PzfbEAI8+2nSc/vUP0YdW+eeRzBUn5BeeO4+55dSI6zcnmM4VzD7Nji6enaUNaN2c68tFTjLacRbkXxkzjDbkvM/1YqcMzEx7P7guunn0mOc5ijDp57oRgWTAaJMYF4bOU6nAo18bgMSo1AjUmiEunaziRu6KuxUD68aUPhDMeQsp4R56RBoxFsQzRWwE+SFK9n5ElvGI4OQkxfYyRLQtJCk53drSLN2GjR4B07w2jxTu3auEzMjs/nHU8hDbuXLVm6IjfM/RUf8HUTl87WNL7itFyIZh7qiUMR8J2zj0o/SxBPEq7ueeK7E2d8dHh5KuNFSHRBvMm2mkdTsPKw/EUP8MZnDp6Z1EQJravaUOms+9PzBzefX8it7VnMBdBeU14Wa6E8w1xMZGcGhHaONqKDDd7RWZTYzjvI5395U81trWWQD03MoQKScQvfL05kN47siYSIwHuHiFviVBEGpzdNGEVTySZ+5EnZ5qloeXQD4bgUySJlZB8sBk7WIxxN+/PjmQfTInOWHofcdam3Dl6TmRnP9sNc8epp3Y4s1Pj3miPnFr1IN3JuRzj2vAf3p3UT1w78hFYwKrZASehizp5dABpsnk7NWaIS2dvON76I7Kl+gsi99KFbMx6GPdiQ5K8OLvbcyKjWUj7uSu18IUpx0P5IDFW0E1PyOWz0Fj+ioxSm1uzYHiyeErB3BXsfpqzM7xI8d+R/e1feN9VTu1EPldyHnLel5wd6eq9P3mG2THDeX7Ggs/Irlr2M8MkfYkhL5iB5RljoNbA2AfnLdNKAetDFnY2YXk+W+oXZLj8RLanv6uzCE4eWzKdZYOI7bogn6ucSnDz4/7cOc7+1ndMvpxbKCdm9BlHfY4M8xpmG0H2ppOnNQNpqY4M0lctgY4W75ie1MEZIr7x7buargin5zsoyT0kd86Dcvn/4F1CP7Z2ci1ieIA381RYVxcj01S5mIw+8jQle0c25B5G+vZitPHOVWPLE3JH5qjS2nhD9qSHN7aaHeEXpKc8mK4bpsYbsdlNkjshGP07Zzci1qGwLLshEu+JyHQyUvrJuvcL6eKOTLWefHmAy1LC2YF98yxczk0xmtsWnORzRzWaelcQj0ZHAMYltYZvjoy41jJV/oQU+AC55/Bc0JwFQV7NHmZJwplIBW/nwuTLs2/vLWd+x+Svzp7WvpGHzH08AqMhlt2DKcJyO2k6YOya6o0feuR070gNYyzzXUc+mO+AdjgDtYTNU5zh9mz/G4As4FdBfhSUCNiGTQm1CfkVEbc8fKEXVrQ4CT88pczQqWC5lFQ5XxwBEw/EFNTOIXYF2cG03FB3rp5RtaoL2VH9hranr0h+InPJ/YKSKIuyntGyhBt/w9Qs0TE7rODBv9AouPD2XTAk9YVtgl/QMCMaFMd4zF886sW92Ikr6UOoBX/60SPZ11n74Oq5UU3VP9ASQ5Y3JC3fkJ5KJ1KbEeUsWYN+QDThNBCTba6Vv6Cj46A4rKBfCopju7ltKVa0bMOt/In8g9Jw6US1qhwn4HdEqtnXih2OvyJjqdGiJ6Ss1B4w7dqK05Y47tYSLZEbH3Mo6YESJDaIHBIoJsF7HwGTbVycIC4cTQthshOryBJuPPjDvWonemaOXcHlWmjTgw+XLiiOJazhESXqrbyglw7mHpgWFuQskMByKGno357G9F8wAv64TBxqjYOktTICps86J4VvaEnsxhYiQGxQlm1Jlm3l2HeUoix5cmmhr0iTJdmWJdlW/15x9XjH5MslMSrKJDFruENk/sS5YpiXesNQZrJDJ5JVX0jeejFBUoSkCw9OAaMgPDVx7pgask7U+9lm2Sg98Wi4TQduB9P6gNK+Qjlp/6DlEOKOvvBhicgYmfWOqb15plJ7QCTMsnGZC5yIDyKQixMOwBzAT1wJK1AlewR7Q1K7Yerk9uLiJAcoClW6c63T4spPOMQX7C5qJ2YwXDJ/MaVm+ImSytUTOcmg9YUyZRP9gFr6QlocxTsnL39CK/fZOyZfrjtmB5oke6HuSE1zDBxOKjtMN/TiC+mxnSZ0KSH0EcVJK6ANQ4cjHuTEaC8eeQbphmAkiqSc8J9OERMPxpiANDGSy+0dJfMnzjciYsZjRQKmjAw6KXxD9ttwXLg9uQ1KSHdEk9Bx6RslWVruK3YnGpgOm5wO21KxUaWyikbDhX9xcaIDrU8gjmgy4e8ojvGY1f2TJkrWnBNJMKXxFSm0DgpPDtrk2bbQXjwafrBnNBvS9ISW2GV5kFy4HR7pjtHGxVltGZHzZyVqdMsSbvzA5C/u1XNBNLg43UkezELbwnBLtQbZCxU00dS9oSR6rBzLAeKgyNRz8BKCvZSF9pUr/NE7TMBSB9pbTMDXKrKx8ga4ZaJWDB7c1RIdGfYHUqZJfQb5BWWV64ownbrKVsyV4S/o6Pgrmj2pb+jFT7RsRxRRtmVx3jAlPNY+kg9O5tkg21R1Qy8elCC4FGx7gqVwFaUTxYkGVEsoJ2AK/+nitJEuEBPZGARTDoipehI8zxIBQ3fSG1qSZVuSZVs59g21+IlqNuonD7c9tQuilS9MfjrzzRdKstO3UILj4ljCRFnBBBMsrXigFwfTXGYpGHhFOlLH15gOFFrcE6SFwy2VL0weZ/j8bwDmh0F+Eqw18KPhickPF+fIg9CZJSknYOdsixHenLn2LEzbSgN76c7bml8zk4AYLflVtAI/yAZ5yRQ+fC3tr6WdIGDTTT957MrZW3Ews62zO8pwMsTmQe6h3HtPZEdzkHKM+rqzMyksTspGYjhFsuGJ4UFEtoS1qwn6BamUL0y+PG9lfArRQr4wAp6H57r0/MQWn8Ox4xemdjprmueJvAHaLwzs28HjOWnb6JL5LiLCZvrGGRolkY5aw0w0bfjw0OVZzQpqeR9ONjwNLzw9+FS7oeyRs6Ydr0ghlktp7HcC73cE5lM1zw30IHFN4wdTY/bfbM0eM+zs3AXpKQ9STU7ad9yR8rHqjhnjkenA+0mKBOzDJ0vM8kxsSIpFnPUQ7Moj4L2PgPFU9qGlsZzpfrcLqU7Peklaq5VnigQb/cqR2ZKInuWks/vO2Zg6/n84F8bS9EFmsyz37Bj55CVHaCdkx1TYf0gAABAASURBVOQvHvlcBMEY5g2Ng9He/GuWxnyW6uTBi2dv9KwejBIvI2ChnUooJ2AM8Z2lyh0nJ88XNt8x9XAGh2eknbQciMaOtgV/OvtaP2bD8Q4PEtdusrRRw2aqnPsOROVpMcRaQ8oR2ZAO0ioLk49PffIMJgt2iO5Y8ylcSqee2ukkGB9g9UL6+AOZKt/w6xJq/2Bs5I7GYrPuJgP72YJ4rui/X0sJGQG5J2WgT37EiPjqziq826smO5wCFsb+ZAyFzR1k5dRAhntnanHaMQq1hhfOHioZpos14QDaM09tvPckncasCLs9COloDO5O6RyK/sSjxdcdST9+iC/YndROzGQ4T+TzxXp/pPQU6TkwKTnQtk6V8x0dmCKLSovJqJOnlOyOR0damhOw3nFFphHyn7U+j4DRF7GvaU4XpPEbuYRunrDqzQjY6IyQx46OE3MZhdwP9K52V6crC5K/YYcS8PQAPCexa1aAPxaXntrhSPuCyDcpdG9pnr46AeODxGiFYHnHfMZ8pggHtkLfE1bu+mSZCikiFPlunjB3nXp6Ds9c8gvm7giDlHNNSXYcTgd6WEo78lmoVM0wee4fvqbaTl8QbxulIpyRtBcmpBiJIpZs9JIpVgjfnVL1HZMvT2vSV6SA9R/vRJI8NJ7dC+czsqycFy5EqTH1D8h3srraz44qr7juobn3F6ONZxWjeeX1I1AYvdupMxitWbTwJ6SpPQvTRppdQO/4QnpaDzJbi3BykhGJ5KntS1BD+UQDvyLjLZ+4kstOtPKFyUmfH8+21IDzGcnjh54cHzoxb53s9h0iRsmuV6Sn9SfMPdFpyLN7Dzy7Tp7a6e2A/cLUWIxlB+vev4rV8PnPGt1ow/OKWYLK0heeFjzWviTL1wTsqNyQu1iMRccxSK0hPD0XXOuikfbLOBERO2evRbpS3B1p9dzfWp7W1dKUgG3r6YrAGzH0G2d3v8sT05KBDanNFUuHJIuTtpq8ziXFqrOjHL29IC/g37sqiBqtNJUnzh7krEzbFasgXXFNLD21ca5iEznWngtOidjSiek5nI2xNkQLuWO0OJed/w1A8WugxC+E2BdGe3NxUgMyroRyAlYe7cFdTRzjgoFjIXApAekHWvP0HU2/0S3Jsi3Jsq0c2zKJnajJpT/QU2fGkmzLkmyrfzsmj6fi1XPBaBLlmGgV5ZOHfHgzOaJEtNT4gpFTvyAT5QuTL7dJML2hKKb2iuLQQ1R69DmHeijl3YUCHvwLqQm3qeD2hh0NFy2gBKonbUmuaBnRRINa6IWiefIVD37iTEDVDsN/ebpSB8esY1ZmluDlomDlWA4Qv3AE0TodXxwhthrsEFoX2uEfJ9OPZfr7dANtC7Mfdt1JDd2yYiJX0leUpq6etCUZtL4wRaGfaDI/KogYNWtD8vKFyU+3cp+9UAvLyct3zI7wDdOjnKWTGo99IXurP6JlWwTsQAkSGxSHHqqKOKg5EGzyxJIG2I7JXzyyCJjeMDWcZ7QlbfHyJuJYB7e9+ELtKFj4E0oUY8ppFwFTxEEnlT1IgpGHP7k0dekdJVl6cS/dyrENx0ElA2GyLckaWKiFpoJDNfWNi0MNkwieQPSHw0pA40cetHImKrWmBEw5TxjtdBJMediJJHAbFL7QJu/OQXthNHyYMqGcR85M9QuilC9MvjzLbAvDnbWgPi5NLr2gZQk3fmDy5SxeGXUyrx6wGYiJNuUEDxcFO0GyF+oJjeo0DTYeXByjAEQHNs/a0lX48E1IehSCvzzLUr9gCJ49wGFDJ+p8m8nEWciuZq8o2SZgJ0qKhH8hwrRZwTQGYeVF7bEdKC/o6PgrWt1PwMg/XM6cZY+TiCzihpJSF+fApHjMCfgHJ7OMKtlPiFbd1KUGS48oTmqAHhERU4oHKqeEJDju9KBoYbnFIdQapjqpQtZTNegravGipS+sgjoojmFeCMD0cQrYxj05l1uSbVmSbVmS7Zsf2kJp6uKkd0AGE4KHjxQmSjt6cZAdrZ4oTnQgXQapYUlUrFb6zUUR0yOmcHdxogGZCey4lZo20ARiEg/CbkgF0X5AiRF06R01Z7qk4OFhk7u6uCOZ3Qi9IxOp+QnRJGY2l4ZLC32ijEbw8oNdUZx0AOnzjhJPUc4F6SkvJoi+hQriC72QDszq6TDZgaSvtkaypj3HzAVpKl+YHLfDmVpowxcFtOg3poivbn1jFKNbYonlDUnhyIkhaj4tP3JPTU+IVn1h8tNzRfQdk6und5MFAX2jpVgKJ1q20f2N4lAzQFGDuqI+x1OR3pBdrb2ipNQsfVASPLJyyAtFAiYapm59oSzhxr9xFHFat9qVQFpyRSv77cEQUmBxBfFXzMrUd0z+4iy3lG3KsU0u2VaObfUPVDJLIseeURx6MImA3bAKpSu2SVp6auO9BzWW6jNKo0vFGV05BFMWBUXAWjwxiWVb898A5JfA/spaFD8e8ktnfjU8eSUChpYfD/vTKD10IjITkdpwCotPcfFdO3uP2XTSNxaSbpCNaLmPkRdOA8XPZ9g4W6qfmBXs5NrR4ckPz57kF6S/fGHyf3b2t3fH5Mv7LvILck/5wuSHZ1dysFNgu8DhfXy+LigVvgraF4+EEEv/iekroe+Ga5iODMOmDsGq5kI8lloQP9LcA2UxsyThy/v9k/9P2BWzvHPlBIxVibnqg4h55eEpNl/6nWfn1fMxmciVmSlGO/xW41N2/hemFj/2NWffG647+VA893Mf7YtHm6bcjYi98FmSUS5k7omjMU1My8p4a4Tuz3Q588EXb2/GW1+74Ic+mB1spgdLwtsB7vhwhsoXkrONCKeJDdDEcNJUmjawj1rS9BbpOfN7LXzz7nrgh85T8zlYO/eEp3Zg7kn+C1N7cBZin7shsTz+g+wOyf2DZLWG9RJGyMbQSdjKJJF7W71hdo2eNmawaNMGwcLHp+deK+eu9oD5nmZnh5EXUqseROJVobCSDdc9AMPoJFyC0c8U7dURclf8zqNdvCuYfcVV47ZZv3juOGfQyhcmj2cmePE8NX07Jj/8U2McW5xsjFdkXwm1IJ6MDXxc6uH0DOeR5RtSw1KefkbyndB2cpKt3gb4FTszQyznBV2alL7CQvJYGT3fiFJ9IXnu737yJ4wWn+tzd57HPBcxkvFxGsofMXN4aofTXOUV5x7K7KeTKyePHj+0HZMvzz0MwNIcNnvISIipjJezn8ak+WQLUaoHSWLspIF6yf+MDGQZ97Nl7YrGNnS02I0MTcSZyatn5sapVX9E1lffkctmRcSMfpAX5t89dwUpUC/7YHoOz57kvzC109nVfMfk/+i9i94TeSGfj5XrffD5eETyrRZh/0xUO0PA2JBeHIIdnCk0jHbuRaYYG06Zp2AUag2og0y0j4Ch0Uky9eSzGCmd1DHIMgjWy8C+vTjjM8ocWno+HAHSfu74jbmKHV2ZuTtftexLzxNG+2dnf3sXfu3kvj5jw/TkcwQzm/wB2cjXkLnx4cT0spNiLMKGFP5P8BfkLorE1NlL9sXRUmFxSnll0iJXF2lZmD1JmSDtwML2Evrv9a/YVVnAlcxAWblz7onIA6rSE8wdQZpbGY6S+k+fe2hhlN0dOZBatu3awS9IfznIImLY+MFP3HamY9sNvbzhjdOEdZCWv5Avq3cvpJ2M+UTeQq3ZwnxvLE0BmU8S/R/9Mss95dlCDqw7s7Psw0O5tG3cRUfvf0V6Mtz9DAVHCuloysvZEpkGDC1889xLAWVqTzza4dmV/ILrTj7H/hbWzk6S0bnlR04z9umBcFOX3pD7kCPSnYyUB5HlnlR/4npD95MHDw+dvMuy6vTWuCkW8cNzNy+p8IAdQA/Skyx3DHZTAlX2xHBIWtDpKt8x+Xia8lkPZwCJGguqfWE7UBeyG1scre+7I/uqL0z+6muWpb3/jtvXmkvZyHuZGUKsUqzKPb9xFrYtU9yXheUELOORFtKAVQDzxslLsoE+crLqG6b3P34EFD8FxjZsSqg1WByCZcUamhKUEzQlQ3aHoiYqmNIXSpGU0zrJiSSY8tAbRpIQm1i2lWPfUIufmC4tdkNm231BlPKFyZdniW1h+ANK6Lj0gsxISrS00O/o1QM2A51ui2PlHbL0jimmvlBBEx3xAcUxOkB0ACyAw4c1HsKJK+mD6Aj+clqU+gVDdMq6rdQ6I3uVF7JrskRLBz8RSdE3pFYJ+cBK4ZKaS0Vi0eLPZcnGafRkWzx6FjqI/8LUcHFsC8MtxSC2ZRtu5U/kH5SGSydKsub8iexq50I7E/hCe+Un0t18x+TLgevlmV8iqbZiaXkyk1kiHu7kDmuAHShBYoPIIXnWB61yLYRgUjnawm9eheqOyV+cpZZkW5ZkW5ZkW5Zk+9UpyJJsy+KcqMUXShtvJ/wXetVBdma6ENXiEDAdPPny9q2cspQQ/gtTe3VxumDwnn5xd5N4iJkoJgk/kaQcpMf+A+mJTZcUPDxsco/OLkuyLUuyrf6duDSDqQRTuyC1clASZUE16BNlagRgxeETv9XqkdN9QSrlC8lzF22yQ6JfkQJiLDouPL3i3DE1ZJ2o93OfLZ/dznz4ctuKpIU2XIKCsZOrZ1HqpQstl/oBLTFkff5IMbgpkY1ZtImooqm9uaz2aEfy8oXJcdFoSe6fOMlUZuVYtEjSDzRFbDXa4abfEb9RHHqoiqIOVA4ES3b6nWsmpAPZ1fwVJaWWRTe0ETEtDxXnitbwDeV0EZ9QS19ICxaCLiWEZ2ewnKS8aE2+UMHND34iKxmwJNuy9M8uju3pB6GyDfiKaLaFGLuiOCkBekNqXsUiXOES0RLx1VNO/YJSJOVE/+VpTP2CESzbbPi4ZbiId1RPVQK2cdMPZZcBPSFa9Q1tIzkTxWS2ZRTgitFO99SIrmYy4QsZTmY3yv5gu0yMBpJRJ5IjkWDkwk9egv4LqRmfLkvkxgfFGSa07hXHOHbnipDaT6ShdZAdnXlAe9VTw69MGu4rMmNxLohSvpA8Q3a4ZG8owT8uzipXl6zhG0qC4QcOa/ShLTz4BamVL0yOZ6FtYbgpxkw+KB9oUkMMirOQQcOEesUo6qHlhtOpVbDh2HADFmFzabhUFCczwIeH4IwSb3aI31ilu8hAyxq7IbXqJ0rDpS9ESFsKH2Rf9YXJl4vj5mq0dEUETNn1jJ4aDRh5+A+XpkccBlywDGrxpgl49QuOYhlVsoP+gRLF2AVlScwG1CA9I0WsxQPbGPLk4kQH0ndPn3g0nOdIBOyDsmxLsmxLsmxLsmwrx3KAeMfK6Do9SboOFzuaX9DIuPDoF2dX+UJJUFnSK0pKXRyTeSFQ5hUVzJILikOHgeogeduSkiOrnPwLFZHGhS4aAafZ4RenVD743/yiyC+EWH8hLFI8kDQ/GgauSAPGz4stXTGFw1NO/oI/Spn4vIlGbOd9ex7VhF9ai7zkjulhGR1E6o1v+OnKdbnvG+nhDmKX5Jd5B0QFAAAQAElEQVRUKK0oNF84d7X2gHkWEwGcwfSQAcSd/+hqG/UL8qzyheR5A0v7xiAJxViKc2P1hE9zCjg9xHQX0tPk0Esm3KXuovQLUzuc1r7tgiHcfuxemJGpTByZ76L0CelgqJUT2ZvPk9KB1FaaYp9TiZ6sbk4STEMwO09MbS2oTh5s76rNqlGR6EikYwq9M0p2XpGGWAonsqcczKbkC2m5LC3Pwn/2Y2JhdzNcRPvCVaPUD1GMthzI0wLPmIFU81kG+QAk4al9PAoF1kRLFzgWgk71iaOl2KeTFAlYB/p/v9Wn8cqzem5OnI5o386yz1eQRoTsAtBHGM6mXr6QvHowzV84d/HEWDoGWYmVH4GNKz0qwc3Z3W2RsuUJo715tqd2IgS77MzeVz8HSToIjpU1wEHssnY4nzAJnwOjHo4A6XeYUXLg9p2nlT4KE+HksfDDP5y9kMSpJWOG3cnmLjKKRO6imc9MmRwFnSTGEFYOThudJGhYxQ82o74j+1DSeKhMY9GB1gZzf7JNKv1wNmB92BOmsUsoFhm/Y3qQ857Cz8Ce1hduu6qUk4H9NKTH2+Y75hZqufLDu7BtyVL+YLdAf2Fq491LyI4opBgZ7yD2DtIiS4vtrcjb0k2eXlKs5Ipl0dvFmr8we2nDchdwCsd30IdQKGd1+YkkGYzT09ojRvzL2dWWF+wd1E5Mc/iGqUVayNfRzxPaLmof5Lsp3zBFhioXk1EnTynZFcN6RUO7CdgXz/eXd5zIzg/PZhyByGwjX+cgCd3bXaS94xeyizKj05l7P5y9re9INVrawcCflzJSe21O4cUj54ILsq18YfI4NK0XD2mNgPGlYUk+nwmBSXh6VwbA0jfV4Yk3TgtWcTB76Du/Gzg5XzBGB3m+48PprE5lw66DL6QpdYA3fbThU+GWUOrhYQu5LxO5bzBt1FNOdxBfbb0T+YPTnphxSmkOHWQThJxKG76QcrUdky/PaNJXpID1QSeS5MHxzsIfcD5zCuOrawjx4FecT5TPUp07qnzh6qCp9xyYvc2pg9DL0+88u9N2xZ2xh+8vPc2aUL8glfInpBDj/azBQugjGwtnX0mwL0yg6cbTM5X3yLoWc1+SJ4x2Ok3NFwL9wi4Ygh+7ST92iN84SuJ4Pw3pn0hPPmqe9YUI1X9hasvzztw3K5Pxtba2Y/LlNGLbV7Bm5lJ0qrHwE+kpB3vhH0gPo8S5M8mHf7Lq2ZuENw+kjlcPRr1hakg8NsWnSzadRqxNB7ZaQhbcHel4SzClJTVtQACxrk1bfDjfTRLeiLXxgy3w7B2zIvwJGcdSPRyaq05n2eRc0p4N2xu+vL005f+fIHEhb20T6S+kxhgxfZOtSe4OD7tiOuO9h67Yh7Mq7UD15G+ehtQeMYW7H0sHz/8GYH8U5BfDQYp+ceT2JKTnCaO9+rmADhZgUSAxJVQiYHArz0p4R68+UJZtSZZt5dg3RIwSJ1Xw4158IbOmyfboRfIdk1uyjd9QGk36QhmNwFhiyKB0wWE0V71haPQLMlG+kDx30CY7RCLBY4trR/LyoDh/IS2HHa3wprmPXOAbt6ngdlC0bigNlzZUT9qT0B3QoB8xalwMBe1GyTELKqKKBEwfTo9fPF2pPSAS5tPZQD7RynG5iFaOlXubOVEPnEIsjSeaPrfZHkQYLk40IBpVBZVz6MlfvRNUFx4zRbQvTGt0cc0gCQRLbyRceKg4V7SGbyini/iEWvpCWhzFOycvX5j8dCv32QsVxF8xO1LfML0S8erisHZ0QzB7EntHy3aqg+Q2HMeEGBsUB5GqRMC+UZ/jNJW6UeXJl7Or2oniUMOU3uA/elccM+CHzwJ7IbXsdnEycT4cghlPy2+0Zu2OycdTtCe3QXbad5QsCVlF6QG9tBsyFMW2RIftRNmWZAXswRDSyEkHxbG+uTjR1UDcsAy+ocjjUYPqsXpfcifgX4iAtfEJhdgl32ijsVLpkWQfXD0Hu6LlVS0y840o1ReSC7fDRWp8UJwlV4MWTTK65eTEd3SrjQxdUVPzjuRwcWjX4UKzLQy3VGsg3dGLB8X5C0W/erJ7kkbZPpKiDccoSCeSVA9Kai4VxQkHPjwEp514s0O03MpEwZqxy+Q6cVW8ITWFnygNl74QIW0p7OhdT356O2Ev6Oj4K1q5x35CNOGpgSpmF5o4ix/6iSnhMSfgJzIDpXUUe0cvfUe60+PBpDRJiysn+Ss+FaO9eOQsB71QC09uaUmDBy9axxuLCrf0iq0ox/QcaJI4UDV5PCSY3YOOJHvD5K+u6fVCabi0Ibk46RkQKZnAyUwmzmCih3GvqNkHF8cq1UJL5U8oDrqWO4nRFrpoBPxYEu10Ss2fEI0xop5aWsrOJCBGn2X7g7JsS7JsK8e+YUR8yZqqXtDVEy0OQ0axG6WF9nAAidwpmTy4uTSa9ILMSEq0tNDFK7MUNfCFVKo/IYVYH5p6yIbsEjXLEYmDEMxwcYzHDkz+4kcLO9vxhNFenanWJHstO+ARLSvHP9A0mLoldlrekLR8wymL1ojF5ONefKGeEK16MCv+wvQs9wfFsc0mybZybDB2QU8djUwQzIPiVN9RotpQlIZL4FWxLfUs3UH8xBTDN0wNSSdSKwdjycGUJQgWPLlyrIOTISQalMyfOEUL1rChBIkNUg4JiKUYupOeaIdbkmXjwkFxbPIdUws/UWQvfp/duDg2u5erKCCaRBK7ojiWsIZvrEJ9Ry/+wQ5HtTgETA8cKfK7pyGzvD1pG8NDon2hOG2g4vxvAIofHvmFsj8UHhhtPL+G5sfF/DoapIN+akNIGOzPmBumdvhROzkjydO+MMqZ0o9xBzfRk3u/OQXEeVv6Ns6i6idmFXUuGR2efHn3J8++V5w7iLQT0/vl7K12w+5EOzHz4T8wb8fblZ3k8/bM5LPsOItpoz16eFMClgIjnX9CdvOhiC2eyCTGPtaRND4iYy2euBLubQZmf3zegLq0g1+RW1pfyPLWLwjB0kYXb4YQ2UzyeXMzmoLZEew70rt0UiQqDLfnEbmlevDWy4LO/cLUTmdH84XZGw5WATHexEfBuhshSBt6yb8jO2jOKOt5+xOPtrz3NOcecDg53xcLMPJs23ny0ztEH1btm0c+V5CUX3DuOO6eVyei05xsPlM49zA7tnh6mjakdXOmIx89xWjLWZR7Ycw03pD7MtOPlTo8M+Hx7L7g6tlnkuMsxqiT504IlgWjQWJcED5LqQ6Hcm0MHqNSI1Bjgrh0uoYTuSvqWgykH1/6QDjjIaSMd+QZacBYFMsQvRXggyTV+xlZwiuGk5MQ08cY2bKQpOB0Z0e7eBM2egRI994wWrxzqxY+I7Pzw1nHQ2jjzlVrho74PUNP9RdM7fS1gyW9rxgtF4K5p1rCcCRs59yD0s8SxKO0m3uuyN7UGR8dTr7aWBESbTBvop3W4TSsPBxP8TOcwamjdxYFYWL7mjZkOvv+xMzh3fcnclt7BnMRlNeEl+VKON8QFxPJqRGhjaOtyHCzV2Q2NYbzPtLZX/5UY1trCdRzI0OokET8wtebA+m9I2siMRLg7hHylghFpMHZTRNW8USSuR95cqZZGloO/WAIPkWSWAnJB5uxg8UYd/P+7Ej2wZTojKX3EWdtyp2j50R29rPdMHecemqHMzs17o32yKlVD9KdnMsxrg3/4d1J/cS1Ix+BBayaHXASuqiTRweQJpu3U2OGuHT2huOtPyJbqr8gci9dyMash3EvNiTJi7O7PScymoW0n7tSC1+YcjyUDxJjBd30hFw+C43lr8gotbk1C4Yni6cUzF3B7qc5O8OLFP8d2d/+hfdd5dRO5HMl5yHnfcnZka7e+5NnmB0znOdn7B31f6vOQC2Bee7IULIvTG15n5WcsVnE/ScnT0NqDxgpuw/PZ0t+QXaVn8gtHdyQa2JLprNsEDHXd2/lfCK8OpXg5u3bOClS+ue+4cmXc0u1X5jamzPM9rkjPXnSQm5AJ0bDkeF0k/c7ecX0tMjIX9gvhb4dk4/3nqS8c4B9kyR+Hpf6Pzlj7cvosQsNi4zKZ4TwopOHhp+YOT4jWpqTvSMbs4iRfpZitPHOVWPLE3JH5qjS2nhD9qSHt7WaHeEXpKc8mK4bpsYbsdlNkjshGP07Zzci1qGwLLshEu+JyHQyUvrJuvcL6eKOTLWefHmAy1LC2YF98yxczk0xmtsWnORzRzWaelcQj0ZHAMYltYZvjoy41jJV/oQU+AC55/Bc0JwFQV7NHmZJwplIBW/nwuTLs2/vLWd+x+Svzp7WvpGHzH08AqMhlt2DKcJyO2k6YOya6o0feuR070gNYyzzXUc+mO+AdjgDtYTNU5zh6fni7IkGsF3rvwEonT8WipMfCJdbVqyhaYMUkbSY/M3PHnEgGInaLs4XR8DEgzAFtXOIXUF2MC031J2rZ1St6kJ2VL+h7ekrkp/IXHK/oCTKoqxntCzhxt8wNUt0zA4rePAvNAouvH0XDEl9YZvgFzTMiAbFMR7zF496cS924kr6EGrBn370SPZ11j64em5UU/UPtMSQ5Q1Jyzekp9KJ1GZEOUvWoB8QTTgNxGSba+Uv6Og4KA4r6JeC4thubluKFS3bcCt/Iv+gNFw6Ua0qxwn4HZFq9rVih+OvyFhqtOgJKSu1B0y7tuK0JY67tURL5MbHHEp6oASJDSKHBIpJ8N5HwGQbFyeIC0fTQpjsxCqyhBsP/nCv2omemWNXcLkW2vTgw6ULimMJa3hEiXorL+ilg7kHpoUFOQsksBxKGvq3pzH9F4yAPy4Th1rjIGmtjIDps85J4RtaEruxhQgQG5RlW5JlWzn2HaUoS55cWugr0mRJtmVJttW/V1w93jH5ckmMijJJzBruEJk/ca4Y5qXeMJSZ7NCJZNUXkrdeTJAUIenCg1PAKAhPTZw7poasE/V+tlk2Sk88Gm7TgdvBtD6gtK9QTto/aDmEuKMvfFgiMkZmvWNqb56p1B4QCbNsXOYCJ+KDCOTi3LmWDlo9rFjob0SyG2TfMN3RFlIVTepBLy8hXAi8dogvyA6J2onihAt1UKklPVFSuXoiJxm0vlCmbKIfUEtfSIujeOfk5U9o5T57x+TLdcfsQJNkL9QdqWmOgcNJZYfphl58IT2204QuJYQ+ojhpBbRh6HDEg5wY7cUjzyDdEIxEkZQT/tMpYuLBGBOQJkZyub2jZP7E+UZEzHisSMCUkUEnhW/IfhuOC7cnt0EJ6Y5oEjoufaMkS8t9xe5EA9Nhk9NhWyo2qlRW0Wi48C8uTnSg9QnEEU0m/B3FMR6zun/SRMmacyIJpjS+IoXWQeHJQZs82xbai0fDD/aMZkOantASuywPkgu3wyPdMdq4OKstI3L+rESNblnCjR+Y/MW9ei6IBhenO8mDWWhbGG6p1iB7oYImmro3lESPlWM5QBwUmXoOXkKwl7LQvnKFP3qHCVjqQHuLCfhaRTZW3gC3S0/jgQAAEABJREFUTNSKwYO7WqIjw/5AyjSpzyC/oKxyXRGmU1fZirky/AUdHX9Fsyf1Db34iZbtiCLKtizOG6aEx9pH8sHJPBtkm6pu6MWDEgSXgm1PsBSuonSiONGAagnlBEzhP12cNtIFYiIbg2DKATFVT4LnWSJg6E56Q0uybEuybCvHvqEWP1HNRv3k4bandkG08oXJT2e++UJJdvoWSnBcHEuYKCuYYIKlFQ/04mCayywFA69IR+r4GtOBQot7grRwuKXyhcnjHRYnOhAtsOF//TGQHxBPTMMTP/Q0pr5j8lc/B0kYxEj4dbLxJ7Y1v2YmATGG+N2yyYGsKN+wb9k5Y1jWAKtKPQQfnX3kn195d07OHcSUcTKGiOTsSS08yA5g7oj2wJGmTpIdAJxmkuGJ4UHEvRo5/IJ5Q/oWprb8/osxHbWG9LCrH+LE7GmB5A0pvVk+fGq/MLXTaW7Oi4LQec/OI4YvHMiLyR6+I1S6p87O6Ujk89QaqL9g5OVZxQp62RiNbHhJWJ+b7RAs2TgT8G54R9a04xUpxHIpjfd/z9zUB+QGemjl2sYPpsbsv9maPWbY2bkL0lMepJqctO+4I+Vj1R0zxiPTgfeTFAnYh0+WmOWZ2JAUizjrIdiVR8B7HwHjqexDS2M50/1uF1KdnvWStFYrzxQJNvqVI7MlET3LSWf3nbMxdbz1Ypu5eyGQZblnx8gnLzlCOyE7Jn/xyOciCMYwD20cjPbmX7M08jk6eGB6Ts9eegA+PfFjVQlYxSIBm3VR2Tl8TYfj+cL6HXLPFRlNndnRw/FyApZ97z73TGSOXclnF9kXz8LoYN8Cspw2hmsNSC/YSiYZTEv4x9mMvnMo3Ynp3tNqaU2yY/LTSbB8fzMLOR9L3tkbTiOVpZP9i7W7u+kGP5ysfCF5ruh3XCmBTxd9RonhhT492SpnNHTh8Y0NMoWefByCJV+VXgUHq4DY5Y7cE2cQo1preOHso5IldPG2cADtmac23nuSTmNWhPG0TUh6NAZ3T3f4L0wtnj3Bix/iC3Y3tRMzHM4T+XyxPjpSeor0HJiUHGhbp8r5jg5MkUWlxWTUyVNKdsejIy3NCVjvuCLTCPnPWp9HwOiL2Nc0pwvS+I1cQjdPWPVmBGx0RshjR8eJuYxC7gd6V7ur05UFyd+wQwl4egCek9g1K8Afi0tP7XCkfUHkmxS6tzRPX52A8UFitEKwvGM+Yz5ThANboe8JK3d9skyFFBGKfDdPmLtOPT2HZy75BXN3hEHKuaYkOw6nAz0spR35LFSqZpg89w9fU22nL4i3jVIRzkjaCxNSjEQRSzZ6yRQrhO9OqfqOyZenNekrUsD6j3ciSR4az+6F8xlZVs4LF6LUmPoH5DtZXe1nR5VXXPfQ3PuL0cazitG88voRKIze7dQZjNYsWvgT0tSehWkjzS6gd3whPa0Hma1FODnJiETy1PYlqKF8ooFfkfGWT1zJZSda+cLkpM+PZ1tqwPmM5PFDT44PnZi3Tnb7DhGjZNcr0tP6E+ae6DTk2b0Hnl0nT+30dsB+YWosxrKDde9fxWr4/GeNbrThecUsQWXpC08LHmtfkuVrAnZUbshdLMai4xik1hCenguuddFI+2WciIids9ciXSnujrR67m8tT+tqaUrAtvV0ReCNGPqNs7vf5YlpycCG1OaKpUOSxUlbTV7nkmLV2VGO3l6QF/DvXRVEjVaayhNnD3JWpu2KVZCuuCaWnto4V7GJHGvPBadEbOnE9BzOxlgbooXcMVp8LmNNGx7xv/4YmB8I35yx9pxII6aIByZ/cFcTx7hg4FgIXEpA+oFWf8gkYPSF+4OybEuybCvHtkxiJ2py6Q/01JmxJNuyJNvq347J46l49VwwmkQ5JlpF+eQhH94MaUcvbiXL4IkWx8pO6UAyq6d68uU2CaY3FMXUXjFr6QmkpzjhUIdpqt0lCWz9CdFaf0KJEpOx1CW4eha9cctUTTSohV4ohiZf8eAnzgRU7TD8l6crdXDMOmZlZgleLgpWjuUA8QtHEK3T8cURYqvBDqF1oR3+cTL9WKa/TzfQtjD7Yded1NAtKyZyJX1FaerqSVuSQesLUxT6iSbzo4KIUbM2JC9fmPx0K/fZC7WwnLx8x+wI3zA9ylk6qfHYF7K3+iNatkXADpQgsUFx6KGqiIOaA8EmTyxpgO2Y/MUji4DpDVPDeUZb0hYvbyKOdXDbiy/UjoKFP6FEMaacdhEwRRx0UtmDJBh5+JNLU5feUZKlF/fSrRzbcBxUMhAm25KsgYVaaCo4VFPfuDjUMIngCUR/OKwENH7kQStnolJrSsCU84TRTifBlIedSAK3QeELbfLuHLQXRsOHKRPKeeTMVL8gSvnC5MuzzLYw3FkL6uPS5NILWpZw4wcmX87ilVEn8+oBm4GYaFNO8HBRsBMke6Ge0KhO02DjwcUxCkB0YPOsLV2FD9+EpEch+MuzLPULhuDZAxw2dKLOt5lMnIXsavaKkm0CdqKkSPgXIkybFUxjEFZe1B7bgfKCjo6/otX9BIz8w+XMWfY4icgibigpdXEOTIrHnIB/cDLLqJL9hGjVTV1qsPSI4qQG6BERMaV4oHJKSILjTg+KFpZbHEKtYaqTKmQ9VYO+ohYvWvrCKqiD4hjmhQBMH6eAbdyTc7kl2ZYl2ZYl2b75oS2Upi5OegdkMCF4+EhhorSjFwfZ0eqJ4kQH0mWQGpZExWql31wUMT1iCncXJxqQmcCOW6lpA00gJvEg7IZUEO0HlBhBl95Rc6ZLCh4eNrmrizuS2Y3QOzKRmp8QTWJmc2m4tNAnymgELz/YFcVJB5A+7yjxFOVckJ7yYoLoW6ggvtAL6cCsng6THUj6amska9pzzFyQpvKFyXE7nKmFNnxRQIt+Y4r46tY3RjG6JZZY3pAUjpwYoubT8iP31PSEaNUXJj89V0TfMbl6ejdZENA3WoqlcKJlG93fKA41AxQ1qCvqczwVBOOxK4pdEtorSkqNlg9KgkdWDnmhSMBEw9StL5Ql3Pg3jiJO61a7EkhLrmhlvz0YQgosriD+ilmZ+o7JX5zllrJNObbJJdvKsa3+gUpmSeTYM4pDDyYRsBtWoXTFNklLT22896DGUn1GaXSpOKMrh2DKoqAIWIsnJrFsa86g5VJv+F9/JOQHwg+G0BehaUMEfnTML6Th+PkL48rD45lbmO6kDC6jd2zxrKULLT/FzugTp4Fifym+IxdUP5HV6elq5oK7b7VUM8uNXN84mJ5/9nUfy7qrGG1530V+we2u6Lvn3nCwU2C7weH5MCjcw2NjkTekEEv/iekvoe+G3IVIXDpZ+LEUNRfiMRiWrG1Jcs/ClsKX5/vIrv8J2TX9vCB7ygnY0HwWCA8oJ6CE1XtfsqXfeXZffe6hnVY28SEmjx4/tIXb7u554tHiLMKSsZtdybL/jtHwfioGMPoRYpDeAyJiFd9xlnADCTN0czFvhzI0Onn1ID1Ae4K5C4Klg7nUX7y9bSPE2pfRkAOzg83UsCR5xg3p52XdF8SZJqIzxAZoYjhpKk0b2EctaXqL9Jz5vRa+eXc98EPPS7Nrx9TCg/faE4/24Dwc+9wNieXxH+SeED7W6Nw5hlIj0MMW6rHwsIXcW/WG2Tl6hunFok0bBAsfn557rbyPaTOtL5gePK8CMPpqDRtf9wAsQyfhEoynMk17dYT8ZyV+59Eu3hXMvuKqcdusXzx3nDNo5QuTxzMTvHiemr4dkx/+qTGOLU42xiuyr4RaEE/GBj4u9XB6hvPI8g2pYSlPPyP5Tmg7OclWbwP8ip2ZIZbzgi5NSl9hIXmsjJ5vRKm+kDz3dz/5E0aLz/W5O89jnosYyfg4DeWPmDk8tcNprvKKcw9l9tPJlZNHjx/ajsmX5x4GYGkOmz1kJMRUxsvZT2PSfLKFKNWDJDF20kC95H9GBrKM+9mydkVjGzpa7EaGJuLM5NUzc+PUqj8i66vvyGWzImJGP8gL8++eu4IUqJd9MD2HZ0/yX5ja6exqvmPyf/TeRe+JvJDPx8r1Pvh8PCL5VouwfyaqnSFgbEgvDsEOzhQaRjv3IlOMDafMUzAKtQbUQSbaR8DQ6CSZevJZjJRO6hhkGQTrZWDfXpzxGWUOLT0fjgBpP3f8xlzFjq7M3J2vWval5wmj/bOzv70Lv3ZyX5+xYXryOYKZTf6AbORryNz4cGJ62UkxFmFDCjF6WIsekpYiUpB9ZBSJD7wqejAAxtiSkbw66UIasBRyZbC9EIw+7kqC99/tL8xWegBWZXFW7Mi+FLmkKr3B7A4y1MpwlNR/+uynhVF2d+RAatm2awe/IP3lIIuIYeMHP3HbmY5tN/TyhjdOE9ZBWv5CvqzevZB2MuYTeQu1ZgvzvbE0BWQ+SfR/9Mss95RnCzmw7szOsg8P5dK2cRcdvf8V6clw9zMUHCmkoykvZ0tkGjC08M1zLwWUqT3xaIdnV/ILrjv5HPtbWDs7SUbnlh85zdinB8JNXXpD7kOOSHcyUh5ElntS/YnrDd1PHjw8dPIuy6rTW+OmWMQPz928pMIDdgA9SE+y3DHYTQlU2RPDIWlBp6t8x+TjacpnPZwBJGosqPaF7UBdyG5scbS+747sq74w+auvWZb2/jtuX2suZSPvZWYIsUqxKvf8xlnYtkxxXxaWE7CMR1pIA1YBzBsnL8kG+sjJqm/YXq6jYUX6ag10/p/+c0oETPlh0BOkheXKMcGoLopsXJxoQLSmBEwnl5IqpzrJiSSY8mvlDSNJiE0s28qxb6jFT0yXFrshs+2+IEr5wuTLs8S2MPwBJXRcekFmJCVaWuh39OoBm4FOt8Wx8g5ZescUU1+ooImO+IDiGB0gOgAWwOHDGg/hxJX0QXQEfzktSv2CITpl3VZqnZG9ygvZNVmipYOfiKToG1KrhHxgpXBJzaUisWjx57Jk4zR6si0ePQsdxH9harg4toXhlmIQ27INt/In8g9Kw6UTJVlz/kR2tXOhnQl8ob3yE+luvmPy5cD18swvkVRbsbQ8mcksEQ93coc1wA6UILFB5JA864NWuRZCMKkcbeE3r0J1x+QvzlJLsi1Lsi1Lsi1Lsv3qFGRJtmVxTtTiC6WNtxP+C73qIDszXYhqcQiYDp58eftWTllKCP+Fqb26OF0weE+/uLtJPMRMFJOEn0hSDtJj/4H0xKZLCh4eNrlHZ5cl2ZYl2Vb/TlyawVSCqV2QWjkoibKgGvSJMjUCsOLwid9q9cjpviCV8oXkuYs22SHRr0gBMRYdF55ece6YGrJO1Pu5z5bPbmc+fLltRdJCGy5BwdjJ1bMo9dKFlkv9gJYYsj5/pBjclMjGLNpEVNHU3lxWe7QjefnC5LhotCT3T5xkKrNyLFqSvKDQTcBWox3upT+gOPQYoEkHhoaUl0y4c6VJOavCLkV7RUmppf2GNiKm5aHiXNEavqGcLuITaukLacFC0KWE8OwMlpOUF8o/5KsAABAASURBVK3JFyq4+cFPZCUDlmRblv7ZxbE9/SBUtgFfEc22EGNXFCclQG9IzatYhCtcIloivnrKqV9QiqSc6L88jalfMIJlmw0ftwwX8Y7qqUrANm76oewyoCdEq76hbSRnopjMtowCXDHa6Z4a0dVMJnwhw8nsRtkfbJeJ0UAy6kRyJBKMXPjJS9B/ITXj02WJ3PigOMOE1r3iGMfuXBFS+4k0tA6yozMPaK96aviVScN9RWYszgVRyheSZ8gOl+wNJfjHxVnl6pI1fENJMPzAYY0+tIUHvyC18oXJ8Sy0LQw3xZjJB+UDTWqIQXEWMmiYUK8YRT203HA6tQo2HBtuwCJsLg2XiuJkBvjwEJxR4s0O8RurdBcZaFljN6RW/URpuPSFCGlL4YPsq74w+XJx3FyNlq6IgCm7ntFTowEjD//h0vSIw4ALlkEt3jQBr37BUSyjSnbQP1CiGLugLInZgBqkZ6SItXhgG0OeXJzoQPru6ROPhvMciYB9UJZtSZZtSZZtSZZt5VgOEO9YGV2nJ0nX4WJH8wsaGRce/eLsKl8oCSpLekVJqYtjMi8EyryigllyQXHoMFAdJG9bUnJklZN/oSLSuNBFI+A0O/zilMp3TL7cV/yvlB8EvxERO349vGIKh2cy+Qv+KGWiv1qmJz993jBS723CL61FlDvyW2Z20RFYjL6yO366cl3u/0Z6uIPY4fySCqUVheYL547WHjAPYSKAM5geMoC48x9dbaN+QZ5VvpA8b2Bp3xgkoRhLcW6snvBpTgGnh5juQnqaHHrJhLvUXZR+YWqH09q3XTCE24/dCzMylYkj812UPiEdDLVyInvzeVI6kNpKU+xzKtGT1c1JgmkIZueJqa0F1cmD7V21WTUqEh2JdEyhd0bJzivSEEvhRPaUg9mUfCEtl6XlWfjPfkws7G6Gi2hfuGqU+iGK0ZYDeVrgGTOQaj7LIB+AJDy1j0ehwJpo6QLHQtCpPnG0FPt0kiIB60D/77f6NF55Vs/NidMR7dtZ9vkK0oiQXQD6CMPZ1MsXklcPTjOvITn53CVWYBS+eUUCG4mxvTP5cnZ2OjS3PGG0N7+vftoR7dW/FkSo58qOhUGwh6fyCVPgc2DUwxEg/Q6Z/RPpiTEV6JXJ4xGCbF16Mq6BVc89ycGqiOkorY4KwZLw787G9OCUY+i1hsgRP9gMacfe0EWHCsGiA3QnZmHvDZnGSGEbUsD6sCfMri6hWGT8julB/iwteQnsaWXhtqtKORnYT0N6vO3y74j+4V3YtmSMBhbvFvgvTG08H6VZ9g8hoiye3aRrN58YUg2kEfv0QjAKtYbhjeH08jK2oCR54+lIHWSs2cLjOzgeVJ5aH0VnEeFApKP3G1P8y9nVlhfMPfk0J6aZXozX13ov/PNWespBrKMn8p1Qy+DocGrlJ6YhevBaScuo0WEQ7HhCxZ3nTbnnRD7Lh88draFnycxGz+6FSfFY6j8xy2nIToCVMzGcfa3vSFe0tIGBPAW1n+URKxJem1N48ci54ILHroWpxaFpvXhIawSsj+TdweMzJo/zKbOBiTZuWBn+gLRiGZ86u4evbeE4XyxGhTz3Hp6NzUk+2HX0L0wNj7Gh9wSHT7ZuoxYetpD7siW7B9dUyukO4qutdyJ/cNoTM04pzaGDuakFKs+4egPtafIJrCl5RQpYH3QiSR4cz/ALzmdOwzhTk6x48CvOJ8pnqc7uKl+4OmjqPQeym9Z5Lhp0cpLowIVnd9quuLO5Jz3NmlC/IJXyJ6QQy+XB/Bt8IfuqB/vChC6jlXwiAvkfdrauJPdmZMfkp1NsvhDoF3TBEHytJNvsEL9xlMTxfjrSP5Ge9XX0I+d5Jycp/4WpLc9Dc9+sTJaVd4y2nEZs+wpW71yKTjUWfiI95WAv/APpYZQ4dyb58E9WPXuT8HkGUserB6PeMDUkHpvi0yWbTiPWpgNbLSEL7o50vCWY0pKaNiCAWNemLT6c7yYJb8Ta+MEWePaOWRH+hIxjqR4OzVWns2xyLmnPhu0NX95emvL/T5C4kLe2ifQXUmOMmL7J1iR3h4ddMZ3x3kNX7MNZlXagevI3T0Nqj5jC3Y+lOyZ/9v/6Y2F+FTw8fclTeMPUXv1cQAcLsCiQmBIqETC4xQ+Zf6BXHZRlW5JlWzn2DRGjxEkV/LgXX8isabI9epF8x+SWbOM3lEaTvlBGIzCWGDIo3dCLX7FdFsfKDulAMqunOvkHQyhFaNoQQYxLCamdKA49REVTzp1HW36UoE27K8Qz/cBtS7gdTLqhRAkubaietCeZqjToR4waF0NBu7FDzZzUKeMLtdDU3vzoeUAkzKezhXyileNyEa0ci2cl+YGWYmk80bKN7hNJhouTGhDNCwPhxZ+hE3Qs3HZJaOU7SopWKUG685SVEi5O+YnW8A3lVIlPqKUvpMVRvHPy8oXJT7dyn71QQfwVsyP1DdMrEa8uDmtHNwSzJ7F3tGynOkhuw3FMiLFBcRCpSgTsG/U5TlOpG1WefDm7qp0oDjVM6Q3+o3fFMQN++CywF1LLbhcnE+fDIZjxtPxGa9bumHw8RXtyG2SnfUfJkpBVlB7QS7shQ1FsS3TYTpRtSVbAHgwhjZx0UBzrm4sTXQ3EDcvgG4o8HjWoHqv3JXcC/oUIWBufUIhd8o02GiuVHkn2wdVzsCtaXtUiM9+IUn0huXA7XKTGB8VZcjVo0SSjW05OfEe32sjQFTU170gOF4d2HS4028JwS7UG0h29eFCcv1D0qye7J2mU7SMp2nCMgnQiSfWgpOZSUZxw4MNDcNqJNztEy61MFKwZu0yuE1fFG1JT+InScOkLEdKWwo7e9eSntxP2go6Ov6KVe+wnRBOeGqhidqGJs/ihn5gSHnMCfiIzUFpHsXf00nekOz0eTEqTtLhykr/iUzHai0fOctALtfDklpY0ePCidbyxqHBLr9iKckzPgSaJA1WTx0OC2T3oSLI3TP7qml4vlIZLG5KLk54BkZIJnMxk4gwmehj3ipp9cHGsUi20VP6E4qBruZMYbaGLRsCPJdFOp9T8CdEYI+qppaXsTAJi9Fm2PyjLtiTLtnLsG0bEl6yp6gVdPdHiMGQUu1FaaA8HkMidksmDm0ujSS/IjKRESwtdvDJLUQNfSKX6E1KI9aGph2zILlGzHJE4CMEMF8d47MDkL360sLMdTxjt1ZlqTbLXsgMe0bJy/ANNg6lbYqflDUnLN5yyaI1YTD7uxRfqCdGqB7PiL0zPcn9QHNtskmwrxwZjF/TU0cgEwTwoTvUdJaoNRWm4BF4V+8pVjmYr3SL9wvREP1FqXzRxFqasFMqtkyvnw8kQEg1K5k+cogVr2FCCxAYphwTEJRi6k55oh1uSZePCQXFs8h1TCz9RZC9+n924ODa7l6soIJpEEruiOJawhm+sQn1HL/7BDke1OARMDxwp8runIbO8PWkbw0OifaE4baAyKDJxfCIEM/5ffg3Nj4v5dTSY3zKD+bXyg+tXxv6cufIWye8a0jH72cVN6Bgl1CTMYS+cBorztvRvnHurn5gV1HMFMwAVNJKqaMHMvOPcQeRrIGbmy9lZ7Ya5h8UYs9S4nbbEdz7VTNLDfeEZesS00bMuWG3MRee+CNTy+RhHD9n0EYnR2UNG0zEcNjmRqcYLMlbxxJVwbzOw+8B5Ayp5tINfke2tL2R56xeEYGmj63wjm6NuHIWmfqqFvZeO7IxOikTW1jfkltaDtx4WHLteMT2ns6P5wuwNB6uAGG/io2DdiRCkDb3k35EdNGeU9bz9iUdb3nuacw84nJzvjwUYebbtPPnpHaIPq/bNI58rSMovOHccd8+rE9FpTjafKZx7mB1bPD1NG9K6OdORj55itOUsyr0wZhpvyH2Z6cdKHZ6Z8Hh2X3D17DPJcRZj1MlzJwTLgtEgMS4In6VUh0O5NgaPUakRqDFBXDpdw4ncFXUtBtKPL30gnPEQUsY78ow0YCyKZYjeCvBBkur9jCzhFcPJSYjpY4xsWUhScLqzo128CRs9AqR7bxgt3rlVC5+R2fnhrOMhtHHnqjVDR/yeoaf6C6Z2+trBkt5XjJYLwdxTLWE4ErZz7kHpZwniUdrNPVdkb+qMjw4nX22sCIk2mDfRTutwGlYejqf4Gc7g1NE7i4IwsX1NGzKdfX9i5vDu+xO5rT2DuQjKa8LLciWcb4iLieTUiNDG0VZkuNkrMpsaw3kf6ewvf6qxrbUE6rmRIVRIIn7h682B9N6RNZEYCXD3CHlLhCLS4OymCat4Isncjzw50ywNLYd+MASfIkmshOSDzdjBYoy7eX92JPtgSnTG0vuIszblztFzIjv72W6YO049tcOZnRr3Rnvk1KoH6U7O5RjXhv/w7qR+4tqRj8ACVs0OOAld1MmjA0iTzdupMUNcOnvD8dYfkS3VXxC5ly5kY9bDuBcbkuTF2d2eExnNQtrPXamFL0w5HsoHibGCbnpCLp+FxvJXZJTa3JoFw5PFUwrmrmD305yd4UWK/47sb//C+65yaifyuZLzkPO+5OxIV+/9yTPMjhnO8zP2juyqZT8zTNKf+H/vmIHlGaOx1sCOD85bppUC1ocs7GzC8ny21C/IcPmJbE9/V2cRnDy2ZDrLBhHbdUE+XzmV4ObH/blznP2t75h8ObdQTszoM476HBnmNcw2guxNJ09rBtJSHRmkr1oCHS3eMT2pgzNEfOPbdzVdEU7Pd1CSe0junAfl8v/Bu4R+bO3kWsTwAG/mqbCuLkamqXIxGX3kaUr2jmzIPYz07cVo452rxpYn5I7MUaW18YbsSQ9vbDU7wi9IT3kwXTdMjTdis5skd0Iw+nfObkSsQ2FZdkMk3hOR6WSk9JN17xfSxR2Zaj358gCXpYSzA/vmWbicm2I0ty04yeeOajT1riAejY4AjEtqDd8cGXGtZar8CSnwAXLP4bmgOQuCvJo9zJKEM5EK3s6FyZdn395bzvyOyV+dPa19Iw+Z+3gERkMsuwdThOV20nTA2DXVGz/0yOnekRrGWOa7jnww3wHtcAZqCZunOMPT88XZEw1gOz0k4VlxIlq58r8BaM0Pg4MOsTgETOG//OwRB4KRqCPifHEETPx6iSmonUPsCrKDabmh7lw9o2pVF7Kj+g1tT1+R/ETmkvsFJVEWZT2jZQk3/oapWaJjdljBg3+hUXDh7btgSOoL2wS/oGFGNCiO8Zi/eNSLe7ETV9KHUAv+9KNHsq+z9sHVc6Oaqn+gJYYsb0haviE9lU6kNiPKWbIG/YBowmkgJttcK39BR8dBcVhBvxQUx3Zz21KsaNmGW/kT+Qel4dKJalU5TsDviFSzrxU7HH9FxlKjRU9IWak9YNq1FactcdytJVoiNz7mUNIDJUhsEDkkUEyC9z4CJtu4OEFcOJoWwmQnVpEl3Hjwh3vVTvTMHLuCy7XQpgcfLl1QHEtYwyNK1Ft5QS8dzD0wLSzIWSCB5VCI9fbLAAAQAElEQVTS0L89jem/YAT8cZk41BoHSWtlBEyfdU4K39CS2I0tRIDYoCzbkizbyrHvKEVZ8uTSQl+RJkuyLUuyrf694urxjsmXS2JUlEli1nCHyPyJc8UwL/WGocxkh04kq76QvPVigqQISRcenAJGQXhq4twxNWSdqPezzbJReuLRcJsO3A6m9QGlfYVy0v5ByyHEHX3hwxKRMTLrHVN780yl9oBImGXjMhc4ER9EIBfnzrV00OphxcIR7A1J7QbZN8xUtIVURZN60MtLCBcCrx3iC7JDonaiOOFCHVRqSU+UVK6eyEkGrS+UKZvoB9TSF9LiKN45efkTWrnP3jH5ct0xO9Ak2Qt1R2qaY+BwUtlhuqEXX0iP7TShSwmhjyhOWgFtGDoc8SAnRnvxyDNINwQjUSTlhP90iph4MMYEpImRXG7vKJk/cb4RETMeKxIwZWTQSeEbst+G48LtyW1QQrojmoSOS98oydJyX7E70cB02OR02JaKjSqVVTQaLvyLixMdaH0CcUSTCX9HcYzHrO6fNFGy5pxIgimNr0ihdVB4ctAmz7aF9uLR8IM9o9mQpie0xC7Lg+TC7fBId4w2Ls5qy4icPytRo1uWcOMHJn9xr54LosHF6U7yYBbaFoZbqjXIXqigiabuDSXRY+VYDhAHRaaeg5cQ7KUstK9c4Y/eYQKWOtDeYgK+VpGNlTfALRO1YvDgrpboyLA/kDJN6jPILyirXFeE6dRVtmKuDH9BR8df0exJfUMvfqJlO6KIsi2L84Yp4bH2kXxwMs8G2aaqG3rxoATBpWDbEyyFqyidKE40oFpCOQFT+E8Xp410gZjIxiCYckBM1ZPgeZYIGLqT3tCSLNuSLNvKsW+oxU9Us1E/ebjtqV0QrXxh8tOZb75Qkp2+hRIcF8cSJsoKJphgacUDvTiY5jJLwcAr0pE6vsZ0oNDiniAtHG6pfGHyeIfFiQ5EC+z4R+m/9vNr4AchWH86PDC/HL56JttIAmIkHf8L25pfM5OAGCP8btnkQFaVb9i37JwxLGuAVaUego/OPvLPr7w7J+cOYso4GUNEcvakFh5kBzB3RHvgSFMnyQ4ATjPJ8MTwIOJejRx+wbwhfQtTW37/xZiOWkN62NUPcWL2tEDyhpTeLB8+tV+Y2uk0N+dFQei8Z+cRwxcO5MVkD98RKt1TZ+d0JPJ5ag3UXzDy8qxiBb1sjEY2vCSsz812CJZsnAl4N7wja9rxihRiuZTG+79nbuoDcgM9tHJt4wdTY/bfbM0eM+zs3AXpKQ9STU7ad9yR8rHqjhnjkenA+0mKBOzDJ0vM8kxsSIpFnPUQ7Moj4L2PgPFU9qGlsZzpfrcLqU7Peklaq5VnigQb/cqR2ZKInuWks/vO2Zg63nqxzdy9EMiy3LOjdj356e2E7Zj8xSPvi8v/fZxPVGvoLIHPMZw8uy/O7vJ0pB4+XkbAKhQJWJpnit3D+e7SFY7nC+t3SNcVGU2d3tHD8XICln3vPvdMZI5dyWcX2RfPwuhg3wKynDaGaw1IL9hKJhlMS/jH2Yy+cyjdiene02ppTbJj8tNJsHx/Mws5H0ve2RtOI5Wlk/2Ltbu76QY/nKx8IXmu6HdcKYFPF31GieGFPj3ZKmc0dOHxjQ0yhZ58HIIlX5VeBQergNjljtwTZxCjWmt44eyjkiV08bZwAO2Zpzbee5JOY1aE8bRNSHo0BndPd/gvTC2ePcGLH+ILdje1EzMczhP5fLE+OlJ6ivQcmJQcaFunyvmODkyRRaXFZNTJU0p2x6MjLc0JWO+4ItMI+c9an0fA6IvY1zSnC9L4jVxCN09Y9WYEbHRGyGNHx4m5jELuB3pXu6vTlQXJ37BDCXh6AJ6T2DUrwB+LS0/tcKR9QeSbFLq3NE9fnYDxQWK0QrC8Yz5jPlOEA1uh7wkrd32yTIUUEYp8N0+Yu049PYdnLvkFc3eEQcq5piQ7DqcDPSylHfksVKpmmDz3D19TbacviLeNUhHOSNoLE1KMRBFLNnrJFCuE706p+o7Jl6c16StSwPqPdyJJHhrP7oXzGVlWzgsXotSY+gfkO1ld7WdHlVdc99Dc+4vRxrOK0bzy+hEojN7t1BmM1ixa+BPS1J6FaSPNLqB3fCE9rQeZrUU4OcmIRPLU9iWooXyigV+R8ZZPXMllJ1r5wuSkz49nW2rA+Yzk8UNPjg+dmLdOdvsOEaNk1yvS0/oT5p7oNOTZvQeeXSdP7fR2wH5haizGsoN171/Favj8Z41utOF5xSxBZekLTwsea1+S5WsCdlRuyF0sxqLjGKTWEJ6eC6510Uj7ZZyIiJ2z1yJdKe6OtHruby1P62ppSsC29XRF4I0Y+o2zu9/liWnJwIbU5oqlQ5LFSVtNXueSYtXZUY7eXpAX8O9dFUSNVprKE2cPclam7YpVkK64Jpae2jhXsYkca88Fp0Rs6cT0HM7GWBuihdwxWnwuY00bfiClw7bWpPMD4OVXQgim/Ip4YPIHdzVxjAsGjoXApQSkH2j1h0wCRl+4PyjLtiTLtnJsyyR2oiaX/kBPnRlLsi1Lsq3+7Zg8nopXzwWjSZRjolWUTx7y4c2QdvTiD2hxrOxUusrJdky+3CbB9IaimNorikMPUenR5xzqoZR3Fwp48C+kJtymgtsbdjRctIASqJ60JbmiZUQTDWqhF4rmyVc8+IkzAVU7DP/l6UodHLOOWZlZgpeLgpVjOUD8whFE63R8cYTYarBDaF1oh3+cTD+W6e/TDbQtzH7YdSc1dMuKiVxJX1GaunrSlmTQ+sIUhX6iyfyoIGLUrA3JyxcmP93KffZCLSwnL98xO8I3TI9ylk5qPPaF7K3+iJZtEbADJUhsUBx6qCrioOZAsMkTSxpgOyZ/8cgiYHrD1HCe0Za0xcubiGMd3PbiC7WjYOFPKFGMKaddBEwRB51U9iAJRh7+5NLUpXeUZOnFvXQrxzYcB5UMhMm2JGtgoRaaCg7V1DcuDjVMIngC0R8OKwGNH3nQypmo1JoSMOU8YbTTSTDlYSeSwG1Q+EKbvDsH7YXR8GHKhHIeOTPVL4hSvjD58iyzLQx31oL6uDS59IKWJdz4gcmXs3hl1Mm8esBmICbalBM8XBTsBMleqCc0qtM02HhwcYwCEB3YPGtLV+HDNyHpUQj+8ixL/YIhePYAhw2dqPNtJhNnIbuavaJkm4CdKCkS/oUI02YF0xiElRe1x3agvKCj469odT8BI/9wOXOWPU4isogbSkpdnAOT4jEn4B+czDKqZD8hWnVTlxosPaI4qQF6RERMKR6onBKS4LjTg6KF5RaHUGuY6qQKWU/VoK+oxYuWvrAK6qA4hnkhANPHKWAb9+Rcbkm2ZUm2ZUm2b35oC6Wpi5PeARlMCB4+Upgo7ejFQXa0eqI40YF0GaSGJVGxWuk3F0VMj5jC3cWJBmQmsONWatpAE4hJPAi7IRVE+wElRtCld9Sc6ZKCh4dN7urijmR2I/SOTKTmJ0STmNlcGi4t9IkyGsHLD3ZFcdIBpM87SjxFORekp7yYIPoWKogv9EI6MKunw2QHkr7aGsma9hwzF6SpfGFy3A5naqENXxTQot+YIr669Y1RjG6JJZY3JIUjJ4ao+bT8yD01PSFa9YXJT88V0XdMrp7eTRYE9I2WYimcaNlG9zeKQ80ARQ3qivocTwXBeOyG7FJ6bqiTS80zFq0oCQxVDnmhSMBEw9StL5Ql3Pg3jiJO61a7EkhLrmhlvz0YQgosriD+ilmZ+o7JX5zllrJNObbJJdvKsa3+gUpmSeTYM4pDDyYRsBtWoXTFNklLT22896DGUn1GaXSpOKMrh2DKoqAIWIsnJrFsa86g5VJ/YeVRrQv+199E81Pg+kVxeAS8vzCCqR1+aOD0ikNPraGdCTB+yKQrSfpfkULrD8iip1+Q6eTX3USumBfQSZ494RfMG3A6sut/87WTq2YufPPuhF9wuyv67n0XdbBTIGx9FjLugcQoH7wpAaOfddRpjJWnr2TpG59m4qqT0ZRvKMvCJici1C5p9kcA2UCdSJ4d+T7+Z2TXzGUVu8oJWNaiZmXYICKfhndOjNhs6Xee3VdnY3q5avTw3dm213JT+n9havH0ZbY5O98wPTgfiud+7qN98Wg0dN8fOEsyyoXMPXE0thDTsjJ2R8h3gIpFZz76i7e3bYRY+zIacmB2sJkaloTPBPDCD6e/fCE500Q4TWyAJoaTptK0gX3Ukqa3SM+Z32vhm3fXAz90nprPydq5Jzy1A3NP8l+Y2oOzEPvcDYnl8R9kd0juHySrNayXMEI2hk7CViaJ3NvqDbNr9LQxg0WbNggWPj4991o5d7UHzPc0OzuMvJBa9SASrwqFlWy47gEYRifhEox+pmivjpC74nce7eJdwewrrhq3zfrFc8c5g1a+MHk8M8GL56np2zH54Z8a49jiZGO8IvtKqAXxZGzg41IPp2c4jyzfkBqW8vQzku+EtpOTbPU2wK/YmRliOS/o0qT0FRaSx8ro+UaU6gvJc3/3kz9htPhcn7vzPOa5iJGMj9NQ/oiZw1M7nOYqrzj3UGY/nVw5efT4oe2YfHnuYQCW5rDZQ0ZCTGW8nP00Js0nW4hSPUgSYycN1Ev+Z2Qgy7ifLWtXNLaho8VuZGgizkxePTM3Tq36I7K++o5cNisiZvSDvDD/7rkrSIF62QfTc3j2JP+FqZ3OruY7Jv9H7130nsgL+XysXO+Dz8cjkm+1CPtnotoZAsaG9OIQ7OBMoWG0cy8yxdhwyjwFo1BrQB1kon0EDI1Okqknn8VI6aSOQZZBsF4G9u3FGZ9R5tDS8+EIkPZzx2/MVezoyszd+aplX3qeMNo/O/vbu/BrJ/f1GRumJ58jmNnkD8hGvobMjQ8nppedFGMRNqQQo4e16CFpWTgiMZy9ZPq//yNuvAweDIAxtrCPR4ecOgmWQq4Mphw8eP+9IP+ErG/fK+bNFLkk1/YeaGY+nJ7cR0/ryV+dT9XaE6KxgzJrsnPjh16kdiDNi0WZuWSHziNb3zE1OG3TT57P88ZpwtpEy1/YL4e+hbSTMZ/I5+HuZguPe6eBl0b/R7/Mck85yzMOzEpeMjy7q6JsSJFKHobeJd9IT5Z1f1uYWEhzSpt/ajMWvjkD2YPCTOM3pufw3JP8gn0uapAdqXEZNrtIescfSDOW+XFId34j98xXRp3LyJkgonMHkZHoqE8cLe+hCaMPTsJY+llTvmPyllcC5GZGUbEkmX1BemkiUmc3ndDEcFIqY4sD5UX6vjDaeN6dz3J4t607qrHoiu1AXchubHG0zt5x7iJyHTE9r75mWdp778hXx2jvS2AbO5kZQqxSrJrmsFechS23b+OIWNb0DspgHjQ9Hx5tPLfTlAbm0KapPJ+HBItOubU7dgPihmnnIdj63wBkhfq7oImWiB8XJxoQvSkB08mlpMqpTnIiCab8WnnDSBJiE8u2cuwbavET06XFxcYekwAAEABJREFUbshsuy+IUr4w+fIssS0Mf0AJHZdekBlJiZYW+h29esBmoNNtcay8Q5beMcXUFypooiM+oDhGB4gOgAVw+LDGQzhxJX0QHcFfTotSv2CITlm3lVpnZK/yQnZNlmjp4CciKfqG1CohH1gpXFJzqUgsWvy5LNk4jZ5si0fPQgfxX5gaLo5tYbilGMS2bMOt/In8g9Jw6URJ1pw/kV3tXGhnAl9or/xEupvvmHw5cL0880sk1VYsLU9mMkvEw53cYQ2wAyVIbBA5JM/6oFWuhRBMKkdb+M2rUN0x+Yuz1JJsy5Jsy5Jsy5JsvzoFWZJtWZwTtfhCaePthP9CrzrIzkwXolocAqaDJ1/evpVTlhLCf2Fqry5OFwze0y/ubhIPMRPFJOEnkpSD9Nh/ID2x6ZKCh4dN7tHZZUm2ZUm21b8Tl2YwlWBqF6RWDkqiLKgGfaJMjQCsOHzit1o9crovSKV8IXnuok12SPQrUkCMRceFp1ecO6aGrBP1fu6z5bPbmQ9fbluRtNCGS1AwdnL1LEq9dKHlUj+gJYaszx8pBjclsjGLNhFVNLU3l9Ue7UhevjA5Lhotyf0TJ5nKrByLliQ/0FJsNdohlm10f6M41AxQ1IGhIeUlE+5caVLOqrBL0V5RUmppv6GNiGl5qDhXtIZvKKeL+IRa+kJasBB0KSE8O4PlJOVFa/KFCm5+8BNZyYAl2Zalf3ZxbE8/CJVtwFdEsy3E2BXFSQnQG1LzKhbhCpeIloivnnLqF5QiKSf6L09j6heMYNlmw8ctw0W8o3qqErCNm34ouwzoCdGqb2gbyZkoJrMtowBXjHa6p0Z0NZMJX8hwMrtR9gfbZWI0kIw6kRyJBCMXfvIS9F9Izfh0WSI3PijOMKF1rzjGsTtXhNR+Ig2tg+zozAPaq54afmXScF+RGYtzQZTyheQZssMle0MJ/nFxVrm6ZA3fUBIMP3BYow9t4cEvSK18YXI8C20Lw00xZvJB+UCTGmJQnIUMGibUK0ZRDy03nE6tgg3HhhuwCJtLw6WiOJkBPjwEZ5R4s0P8xirdRQZa1tgNqVU/URoufSFC2lL4IPuqL0y+XBw3V6OlKyJgyq5n9NRowMjDf7g0PeIw4IJlUIs3TcCrX3AUy6iSHfQPlCjGLihLYjagBukZKWItHtjGkCcXJzqQvnv6xKPhPEciYB+UZVuSZVuSZVuSZVs5lgPEO1ZG1+lJ0nW42NH8gkbGhUe/OLvKF0qCypJeUVLq4pjMC4Eyr6hgllxQHDoMVAfJ25aUHFnl5F+oiDQudNEIOM0Ovzil8h2TL/cdl8CuVoKRQEz/8dNg9Sv2J0L0IJBfFgNP+GcLDVh/xbxhfoHsvU34hbKIcsd1Lx1vr9j0T1euy73fSA93ELkMS05TflElZYTKwdlc7QHzLDoDOAPpIQOIO//R1TbqF8ybsmUhtbyBpX1bkIRiLMX07kiepg6tWiDaI1ackNHJJh47fmFqh2cq+QVDeOuxe+HRNlXqTfguXpFBhtpxYuaib0gtHxU14nxVkMhZHYRWT8NwtiISM4qXFEeDl3WCrJsWRgsH00aancC6Y9dpiKXhRG4oB7Mx+UJa9uGoWfs/eDfQv7C7Q8Px8h1XDamPL0ZbDpyPSO2Lf8TJEsfz6fgwTOw8SvhCUixkroFgVx4B79PpKhKw7u7/HVenaWHujk5DFDwrowafvb2swPpVDA+jfy5DD2dP+ULy3hWcod5H80Lmqy8kz5YUi/DD2LjSoxLcnDu6JdK5AIKdevI3z/bUToRg52x2/vRz8P8peaNs2XVdxxJ4/e9z5gRIO+wIe+1ztUlNgqQoOc4b+bHqjiLoQThW1Q0NsdvY0XxhAr4Dox5NAtHfMEeJAT8feYKfPLnYVBmBSBwn3NczF5E9+ZPMbgxzMhhNMyer2TDKVOYwb6FOjJGvdfvVzWQSB9ISzRwyhwpbJJfqTU/imjpalzRgfdATmdnaSY71Yy5MDfm5pOJlyyUpLS+zmqkmgvnKjiYOb//d2sLGqJTBPJPgrjsl2Yx4YXrG09SI0eG3zmxKt7uaazK/AKeI2SM4XnFnVfLtenkT6faFHdUgd03QnXcwJ+EW+hslFX2SoBpeejkcxfAjP/LvfXt52/R96dyT2sl00YNxUa33oj9vpacaYj16kt+IWg5OHk2t+mQakg/vlbRMNnkUAjue0ORV50255yTf8tFzR2vkM2TOJp/Zy4R4LPU/meE0ZCZg5JwYzbzWr6QrubTBIE8h2295ZJNsr80pvHjSueDGY9YytTgyrTePaI0N6yN5d3h8Y+I4X5kJnGjjhU2jH0grluNTZ/bonRaN88NiVIhz7+GZ2Jjgw46jf5kaHmNC7wlHT7S3UYuOWnJfpmT2cE+lnO4Q37beSfrDac+e45TSHDnMTS1Qeeb2Bu1p8NkYU/FKClgfdJIgD47n8Avnm9MwzqkJdj/0nfNF+Zbmmd3MD7eDpt5zkNm0znPJIScmSB7cdGan7c6rmnvS06gB9RupVD+RQiyXh/lv8EPmNR/2hdk6jFbi2UkQ/8PO1g1yb45cmfh0io2XoD/QjRH4jiS62JH85WSyj/frCP9Jevbn6CfneacmqP6Lqa3noblvRibKyG8mt04jdvkJtncuJU81Fn2SnmrYC/9BejjKPncm+OhP1HzmJuB7BqnjzYfJfjE1Ujw2xadLLnkasTYdbLWCKLw6qeMtYUqbatiNBMQ6Nm3x0fw2CXgj1sYPW+DZV2ZE9BM5jqV6ODJXnc6wibmkPRe2N3q9vTTl/z0hxYW8tU2Ef5Eax9jTN9Ge5O7oqDvTGe89dMU+mlFpB80nfvM0pPbIFL79GHpl4hfP8ZRObsDDE/EHQP4ciCl/VTyY+NXFaiMdECMhROyBVv7SmO2d5pxpsSTLtiTLtrLsL5JMJk6o8ONeveSsabI9+ZL4ysSWbONflCYn/VAmx8ax7BFD6Yte/UCLZWWGNBRrtFT6ygiphYbdJF1JXB2K9S/SctjRim7YB0Q4E6UHbbt5O0x4ocQRtHShutKeYKrS0I9MNi4OhXb3HmrkhE4ZX2ppam9+9DyQFObTmUI8u5XlarFbWRbPSvAHLcXSeNKyTd4nCUaLlRpIzssguvxz6wk6lpdZErnqKyUl11Q26VunrJRwsapPWqMvlFNlf6I2v6TFyfiqiauXiU+3cp+9VIi/MjNSvzC9EvvdxWLs5I3A7AnsKy3bqQ6JbTSOiWRsKBZJqhIb9kt9ltNU6e6qTrzOrOZOikUNU3rD/+gdcZyBHz0D7CW1zHY5kVgfjcCMp+VvWjP2ysTjKdoT25CZ9jclSyKtUnqgN/dFDiVjW6LDdnbZlmQF9jCCMOmEQ7GsXy1W8urGfmEV+kIRx5MN1WX1vsTOhv+QBNbGJ4pkh/zSJsdIpUeSfWh1HepOy1stOfNLMs0viYXb0SI0PhRr080hSxNM3nJi9ne61e4culNT85XEaLFo1+EiZ1sYbqnWjfBKrw7F+hdFv7oye4Lusn0EpY3GKEgnCZoPJTWWSrGiwUdH4LSzf9mRtNzK7EI1YpaJdXIrvpCaok9Ko6UfkkhbClf6mk98ejtRL3Ty+Cut3GM/kZzw1KDKzCIn1uojfzIlPOZs+EnOIGmdjH2lN38l3enxMCFN0mplJX7lUzG5F086w6GXWp7a0qaGhy6t442loi29shVlmZ6DJoiDZhPHI8LMHjop2RcmfnVNr5fSaOlCYrHSMxAhkeBEJhJrmN2juFfU7EOLZVVqaan6iWKR17oTmNzSpUngx5DkTqfU+InkOMaup5aWMjMBxOizbH8oy7Yky7ay7C8miW9aU9UL3Xx2i8Uhk7G7S0t7NCBF7JRMHF5cmpz0Qs5Iym5p6fKuLCUb/JBK80+kEOtDU4+4kFmiZjlJ9iECM1os47GDiV/8aGFmO56Y3KtzqjXJ3mEHHmlZWf6DpsHULTHT8oWE1RdOWbQmWSYe9+qlnkiu+TAj/sX0rPtDsWwzSbKtLBvGbvTUyREJgXkoVvNXSlS7ldJoCd4z9l2rmtxJsaKBhkqN8ENq1TCWGKZNQmDhqZVlHZqIRHZDyfwTq7RQ3S6UELEh5YhADMXIO+FJO9qSLBsXDsWyia9MLfqkiF78++xFi2Uze12lQHISQexOsSxh3X7ZDPUrvfrDHk7WYrFhetCkkn73NOQsb0/YxuiI5H4oVhuoDEUklk8iMONJ3emkJGZb2v8FIH8NzF8v8xfUMn+NPPyonZpTifnzYf4umjCZkBTHySbgHPaiaaCYv9TmzhsZVH0yI+jnksmjE6/3fOLMe2XehO/MzPl15mYGV01tdWcSn2ROejor+QedGt5qZhJn5qHvnMG0kZ5ZtOez0FgKue+N28zJNKPanKGrCclmJzG4atqbPLkB9zWCfQzsN8BvfeSH3NKeJcObvxGBpY2ufU2/INmL5gU0pZIZYe4OP5oJ6WkrlUem5/CvHm47Zr0yPaczp/Ey90XDZiCWZ/ItZC5vo4081eb+IzMl/X8xtfV8w4TMJxhNzAxegxHPQ1IdndrpSdMTa+5XJ32OIKi+kcPVS2IuYkfTzH8BZPZoQipjq9PTsBu/GT0J65z7YXLrDMo3ozjX/YuZlfyFOZPPjGf2jV+9fRs5yGBs4tyJwDJgcohYLvqQ2RF0ka9148SH9FSfjMoJmHt5b2bkQO+96RyiF2tPmdyb04Clt6Nvs1rgmuFxF6/osCHlnNlMwnR/uF0Mnzw6QfRJguoPc1d83pUz67knvTfmDXiOczHoXv70MifV5omfmNzpmZu+KxPnAbCzIP2EGLfWuq3mPFG/JcST4RQp+qJzvmTuN2nZ8vSjCXIcIDCC6iGJHIgzq7kH9vfNdanBj0ZgTGHmvDQzXnXuwXv+n8xIZjKs/bkn8ZJqruJF29OoWaKD1FDdc1/iV3ImtdxxMrnDmXKrfTRjsWicKA9rlDmn5uHEjCBIFVz1FHI0BTiJz7ejY8ykiFX8kEQfnLaJGYegu3nUhVXosB0Ev2yGGW2Eff0PqZLjk7iWE7EfPeOTpimWQ0MOzrcyfRrIE1/ziQ/P/MR/suPpCpmVXmZjM5sgdz46p5o/uTPyCTl3IcPoop4cHsvZX+YNPILu1jMH7/kfcpocxuCc+9JIxmSnHmMulmjyEX/4DKZ9e4IchNxGntHpiV6mHI+cN0/PR7eZEqSx3/jKXJG+O5OJcyzGrNT3nqKvIw+5OHf8N2dO+5ffs6qpnWR+Yl6R9/SOxMxI1791DjNjDvPeaE5WP5DZtcynh5Nt+oMzMIfwHONArRszPkwrCawP+WLPZlvPt6Xvxt7Rg5RCpqe/o1cTxzbNiaohyXbdyNdVUwkvziXY1puf+wg3H31xbmntL6b25hzmtpmdnjxpyS3k2ZPDSaPpJp7fKLWIb6YneTiH2N/05beariRO7z1RvHPAnAmy5+L/0TmWWYz5zCaHJc0wvlvWIygAABAASURBVBGRt9BTHRl9MoX/8m30xTL4RqZWM5Aaxp3Ma+6LuZcGstPzo5mVXEaFmfFDepoPM+mLqeWOk/SguRCbuL8VOVQON8/GTbm42ckjk2QUOtaI1JIZbbmR89XLxOtB7mEAw5iB/WomNg/TmBj2LGw/7DdABtG4d6GJRhOPMaDWjdQXkSR3LKern0iBR+Tew3N3YwaEXMwczhJEcyIVvJ3LxOuZd+2t5vyViV+dOa39kofMfTwCoyGW2cMUUbmdMB0oZk31Sx/5pNN9JTWMYznfccTD/Aa0ozlQy3bxFOfw9Pxo5iQHmE4PQXRGnCRXHdJFfHx7mfl43jL/C0CZzhdPunVawmriV1LAlL8wLrUk1YN2E7JD/VJfec2arLa6ZEbzX7Q9fSXxSc4l9gslURZlPdOyhBt/Y2qW6JgZVnjoH5oMLrx9N0akvmwT+kajTNJQLOMx/+hkb+5VJzfoQ6iFf/rRI9n3s/ah1fUlNVX/QUscsnwhYfWF9DR1ktocUdamNfQDyQmngT3RxbXxC508DsViBP1SKJbtxralWGnZRlv5J+IPpdHSSbWqLGfDv0mqZt8rdjT+So6lRoueSFmpPTDtuhSnLfu4W8tuidj4mCMJD0qI2JB0RFAmwHsfGybbuFghLpyclijZ2ZuRJdx4+Id7ayc9Z45Z4bqWNj34aOlGsSxh3R4pUW/lhd48zD0oLQs5AyRYjSSM/LenMf03JoE/DhOLWvchYa2KDdNnnBOiL7QkZmNLEggbyrItybKtLPubUjKbnlha+k6aLMm2LMm2+u+V2+MrE69L4qgoE8Ss0Y6Q+SfWnVHe7BcjOZMZOknU/JK49TKbpCQSLg9NAaMgPDWxvpkaaZ3U+7qcZaL0pJPDbTpwO0zrA6XrCGWl/UPLEexX+qZHZSeNEVnvTO3Ncyq1B5LCLBuXucDZ8SEJYrG+tTYPrS5GLCdhX0hod5P9xZxKbUlV+tba1eLGJ47kCzuL2skcjJbMv5hSM/qkpGp1JZ1gaP1Qpmx2P1CbX9LiZHzVxNVPtHKffWXidX0zM8hJspf6JjXNMjicUHaUvujVS3psp4m8lC3ykWKlFejCyNEkD3EyuRdPeg7SjcAIlJSyov90iph4MMYJRAOTcrV9pWT+ifVLkpjxWMmGKUeGToi+kPk2GhduT2xDidQ3yUnkcemXkiyt+87OJAfTYRPTYVsqu6tSVmlyuPAfLVbyoPXZ2CdpIuHvFMt4zOr8CbNL1qyTBJjS+EoKrUPhiaFNnGlLe3Vy+KGeaSak6YmWmGV5SCzcjk7qm8mNi7VtOSLnn5Vdk7cs4cYPJn5xb8+N5NBidSZxmIG2heGWat1kLxWa3dR9oSR6rCzLAftQROo6dAWbvZmlfdeKfvQeZsNSB+0ts+E7imisuhvaMrt2Dw/t5rI7adQ/SJkm9RnEN8qq1p0onXlV7Z4ro1/o5PFXmjmpX+jVJy3bSYpdtmWx3pgSHmsfwYcTeSbINlV90atDCYFLYduzWYpWKZ0UKznQXLZqNkzRf7pYbaQLYiIaQ2DKgpiaT4DnWWLDyDvhFy3Jsi3Jsq0s+4tafVKNJvuJo21P7UZy1cvEp3O+8VKSnb6lhMbFsoSJssJsZrO0+0GvhmmushQGr6QjdXyP6aDIxT2btBxtqXqZON7DYiUPkguu/FcpM9IDA8HDbe//AjB/OXx1sfInRJCeS5hMUm9sK39pbA/EaM1fJFM5yB8xp8AfJ5NH9wA88pyKTZV8BH7XzCPHkJ7OXzdbZ0Yqo4lINg7ppMyRS54ZzUHKMep7Z8+ksJqQk+zRFIlGZ48OSTIlql0NyN9IpXqZeD1v5fgUkov4YRJ4Hp7r0vMnW3zejhl/MbXTGdM4T+QNyP5gsG+Hx3PSdpGb5rdIEjWnvzSHJpOdjlq3OdGw20dHrmc0I6jlfTjR6DS86PTgU+2EqkfNmHa8kkIsl9LY3wTd3wjmqxrnBnpIcU33D1Pj7H+zPXucYWbP3UhPdUg1MWHf8U3Kx6hv5hiPTAfeLynZsI+eKHuG58SFhFiSMx6B3XUSeO9jw3gq88ilsZrT/W2XVKdnX5LW5qpzigCb/F2TZkp28hlOOLO/NRNTx1sv28zdS5BhuefKpE9dsVuSDXuCKPzDU8qZG/cYSOlPT/F2FsF38KUYceo3P4ZSbj56PN1JlaRKNizNKUF+M2r5gSaPzn14f0O67syRdnLkIDlmcIR9Y6JUf535raVCL4eSud5x12km0/YlMcc4XOtG6oWt5CsYlJbojzOR/FUj6c6e7mvYXFoTXJn4dAKMH6fHu52PTYHD1Rf+XELtP1inXWZ9NBH5fluI54r+xi1l42XJc8+iT0b+MkmcU93DzA6ZwuhR2RFYoyFNUXMHUTWnIMN6V2pxDmAUat1eNHOo5DBdjIkG5J51auO9J+E0ZkTU14NIHY3h1Smdh5J/0snF946EHz+SL+xMaidzMpon8n2x3p9Uekp6DiYkBm3rqWp+o4MpMqiyTESdOKVE3zw60tKYDesdd3KaRP5vrc9jw+hLsq9pTBei+y+5hG6esPVGbNjkOUIcOzpO5jIKuR/0rnY3T1cGJH5jD2XD0wN4TvaO2Q39WNx8aoeTug5I+isVeW1pnL46G8aHxGhFYHnHfGO+KYmDrdD3xKY7PlFORZQkSn6bJ+auM5+ew3Mu8Y25O4kh5VxTkRmH00E+KqUr+RYqzeYwce4fvafaTl+It41SieZI2ovZUkyKIpZo8hVTbCL66pSavzLxeloTvpIC1v94Jwny0HhmL+cbGVbNC5dkapz6D+Q32a72M6OZV+49NPf+MrnxjOJoXnn/BAqT73TqHEyuUXLRT6SpPcu0EWYW6B0/pKf1kLO1JE5NMEl24tSuQ8hG8kWDv3aOt3xyg9tMctXLxITPj2daauB8RuL4kU+Mj5w9b53o6zckmUxmvZKe1p+Ye5KnIc/uPejMOnVqp7cD9RdTYzCWGYx7/ym24fN/a3STG51XzBCyDH3RacFj7UuwvidQR+WL3MVgLHkcQ9S6Rafnxh2XHGF/jJMksfPsvUhXilcntT3fb61O67Y0ZMMu4+lKgjdi5L80s/tbnkxLDlxIba7YPCJRnLDVxHUuKZudGdXk2wt5Af+9m4Vkk6tM5Ukzh3RGpu3OZkjduSc2n9o4VzGJGGvPjVNib+lkeg5nYqwNyUV8M7n4XMaYNvxBSoddWhseM+CpE0TDP/8XgJZ37NDRVvZuhP+BFn9opO9Kr4aybEuybCvLtkxgZ9fE0j/oqXPGkmzLkmyr/65MHE/F23NjchLlmGgV5VNHfHQjUld69QMtlpWZ0kEiq6v5xOs2AaY3imJqr8xYeoL0lLMd2VGaamdJgq0/kVzrT5QocTKWuoRW18ovbZmq2Q219FIcmnj3Q5+cE0i1w+i/PF2pwzHrOCtzls3romBlWQ7YfzgJ0TodP5pEbBvsCFqXdvTHifTHMP17dQJty8xH3WdSI29ZMREr4SulqasrbQmG1g9TFPmTJvJjhiRGzbqQuHqZ+HQr99lLLauJq6/MjOgL06OszRMaj/2Quc0/0rItNuyghIgNxaKHqpIcahYCmzh7RTfUlYlfPGmxYXpjajjPaEva4tUNxLIObXv1UlcKFf1EiWJMWe1iw5Tk0AllDwkw4ugnl6YuvVOSpRf35q0s22gcKhFEybYka7DU0lRwpKZ+0WJRwyQ2z8buj0ZVQONHHFpZsyu1hmyYsp6Y3OkEmPKwkwRoGwpf2sSdObSXyeGjlBPKetScaf5GMtXLxOsZZlsY7oyF+rg0sfRCyxJu/GDidQZvRJ3I2wMbQUy0KSs8XBTsbJK91BNN1mkadj+0WCYD2B1cPGMrt/DRl0TCoxD+5RmW+o0ReOaAw0bOrvNtJhJryaxGr5Rss2EnJSWF/5DEtFlhGkNUdanr3g4yL3Ty+CutzmfDiD9azjnLHicQUZIXSkpdrIMJ8Ziz4R9OZJmsZD+RXPOmLnWz9EixUgN6JElMKR5UVgVBOO70kNGy2mKx1bpNdUJF7FM19J1aXVr6YTNkh2IZ5SVA6eMUsIv2xFxuSbZlSbZlSba//MgtpamLld6BDLOFh08qSpSu9GrIjFZPipU8SJchNSyByuYqf7UoYnpkCt8uVnIgZ4IrL6WG3WiCmMSDsC9SIWk/UOIIeemdmjVdUnh41MRuXtyRyO6O/CYnUvMTyUmcubg0Wlr6pEyOzeuHulOsdID0+UqJpyjrRnqqy2yib6kQX3pJB2Z19TDRQcJX2yMZ057jzI00VS8T43Y0p5Y2eiXQyl+miG+3fpmMyVtiiOULCdGks0eo8bT8EXtqeiK55peJT88VyV+ZWF29mygE+qWlWAonLdvk/UuxqBlQ1FB36rM8FRLGY19kltLzSkmp5ZgtlVKYtLKSg6MRmGg49A+ptf7IqYjl1K3s3QgfaGW+PYwgBKsV4q/MyNSvTPziDLeUacqyTSzZVpZt9R9UIksixp4pFj2YxIZ9sRlKd7ZJ2nxq472HbCzVZ0qTl8o5ujECUwaFYsNaPJnAsq1ZQ8uV/mHTk7W+6NUXWhKzsYf/BSB/GZy/TuavqfyJEBudHTEWkb9RQvrI5U+xc/RJ00Cxfyn+JlOaP5mRzNAQUCEmYArXfGofTS5z6cys/82ZnbMMm3PRF+9M9I3cV71MfHhmJYY9BdsFR+dDyHAfHxNL+kIKsfSfTH8FfV/kLpLsmyeKPoaSzYV4DIUlaluC3LNsKXo9v0dm/U9k1vTzgsypZsNG5lsQPKCajUxUvfcl2vy3zuy7zz2008okPmLi5ONHbnmZ3TlPOrk4g7BEzGZWosz/ZnJ4v4oDGP0kYojeA0liTb5zhnADAWfo5mLejuTQ5ImbD+kB7QlzFwJLB+dSf/H2to0t1r4cjTiYGUymhiXIM75IPy/rvBDnNDt5DjEBmT2aMJWG3ZhHLWF6S3rO+LsWffHOetBHPi/NrCtTiw6/a086uQfn4djnbkQsj/+QeyL4rMlz5xiZGhs9TKEei45acm+zX8zMyecwvVhy04bAosen57tW3ce0mdYXpgfPqwBGX63bRe89gGHkCbgE46mcpr15Evm/lfi3Tu7mHcHZV26N22b86txxniFXvUwcz5nw5nlq+q5MfPinxnFsNdEYr8i8CmohnogJfC71aHpG88jqC6lhKU8/R/Kb0HZqgku9Deg7e2YOMZwXdGhC+oolcayKnl+SaX5JnPs7n/iJycXn+tyd53GeiziS4+M0VD8y5/DUDqe5mVfOPZSZTydXTpx8/MhdmXg993AAleaomUNEwJ7KeDXzaUyYL1uSaT4kiDGTBuoV/zM5kGHcz5SdlRzTyJOLfYmR2XHO5NVz5ktTa/6RjG/+Si6bEUnm6Ie8MP/dc1dIgXrVh+k5PHMS/8XUTmdW4ysT/0fvXfSe5IV8HyP3fej5PHbiSy2J6zdR7Rk2jAmEzRuAAAAQAElEQVTpxRHYoTlFDqOde0lTjI2mzFMwCrVuZIecaB8bRo5OgqknnsGk0kkdQ6whsF4G+/Zyjs9RzpFLz0eTQLSfO/5mrmJGR+bct95a5qXnicn9Z2d+e5c/M7mvz7gwPfmOMGcTP5CJ/Aw5Nz6aPb3MpBhL4kIKMXoYSz4iLctJskczl4gm9ouuQuv/pZRXMgAknzSMNbn3pDFh2BoCo4U7EuD97/Yvck37Xsk8agzuNbkvT8qZcDQ9uScd4Z/OpNafSI4ZlBmbmRd95EtqB2lelcycS3TkeWTrV6aGpm36ifM9b5omrE20/Iv8WJkPOBRLdCHnk6FngMamgZcm/x/9eHPPMqOaoTkOmu4vSO3GFOdLSHMncZoTPTID8c5nVoikNaIjiA8yJWkaMPLRF+eunv+LqR2eWYlv3Lv4js5Kjcuw3/tITs/lDZujGfvkEdzUoV/kPtJJ0p2IkEuJMjvVP/l1X+45nBLHmYVNLkPHW+OmGE0thxPwkjY8sAfIh/QkyplhJnBZrVtKSS7pIh3BUfLRH5/8RXNHvp0Mpe5fZER6+knUmY2RSR7nkuob04fT1dmpvfrOYMj0funcmxpkHMbc6m6jd+dk3/43GdS3wJxjDIdiHJvZpFcnRQPWBMwbJ66gdUgnRkymddjeXEMcMJ2eGH21bM2SvJB0ZvDMySfAO++L/5fBUv4kKBbEFH2jlJSymic4SYApf078YlISyQaWbWXZX9Tqk+nSqi9ytt03kqleJl7PENvC8AdK5HHphZyRlN3S0u/09sBG0Om2WFbeIUvvTDH1pUKzO8kHimXygN0BLODoUd2PxMkN+iA6wr+cFqV+Y4TOtL5GatekveUlsybKbunQJ0kp+QupNUX6YFPRkhpLJXtp8c9VicZp9ESX/ehZOsT/Ymq4WLaF4ZZiCNuyjbbyT8QfSqOlk5KsWf8ks9q5tHMCX9obn6S78ZWJ18H98pzfJKEuxcrqRCayxH64EzuqG+qghIgNSUfkWR9a1VoiMKma3PJXN0P1ysQvzlBLsi1Lsi1Lsi1Lsv3qFGRJtmWxTmr1UrrodqL/orcOmZnTRbIWiw3ToROvt29jylK26L+Y2quL1QHD7/BHu5PEQ8yJMkH0SYJqSI/9D9ITmy4pPDxqYk+eWZZkW5ZkW/13cnOGqYSp3UitGkqiLKSGPilTYwO7j579N9t80um+kUr1kjh30SY7Ivk7KZCMJY8LT69Y30yNtE7qfX2frZ7ZzvnoddtKSksbLSFh7NTqWkm9cmm50g+0xCHr848QQ5sS0ZhFm9hVmtqby2qPriSuXibGRaMluf/ESqQqK8uiJcEftBTbRrtC9hMti0Xtm2SVYvP6rG+tNClrK8xScq+UlFrav2iTxLQeKdad1ugL5XSxP1GbX9KCRZCXskVnZlhNUF1aEy8VXvzQJxnJAUuyLUv/2cWyPf0QKdvAd5KzLZKxO8VKCeiN1LzFEq1oid0S+6unnPqNUlLKSv4vT2PqNyZh2WbCxy2jxf5NdTXLhl206Ucyy0BPJNf8hbZJOSfKRLZlMuDO5E731NjdnImELzmcyO4u+8N2mT05SESdnZgUAUYs/NQV5P8iNePTZYnY+FCsUSLXuWIZx761kkjtT9LQOmRGzzzQ3npq+F1Jo30nZyzWjWSql8Q5ZEdL9oUS+uNibbl5yRp9oSQUfnBUdx+55aFvpFa9TIxnoG1huCnGTDyUD5rQCEOxlhw0SmTvTEZdtHxxOrUFG42NNrDYLi6NlkqxcgZ8dATOUfYvO5K/bKaziKBljX2RWvMnpdHSD0mkLYUPmdf8MvG6WG6s7pbuJIEps57pqdGAEUf/4dL0iMUBF5ahVjfMhjd/42Qsk5Xs0H9Qohi7UZbE2UDdpGdSxFo82MaIJxcreZC+7/BJJ4fzHIkN+1CWbUmWbUmWbUmWbWVZDti/2TR5nZ4gXYeLGY1vNGlcePI3Z1b1UhJSlvRKSamLZSIvQZV3V5ghN4pFh0HzkLhtCYlJq5r4h0qSxqVLk8BpdvTNKVVfmXjd39wEs1oJk4KYlG3dpnBx2/lfAIqVPxmC/UsjfzaMwMljBLfUXdOA5S+OPc5fGA8m7MEG/IWyJPPNHiB/sjesSv6qmVO5ZFauz/0fUmueTCzxG5lFuXd9M0kmBTgD0ksE2K/6j662Ub+Rb6peEuduhvIZEdyQRMNuSdAMpokgeZxoC0RvmtJhR8upN5H7knticoc/9iTJK3ZUnphMjoSHT5nfookn0sGhVk4yNwNTOkhtwxT5zUDqeEZvuXkqZWZOPlGz2RgTPZ5ERhzq0J2ZDc8M0JnPZEIsjSeZWA25cQ63GMU1xDtso6j/6MeJZe7JyZLcDykmR6nvKJNbB/MogtTAXX+SE2Ufz9fxMZy46mSil4RYxIxFYHedBJ5nplCyYZ2d/y8ZuSucehWfw6Hp6OzJpuPZaeXM1uYoeoKZTa2XMulK4tbDHdJTp+Zc80viqX80qRqTy1YapfPizGwtqXzVE5N788xM7SQCu83M3Fc/DxL0IByr6oaG2G3saL4wAd+BUY8mgehvmKPE4OW350iKOKfYRyeOJxEydb8gUXqWzE40dxHRzM5dc5IyMRnyBLEc/nDaOjtb2u5shtSVzCOTQUc2Yx71NKR0tHyRBqwPemLuyUec5Hj1hakhP5dUvGy5JKXlZVYz1UQwX9nRxOH8xtzyozMv+Sd2CoW/mNp472GbK/IO5l705MlRYuj8bMTJ04YxJ5porILwwqpoejOkOsGb5r6U8d4DOZKd+5mTaAv9jZKKPklQDS+9HI5i+JEf+fe+vccDvpl7kjuZaZzBuKjWe9Gft9JTDbEePclvQi0HJ4+mVn0yDcmH90paJps8CoEdT2jyqvOm3HOSb/nouaM18hkyZ5PP7GVCPJb6n8xwGjITMHJOjGZe61fSlVzaYJCnkO23PLJJttfmFF486Vxw4zFrmVocmdabR7TGhvWRvDs8vjFxnK/MBE608cKm0Q+kFcvxqTN79E6LxvlhMSrEuffwTGxM8GHH0b9MDY8xofeEoyfa26hFRy25L1Mye7inUk53iG9b7yT94bRnz3FKaY4c5qYWqDxze4P2NPhsjKl4JQWsDzpJkAfHc/iF881pGOfUBLsf+s75onxL88xu5ofbQVPvOchsWue55JATEyQPbjqz03bnVc096WnUgPqNVKqfSCGWy8P8N/gh85oP+8JsHUYr8ewkiP9hZ+sGuTdHrkx8OsXGS9Af6MYIfEcSXexI/nIy2cf7dYT/JD37c/ST87xTE1T/xdTW89DcNyMTZeQ3k1unEbv8BNs7l5KnGos+SU817IX/ID0cZZ87E3z0J2o+cxPwPYPU8ebDZL+YGikem+LTJZc8jVibDrZaQRRendTxljClTTXsRgJiHZu2+Gh+mwS8EWvjhy3w7CszIvqJHMdSPRyZq05n2MRc0p4L2xu93l6a8v+ekOJC3tomwr9IjWPs6ZtoT3J3dNSd6Yz3HrpiH82otIPmE795GlJ7ZArffgy9MvGL53hKJzfg4Y1gfrd4frfw8Oj/k/ir4M3FSk5kIaYsiIlk7EKLPySi/6K3DmXZlmTZVpb9RZLJxAkVftyrl5w1TbYnXxJfmdiSbfyL0uSkH8rk2DiWPWIofdGrH2ixrMyQDhJZXc0Th5RlR1BaWlasG+EwAZ4eZREH00j0rUkddpTQDY8Z8E3bVHA7lOwLpdHShepKWwK6Aw39yGTj4lBod5ccs5BiV8mG6aPp8YunK7UHksJ8OhOIZ7eyXC12K8vKvY2cXQ+aQiyNJ02f22wPSYwWKzmQHFWFyjryiV+9J6gujzMluR+mNXlxzZAAgaU3KVx4pFh3WqMvlNPF/kRtfkmLk/FVE1cvE59u5T57qRB/ZWakfmF6Jfa7i8XYyRuB2RPYV1q2Ux0S22gcE8nYUCySVCU27Jf6LKep0t1VnXidWc2dFIsapvSG/9E74jgDP3oG2Etqme1yIrE+GoEZT8vftGbslYnHU7QntiEz7W9KlkRapfRAb+6LHErGtkSH7eyyLckK7GEEYdIJh2JZv1qs5NWN/cIq9IUijicbqsvqfYmdDf8hCayNTxTJDvmlTY6RSo8k+9DqOtSdlrdacuaXZJpfEgu3o0VofCjWpptDliaYvOXE7O90q905dKem5iuJ0WLRrsNFzrYw3FKtG+GVXh2K9S+KfnVl9gTdZfsIShuNUZBOEjQfSmoslWJFg4+OwGln/7IjabmV2YVqxCwT6+RWfCE1RZ+URks/JJG2FK70NZ/49HaiXujk8Vdaucd+IjnhqUGVmUVOrNVH/mRKeMzZ8JOcQdI6GftKb/5KutPjYUKapNXKSvzKp2JyL550hkMvtTy1pU0ND11axxtLRVt6ZSvKMj0HTRAHzSaOR4SZPXRSsi9M/OqaXi+l0dKFxGKlZyBCIsGJTCTWMLtHca+o2YcWy6rU0lL1E8Uir3UnMLmlS5PAjyHJnU6p8RPJcYxdTy0tZWYCiNFn2f5Qlm1Jlm1l2V9MEt+0pqoXuvnsFotDJmN3l5b2aECK2CmZOLy4NDnphZyRlN3S0uVdWUo2+CGV5p9IIdaHph5xIbNEzXKS7EMEZrRYxmMHE7/40cLMdjwxuVfnVGuSvcMOPNKysvwHTYOpW2Km5QsJqy+csmhNskw87tVLPZFc82FG/IvpWfeHYtlmkmRbWTaM3eipkyMSAvNQrOavlKh2K6XRErxn7LtWNbmTYkUDLVMj1ElqlpQc4cGUFdG8dWplfTQRieyGkvknVmmhul0oIWJDyhGBuAQj74Qn7WhLsmxcOBTLJr4yteiTInrx77MXLZbN7HWVAslJBLE7xbKEdftlM9Sv9OoPezhZi8WG6UGTSvrd05CzvD1hG6MjkvuhWG2gMhSRWD6JwIwndaeTkphtsUK8+oH/178G5q+Th8+fDfPHTjIIjDGrifiLIobmr6apIbAvTYFk/sKY+TdmKjUOUKKvI7+Y3DpNnKCbM+nKrF/mLTidraf3x3cGh6dnde5J7iRzqv9g7sGZwPPoI87MQ985g3kOaXqZTTvnkk+KRCwNT9xmTqYZ1abjMJpwdxoicHrYqy/hpDbBfY1gHwP7DfBbH/khU9uzZGjzNyKwtNG1r+sXJHvRvICmVDIjzN3hRzMhPW2l8sj0HP7Vw23HrFem53TmNF7mvmjYDMTyTL6FzOVttJGn2tx/ZKak/y+mtp5vmJD5BKOJmcFrMOJ5SKqjUzs9aXpizf3qpM8RBNU3crh6ScxF7Gia+S+AzB5NSGVsdXoaduM3oydhnXM/TG6dQflmFOe6fzGzkr8wZ/KZ8cy+8au3byMHGYxNnDsRWAZMDhHLRR8yO4Iu8rVunPiQnuqTUTkBcy/vzYwc6L03nUP0Yu0pk3tzGrD0dvRtVgtcMzzu4hUdNqScM5tJmO4Pt4vhk0cniD5JUP1h7orPu3Jmr/eSiwAAEABJREFUPfek98a8Ac9xLgbdy59e5qTaPPETkzs9c9N3ZeI8AHYWpJ8Q49Zat9WcJ+q3hHgynCJFX3TOl8z9Ji1bnn40QY4DBEZQPSSRA3FmNffA/r65LjX40QiMKcycl2bGq849eM//kxnJTIa1P/ckXlLNVbxoexo1S3SQGqp77kv8Ss6kljtOJnc4U261j2YsFo0T5WGNMufUPJyYEQSpgqueQo6mACfx+XZ0jJkUsYofkuiD0zYx4xB0N4+6sAodtoPgl80wo42wr/8hVXJ8EtdyIvajZ3zSNMVyaMjB+VamTwN54ms+8eGZn/hPdjxdIbPSy2xsZhPkzkfnVPMnd0Y+IecuZBhd1JPDYzn7y7yBR9DdeubgPf9DTpPDGJxzXxrJmOzUY8zFEk0+4g+fwbRvT5CDkNvIMzo90cuU45Hz5un56DZTgjT2G1+ZK9J3ZzJxjsWYlfreU/R15CEX547/5sxp//J7VjW1k8xPzCvynt6RmBnp+rfOYWbMYd4bzcnqBzK7lvn0cLJNfzIH1nOMA7G9CKTGrER9QOI0fjGpqVNA5Nuib2RW9UmuojezJ4+OwDdNJ4KdqRT7JV8kRzP75BOvH/dn9nha6GTYRye3nntS+4upvXnuTe0kc6v3GzJ7nTTP+7zl0L9MzxwiYmD2N733BAyiq9Gx5Zsb877wW/Ogzv/vZEpmcdFnFjksaYZ11I3Uqk9yuG+FHMrX5dAzOUkP7bSkP/rjJGM4p1OmF/toDuadVCf3o5mVHG+bntWZlXxJ7mS6oi9MjUuxuYMgdyIw+q6amSSxHorKsC+S4j1JcjoRIf1EnftDurgjp1pPvB5wWUo4M7BfnYHr3BSjuW3hBJ87mqOpd4V4cnQEKC6pdfvVpEnuWE5VP5ECH5B7Ds8FjRkQ8mrmcJYgmhOp4O1cJl7PvGtvNeevTPzqzGntlzxk7uMRGA2xzB6miMrthOlAMWuqX/rIJ53uK6lhHMv5jiMe5jegHc2BWraLpziHp+dHMyc5wHR6CKIz4iS56pAu4uPby8zH5y2p0/Ci/0/zZ0ImxRBYoskT/WgSmPhrIqZQV42wm5AdpuWL+tbqmqy2umRG81+0PX0l8UnOJfYLJVEWZT3TsoQbf2NqluiYGVZ46B+aDC68fTdGpL5sE/pGo0zSUCzjMf/oZG/uVSc36EOohX/60SPZ97P2odX1JTVV/0FLHLJ8IWH1hfQ0dZLaHFHWpjX0A8kJp4E90cW18QudPA7FYgT9UiiW7ca2pVhp2UZb+SfiD6XR0km1qixnw79JqmbfK3Y0/kqOpUaLnkhZqT0w7boUpy37uFvLbonY+JgjCQ9KiNiQdERQJsB7Hxsm27hYIS6cnJYo2dmbkSXcePiHe2snPWeOWeG6ljY9+GjpRrEsYd0eKVFv5YXePMw9KC0LOQMkWI0kjPy3pzH9NyaBPw4Ti1r3IWGtig3TZ5wToi+0JGZjSxIIG8qyLcmyrSz7m1Iym55YWvpOmizJtizJtvrvldvjKxOvS+KoKBPErNGOkPkn1p1R3uwXIzmTGTpJ1PySuPUym6QkEi4PTQGjIDw1sb6ZGmmd1Pu6nGWi9KSTw206cDtM6wOl6whlpf1DyxHsV/qmR2UnjRFZ70ztzXMqtQeSwiwbl7nA2fEhCWKxvrU2D60uRiwnYV9IaHeT/cWcSk4EkKpoUtehK9hahDc7ki9khkTtpFjRIjtUaglPSqpWV9IJhtYPZcpm9wO1+SUtTsZXTVz9RCv32VcmXtc3M4OcJHupb1LTLIPDCWVH6YtevaTHdprIS9kiHylWWoEujBxN8hAnk3vxpOcg3QiMQEkpK/pPp4iJB2OcQDQwKVfbV0rmn1i/JIkZj5VsmHJk6IToC5lvo3Hh9sQ2lEh9k5xEHpd+KcnSuu/sTHIwHTYxHbalsrsqZZUmhwv/0WIlD1qfjX2SJhL+TrGMx6zOnzC7ZM06SYApja+k0DoUnhjaxJm2tFcnhx/qmWZCmp5oiVmWh8TC7eikvpncuFjbliNy/lnZNXnLEm78YOIX9/bcSA4tVmcShxloWxhuqdZN9lKh2U3dF0qix8qyHLAPRaSuQ1ew2ZtZ2net6EfvYTYsddDeMhu+o4jGqruhLbNr9/DQbi67k0b9g5RpUp9BfKOsat2J0plX1e65MvqFTh5/pZmT+oVefdKynaTYZVsW640p4bH2EXw4kWeCbFPVF706lBC4FLY9m6VoldJJsZIDzWWrZsMU/aeL1Ua6ICaiMQSmLIip+QR4niU2jLwTftGSLNuSLNvKsr+o1SfVaLKfONr21G4kV71MfDrnGy8l2elbSmhcLEuYKCvMZjZLux/0apjmKkth8Eo6Usf3mA6KXNyzScvRlqqXieM9LFbyILngyn+VMiM9MBA83CaD2xcy30Yv/w9i/IWQvX9uvIRH6o1t5S+L+cPk/OUxnfsXR5L9CySpH1IjzZFOWNXbk37RzE2V+3IqM0OG0E+t+ZA5iSmiUsaJopNnBuBMAnqD1GCShIkSLifDhIuOSj5M+sKkOZ07Mn1I1Pwy8Xq+g/YpJBfxwyTwY1h6cu0rW3zejhl/MbXTGdM4T+QNSH7Q7ODQlejlYF93+W2a/9LMnkx25tW6cf6FSa9nJCPozftwotFpeNHpwafaCVWPmjHteCWFWC6l8fu/Z75qfpg2zT3bO3kOTTbBf3DmtGv5Paua2kmaE5Pqfd+kfF6f2kXnWH6TpMIpz37V/UaGDO8V0rEk35mReO9jw3gq08jlYDWn+9suqU4Pj2t8Y06RwDLicCSns1/qGU5qZpO/aSZH462XbebuJcjQ3HFl0qeuOLZ2Iq78f1Kan7xtbBivq3H4ztTePDNTuzEJnO+ZQcSp1zM9OpVhMvEqNixyuhFYmlfzm6XK7MmjifOD9Tek606Ops6ZyUfj1WxY5rw789uTDs4xK5mZRfSj05w87FsgR2njcK0bqRe2kpMcTEv0x5lM/qqRdGdP9zVsLq0Jrkx8OgGW32/OIs7HEvfsF6eRyuaJ/ou1u7Pphh9NVL0kzhX9jZvKxtclP0fZo4s+PdGWczRyefxiQ06RTzyOwBJvpVehYTMQu92Re+IcxKjWur1o5lHJELp4WzQg96xTG+89CacxI6J42iWR8GgMr57u6L+YWjxzwpsfyRd2NrWTORzNE/m+WB+dVHpKeg4mJAZt66lqfqODKTKoskxEnTilRN88OtLSmA3rHXdymkT+b63PY8PoS7KvaUwXovsvuYRunrD1RmzY5DlCHDs6TuYyCrkf9K52N09XBiR+Yw9lw9MDeE72jtkN/VjcfGqHk7oOSPorFXltaZy+OhvGh8RoRWB5x3xjvimJg63Q98SmOz5RTkWUJEp+myfmrjOfnsNzLvGNuTuJIeVcU5EZh9NBPiqlK/kWKs3mMHHuH72n2k5fiLeNUonmSNqL2VJMiiKWaPIVU2wi+uqUmr8y8XpaE76SAtb/eCcJ8tB4Zi/nGxlWzQuXZGqc+g/kN9mu9jOjmVfuPTT3/jK58YziaF55/wQKk+906hxMrlFy0U+kqT3LtBFmFugdP6Sn9ZCztSROTTBJduLUrkPIRvJFg792jrd8coPbTHLVy8SEz49nWmrgfEbi+JFPjI+cPW+d6Os3JJlMZr2SntafmHuSpyHP7j3ozDp1aqe3A/UXU2MwlhmMe/8ptuHzf2t0kxudV8wQsgx90WnBY+1LsL4nUEfli9zFYCx5HEPUukWn58Ydlxxhf4yTJLHz7L1IV4pXJ7U932+tTuu2NGTDLuPpSoI3YuS/NLP7W55MSw5cSG2u2DwiUZyw1cR1LimbnRnV5NsLeQH/vZuFZJOrTOVJM4d0RqbtzmZI3bknNp/aOFcxiRhrz41TYm/pZHoOZ2KsDclFfDO5+FzGmDb8QUqHXVobHjPgqRNEnySohsyZ/568kNz+AXD/Iig4pg3/A63+QZENoz/aH8qyLcmyrSzbMoGdXRNL/6CnzhlLsi1Lsq3+uzJxPBVvz43JSZRjolWUTx3x0Y1IXenVD7RYVmZKB4msruYTr9sElvRGpY6/MmNTvzKxckLX1a7ckyQ89A+pCbep4PaFnLWjRQuUoLqSTnCnZZJmN9TSS9E88e6HPjknkGqH0X95ulKHY9ZxVuYsm9dFwcqyHLD/cBKidTp+NInYNtgRtC7t6I8T6Y9h+vfqBNqWmY+6z6RG3rJiIlbCV0pTV1faEgytH6Yo8idN5McMSYyadSFx9TLx6Vbus5daVhNXX5kZ0RemR1mbJzQe+yFzm3+kZVts2EEJERuKRQ9VJTnULAQ2cfaKbqgrE7940mLD9MbUcJ7RlrTFqxuIZR3a9uqlrhQq+okSxZiy2sWGKcmhE8oeEmDE0U8uTV16pyRLL+7NW1m20ThUIoiSbUnWYKmlqeBITf2ixaKGSWyejd0fjaqAxo84tLJmV2oN2TBlPTG50wkw5WEnCdA2FL60iTtzaC+Tw0cpJ5T1qDnT/I1kqpeJ1zPMtjDcGQv1cWli6YWWJdz4wcTrDN6IOpG3BzaCmGhTVni4KNjZJHupJ5qs0zTsfmixTAawO7h4xlZu4aMviYRHIfzLMyz1GyPwzAGHjZxd59tMJNaSWY1eKdlmw05KSgr/IYlps8I0hqjqUte9HWRe6OTxV1qdz4YRf7Scc5Y9TiCiJC+UlLpYBxPiMWfDP5zIMlnJfiK55k1d6mbpkWKlBvRIkphSPKisCoJw3Okho2W1xWKrdZvqhIrYp2roO7W6tPTDZsgOxTLKS4DSxylgF+2JudySbMuSbMuSbH/5kVtKUxcrvQMZZgsPn1SUKF3p1ZAZrZ4UK3mQLkNqWAKVzVX+alHE9MgUvl2s5EDOBFdeSg270QQxiQdhX6RC0n6gxBHy0js1a7qk8PCoid28uCOR3R35TU6k5ieSkzhzcWm0tPRJmRyb1w91p1jpAOnzlRJPUdaN9FSX2UTfUiG+9JIOzOrqYaKDhK+2RzKmPceZG2mqXibG7WhOLW30SqCVv0wR3279MhmTt8QQyxcSoklnj1Djafkj9tT0RHLNLxOfniuSvzKxuno3UQj0S0uxFE5atsn7l2JRM6Cooe7UZ3kqJIzHvsgspeeVklLLsZOS0JHKslSQUwtiWVN/oDz1R4ps6ktCLIK8lO2urdxjDyMIwWqF+CszMvUrE784wy1lmrJsE0u2lWVb/QeVyJKIsWeKRQ8msWFfbIbSnW2SNp/aeO8hG0v1mdLkpXKObozAlEGh2LAWTyawbGvW0HKlf9j0ZK0vevWFlsRsbEkCYYdJOWXc+r/8IZK/Ba7xF8Kx1YL81ZVc/hTLHwxfNA0U+5fFb3JB8yczgpkdzbnw6jkffSP91cvE/9n3Pq7KOziWT/l430XPjdxTvUx8OAOahT0F77qP7/xslNOWcJmHEKaQsGTCG7k3h+nIIVQP5ZLVhGSzk6g1TluCzF2SopBn3CwAABAASURBVM6eHJ7fo7OJ/zOZNecyilnVbFjGkM2oqCHJvP3wJBtv/ltn9t2ZmF6umnz01Zl2rfFbtO8vphY/5jZm5hs7n0/COrs6G2c6I2+I/g9kxnwzQc6CH02Oaewzf4NFKjhnqXJ04+gvz1v5JNrSEzwxb2Y0Z7EEzAQc/GjOVS+JmcaOpokJyOzRhKk07MY8agnTW9Jzxt+16It31oM+8jw138nYuSc6tYO5J/FfTO3BGYh97kbE8vgPmR2R+4dEtW77Eo4QjZEnYCon2bm31S9m1uTTxhksuWlDYNHj0/Ndq+au9sD8TjOzh0kvqTUfkuJVkaiKC/cewGHyBFyC0c8p2psnkbvi3zq5m3cEZ1+5NW6b8atzx3mGXPUycTxnwpvnqem7MvHhnxrHsdVEY7wi8yqohXgiJvC51KPpGc0jqy+khqU8/RzJb0LbqQku9Tag7+yZOcRwXtChCekrlsSxKnp+Sab5JXHu73ziJyYXn+tzd57HeS7iSI6P01D9yJzDUzuc5mZeOfdQZj6dXDlx8vEjd2Xi9dzDAVSao2YOEQF7KuPVzKcxYb5sSab5kCDGTBqoV/zP5ECGcT9TdlZyTCNPLvYlRmbHOZNXz5kvTa35RzK++Su5bEYkmaMf8sL8d89dIQXqVR+m5/DMSfwXUzudWY2vTPwfvXfRe5IX8n2M3Peh5/PYiS+1JK7fRLVn2DAmpBdHYIfmFDmMdu4lTTE2mjJPwSjUupEdcqJ9bBg5OgmmnngGk0ondQyxhsB6Gezbyzk+RzlHLj0fTQLRfu74m7mKGR2Zc996a5mXnicm95+d+e1d/szkvj7jwvTkO8KcTfxAJvIz5Nz4aPb0MpNiLIkLKcToYSz5iLQsJ8kezVwimtgvugodBjDGlLTm1QmXNGAp5MqwvQiMPu5IgPe/27+YqfQARmVwRlzJvBS5pFl6w8wOOdTKaDKp/+kznxaOMrtHDlLLtGvu0DfSXw0ZxB41fuiTl5npuMxG3t7wpmnCepCWf5Efq3cvaSfifHbeQq3RMr8bQ1MgzZck/x/9dpZ7qjOFGOydmVn10ZFc2jbuoqP3v5KeHO58DoWTiujRlNeZkjQNGLnoi+deCmSm9qSTOzyzEt+4d/Id17cwdmYSTJ5b/ohpxj49CG7q0C9yH+kk6U5EyIOIck+qf3Lf0PnE4eGRE3dYRp3eGjfFkvzo3M1LmnhgD5AP6UmUO4adlI0qc2I4Ii3k6aq+MvF4mvKth3OAFDUGNPfDdpBdMhtbTa7v+ybzml8mfvU9y9De/83Lz5pLmch7OTOCvZmyWe75mzOwbTnFfRlYzYbleFJLGrAmYN44cUUm0EdM1PyF7eU6Gnanr9aNzjDvp8zFKFrRCaJPElT/F2bEzMj9/yczPPZKCpj2r4dXJiVRbGDZVpb9Ra0+mS6t+iJn230jmepl4vUMsS0Mf6BEHpdeyBlJ2S0t/U5vD2wEnW6LZeUdsvTOFFNfKjS7k3ygWCYP2B3AAo4e1f1InNygD6Ij/MtpUeo3RuhM62ukdk3aW14ya6Lslg59kpSSv5BaU6QPNhUtqbFUspcW/1yVaJxGT3TZj56lQ/wvpoaLZVsYbimGsC3baCv/RPyhNFo6Kcma9U8yq51LOyfwpb3xSbobX5l4Hdwvz/lNEupSrKxOZCJL7Ic7saO6oQ5KiNiQdESe9aFVrSUCk6rJLX91M1SvTPziDLUk27Ik27Ik27Ik269OQZZkWxbrpFYvpYtuJ/oveuuQmTldJGux2DAdOvF6+zamLGWL/oupvbpYHTD8Dn+0O0k8xJwoE0SfJKiG9Nj/ID2x6ZLCw6Mm9uSZZUm2ZUm21X8nN2eYSpjajdSqoSTKQmrokzI1NrD76Nl/s80nne4bqVQviXMXbbIjkr+TAslY8rjw9Ir1zdRI66Te1/fZ6pntnI9et62ktLTREhLGTq2uldQrl5Yr/UBLHLI+/wgxtCkRjVm0iV2lqb25rPboSuLqZWJcNFqS+0+sRKqysixaEvxBS7FttCtkv1AsalRFk4bd0TVd11YuqSOzZJYy5ZWSUkv7F22SmNYjxbrTGn2hnC72J2rzS1qwCPJStujMDKsJqktr4qXCix/6JCM5YEm2Zek/u1i2px8iZRv4TnK2RTJ2p1gpAb2RmrdYohUtsVtif/WUU79RSkpZyf/laUz9xiQs20z4uGW02L+prmbZsIs2/UhmGeiJ5Jq/0DYp50SZyLZMBtyZ3OmeGrubM5HwJYcT2d1lf9gusycHiaizE5MiwIiFn7qC/F+kZny6LBEbH4o1SuQ6Vyzj2LdWEqn9SRpah8zomQfaW08NvytptO/kjMW6kUz1kjiH7GjJvlBCf1ysLTcvWaMvlITCD47q7iO3PPSN1KqXifEMtC0MN8WYiYfyQRMaYSjWkoNGieydyaiLli9Op7Zgo7HRBhbbxaXRUilWzoCPjsA5yv5lR/KXzXQWEbSssS9Sa/6kNFr6IYm0pfAh85pfJl4Xy43V3dKdJDBl1jM9NRow4ug/XJoesTjgwjLU6obZ8OZvnIxlspId+g9KFGM3ypI4G6ib9EyKWIsH2xjx5GIlD9L3HT7p5HCeI7FhH8qyLcmyLcmyLcmyrSzLAfs3myav0xOk63Axo/GNJo0LT/7mzKpeSkLKkl4pKXWxTOQlqPLuCjPkRrHoMGgeErctITFpVRP/UEnSuHRpEjjNjr45peorE6/7m5tgVithUhCTsq3bFC5uoyVavqmulPd/AYjmj4fs/Hmw+4UUsP718ov80ZFmkg3yV0XiZKoZcZC/ZZJm33oEPoo+4tho5kQc3cxo/kZ6qqnEEr+RWZSZxj3puegkmRTgFFMjAuxX/UdX26jfOHd1TvJ43sBQfsYIKkk07JYEh8A0ESSPE22B6E1TOuxoOfUmcl9yT0zu8MeeJHnFjsoTk8mR8PAp81s08UQ6ONTKSeZmYEoHqW2YIr8ZSB3P6C03T6XMzMknajYbY6LHk8iIQx26M7PhmQE685lMiKXxJBOrITfO4RajuIZ4h20U9R/9OLHMPTlZkvshxeQo9R1lcutgHkWQGrjrT3Ki7OP5Oj6GE1edTPSSEIuYsQjsrpPA88wUSjass/P/ZSJ3hVOv4nM4NB2dPdl0PDutnNnaHEVPMLOp9VImXUncerhDeurUnGt+STz1jyZVY3L5qaTz4sxUviapN6b25pme2kkE1vsOZu6rnwcJegCOVXVDQ+w2djRfmIDvwKhHk0D0N8xRYvDy23MkRZxT7KMTx5MImbpfkCg9S2YnmruIaGbnrjlJmZgMeYJYDn84bZ2dLW13NkPqSuaRyaAjmzGPehpSOlq+SAPWBz0x9+QjTnK8+sLUkJ9LKl62XJLS8jKrmWoimK/saOJwfmNu+dGZl/wTO4XCX0xtvPewzRV5B3MvevLkKDF0fjbi5GnDmBNNNFZBeGFVNL0ZUp3gTXNfynjvgRzJzv3MSbSF/kZJRZ8kqIaXXg5HMfzIj/x7397jAd/MPcmdzDTOYFxU673oz1vpqYZYj57kN6GWg5NHU6s+mYbkw3slLZNNHoXAjic0edV5U+45ybd89NzRGvkMmbPJZ/YyIR5L/U9mOA2ZCRg5J0Yzr/Ur6UoubTDIU8j2Wx7ZJNtrcwovnnQuuPGYtUwtjkzrzSNaY8P6SN4dHt+YOM5XZgIn2nhh0+gH0orl+NSZPXqnReP8sBgV4tx7eCY2Jviw4+hfpobHmNB7wtET7W3UoqOW3JcpmT3cUymnO8S3rXeS/nDas+c4pTRHDnNTC1Seub1Bexp8NsZUvJIC1gedJMiD4zn8wvnmNIxzaoLdD33nfFG+pXlmN/PD7aCp9xxkNq3zXHLIiQmSBzed2Wm786rmnvQ0akD9RirVT6QQy+Vh/hv8kHnNh31htg6jlXh2EsT/sLN1g9ybI1cmPp1i4yXoD3RjBL4jiS52JH85mezj/TrCf5Ke/Tn6yXneqQmq/2Jq63lo7puRiTLym8mt04hdfoLtnUvJU41Fn6SnGvbCf5AejrLPnQk++hM1n7kJ+J5B6njzYbJfTI0Uj03x6ZJLnkasTQdbrSAKr07qeEuY0qYadiMBsY5NW3w0v00C3oi18cMWePaVGRH9RI5jqR6OzFWnM2xiLmnPhe2NXm8vTfl/T0hxIW9tE+FfpMYx9vRNtCe5OzrqznTGew9dsY9mVNpB84nfPA2pPTKFbz+GXpn4xXM8pZMb8PBGML9bPL9beHg1Z39JEsvR2/8CsH8nZMMkNgxa+Uthtnd6+6As25Is28qyv0gymTihwo979ZKzpsn25EviKxNbso1/UZqc9EOZHBvHskcMpS969QMtlpUZ0kEiq6t54g8jKCXR0OJYEvqQQkR6lBX9F1NbP1qRDY8Z8E3bVHA7lOwLpdHShepKWwK6Aw39yGTj4lBod5ccs5BiV8mG6aPp8YunK7UHksJ8OhOIZ7eyXC12K8vKvY2cXQ+aQiyNJ02f22wPSYwWKzmQHFWFyjryiV+9J6gujzMluR+mNXlxzZAAgaU3KVx4pFh3WqMvlNPF/kRtfkmLk/FVE1cvE59u5T57qRB/ZWakfmF6Jfa7i8XYyRuB2RPYV1q2Ux0S22gcE8nYUCySVCU27Jf6LKep0t1VnXidWc2dFIsapvSG/9E74jgDP3oG2Etqme1yIrE+GoEZT8vftGbslYnHU7QntiEz7W9KlkRapfRAb+6LHErGtkSH7eyyLckK7GEEYdIJh2JZv1qs5NWN/cIq9IUijicbqsvqfYmdDf8hCayNTxTJDvmlTY6RSo8k+9DqOtSdlrdacuaXZJpfEgu3o0VofCjWpptDliaYvOXE7O90q905dKem5iuJ0WLRrsNFzrYw3FKtG+GVXh2K9S+KfnVl9gTdZfsIShuNUZBOEjQfSmoslWJFg4+OwGln/7IjabmV2YVqxCwT6+RWfCE1RZ+URks/JJG2FK70NZ/49HaiXujk8Vdaucd+IjnhqUGVmUVOrNVH/mRKeMzZ8JOcQdI6GftKb/5KutPjYUKapNXKSvzKp2JyL550hkMvtTy1pU0ND11axxtLRVt6ZSvKMj0HTRAHzSaOR4SZPXRSsi9M/OqaXi+l0dKFxGKlZyBCIsGJTCTWMLtHca+o2YcWy6rU0lL1E8Uir3UnMLmlS5PAjyHJnU6p8RPJcYxdTy0tZWYCiNFn2f5Qlm1Jlm1l2V9MEt+0pqoXuvnsFotDJmN3l5b2aECK2CmZOLy4NDnphZyRlN3S0uVdWUo2+CGV5p9IIdaHph5xIbNEzXKS7EMEZrRYxmMHE7/40cLMdjwxuVfnVGuSvcMOPNKysvwHTYOpW2Km5QsJqy+csmhNskw87tVLPZFc82FG/IvpWfeHYtlmkmRbWTaM3eipkyMSAvNQrOavlKh2K6XRErxn7LtWNbmTYkUDLVMj1Elq1TCWGKYsWaq2Tq2sjyYikd32UmmdAAAQAElEQVRQMv/EKi1UtwslRGxIOSIQl2DknfCkHW1Jlo0Lh2LZxFemFn1SRC/+ffaixbKZva5SIDmJIHanWJawbr9shvqVXv1hDydrsdgwPWhSSb97GnKWtydsY3REcj8Uqw1UhiISyycRmPGk7nRSErMtVohXP7Et7aTlw0S2j/9/ACp//MzfMCF/Lc2fFvnzIPaiaaDYvyx+kynNn8wI+nMFvYAKOYJmyYU58868Cedk+3Lmx5nZ3BdzD4Ox+cNoZ9DzF1PD25WZxLn30HfOBbSR5o29qCEblgK5nn8is/MwTqYZ1aYMXU1INjuJwVXT3uTJDbi3Ecz8+LyB7OYOfSe3tL5keOs3IrC00bWv6Rcke9FzVyqZEfYddHw0ExiEUaKjR76ZnsO/apdZx8wfpud05jRe5r5o2AzEeAufgnUWiZA28hX/ncygOUcZz9ufdHLrvacx98DRxPmBMuWJyZ3eQ9yFNferkz5HEVTfyH3VS2KmsaNp7lecnApFLHV0ag275fMvzumkj54yufVMSe6VO7+fxZkwvWVqeOLcUW5PZ1IL1/Oo/L6HH/rODkkqh7lpNYjgGvIxohobtbl18zSOZufuZHcgSD+++UF0hhxM/OZHT2bTw10MJYim9qCpTD21jQCK/rF5YpPTnZmUyKMT8FBsNQlEfsf2bfyk6aSFGcxOfTRjqsOtzWseelPHc0d6npjc6cxsfGXiXAg7A9JDiPGiWrfV3EfEY9jJd1/mXPRJ5lZfSOuWGRFBLYmESwo84si3gIbMau2B+f04gaUv7UMStSrm/5P05I7OI/6bcw9tHOlkSI4bk0sU9hejXKbG+5HdJ7c7zY1eycTUOJx3Ec591U81prWWjXpu5BBZRHb8pnlceoInMiYljgTcPYm8JYmS1HBm04Q1eZJg7ic9MacZGlmN/DACnyJBrILgw0bMYDDG3bw/MxJ9mBKdsfQ+csam3HP0nGRmv+2LuePMp3Y4Z6fGvck9amrNh3Qn5nKMa6P/8M6kfnJn5BMYwKiZgSagizpx8oDURPN2apxh3zxzo/HWH8mU5l9IupcumZjxKO7FRiR4cWa35yRHM5D2c1Zq0cuU45F8SIwRdNMTcfsWGqtfyVFqc2sGjE4UTynMXWHn05yZ0SXF/07mt3/5Paua2km+KzEPOe9LzIx09d4/dQ4zYw7n+Tn2TmbVMp8znKQ/e8QLc2A9xzhQ68axD/uWyj4gtRxYJpw8CUS+LfpG7qk+yTh6mUwr5whmTx6Bjc7bI55IjhnsPZT5hzMUo5J6PS3RVyZe77uI/2Jqb547Ujv5mdWIj6HEm/ItZBAYOoXRHP/SeW/qcIrsb5q5UyVIP7hYfpfKXErwrbk4j/gfvEPox3Ym15OMDngDT0V1dJk0TU2XiegjTlOidzIh93Ckby+TG++55pjyRO7IOaq0dv8ic9LDG1vNjOgb6akO0/XF1HgjNrMJcicCo/+qmU0S66GoDPsiKd6TJKcTEdJP1Lk/pIs7cqr1xOsBl6WEMwP71Rm4zk0xmtsWTvC5ozmaeleIJ0dHgOKSWrdfTZrkjuVU9RMp8AG55/Bc0JgBIa9mDmcJojmRCt7OZeL1zLv2VnP+ysSvzpzWfslD5j4egdEQy+xhiqjcTpgOFLOm+qWPfNLpvpIaxrGc7zjiYX4D2tEcqGW7eIpzeHp+NHOSA0ynhyA6I06Sqw7pIj6+vcx8fN6SOg1vuiOofzGZnL/9LwDpEX8mxKWQPxCWmj8XqlqWbUmWbWXZX9S3Tpc2+0XOtvuLtqe/JD7J+cR+oSTKoqxnWpZw429MzRIdM8MKD/1Dk8GFt+/GiNSXbULfaJRJGoplPOYfnezNverkBn0ItfBPP3ok+37WPrS6vqSm6j9oiUOWLySsvpCepk5SmyPK2rSGfiA54TSwJ7q4Nn6hk8ehWIygXwrFst3YthQrLdtoK/9E/KE0WjqpVpXlbPg3SdXse8WOxl/JsdRo0RMpK7UHpl2X4rRlH3dr2S0RGx9zJOFBCREbko4IygR472PDZBsXK8SFk9MSJTt7M7KEGw//cG/tpOfMMStc19KmBx8t3SiWJazbIyXqrbzQm4e5B6VlIWeABKuRhJH/9jSm/8Yk8MdhYlHrPiSsVbFh+oxzQvSFlsRsbEkCYUNZtiVZtpVlf1NKZtMTS0vfSZMl2ZYl2Vb/vXJ7fGXidUkcFWWCmDXaETL/xLozypv9YiRnMkMniZpfErdeZpOURMLloSlgFISnJtY3UyOtk3pfl7NMlJ50crhNB26HaX2gdB2hrLR/aDmC/Urf9KjspDEi652pvXlOpfZAUphl4zIXODs+JEEs1rfW5qHVxYjlJOwLCe1usr+YU8ktqYomdZG3Gs3W4oSf/Ui+kBkStZNiRYvsUKklPCmpWl1JJxhaP5Qpm90P1OaXtDgZXzVx9ROt3GdfmXhd38wMcpLspb5JTbMMDieUHaUvevWSHttpIi9li3ykWGkFujByNMlDnEzuxZOeg3QjMAIlpazoP50iJh6McQLRwKRcbV8pmX9i/ZIkZjxWsmHKkaEToi9kvo3GhdsT21Ai9U1yEnlc+qUkS+u+szPJwXTYxHTYlsruqpRVmhwu/EeLlTxofTb2SZpI+DvFMh6zOn/C7JI16yQBpjS+kkLrUHhiaBNn2tJenRx+qGeaCWl6oiVmWR4SC7ejk/pmcuNibVuOyPlnZdfkLUu48YOJX9zbcyM5tFidSRxmoG1huKVaN9lLhWY3dV8oiR4ry3LAPhSRug5dwWZvZmnftaIfvYfZsNRBe8ts+I4iGqvuhrbMrt3DQ7u57E4a9Q9Spkl9BvGNsqp1J0pnXlW758roFzp5/JVmTuoXevVJy3aSYpdtWaw3poTH2kfw4USeCbJNVV/06lBC4FLY9myWolVKJ8VKDjSXrZoNU/SfLlYb6YKYiMYQmLIgpuYT4HmW2DDyTvhFS7JsS7JsK8v+olafVKPJfuJo21O7kVz1MvHpnG+8lGSnbymhcbEsYaKsMJvZLO1+0KthmqsshcEr6Ugd32M6KHJxzyYtR1uqXiaO97BYyYPkgiv/VcqM9MBA8HCbDG5fyHwbfSMC27SmqvLP/38A5q+E+Ytj/jAZ8kdG5U+W+cvhh0RToKUnaF8eeU7FJkt/BH7X/CWTHEM4Tw9nWy+pndwaRbJpx4mi25M63llD0p2ZjbZUEi4nw4SLjko+TPrCpDmdmZk+JGp+mXi9v1VjNoyOWrdTJ8CPYczPre1pQO3GiuftmPEXUzudMY25LUTyg2YHe++Bg63SX15+myfNzOnIzoBaN77yhUmvZyQj6OW+5IhGV0TxTmpEY3NP9s0yYtSjZgwNnfFMGmK5lIbv/56d3Fqb8gSuIab3HDrZZP6D79njTGdz7EZ6qsOtEfa+b1I+Rn2zIy7JHOXxOYH3y5apRIfpuJAQS3ImIbC7TgLvfWwYT2UeuTRWc7q/7ZLq9Dy8IMfilOjOhPFD35jhJGY2fTfNLdF462WbuXsJcknvY8MYkiSOwAiudmSuTPziSf9cwLzml4nf/OcsjXxHH3kwPaczs3E66I1cr2LDminZsDTPKWaO5rdLVzSeH6y/IV13cjR1eicfjVezYZn37nPP7JxjVuKZRfSjMzB52LdAhtPG4Vo3Ui9sJSc5mJbojzOZ/FUj6c6e7mvYXFoTXJn4dAIsv9+cRZyPJe7ZL04jlc0T/Rdrd2fTDT+aqHpJnCv6GzeVja9Lfo6yRxd9eqIt52jk8vjFhpwin3gcgSXeSq9Cw2Ygdrsj98Q5iFGtdXvRzKOSIXTxtmhA7lmnNt57Ek5jRkTxtEsi4dEYXj3d0X8xtXjmhDc/ki/sbGoncziaJ/J9sT46qfSU9BxMSAza1lPV/EYHU2RQZZmIOnFKib55dKSlMRvWO+7kNIn831qfx4bRl2Rf05guRPdfcgndPGHrjdiwyXOEOHZ0nMxlFHI/6F3tbp6uDEj8xh7KhqcH8JzsHbMb+rG4+dQOJ3UdkPRXKvLa0jh9dTaMD4nRisDyjvnGfFMSB1uh74lNd3yinIooSZT8Nk/MXWc+PYfnXOIbc3cSQ8q5piIzDqeDfFRKV/ItVJrNYeLcP3pPtZ2+EG8bpRLNkbQXs6WYFEUs0eQrpthE9NUpNX9l4vW0JnwlBaz/8U4S5KHxzF7ONzKsmhcuydQ49R/Ib7Jd7WdGM6/ce2ju/WVy4xnF0bzy/gkUJt/p1DmYXKPkop9IU3uWaSPMLNA7fkhP6yFna0mcmmCS7MSpXYeQjeSLBn/tHG/55Aa3meSql4kJnx/PtNTA+YzE8SOfGB85e9460ddvSDKZzHolPa0/MfckT0Oe3XvQmXXq1E5vB+ovpsZgLDMY9/5TbMPn/9boJjc6r5ghZBn6otOCx9qXYH1PoI7KF7mLwVjyOIaodYtOz407LjnC/hgnSWLn2XuRrhSvTmp7vt9andZtaciGXcbTlQRvxMh/aWb3tzyZlhy4kNpcsXlEojhhq4nrXFI2OzOqybcX8gL+ezcLySZXmcqTZg7pjEzbnc2QunNPbD61ca5iEjHWnhunxN7SyfQczsRYG5KL+GZy8bmMMW34g5QOu7Q2PGbAUyeIPklQDZkz/z15ITnk/MYEK/MyFHX2/i8A+xdBNkz5s+CdVv9yyIZRj/aHsmxLsmwry7ZMYGfXxNI/6KlzxpJsy5Jsq/+uTBxPxdtzY3IS5ZhoFeVTR3x0I1JXevUDLZaVmdJBIqur+cTrNgGmF0oUU3ulWPSwKz36rCN7ZKo7iww89A+pCbep4PaFPRotWqAE1ZW2BHdaJml2Qy29FM0T737ok3MCqXYY/ZenK3U4Zh1nZc6yeV0UrCzLAfsPJyFap+NHk4htgx1B69KO/jiR/himf69OoG2Z+aj7TGrkLSsmYiV8pTR1daUtwdD6YYoif9JEfsyQxKhZFxJXLxOfbuU+e6llNXH1lZkRfWF6lLV5QuOxHzK3+UdatsWGHZQQsaFY9FBVkkPNQmATZ6/ohroy8YsnLTZMb0wN5xltSVu8uoFY1qFtr17qSqGinyhRjCmrXWyYkhw6oewhAUYc/eTS1KV3SrL04t68lWUbjUMlgijZlmQNllqaCo7U1C9aLGqYxObZ2P3RqApo/IhDK2t2pdaQDVPWE5M7nQBTHnaSAG1D4UubuDOH9jI5fJRyQlmPmjPN30imepl4PcNsC8OdsVAflyaWXmhZwo0fTLzO4I2oE3l7YCOIiTZlhYeLgp1Nspd6osk6TcPuhxbLZAC7g4tnbOUWPvqSSHgUwr88w1K/MQLPHHDYyNl1vs1EYi2Z1eiVkm027KSkpPAfkpg2K0xjiKoudd3bQeaFTh5/pdX5bBjxR8s5Z9njBCJK8kJJqYt1MCEeczb8w4ksk5XsJ5Jr3tSlbpYeKVZqQI8kiSnFg8qqIAjHnR4yWlZbLLZat6lOqIh9qoa+U6tL/zuILwAAEABJREFUSz9shuxQLKO8BCh9nAJ20Z6Yyy3JtizJtizJ9pcfuaU0dbHSO5BhtvDwSUWJ0pVeDZnR6kmxkgfpMqSGJVDZXOWvFkVMj0zh28VKDuRMcOWl1LAbTRCTeBD2RSok7QdKHCEvvVOzpksKD4+a2M2LOxLZ3ZHf5ERqfiI5iTMXl0ZLS5+UybF5/VB3ipUOkD5fKfEUZd1IT3WZTfQtFeJLL+nArK4eJjpI+Gp7JGPac5y5kabqZWLcjubU0kavBFr5yxTx7dYvkzF5SwyxfCEhmnT2CDWelj9iT01PJNf8MvHpuSL5KxOrq3cThUC/tBRL4aRlm7x/KRY1A4oa6k59lqdCwnjsi8xSel4pKbUcOykJHaks4qJkw0RD6o+k1vwjpyKWU7eydyN8oJV77GEEIVitEH9lRqZ+ZeIXZ7ilTFOWbWLJtrJsq/+gElkSMfZMsejBJDbsi81QurNN0uZTG+89ZGOpPlOavFTO0Y0RmDIoFBvW4skElm3NGlqu9A+bnqz1Ra++0JKYjS1JIOwwKaeMW1m2ZQLbS538v/x5sH8ZZMP4syB/hc0fEhHYahKI/mXxm/w9sfmTOcIMDQEVYgKmcN2n9tHkMpfOzPrfnNk5y7A5F33xzkTfyH3Vy8SHZ1Zi2FOwXXB0PoQM9/ExsaQvpBBL/8n0V9D3Re4iyb55ouhjKNlciMdQWKK2Jcg9y5ai1/N7ZNb/RGZNPy/InGo2bGS+BcEDqtnIRNV7X6LNf+vMvvvcQzutTOIjJk4+fuSWl9md86STizMIS8RsZiXK/G8mh/erOIDRTyKG6D2QJNbkO2cINxBwhm4u5u1IDk2euPmQHtCeMHchsHRwLvUXb2/b2GLty9GIg5nBZGpYgjzji/Tzss4LcU6zk+cQE5DZowlTadiNedQSprek54y/a9EX76wHfeTz0sy6MrXo8Lv2pJN7cB6Ofe5GxPL4D7kngs+aPHeOkamx0cMU6rHoqCX3NvvFzJx8DtOLJTdtCCx6fHq+a9V9TJtpfWF68LwKYPTVul303gMYRp6ASzCeymnamyeR/1uJf+vkbt4RnH3l1rhtxq/OHecZctXLxPGcCW+ep6bvysSHf2ocx1YTjfGKzKugFuKJmMDnUo+mZzSPrL6QGpby9HMkvwltpya41NuAvrNn5hDDeUGHJqSvWBLHquj5JZnml8S5v/OJn5hcfK7P3Xke57mIIzk+TkP1I3MOT+1wmpt55dxDmfl0cuXEyceP3JWJ13MPB1Bpjpo5RATsqYxXM5/GhPmyJZnmQ4IYM2mgXvE/kwMZxv1M2VnJMY08udiXGJkd50xePWe+NLXmH8n45q/kshmRZI5+yAvz3z13hRSoV32YnsMzJ/FfTO10ZjW+MvF/9N5F70leyPcxct+Hns9jJ77Ukrh+E9WeYcOYkF4cgR2aU+Qw2rmXNMXYaMo8BaNQ60Z2yIn2sWHk6CSYeuIZTCqd1DHEGgLrZbBvL+f4HOUcufR8NAlE+7njb+YqZnRkzn3rrWVeep6Y3H925rd3+TOT+/qMC9OT7whzNvEDmcjPkHPjo9nTy0yKsSQupBCjh7HkI9KynCR7NHOJaGK/6Cp0GMAYU9KaVydc0oCl8P/+n8gjsKvufy/e85+YqfQCRmRQRl6ZN7e6Txqd2e3ibDKjyUT/6TOflt53JzVuueUOfWNv3PMbpx7ncDMnLzNbR6fGU5E7Y3JvmiaMAzk3Texvmt+qfUvaiDiffe9JSM+ABmwaeHny/9Hzm/OQDMWxnGPoYkbSMDqzKUYHBylSyeHJPGlyGXbcF06Kh8duzrTqKxOv5xYOoxjZ/ZfpOTyzEt/Y55INmZFaZp5M7t/OxdinD9GZv+Se/GaZPx3sCHL5LVL9k30b/RfmjjgpjqfWYcTheGvcFEvho+kn+XontfaHHOILkdk5V+tGdQkQec70VdN/MvF4mnLv4RwgRY0Bzf2wHWSXzMRWk+v7vsm85peJX33PMrT3fzM/ZXIwlzKR93JmBHszZbPc8zcZRA+WoLOyVbNhOZ7Uci9PIWHZgPrcfWnuzEPne0hg9HeHtW7zZuahdlaamJlE8icJqv8LM2pmHPeHnORZ5OeK3s1I/Z/4q6BM9oFJKcUGlm1l2V/U6pPp0qovcrbdN5KpXiZezxDbwvAHSuRx6YWckZTd0tLv9PbARtDptlhW3iFL70wx9aVCszvJB4pl8oDdASzg6FHdj8TJDfogOsK/nBalfmOEzrS+RmrXpL3lJbMmym7p0CdJKfkLqTVF+mBT0ZIaSyV7afHPVYnGafREl/3oWTrE/2JquFi2heGWYgjbso228k/EH0qjpZOSrFn/JLPaubRzAl/aG5+ku/GVidfB/fKc3yShLsXK6kQmssR+uBM7qhvqoISIDUlH5FkfWtVaIjCpmtzyVzdD9crEL85QS7ItS7ItS7ItS7L96hRkSbZlsU5q9VK66Hai/6K3DpmZ00WyFosN06ETr7dvY8pStui/mNqri9UBw+/wR7uTxEPMiTJB9EmCakiP/Q/SE5suKTw8amJPnlmWZFuWZFv9d3JzhqmEqd1IrRpKoiykhj4pU2MDu4+e/TfbfNLpvpFK9ZI4d9EmOyL5OymQjCWPC0+vWN9MjbRO6n19n62e2c756HXbSkpLGy0hYezU6lpJvXJpudIPtMQh6/OPEEOb0v+n5IyyXVdyHAv0/OecvQFSsmRL577SCcYmQAZD9s3OD3euIptl0SZ2lab2FrLaoyvJq5fJCdFoSe6feJKpyspj0ZLkD1rK2ka7QvYLxUONqmjSQeVBsJJtaOq6PkfHkllK1yslpZb2L9qYLG1EiudOa/SFcrrYn6j1l7SwIvClbNGZGVaTVJfW5EuFlzj0SUZywJJsy9J/DvHYnn6IlG3gO/FsCzPrTvGkBPRGat5iiVa0xG6J/TVSTv1GKZbyxP8r0pj6jTEs20z4hGW02L+pPnXZWBdt+pHMMtAT8epfaBvLOVEmsy3jgDvjneGpsbueyUQsOZzM7i77w3aZPR4ko85OjkXCIhdx6gr8v0jNxHRZIjcxFM8o4XWueEywvrVipPYnaWgdMqNnHmhvPTXirqTRvpMzFs+NONVL8hyyoyX7Qgn9CfFsub5kjb5QEoo4OKq7D2956BupVS+TExloWyzCFLNMPpQPmtQIQ/EsOWiUcO+Moz60fHE6tQUbzRptYLFdQhotleLJGfDREQRH2b/WYf6yTmeRQcua9UVq9U9Ko6UfYqQthQ+ZV3+ZfEM8bq7ulu7EYCmznump0cAij/4jpOkRDwdcWIZa3TQbUf/GcSzjSnboPyhRzLpRlsTZQN2kZ1JktXiwjRFPIZ74IH3f6ZOOR/A6EhvrQ1m2JVm2JVm2JVm2lcdywP7N2vg6I0m6jhAzmt9obEJE/Fswq3opCSlLeqWk1MVjMi9BlXdXmCE3iocOg/qQvG1JybFVTf5DxaRx6dIYBM2OvgWl6iuTb/ibazCrlTAWZEnZNmwKl7DREi3fVJ8ta6r6oqv7vwDk58D8bEiI4LdCFj8XZsUYj6b8koiBn4bYS2r1T0ZRH6x76PkVMqqn+Rnyl/TUp5KV/I3cQbl3fDMmkwKCAeklA+xX/UdX26jfyNtXL8lzN0Pnu0GTUMxCsJKlPoxB9NC8TfbWmlC7sWK2ozSKI2scs54Y74icS35jxGfUvOdFT3ltvovqJ/IuzG7lJHNyMqWD1DZNcb6q1ImM3nL9NIxmKnX2HCUqyvHQVT1B1knLeNEwbaSZCfaOq09DVhpOckM1zMTkS1quh+Nm7P8hOoH+ZWdHRhPVV24Nqy9fxtsA50uk9qM/5mTZJ/Lp+DCcuOo40UtSVsRcg2DddQyir05Xycbq7Pz3SO4KczD86DqcujL5bzDs8xVw3+hJMvOjmd7Ll+Sth9PU+zKsp9lYvbCkp2RjoT6LiSuOSngJ7vgMwmedOrdG/xWZnvpJBOs2I3Ne4zxI0oNwVlU3NGTdxo7mEybhc7CoR2Mg+h3mKDng68Mn+fHxsqbKCETyBOm+OXMR2eOfZHZzmJPBaJo5Wc3GokxlDvMu1MlZ+F3dfnWdTOJAWqKZg3OosEW8VG96jKt1tC5pYPWFnsjM1k5yrB/mwtSQn0sqXrZcktLyMqtONRnMp+xo8vD279YWNkalDOY1Se66U+JmxAvTM5GmZowOv3VmU7rdVa9mvgFOkbNHcLzizqr47Xp5J+z2hR3VJHdN0p33YE7SLfQ7ihV9kqQaXno5HMXwwx/59769vNv0fenck9rJdNHD4qKu3ov+vCs91ZDVoyf5jqjl4PhoatUn0xA/vFfSMm58FIJ1vELNq8475Z6TfJaPnjtaw8+QORs/s5dJiazU/2SG05CZgJFzYjTzWr+Srnhpg0FeBbef5ZE12V6bU3iJ2LngxmPWMrUEMq23iGiNjdWX5L3D4zMmT/ApM4ETbbywNvqBtLJyfOrMHr3Togm+WBYV8tx7RCY2J/mw4+hfpkZkMaH3hKMn29uoRUctuS9TMnu4p1JOd0hsW+/E/nDas+c4pTRHDnNTC1Seub1Be5p8NsZUvJICqy90kiQvnMjhF85nTsMEpybZ/dB3zifKZ6nP7Do/3A6aes9BZtM6r4uHnJwkPrjpzE7bnVc196SnWRPqN1KpfiKFrFwe5t/gh8yrH/YNs3UYreSzY5D/Y52tm+TeHLky+RkUmy9Bv6AbI4gdSXZZh/nLcbJP9NOR/pP07NfRj5zXOzVJ9V9MbSMvmvtmZLKM/Ga8DRpZl69ge+dSfKpZ0SfpqYa98B+kh6Psc2eSj/5k9TM3CZ9nkDpRP4z7xdSweNkUny65+DSy2nSw1Qqy8BpYx7uEKa3VtBsGZHVs2hKj+W6S8I6sNn7YAq99ZUZEP5HjrFSPQOaqMxg2OZe058L2Rm+0l6b89wkWF/KubSL9i9Q4xp6+yfYkd0dH3ZnORO+hK+ujGZV2UD/5W6QhtUem8B3H0CuTv0SOp3RyE168Gcz3lsj3Fh5RzdlfYrJyFOTNg0f2fwHYXwrZWBIb64teDWXZlmTZVh77i5hxEqQKP+HVS86aJtvjl+RXJrdkm/iiNJ70QxmPjWPZI4bSF736gRaPlRnSQTKrT33yDyMoxWjaLYY4LmVLTZZK8dDDLr1Rn+dowWl6zIBv2qZC2KFkXyiNli5Un7QloTvQ0I+MmxCHQru75CwLKXaVbCx9ND1+iXSl9kAsls9gAvnsVh5Xi93KY+XeZs6uB00hK40nTZ/bbA8xRosnHohHVaHyHH7y1+gJqsvjTIn3w7TGF9cMSRCs9MYiRESK505r9IVyutifqPWXtDiOr5q8epn8DCv32UuFxCszI/UL0yux30M8jB3fCJY9iX2lZTvVIbmNJljCzBqKB5OqxMb6pT6P01Tp7qpOvsGseifFQ42l9Ib/MTriOAM/egbYS2qZ7XIy8Xw0gmUiLX/TmrFXJqep6A8AABAASURBVJ9I0Z7chsy0vylZErZK6YFe74scimNbosN2dtmWZAX2MII0dtKheKxfLZ746sZ+YRX6QpEn4obqY/W+5M5G/BCD1cYnCrNDfmnjMVLpkWQfWn0OdaflrZac+SVO/SW5CDtapCaG4lm7HrI0yfiWk7O/061259CdmpqvJEeLh3YdITzbYhGWurqRXunVoXj+RdGvPpk9SXfZPpLSRrMoSCdJ6oeSmkuleKLBR0cQtLN/rcO03MrsQjVjlsl1ciu+kJqiT0qjpR9ipC2FK331k5/RTtQLHZ94pZV77CfiiUgNqswsPPGsPvyTKRFZzkac5AyS1nHsK73+lXSnx8OkNEmrlSf5K5+K8V4idoZDL7U8taW1hocureMdS0VbemUrymN6DpokAeomT0SEmT10LNkXJn8NTa+X0mjpQnLxpGcgUjLByUwmnmF2j+JeUbMPLR6rUktL1U8UD742nMR4S5fGII4h8c6g1PyJeBxj11NLS5mZBLLos2x/KMu2JMu28thfjEmsranqha6f3eLhkHHs7tLSHg2wyJ2SycNLSONJL+SMpOyWli7vylLc4IdU6j+RQlZfNPWIC5klapZjsg8RLKPFYyLrYPKXOFqY2Y4nxnsNTrUm2TvswCMtK4//oGkwdUvMtHwhafWFUxatMcvkE1691BPx6ocZ8S+mZ8Mfisc2kyTbymPDrBs9dTwyIVgeiqf+lRLVbqU0WoJ3x75rVeOdFE800DI1Up2kVg2zksOUJQQrPLXyWId2eoihmomn2hp9o4SZNaQWEYihLHwnPWlHW5JlEyKgeGzyK1OLPimyl/g+e9HisZm9oVIgnkSSdad4LLG6/bIO9Su9+sMejmvxsLH0oLFiv0cacpZ3T9rG6Ih4PxRPG6gMRSYen0SwTMS607EkZls8IVH9xLa0k5YPk9nZpewNNtZHS+r/ArC/FLKx+JGUX1OTEP1l8Zv8jlj/ZI70t0p+mFwyOFkCk87pic7ZX86d7LSz753tPfOdweHxV+eueCdznhq3cjQ7M7/0uDlBjf7oND8ybfRwB81ZGXYhhaycfyIz08wEzmVvU4auJk1P8ETa76U1uK8ZzPxEvpfwiEPfmWs5mZWzDG/9RgRrynlnBO/GEZKrxqEpTmaEuTv86LmPNkpUeuSb6Tniq5Z7OYw75590vDOY03yZ+6JhHchiFh+F1ffECGnDr/jvZAbNOcr4vCVG3/dC0mP1ngrugaPJOcMAFnmmXXXyM3qIPla9Xx37HEFSfePccdw9b50dn+Zk85miuYezs1anp2m3tF6C07GPnjLeBoNyL4oz3b/IfTnTj5U6OmeiE5l94/ZczyQnGMyiTp47EawMGA+RxQXRM5TqaCTXZqGzqHSxUeME+/p0jWbnrrg7GKSfWH8QzfEIUo73yDNpYDEoK4forYEektTvZ2QIbzGanIQ9fRwj2xWRFE53ZrSLd2KNHwPRuV+Ml+i5rUXPkZn50YzjRWjjzq01w8f8PUNP/RemdsbOYEjvK+PlQph76mUbjcW6au7B6WcJiTjt5p47mZs6x8dHk28bIyLiDfNOtNM6mobNo4kUP4dzcOr4PYuDMXv7mnbL6cz7J3OO6Lx/ktvaM8xFSN4muipXovmGuJidnBo7svt4u3O42Ss5mxqH836kM7/6qca01rJRz40cwkVkJ2563zlI7zcZE4sjAXePkXeJUWINZzZNrJonSeZ+7Mk5zdDIauSHEcQUSbIqSD5sxgwGs7ib98+MZB+mRGdWeh85Y1PuOXpOMrOf7Yu54/RTO4KzU+PeeI+aWv2Q7uRczuLa6D+iM6mf3Bn5CAxg1MxAk9BFnTw+wJps3p0aZ9jXZ2400fojmVL/hdi9dMnEjEdxL2tEkpdgdntOcjQDaT9npRa9TDkRyQfJYgTd9ETcPguN1a/kKLW5NQNGJ0ukFOausPNpzszokuJ/J/Pbv/yeVU3tJJ8rOS9y3pecGenqvX/qHGbGHM7r59g7mdWV+ZzhJP3ZI16YAxs5xoGubhz7cN5lWimw+iLDpt0yhMhni76Rw9UnmU4vk2nNIHQEsTadCPZWMX/J56pPJbwEQ1lbr8/8H8bbyD0Z8xdTe4vMTu0kc6v3M2T2Bva+Gz30H/qX8/40U5rDODn0oPeeYKrNjm2+e1TuK5gHMzsoU/vPwan25nWOWXis2LgdeSO16pM5l08EOZQsh57JSXr4aLSkP/oTmFkEp1Oml/XRHMx3QHW8H82seLzb9KzOrPgl3sl0RV+YGpey5g6S3Ilg0XfVzMRk9VBUhn0Ri/eJyelkpPSTde4P6eKOnGo9+UbAZSkRzGD96gzc4KYsmtsWTvK5ox5NvSsk4tERoLikq9uvxsbcsZyqfiIFPkDuOSIXNGdAyFszh7Mk0ZxIhWjnMvlG5l17qzl/ZfLXYE5rv+RF5j5egkVDVmYPU0TldtJ0oJg11S99+LHTfSU1FsdyvuPIh/kOaEdzoCvbJVKcw9Pzo5kTDzCdHpLojDiJVx3SRX589jLziXmX1Gl40x1B/Ytxej7+EZhMy1sQyfIDYH4lNB2QlUR2jaV+qdQvvuYZV1tdMqv+F21PX0l+knPJ/UJJlEVZz7QsESbemJolOmaGFR76h8YhRLTvxojUl21C32iUMQ3FYyLLPzruLbzq5CZ9EWrhn3H0SPb9rH1o9fmSmqr/oCUOWb6QtPpCemqdpDZHlGdtDf1APBE0sCe7hDZ/oeMTUDyMoF8KxWO7uW0pq7Rso638ifxDabR0Uq0qj7MR38Tqsu8VO5p4JcdSo0VPpKzUHph2XYrTln3CrWW3RG5iliNJD0qIrCF2RFAmIXofG0u2CfGEhAg8LVGys9eRJcJE+Ed4ayc9Z45Z4YaWNj3EaOlG8VhidXukRL2VF3p9mHtQWhZyBkiwGkka+e9IY/pvjEE8DhMPte5D0q4qNpY+45wUfaElMZu1xEDYUJZtSZZt5bG/KcVZe3Jp6TtpsiTbsiTb6t8rt8dXJt+QxFFRJsmyRjtC5k88d0Z53S9GciYzdJKs/pK89TKbpBhJl4emwKIgIjXxfDM1bJ3U+3M5y0TpSccjbDoIO0zrA6XrCOVJ+4eWI9iv9E2Pyo7NIrPemdpb5FRqD8RiWTYhc4GzE0MMcvF8a60PrT6MWI5hX0hqd5P9xZyKt6QqmtQHv7qC7SbQXYf5QmZI1E6KJ1q4Q6WW9KSkavWJnWRo/VCmbHY/UOsvaXEcXzV59ROt3GdfmXxD38wMPEn2Ut+kpnkMjiCVHaUvevWSHttpwpeyRT5SPGkFujByNOYhTsZ7idhzkG4Ei0SxlCf6z6DIEi/M4gSiibFcbV8pmT/x/BKTZSKrZGMpR4ZOir6Q+TaaEGFPbkMJ65t4Ej4h/VKSpQ3f2Zl4MB02OR22pbK7KmWVxiNE/GjxxAetz8Y+pslEvFM8JrKszp80u2TNc5KEpTS+kkLrUERyaJNn2tJeHY841DPNhDQ90RKzLA/JRdjRsb4Zb0I825Yjcv6s7BrfskSYOJj8Jbw9N+KhxdOZ5GEG2haLsNTVTfZSodlN3RdKosfKYzlgH4pMfQ5dwWavs7TvWtGP0cNsrNRBe8tsxI4im1XdDW2ZXbuHh3a97I6N+gcp06S+BvmNsqp1J0qnr6rdc2X0Cx2feKWZk/qFXn3Ssh1T7LIti+eNKRFZ7SP5cDLPBNmmqi96dSghCClsezZL0Sqlk+KJB+plq2ZjKfrPEE8b6YIskc1CsJQHslQ/CZHXEhsL30m/aEmWbUmWbeWxv6jVJ9Vs3E8ebXtqN+JVL5OfwfnmS0l2+pYSmhCPJZYoK8xmNku7H/RqmOYqS2HwSjpSJ/aYDgov4dmk5WhL1cvkiR4WT3wQL7jyX6XMSA8MBI+wcQj7Qubb6BsRrLU1Vb3Q9bNbmv8FID8H8kslvwjyCyEJP0ImiQ5x+PWR3vXRPQAPP0ViuvHJs+6aeTWH+XWydWbEGU2G2TzkHsq99yQzmkPKWdT3zp5JYTUpE9mjKZKNzh4dYjIlql1N8G+kUr1MvpF35fgU4kX8MAaRF8916fmTLT5vx4y/mNoZjGmeV+QdkP3CYN8dHq+Ttotcm+8iJmpOf2kOjZOdjq5uc6Jpt4+O3MhoRlDL+xFko9PwotNDTLUTqh41Y9rxSgpZuZTGfifofkcwn6p5bqAHi2u6f5gaZ//b2rPHGWb23I30VIdUk5P2Pb5J+Rj1zRzjJdNB9JOUbKyPnix7hufEhaSsmDMewbrrGETvY2PxqszDS2M1p/vdLqlOz75JWutV5xQJa/y7xmZKdvwMJ53Z35qJqROtl23m7iXIsNxzZexTVxxbOxFXJn+J2OcgBIvD0pXJ3+LnLI18Dj4pizz1W2R6fMr1oyfqsrFqlGysNE83s0fz3aUrmsgX1u+Qrjs5mjq940cT1WyszHuPuWd2zjEr+cwi+9EZGB/2XSDDaeNwVzesF7aSkxxMS/QnmIx/1Ui6s6f7mtZLa5Irk59Bwsr3N2cR58uS9+wXp5HK+mT/ZbW7s+mGH01WvSTPFf2Oa2Xj08Wfo+zRRV892ZZzNHJ5fGNDTuEnn0Cwkm+lV6FhHci63ZF7EhxkUe3q9qKZRyVD6OLdogHes05tovckncaMiOLVLkbSozG8Rrqj/2JqicwJb3GYL+xsaidzOJpX5PNl9aVjpaek52BSctC2nqrmOzqYIoMqy2TUyVNK9s2jIy3N2Vi9405OY+Q/a309NhZ9Mfs2zelCdP8ll9DNK2y9GRtrfI6QZx0dJ3MZhdwPele769OVAcnf2EPZiPQAXid7x+yGfiyun9oRWNcBsb+syGtL8/Q12Fh8kCxaEay8x3zGfKYYB1uh74m1Oz5ZTkWUGCXfzRNz1+mn54icS35j7o4xpJxrKjLjCDrwo1K6ks9CpW4Ok+f+0Xuq7fSFRNsolWiOpL2YLcVYFFnJxq+YYo3oa1Cqf2XyjbQmfSUFVv/xTpLkRROZvZzPyLBq3nCJ08Wp/0C+k+1qPzPqvHLvobn3l/EmMoqjecv7R6AwfqdT52C8ZvGin0hTe5ZpI80s0Dt+SE/rIWe7YpyaZEx28tSuQ3Aj+USDv3aOt3xyk9tMvOplctLnl2daauB8jeSJw09OjJw97zrZ13eIGSezXklP60/MPfFpyGv3HnRmnTq1M9qB+oupMZiVGYx7/yq24fOfNbrxRuctZgguQ190Wois9iXZ2BOoo/JF7mIwKz7BQnR1i07PjTsuHmm/jJOYrPPsvUhXitfA2p7vd61O67Y0ZWNdxtMVg3dk4X9pZve7PJmWHLiQ2lyxPiJZgrTV5A0uKevOjGr89kLegH/vuhA3XmUqT5o52BmZtjvrYN25J9ZPbYKrmETOas+NU2Jv6WR6jmBiVhviRXwzXmIuY0wb/iClY11amx4z4KmTRJ8kqYbMmX9P3hAPOd8xycq8GYp692/Ov0H2THv5vwFoiZ/wjvaoAAAQAElEQVQTbSjLtiTLtvLYlkns7Jpc+gc9dc5Ykm1Zkm3178rkiVS8PTfGkyhniVZRPnXERzfDutKrH2jxWJkpHSSz+tRPvmGTsPRGUUztizq1eOhhVzx9nsM9nOrOwoGH/iE1ETYVwr6wR6NFC5Sg+qQtyZ2WMc1uqKWXonny3Q99ck4g1Q6j/4p0pQ5nWcdZmbNs3hAFK4/lgP2HY4jW6fjRGFnbYEfQurSjP0GmP4bp308n0LbMfNR9JjV8y8oSuZK+Upq6+qQtydD6YYrCP2kyPzqYLGrWheTVy+RnWLnPXmpZTV59ZWZEX5ge5Vmf1ETWD5lb/5GWbbGxDkqIrKF46KGqmEPNg2BNnr2iG+rK5C8RW2wsvTE1gtdoS9oS1U3EYx3a9uqlrhQq+okSxSzlaRcbSzGHTip7SMIij34KaerSOyVZegmvb+WxjSagkkGUbEuyBkstTYVAauoXLR5qLInNs7H7o1EV0MSRh1ae2ZVaUzaW8jwx3hkkLOXFTpKgbShiaZN35tBexiNGKSeU51Fzpv6NONXL5BsZZlsswhkL9QlpcumFliXCxMHkGwzejDqZtwc2gyzRpjzhEaJgZ5PspZ5oXKdp2P3Q4jEOYHdwiYyt3MJHX4ykRyH8KzIs9RsjiMwBxxo5u853M5l4lsxq9krJNhvrpKRYxA8xps0K0xiiqktd93bgvNDxiVdanc/GIv9oOecse4JEZDEvlJS6eA4mJbKcjfhwMsu4kv1EvPqmLnWz9EjxpAb0SEyWUjyoPBUk4YTTg6NltcXD1tVtqpMqYl9VQ9+p1aWlH9bBHYrHKC8BSp+gwLpoT87llmRblmRblmT7Kw5vKU1dPOkdyDBbeMRYUaJ0pVdDZrR6UjzxQboMqbGSqKxX+atFkaVHpvAd4okHcia48lJq2o0myJJ4IdYXqWDaD5Q4gi+9U/NMlxQeETW564s7ktndkd/kRGp+Ip7EmUtIo6WlT8p4bN441J3iSQdIn6+UeBXluZGe6jKb6FsqJJZe0sGy+vQw2UHS17VHMqY9x5kbaapeJifsaE4tbfRKoJW/TJHYbv0yjvEtMcTyhaRo7OwRaj4tf+Semp6IV3+Z/IxcEf/K5OrTu8lCoF9aykrhpGUb378UDzUDihrqTn0eTwXDRNYXmaX0vFJSajl2UhI6UnnIi5KNJRqmbv1QVuuyRJj4cDLx1LdazUZacaeV+fYwghSsVki8MiNTvzL5SzDcUqYpj21yybby2Fb/oJJZEjnrmeKhhyWxsb5Yh9KdbZLWT22i9+BmpfpMaXypnKObI1jKoFBsrBZPJrFsa56h5Ur/sPa41he9+kJLYjZriYGww1hOmbDy2JZJbC91pzRagtvTTPO/AOwvivx8+Eh+T6x/kl8U06shoEJOkl8U0/tLfm/smWXy/xzMbu+VyTe4nXL2/hLKDbD7h1OdneZWIRM+PafOB6FjPgT1aDqrQ5Ks9J9MfwX9X+RWTPb1yaKZxOIc40m6l7RVQBZW97JZ7yWD+a4z6/9Ehk9/RjKnmo3FyOwZ+SFm3vKIFJuv/60z+x5zD+20cpIrJ4+fOLwl30/P/8XUEgxiJWM2s5Jl/jfjEXwo+vaeObg6Hg14uRuT9aJnCDeQpB/QfNd4nGbnnejZZJEKUf9zb2Z8x7wLx9LbI9l2ZtL6mTE9kVQ75k6aecPOC4nWQw4xAZmdvi7y5bSsTm/8xrd31ck3GJB7zzj0yVxNbz/CMrXoMHcm/4upPUS+iPNe6qM7LGku5obVIGbfIJ8vlYPUbj616jBzH5hZXLDoICSnSGueJGHFm1EI1qmZnZzDoIVfpodgetqasbHo7+qGzgdpF30XUmZo1vi8yPG9xTzyR3bkzGr9R2+N2+ea1bnj7MWrXiZP5Ex4i7xi+q5MfsSnxnHWarJZvEXmVVALiWRM4ONSj6ZnNC9ZfSE1VsrTz5F8dtpOTXKptwF9Z8/MIYbzBh2alL5iSZ5VRc8vceovyXN/55M/MV5irs/deT3OcxFHcnyChupH5hyR2hE013nl3EOZ+XRy5eTxE4d3ZfKN3MMBVJqjZg4ZCXsqE9XMpzFpPtkSp35IksVMGqhX/J/JgQzjfqbsrHhMw8fL+hIjsxOcyVvPmS9Nrf4jGV//Si6bETFz9EPeMP/uuSukQL3qw/QckTnJ/2JqZzCr+ZXJ/2P0LnpP8oZ8Pkbu+6Hn47GTX2oxrp+Jas+wsZiQXgLBOjSn8Fi0cy82xazRlHkVFoWubrhDTrSPjYVHJ8nUk89grHRSZyF2IVi9DPbdyzk+RzmHl56PxkC0nzv+Zq5iRkfm3LfeWual54nx/nMwv73Ln5nc19e4MD35HGHOJn8gE/kacm5iNHt6mUkxK8aFFLLoYSx+RFqWY7JHM5eMJvaLrkKHAcxiSlrz1kmXNLBSyJVhexEs+rjjf//778zUHsyRDP4m8+jB7TW5L135z0Q4mh5msNPGnvw10pKeJ+JxC0cZuz2HvpFaNaSZPWri0CcvM9PBS/fdIfJzD/1vmiYWB+jJXQha3zRfVvuWtJHlSADvRt6FYbxkfKZzlqbR/8hvZzlezS05BjqGQb9MkUs5Qpk7ydOU7JEZSHQ+h0IkrREdQX6QKbFpYOFHX4K7ev4vpnZEZiW/ce/ic3RWalzG+r0Pc3ou77AezayPj+CmDv0i92HHpDsZKZeSZXaqf/LrvtxzBCWOM4s1XoZOtMZNWTS1HE7Cm7ThgT2AH9KTLGeGmcBlXd1SirmkCzuCo/jRnxj/orkjnx2HUvcvMiI9/UjUmc3CiU9wSfWN6SPo6uzUXmNnMGR6v3TuTQ0yjsXc6m6jd+dk3/1vMqjvAnOOMRzK4tjMxl4diwZWDZh3nLyC1iGdLHKc1mF7cw15wHR6sujrylYX80LszOA1x09CdN4/mSPMYkb7uThEMhK/mh7eiVHZidWtpYegyM4PgPwSKH45lCzbymN/UatPpkurvsjZdt+IU71MvpEhtsUiHijhE9ILOSMpu6Wl3+ntgc2g023xWHkPWXpniqkvFZrdMR8oHuMDdgewgKNHdT+Mk5v0hegI/wpalPqNETptfY3UPmN7y0tmTZbd0qFPYin+hdRqYR+sFS2puVSylxZ/rko2QaMnu+xHz9Ih8RdTI8RjWyzCUhbCtmyjrfyJ/ENptHRSkjXPP8msdi7tnCCW9uYn6W5+ZfINcL8859ck1aVYWZ3MZJbYj3ByR3VDHZQQWUPsiLzWh1a1lgiWVI23/NV1qF6Z/CUYakm2ZUm2ZUm2ZUm2X4OCLMm2LJ6TWr2ULrqd6L/orUNm5nQR1+JhY+nQyTfatzllKVv0X0ztNcTTAcPv9Ee7k8SLmBNlkuiTJNWQHvsfpCdruqTwiKjJPT6zLMm2LMm2+ndyPcNUwtRupFYNJVEWUkOflKmxgd1Hz/7r1o+d7hupVC/JcxdtsiPi30kBMys+ISK94vlmatg6qffn+2z1zHbOR2/YViwtbbSEhFmnVp+V1CuXliv9QEscsj5/pCy0KZHNsmgTu0pTewtZ7dGV5NXL5IRotCT3TzzJVGXlsWhJ8gctZW2jXSH7heKhRlU06aDyIFjJzvjW6gnxbIVZivdKSaml/Ys2JksbkeK50xp9oZwu9idq/SUtrAh8KVt0ZobVJNWlNflS4SUOfZKRHLAk27L0n0M8tqcfImUb+E4828LMulM8KQG9kZq3WKIVLbFbYn+NlFO/UYqlPPH/ijSmfmMMyzYTPmEZLfZvqk9dNtZFm34kswz0RLz6F9rGck6UyWzLOODOeGd4auyuZzIRSw4ns7vL/rBdZo8Hyaizk2ORsMhFnLoC/y9SMzFdlshNDMUzSnidKx4TrG+tGKn9SRpah8zomQfaW0+NuCtptO/kjMVzI071kjyH7GjJvlBCf0I8W64vWaMvlIQiDo7q7sNbHvpGatXL5EQG2haLMMUskw/lgyY1wlA8Sw4aJdw746gPLV+cTm3BRrNGG1hsl5BGS6V4cgZ8dATBUfavdZi/rNNZZNCyZn2RWv2T0mjphxhpS+FD5tVfJt8Qj5uru6U7MVjKrGd6ajSwyKP/CGl6xMMBF5ahVjfNRtS/cRzLuJId+g9KFLNulCVxNlA36ZkUWS0ebGPEU4gnPkjfd/qk4xG8jsTG+lCWbUmWbUmWbUmWbeWxHLB/sza+zkiSriPEjOY3GpsQEf8WzKpeSkLKkl4pKXXxmMxLUOXdFWbIjeKhw6A+JG9bUnJsVZP/UDFpXLo0BkGzo29BqfrK5Bv+5hrMaiWMBVlStg2bwiVstETLN9Vny5qqvujVX+RQHLt7fgDkt0N+DexvhCXZN/sbIv5J9eHkA/O7Yuwls9p3I7VqKlnJ38goyr35mzGZFBAMSC8ZYL/qP7raRv1GPmv1kjx3M7S/soYkFLNSnBvrZ/s0p0DQw57uIj1NDr9itm+rsyj9xdSOoLXvdmMEtx+zlzkyldnH5ruofCIdHGrlJHPzeVI6SG3TFPs6tejJ6OYkYRrCzDyZ2g6oTx62d2szalwsOrLTMYXeGScz76QhK4WTzKmGmZR8ScttaHUG/uc4Tiw7m8Ml3g+3Rqkfooy3AfJqwTNzINV8liEfgCQ6tU/EocCYeOmCsyLwqT5pvBT76iQlG6sH5v9Hguk1hux8nBzM6Kgrk/8Gwziz/hxFT5I7ph7NvMtdNLHw8dgZQH2aeVsSTBZ+F8YSk1V9bHsSeVTCS3BHT8fK9CfGu8Y1Z3KOBUOKrNvMFmI+RU7GvzJ5J+yGpoVVfSefMAafg0U9GgNx/45Tws8oamC+Y5JxqZNnRR/x0cxFZJ9aMs4wK9ncRUaRndk087kpk+Pgk2RxiFUNp41OEjxWzQ+bUb+SeThpPFxOs+KD1oa5P9nFqvxoJrD6Yk9MY4dQLDn+zfRg532KPzfmtL68zKpTTQb7aUiPd5vvmFuo5cqP7sC2JUv5w05B/sXUJjqXLTPikLLIeA/23kFaMrRsb03eLd3k6SVlVdxZFb9djPkXM5c2Vu4Cp3F8B30RCtWMrj5JkoMJelp7ZMx/BbPa8sLeQe1kmqMvTC3Wkq+jnyeyXdQ+5LupvjBFDtUuk1EnTynZnVG9olu72Vg/Ot9f3uMkMz86kwkMds525+scktB9uYu0d/xFZlHm6HTm3o9mbutXUo2Xdhj881KOdL02p/ASsXPBjUyrXiZPINN6i4jW2Fh8aawkn8+EwUl0ejcDqPRNdXT2L00Lq+Ywc+g7vxs0OV8wiw7yfMdH0FmfyoUdh17SlDrgnT7e6KlwSyT16Kgl9+VE7humjXrK6Q6Jbeud2B9Oe/Ycp5TmyCGTEORU2vBDyvWuTL6Ro0lfSYHVFzpJkhdO9Cz6gfOZU5jYrhHsh75zPlE+S33uqPPD7aCp9xzM3ObUIfL26t86s9N251Uxh+8vPc2aUL+RSvUTKWTx/oxhRdBHNiuaeRVh3zAbTV86C3C4mQAAEABJREFUPVN53xnXYu5L8sR4Z9DUfAn6hd0YQRyzST/rMH85TvaJfhrSf5KefNS81g8x6v/F1DbynrlvRibja23tyuQbNLIuX8GemUvxqWZFn6SnGvbCf5AejrLPnUk++pPVz9wkvPMgdaJ+GPeLqWHxsik+XXLxaWS16WCrFWThNbCOdwlTWqtpNwzI6ti0JUbz3SThHVlt/LAFXvvKjIh+IsdZqR6BzFVnMGxyLmnPhe2N3mgvTfnvEywu5F3bRPoXqXGMPX2T7Unujo66M52J3kNX1kczKu2gfvK3SENqj0zhO46hVyZ/iRxP6eQmvHgzmO8tke8tPKKas7/EZOUoyJsHL8x3l/KVySf2/wagpfwiSJCQomXZVh77i5hxEqQKP+HVS86aJtvjl+RXJrdkm/iiNJ70QxmPjWPZI4bSF736gRaPlRnSQTKrT33yDyMoxWjaLYY4LmVL7aR46GFXPEm/1Oc5WnGadlaE5/SDti0Rdpj0QokSWrpQfdKeZKrS0I+MmxCHQrt7DzVzUqdMLLU0tbc4eh6IxfIZTCGf3crjarFbeSxeK8kftJSVxpOWbXyfJBktntRAPC+D6PLPrSfoWF5mSXjVV0qKVyub9K1TVkqEeKpPWqMvlFNlf6LWX9LiOL5q8upl8jOs3GcvFRKvzIzUL0yvxH4P8TB2fCNY9iT2lZbtVIfkNppgCTNrKB5MqhIb65f6PE5TpburOvkGs+qdFA81ltIb/sfoiOMM/OgZYC+pZbbLycTz0QiWibT8TWvGXpl8IkV7chsy0/6mZEnYKqUHer0vciiObYkO29llW5IV2MMI0thJh+KxfrV44qsb+4VV6AtFnogbqo/V+5I7G/FDDFYbnyjMDvmljcdIpUeSfWj1OdSdlrdacuaXOPWX5CLsaJGaGIpn7XrI0iTjW07O/k632p1Dd2pqvpIcLR7adYTwbItFWOrqRnqlV4fi+RdFv/pk9iTdZftIShvNoiCdJKkfSmouleKJBh8dQdDO/rUO03IrswvVjFkm18mt+EJqij4pjZZ+iJG2FK701U9+RjtRL3R84pVW7rGfiCciNagys/DEs/rwT6ZEZDkbcZIzSFrHsa/0+lfSnR4Pk9IkrVae5K98KsZ7idgZDr3U8tSW1hoeurSOdywVbemVrSiP6TlokgSomzwREWb20LFkX5j8NTS9XkqjpQvJxZOegUjJBCczmXiG2T2Ke0XNPrR4rEotLVU/UTz42nAS4y1dGoM4hsQ7g1LzJ+JxjF1PLS1lZhLIos+y/aEs25Is28pjfzEmsbamqhe6fnaLh0PGsbtLS3s0wCJ3SiYPLyGNJ72QM5KyW1q6vCtLcYMfUqn/RApZfdHUIy5klqhZjsk+RLCMFo+JrIPJX+JoYWY7nhjvNTjVmmTvsAOPtKw8/oOmwdQtMdPyhaTVF05ZtMYsk0949VJPxKsfZsS/mJ4Nfyge20ySbCuPDbNu9NTxyIRgeSie+ldKVLuV0mgJ3h37rlWNd1I80UDL1Eh1klo1zEoOU5YQrPDUymMdmgwju6Fk+UNSR1vs3aCUDTVMQrDQVueysU5tx7ckyyZEQPHY5FemFn1SZC/xffaixWMze0OlQDyJJOtO8VhidftlHepXevWHPRzX4mFj6UFjxX6PNOQs7560jdER8X4onjZQGYpMPD6JYJmIdadjScy2eEKi+oltaSctHyazs0vZG2ysj5bITXwz3sT/y6+N/YWRnxNLfke8k99VqYlnfHTyjZ5PTk9+0UzPL/m1sfVl8p9gbr0vdjbeycyI/oP5DES7MpM873XoO2cwbdgzk/Z8LDQrBT5Qzz9xmzmZZlSbMnQ1KW52jMFV017z5Cbc2wz2ZeC8Ay55vEPfyS2tLxne+o0IVtro2rfpJ4h70XNXKpkR9l46PpoJDGJRoqNHvpmeI75ql1nHzB+m5wzmNF/mvmhYB7J4Fz4Kq7MwQtrwK/47mUFzjjKed3/S8TZ6T3PugaPJ8wVlyhPjndFD3MWq96tjn6NIqm/kvuolOdPY0TT3U5ycCkVW6ujUmnbLx78Ep2MfPWW8jUyJ98qd34/FmTC9ZWpE8txRbk9nUgs38lL5fo849J0dEiuHuWk1iOAa/CyyLjZqc+v6NI5m5+64OxCkn1h/EJ0hB5O/xdGT2fRwF0NJoqk9aCpTT20zgKJ/1rxizenOTEr46CS8KGs1BiLfY/s2f9J00sIMZqc+mjHV4dbmbR56UydyR3qeGO8MZja/MnkuhJ0B6SFl8UZd3VZzHxkvw47ffZlz0SeZW30hrVtmRAS1GEmXFHiJw28BDZnV2gPz/XGClb60DzG6qpj/T9KTOzqP/G/OPbRxpJMhHjfGSxb2G6Ncpsb7I7uPtzvNzV7JxNQ4nPcinfuqn2pMay0b9dzIIVxEduKmebn0BE9kTEocCbh7jLxLjBJrOLNpYtU8STL3Y0/OaYZGViM/jCCmSJJVQfJhM2YwmMXdvH9mJPswJTqz0vvIGZtyz9Fzkpn9bF/MHaef2hGcnRr3xnvU1OqHdCfnchbXRv8RnUn95M7IR2AAo2YGmoQu6uTxAdZk8+7UOMO+PnOjidYfyZT6L8TupUsmZjyKe1kjkrwEs9tzkqMZSPs5K7XoZcqJSD5IFiPopifi9llorH4lR6nNrRkwOlkipTB3hZ1Pc2ZGlxT/O5nf/uX3rGpqJ/lcyXmR877kzEhX7/1T5zAz5nBeP8feyayuzOcMJ+nPHvHCHNjIMQ50dePYh/Mu00qB1RdZ9my2jXw2/e9/tNCAV83hO5lOjcnTR0I3e/yCE2HeHdLb+o3UqqmEl2Aoa+v1Mzf6yuQb3EZbds7hJcvYK5O/BYeZztnu8DOjWWZtMII6fdXZ6OD84X+YntThmOxvmu9oqiTpB5c13z1G7imYA3mR7HmB/2NwLLMY85mNx4rNsB3Nu9BTTe3OFKjz3mlO9k5OZjBHel8Zb6Ln6jHlidyRc1Rp7f5F5qSHd2w1M6JvpKc6TNcXU+MdWTObJHciWPRfNbMxWT0UlWFfxOJ9YnI6GSn9ZJ37Q7q4I6daT74RcFlKBDNYvzoDN7gpi+a2hZN87qhHU+8KiXh0BCgu6er2q7Exdyynqp9IgQ+Qe47IBc0ZEPLWzOEsSTQnUiHauUy+kXnX3mrOX5n8NZjT2i95kbmPl2DRkJXZwxRRuZ00HShmTfVLH37sdF9JjcWxnO848mG+A9rRHOjKdokU5/D0/GjmxANMp4ckOiNO4lWHdJEfn73MfGLeJXUa3nRHUP9inJ6PfwQm0/IWRDJeL3OjXvj/OCvbwYf61i2vqzs52+4v2p6+kvwk55P7hZIoi7KeaVkiTLwxNUt0zAwrPPQPjUOIaN+NEakv24S+0ShjGorHRJZ/dNxbeNXJTfoi1MI/4+iR7PtZ+9Dq8yU1Vf9BSxyyfCFp9YX01DpJbY4oz9oa+oF4ImhgT3YJbf5CxyegeBhBvxSKx3Zz21JWadlGW/kT+YfSaOmkWlUeZyO+idVl3yt2NPFKjqVGi55IWak9MO26FKct+4Rby26J3MQsR5IelBBZQ+yIoExC9D42lmwT4gkJEXhaomRnryNLhInwj/DWTnrOHLPCDS1teojR0o3iscTq9kiJeisv9Pow96C0LOQMkGA1kjTy35HG9N8Yg3gcJh5q3YekXVVsLH3GOSn6QktiNmuJgbChLNuSLNvKY39TirP25NLSd9JkSbZlSbbVv1duj69MviGJo6JMkmWNdoTMn3jujPK6X4zkTGboJFn9JXnrZTZJMZIuD02BRUFEauL5ZmrYOqn353KWidKTjkfYdBB2mNYHStcRypP2Dy1HsF/pmx6VHZtFZr0ztbfIqdQeiMWybELmAmcnhhjk4vnWWh9afRixHMO+kNTuJvuLORVvSVU0qQ9+dQXbTaC7DvPgF5kh4Z0UT7Rwh0ot6UlJ1eoTO8nQ+qFM2ex+oNZf0uI4vmry6idauc++MvmGvpkZeJLspb5JTfMYHEEqO0pf9OolPbbThC9li3ykeNIKdGHkaMxDnIz3ErHnIN0IFoliKU/0n0GRJV6YxQlEE2O52r5SMn/i+SUmy0RWycZSjgydFH0h8200IcKe3IYS1jfxJHxC+qUkSxu+szPxYDpscjpsS2V3VcoqjUeI+NHiiQ9an419TJOJeKd4TGRZnT9pdsma5yQJS2l8JYXWoYjk0CbPtKW9Oh5xqGeaCWl6oiVmWR6Si7CjY30z3oR4ti1H5PxZ2TW+ZYkwcTD5S3h7bsRDi6czycMMtC0WYamrm+ylQrObui+URI+Vx3LAPhSZ+hy6gs1eZ2nftaIfo4fZWKmD9pbZiB1FNqu6G9oyu3YPD+162R0b9Q9Spkl9DfIbZVXrTpROX1W758roFzo+8UozJ/ULvfqkZTum2GVbFs8bUyKy2kfy4WSeCbJNVV/06lBCEFLY9myWolVKJ8UTD9TLVs3GUvSfIZ420gVZIpuFYCkPZKl+EiKvJTYWvpN+0ZIs25Is28pjf1GrT6rZuJ882vbUbsSrXiY/g/PNl5Ls9C0lNCEeSyxRVpjNbJZ2P+jVMM1VlsLglXSkTuwxHRRewrNJy9GWqpfJEz0snvggXnDlv0qZkR4YCB5h4xD2hcy30TciWGtrqnqh62e3eDhkHLu7tLRH9wfA85dEfiUUz/x2OL8eIvn9MDt68KL3FDP4IZIfOq+avH7InOQ0oei76PjcAeaO9qRO4MfESpZ0OU5mxRhmjx9+3EzJ7F/ipJ3W1pNv9Ltpzsais6vbqZMQPcyQy9tFtbcJPeUf2zHjL6Z2BrOac0uI7JcK++7weJ2zHI+Yt3n4jqgxbY5xaDqyc6KrG/UXxt7IKEbQy8R4ZKMrovq6mY5gJZvgBLoT3smYdrySQlYupbHfCXovZS6itSE713b/kC6O/se1Z48znc3RG+mpDrdGerzTjZSPUd/siIuZEbx0ThD5DgH1ybIfHReSsnrslSkQvY+NxSsyDy8Hq3NPkiXV6eEVmt+YUxisjDgCyensl3pnoh/J5PjE/LtGc756CTI0d1wZ+9QVx9ZOxJXJXyL2OQjB4jAv3H0Y74hv/pylgffvwYPpOSNz6QF8WvbPqsvGqlmysWZcXGaO3tPRBP9YrFTwo7mv3ylnftlx9FNkzan1fjTz6qWLHmbHmZlkPzrN8WHfAXKUNg53dcN6YSs5ycG0RH+CyfhXjaQ7e7qvab20Jrky+RkkrH4ZYQacL1uDsV9MT2aerPjn1imdTSv8aLLqJXlG9zuulS2vAecoe3TRV0+WY2U2YrsziphvjlObR9PRlXwrh4Z1IOt2R+5JMIhFtavbi8781ENebLpI3jSlXb0nOceL5f2FqByN4TUo3XqfdLzEMTv5GYf5wtzF55k76GHle6s1GxIzK70lww8mJQczgjNp49BHpxj/ZA7kuwvbeVaSHJWQY1mdle7MvpMujPxnrVtpB10AABAASURBVDU2Fv0xZ3ZrmUIBF5MzvWhJrf5JWlInxr/qcc6TzKRt7iPJXe2uT1fak7+RM1ybvceapDdJ2Q31F1M7gtbrwNhfVuS1pXn6GmwsPlAWrQhWXu74bHe2Qt8Ta3d8sh3zpfmOWrwzd0w/Pt9fdUhv8xtzd4whbXMHA1jNQzrIJ2Nq5Oqo+DCH455MW/wLaW0Zq0RzpJcnbU4t5GT9bt/FNPzEHgxaa/LZOgP5Sgqs/uOdJMmLJjJzme+RSbwadZJTk2eNSzmCeNb9hK22zuw6r2QetXkNTmRdgkH3V8fY9vU7neMcSq1ZvOgn0tSeZdpIMxN05g/paT3kbFeMU5OMyU6e2nUIbiSfdPDXzvGWT25ym4lXvUxO+vzyTEsNnK+RPHH4yYmRs+ddJ/v6DjHjZNYr6Wn9ibknPg157d6DzqxTp3ZGO1B/MTUGszKDce9fxTb0P9s0Drm9PmRGDlNi6Iump/ULSbv2BPl3x+rck09zktbqC1NL+0lq1TAr+UkEi5ft2o1qzWXyI7ByH/h+1+q0UUtLUzZWxw7pSsK7sfC/NAf7nZ5MSw5cSG2uWB+RLEHaavIGl5R1Z0Y1fnshb8A/WV2IG68ylSfNHOyMTNuddbDu3BPrpzbBVUwiZ7Xnximxt3QyPUcwMasN8SK+GS8xlzGmDX+Q0rEurU2PGfDUSaJPklRD5sy/J2+Ih5zvmGRl3gxFvfs3598g+05r/2gchjRf8gMgvwTya6B0kAxtSXZ2KCnZ3+Hp4Ywl2ZYl2Vb/rkyeSMXbc2M8iXKWaBXlU0d8dDOsK736gRaPlZnSQTKrT/3kGzYJS28UxdRembH0BLKK3Q53ZSZInSWFraN/iNf6EyVKnMhKXUKrz8ovbZmq2Q219FIcmnz3Q5+cE0i1w+i/Il2pw1nWcVbmLJs3RMHKYzlg/+EYonU6fjRG1jbYEbQu7ehPkOmPYfr30wm0LTMfdZ9JDd+yskSupK+Upq4+aUsytH6YovBPmsyPDiaLmnUhefUy+RlW7rOXWlaTV1+ZGdEXpkd51ic1kfVD5tZ/pGVbbKyDEiJrKB56qCrmUPMgWJNnr+iGujL5S8QWG0tvTI3gNdqStkR1E/FYh7a9eqkrhYp+okQxS3naxcZSzKGTyh6SsMijn0KauvROSZZewutbeWyjCahkECXbkqzBUktTIZCa+kWLhxpLYvNs7P5oVAU0ceShlWd2pdaUjaU8T4x3BglLebGTJGgbilja5J05tJfxiFHKCeV51JypfyNO9TL5RobZFotwxkJ9QppceqFliTBxMPkGgzejTubtgc0gS7QpT3iEKNjZJHupJxrXaRp2P7R4jAPYHVwiYyu38NEXI+lRCP+KDEv9xggic8CxRs6u891MJp4ls5q9UrLNxjopKRbxQ4xps8I0hqjqUte9HTgvdHzilVbns7HIP1rOOcueIBFZzAslpS6eg0mJLGcjPpzMMq5kPxGvvqlL3Sw9UjypAT0Sk6UUDypPBUk44fTgaFlt8bB1dZvqpIrYV9XQd2p1aemHdXCH4jHKS4DSJyiwLtqTc7kl2ZYl2ZYl2f6Kw1tKUxdPegcyzBYeMVaUKF3p1ZAZrZ4UT3yQLkNqrCQq61X+alFk6ZEpfId44oGcCa68lJp2owmyJF6I9UUqmPYDJY7gS+/UPNMlhUdETe764o5kdnfkNzmRmp+IJ3HmEtJoaemTMh6bNw51p3jSAdLnKyVeRXlupKe6zCb6lgqJpZd0sKw+PUx2kPR17ZGMac9x5kaaqpfJCTuaU0sbvRJo5S9TJLZbv4xjfEsMsXwhKRo7e4SaT8sfuaemJ+LVXyY/I1fEvzK5+vRushDol5ayUjhp2cb3L8VDzYCihrpTn8dTwTCR9UVmKT2vlJRajp2UhI5UHvKiZGOJhqlbP5QlwsQ3xTO+qDoblLKhHmhlvj2MIAWrFRKvzMjUr0z+Egy3lGnKY5tcsq08ttU/qGSWRM56pnjoYUlsrC/WoXRnm6T1U5voPbhZqT5TGl8q5+jmCJYyKBQbq8WTSSzbmmdoudI/rD2u9UWvvtCSmM1aYiDsMJZTJqw8tmUS20vdKY2W4PY0+9bUOuNDfgDk90B+DczviNdfHvmtkF8es6dyCXrjpvfDmcHeM62l7z8Fs9t3ZfINfr+knJ3ZeMkwzruir3GptftHC5vT8/KdyfELKWRxbvwK6i+cJvatk9GcS+YeMpLuJW0VkIXVvWzWe8lgvsfM+j+R4dOfkcypZmMxMntGfojJt8Fbz55is/W/dWbfY+6hnVZOcuXk8ROHt8xNNKCm/0nHS6Qv85oz643pIfhQM5M870j7am5jFoLV4jtnSI5yIeeeNB5T2NOyWebj9N6cruZ8+BLtzfHWdxb68IeZ0cG8M2R22um+aA7VX5K3HtLMBGR26l3ky2lZnd74jW/vqpNvMCDvecahT+Zqenn19oSpHcydyf9iag+RL6Aztza6w5LmYm5aDWL2TfL5UjlI7eZTqw6ZzSCO0nzRGHOqNhsr3rQjWNETaWXi6V00M9sD81me7uJkDqQj5T+YtunOzFxXJuHFWJynTpK7ElO/e/HP6Ejqr9zavBXjVueO8wxe9TJ5ImfCW+QV03dl8iM+NY6zVpPN4sNmXgW1kEjGhL7fnbxk6hwbH53z0US+B8pz7qIx0g5qkv+yZ+dwhk4vGUl2wBmy2RlBjpkTiHnj0XTknVIJifp/MHcn5gizOoKNO/ZYRlDeWjLKqIuPopk91YlDvzKvzonMSk8Z74jvWvQlckvOwbwIFdC9AyabnUJWPtEX24of5gWWOPOdcJ47cui/6vQmmJZhTGIxYzR51pcYmZ1o7wupdfYjc13OXcllsYg5F53PBPne8plQlNpQHrpMzxG01PuLqZ1Bd/Mrk//HyL18Trr3veZzMfKj+RjR4ONx5tCcqH+SWj4zJouTN82p6hdi80qsnOvEbLhXTU4Hw8dPfgSzewDmM9XOxpFTU6t1csZEZuYvc5jTU6AFzYB+xh/mdno7kr6uq96cWZQ664ep/efgvvYuc2/0Se7jAnbuoifvm9rB9lJ9YLvjb4xmr86QnPtmL+OuF3IvRfbUOU/2o/FS4aaUckHSkqtLWpaZk5QTpD2wbC9b/52eydyc48BR7yj0K+mnxsF9hdG5o6cyh8ponOg/g0mtPxGvs+DRc+gb8w5Ee2BqR8RLfpJZ1Remxqti8/Vxnjzv/6ZpYrWJln+RLyvzAYeykl3I+Tj0DNCsaci7IFL7D3G8c8/2GBtDcxTU7qeundl1+QwX0kyFtuw0Pmm8DDvuC8dKf4+mvMGc2DSw8KIvwe09/xdTOyKzkt+4d/IxOis1LmP93oc5PZd3WI9m1sdHcFOHfpH7sGPSnYyUS8kyO9U/+XVf7jmCEseZxRovQyda46YsmloOJ+FN2vDAHsAP6UmWM8NM4LKubinFXNKFHcFR/OhPjH/R3JHPjkOp+xcZkZ5+JOrMZuHEJ7ik+sb0EXR1dmqvsTMYMr1fOvemBhnHYm51t9G7c7Lv/jcZ1HeBOccYDmVxbGZjr45FA6sGzDtOXkHrkE4WOU7rsL25hjxgOj1Z9HVlq4t5IXZm8JrjJyE675/MEWYxo/1cHCIZiV9ND+/EqOzE6tbSQ1Bk3zNkV518gx8Atb8VXqk+7i7q6lPdXxCRN1KpXibfyGHbYhEPnFHyKz01dqen9PtuTQ02g45j8Vh5D1l6Z4qpLxWa3TEfKB7jA3YHsICjR3U/jJOb9IXoCP8KWpT6jRE6bX2N1D5je8tLZk2W3dKhT2Ip/oXUamEfrBUtqblUspcWf65KNkGjJ7vsR8/SIfEXUyPEY1sswlIWwrZso638ifxDabR0UpI1zz/JrHYu7ZwglvbmJ+lufmXyDXC/POfXJNWlWFmdzGSW2I9wckd1Qx2UEFlD7Ii81odWtZYIllSNt/zVdahemfwlGGpJtmVJtmVJtmVJtl+DgizJtiyek1q9lC66nei/6K1DZuZ0EdfiYWPp0Mk32rc5ZSlb9F9M7TXE0wHD7/RHu5PEi5gTZZLokyTVkB77H6Qna7qk8IioyT0+syzJtizJtvp3cj3DVMLUbqRWDSVRFlJDn5SpsYHdR8/+69aPne4bqVQvyXMXbbIj4t9JATMrPiEiveL5ZmrYOqn35/ts9cx2zkdv2FYsLW20hIRZp1afldQrl5Yr/UBLHLI+f6QstCmRzbJoE7tKU3sLWe3RleTVy+SEaLQk9088yVRl5bFoSfIHLWVto10h+4XioUZVNOmg8iBYyc741poT0kFmNS/p/qGkeJS+aWOytBEpnjut0RfK6WJ/otZf0sKKwJeyRWdmWE1SXVqTLxVe4tAnGckBS7ItS/85xGN7+iFStoHvxLMtzKw7xZMS0BupeYslWtESuyX210g59RulWMoT/69IY+o3xrBsM+ETltFi/6b61GVjXbTpRzLLQE/Eq3+hbSznRJnMtowD7ox3hqfG7nomE7HkcDK7u+wP22X2eJCMOjs5FgmLXMSpK/D/IjUT02WJ3MRQPKOE17niMcH61oqR2p+koXXIjJ55oL311Ii7kkb7Ts5YPDfiVC/Jc8iOluwLJfQnxLPl+pI1+kJJKOLgqO4+vOWhb6RWvUxOZKBtsQhTzDL5UD5oUiMMxbPkoFHCvTOO+tDyxenUFmw0a7SBxXYJabRUiidnwEdHEBxl/1qH+cs6nUUGLWvWF6nVPymNln6IkbYUPmRe/WXyDfG4ubpbuhODpcx6pqdGA4s8+o+Qpkc8HHBhGWp102xE/RvHsYwr2aH/oEQx60ZZEmcDdZOeSZHV4sE2RjyFeOKD9H2nTzoewetIbKwPZdmWZNmWZNmWZNlWHssB+zdr4+uMJOk6QsxofqOxCRHxb8Gs6qUkpCzplZJSF4/JvARV3l1hhtwoHjoM6kPytiUlx1Y1+Q8Vk8alS2MQNDv6FpSqr0y+4W+uwaxWwliQJWXbsClcwkZLtHxTfbasqeqLXv1FDsWxu3NoaA9zyCZ3SlZ/AOT3QeX5MCq/Kj7x05VfJfmJsb9A3klPfmFMhab+gvlGrqA1nRlxYwSTAoIB6SUD7Ff9R1fbqN/IZ6tekucdGMo7RHBDjKbdYtAMpokkPkG2BbI3TelYR8up18h98Z4Y74jHnpi8xY7KK8bJkfCIKfNd1HgiHRxq5SRzMzClg9Q2TZHvDKROZPSW61MpM3P8ZHWzMSZ6IkZGHOrQnZmNyAzQmc9kQlYaTzKxGnLjHG4ximvId9hmUf8xjhPL3JOTJd4PKcaj1Pco422AeSmS1MBdf8zJsk/k0/FhOHHVcaKXpKyIGYtg3XUMIq+ZQsnG6uz+v2dOh1PPzcQ0pEK0skz+Gwz7fAXcN3qSmc2ZzjxmL/FaD+dQ78mwnmZjcbgrHVv/6JpsTGTP6gmS8BLc0VOxMuWJ8d6CiTkWKD0R34z3GjnZAyQHSVnTwv+zAAAQAElEQVRV3UY0ZWNdXplPGIPPwcKPxkD0O8xRcsDXh0/y4+NlTZURiOQJ0n1z5iKyxz/J7OYwJ4PRNHOymo1Fmcoc5l2ok7Pwu7r96jqZxIG0RDMH51Bhi3ip3vQYV+toXdLA6gs9kZmtneRYP8yFqSE/l1S8bLkkpeVlVp1qMphP2dHk4e3frS1sjEoZzGuS3HWnxM2IF6ZnIk3NGB1+68ymdLurXs18A5wiZ4/geMWdVfHb9fJO2O0LO6pJ7pqkO+/BnKRb6HcUK/okSTW89HI4iuGHP/LvfXt5t+n70rkntZPpoofFRV29F/15V3qqIatHT/IdUcvB8dHUqk+mIX54r6Rl3PgoBOt4hZpXnXfKPSf5LB89d7SGnyFzNn5mL5MSWan/yQynITMBI+fEaOa1fiVd8dIGg7wKbj/LI2uyvTan8BKxc8GNx6xlaglkWm8R0Robqy/Je4fHZ0ye4FNmAifaeGFt9ANpZeX41Jk9eqdFE3yxLCrkufeITGxO8mHH0b9MjchiQu8JR0+2t1GLjlpyX6Zk9nBPpZzukNi23on94bRnz3FKaY4c5qYWqDxze4P2NPlsjKl4JQVWX+gkSV44kcMvnM+chglOTbL7oe+cT5TPUp/ZdX64HTT1noPMpnVeFw85OUl8cNOZnbY7r2ruSU+zJtRvpFL9RApZuTzMv8EPmVc/7Btm6zBayWfHIP/HOls3yb05cmXyMyg2X4J+QTdGEDuS7LIO85fjZJ/opyP9J+nZr6MfOa93apLqv5jaRl40983IZBn5zXgbNLIuX8H2zqX4VLOiT9JTDXvhP0gPR9nnziQf/cnqZ24SPs8gdaJ+GPeLqWHxsik+XXLxaWS16WCrFWThNbCOdwlTWqtpNwzI6ti0JUbz3SThHVlt/LAFXvvKjIh+IsdZqR6BzFVnMGxyLmnPhe2N3mgvTfnvEywu5F3bRPoXqXGMPX2T7Unujo66M52J3kNX1kczKu2gfvK3SENqj0zhO46hVyZ/iRxP6eQmvHgzmO8tke8tPKKas7/EZOUoyJsHL8x3l/KVySdyVzOGhRkSIkn/Nz8A2vwcyAx7mXwD5EfDS3jzJWdMk+3xS/Irk1uyTXxRGk/6oYzHxrHsEUPpi179QIvHygzpIJnVpz75hxGUYjTtFkMcl7KldlI89LArnvJ863hS96OEaNpZEZ7TD9q2RNhh0gslSmjpQvVJe5KpSkM/Mm5CHArt7j3UzEmdMrHU0tTe4uh5IBbLZzCFfHYrj6vFbuWxeK0kf9BSVhpPWrbxfZJktHhSA/G8DKLLP7eeoGN5mSXhVV8pKV6tbNK3TlkpEeKpPmmNvlBOlf2JWn9Ji+P4qsmrl8nPsHKfvVRIvDIzUr8wvRL7PcTD2PGNYNmT2FdatlMdkttogiXMrKF4MKlKbKxf6vM4TZXururkG8yqd1I81FhKb/gfoyOOM/CjZ4C9pJbZLicTz0cjWCbS8jetGXtl8okU7cltyEz7m5IlYauUHuj1vsihOLYlOmxnl21JVmAPI0hjJx2Kx/rV4omvbuwXVqEvFHkibqg+Vu9L7mzEDzFYbXyiMDvklzYeI5UeSfah1edQd1reasmZX+LUX5KLsKNFamIonrXrIUuTjG85Ofs73Wp3Dt2pqflKcrR4aNcRwrMtFmGpqxvplV4diudfFP3qk9mTdJftIyltNIuCdJKkfiipuVSKJxp8dARBO/vXOkzLrcwuVDNmmVwnt+ILqSn6pDRa+iFG2lK40lc/+RntRL3Q8YlXWrnHfiKeiNSgyszCE8/qwz+ZEpHlbMRJziBpHce+0utfSXd6PExKk7RaeZK/8qkY7yViZzj0UstTW1preOjSOt6xVLSlV7aiPKbnoEkSoG7yRESY2UPHkn1h8tfQ9HopjZYuJBdPegYiJROczGTiGWb3KO4VNfvQ4rEqtbRU/UTx4GvDSYy3dGkM4hgS7wxKzZ+IxzF2PbW0lJlJIIs+y/aHsmxLsmwrj/3FmMTamqpe6PrZLR4OGcfuLi3t0QCL3CmZPLyENJ70Qs5Iym5p6fKuLMUNfkil/hMpZPVFU4+4kFmiZjkm+xDBMlo8JrIOJn+Jo4WZ7XhivNfgVGuSvcMOPNKy8vgPmgZTt8RMyxeSVl84ZdEas0w+4dVLPRGvfpgR/2J6NvyheGwzSbKtPDbMutFTxyMTguWheOpfKVHtVkqjJXh37LtWNd5J8UQDLVMj1Ulq1TArOUxZQrDCUyuPdWgyjOyGkvkTT2mhuslku2ImHVqKCMRQFtpJT9rRlmTZhAgoHpv8ytSiT4rsJb7PXrR4bGZvqBSIJ5Fk3SkeS6xuv6xD/Uqv/rCH41o8bCw9aKzY75GGnOXdk7YxOiLeD8XTBipDkYnHJxEsE7HudCyJ2RZPSFQ/sS3tpOXDZHZ2KXuDjfXRErmJb8bbYEazk9vr4fwvAPNzoPh99WDyjfkFcWr5RTO/Vv6S3xQ5y047e/Kf2Bkc7oyDuSf5yZynN79P1n/QqRHtyj3kmXnoO2cwbdgzi3beM36sXoJ+4TZzMs2o9BFkHMo+g9hp6H5jWuOe3IQXagYzJ9HP8KAPf8j09iyZXf9GBCttdJ3v2PtQH5LRlM+WGWHfIz3rk2JRaesbuaX18KuHAcfsV6bnDGY0X2ZuNKwDWbwTH5DVmRghbfgV/53MoDlHGc+7P+l4G72nOffA0eR8XwxgkWfaVSc/o4foY9X71bHPESTVN84dx93z1tnxaU42nymaezg7a3V6mnZL6yU4HfvoKeNtMCj3ojjT/YvclzP9WKmjcyY6kdk3bs/1THKCwSzq5LkTwcqA8RBZXBA9Q6mORnJtFjqLShcbNU6wr0/XaHbuiruDQfqJ9QfRHI8g5XiPPJMGFoOycojeGughSf1+RobwFqPJSdjTxzGyXRFJ4XRnRrt4J9b4MRCd+8V4iZ7bWvQcmZkfzThehDbu3FozfMzfM/TUf2FqZ+wMhvS+Ml4uhLmnXrbRWKyr5h6cfpaQiNNu7rmTualzfHw0+bYxIiLeMO9EO62jadg8mkjxczgHp47fszgYs7evabeczrx/MueIzvsnua09w1yE5G2iq3Ilmm+Ii9nJqbEju4+3O4ebvZKzqXE470c686ufakxrLRv13MghXER24qb3nYP0fpMxsTgScPcYeZcYJdZwZtPEqnmSZO7HnpzTDI2sRn4YQUyRJKuC5MNmzGAwi7t5/8xI9mFKdGal95EzNuWeo+ckM/vZvpg7Tj+1Izg7Ne6N96ip1Q/pTs7lLK6N/iM6k/rJnZGPwABGzQw0CV3UyeMDrMnm3alxhn195kYTrT+SKfVfiN1Ll0zMeBT3skYkeQlmt+ckRzOQ9nNWatHLlBORfJAsRtBNT8Tts9BY/UqOUptbM2B0skRKYe4KO5/mzIwuKf53Mr/9y+9Z1dRO8rmS8yLnfcmZka7e+6fOYWbM4bx+jr2TWV2ZzxlO0p894oU5sJFjHOjqxrEP512mlQKrL7Ls2Wwb+Wyp38jhav2PUg4yPf0dvZo8a21OVA0x23Ujn6uaSngJLmFtvf7cR7p+9CW4pbW/mNpbcJjbZnZ68kpLbsFnj0dgo+km73fyyvS0yJF/8fJdTXeMM3pPFO85YN4k2T8vl/p/Co61L0ePWXis2Lh8RkTepWU+S2T0yRTiQw4ly6FnMpEejtOS/uhPYGYRnE6ZXtZHczDfAdXxfjSz4vFu07M6s+KXeCfTFX1halzKmjtIcieCRd9VMxOT1UNRGfZFLN4nJqeTkdJP1rk/pIs7cqr15BsBl6VEMIP1qzNwg5uyaG5bOMnnjno09a6QiEdHgOKSrm6/Ghtzx3Kq+okU+AC554hc0JwBIW/NHM6SRHMiFaKdy+QbmXftreb8lclfgzmt/ZIXmft4CRYNWZk9TBGV20nTgWLWVL/04cdO95XUWBzL+Y4jH+Y7oB3Nga5sl0hxDk/Pj2ZOPMB0ekiiM+IkXnVIF/nx2cvMJ+ZdUqfhTXcE9S/G6fn4R2AyLW9BJOP1MjfqL6Z2xp7JLLz+AMiPgVyh/pIonpvuL4cxPfXV9lWTV4eS/Qcl6oT0Qs5Kym7pha7fqruLKyVZjzQVQkTrN0akvmwT+kajjGkoHhNZ/tFxb+FVJzfpi1AL/4yjR7LvZ+1Dq8+X1FT9By1xyPKFpNUX0lPrJLU5ojxra+gH4omggT3ZJbT5Cx2fgOJhBP1SKB7bzW1LWaVlG23lT+QfSqOlk2pVeZyN+CZWl32v2NHEKzmWGi16ImWl9sC061KctuwTbi27JXITsxxJelBCZA2xI4IyCdH72FiyTYgnJETgaYmSnb2OLBEmwj/CWzvpOXPMCje0tOkhRks3iscSq9sjJeqtvNDrw9yD0rKQM0CC1UjSyH9HGtN/YwzicZh4qHUfknZVsbH0Geek6AstidmsJQbChrJsS7JsK4/9TSnO2pNLS99JkyXZliXZVv9euT2+MvmGJI6KMkmWNdoRMn/iuTPK634xkjOZoZNk9ZfkrZfZJMVIujw0BRYFEamJ55upYeuk3p/LWSZKTzoeYdNB2GFaHyhdRyhP2j+0HMF+pW96VHZsFpn1ztTeIqdSeyAWy7IJmQucnRhikIvnW2t9aPVhxHIM+0JSu5vsL+ZUvCVV0aQ++NUVbDeB7jrMFzJDomaiFA95VzcpPUlPSqpWn9hJhtYPZcpm9wO1/pIWx/FVk1c/0cp99pXJN/TNzMCTZC/1TWqax+AIUtlR+qJXL+mxnSZ8KVvkI8WTVqALI0djHuJkvJeIPQfpRrBIFEt5ov8MiizxwixOIJoYy9X2lZL5E88vMVkmsko2lnJk6KToC5lvowkR9uQ2lLC+iSfhE9IvJVna8J2diQfTYZPTYVsqu6tSVmk8QsSPFk980Pps7GOaTMQ7xWMiy+r8SbNL1jwnSVhK4ysptA5FJIc2eaYt7dXxiEM900xI0xMtMcvykFyEHR3rm/EmxLNtOSLnz8qu8S1LhImDyV/C23MjHlo8nUkeZqBtsQhLXd1kLxWa3dR9oSR6rDyWA/ahyNTn0BVs9jpL+64V/Rg9zMZKHbS3zEbsKLJZ1d3Qltm1e3ho18vu2Kh/kDJN6muQ3yirWneidPqq2j1XRr/Q8YlXmjmpX+jVJy3bMcUu27J43pgSkdU+kg8n80yQbar6oleHEoKQwrZnsxStUjopnnigXrZqNpai/wzxtJEuyBLZLARLeSBL9ZMQeS2xsfCd9IuWZNmWZNlWHvuLWn1Szcb95NG2p3YjXvUy+Rmcb76UZKdvKaEJ8VhiibLCbGaztPtBr4ZprrIUBq+kI3Vij+mg8BKeTVqOtlS9TJ7oYfHEB/GCK/9Vyoz0wEDwCBuHsC9kvo2+EcFaW1PVC10/u8XDIePY3aWlPRpgkTslk4ef6A+A/BioPH9zfnHsL5w059fJ9vMrYiqjyTCbh/1l8v6LI3ZGUMkQgkbcsAAAEABJREFUagEmq6KMR2QxMaB/KqOzR4cpXxg73TcyunqZfCPvSvsU4kX8MAbBZ81tNA/S24zajRXP2zHjL6Z2BmOac2uI7BcI++7weI2zHI+Yt7p8N3hM2fb1OTRZdk50daPvhbE3MpIR9DI5Htnoiqi+bqYjWMkmOIHuhHcyph2vpJCVS2nsd4LeS5mLaG3IzrXdP6SLo/9x7dnjTGdz9EZ6qsOtkR7vdCPlY9Q3O+JiZgQvnRNEvkNAfbLsR8eFpKwee2UKRO9jY/GKzMPLwerck2RJdXp4heY35hQGKyOOQHI6+6XemehHMjk+Mf+u0ZyvXoIMzR1Xxj51xbG1E3Fl8peIfQ5CsDjMC3cfxnuL4+yN28zn+B2QuamnMoyTqGJjRWZimr7Id5Qqs9sXEvxjseJQj+ZUv1N6f9mx9FNkzan1fjTz6qWLHmbHmZlkPzrN8WHfAXKUNg53dcN6YSs5ycG0RH+CyfhXjaQ7e7qvab20Jrky+RkkrH4ZYQacL1uDsV9MT2aerPjn1imdTSv8aLLqJXlG9zuulS2vAecoe3TRV0+WY2U2YrsziphvjlObR9PRlXwrh4Z1IOt2R+5JMIhFtavbi8781ENebLpI3jSlXb0nOceL5f2FqByN4TUo3XqfdLzEMTv5GYf5wtzF55k76GHle6s1GxIzK70lww8mJQczgjNp49BHpxj/ZA7kuwvbeVaSHJWQY1mdle7MvpMujPxnrTU2Fv0xZ3ZrmUIBF5MzvWhJrf5JWlInxr/qcc6TzKRt7iPJXe2uT1fak7+RM1ybvceapDdJ2Q31F1M7gtbrwNhfVuS1pXn6GmwsPlAWrQhWXu74bHe2Qt8Ta3d8sh3zpfmOWrwzd0w/Pt9fdUhv8xtzd4whbXMHA1jNQzrIJ2Nq5Oqo+DCH455MW/wLaW0Zq0RzpJcnbU4t5GT9bt/FNPzEHgxaa/LZOgP5Sgqs/uOdJMmLJjJzme+RSbwadZJTk2eNSzmCeNb9hK22zuw6r2QetXkNTmRdgkH3V8fY9vU7neMcSq1ZvOgn0tSeZdpIMxN05g/paT3kbFeMU5OMyU6e2nUIbiSfdPDXzvGWT25ym4lXvUxO+vzyTEsNnK+RPHH4yYmRs+ddJ/v6DjHjZNYr6Wn9ibknPg157d6DzqxTp3ZGO1B/MTUGszKDce9fxTb0P9s0Drm9PmRGDlNi6Iump/ULSbv2BPl3x+rck09zktbqC1NL+0lq1TAr+UkEi5ft2o1qzWXyI7ByH/h+1+q0UUtLUzZWxw7pSsK7sfC/NAf7nZ5MSw5cSG2uWB+RLEHaavIGl5R1Z0Y1fnshb8A/WV2IG68ylSfNHOyMTNuddbDu3BPrpzbBVUwiZ7Xnximxt3QyPUcwMasN8SK+GS8xlzGmDX+Q0rEurU2PGfDUSaJPklRD5sy/J2+Ih5zvmGRl3gxFvfs3598g+05r/2gchjQ/mfM4KdGJ3ftC5P7fAOQi/zMsp4efFH9p2YSI8IhqyY5/ZXJJ7hJlkVb8sg71K736gRaPlZnSQTKrT/3kGzYJS28UxdRembH0BOkpZzvcqER1Z6HgoX9ITYRNhbAv7NFo0QIlqD5pS3KnZUyzG2rppWiefPdDn5wTSLXD6L8iXanDWdZxVuYsmzdEwcpjOWD/4RiidTp+NEbWNtgRtC7t6E+Q6Y9h+vfTCbQtMx91n0kN37KyRK6kr5Smrj5pSzK0fpii8E+azI8OJouadSF59TL5GVbus5daVpNXX5kZ0RemR3nWJzWR9UPm1n+kZVtsrIMSImsoHnqoKuZQ8yBYk2ev6Ia6MvlLxBYbS29MjeA12pK2RHUT8ViHtr16qSuFin6iRDFLedrFxlLMoZPKHpKwyKOfQpq69E5Jll7C61t5bKMJqGQQJduSrMFSS1MhkJr6RYuHGkti82zs/mhUBTRx5KGVZ3al1pSNpTxPjHcGCUt5sZMkaBuKWNrknTm0l/GIUcoJ5XnUnKl/I071MvlGhtkWi3DGQn1Cmlx6oWWJMHEw+QaDN6NO5u2BzSBLtClPeIQo2Nkke6knGtdpGnY/tHiMA9gdXCJjK7fw0Rcj6VEI/4oMS/3GCCJzwLFGzq7z3UwmniWzmr1Sss3GOikpFvFDjGmzwjSGqOpS170dOC90fOKVVuezscg/Ws45y54gEVnMCyWlLp6DSYksZyM+nMwyrmQ/Ea++qUvdLD1SPKkBPRKTpRQPKk8FSTjh9OBoWW3xsHV1m+qkithX1dB3anVp6Yd1cIfiMcpLgNInKLAu2pNzuSXZliXZliXZ/orDW0pTF096BzLMFh4xVpQoXenVkBmtnhRPfJAuQ2qsJCrrVf5qUWTpkSl8h3jigZwJrryUmnajCbIkXoj1RSqY9gMljuBL79Q80yWFR0RN7vrijmR2d+Q3OZGan4gnceYS0mhp6ZMyHps3DnWneNIB0ucrJV5FeW6kp7rMJvqWComll3SwrD49THaQ9HXtkYxpz3HmRpqql8kJO5pTSxu9EmjlL1Mktlu/jGN8SwyxfCEpGjt7hJpPyx+5p6Yn4tVfJj8jV8S/Mrn69G6yEOiXlrJSOGnZxvcvxUPNgKKGulOfx1PBMJH1RWYpPa+UlFqOnZSEjlQe8qJkY4mGqVs/lCXCxC/HEU/rVruykVbcaWW+PYwgBasVEq/MyNSvTP4SDLeUacpjm1yyrTy21T+oZJZEznqmeOhhSWysL9ahdGebpPVTm+g9uFmpPlMaXyrn6OYIljIoFBurxZNJLNuaZ2i50j+sPa71Ra++0JKYzVpiIOwwllMmrDy2ZRLbS90pjZbg9jT71tQ648rt8YXpQQue/wtAfiDMD4L8OsivheJXQ34irFfiXZn8P8fOYlh++eQYd8Tb4NZ6N3Jf9TL5ETTXhUxgVlU5ui+PvpIK9zMCnyQr508yo/qBc4i9zSeZyKKfa0i6l7RVQBZW97LZ3sOLsHDQ+V4QrP+gGT79GUl/NRuLUdmZA/KmKWPmLY9Isfn63zqz7zH30E4rJ5k5efzE4S17L/lfTC3BIFYyZjMrWeZ/Mx7RT8UBFv0YWYjjfTFZNd85Q7iBJGcBzXeNxxR23omeTRapEPX5nOFL5L06uPWd1aPZDp0ZjKaHlSSv80X6GdR5IcFpdnwOMQGZPZo0labdmEctaXpLes78uxZ9ic560IefN82sK1OLDr9rTzreQ/DirM/diKy8/IfcE8HHGp87Z+F0sdHDFOpZ0VFL7q37xcwcP4fpZcWbNgQremJ6vmvVfZk20/rC9BB5K8Cir6vbRe89gGH4JFzC4lU5TXt9jPxnJfGt492iIzj7yq1x24xfnTvOM3jVy+SJnAlvkVdN35XJj/jUOM5aTTaLt8i8CmohkYwJfFzq0fSM5iWrL6TGSnn6OZLvhLZTk1zqbUDf2TNziOG8QYcmpa9YkmdV0fNLnPpL8tzf+eRPjJeY63N3Xo/zXMSRHJ+gofqROUekdgTNdV459/x/ys5t23Ulx7FA/v8/d0+AlCzZ0tqnYpEEAV4i7J1VD+4eWZTZTydXTh49fmhXTL6eexiApTls9pCREFMZL2c/jUnzyRZRqgdJYuykgXrJ/xkZyDLuZ8vuisY2dLTYFxmaiDOTV8/MF6dW/RFZX/2KXDYrImb0g7ww/+65K0iBetkH03N49iT/C1M7nV3Nr5j8P3rvovdEXsjnY+W+Dz4fj0h+qUW4fiaqnSFgbEgvDsEOzhQaRjv3IlOMDafMUzAKtQbUQSbaR8DQ6CSZevJZjJRO6hhkDYL1MrBvL874jDKHlp4PR4C0nzv+xlzFjq7M3DffWval5wmj/Wdnf3sXf3ZyX59xwfTkcwQzm/wB2cjXkLnx4cT0spNiLMIFKcToYS16SFoWRySGs5eMJuKFl8GDATDGlrTm1UkXacBSyJXB9kIw+rgjCd5/t39htv6//0fMaBZ/I/um2mtyX7qyOzicntyTjuCfPvtpYTRzV07Ojlvt4DdkrhykmRg2fvATLzvTwaP7dhB6e8MbpwljYHdCaH3jfFntW6SNLCMB8C7kLSzjkdH5JMzSNPwf+W2W8XJuyRjQNSz6xRS5lBHK3EmepmSPmIV49zMUhNIa0hXkB7IlMg0YevjFuavzf2Fqh2dX8hvuXXyO7kqNy7Df+xCn5/KG1WjGPjqEm7r0C7kPOSLdyUi5lCy7U/0Tv+7LPYdTYpxd2GhZOt4aN8Voajk4CS9pwwN2AD1IT7LMDGYDl9UaUoq4SBdyCKPo4R8f/cK5I58dhVLjF7IiPf1I1NmNoUTHuaT8hunD6eru1F59d7Bker947k0NZB3G3vKG4RuZ7Nv/Rhb1LWDmWMNQjLHZjbw8Eg1YBTBvnLyE1kE6MXKU1sH25hryANvpidFXS6iKeEHk7OCZoyfBu++fmBF2saP9XByEshK9nB7exKpEfHlr6cEpEneG7MqTn85s82fsD4D5MZDdKvKr4C+iVF9Mvp4h28LwB2Rxa6/ITGq6YvIXt9qZnc0eOA1qPTVc+IeHMBmhaYJpccQHFMfoANEBsAAOH9Z4CCdukvvSEPzLj54bhkgZU87XykjxkS2HEIsMmVx48eAnToUy5hDZB0pKenFxtqygZAWJH1SZ7EVdsRMoiw7if2FquDi2heGWYhDbsg238ifyD0rDpRMlWXP+iexq56KdCXzR3vxEuptfMfk6cL888yuS6lIsLU9mMkvEw53cYQ2wAyVIbBA5JM/6oFWuRQgmlaMt/vIqVK+Y/MVZakm2ZUm2ZUm2ZUm2X52CLMm2LM6JWr4oXXg74X+htw6yM9OFqBaHgOngydfbtzllKSH8L0zt1cXpgsHv9Ie7m8RDzEQxSfiJJOUgPfY/kJ7YdEnBw8Mm9+jssiTbsiTb6t+JqxlMJZjaDamVg5IoC6pBnyhTIwAbh0/8VatHTvcNqZQvkucu2mSHRL8jBcRYdFx4esX5xtSQdaLez/ds+ex25sPXbSuSFm24BAVjJ1fPUuqli5ZL/YCWGLI+f6QY3JTIxizaRFTR1N5cVnt0RfLyxeS4aLQk90+cZCqzcixakvyBlmLbaJfIfkFxqFEVTTpQORAs2enfXDMhHciu5q8oyWzBlJ4L2hBM66F0645efkGZNhP9gFp9kRYsBF1KCM8dwXKS8qI1+aKCFz/4iaxkwJJsy9J/dnFsTz8IlW3Ad0SzLcTYHcVJCdAbUvMWi3CFS0RLxFdPOfUbSpGUE/0vT2PqN4xg2WbDxy3DRfxG9VQlYBdu+qHsMqAnRKt+QdtIzkQxmW0ZBbhjtNM9NaKrmUz4IsPJ7EbZH2yXidFAMupEciQSjFz4yUvQ/0JqxqfLErnxQXGGCa17xTGOfXNFSO1PpKF1kB2deUB766nhdyYN9x2ZsTg3RClfJM+QHS7ZF5TgHxdny9Ula/gFJcHwA4c1+tAWD35DauWLyfEstC0MN8WYyQflA01qiEFxFhk0TGEM0a4AABAASURBVKh3jKIeWr5wOrUFG44NN2ARLi4Nl4riZAb48BCcUeKXHeIvVukuMtCyxr6QWvUTpeHSDyKkLYUPsq/6YvJ1cdxcjZbuiIApu57RU6MBIw//w6XpEYcBFyyDWt40Aa9+w1Eso0p20H+gRDF2Q1kSswE1SM9IEWvxwDaGPLk40YH0fadPPBrOcyQC9kFZtiVZtiVZtiVZtpVjOUD8xsroOj1Jug4XO5rf0Mi48Og3Z1f5oiSoLOkVJaUujsm8CJR5o4JZckNx6DBQHSRvW1JyZJWT/6Ai0rjoohFwmh1+c0rlV0y+7m9cgV2tBCOBmJSwblO4uA2XaPlG9WxZU9UXevkXMhTFbmRo0B7MkE3ulCzSu0s33h8A8+ujOIP8mkjO74X95ZGfGB+QnvyqmApD/QXzDdlFazqz6oYhbArgLEgvGUC88j+62kb9hry+fJE8b2ApbwjhhghNGyLQDEwTSXScbAtkb5zSYUfLyVfIfdGeMNrhjz0RecWuyhOjZCR4+JT5Lio8IR0MtXIie7MwpQOpbZoi3xmQOp7VW65OpZidoyermsCa8PEIWXGwg3dnAp4dQHc+IxtiaTyRjeUgN85wi2FcQ77LNgv7j35MLOaeTBbRfpBiNEp9RzHaOjCPIkkNuPOPOFnieD4dH4aJK48SvkiKhcxaCHbnEfA8M4UiAevu/s8z08Gp52Z8GlLBW1lM/uss+3wF3Dd8ktnNTHceuxfRWg/OUO/Jsk4TMIZr6dj6h1cksJEY6wRJ8OLc0alI2fKE0d6cjRkLDNKI3Xa2EPHJMxn9ism7YQOcFqz8jnzCCHwOjHo4AqTfYUbJAb4+dJIfHS02VVZAksdJ9/XshSRGP5HdzcFMBobTzGQ5AaNMZYZ5C3VyDL3W8MurZBMDaQlnD8rBgi2ipXrjI1ylo3WRBqwPekJ2tnYiY/0wF0wN+rmk5CXkkpQWL7uqlJOB+ZRdTR68/bu1hcCqlIF5Jsmdd0vUrHjB9IynqRmrg988uynd7qpWMd8AU+TEEMZL7lgWvV0vb0JuX7CrmuSuSRp5B3uSbqHfUaTwE0nKwUsvw2EsP/Shf8ft5W3T98VzT2onposejItqvRf+eSs95SDW0RP5jqhlcHQ4tfIT0xA9eK+kZdToMAh2PKHiledNuedEPsuHzx2toWfJzEbP7sWkeCz1PzHLachOgJUzMZx9rV+RrmhpAwN5Cmo/yyNWJLw2p/DikXPBDY9di6nFoWm9eUhrBKyP5N3B4zMmj/Mps4GJNl6wMvwBacUyPnV2D99t4ThfLEaFPPceno3NST7YdfQvpobH2NB7gsMn29uohYctcl+2ZPfgTqWc7iC+bb0T+YPTnphxSmkOHcxNLVB5xu0NtKfJJ7Cm5BUpYH3QiSR5cDzDLzifOQ3jTE2y8eB3nE+Uz1Kd3VV+cDto6j0HspvWeS4adHKS6MCNZ3fa7nhlc096mjWhfkMq5U9IIZbLg/k3+EH2VQ/2hQldRiv5RATyf9jZuknuzcgVk59Osfki0C/ohiH4riS72CH+4iiJ4/10pP9Eevbr6EfO805OUv4Xpraeh+a+WZksK78x2jqN2OUr2N65FJ1qLPxEesrBXvgPpIdR4tyZ5MM/WfXsTcLnGUgdrx6M+oWpIfHYFJ8uueg0Ym06sNUSsuDVkY63BFNaqWkDAoh1bdriw/lukvBGrI0fbIFnXzErwp+QcSzVw6G56nSWTc4l7blge8PX20tT/vcJEhfy1jaR/oXUGCOmb7Kd5O7wsDumM9576Ip9OKvSDlRP/uZpSO0RU/j2Y+kVk794xlM6cRMe3gzM9xbP9xY8vJzZX0TEMgrk5YEXzHeX8hWTj+euZiwLZkkQSkrGI5sfyKqD0/D03wHIr4Y0JTrIT4i/aH5FxIWnXpfs8C+U0HHpB2U0AmOJIYPSF3r5A1ocKzukA8msnurkHwyhFKFpQwQxLiWkdqI49BAVTTnfPNr6UYI2tUUqsfON21RwO5jWC0qMwqULqiftSaYqDfoRo8bFUNBu7FAzJ3XK+KIWTe3Nj54HRMJ8OlvIJ1o5LhfRyrF4VpI/0FIsjSdattF9IslwcVIDonkxEF78M3SCjsXLLgmt/IqSolVKkL55ykoJF6f8RGv4BeVUiU+o1RdpcRRfOXn5YvLTrdxnLyqIv2J2pH7B9ErEu4vD2tENwexJ7CtatlMdJLfhOCbE2KA4iFQlAvaL+hynqdSNKk++zq5qJ4pDDVN6g//Ru+KYAT98FtiL1LLbxcnE+XAIZjwtf6M1a6+YfDxFe3IbZKf9jZIlIasoPaBX+0KGotiW6LCdKNuSrIA9GEIaOemgONYvFye6GogXLINfUOTxqEH1WL0vuRPwH0TA2viEQuySX7TRWKn0SLIPrp6D3dHyVovM/CJK9UVy4Xa4SI0PirNyNWjRJKNbTk58R7fayNAdNTVfkRwuDu06XGi2heGWag2kV/TyoDj/QtGvnuyepFG2j6RowzEK0okk1YOSmktFccKBDw/BaSd+2SFabmWiYM3YZXKduBVfkJrCT5SGSz+IkLYUruirnvz0dsJe0NHxV7Ryj/2EaMJTA1XMLjRxlh/6iSnhMSfgJzIDpXUU+4pe/Yp0p8eDSWmSlisn+Ss+FaO9eOQsB72oxZNbWmnw4EXreGNR4ZZesRXlmJ4DTRIHqiaPhwSze9CRZF8w+atrer0oDZcuSC5OegZESiZwMpOJM5joYdwravbBxbFKtWip/AnFQde6kxht0UUj4MeSaKdTav6EaIwR9dTSUnYmATH6LNsflGVbkmVbOfYXRsRX1lT1gq6eaHEYMordKC3awwEkcqdk8uDFpdGkF2RGUqKlRRfvzFLUwA9Sqf6EFGJ9aOohF2SXqFmOSByEYIaLYzx2YPIXP1rY2Y4njPbqTLUm2bvsgEe0rBz/gabB1C2x0/IFScsvOGXRGrGYfNzLF/WEaNWDWfEvTM+6PyiObTZJtpVjg7EbeupoZIJgHhSn+hUlqg1FabgE3hX7zlWOdqI44YAWUyPVidTKwVhyMGUJggVPrhzr4GQIiQYl8ydO0YI1XFCCxIrdMy1wa/gd7XBLsmxcOCiOTX7F1MJPFNmLf89euDg2u9dVFBBNIondURxLWMMvVqF+RS//YIejWhwCpgeOFPnd05BZ3p60jeEh0X5QnDZQGRSZOD4RghmPdEdHkthtcYJ4+RO2pZ20fDCZnSgl1gnYh0vkxr8x2jo7mp24vb5gauFfnsX/m18Q+e2VnwX5kRDKr4b65mitLyb/8Z1hSX7xpHzZRa07g9nxD+SnSboysTtgWRj9B9OW+hXZzzto7/yfOEUiA+xm03UYnb0bKYTg9BLLL+lIK3QXCsgjaGXzJY+W7+kX08qOWPq7AnJDCDZl9pIzta+8cuZoipK7gr2Pzg9nMj1tpeMR03P4V89l17HzB9NzOnuaL+a+cLAKiOWZ86kub6MNnWq1/4jZkv6/MLX1vH1S9pMMJ2dH3scDopKizYMmT72eMrXYC498jDI8KxGqFxm+Inn7gjTxLwBNpK/WQHUxPU0buh9pkbnICBha+MWzhQLK1H54rk71gunJx45n9w2/erN7nQsw6l8cEcui1GYZLbmQm5YDIXShx8hqBGpMElencThxFlFI3xNnLD0tEzDG6Y/+5DRgPDg2DZln6Ps/Owfn1vYNZnUWLJJiIWxI23axc3R4kvATSco/mLvieVTw9K5kxw17XVq5c2vN0LP31ps6Xv0FUzt9d/Rp6Q8f5wrs0NKAjjJ25fRUXCRP1m7uuSOPTZ3x0eHk28ZnDIk2mO+FdlqH07B5OJ7iZziDU0fvLArCxPY1bch09v0TM4d33z+R29ozmIugvCa8LFfC+Ya4mEhOjQhtHG0jw81ekdnUGM77SGd/+VONba0lUM+NDKFCEvEb3zcH0vuNrInESIC7R8hbIhSRBmc3TVjFE0nmfuTJmWZpaDn0gyH4FEliJSQfbMYOFmPczfuzI9kHU6Izlt5HnLUpd46eE9nZz/aFuePUUzuc2alxb7RHTq16kO7kXI5xbfgf3p3UT9wd+QgsYNXsgJPQRZ08OoA02bydGjPE1dkbjrf+iGyp/oLIvXSRjVkP415sSJIXZ3d7TmQ0C2k/d6UWvphyPJQPEmMF3fSE3D4LjeWvyCi1uTULhieLpxTMXcHupzk7w4sU/zuyv/2L37vKqZ3I50rOQ877krMjXb33T55hdsxwnp+xd2RXLfuZYZL+xJAXzMB6xhioNTD2wXnLtFLA+pDFzias57OlfkOGy09ke/q7OotEBYKtvDxvH7FdFD9IrRwlePHj/tw5PvfRQilz4Rfnttb+wtTenGG2zu705EmL3IJOjIYjw+kmz9sO/ovpaROlfyHf0XSRMEe8Wu+JwDsH2DdJ4udxqf8nZ6x9GT12oWGRUfmMkLyp5eNNV0whHGQoWYaekY30sI6W9Id/HDGGM50yvdiHM5jvgOpoP5xd0Xjy9CzPruhFtBPTFX7B1LgUmztIcicEo+/K2YmIdSgsy74QifdEZDoZKf1k3fuDdHFHplpPvh7gspRwdmC/PAvXuSlGc9uCk3zuqEZT7wri0egIwLik1vDLkRF3LVPlT0iBD5B7Ds8FzVkQ5NXsYZYknIlU8HYuJl/PvmtvOfNXTP7q7GntF3nI3McjMBpi2T2YIiy3k6YDxq6pfvFDj5zuK1LDGMt815EP5jugHc5ALeHiKc7w9Pxw9kQD2E4PSXhWnIhWHqSL/PjsxezH5y2p0/DGu4L6F0bpfPTDEdmWV+DJeF72hv2FqZ2+M9lV7cqT3/1/yq+DPOAbbcunbtm4cEu28ReUpia9ILOSEi29oKu36kZxpSTrEU0FF976DUNSX2wT/IaGGdGgOMZj/uFRb+5lJ27Sh1AL/ulHj2TfZ+2Dq+eLaqr+Ay0xZPmCpOUXpKfSidRmRDkra9APiCacBmKyi2vzF3R0HBSHFfRLQXFsN7ctxYqWbbiVP5F/UBounahWleME/BuRava9Yofjr8hYarToCSkrtQdMuy7FaUscd2uJlsiNjzmU9EAJEhtEDgkUk+C9j4DJNi5OEBeOpkWY7MQqsoQbD/7h3tqJnpljV3BdizY9+HDphuJYwhoeUaLeygt6dTD3wLRYkLNAAsuhpKH/9jSm/4YR8Mdl4lBrHCStlREwfdY5KfyClsRubBEBYoOybEuybCvH/kYpysqTS4u+I02WZFuWZFv9e8Xt8RWTr0tiVJRJYtZwh8j8iXPHMK/6haHMZIdOJKu+SN56MUFShKSLB6eAURCemjjfmBqyTtT7ucyyUXri0XCbDtwOpvUBpesK5aT9g5ZDiFf0jQ9LRMbIrHdM7c0zldoDImGWjctc4ER8EIFcnG+u1UGrhxWLI9gXJLUbZH9hpqItUhVN6kEvLyHcCLx2iC/IDonaieKECzUoKbWkJ0oqV0/kJIPWD8pYzfGbAAAQAElEQVSUTfQDavVFWhzFV05e/oRW7rOvmHxd35gdaJLsRX0jNc0xcDip7DB9oZcv0mM7TehSQugjipNWQBcMHY54kBOjvXjkGaQbgpEoknLC/3SKmHgwxgSkiZFcbl9RMn/i/CIiZjxWJGDKyKCTwi/IfhuOC7cnt0EJ6RvRJHRc+kVJltZ9x+5EA9Nhk9NhWyo2qlRW0Wi48B8uTnSg9QnEEU0m/B3FMR6zun/SRMmacyIJpjS+IoXWQeHJQZs82xbt5dHwgz2j2ZCmJ7TELsuD5MLt8EjfGG1cnG3LiJw/K1GjW5Zw4wcmf3Fvzw3R4OJ0J3kwC20Lwy3VGmQvKmiiqfuCkuixciwHiIMiU8/BSwj2Kov2nSv80TtMwFIH2ltMwHcV2Vh5A9wyURuDB3e1REeG/QMp06Q+g/yGssp1R5hOXWUbc2X4Czo6/opmT+oX9PITLdsRRZRtWZw3TAmPtY/kg5N5Nsg2VX2hlwclCC4F255gKVxF6URxogHVEsoJmML/dHHaSBeIiWwMgikHxFQ9CZ5niYChO+kXWpJlW5JlWzn2F2r5iWo26icPtz21G6KVLyY/nfnmi5Ls9C1KcFwcS5goK5hggqWNB3o5mOYyS8HAK9KROr5jOlBocU+QFodbKl9MHu+wONGBaIEr/quUHekBAwIPt1Fw+4Lst+E3hGAra6p6QVdPtDgMGcVulBbt4QASuVMyefAPl6ZHKv5PHH4sbCzmV8Owxf7iefsFMr8g8uskzcSUcbLwnQGYyBJ6A6mBEUmTJV0chQ0XHhY9GPmCkZnOHdk+SFZ9Mfl6f2VtTsDoqDWcPAl+LGN/bm1PE2o3LHkOx46/MLXTWdOc24JQvtBEYO894MBW6S9evpsnzs7pSGRBrYFP+YKR17OSFfRyXzSy4SVhvJMa2djck7gqK4Y9ctbQ0B3PSEMsl9Lw/e/Zza21KU/gGnJ6z6WjRvkPvrPHTHczdkN6yoNbI+1930j5WPWNXXERM8rjM4H3ky2mEh5MxwVJsYizCYLdeQS89xEwnso+tDSWM93vdpHq9Dy8IGNxSnRnw/jBb5jlCLObvhvnlnC89WKbuXsRyCW9j4CxJCIOwUiudihXTP7ikX8uYF/1xeRv/jNLI5+jjwymfnN2lqeD3tD1MgJWpUjA0jxT7BzOd5eucDxfWL9Duu7IaOr0jh6OlxOw7Hv3uWcic+xKPrvIfngWRgf7FpDltDFca0B6wVYyyWBawj/OZvQrh9KdmO5rWi2tSa6Y/HQSLN/fzELOx5J39gunkcrqZP/F2t3ddIMfTla+SJ4r+h1XSuDTRZ9RYnihT0+25YyGLh7f2CBT6MnHIVjyrfQqOFgFxG535J44gxjVWsMLZx+VLKGLt4UDaM88tfHek3QasyKMp12EpEdj8OrpDv8LU4tnT/Dmh/iC3U3txAyH80Q+X6yPjpSeIj0HJiUH2tapcr6jA1NkUWkxGXXylJJ949GRluYErHfckWmE/GetzyNg9EXsa5rTBWn8RS6hmydsvRkBG50R8tjRcWIuo5D7gd7V7up0ZUHyN+xQAp4egOckds0G+GNx9dQOR7ouiPwlhV5bmqevTsD4IDFaIVjeMZ8xnynCga3Q94SVuz5ZpkKKCEW+myfMXaeensMzl/yGuTvCIOVcU5Idh9OBHpbSFfksVKpmmDz3D9+pttMXxNtGqQhnJO2FCSlGooglG71kihXCr06p+hWTr6c16StSwPqPdyJJHhrP7sX5jCwr54WLKDWm/gPynWxX+9lR5RX3Hpp7fzHaeFYxmlfePwKF0budOoPRmkULf0Ka2rOYNtLsAnrHD9LTepDZWoSTk4xIJE/tugQ1lE808FdkvOUTN7ntRCtfTE76/Hi2pQacz0geP/Tk+NCJeetkX98hYpTsekV6Wn/C3BOdhjy798Cz6+Spnd4O2F+YGoux7GDd+1exDZ//rNGNNjyvmCWoLH3hacFj7UuyvhOwo/KF3MViLDqOQWoN4em54a6LRtov40RE7Jy9F+lK8epI2/P91vK0bktTAnZZT1cE3oihf3F297s8MS0ZuCC1uWJ1SLI4aavJ61xSrDo7ytHbC/IC/r2rgqjRSlN54uxBzsq03bEK0h13YvXUxrmKTeRYe244JWJLJ6bncDbG2hAt5Bujxecy1rThD6R02KW16bEDPHmS8BNJykH2zL8nL0SDzndMsjQvg1Fv/Mb5N0jcbe0fjsKS5idmHiUlOpF7XxB65ifPne0lAf9ncNxycn5S/EXLxoUHDy+X7OhXTC7JNVEWackvVqF+RS9/QItjZad0IJnVUz35uk2C6Q1FMbVXzFp6AukpTjjUYZpqd0kCU39EatWfUKLEZCx1Ca6epV/cMlUTDWrRi2Jo8o0HP3EmoGqH4X95ulIHx6xjVmaW4HVRsHIsB4g/OIJonY4fjhDbBjuE1kU7/ONk+mOZ/n26gbbF7Ifdd1JDt6yYyJX0FaWpqydtSQatH0xR6CeazI8KIkbNuiB5+WLy063cZy9qsZy8/IrZEX7B9ChndVLjsR9kb/VHtGyLgB0oQWKD4tBDVREHNQeCTZ5Y0gC7YvIXjywCpjdMDecZbUlbvLyJONbBbS9f1BUFC39CiWJMOe0iYIo46KSyB0kw8vAnl6YuvaMkSy/u1a0c23AcVDIQJtuSrIFFLZoKDtXUL1wcaphE8ASiPxxWAho/8qCVM1GpNSVgynnCaKeTYMrDTiSB26DwRZu8OwftxWj4MGVCOY+cmeo3RClfTL6eZbaF4c5aUB+XJpde0LKEGz8w+TqLN6NO5u0Bm4GYaFNO8HBRsBMke1FPaFSnabDx4OIYBSA6cPGsLd3Ch1+EpEch+JdnWeo3DMGzBzhs6ESdbzOZOIvsavaKkm0CdqKkSPgPIkybFUxjEFZe1DW2A+UFHR1/Rav7CRj5h8uZs+xxEpFFvKCk1MU5MCkecwL+wckso0r2E6JVN3WpwdIjipMaoEdExJTigcopIQmOOz0oWiy3OIRaw1QnVcg+VYO+o5YXLf1gFdRBcQzzIgDTxylgF+7JudySbMuSbMuSbH/5oS1KUxcnvQMymBA8fKQwUbqil4PsaPVEcaID6TJIDUuiYrXSXy6KmB4xhW8XJxqQmcAVL6WmDTSBmMSDsC+kgmg/oMQIuvSOmjNdUvDwsMldXdyRzG6EfiMTqfkJ0SRmLi4NlxZ9ooxG8PrB7ihOOoD0+YoST1HODekpLyaIvkUF8UUv0oFZPR0mO5D01XYka9pzzNyQpvLF5LgdztSiDV8KaOkvpohvt34xitEtscTyBUnhyIkhaj4tf+Semp4Qrfpi8tNzRfQrJldP7yYLAvpFS7EUTrRso/sXxaFmgKIGdUd9jqeCYDz2hexSel5RUmoZO1ESPFQ55IUiARMNU7d+UJZw4784ijitW+1KIC25oliOAcalhBtXdPwVGUlNarQE/uEsn55E+g4OimObeRxUMksix55RHHowiYB9YRVKd2yTtHpq470HNZbqM0qjS8UZ3RyCKYuCImAtnpjEsq05g5ZL/YOVR7W+0MsvaEnsxhYRIHYwklPGrRzbMontRd1RGi6B29Psm1Prjitujy+YHrgWgaRp+MH/5ddKfj/kl8LGQX4urP6fkF8g23fF5Ov8DEk5kd1oyRB624HRDj80sN3g0TtcAAq/XmYhZThWHiSJpXBi+ksY+ULuRSSuThbOJow5riNpLNJWAmJIjcVmvZcMzHeYXf8nZPn0ZyV7ygkYKxOz8oOIeeXhKTZf/Ztn993nHtppZZIrJ48eP7RFvp/O/4WpxVmEJWM3u5Jl/zdGw/lQ9O09M7g8Gg1ouRsRe+GzhBtI0g/QfOdoTBN5Ez2bLKSCV//cmx3fPm9hLL0dSdidSatnx/SEUu2aO9LMC7sviLceZIgN0ET6auSL07I8vdHr39qVJ19nQe49/eAn5mp6+xEWUwsP5s7kf2FqD54v4ryX+vAuS5qLuWE5ELEvyOdL5UBqN51aeTB7HzC7uGChi6BMkVY8kQSLNqsg2MnZnZxhoIVfTA/O9rQ1I2D01xrg+SDtou+ClFkaG52HHN9bxCN/xK6cXa3/8K1x+1yzPHecvWjli8njmQnePE9M3xWTH/6pMY4tJxvjFdlXQi2IJ2MDH5d6OD3DeWT5BalhKU8/I/nstJ2c5FJvA/yOnZkhlvOCLk1KX2GRPFZGzy+iVF8kz/3dT/6E0eJzfe7O85jnIkYyPk5D+SNmDk/tcJqrvOLcQ5n9dHLl5NHjh3bF5Ou5hwFYmsNmDxkJMZXxcvbTmDSfbBGlepAkxk4aqJf8n5GBLON+tuyuaGxDR4t9kaGJODN59cx8cWrVH5H11a/IZbMiYkY/yAvz7567ghSol30wPYdnT/K/MLXT2dX8isn/o/cuek/khXw+Vu774PPxiOSXWoTrZ6LaGQLGhvTiEOzgTKFhtHMvMsXYcMo8BaNQa0AdZKJ9BAyNTpKpJ5/FSOmkjkHWIFgvA/v24ozPKHNo6flwBEj7ueNvzFXs6MrMffOtZV96njDaf3b2t3fxZyf39RkXTE8+RzCzyR+QjXwNmRsfTkwvOynGIlyQQowe1qKHpGVxRGI4e8loIl54GTwYAGNsSWtenXSRBiyFXBlsLwSjjzuS4P13+xdmKz0Aq7I4K05EZh8RtdfQVMzudjGbjuEo4X86m1p/QjS2U+YatmbdwW9IrRykmRg2fvATLzvTkZ2pgdDPPWhvnCaMAXpyF4TWN86X1b5F2sgyEgDvQr43lvHI6Gxnlqbh/8hvs4yXc0vGgK5h0S+myKWMUOZO8jQle8QsxLufoSCU1pCuID+QLZFpwNDDL85dnf8LUzs8u5LfcO/ic3RXalyG/d6HOD2XN6xGM/bRIdzUpV/IfcgR6U5GyqVk2Z3qn/h1X+45nBLj7MJGy9Lx1rgpRlPLwUl4SRsesAPoQXqSZWYwG7is1pBSxEW6kEMYRQ//+OgXzh357CiUGr+QFenpR6LObgwlOs4l5TdMH05Xd6f26ruDJdP7xXNvaiDrMPaWNwzfyGTf/jeyqG8BM8cahmKMzW7k5ZFowCqAeePkJbQO0omRo7QOtjfXkAfYTk+MvlpCVcQLImcHzxw9Cd59/8SMsIsd7efiIJSV6OX08CZWJeLLW0sPTpG4M2RXnvx0Zpu/YWbfatL/8pOgZYmfCS0PJl8fyYLiDyih49ILMiMp0dKi39HbAzYDnW6LY+UdsvSOKaa+qKCJjviA4hgdIDoAFsDhwxoP4cRN+iA6gn85LUr9hiE6ZX2t1J6RveVFdk2WaOngJyIp+gWpVUI+sFK4pOZSkVi0+HNZsnEaPdklHj2LDuJ/YWq4OLaF4ZZiENuyDbfyJ/IPSsOlEyVZc/6J7Grnop0JfNHe/ES6m18x+TpwvzzzK5LqUiwtT2YyS8TDndxhDbADJUhsEDkkz/qgVa5FCCaVoy3+1qOZNwAAEABJREFU8ipUr5j8xVlqSbZlSbZlSbZlSbZfnYIsybYszolavihdeDvhf6G3DrIz04WoFoeA6eDJ19u3OWUpIfwvTO3VxemCwe/0h7ubxEPMRDFJ+Ikk5SA99j+Qnth0ScHDwyb36OyyJNuyJNvq34mrGUwlmNoNqZWDkigLqkGfKFMjABuHT/xVq0dO9w2plC+S5y7aZIdEvyMFxFh0XHh6xfnG1JB1ot7P92z57Hbmw9dtK5IWbbgEBWMnV89S6qWLlkv9gJYYsj5/pBjclMjGLNpEVNHU3lxWe3RF8vLF5LhotCT3T5xkKrNyLFqS/IGWYttol8h+QXGoURVNOlA5ECzZ6d9cMyEdyK7mrygptSz6QhsR03rK4tzRGn5BOV3EJ9Tqi7RgIehSQnh2BstJyovW5IsKXvzgJ7KSAUuyLUv/2cWxPf0gVLYB3xHNthBjdxQnJUBvSM1bLMIVLhEtEV895dRvKEVSTvS/PI2p3zCCZZsNH7cMF/Eb1VOVgF246Yeyy4CeEK36BW0jORPFZLZlFOCO0U731IiuZjLhiwwnsxtlf7BdJkYDyagTyZFIMHLhJy9B/wupGZ8uS+TGB8UZJrTuFcc49s0VIbU/kYbWQXZ05gHtraeG35k03HdkxuLcEKV8kTxDdrhkX1CCf1ycLVeXrOEXlATDDxzW6ENbPPgNqZUvJsez0LYw3BRjJh+UDzSpIQbFWWTQMKHeMYp6aPnC6dQWbDg23IBFuLg0XCqKkxngw0NwRolfdoi/WKW7yEDLGvtCatVPlIZLP4iQthQ+yL7qi8nXxXFzNVq6IwKm7HpGT40GjDz8D5emRxwGXLAMannTBLz6DUexjCrZQf+BEsXYDWVJzAbUID0jRazFA9sY8uTiRAfS950+8Wg4z5EI2Adl2ZZk2ZZk2ZZk2VaO5QDxGyuj6/Qk6Tpc7Gh+QyPjwqPfnF3li5KgsqRXlJS6OCbzIlDmjQpmyQ3FocNAdZC8bUnJkVVO/oOKSOOii0bAaXb4zSmVXzH5ur9xBXa1EowEYlLCuk3h4jZcouUb1bNlTVVf6OVfyFAUu5GhQXswQza5U7JI7y598e3RM57/V4D5qbG/RA7mV0M8Cj9d9hfMN1R+XcQfcMazJ3UWpCfiD6Yn9SBFesI61QT9hlTKF8n5ERSCJYHnc7AGg2BUag3podKeXJf8T2xxQndN2thdZH9haofTet4brTyBlx27F4/yVKk34bt4RQYZaseJmYt+QWr5yKgR+5xKFZBArDqsmJ3tYbA1cKwV0lNtHtbZvjXZJNmR7B2ZjKXhRO4oB9neBy3SwvLG4ma54j/6MbGYezJZRPtBitEo9R3FaOtAnhZ4xgykms8yyMNJwlP7eBQKrImWLnAsBJ3qE0dLMc9MY5GAdaD/80xDcOq5CZ+GVPBWFpP/Oss+X0HuRJid9B67isfuRbT2BZnJko6fnPnqi+RT/3CkGhuLn0o6L87O1iLl0zxhtDfP9tROhGC3ndn75NXOQZIOgmNlDXAQu60dzidMwufAqIcjQPodZpQc4GtEJ/nR0WJTZQUkeZy0r2TrM7K7NTCTgeEzWU7AKFPJUnw40rR1dwKlih9sRumK7EFJ46FmzSOfhpSOli+kAePLmZ487MpzT7QTGS+/YGrQWdDkj5DlKS9edlUpJwPzKbuaPHj7d2sLgVUpA/0Iv9gtyH9hauO9h5CdUUgxMq4i9g7SIkuL7a2Yb4AucmJIZwlYxcHG8Hax5l/YVfSBjE3SyP0r5BFI/Y4ihZ9IUg7Sw1DiZ1lqUbac9N2PphfsLmonZlP4BVOLtMjXwVswtHbdkO+m/IJpYqhyMRl18pSS3TGM/QFasX4FwYwEz6eQYNTZQoFIzixivtvhjREzTj2c5ekBYowGWk/yyplp/RHZW/2KdEfLQjDwz0sYqb02p/DikXPBDdlWvpg8Dk3rzUNaI2B8aViSz2dCYBKe3s0AWPqmOjzxi9OCVRzMHvrO7wZOzj8SRgd5/x0X6axO5YJdB1+kKXWAN3204VPhllDq4WGL3JOJ3DmYNuoppzuIb1vvRP7gtCdmnFKaQwfZBCGn0oYfpFztisnXM5r0FSlgfdCJJHlwvLPwB5zPnML4dg0hHvyO84nyWapzR5Uf3A6aes+B2ducOgi9Pf2bZ3fa7nhl7OH7S0+zJtRvSKX8CSnEeD9rsBD6yMbC2VcS7AsTaPri6ZnKe2Rdi7kvyRNGO52m5otAv7AbhuDHbtKPHeIvjpI43k9D+k+kJx81z/pBhOp/YWrreWfum5XJ+Fpbu2LydRqxy1ewM3MpOtVY+In0lIO98B9ID6PEuTPJh3+y6tmbhDcPpI5XD0b9wtSQeGyKT5dcdBqxNh3YaglZ8OpIx1uCKa3UtAEBxLo2bfHhfDdJeCPWxg+2wLOvmBXhT8g4lurh0Fx1Ossm55L2XLC94evtpSn/+wSJC3lrm0j/QmqMEdM32U5yd3jYHdMZ7z10xT6cVWkHqid/8zSk9ogpfPux9IrJXzzjKZ24CQ9vBuZ7i+d7Cx5ezuwvImIZBfLywAvmu0v5isnHc1czlgWzJAglJeORzQ9k1cFpiGVFMYGJ/DOQZkD6n21+G5TsK5KXLyb39nyjxCwu/aDSS2A8kYYYojRcWvQ7WhwrO6QDyaye6uQfDKEUoWlDBDEuJaR2ojj0EBVNOd882vpRgjbtrhDP9IUbWXCbDLeDQrqgNFy6oHrSnoTugAb9iFHjYihoN0qOWVARVSRg+nB6/OLpSu0BkTCfzgbyiVaOy0W0cqzc28yJeuAUYmk80fS5zfYgwnBxogHRqCqonENP/uqdoLp4zBTRfjCt0cU1gyQQLL2RcOGh4tzRGn5BOV3EJ9Tqi7Q4iq+cvHwx+elW7rMXFcRfMTtSv2B6JeLdxWHt6IZg9iT2FS3bqQ6S23AcE2JsUBxEqhIB+0V9jtNU6kaVJ19nV7UTxaGGKb3B/+hdccyAHz4L7EVq2e3iZOJ8OAQznpa/0Zq1V0w+nqI9uQ2y0/5GyZKQVZQe0Kt9IUNRbEt02E6UbUlWwB4MIY2cdFAc65eLE10NxAuWwS8o8njUoHqs3pfcCfgPImBtfEIhdskv2misVHok2QdXz8HuaHmrRWZ+EaX6IrlwO1ykxgfFWbkatGiS0S0nJ76jW21k6I6amq9IDheHdh0uNNvCcEu1BtIrenlQnH+h6FdPdk/SKNtHUrThGAXpRJLqQUnNpaI44cCHh+C0E7/sEC23MlGwZuwyuU7cii9ITeEnSsOlH0RIWwpX9FVPfno7YS/o6PgrWrnHfkI04amBKmYXmjjLD/3ElPCYE/ATmYHSOop9Ra9+RbrT48GkNEnLlZP8FZ+K0V48cpaDXtTiyS2tNHjwonW8sahwS6/YinJMz4EmiQNVk8dDgtk96EiyL5j81TW9XpSGSxckFyc9AyIlEziZycQZTPQw7hU1++DiWKVatFT+hOKga91JjLboohHwY0m00yk1f0I0xoh6amkpO5OAGH2W7Q/Ksi3Jsq0c+wsj4itrqnpBV0+0OAwZxW6UFu3hABK5UzJ58OLSaNILMiMp0dKii3dmKWrgB6lUf0IKsT409ZALskvULEckDkIww8UxHjsw+YsfLexsxxNGe3WmWpPsXXbAI1pWjv9A02Dqlthp+YKk5RecsmiNWEw+7uWLekK06sGs+BemZ90fFMc2myTbyrHB2A09dTQyQTAPilP9ihLVhqI0XALvin3nKkc7UZxwQIupkepEauVgLDmYsgTBgidXjnVwMoREg5L5E6dowRouKEFig5RDAmIphm5d0TYlS7JsXDgojk1+xdTCTxTZi3/PXrg4NrvXVRQQTSKJ3VEcS1jDL1ahfkUv/2CHo1ocAqYHjhT53dOQWd6etI3hIdF+UJw2UBkUmTg+EYIZj3RHR5LYbXGCePkTtqWdtHwwmZ0oJdYJ2IdL5Ma/Mdo6O5qduL2+YGrhX57FSKKsYIInEJ0F+j/8dwDywyE/LWL8osjviPkBEQLAqQmHUFlO9sb7+yPFYHek98PZxI6Dz2LakNMX3pSApUBrf4V9Qu5gGbHFE5nE2Mc6ksZHZKzFEzfh3mZg9sfnDairHfyO3NL6IstbvyEESxtdvBlCZDPJ583NaApmR7DvSO/qpEhUGG7PI3JL9eBXLws69xemdjo7mi9mbzhYBcR4Ex8F626EIG3oJf8d2UFzRlnP2594tPXe05x7wOHkfF8swMiz7cqTn94h+rBqvzzyuYKk/IZzx3H3vDoRneZk85nCuYfZseXpadqQ1oszHfnoKUZbZ1HuhTHT+IXcl5l+rNThmQmPZ/cNt+c6kxxnMUadPHdCsCwYDRLjgvBZSnU4lGtj8BiVGoEaE8TV6RpO5K6ouxhIP776QDjjIaSMd+QZacBYFMsQvRXggyTV+xlZwiuGk5MQ08cY2VpIUnC6s6NdvAkbPQKke78wWrxzWwufkdn54azjIbRx59aaoSP+ztBT/QVTO313sKT3FaPlQjD3VEsYjoRdOfeg9LME8Sjt5p47sjd1xkeHk28bK0KiDeZNtNM6nIbNw/EUP8MZnDp6Z1EQJravaUOms++fmDm8+/6J3NaewVwE5TXhZbkSzjfExURyakRo42gbGW72isymxnDeRzr7y59qbGstgXpuZAgVkojf+L45kN5vZE0kRgLcPULeEqGINDi7acIqnkgy9yNPzjRLQ8uhHwzBp0gSKyH5YDN2sBjjbt6fHck+mBKdsfQ+4qxNuXP0nMjOfrYvzB2nntrhzE6Ne6M9cmrVg3Qn53KMa8P/8O6kfuLuyEdgAatmB5yELurk0QGkyebt1Jghrs7ecLz1R2RL9RdE7qWLbMx6GPdiQ5K8OLvbcyKjWUj7uSu18MWU46F8kBgr6KYn5PZZaCx/RUapza1ZMDxZPKVg7gp2P83ZGV6k+N+R/e1f/N5VTu1EPldyHnLel5wd6eq9f/IMs2OG8/yMvSO7atnPDJP0J4a8YAbWM8ZArYGxD85bppUC1ocsdjZhPZ8t9RsyXH4i29Pf1VkEJ4+tTGfZIGK7bsjnKqcSvPhxf+4cZ3/rV0y+zi2UEzP6jKM+R4Z5DbONIHvTydOagbRURwbpq5ZAR4vfmJ7UwRkivvHLdzVdEU7Pd1CSe0i+OQ/K5f8H7xL6sd3JtYjhAd7MU2FdXYxMU+ViMvrI05TsHdmQexjp24vRxjtXjS1PyB2Zo0pr4xeyJz28sdXsCL8hPeXBdH1harwRm90kuROC0X/l7EbEOhSWZV+IxHsiMp2MlH6y7v1BurgjU60nXw9wWUo4O7BfnoXr3BSjuW3BST53VKOpdwXxaHQEYFxSa/jlyIi7lqnyJ6TAB8g9h+eC5iwI8mr2MEsSzkQqeDsXk69n37W3nPkrJn919rT2izxk7uMRGA2x7B5MEZbbSdMBY9dUv/ihR073FalhjGW+68gH8x3QDlo58j4AABAASURBVGeglnDxFGd4en44e6IBbKeHJDwrTkQrD9JFfnz2Yvbj85bUaXjjXUH9C6N0PvrhiGzLK/BkPC97w/7C1E7fmeyqduXJv7y70W6Yu7tA538HoO3+KgjIJreeUULHpRe0LOHG3zA1S3RwVaKCB/9BWlt/xIhMpKFpg8zfmFMkPVAccqJGlUD1HHrJhEM6cZPcl47gn05T65J9n7UPrp4vqqn6D7TEkOULkpZfkJ5KJ1KbEeWsrEE/IJpwGojJLq7NX9DRcVAcVtAvBcWx3dy2FCtatuFW/kT+QWm4dKJaVY4T8G9Eqtn3ih2OvyJjqdGiJ6Ss1B4w7boUpy1x3K0lWiI3PuZQ0gMlSGwQOSRQTIL3PgIm27g4QVw4mhZhshOryBJuPPiHe2snemaOXcF1Ldr04MOlG4pjCWt4RIl6Ky/o1cHcA9NiQc4CCSyHkob+29OY/htGwB+XiUOtcZC0VkbA9FnnpPALWhK7sUUEiA3Ksi3Jsq0c+xulKCtPLi36jjRZkm1Zkm317xW3x1dMvi6JUVEmiVnDHSLzJ84dw7zqF4Yykx06kaz6InnrxQRJEZIuHpwCRkF4auJ8Y2rIOlHv5zLLRumJR8NtOnA7mNYHlK4rlJP2D1oOIV7RNz4sERkjs94xtTfPVGoPiIRZNi5zgRPxQQRycb65VgetHlYsjmBfkNRukP2FmYq2SFU0qQe9vIRwI/DaIb4gOyRqJ4oTLtRBpZb0RElWZXEiA8v9izJlE/2AWn2RFkfxlZOXP6GV++0rJl/XN2YHmiR7Ud9ITXMMHE4qO0xf6OWL9NhOE7qUEPqI4qQV0AVDhyMe5MRoLx55BumGYCSKpJzwP50iJh6MMQFpYiSX21eUzJ84v4iIGY8VCZgyMuik8Auy34bjwu3JbVBC+kY0CR2XflGSpXXfsTvRwHTY5HTYloqNKpVVNBou/IeLEx1ofQJxRJMJf0dxjMes7p80UbLmnEiCKY2vSKF1UHhy0CbPtkV7eTT8YM9oNqTpCS2xy/IguXA7PNI3RhsXZ9syIufPStToliXc+IHJX9zbc0M0uDjdSR7MQtvCcEu1BtmLCppo6r6gJHqsHMsB4qDI1HPwEoK9yqJ95wp/9A4TsNSB9hYT8F1FNlbeALdM1MbgwV0t0ZFh/0DKNKnPIL+hrHLdEaZTV9nGXBn+go6Ov6LZk/oFvfxEy3ZEEWVbFucNU8Jj7SP54GSeDbJNVV/o5UEJgkvBtidYCldROlGcaEC1hHICpvA/XZw20gViIhuDYMoBMVVPgudZImDoTvqFlmTZlmTZVo79hVp+opqN+snDbU/thmjli8lPZ775oiQ7fYsSHBfHEibKCiaYYGnjgV4OprnMUjDwinSkju+YDhRa3BOkxeGWyheTxzssTnQgWuCK/yplR3rAgMDDbRTcviD7bfgNIdjKmqpe0NUTLQ5DRrEbpUV7OIBE7pRMHvzDpemRFndGF0yO08EPgPkVsb8Ozq+CUH4EJc8PhNX59RARG13hOEg5hn7nWwpQZxEZG4npCw87MHL4YuRM3ZC58sXk6/2VtTkBo6PWcPIkeD5ErmF/4RWn+hiPHX9haqezpTkvCkL7hYF9O3g84yxHw3lx45/I0Hx7iXTWGlj7gpHXuaDPgS6yB0LkwTGyb97NiMVuIHvBtFHimUT2/XCE2Db0O4HvY9gLaW2Q+LuEri7/T6Eb6Fzs7tArJ68e3Brp8aYbUj6vT8+Fd8WlOOWJfIit8P02O/BeSakTBCzFSHdMAe99BIwnsg8tjeVM9btdpDo9vLf5DTOFgGXF4VCmEy/1LEea3eg3zuZwvPVim7l7EcjS3HHFyCcvOUI7IVdM/uKRz0UQjGEe2jgY7c1/Zmnkc3TwwPScnr3/TwL49MSPMTljK904BKO+U+w+OXm+sH6H3HPHjLSTlgPRuCNjABPLIem4+9w3kT6Gkl/vuPMsQckSNtPOEBaOY5Bawy+vkkkWpSX842xGv3Io3YnpvqbV0prkislPJ8H4cjrecHs0w+UX/LmE2n+wXNN70svODycrXyTPFf2OKyXwsujMLlxXoaZeyGgTpsDjGxuki3rycQiWfCsMhc0dZOXUQJb1ztTiDGIUag0vnD1UMkwXa8IBtGee2njvSTqNWRH29SCkozF4dUrnUPQnHi2+dyT9+CG+YHdSOzGT4TyRzxfr/ZHSU6TnwKTkQNs6Vc53dGCKLCotJqNOnlKybzw60tKcgPWOOzKNkP+s9XkEjL6IfU1zuiCNv8gldPOErTcjYKMzQh47Ok7MZRRyP9C72l2drixI/oYdSsDTA/CcxK7ZAH8srp7a4UjXBZG/pNBrS/P01QkYHyRGKwTLO+Yz5jNFOLAV+p6wctcny1RIEaHId/OEuevU03N45pLfMHdHGKSca0qy43A60MNSuiKfhUrVDJPn/uE71Xb6gnjbKBXhjKS9MCHFSBSxZKOXTLFC+NUpVb9i8vW0Jn1FClj/8U4kyUPj2b04n5Fl5bxwEaXG1H9AvpPtaj87qrzi3kNz7y9GG88qRvPK+0egMHq3U2cwWrNo4U9IU3sW00aaXUDv+EF6Wg8yW4twcpIRieSpXZeghvKJBv6KjLd84ia3nWjli8lJnx/PttSA8xnJ44eeHB86MW+d7Os7RIySXa9IT+tPmHui05Bn9x54dp08tdPbAfsLU2Mxlh2se/8qtuHznzW60YbnFbMElaUvPC14rH1J1ncCdlS+kLtYjEXHMUitITw9N9x10Uj7ZZyIiJ2z9yJdKV4daXu+31qe1m1pSsAu6+mKwBsx9C/O7n6XJ6YlAxekNlesDkkWJ201eZ1LilVnRzl6e0FewL93VRA1WmkqT5w9yFmZtjtWQbrjTqye2jhXsYkca88Np0Rs6cT0HM7GWBuihXxjtPhcxpo2/IGUDru0Nj12gCdPEn4iSTnInvn35IVo0PmOSZbmZTDqjd84/waJu639w1FY0vzEzKOkRCdy7wtCz/zkubO9JMUGWi/YEhx1/zsA8+sgzq+CNnh4uWRHu2JySa6JskhLfrEK9St6+QNaHCs7pQPJrJ7qyddtEkxvKIqpvWLW0hNIT3HCoQ7TVLtLEtj6E9pqndoPSkhMxlKX4OpZ+sUtUzXRoBa9KIYm33jwE2cCqnYY/penK3VwzDpmZWYJXhcFK8dygPiDI4jW6fjhCLFtsENoXbTDP06mP5bp36cbaFvMfth9JzV0y4qJXElfUZq6etKWZND6wRSFfqLJ/KggYtSsC5KXLyY/3cp99qIWy8nLr5gd4RdMj3JWJzUe+0H2Vn9Ey7YI2IESJDYoDj1UFXFQcyDY5IklDbArJn/xyCJgesPUcJ7RlrTFy5uIYx3c9vJFXVGw8CeUKMaU0y4CpoiDTip7kAQjD39yaerSO0qy9OJe3cqxDcdBJQNhsi3JGljUoqngUE39wsWhhkkETyD6w2EloPEjD1o5E5VaUwKmnCeMdjoJpjzsRBK4DQpftMm7c9BejIYPUyaU88iZqX5DlPLF5OtZZlsY7qwF9XFpcukFLUu48QOTr7N4M+pk3h6wGYiJNuUEDxcFO0GyF/WERnWaBhsPLo5RAKIDF8/a0i18+EVIehSCf3mWpX7DEDx7gMOGTtT5NpOJs8iuZq8o2SZgJ0qKhP8gwrRZwTQGYeVFXWM7UF7Q0fFXtLqfgJF/uJw5yx4nEVnEC0pKXZwDk+IxJ+AfnMwyqmQ/IVp1U5caLD2iOKkBekRETCkeqJwSkuC404OixXKLQ6g1THVShexTNeg7annR0g9WQR0UxzAvAjB9nAJ24Z6cyy3JtizJtizJ9pcf2qI0dXHSOyCDCcHDRwoTpSt6OciOVk8UJzqQLoPUsCQqViv95aKI6RFT+HZxogGZCVzxUmraQBOISTwI+0IqiPYDSoygS++oOdMlBQ8Pm9zVxR3J7EboNzKRmp8QTWLm4tJwadEnymgErx/sjuKkA0ifryjxFOXckJ7yYoLoW1QQX/QiHZjV02GyA0lfbUeypj3HzA1pKl9MjtvhTC3a8KWAlv5iivh26xejGN0SSyxfkBSOnBii5tPyR+6p6QnRqi8mPz1XRL9icvX0brIgoF+0FEvhRMs2un9RHGoGKGpQd9TneCoIxmNfyC6l5xUlpZaxEyXBQ5VDXigSMNEwdesHZQk3/oujiNO61a4E0pI7WtlvD4aQyl6uIP6KWZn6FZO/ePZK2aYce2fBD0crD6KSYxIBu6M4lrCGX6xC/Y5tllZPbbz7UWOpPqM0ulSc0c0hmLIoKALW4olJLNuaM2i51D9YeVTrC738gpbEbmwRAWIHIzll3MqxLZPYXtQdpeESuD3Nvjm17rji9viC6YFrEUiahl8UjbUG2BW9/x2A/HyYXzWfnV8gW79i8nV+RaScOL9GJkPgN0t4Y5SPX2ps+PSgDxfAXH+gPLASAUsftbyVpZ0nYBV/cZqIWyejKZdkWdjkRITaLc19EUA2UCeSZ8e8IW8c7T9xdk1fVjFXTsCyFjWrwwYRuYF3TozYbPVvnt13Z2N6uWr08Kuz7VrLTen/C1OLpy+zzdn5hunB+VA893Mf7cuj0dB9/8BZklEuZO6Jo7GFmJbN2B0h3wEqFp356C/e3rYRYu3LaMiB2cFmalgSPhPACz+c/vJFcqaJcJrYAE0MJ02laQP7qCVNb5GeM/+uhV+8ux74ofPUfE7Wzj3hqR2Ye5L/hak9OAuxz92QWB7/QXaH5P5BslrDvoQRsjF0ErYySeTeVr8wu0ZPGzNYtGmDYOHj0/NdK+eu9oD5nmZnh5EXqVUPIvGqUFjJBfcegGF0Ei7B6GeK9uoIuSv+zaPdvCuYfcWtcdusX547zhm08sXk8cwEb56npu+KyQ//1BjHlpON8YrsK6EWxJOxgY9LPZye4Tyy/ILUsJSnn5F8J7SdnORSbwP8jp2ZIZbzgi5NSl9hkTxWRs8volRfJM/93U/+hNHic33uzvOY5yJGMj5OQ/kjZg5P7XCaq7zi3EOZ/XRy5eTR44d2xeTruYcBWJrDZg8ZCTGV8XL205g0n2wRpXqQJMZOGqiX/J+RgSzjfrbsrmhsQ0eLfZGhiTgzefXMfHFq1R+R9dWvyGWzImJGP8gL8++eu4IUqJd9MD2HZ0/yvzC109nV/IrJ/6P3LnpP5IV8Plbu++Dz8Yjkl1qE62ei2hkCxob04hDs4EyhYbRzLzLF2HDKPAWjUGtAHWSifQQMjU6SqSefxUjppI5B1iBYLwP79uKMzyhzaOn5cARI+7njb8xV7OjKzH3zrWVfep4w2n929rd38Wcn9/UZF0xPPkcws8kfkI18DZkbH05MLzspxiJckEKMHtaih6RlcURiOHvJaCJeeBk8GABjbElrXp10kQYshVwZbC8Eo487kuD9d/sXZis9AKuyOCuuyL4UuaQqvf9Pau+H01MdJfinz35aZkdHMh8dzz1X7eATuhPHAAAQAElEQVQ3pL8cZBExbPzgJ152puOyG3p7wxunCesgLf9CvqzevUg7GfOJvIVas8X5N0Ip55ME/6PfZrmn/Fh1YnZC8nJ6eAHZ8gL1KNyZLA/9QWrVi2wAMSQWxm7OdPkVk69zV94J6/wjpufw7Ep+w7wB5/3dlRoPwmYnyehs/yOnGfv0QLipS79w7opINw3hXEqWe8q45xWpte+CuSuOxBi7sPDccXhrIamBHx6Bl1R4QHpZSqSPHjqgieGkVMaWA+VF+n4w2njemM9yeLftHdVYdMd2oC6yG1uO1tlvnLuIXEdMz6vvLEt77zf234geMJeyjZ3haRysliKeHVW57xlZRA1L0l0J5QQsY5EW554KSdNw8dzdGnd/47yFa1IDpjdrs+jAqpALUs6uXDOIAOm+f2JWsasjhNybmRvSw5uQE/HlZ0/mcSq5sxnNJyY/ndnmb8gUz+ieJ3y7Az2f/X/8JCjbuPAHlNBx6QWZkZRoadHv6O0Bm4FOt8WxeIpkDH9GCrE0BrfJryhOqzeEYIdOepg3OXGT3JdS8C8/em4YImVMOV8rI8VHthxCLDJkcuHFg584FcqYQ2QfKCnpxcXZsoKSFSR+UGWyF3XFTqAsOoj/hanh4tgWhluKQWzLNtzKn8g/KA2XTpRkzfknsqudi3Ym8EV78xPpbn7F5OvA/fLMr0iqS7G0PJnJLBEPd3KHNcAOlCCxQeSQPOuDVrkWIZhUjrb4y6tQvWLyF2epJdmWJdmWJdmWJdl+dQqyJNuyOCdq+aJ04e2E/4XeOsjOTBeiWhwCpoMnX2/f5pSlhPC/MLVXF6cLBr/TH+5uEg8xE8Uk4SeSlIP02P9AemLTJQUPD5vco7PLkmzLkmyrfyeuZjCVYGo3pFYOSqIsqAZ9okyNAGwcPvFXrR453TekUr5Inrtokx0S/Y4UEGPRceHpFecbU0PWiXo/37Pls9uZD1+3rUhatOESFIydXD1LqZcuWi71A1piyPr8kWJwUyIbs2gTUUVTe3NZ7dEVycsXk+Oi0ZLcP3GSqczKsWhJ8gdaim2jXSL7BcWhRlU06UDlQLBkp39zzYR0ILuav6Kk1LLoC21ETOuh4tgEbLj1g3KqxCfU6ou0YCHoUkJ4dgbLScqL1uSLCl784CeykgFLsi1L/9nFsT39IFS2Ad8RzbYQY3cUJyVAb0jNWyzCFS4RLRFfPeXUbyhFUk70vzyNqd8wgmWbDR+3DBfxG9VTlYBduOmHssuAnhCt+gVtIzkTxWS2ZRTgjtFO99SIrmYy4YsMJ7MbZX+wXSZGA8moE8mRSDBy4ScvQf8LqRmfLkvkxgfFGSa07hXHOPbNFSG1P5GG1kF2dOYB7a2nht+ZNNx3ZMbi3BClfJE8Q3a4ZF9Qgn9cnC1Xl6zhF5QEww8c1uhDWzz4DamVLybHs9C2MNwUYyYflA80qSEGxVlk0DCh3jGKemj5wunUFmw4NtyARbi4NFwqipMZ4MNDcEaJX3aIv1ilu8hAyxr7QmrVT5SGSz+IkLYUPsi+6ovJ18VxczVauiMCpux6Rk+NBow8/A+XpkccBlywDGp50wS8+g1HsYwq2UH/gRLF2A1lScwG1CA9I0WsxQPbGPLk4kQH0vedPvFoOM+RCNgHZdmWZNmWZNmWZNlWjuUA8Rsro+v0JOk6XOxofkMj48Kj35xd5YuSoLKkV5SUujgm8yJQ5o0KZskNxaHDQHWQvG1JyZFVTv6DikjjootGwGl2+M0plV8x+bq/cQV2tRKMBGJSwrpN4eI2XKLlG9WzZU1VX+jlX8hQFLuRoUF7MEM2uVOySO8uffHt0R+Y2oOzKf8dgG+/LK6uIP6A/RGRwA+PG9MX9o38SknHt1reduo3pFK+SM6PoBAsCTy/XmYlk4g8bggJxfSUk6NsA9kbp3TY0XLyFboT8QmjHU5L33bDEF6xq/K0KBkJHj7lfiKkJ6SDoVZOZG8WpnQgtU1T7HMq0cPi4STR0hDMzhNT2wXVyYPt3dqsGhWJjkQ6ptA7omTnHWmIpXAie8rBbEq+SMttaXkW/mc/Jha7m+Ei2g9ujVI/RDHaOpCnBZ4xA6nmswzyAUjCU/t4FAqsiZYucCwEneoTR0uxTycpErAO9P81oPo03nlWz82J0xHt11n2+QrSiJBdAPoIw9nUyxfJqwenmdeQnHzuijhbfjndNTYWt4M8ExdnZ2uRzoUQ7NSTvzkbMxYYpBE7ZytGePNMpnbBpHjVhiFNCdhlPZ8wAp8DQw9HgPQ7zCg58PWdp5U+ChPh5LHwwz+cvZDEqSVjht3J5i4yikTuopnPTpkcBZ0kxhBWDk4bnSRoWMUPNqN+RfahpPFQmcaiA60N5v5kF6n0w9mA9WFPmMYuoVhk/BvTg5z3FP4M7Gl98bKrSjkZ2E9DerxtvmNuoZYrP7wL25Ys5Q92C/QvTG28ewnZEYUUI+MdxN5BWmRpsb0VeVu6ydNLipXcsSx6u1jzL8xe2rDcBZzC8R30IRTKWV1+IkkG4/S09ogR/+XsassL9g5qJ6Y5/IKpRVrk6+jnCW0XtQ/y3ZRfMEWGKheTUSdPKdkdw3pFQ7sJ2A/P95d3nMjOD89mHIHIbCNf5yAJ3Ze7SHvHX8guyoxOZ+79cPa2fkWq0dIOBv55KSO11+YUXjxyLrgh28oXk8ehab15SGsEjC8NS/L5TAhMwtO7GQBL31SHJ35xWrCKg9lD3/ndwMn5gjE6yPMdH05ndSoX7Dr4Ik2pA7zpow2fCreEUg8PW+S+TOS+wbRRTzndQXzbeifyB6c9MeOU0hw6yCYIOZU2/CDlaldMvp7RpK9IAeuDTiTJg+OdhT/gfOYUxrdrCPHgd5xPlM9SnTuq/OB20NR7Dsze5tRB6O3p3zy703bHK2MP3196mjWhfkMq5U9IIcb7WYOF0Ec2Fs6+kmBfmEDTF0/PVN4j61rMfUmeMNrpNDVfBPqF3TAEP3aTfuwQf3GUxPF+GtJ/Ij35qHnWDyJU/wtTW887c9+sTMbX2toVk6/TiF2+gp2ZS9GpxsJPpKcc7IX/QHoYJc6dST78k1XP3iS8eSB1vHow6hemhsRjU3y65KLTiLXpwFZLyIJXRzreEkxppaYNCCDWtWmLD+e7ScIbsTZ+sAWefcWsCH9CxrFUD4fmqtNZNjmXtOeC7Q1fby9N+d8nSFzIW9tE+hdSY4yYvsl2krvDw+6YznjvoSv24axKO1A9+ZunIbVHTOHbj6VXTP7iGU/pxE14eDMw31s831vw8HJmfxERyyiQlwdeMN9dyldMPp67mrEsmCVBKCkZj2x+IKsOTkMsK4oJTOSfgTQDScGyZ5z/DkB+ZsRk76+IV+RCqPyAEU2YukWKgdIXevkDWhwrO6QDyaye6uQfDKEUoWlDBDEuJaR2ojj0EBVNOd882vpRgjbtrhDP9AO3LeF2ULIvKFGCSxdUT9qSTFUa9CNGjYuhoN3YoWZO6pTxRS2a2psfPQ+IhPl0tpBPtHJcLqKVY/GsJH+gpVgaT7Rso/tEkuHipAZE82IgvPhn6AQdi5ddElr5FSVFq5QgffOUlRIuTvmJ1vALyqkSn1CrL9LiKL5y8vLF5Kdbuc9eVBB/xexI/YLplYh3F4e1oxuC2ZPYV7RspzpIbsNxTIixQXEQqUoE7Bf1OU5TqRtVnnydXdVOFIcapvQG/6N3xTEDfvgssBepZbeLk4nz4RDMeFr+RmvWXjH5eIr25DbITvsbJUtCVlF6QK/2hQxFsS3RYTtRtiVZAXswhDRy0kFxrF8uTnQ1EC9YBr+gyONRg+qxel9yJ+A/iIC18QmF2CW/aKOxUumRZB9cPQe7o+WtFpn5RZTqi+TC7XCRGh8UZ+Vq0KJJRrecnPiObrWRoTtqar4iOVwc2nW40GwLwy3VGkiv6OVBcf6Fol892T1Jo2wfSdGGYxSkE0mqByU1l4rihAMfHoLTTvyyQ7TcykTBmrHL5DpxK74gNYWfKA2XfhAhbSlc0Vc9+enthL2go+OvaOUe+wnRhKcGqphdaOIsP/QTU8JjTsBPZAZK6yj2Fb36FelOjweT0iQtV07yV3wqRnvxyFkOelGLJ7e00uDBi9bxxqLCLb1iK8oxPQeaJA5UTR4PCWb3oCPJvmDyV9f0elEaLl2QXJz0DIiUTOBkJhNnMNHDuFfU7IOLY5Vq0VL5E4qDrnUnMdqii0bAjyXRTqfU/AnRGCPqqaWl7EwCYvRZtj8oy7Yky7Zy7C+MiK+sqeoFXT3R4jBkFLtRWrSHA0jkTsnkwYtLo0kvyIykREuLLt6ZpaiBH6RS/QkpxPrQ1EMuyC5RsxyROAjBDBfHeOzA5C9+tLCzHU8Y7dWZak2yd9kBj2hZOf4DTYOpW2Kn5QuSll9wyqI1YjH5uJcv6gnRqgez4l+YnnV/UBzbbJJsK8cGYzf01NHIBME8KE71K0pUG4rScAm8K/adqxztRHHCAS2mRqoTqZWDseRgyhIEC55cOdbByRASDUrmT5yiBWu4oASJDVIOCYilGLqTnmiHW5JlW/0DxbHDJHtR30hNQn3wY+YBxbHZta6igGgSSeyO4ljCGn6xCvUrevkHOxzV4hAwPXCkyO+ehszy9qRtDA+J9oPitIHKoMjE8YkQzHikOzqSxG6LE8TLn7At7aTlg8nsRCmxTsA+XCI3/o3R1tnR7MTt9QVTC//yLEYSZQUTPIHoLBhshD/g//Lr5ji/FvLTIsYvivyOyA+G1RUdP3Fr+VUxPU8YDc/U7MgMzWjhhz44i3MvF8ciX5C5WBqekJ1p5gbmEtuUpctJ0xN4QtrvpRW4rxmY/fG+/YEf+mCuZTKWXpZXvyEEm3LeDOFtjJBcOQpNUbIj2Hekd3VSJCptfcO86fCvHhYcu18xPaezp/li7g0Hq4AYb+KjYN2JEKQNveS/IztozijrefsTj7bee5pzDzicnO+LBRh5tl158tM7RB9W7ZdHPleQlN9w7jjunlcnotOcbD5TOPcwO7Y8PU0b0npxpiMfPcVo6yzKvTBmGr+Q+zLTj5U6PDPh8ey+4fZcZ5LjLMaok+dOCJYFo0FiXBA+S6kOh3JtDB6jUiNQY4K4Ol3DidwVdRcD6cdXHwhnPISU8Y48Iw0Yi2IZorcCfJCkej8jS3jFcHISYvoYI1sLSQpOd3a0izdho0eAdO8XRot3bmvhMzI7P5x1PIQ27txaM3TE3xl6qr9gaqfvDpb0vmK0XAjmnmoJw5GwK+celH6WIB6l3dxzR/amzvjocPJtY0VItMG8iXZah9OweTie4mc4g1NH7ywKwsT2NW3IdPb9EzOHd98/kdvaM5iLoLwmvCxXwvmGuJhITo0IbRxtI8PNXpHZ1BjO+0hnf/lTjW2tJVDPjQyhQhLxG983B9L7jayJxEiAu0fIWyIUkQZnN01YxRNJ5n7kyZlmaWg59IMh+BRJYiUkH2zGDhZj3M37syPZB1OiHZptYgAAEABJREFUM5beR5y1KXeOnhPZ2c/2hbnj1FM7nNmpcW+0R06tepDu5FyOcW34H96d1E/cHfkILGDV7ICT0EWdPDqANNm8nRozxNXZG463/ohsqf6CyL10kY1ZD+NebEiSF2d3e05kNAtpP3elFr6YcjyUDxJjBd30hNw+C43lr8gotbk1C4Yni6cUzF3B7qc5O8OLFP87sr/9i9+7yqmdyOdKzkPO+5KzI12990+eYXbMcJ6fsXdkVy37mWGS/sSQF8zAesYYqDUw9sF5y7RSwPqQxc4mrOezpX5DhstPZHv6uzqL4OSxleksG0Rs1wfR+VzlVIIXP+7PnePsb/2KydezLWv+wtTePLtTO5G95fsZsnsdmefl7fTQf/BfTM8MkaWZlje+9wSmq9kR8h00z30k35wHdf9/xy5hBtudXIsYHuDFPBXWlcXINFUuJqOPPE3J3pENuYeRvr0Ybbxz1djyhNyROaq0Nn4he9LDG1vNjvAb0lMeTNcXpsYbsdlNkjshGP1Xzm5ErENhWfaFSLwnItPJSOkn694fpIs7MtV68vUAl6WEswP75Vm4zk0xmtsWnORzRzWaelcQj0ZHAMYltYZfjoy4a5kqf0IKfIDcc3guaM6CIK9mD7Mk4UykgrdzMfl69l17y5m/YvJXZ09rv8hD5j4egdEQy+7BFGG5nTQdMHZN9YsfeuR0X5Eaxljmu458MN8B7XAGagkXT3GGp+eHsycawHZ6SMKz4kS08iBd5MdnL2Y/Pm9JnYY33hXUvzBK56Mfjsi2vAJPxvOyN+wvTO30ncmualee/Mu7G+2GubsLop6+XX1tOsL/118PCZhsy5SBP9BTIzq9j+iPajXPzmbwH0Rr/REjMpGGpg3dScDCfUFxjMeMPpioZboeLzlxk9yXUvBPp6l1yb7P2gdXzxfVVP0HWmLI8gVJyy9IT6UTqc2IclbWoB8QTTgNxGQX1+Yv6Og4KA4r6JeC4thubluKFS3bcCt/Iv+gNFw6Ua0qxwn4NyLV7HvFDsdfkbHUaNETUlZqD5h2XYrTljju1hItkRsfcyjpgRIkNogcEigmwXsfAZNtXJwgLhxNizDZiVVkCTce/MO9tRM9M8eu4LoWbXrw4dINxbGENTyiRL2VF/TqYO6BabEgZ4EElkNJQ//taUz/DSPgj8vEodY4SForI2D6rHNS+AUtid3YIgLEBmXZlmTZVo79jVKUlSeXFn1HmizJtizJtvr3itvjKyZfl8SoKJPErOEOkfkT545hXvULQ5nJDp1IVn2RvPVigqQISRcPTgGjIDw1cb4xNWSdqPdzmWWj9MSj4TYduB1M6wNK1xXKSfsHLYcQr+gbH5aIjJFZ75jam2cqtQdEwiwbl7nAifggArk431yrg1YPKxZHsC9IajfI/sJMRVukKprUg15eQrgReO0QX5AdErUTxQkX6qBSS3qipHL1RE4yaP2gTNlEP6BWX6TFUXzl5OVPaOU++4rJ1/WN2YEmyV7UN1LTHAOHk8oO0xd6+SI9ttOELiWEPqI4aQV0wdDhiAc5MdqLR55BuiEYiSIpJ/xPp4iJB2NMQJoYyeX2FSXzJ84vImLGY0UCpowMOin8guy34bhwe3IblJC+EU1Cx6VflGRp3XfsTjQwHTY5HbalYqNKZRWNhgv/4eJEB1qfQBzRZMLfURzjMav7J02UrDknkmBK4ytSaB0Unhy0ybNt0V4eDT/YM5oNaXpCS+yyPEgu3A6P9I3RxsXZtozI+bMSNbplCTd+YPIX9/bcEA0uTneSB7PQtjDcUq1B9qKCJpq6LyiJHivHcoA4KDL1HLyEYK+yaN+5wh+9wwQsdaC9xQR8V5GNlTfALRO1MXhwV0t0ZNg/kDJN6jPIbyirXHeE6dRVtjFXhr+go+OvaPakfkEvP9GyHVFE2ZbFecOU8Fj7SD44mWeDbFPVF3p5UILgUrDtCZbCVZROFCcaUC2hnIAp/E8Xp410gZjIxiCYckBM1ZPgeZYIGLqTfqElWbYlWbaVY3+hlp+oZqN+8nDbU7shWvli8tOZb74oyU7fogTHxbGEibKCCSZY2nigl4NpLrMUDLwiHanjO6YDhRb3BGlxuKXyxeTxDosTHYgWuOK/StmRHjAg8HAbBbcvyH4bfkMItrKmqhd09USLw5BR7EZp0R4OIJE7JZMH/3BpeqTFndEFk+N0ENE3DhcnGoD+P35k5EdRfg/sD4YgejWQnw5j1PNbIUJ6gBhpgPpkM5m+8LAD0xa+GDlTN2SufDH5en9lbU7A6Kg1nDwJnofnGvYXXnGqj/HY8RemdjpbmvOiILRfGNi3g8czznI0nBc3/okMzbeXSGetgbUvGHmdC/oc6CJ7IEQeHCP75t2MWOwGshdMGyWeSWTfD0eIbUO/E/g+hr2Q1gaJv0vo6vL/FLqBzsXuDr1y8urBrZEeb7oh5fP69Fx4V1yKU57Ih9gK32+zA++VlDpBwFKMdMcU8N5HwHgi+9DSWM5Uv9tFqtPDe5vfMFMIWFYcDmU68VLPcqTZjX7jbA7HWy+2mbsXgSzNHVeMfPKSI7QTcsXkLx75XATBGOahjYPR3vxnlkY+RwcPTM/p2UsPwKcnfqwqAatYJGCzLio7h+90OJ4vrN8h99yR0dSZHT0cLydg2ffuc89E5tiVfHaR/fAsjA72LSDLaWO41oD0gq1kksG0hH+czehXDqU7Md3XtFpak1wx+ekkWL6/mYWcjyXv7BdOI5XVyf6Ltbu76QY/nKx8kTxX9DuulMCniz6jxPBCn55syxkNXTy+sUGm0JOPQ7DkW+lVcLAKiN3uyD1xBjGqtYYXzj4qWUIXbwsH0J55auO9J+k0ZkUYT7sISY/G4NXTHf4XphbPnuDND/EFu5vaiRkO54l8vlgfHSk9RXoOTEoOtK1T5XxHB6bIotJiMurkKSX7xqMjLc0JWO+4I9MI+c9an0fA6IvY1zSnC9L4i1xCN0/YejMCNjoj5LGj48RcRiH3A72r3dXpyoLkb9ihBDw9AM9J7JoN8Mfi6qkdjnRdEPlLCr22NE9fnYDxQWK0QrC8Yz5jPlOEA1uh7wkrd32yTIUUEYp8N0+Yu049PYdnLvkNc3eEQcq5piQ7DqcDPSylK/JZqFTNMHnuH75TbacviLeNUhHOSNoLE1KMRBFLNnrJFCuEX51S9SsmX09r0lekgPUf70SSPDSe3YvzGVlWzgsXUWpM/QfkO9mu9rOjyivuPTT3/mK08axiNK+8fwQKo3c7dQajNYsW/oQ0tWcxbaTZBfSOH6Sn9SCztQgnJxmRSJ7adQlqKJ9o4K/IeMsnbnLbiVa+mJz0+fFsSw04n5E8fujJ8aET89bJvr5DxCjZ9Yr0tP6EuSc6DXl274Fn18lTO70dsL8wNRZj2cG6969iGz7/WaMbbXheMUtQWfrC04LH2pdkfSdgR+ULuYvFWHQcg9QawtNzw10XjbRfxomI2Dl7L9KV4tWRtuf7reVp3ZamBOyynq4IvBFD/+Ls7nd5YloycEFqc8XqkGRx0laT17mkWHV2lKO3F+QF/HtXBVGjlabyxNmDnJVpu2MVpDvuxOqpjXMVm8ix9txwSsSWTkzP4WyMtSFayDdGi89lrGnDH0jpsEtr02MHePIk4SeSlIPsmX9PXogGne+YZGleBqPe+I3zb5C429o/HIUlzU/MPEpKdCL3viD0zE+eO9tLUmyg9YItwat+I8Xqg7//PwAtza+SkpJLKhdnuW4IaemKpsWrfmFoqjeUcoc4xdTWbRKsDU8oxPS8IktTC5xY8sU0vLskgWx+RmqtP6A4NpOxYDkBW5pRmBYtS7hxcQYTDRND1uXv4Cdqqr5g8jdPd2rgmMUqEbOgmDwuClaO5QDxB0cQrdPxwxFi22CH0Lpoh3+cTH8s079PN9C2mP2w+05q6JYVE7mSvqI0dfWkLcmg9YMpCv1Ek/lRQcSoWRckL19MfrqV++xFLZaTl18xO8IvmB7lrE5qPPaD7K3+iJZtEbADJUhsUBx6qCrioOZAsMkTSxpgV0z+4pFFwPSGqeE8oy1pi5c3Ecc6uO3li7qiYOFPKFGMKaddBEwRB51U9iAJRh7+5NLUpXeUZOnFvbqVYxuOg0oGwmRbkjWwqEVTwaGa+oWLQw2TCJ5A9IfDSkDjRx60ciYqtaYETDlPGO10Ekx52IkkcBsUvmiTd+egvRgNH6ZMKOeRM1P9hijli8nXs8y2MNxZC+rj0uTSC1qWcOMHJl9n8WbUybw9YDMQE23KCR4uCnaCZC/qCY3qNA02HlwcowBEBy6etaVb+PCLkPQoBP/yLEv9/1PyRuuu8zbPLdD7v+d2AJQd2bEzVzVJDYKkKCWr+zvIfp//wgg8c8BhI2fX+TYTibXIrEavlGyzYSclJYV/kcS0WWEaQ1R1qX1vB5kXOnn8lVbns2HEHy3nnGWPE4goyY2SUhfrYEI85mz4hxNZJivZTyTXvKlL3Sw9UqzUgB5JElOKB5VVQRCOOz1ktFhtsdhq3aY6oSLWUzX0lVq6tPTFZsgOxTLKiwClj1PANu2JudySbMuSbMuSbN/8yC1KUxcrvQMZZgsPn1SUKO300pAZrZ4UK3mQLkNqWAKVzVV+a1HE9MgU7i5WciBngp1bqWE3miAm8SDsRiok7QdKHCEvvVOzpksKD4+a2M2LOxLZ3ZF3ciI1P5GcxJnNpdHSok/K5Ni8/FBXipUOkD7vlHiKsi6kp7rMJvoWFeKLXqQDs7p6mOgg4autIxnTnuPMhTRVLybG7WhOLdroJYGW/GaK+OrWN5MxeUsMsbyREE06e4QaT8uP2FPTE8k1v5j49FyR/M7E6urdRCHQNy3FUjhp2Sbvb4pFzYCihrpSn+WpkDAeu5FZSs8rJaWWYycloSOVRVyUbJhomLr1RVnCjX9zMmK1brUrG2HFlVbm28MIQrC0QnyxEQ0fZmTUzsQv3rOpWVm2mSzZVpZt9Q8qkSURY88Uix5MYsNubIbSlW2SVj618d5DNpbqM6XJS+UcXTECUwaFYsNaPJnAsq1ZQ8uV/mLTk7Vu9NIbLYnZ2CIJhB0m5ZRxK8u2TGB7UVdKoyW4ehrdNbXO2Ll6vDE9aC2ChGn4pmisdUPt9OjulkqxTATYv/8LQH4wzK+Np+fXwuQu5BfL6sXEh3OwWdjfNuFVc3FyzMzPm4RpS7hIIZbCSSZUP5B7c5gK57P3UC5ZmjA9QUj5EmZuErAlmHnx/hKM/r/IrOnP9Z2YUWSjA97Y9GLm8y5U9zQ3Xvm7zuyrZy4nmDn56N1vtdyyZrf/SScXT1/mNmbmG9OD99MdZyDtPD/3jyMwGqnlbgR20zMkR7mQc0+aHKfY07IiZibRuTldzfnwxdub462vWegjP8wMJtODJeDNgDs+mkPVi8RMY0fTxARk9mjCVBp2Yx61hOkt6Tnjey1688560Eeep+ZzMHbuiU7tYO5J/IupPUHzv18AABAASURBVDgDsc/diFge/yGzI3L/kKjWbb2EI0Rj5AmYykl27m31xsyafNo4gyU3bQgsenx67rVq7moPzPc0M3uY9CK15kNSvCoSVbFx3QM4TJ6ASzD6OUV78yRyV/yuk7t4R3D2lavGbTN+6dxxniFXvZg4njPhxfPU9O1MfPinxnFsaaIxXpF5FdRCPBET+LjUo+kZzSOrN1LDUp5+juQ7oe3UBFu9Degre2YOMZwXdGhC+opF4lgVPd8k0/wice7vfOInJhef63N3nsd5LuJIjo/TUP3InMNTO5zmZl4591BmPp1cOXHy8SO3M/Hy3MMBVJqjZg4RAXsq49XMpzFhPtkimeZDghgzaaBe8X+TAxnG/UxZs5JjGnlysZsYmR3nTF49Z26aWvOPZHzzO7lsRiSZox/ywvy7566QAvWqD9NzeOYk/sXUTmdW452J/9F7F70neSGfj5Hrfej5eOzEWy2J/TNR7Rk2jAnpxRHYoTlFDqOde0lTjI2mzFMwCrVuZIecaB8bRo5OgqknnsGk0kkdQyxDYL0M9u3lHJ+jnCOXno8mgWg/d/xmrmJGR+bcXa9a5qXnicn9szO/vYtfM7mvz9iYnnyOMGcTP5CJfA05Nz6aPb3MpBhLYiOFGD2MJR+RlsVJskczl4gm9k1XocMAxpiS1rw64SINWAq5MmwvAqOPOxLg/Xf7i5lKD2BUBmfETualyCXN0htmdsihVkb/N4dJcSZ9j56W1J9ILtMY3HnhoS/kfDXMHYkPP/TJbWZ6MjM1iFxvpYfcm6YJ4wA93JhmWt80X1b7Fmkj4nz2HL0m8jkZlgINTOdsm/+Bl7OMrc4UYtAxDP5milzaNu7hVtqyk3nS5DKk89tC7yJjUtr8U5tj0ZtzIHPIcKb7N9NzeO5JfGGfSzZkRmpchs0sgt7xB2nGcn4c0Znf5J58Z7lnOtgR5HJPqj+53tG5xOHhkRN3WEad3ho3xZL86Ny93kzx625y7Q85RCcyO+dq3aguAkSfkY0j098850jkjvjUPzkaSaEZkHqj9J+6HahFZmJLk2vvnUxpfjHxq6+zDO39d25fay5lIu/lzAj2Zspmuec3Z2Dbcor7MrCaDcvxpBZpwJqAeePEFZlAHzFR8xvby3U0rJ2+Wjc6w7yfMhejaEUniD5JUP0vzIiZcdwfcpLnkZ+rejcjh8k1WmcTU0z3nCXadeLT1xkuaO8Xc/ZHz4+7eHCqpzMlqXkt90T/x8j+wvhK8zuh8J2JX9yrFzaCzmmLZeUuWXpniqkvKjS7k3ygWCYP2B3AAo4e1f1InFxBH0RH+MtpUeoXRuhM6zZSa03aq7zIrImyWzr0SVJKfiO1pkgfbCpaUmOpZC8t/lyVaJxGT7TtR8+iQ/wXU8PFsi0MtxRD2JZttJU/EX8ojZZOSrJm/UlmtXPRzgl80V7xSbob70y8HFwvz/mVJNRWrKxOZCJL7Ic7saO6oQ5KiNiQdESe9aFVrUUEJlWTW/zWzVDdmfjFGWpJtmVJtmVJtmVJtl+dgizJtizWSS29KG26nehf9KpDZuZ0kazFYsN06MTL27diylK26F9M7dXF6oDhPfzS7iTxEHOiTBB9kqAa0mP/QXpi0yWFh0dN7Mkzy5Jsy5Jsq38nV84wlTC1C6lVQ0mUhdTQJ2VqbGDto2f/zjafdLovpFK9SJy7aJMdkfyVFEjGkseFp1esO1MjrZN6X/ez1TPbOR+93LaS0qKNlpAwdmp1LUm9ctFypR9oiUPW548QQ5sS0ZhFm9hVmtqby2qPdhJXLybGRaMluX9iJVKVlWXRkuAHLcVWo10h+4ViUaMqmnRQWQgs0el3rTkhHWRW41dKSi2DbrRJYloeKdaV1uiQoiAuPNE3JyNW6xadUjbCk5l5aoLq0pp4UeHmhz7JSA5Ykm1Z+mcXy/b0Q6RsA19JzrZIxq4UKyWgN1LzKpZoRUvslthfPeXUL5SSUlbyvzyNqV+YhGWbCR+3jBb7nepqlg3btOlHMstATyTX/EbbpJwTZSLbMhlwZXKne2rsbs5Ewhc5nMjuLvvDdpk9OUhEnZ2YFAFGLPzUFeR/kZrx6bJEbHwo1iiR61yxjGN3rSRS+0kaWofM6JkH2queGn5V0mhfyRmLdSGZ6kXiHLKjJXujhP64WKvcvGSN3igJhR8c1d1HbvHQF1KrXkyMZ6BtYbgpxkw8lA+a0AhDsRY5aJTIXpmMumi5cTq1CjYaG21gsW0ujZZKsXIGfHQEzlH2mx3JbzbTWUTQssZupNb8SWm09EUSaUvhQ+Y1v5h4uVhurO6WriSBKbOe6anRgBFH/3BpesTigAvLUEs3zIY3f+FkLJOV7NA/KFGMXShL4mygbtIzKWItHmxjxJOLlTxI3z180snhPEdiwz6UZVuSZVuSZVuSZVtZlgP2O5smr9MTpOtwMaPxhSaNC0/+4syqXpSElCW9UlLqYpnIi6DKa1eYIReKRYdB85C4bQmJSaua+ItKksZFlyaB0+zoi1Oq3pl4ue9cCWa1EiYFMSnbcpvC5jZaouVOda2ypqobvfSNHErG7s6hoT3MIZvYKVmEV5duevXoB1N7cCaRnd3KsnJfI2eX/pMfAvkxkl8J+T0QgfVXwjBJfn8M8GZe+KOrx6hfOHflCbmbob1zSCPWBOQkze3cSGGaU8CjQXLBF5uc7WgdxcyV6ENIPjG5w2np2y6M+Iw6rs+Rqcw+N/UTkXgiHRxq5SRzMzClg9RWmGKf0xQ9DB5NkFwawsw8mdoa0Dxx2N5Vm1GTJUVHdjqm0DuSycwraYilcJI51TCTEi/SchlanYH/7MeJxc7mcEnui6tGqR+iTG45yNOCZ+ZAqvksQz4AQXRqH0+GAmOSSxcciyBP9UmTS7FPJyjZsB7o/5+C5qfxqjN6bs4+Hcl9O8M+X0EaSWQWID+J0Uzq5YvEzYfTzGsITj13JTlTvjXdNSaWq4M4JzZnZmtJnQMR2JlP/OZMzLFgSCN2nm0yiTfPydR2Ju6EtaFp+S/IOMLmh3zCBHwOjHw0CUS/Q878SXpinApyxelJJM/UlUvENajmc09i2CzJdFQ2TxaBJeDfnYnpwSnHyNe6JZ3kh41I7ewNHXRkEVjygO7sGdh7I6YxqaiNFLA+7ImZ1SEUS47fmR7Sn6EVLxtzWlncZjVTTQT7aQiPt13+Hcl/dAe2LRFHg6U7Bf2LqY3nozTK/BHsZJbObMI1m0+MaA7SiH16ERiFWrfR3aPp5WVMIZPgTacjdcixRovHd3A8qDq1PorOksRBUkfvN1P8y5nVlhfmnnyak2mmF+P1td6L/ryVnmqI9ehJvhNqOTh5NLXqk2lIPrxW0jLZ5FEI7HhCk7vOm3LPST7LR88drZHPkDmbfGYvJsRjqf9khtOQmYCRc2I081rfSVdyaYNBnkK2n+WRTbK9Nqfw4knngguPWYupxZFpvXhEa2xYH8m7w+MzJo7zKTOBE23c2DT6gbRiOT51Zo9e06JxvliMCnHuPTwTGxN82HH0L6aGx5jQe8LRE63bqEVHLXJfpmT2cJ1KOd0hvtp6J+kPpz17jlNKc+QwN7VA5ZmrN2hPg8/GmIpXUsD6oJMEeXA8h184nzkN45yaYO2HvnI+UT5L88xu5ourg6bec5DZtM5zySEnJkgeXHRmp+3KXc096WnUgPqFVKqfSCGWy8P8G3yRec2HfWG2DqOVeHYSxH/Y2bqC3JsjOxOfTrHxIugXdGEEvkYSbXYkvzmZ7OP9dIR/kp71dfQj53mnJqj+xdSW56G5b0Ymysg7k1tOI7Z9Bat3LiVPNRZ9kp5q2Av/ID0cZZ87E3z0J2o+cxPweQap482Hyd6YGikem+LTJVueRqxNB1utIAp3J3W8JUxppRp2IwGxjk1bfDTfTQLeiLXxwxZ49s6MiH4ix7FUD0fmqtMZNjGXtGdje6OXt5em/N8TUlzIW9tE+IvUOMaevonWSe6OjroynfHeQ1fsoxmVdtB84jdPQ2qPTOHux9CdiV88x1M6uQIe3gjme4vnewsPr+bsN0liOQry8uCF+e5S3pl4PHc1YliYISGSkIhHNj7IqEPTEMuIMhsn8s9AmAMJYdUbGdj6YtoIF/TzvwCUhVn51ZA9QqV0Y7KWmr0xMvkL6axeJM4dtMmOkAjw2NLaSVwdivUXaTnsaEU3zH3Egm/apoLboWjdKI2WZJOX0OpaUpPVoh+ZbFwcCu3uPdTICZ0yvqhFU3vzo+eBpDCfzhTi2a0sV4vdyrJ4VoIftBRL40nLNnmfJBgtVmogOS8G0eXPrSfoWNxmSeSqd0pKrqls0l2nrJRwsapPWqM3yqmyP1Erv0iLk/GuiasXE59u5T57USH+ysxIfWN6Jfari8XYyRuB2RPYOy3bqQ6JbTSOiWRsKBZJqhIb9k19ltNU6e6qTrycWc2dFIsapvSG/+gdcZyBHz0D7EVqme1yIrE+GoEZT8tvWjN2Z+LxFO2JbchM+07JkkirlB7olbuRQ8nYluiwnV22JVmBPYwgTDrhUCzrW4uVvLqxb6xCbxRxPNlQXVbvS+xs+BdJYG18okh2yDdtcoxUeiTZh1bXoa60vKolZ75JpvlFYuF2tAiND8Va6eaQpQkmbzkx+zvdancOXampeScxWizadbjI2RaGW6p1I9zppUOx/qLoV1dmT9Bdto+gtNEYBekkQfOhpMZSKVY0+OgInHb2mx1Jy63MLlQjZplYJ1fFG6kp+qQ0WvoiibSlsNN7PvHp7US90Mnjr7Ryj/1EcsJTgyozi5xYSx/5kynhMWfDT3IGSetk7J1e+Z10p8fDhDRJSysr8Sufism9eNIZDr2oxVNbWqnhoUvreGOpaEuvbEVZpuegCeKg2cTxiDCzh05K9sbEr67p9aI0WtpILFZ6BiIkEpzIRGINs3sU94qafWixrEotWqp+oljktdwJTG7RpUngx5DkTqfU+InkOMaup5aWMjMBxOizbH8oy7Yky7ay7BuTxFdaU9UL3Xx2i8Uhk7G7S4v2aECK2CmZONxcmpz0Qs5Iym5p0eVVWUo2+CKV5p9IIdaHph6xkVmiZjlJ9iECM1os47GDiV/8aGFmO56Y3KtzqjXJXsMOPNKysvyDpsHULTHT8kbC6o1TFq1JlonHvfSinkiu+TAj/mJ6lvtDsWwzSbKtLBvGLvTUyREJgXkoVvM7JardSmm0BK8Z+6pVTe6kWNFAi6kR6iS1ahhLDFOWEFh4amVZhyYikd1QMn9ilRaq20YJERtSjgjEUIy8E560oy3JsnHhUCybWJK9mFryJ0X04seZB4plM3O5SoHkJILYlWJZwrp9sxnqO730hz2crMViw/SgSSX97mnIWd6esI3REcl9Uaw2UBmKSCyfRGDGk7rSSUnMtlghXv3EtrSTlg8T2dml7HU27KMlYuN3JrecGY1Orl5vTC365hlMSpQVZvNs7M6AYXf0I8UyFcDkbQa0AAAQAElEQVSeWQo16+G/AOQ3Rn4eZF+/PBLddX9RJBnycyUd9H50f5ckP+QiYgxJ57TRn3xSJGJpeCJ3pJmTaUa16TiMJlw7DRE4PezVWzipleC+RjDz4/0l+EEf+SFT27PI0OYvRGBpo2u9rp8g2U3zAppSyYyw76Djo5mQnrbS8cj0HH7r2WYdM7+YntOZ03gx90XDZiCWZ/JZyGxvo4081eb+kZmS/l9MbXnePiHzCUYTM4PXYMTzkFRHp3Z60vTEmvvWSZ8jCKov5HD1IjEXsaNp5l8AmT2akMrY0ulp2I3vjJ6Edc59MbnlDMpnRnGu+42ZlfzGnMnHjGf2hbfevo0cZDA2ce5EYBkwOUQsF33I7Ai6yNe6ceJDeqpPRuUEzL28NzNyoPdedA7Ri7WnTO7NacDS29GXWS1wzfC4i1d02JByzqxMwnR/uLoYPnl0guiTBNUf5q74vCtnluee9F6YN+A5zsWge/nVy5xUmyd+YnKnZ276dibOA2BnQfoJMW6tdVua80T9LCGeDKdI0Red8yVz76RllacfTZDjAIERVA9J5ECcWc09sN9vrksNfjQCYwoz56WZ8apzD97zfzIjmcmw9ueexItUcxUvWj2NmiU6SA3VPfclfiVnUssdJ5M7nCmX2kczFovGifKwRplzah5OzAiCVMGup5CjKcBJfD47OsZMiljFF0n0wWmbmHEIuptHbaxCh+0g+GYzzGgj7Ou/SJUcH4lrORH70jM+aZpiOTTk4HxWpk8DeeI9n/jwzE/8kx1PV8is9DIbm9kEufPROdX8yTUjHyHnNjKMLurJ4bGc/WbewCPobj1z8J7/IqfJYQzOuZtGMiY79RhzsUSTj/jhM5j21RPkIOQ28oxOT/RiyvHIefP0fHSbKUEa+xlfmSvSd2UycY7FmJX6uqfo68hDLs4d/+bMaf/ifVY1tZPMT8wr8p7ekZgZ6fpb5zAz5jDvjeZk9QOZXct8ejjZpp/MgeU5xoFaN2Z8mLtJYH3IjT2bbXk+W/ou5J7qk0xPf0dnIJo4ttJ0Vg1JtutCPl01lXCcq781peav5M5p5Y7MQidK7onJvTmDmTB3pGeb0anRyylPX3U2Ojh/5D9kYvNwkuzpf9LbdzVdSZw+3z0y8wrmQB6SPQ/4P51jmcWYz2xyWNIMW6N5Kz3V1K5MgTrvTXOid3IygznS+8rkxnuuOaY8kTtyjiqt3W9kTnp4Y6uZEX0hPdVhum5MjTdiM5sgdyIw+nfNbJJYD0Vl2I2keE+SnE5ESD9R536RLu7IqdYTLw+4LCWcGdi3zsDl3BSjuW3hBJ87mqOpd4V4cnQEKC6pdfvWpEmusZyqfiIFPkDuOTwXNGZAyKuZw1mCaE6kgrdzMfHyzNt7qzm/M/GrM6e1b/KQuY9HYDTEMnuYIiq3E6YDxayp3vSRTzrdO6lhHMv5jiMe5jugHc2BWrbNU5zD0/OlmZMcYDo9BNEZcZJcdUgX8fHZy8zH5y2p0/CmO4L6jcn0fPKHk2RaXoEn4nmZG/WLqZ2+zmRWc7tOfPPOJndh7u6AZE9fXX1tOqppe6ee/gtA8/ug8F9MzVK6gBcP/UWTwWlTf4Ek/jAi9UU90WSdJigWMbtQE80erfu6l3oxTTsTv/rqZY7NhtSifegkdaS1sov+QfeQ08GsIanqjdSaOknN42KttIZ+IDnhNLAn2lwrfqGTx6FYjKBfCsWy3di2FCst22grfyL+UBotnVSrynI2/E5SNftasaPxV3IsNVr0RMpK7YFp11actuzjbi27JWLjY44kPCghYkPSEUGZAO99bJhs42KFuHByWkTJzt6MLOHGwx/uVTvpOXPMCpdr0aYHHy1dKJYlrNsjJeqtvNArD3MPSouFnAESrEYSRv7taUz/hUngj8PEotZ9SFirYsP0GeeE6I2WxGxskQTChrJsS7JsK8u+U0pmpSeWFn0lTZZkW5ZkW/175erxzsTLJXFUlAli1mhHyPyJdWWUV/bGSM5khk4SNb9I3HqZTVISCRcPTQGjIDw1se5MjbRO6n1tZ5koPenkcJsO3A7T+kBpH6GstH9oOYJ9py96VHbSGJH1ztTePKdSeyApzLJxmQucHR+SIBbrrrXy0OpixOIk7I2EdjfZN+ZUcotURZO6yFdXsF0EunYkX8gMidpJsaJFdqjUEp6UVK2upBMMrS/Kksxu2nyjll70MDNMZZlGUzMubdoT04ARR2+uFZ/MWXKS7EXdSU2zDA4nlB2lG730Ij2200Reyhb5SLHSCrQxcjTJQ5xM7sWTnoN0IzACJaWs6J9OERMPxjiBaGBSrrZ3SuZPrG+SxIzHSjZMOTJ0QvRG5ttoXLg9sQ0lUneSk8jj0jclWVruKzuTHEyHTUyHbansrkpZpcnhwr+0WMmD1mdjn6SJhL9TLOMxq/MnzC5Zs04SYErjKym0DoUnhjZxpi3aSyeHH+qZZkKanmiJWZaHxMLt6KTuTG5crNWWI3L+rOyavGUJN34w8Yt79VxIDi1WZxKHGWhbGG6p1k32okKzm7o3SqLHyrIcsA9FpK5DV7DZK7NoX7WiH72H2bDUQXvLbPgaRTRW3Q1tmV1rDw/t5rI7adQfpEyT+gziC2VV60qUzryq1p4ro1/o5PFXmjmpb/TSJy3bSYpdtmWx3pgSHmsfwYcTeSbINlXd6KVDCYFLYduzWYpWKZ0UKznQXLZqNkzRP12sNtIFMRGNITBlQUzNJ8DzLLFh5J3wRkuybEuybCvLvlFLn1SjyX7iaNtTu5Bc9WLi0znfeFGSnb5FCY2LZQkTZYXZzGZp7Qe9NExzlaUweCUdqePrmA6KXNyzSYujLVUvJo73sFjJg+SCnX+VMiM9MBA83CaD2xuZb6MvRGArranqhW4+u8XikMnY3aVFezQgReyUTBz+cGl6pMV1RhsT43Swk1/7aLGSA8k7lPIOse68/BeA/JQYoy2/GRbo/oR4Y35fTD5M38ak030h86oXEy/vr6yN2TA6at1OnQDnF9Pc1loDco9s8nk7ZvxiaqczpjG3hsj8yjxY9x84mCI+cvtuyDGFbyfByjNzouycqHWj74VJL++kxASM6pmDCIy5rXcbvfavtzTPoJ0ca+aVFGK5lMb7vye3cw0NzMz3liikdeUTNZvgH/zoXVz3XmdSaz5kZGLC9txJOU8L7swxHtlSmKPhJPrJCMNUDqYjepEQi5jxCOyqk8B7HxvGU5lHLo3VnO53u0h1eh5ekGNxSnRnwvihL8xwEjObvovmlmi89bLN3L0IcknvY8MYkiSOwAh2OzI7E7940l8XMK/5xcRv/nWWRj5HH3kwPaczs3E66I1cXsWGNVOyYRIbxiG+s1SZfWrifGH9Dpl9ZY60k5aD5JiRY4ATSyPScfW5b3b6OJR4v+OqM4RMhjCZdg5h0TiGqHX71s3kJIPSEv1xJpPfNZLu7Onew+bSmmBn4tMJML6cHu92eTSHqzd+XULtHyzX9J70MvOjiaoXiXNFv+OmsvGy5Dm7sI8im3qRow04BY9vbEgX9cTjCCzxqnAoau4gqqYGGdY7U4tzEKNQ6/aimUMlh+liTDQg96xTG+89CacxI6JuDyJ1NIa7UzoPJf+kk4uvOxJ+/Ei+sDOpnczJaJ7I54v1/qTSU9JzMCExaFtPVfMdHUyRQZVlIurEKSW68+hIS2M2rHdcyWkS+d9an8eG0ZdkX9OYLkT3b3IJ3Txh1RuxYZPnCHHs6DiZyyjkftC72t08XRmQ+I09lA1PD+A52TtmbejH4sqndjipfUDSt1Tk3tI4fXU2jA8SoxWB5R3zGfOZkjjYCn1PbLrjE+VUREmi5Lt5Yu468+k5POcSX5i7kxhSzjUVmXE4HeSjUtrJZ6HSbA4T5/7R61Tb6QvxtlEq0RxJezFbiklRxBJNvmKKTUTvTqn5nYmXpzXhKylg/cc7SZCHxjN7cT4jw6p54SKZGqf+gXwnq6v9zGjmlesemnt/mdx4RnE0r7x+BAqT73TqHEyuUXLRT6SpPYtpI8ws0Du+SE/rIWdrSZyaYJLsxKntQ8hG8okGv3aOt3xyBZeZ5KoXExM+P55pqYHzGYnjRz4xPnL2vHWi23dIMpnMeiU9rT8x9yRPQ57de9CZderUTm8H6hdTYzCWGYx7/ypWw+d/a3STG51XzBCyDH3RacFj7UuwfJ1AHZUbuYvBWPI4hqh1i07PhWtccoT9Mk6SxM6z1yJdKe5OavXc31qd1tXSkA3bxtOVBG/EyN80s/tdnkxLDmykNlesPCJRnLDVxHUuKZudGdXk2wt5Af/ezUKyyVWm8qSZQzoj03ZlM6SuXCdWPrVxrmISMdaeC6fE3tLJ9BzOxFgbkou4M7n4XMaYNvwgpcO21obHDHjqBNEnCaohc+bfkxeSQ853TLBkXoai3v3O+TfIvqa1fzQZhjQ+mfNkUqKTdO8LkWd86tzZXoKyG60bW0I3eyfF5nfmDdEw7QkXL/9vAIpfCzFd2QypnV76gRbLml8aD2rpRUtabhNgeqMopvZKsehhV3r0WUf2yFR3Fhl46C9SE25Twe2NPRotWqAEJbHSBm7aMkmzG2rRi+LQxGs/9Mk5gVQ7jP7l6UodjlnHWZmzbF4uClaW5YD9i5MQrdPxpUnEVoMdQeuiHf1xIv0Ypr9XJ9C2mPmo60xq5C0rJmIlfKU0dXWlLcHQ+mKKIn/SRH7MkMSoWRuJqxcTn27lPntRi9XE1TszI3pjepS18oTGY19kbvOPtGyLDTsoIWJDseihqiSHmoXAJs5e0Q21M/GLJy02TG9MDecZbUlbvLqBWNahbS+9qJ1CRT9RohhTVrvYMCU5dELZQwKMOPrJpalL75Rk6cW98laWbTQOlQiiZFuSNVjUoqngSE1902JRwyQ2z8buj0ZVQONHHFpZsyu1hmyYsp6Y3OkEmPKwkwRoGwpftIk7c2gvJoePUk4o61FzpvkLyVQvJl6eYbaF4c5YqI9LE0svtCzhxg8mXs7gFVEn8uqBjSAm2pQVHi4KdjbJXtQTTdZpGnY/tFgmA9gdbJ6xlavw0Vsi4VEIf3mGpX5hBJ454LCRs+t8m4nEWmRWo1dKttmwk5KSwr9IYtqsMI0hqrrUvreDzAudPP5Kq/PZMOKPlnPOsscJRJTkRkmpi3UwIR5zNvzDiSyTlewnkmve1KVulh4pVmpAjySJKcWDyqogCMedHjJarLZYbLVuU51QEeupGvpKLV1a+mIzZIdiGeVFgNLHKWCb9sRcbkm2ZUm2ZUm2b37kFqWpi5XegQyzhYdPKkqUdnppyIxWT4qVPEiXITUsgcrmKr+1KGJ6ZAp3Fys5kDPBzq3UsBtNEJN4EHYjFZL2AyWOkJfeqVnTJYWHR03s5sUdiezuyDs5kZqfSE7izObSaGnRJ2VybF5+qCvFSgdIn3dKPEVZF9JTXWYTfYsK8UUv0oFZXT1MdJDw1daRcNI8mQAAEABJREFUjGnPceZCmqoXE+N2NKcWbfSSQEt+M0V8deubyZi8JYZY3kiIJp09Qo2n5UfsqemJ5JpfTHx6rkh+Z2J19W6iEOiblmIpnLRsk/c3xaJmQFFDXanP8lRIGI/dyCyl55WSUsuxk5LQkcoiLko2TDRM3fqiLOHGvzkZsVq32pWNsOJKK/PtYQQhWFoh/sqMtCylAw9/OMOPXrFszxmIlB2NQymURIw9UyxLWLdvNkP9yjZLK5/aeO8hG0v1mdLkpXKOrhiBKYNCsWEtnkxg2dasoeVKf7HpyVo3eumNlsRsbJEEwg6Tcsq4lWVbJrC9qCul0RJcPY3umlpn7Fw93pgetBZBwjR8UzTWuqF2enR3S6VYJgLsDnZOQqSU9R9+m5xfIfOrIb8Kju5OfjG1w/mpslnI74mfnlMzlhijTCczOUpf8kmRiKXhZPoq6LtxHaYjh1FTR2DNzmB2ErVLmHuSgJykzk7MRdjE/UWY3D+RWdOXUZyvZsMYkZ25IC9NmWReeXiKjVf+rjP76nMP7bRykpkTJx8/cou9l/gXU4szCEvEbGYlyvw7k8P7qTiA0U8ihjjeSxJr8p0zhBsIchbQfNXkmMLOm+hZwUIqePN8zvDF864Obn3N6tFsh84MRtODJchzbqSfQZ0X4pxmJ88hJiCzRxOm0rAb86glTG9Jzxnfa9Gbd9aDPvJ5aWbtTC06vNeedHIPzsOxz92IWB7/IfdE8LEmz51jZGps9DCFeiw6apF7m70xMyefw/RiyU0bAosen557rbqPaTOtL0wPnlcBjL5at02vewDDyBNwCcZTOU178yTyv5X4XSd38Y7g7CtXjdtm/NK54zxDrnoxcTxnwovnqenbmfjwT43j2NJEY7wi8yqohXgiJvBxqUfTM5pHVm+khqU8/RzJd0LbqQm2ehvQV/bMHGI4L+jQhPQVi8SxKnq+Sab5ReLc3/nET0wuPtfn7jyP81zEkRwfp6H6kTmHp3Y4zc28cu6hzHw6uXLi5ONHbmfi5bmHA6g0R80cIgL2VMarmU9jwnyyRTLNhwQxZtJAveL/JgcyjPuZsmYlxzTy5GI3MTI7zpm8es7cNLXmH8n45ndy2YxIMkc/5IX5d89dIQXqVR+m5/DMSfyLqZ3OrMY7E/+j9y56T/JCPh8j1/vQ8/HYibdaEvtnotozbBgT0osjsENzihxGO/eSphgbTZmnYBRq3cgOOdE+NowcnQRTTzyDSaWTOoZYhsB6Gezbyzk+RzlHLj0fTQLRfu74zVzFjI7MubtetcxLzxOT+2dnfnsXv2ZyX5+xMT35HGHOJn4gE/kacm58NHt6mUkxlsRGCjF6GEs+Ii2Lk2SPZi4RTeybrkKHAYwxJa15dcJFGrAUcmXYXgRGH3ckwPvv9hczlR7AqAzOiJ3MS5FLmqU3zOyQQ62MJpP6t9PGnOZnPuHK7Zo40zom/Zs+8iW1gwxaKpmZmejIZ1b1Nis18qSnnzjvf9M0YW2i5S/yZWU+4FAs0UbOJ0PPAI1NA58k+X/04809y4xqhuY4aLqfmtqFKc4nIc2dxGlO9MgMxDufWSGS1oiOID7IlKRpwMhHb85dPf+LqR2eWYkvXHfxOTorNS7Dvu8jOT3bG1aOZuyTR3BTh97IfaSTpDsRIZcSZXaqP3m7L/ccTonjzMIml6HjrXFTjKaWwwl4SRse2APkQ3oS5cwwE7is1i2lJBfpIh3BUfLRH5/8prkjn50Mpe43MiI9/UjUmY2RSR7nkuoL04fT1dmpvfqawZDpvencmxpkHMbc6m6j187Jvv03GdS3wJxjDIdiHJvZpJdOigasCZg3TlxB65BOjJhM67C9uYY4YDo9Mfpq2ZoluZF0ZvDMySfAO+9P5gizmNF+Lg6RjCRfTQ9vYlR2fOnW0oNTZF9niHad+HTONn5jzr7VyHP7vC99+Ka5POr0dueDJPNKCjHeRFv+3wB0fwzMbj6gUT/dmg7YCDoZi2Xl10xZemeKqS8qNLuTfKBYJg/YHcACjh7V/UicXEEfREf4y2lR6hdG6EzrNlJrTdqrvMisibJbOvRJUkp+I7WmSB9sKlpSY6lkLy3+XJVonEZPtO1Hz6JD/BdTw8WyLQy3FEPYlm20lT8RfyiNlk5Ksmb9SWa1c9HOCXzRXvFJuhvvTLwcXC/P+ZUk1FasrE5kIkvshzuxo7qhDkqI2JB0RJ71oVWtRQQmVZNb/NbNUN2Z+MUZakm2ZUm2ZUm2ZUm2X52CLMm2LNZJLb0obbqd6F/0qkNm5nSRrMViw3ToxMvbt2LKUrboX0zt1cXqgOE9/NLuJPEQc6JMEH2SoBrSY/9BemLTJYWHR03syTPLkmzLkmyrfydXzjCVMLULqVVDSZSF1NAnZWpsYO2jZ//ONp90ui+kUr1InLtokx2R/JUUSMaSx4WnV6w7UyOtk3pf97PVM9s5H73ctpLSoo2WkDB2anUtSb1y0XKlH2iJQ9bnjxBDmxLRmEWb2FWa2pvLao92ElcvJsZFoyW5f2IlUpWVZdGS4ActxVajXSH7hWJRoyqadFBZCCzR6XetOSEdZFbjV0pKLYNutEliWh4p1pXW6I1yutgP7tTKL1LCIshL2aIzM6wmqC6tiRcVbn7ok4zkgCXZlqV/drFsTz9EyjbwleRsi2TsSrFSAnojNa9iiVa0xG6J/dVTTv1CKSllJf/L05j6hUlYtpnwcctosd+prmbZsE2bfiSzDPREcs1vtE3KOVEmsi2TAVcmd7qnxu7mTCR8kcOJ7O6yP2yX2ZODRNTZiUkRYMTCT11B/hepGZ8uS8TGh2KNErnOFcs4dtdKIrWfpKF1yIyeeaC96qnhVyWN9pWcsVgXkqleJM4hO1qyN0roj4u1ys1L1uiNklD4wVHdfeQWD30hterFxHgG2haGm2LMxEP5oAmNMBRrkYNGieyVyaiLlhunU6tgo7HRBhbb5tJoqRQrZ8BHR+AcZb/ZkfxmM51FBC1r7EZqzZ+URktfJJG2FD5kXvOLiZeL5cbqbulKEpgy65meGg0YcfQPl6ZHLA64sAy1dMNsePMXTsYyWckO/YMSxdiFsiTOBuomPZMi1uLBNkY8uVjJg/TdwyedHM5zJDbsQ1m2JVm2JVm2JVm2lWU5YL+zafI6PUG6DhczGl9o0rjw5C/OrOpFSUhZ0islpS6WibwIqrx2hRlyoVh0GDQPiduWkJi0qom/qCRpXHRpEjjNjr44peqdiZf7zpVgVithUhCTsi23KWxuoyVa7lTXKmuqutFL38ihZOzuHBrawxyyiZ2SRXh16aZXj34wtQdnEtnZrSwr9zVydj1oCrE0wvkvANXfDtnfOL88Plb5NbH5C8lULxLnB8f84phfM8P8ehlmckhnrdunuW9qrhGDHtnkbEfLKI6uRGeSfGJyh9PSt10Y8Rk17930lFe6n4jME3kL97Rykjk5mdJBaitMsc9pih4GjyZILg1hZp5MbQ1onjhs76rNqMmSoiM7HVPoHclk5pU0xFI4yZxqmEmJF2m5DK3OwH/248RiZ3O4JPfFVaPUD1EmtxzkacEzcyDVfJYhH4AgOrWPJ0OBMcmlC45FkKf6pMml2KcTlGxYD+T/G8nsMIPCj26GUzsTfzvDPl9B7iSRWYD8JEYzvZcvEjcfTnPv49Di3BUxU751jsWZGOB7Z+Ll3NHTkedABHbmE785k3MsGNKInWebTOLNczK1nYk7YW1oWrDqK/+r/ybB58Co84kT4P0Oc5QY8PWlMS03pohPlvqKr5q5zd/I7GTmLiIOsXMXzXx2ysRkyBPEekHylGOjp/1B52BadjKvneE6GJA7uiqjJ5EBR+pGGrA+7InMaO0kx/v4jakhP5dUvGy5JKXFbVYz1USwn46w98P5jrmFWq786MxL/omdQuEXUxvvXLa5Ipcyd9OTJ0eJofM04uRpw5gTTTRWQbixKpreDKlO8Ka5L2W890COZOd+5iRahX4nSUWfJKiGWy+Hoxh+5Ef+3lfv8YA7c09yJzONMxgX1Xov+vNWeqoh1qMn+U6o5eDk0dSqT6Yh+fBaSctkk0chsOMJTe46b8o9J/ksHz13tEY+Q+Zs8pm9mBCPpf6TGU5DZgJGzonRzGt9J13JpQ0GeQrZfpZHNsn22pzCiyedCy48Zi2mFkem9eIRrbFhfSTvDo/PmDjOp8wETrRxY9PoB9KK5fjUmT16TYvG+WIxKsS59/BMbEzwYcfRv5gaHmNC7wlHT7RuoxYdtch9mZLZw3Uq5XSH+GrrnaQ/nPbsOU4pzZHD3NQClWeu3qA9DT4bYypeSQHrg04S5MHxHH7hfOY0jHNqgrUf+sr5RPkszTO7mS+uDpp6z0Fm0zrPJYecmCB5cNGZnbYrdzX3pKdRA+oXUql+IoVYLg/zb/BF5jUf9oXZOoxW4tlJEP9hZ+sKcm+O7Ex8OsXGi6Bf0IUR+BpJtNmR/OZkso/30xH+SXrW19GPnOedmqD6F1NbnofmvhmZKCPvTG45jdj2FazeuZQ81Vj0SXqqYS/8g/RwlH3uTPDRn6j5zE3A5xmkjjcfJntjaqR4bIpPl2x5GrE2HWy1gijcndTxljCllWrYjQTEOjZt8dF8Nwl4I9bGD1vg2TszIvqJHMdSPRyZq05n2MRc0p6N7Y1e3l6a8n9PSHEhb20T4S9S4xh7+iZaJ7k7OurKdMZ7D12xj2ZU2kHzid88Dak9MoW7H0N3Jn7xHE/p5Ap4eCOY7y2e7y08vJqz3ySJ5SjIy4MX5rtLeWfi8dzViGFhhoRIQiIe2fggow5NQywjymycyD8DYQ4khFVvZGDri2kjXOhs5Bc5kvT6LwD5JdCyxqBEuNNLP9BiWflBUTpIZHU1T/xhBKUkGnZLQhyXsqV2Uix62JWcsu46ueVHCdmwsyI8px+0bQm3w4QbJUpoaaO60p5gqtLQj0w2Lg6FdvceauSEThlf1KKpvfnR80BSmE9nCvHsVparxW5lWTwrwQ9aiqXxpGWbvE8SjBYrNZCcF4Po8ufWE3QsbrMkctU7JSXXVDbprlNWSrhY1Set0RvlVNmfqJVfpMXJeNfE1YuJT7dyn72oEH9lZqS+Mb0S+9XFYuzkjcDsCeydlu1Uh8Q2GsdEMjYUiyRViQ37pj7Laap0d1UnXs6s5k6KRQ1TesN/9I44zsCPngH2IrXMdjmRWB+NwIyn5TetGbsz8XiK9sQ2ZKZ9p2RJpFVKD/TK3cihZGxLdNjOLtuSrMAeRhAmnXAolvWtxUpe3dg3VqE3ijiebKguq/cldjb8iySwNj5RJDvkmzY5Rio9kuxDq+tQV1pe1ZIz3yTT/CKxcDtahMaHYq10c8jSBJO3nJj9nW61O4eu1NS8kxgtFu06XORsC8Mt1boR7vTSoVh/UfSrK7Mn6C7bR1DaaIyCdJKg+VBSY6kUKxp8dAROO/vNjqTlVmYXqhGzTKyTq+KN1BR9UjScW4QAABAASURBVBotfZFE2lLY6T2f+PR2ol7o5PFXWrnHfiI54alBlZlFTqylj/zJlPCYs+EnOYOkdTL2Tq/8TrrT42FCmqSllZX4lU/F5F486QyHXtTiqS2t1PDQpXW8sVS0pVe2oizTc9AEcdBs4nhEmNlDJyV7Y+JX1/R6URotbSQWKz0DERIJTmQisYbZPYp7Rc0+tFhWpRYtVT9RLPJa7gQmt+jSJPBjSHKnU2r8RHIcY9dTS0uZmQBi9Fm2P5RlW5JlW1n2jUniK62p6oVuPrvF4pDJ2N2lRXs0IEXslEwcbi5NTnohZyRlt7To8qosJRt8kUrzT6QQ60NTj9jILFGznCT7EIEZLZbx2MHEL360MLMdT0zu1TnVmmSvYQceaVlZ/kHTYOqWmGl5I2H1ximL1iTLxONeelFPJNd8mBF/MT3L/aFYtpkk2VaWDWMXeurkiITAPBSr+Z0S1W6lNFqC14x91aomd1KsaKDF1Ah1klo1jCWGKUsILDy1sqxDE5HIbiiZP7FKC9Vto4SIDSlHBGIoRt4JT9rRlmTZuHAolk28M7XoRTcW6sHvZzctlm3Z4wQxPLpF4huRsmLdCG9shvpOL/1hDyVrsdgwPWhSSb97GnKWz5CwjdERyX1RrDZQGYpILJ9EYMaTutJJScy2WCFe/cS2tJOWDxPZ2aXsdTbsoyVi43cmt5wZjU6uXm9MLfrmGUxKlBVm82zszoBhd/QjxTIVwJ5ZCjVrtHSnrK75LwD5uTC/PPaXSX4abAz7+yPJanjoK5lDDSNNJ7NydHRSJGJJPHE1czLNqDZl6NKEZLOTGOya9iZProD7GsH+/An7SzC86yM/5Jb2LDK8+QsRWNroWq/pJ0h207yAplQyI8zd4UczIT1tpfLI9Bx+6+G2Y9Yr03M6cxov5r5o2AzE8kw+C5ntbbSRp9rcPzJT0v+LqS3PZ5iQ+QSjiZnBazDieUiqo1M7PWl6Ys1966TPEQTVF3K4epGYi9jRNPMvgMweTUhlbOn0NOzGd0ZPwjrnvpjccgblM6M41/3GzEp+Y87kY8Yz+8Jbb99GDjIYmzh3IrAMmBwilos+ZHYEXeRr3TjxIT3VJ6NyAuZe3psZOdB7LzqH6MXaUyb35jRg6e3oy6wWuGZ43MUrOmxIOWdWJmG6P1xdDJ88OkH0SYLqD3NXfN6VM8tzT3ovzBvwHOdi0L386mVOqs0TPzG50zM3fTsT5wGwsyD9hBi31rotzXmifpYQT4ZTpOiLzvmSuXfSssrTjybIcYDACKqHJHIgzqzmHtjvN9elBj8agTGFmfPSzHjVuQfv+T+ZkcxkWPtzT+JFqrmKF62eRs0SHaSG6p77Er+SM6nljpPJHc6US+2jGYtF40R5WKPMOTUPJ2YEQapg11PI0RTgJD6fHR1jJkWs4osk+uC0Tcw4BN3NozZWocN2EHyzGWa0Efb1X6RKjo/EtZyIfekZnzRNsRwacnA+K9OngTzxnk98eOYn/smOpytkVnqZjc1sgtz56Jxq/uSakY+QcxsZRhf15PBYzn4zb+ARdLeeOXjPf5HT5DAG59xNIxmTnXqMuViiyUf88BlM++oJchByG3lGpyd6MeV45Lx5ej66zZQgjf2Mr8wV6bsymTjHYsxKfd1T9HXkIRfnjn9z5rR/8T6rmtpJ5ifmFXlP70jMjHT9rXOYGXOY90ZzsvqBzK5lPj2cbNNP5sDyHONArRszPszdJLA+5MaezbY8ny19F3JP9Ummp7+jMxBNHFtpOquGJNt1IZ+umkq4+XF/7hwXqfRzT/vCzbmFdHb6yCfK2J2J35zDTOdsd/iZ0SizljOCOn3V2ejg/JH/MD2pw0myv+ntu5quJE7Pd1CRewjumgflEf+Hdwj92JrJtSSjA97MU1EdXSZNU9NlIvqI05TonUzIPRzp28vkxnuuOaY8kTtyjiqt3W9kTnp4Y6uZEX0hPdVhum5MjTdiM5sgdyIw+nfNbJJYD0Vl2I2keE+SnE5ESD9R536RLu7IqdYTLw+4LCWcGdi3zsDl3BSjuW3hBJ87mqOpd4V4cnQEKC6pdfvWpEmusZyqfiIFPkDuOTwXNGZAyKuZw1mCaE6kgrdzMfHyzNt7qzm/M/GrM6e1b/KQuY9HYDTEMnuYIiq3E6YDxayp3vSRTzrdO6lhHMv5jiMe5jugHc2BWrbNU5zD0/OlmZMcYDo9BNEZcZJcdUgX8fHZy8zH5y2p0/CmO4L6jcn0fPKHk2RaXoEn4nmZG/WLqZ2+zmRWc7tOfPPOJndh7u6AZE9fXX1tOqppeyeV1PF+1gf+x/wUaEb6wk1ZrcwviNYjTQ8uvPULI1JfbBP6QqNM0lAs4zF/6WQv7qVOrqAPoRb+9KNHsq9n7UOr6yY1Vf+gJQ5Z3khYvZGepk5SmyPKWmkN/UBywmlgT7S5VvxCJ49DsRhBvxSKZbuxbSlWWrbRVv5E/KE0WjqpVpXlbPidpGr2tWJH46/kWGq06ImUldoD066tOG3Zx91adkvExsccSXhQQsSGpCOCMgHe+9gw2cbFCnHh5LSIkp29GVnCjYc/3Kt20nPmmBUu16JNDz5aulAsS1i3R0rUW3mhVx7mHpQWCzkDJFiNJIz829OY/guTwB+HiUWt+5CwVsWG6TPOCdEbLYnZ2CIJhA1l2ZZk2VaWfaeUzEpPLC36SposybYsybb698rV452Jl0viqCgTxKzRjpD5E+vKKK/sjZGcyQydJGp+kbj1MpukJBIuHpoCRkF4amLdmRppndT72s4yUXrSyeE2HbgdpvWB0j5CWWn/0HIE+05f9KjspDEi652pvXlOpfZAUphl4zIXODs+JEEs1l1r5aHVxYjFSdgbCe1usm/MqeQWqYomdZGvrmC7CHTtSL6QGRK1k2JFi+xQqSU8KalaXUknGFpflCmb3Q/Uyi/S4mS8a+LqJ1q5z96ZeLnuzAxykuxF3UlNswwOJ5QdpRu99CI9ttNEXsoW+Uix0gq0MXI0yUOcTO7Fk56DdCMwAiWlrOifThETD8Y4gWhgUq62d0rmT6xvksSMx0o2TDkydEL0RubbaFy4PbENJVJ3kpPI49I3JVla7is7kxxMh01Mh22p7K5KWaXJ4cK/tFjJg9ZnY5+kiYS/UyzjMavzJ8wuWbNOEmBK4ysptA6FJ4Y2caYt2ksnhx/qmWZCmp5oiVmWh8TC7eik7kxuXKzVliNy/qzsmrxlCTd+MPGLe/VcSA4tVmcShxloWxhuqdZN9qJCs5u6N0qix8qyHLAPRaSuQ1ew2SuzaF+1oh+9h9mw1EF7y2z4GkU0Vt0NbZldaw8P7eayO2nUH6RMk/oM4gtlVetKlM68qtaeK6Nf6OTxV5o5qW/00ict20mKXbZlsd6YEh5rH8GHE3kmyDZV3eilQwmBS2Hbs1mKVimdFCs50Fy2ajZM0T9drDbSBTERjSEwZUFMzSfA8yyxYeSd8EZLsmxLsmwry75RS59Uo8l+4mjbU7uQXPVi4tM533hRkp2+RQmNi2UJE2WF2cxmae0HvTRMc5WlMHglHanj65gOilzcs0mLoy1VLyaO97BYyYPkgp1/lTIjPTAQPNwmg9sbmW+jL0RgK62p6oVuPrvF4pDJ2N2lRXs0IEXslEwc/nBpeqTFdUYbE+N0sJNf+2ixkgPJO5TyDrEeSY+dTfRd2f8CUKz5RZFfDPm9cXZ+LiTOPpqm6CbovpCO6sXEy49fHvPLLccZQgGjs9aNX0o/pGUaCdr4QFJv1lkUfzG101cvV/WtyL4VfjQCyxFwex3fRZJkGUF00xyaTHY6at3mRMNuHx25nIF9DnKROQj2+cpy6q6Tw9NAiRHtfuY0dDYND6QhxueYegRRdMNseO4jl+hrSGoc+TfrBFoXmYngo+yauPmQamLC3nsn5fP61DadYwxOBv98RwjsoyfKPgMS0cBY9FjHED4zBbz3sWE8lSnkcqA60xIsUp0eLmp8YU6RwDLicCSns2/1zkQ/ksnJ4/3fesn5ncgMzR07kz51xbG1E7Ez8YsnfQ5CYBzmwd2Hyb3511kaeX8PHkzP6ZlLD+DTs3+sWTasyZINm3HJMnP0Oh2N84+FpUI+mvv6nXLmmx1HP0VsTq3cl2Zec+mih9nJzEyiL53m5GHfADlKG4dr3Ui9sJWc5GBaoj/OZPK7RtKdPd172FxaE+xMfDoB1i8jzIDzsU0w9sb0ZObJij+3TulsWuFHE1UvEmd0v+OmsuUZcI6yRxd9eqIcK7Phqzuj8PnmOLXiaDpqiVfl0LAZiF3uyD1xBmFUa91edOanHvKw6SJ405SW9Z7EHC8Wrw+icjSGu1O69D7p5OLH7MSnH8kX5i4+z9xBD5bvranZkCRj6S0ZfjAhMZgRnEkbhz46xeRP5kC+u7CdZyXBUQk5FuusdGf2lXSRyP/WWmPD6E9yZreWKRTIkuRML1qk1vxJWlLHJ7/ryZwnmUnb3EeQu9rdPF1pT/xGznBt9h5rkN4EZTfUL6Z2OK37wKRvqci9pXH66mwYHyhGKwLL447PdmUr9D2x6Y5PtMbcNN9Ri1fmjuknz/dXHdLb+MLcncSQtrmDAVjjkA7iiZgauXRU8jCHkz2ZtuQ30toyqRLNkV6esDG1kJPNd7sX0/Dl62DQWoPP1hnIV1LA+o93kiAPjWfmYr5HJvE06gSnJo5NlnIE/qz7CVttndnNvJJ51OYZnIhtzqDr00ms9pXvdI5zKLVGyUU/kab2LKaNMDNBZ36RntZDztaSODXBJNmJU9uHkI3kkw5+7Rxv+eQKLjPJVS8mJnx+PNNSA+czEsePfGJ85Ox560S375BkMpn1Snpaf2LuSZ6GPLv3oDPr1Kmd3g7UL6bGYCwzGPf+VayG/m+bxiG3Nw+ZkcOUGPqi6Wl9I2FtnSC+dyyde/JpTtJavTG1tJ+kVg1jiU8iMB5bWxvVJhcTH04q94H7W6vTRi0tDdmwjh3SlYC3YeRvmoP9Tk+mJQc2UpsrVh6RKE7YauI6l5TNzoxq8u2FvIB/smYh2eQqU3nSzCGdkWm7shlSV64TK5/aOFcxiRhrz4VTYm/pZHoOZ2KsDclF3JlcfC5jTBt+kNJhW2vDYwY8dYLokwTVkDnz78kLySHnOyZYMi9DUe9+5/wbZF/T2j+aDEMan8x5MinRSbr3hcgzPnXubC9B2Y3WjS2hm72TYvM784ZomPaEi7130/MgEinQ0/8CECnz92GUkSbrKyOTvVDKD4xilakttwmwNjxRJNPzSoamFpysuCmN7ixJkMnPpNb6EyVKnIylLqHVteRFS+ZvdivLV82hZE4/9EnRT9UbE795ulODYxajxJ4BZeK4KFhZlgP2L05CtE7HlyYRWw12BK2LdvTHifRjmP5enUDbYuajrjOpkbesmIiV8JXS1NWVtgRD64spivxJE/kxQxKjZm0krl5MfLqV++xFLVYTV+/MjOiN6VHWyhPeNyO2AAAQAElEQVQaj32Ruc0/0rItNuyghIgNxaKHqpIcahYCmzh7RTfUzsQvnrTYML0xNZxntCVt8eoGYlmHtr30onYKFf1EiWJMWe1iw5Tk0AllDwkw4ugnl6YuvVOSpRf3yltZttE4VCKIkm1J1mBRi6aCIzX1TYtFDZPYPBu7PxpVAY0fcWhlza7UGrJhynpicqcTYMrDThKgbSh80SbuzKG9mBw+SjmhrEfNmeYvJFO9mHh5htkWhjtjoT4uTSy90LKEGz+YeDmDV0SdyKsHNoKYaFNWeLgo2Nkke1FPNFmnadj90GKZDGB3sHnGVq7CR2+JhEch/OUZlvqFEXjmgMNGzq7zbSYSa5FZjV4p2WbDTkpKCv8iiWmzwjSGqOpS+94OMi908vgrrc5nw4g/Ws45yx4nEFGSGyWlLtbBhHjM2fAPJ7JMVrKfSK55U5e6WXqkWKkBPZIkphQPKquCIBx3eshosdpisdW6TXVCRaynaugrtXRp6YvNkB2KZZQXAUofp4Bt2hNzuSXZliXZliXZvvmRW5SmLlZ6BzLMFh4+qShR2umlITNaPSlW8iBdhtSwBCqbq/zWoojpkSncXazkQM4EO7dSw240QUziQdiNVEjaD5Q4Ql56p2ZNlxQeHjWxmxd3JLK7I+/kRGp+IjmJM5tLo6VFn5TJsXn5oa4UKx0gfd4p8RRlXUhPdZlN9C0qxBe9SAdmdfUw0UHCV1tHMqY9x5kLaapeTIzb0ZxatNFLAi35zRTx1a1vJmPylhhieSMhmnT2CDWelh+xp6Ynkmt+MfHpuSL5nYnV1buJQqBvWoqlcNKyTd7fFIuaAUUNdaU+y1MhYTx2I7OUnldKSi3HTkpCRyqLuCjZMNEwdeuLsoQb/+ZkxGrdalc2woorrcy3hxGEYGmF+CszMvWdicctcXJzhk8uO/lDQ7Fs049DJbIkYuyZYtGDSWzYjc1QurJN0sqnNt57yMZSfaY0eamcoytGYMqgUGxYiycTWLY1a2i50l9serLWjV56oyUxG1skgbDDpJwybmXZlglsL+pKabQEV0+ju6bWGTtXjzemB61FkDAN3xSNtW6onR7d3VIplokAu4OdkxApZeXu8NBKIj2L/S8A+f2yvymW/DJ4kN8T+cGwqhzNuPTw6yHJWNIbKcToYSj5indOE/vqI6I5lzA3dxMmF4S0XcLckwRsCfY87C/B/y+ZNedyfSd2HOlF3tT0YubzLlT3NDVe+bvO7KvPPbTTyklmT5x8/Mgt5hYaUNP/pJOLpy/zGjPrjenB5zMymThvpH3u6Jwmq9mwFz1DcpQLmfWkyXGaPS0r4o4kem9OV3M+fPH25njraxb6yA8zg8n0YAl4O+COj+ZQ9SIx09jRNDEBmT2aMJWG3ZhHLWF6S3rO+F6L3ryzHvSR56n5HIyde6JTO5h7Ev9iag/OQOxzNyKWx3/I7IjcPySqdVsv4QjRGHkCpnKSnXtbvTGzJp82zmDJTRsCix6fnnutmrvaA/M9zcweJr1IrfmQFK+KRFVsXPcADpMn4BKMfk7R3jyJ3BW/6+Qu3hGcfeWqcduMXzp3nGfIVS8mjudMePE8NX07Ex/+qXEcW5pojFdkXgW1EE/EBD4u9Wh6RvPI6o3UsJSnnyP5Tmg7NcFWbwP6yp6ZQwznBR2akL5ikThWRc83yTS/SJz7O5/4icnF5/rcnedxnos4kuPjNFQ/Mufw1A6nuZlXzj2UmU8nV06cfPzI7Uy8PPdwAJXmqJlDRMCeyng182lMmE+2SKb5kCDGTBqoV/zf5ECGcT9T1qzkmEaeXOwmRmbHOZNXz5mbptb8Ixnf/E4umxFJ5uiHvDD/7rkrpEC96sP0HJ45iX8xtdOZ1Xhn4n/03kXvSV7I52Pkeh96Ph478VZLYv9MVHuGDWNCenEEdmhOkcNo517SFGOjKfMUjEKtG9khJ9rHhpGjk2DqiWcwqXRSxxDLEFgvg317OcfnKOfIpeejSSDazx2/mauY0ZE5d9erlnnpeWJy/+zMb+/i10zu6zM2piefI8zZxA9kIl9Dzo2PZk8vMynGkthIIUYPY8lHpGVxkuzRzCWiiX3TVegwgDGmpDWvTrhIA5ZCrgzbi8Do444EeP/d/mKm0gMYlcEZsZN5KXJJs/SGmR1yqJXRZFL/6TOfFo7+F981caZ1DPeGh76QWjVkEHvU+KFPbjPTkZmpQST3c5o473/TNGFtouUv8mVlPuBQLNFGzidDzwCNTUPegkjtH/x4c8/2GBtDcxQ03U/fdGY3y2fYSDMV2rLT+KTJZdhxXzip9PdoysuZkzQNGLnozbm9538xtcMzK/GF604+RmelxmXY930kp2d7w8rRjH3yCG7q0Bu5j3SSdCci5FKizE71J2/35Z7DKXGcWdjkMnS8NW6K0dRyOAEvacMDe4B8SE+inBlmApfVuqWU5CJdpCM4Sj7645PfNHfks5Oh1P1GRqSnH4k6szEyyeNcUn1h+nC6Oju1V18zGDK9N517U4OMw5hb3W302jnZt/8mg/oWmHOM4VCMYzOb9NJJ0YA1AfPGiStoHdKJEZNpHbY31xAHTKcnRl8tW7MkN5LODJ45+QR45/3JHGEWM9rPxSGSkeSr6eFNjMqOL91aenCK7OsM0a4Tn87Zxm/M2bcaeW6f96UP3zSXR53e7nyQZF5JIcabaGNEBCcvmnuq/6v+F4DW9meNgo2gk7FYVn44lKV3ppj6okKzO8kHimXygN0BLODoUd2PxMkV9EF0hL+cFqV+YYTOtG4jtdakvcqLzJoou6VDnySl5DdSa4r0waaiJTWWSvbS4s9VicZp9ETbfvQsOsR/MTVcLNvCcEsxhG3ZRlv5E/GH0mjppCRr1p9kVjsX7ZzAF+0Vn6S78c7Ey8H18pxfSUJtxcrqRCayxH64EzuqG+qghIgNSUfkWR9a1VpEYFI1ucVv3QzVnYlfnKGWZFuWZFuWZFuWZPvVKciSbMtindTSi9Km24n+Ra86ZGZOF8laLDZMh068vH0rpixli/7F1F5drA4Y3sMv7U4SDzEnygTRJwmqIT32H6QnNl1SeHjUxJ48syzJtizJtvp3cuUMUwlTu5BaNZREWUgNfVKmxgbWPnr272zzSaf7QirVi8S5izbZEclfSYFkLHlceHrFujM10jqp93U/Wz2znfPRy20rKS3aaAkJY6dW15LUKxctV/qBljhkff4IMbQpEY1ZtIldpam9uaz2aCdx9WJiXDRakvsnViJVWVkWLQl+0FJsNdoVsl8oFjWqokkHlYXAEp1+15oT0kFmNX6lpNQy6EabJKblkWJdaY3eKKeL/Yla+ZD6WAR5KRspZWYotsYnrdGLCjc/9ElGcsCSbMvSP7tYtqcfImUb+EpytkUydqVYKQG9kZpXsUQrWmK3xP7qKad+oZSUspL/5WlM/cIkLNtM+LhltNjvVFezbNimTT+SWQZ6IrnmN9om5ZwoE9mWyYArkzvdU2N3cyYSvsjhRHZ32R+2y+zJQSLq7MSkCDBi4aeuIP+L1IxPlyVi40OxRolc54plHLtrJZHaT9LQOmRGzzzQXvXU8KuSRvtKzlisC8lULxLnkB0t2Rsl9MfFWuXmJWv0Rkko/OCo7j5yi4e+kFr1YmI8A20Lw00xZuKhfNCERhiKtchBo0T2ymTURcuN06lVsNHYaAOLbXNptFSKlTPgoyNwjrLf7Eh+s5nOIoKWNXYjteZPSqOlL5JIWwofMq/5xcTLxXJjdbd0JQlMmfVMT40GjDj6h0vTIxYHXFiGWrphNrz5Cydjmaxkh/5BiWLsQlkSZwN1k55JEWvxYBsjnlys5EH67uGTTg7nORIb9qEs25Is25Is25Is28qyHLDf2TR5nZ4gXYeLGY0vNGlcePIXZ1b1oiSkLOmVklIXy0ReBFVeu8IMuVAsOgyah8RtS0hMWtXEX1SSNC66NAmcZkdfnFL1zsTLfedKMKuVMCmISdmW2xQ2t9ESLXeqa5U1Vd3opW/kUDJ2dw4N7WEO2cROySK8unTTq0c/mNqDM4ns7FaWlfsaObseNIVYGp+oJtmH/S8A+X2QHwv5pXDto8XKL4Ug+ZRP0lG9SJwfFCmfvzgSUIylODNST6a1iB5atSC5RzY5G+MmWPsx4xdTOzzHEl8YwcuO2YtH21SpN+A7eSUHOdSOkzmX/EZq+ahkk+zX0VQTpCDWPKrMzPZwsDU41grhmW0c1bN9a6IJMiPROzkZS8NJ7qiGTO+DFmlhePdyRbniH/04sZh7crIk90WKyVHqO8rkloM8LXhmDqSazzLk4QTRqX08GQqMSS5dcCyCPNUnTS7FPDONJRvWA/sv/lPPTfg0cJR4OonT8ey0fL6C3EkiswH5SYxmXmcvEjcfTnPv4dDi3BcxU751jsWZGOB7Z+Ll3NHTkedABHbmE785k3MsGNKInWebTOLNczK1nYk7YW1oWrDqK/mESfA5MOrRJBD/xTnJ14Ym6Hf6RHKx6WIEInGccH0C5iKyJ3+SOxrDnAxG08zJajaMMpU5zJuoE2Pka92+dTOZxIG0RDOHzKHCFsmletGT2FNH6yINWB/0RGa2dpJj/TAbU0N+Lql42XJJSovbrGaqiWA+ZUcTh5d/v7awMSplMM8kuOpOSTYjXpie8TQ1YnR415lN6XJXc03mG+AUMXsExyuurEq+XS9vIt2+sKMa5K4JuvMO5iRchX5HSUWfJKiGWy+Hoxh+5Ef+3lcvb5u+m849qZ1MFz0YF9V6L/rzVnqqIdajJ/mOqOXg5NHUqk+mIfnwWknLZJNHIbDjCU3uOm/KPSf5LB89d7RGPkPmbPKZvZgQj6X+kxlOQ2YCRs6J0cxrfSddyaUNBnkK2X6WRzbJ9tqcwosnnQsuPGYtphZHpvXiEa2xYX0k7w6Pz5g4zqfMBE60cWPT6AfSiuX41Jk9ek2LxvliMSrEuffwTGxM8GHH0b+YGh5jQu8JR0+0bqMWHbXIfZmS2cN1KuV0h/hq652kP5z27DlOKc2Rw9zUApVnrt6gPQ0+G2MqXkkB64NOEuTB8Rx+4XzmNIxzaoK1H/rK+UT5LM0zu5kvrg6aes9BZtM6zyWHnJggeXDRmZ22K3c196SnUQPqF1KpfiKFWC4P82/wReY1H/aF2TqMVuLZSRD/YWfrCnJvjuxMfDrFxougX9CFEfgaSbTZkfzmZLKP99MR/kl61tfRj5znnZqg+hdTW56H5r4ZmSgj70xuOY3Y9hWs3rmUPNVY9El6qmEv/IP0cJR97kzw0Z+o+cxNwOcZpI43HyZ7Y2qkeGyKT5dseRqxNh1stYIo3J3U8ZYwpZVq2I0ExDo2bfHRfDcJeCPWxg9b4Nk7MyL6iRzHUj0cmatOZ9jEXNKeje2NXt5emvJ/T0hxIW9tE+EvUuMYe/omWie5OzrqynTGew9dsY9mVNpB84nfPA2pPTKFux9DdyZ+8RxP6eQKeHgjNz/ZkAAAEABJREFUmO8tnu8tPLyas98kieUoyMuDF+a7S3ln4vHc1YhhYYaESEIiHtn4IKMOTUMsI8psnMg/A2EOJIRVb2Rg64tpI1zobOQXOZI0eToxglxGDpEHpgH2vwBUfw/kF8EnJp38hZyoXiTOD460yY6QCPDY0tpJXB2K9RdpOexoRTfMfcSCb9qmgtuhaN0ojZY2qivtCegONPRJr2xosnFxKLS7S45ZSLGrZMP00fT4xdOV2gNJYT6dCcSzW1muFruVZeXeRs6uB00hlsaTps9ttockRouVHEiOqkJlHfnEr94TVBePMyW5L6Y1eXHNkACBpTcpXHikWFdaozfK6WJ/olZ+kRYn410TVy8mPt3KffaiQvyVmZH6xvRK7FcXi7GTNwKzJ7B3WrZTHRLbaBwTydhQLJJUJTbsm/osp6nS3VWdeDmzmjspFjVM6Q3/0TviOAM/egbYi9Qy2+VEYn00AjOelt+0ZuzOxOMp2hPbkJn2nZIlkVYpPdArdyOHkrEt0WE7u2xLsgJ7GEGYdMKhWNa3Fit5dWPfWIXeKOJ4sqG6rN6X2NnwL5LA2vhEkeyQb9rkGKn0SLIPra5DXWl5VUvOfJNM84vEwu1oERofirXSzSFLE0zecmL2d7rV7hy6UlPzTmK0WLTrcJGzLQy3VOtGuNNLh2L9RdGvrsyeoLtsH0FpozEK0kmC5kNJjaVSrGjw0RE47ew3O5KWW5ldqEbMMrFOroo3UlP0SWm09EUSaUthp/d84tPbiXqhk8dfaeUe+4nkhKcGVWYWObGWPvInU8Jjzoaf5AyS1snYO73yO+lOj4cJaZKWVlbiVz4Vk3vxpDMcelGLp7a0UsNDl9bxxlLRll7ZirJMz0ETxEGzieMRYWYPnZTsjYlfXdPrRWm0tJFYrPQMREgkOJGJxBpm9yjuFTX70GJZlVq0VP1EschruROY3KJLk8CPIcmdTqnxE8lxjF1PLS1lZgKI0WfZ/lCWbUmWbWXZNyaJr7Smqhe6+ewWi0MmY3eXFu3RgBSxUzJxuLk0OemFnJGU3dKiy6uylGzwRSrNP5FCrA9NPWIjs0TNcpLsQwRmtFjGYwcTv/jRwsx2PDG5V+dUa5K9hh14pGVl+QdNg6lbYqbljYTVG6csWpMsE4976UU9kVzzYUb8xfQs94di2WaSZFtZNoxd6KmTIxIC81Cs5ndKVLuV0mgJXjP2Vaua3EmxooEWUyPUSWrVMJYYpiwhsPDUyrIOTUQiu6Fk/sQqLVS3jRIiNqQcEYihGHknPGlHW5Jl48KhWDbxztSiT4ro2y3JtizJtizJtizJzj60Pbo8chLJ2JViWcK6fbMZ6ju99Ic9nKzFYsP0oEkl/e5pyFnenrCN0RHJfVGsNlAZikgsn0RgxpO60klJzLZYIV79xLa0k5YPE9nZpex1NuyjJWLjdya3nBmNTq5eb0wt+uYZTEqUFWbzbOzOgGF39CPFMhXAnlkKNWu0dKesLpsA04Ukqq3/5NfT/CoZ5ifCb4o0HfxwmF8R+dEQjVWHBLEUnrh+aWRCmlFtytClCclmJzHYNe1NnlwB9zWCeVe8b3/QR37ILe1ZZHjzFyKwtNG1XtNPkOymeQFNqWRG2HfQ8dFMSE9b6Xhkeg6/9WyzjplfTM/pzGm8mPuiYTMQyzP5LGS2t9FGnmpz/8hMSf8vprY8b5+Q+QSjiZnBazDieUiqo1M7PWl6Ys1966TPEQTVF3K4epGYi9jRNPMvgMweTUhlbOn0NOzGd0ZPwjrnvpjccgblM6M41/3GzEp+Y87kY8Yz+8Jbb99GDjIYmzh3IrAMmBwilos+ZHYEXeRr3TjxIT3VJ6NyAuZe3psZOdB7LzqH6MXaUyb35jRg6e3oy6wWuGZ43MUrOmxIOWdWJmG6P1xdDJ88OkH0SYLqD3NXfN6VM8tzT3ovzBvwHOdi0L386mVOqs0TPzG50zM3fTsT5wGwsyD9hBi31rotzXmifpYQT4ZTpOiLzvmSuXfSssrTjybIcYDACKqHJHIgzqzmHtjvN9elBj8agTGFmfPSzHjVuQfv+T+ZkcxkWPtzT+JFqrmKF62eRs0SHaSG6p77Er+SM6nljpPJHc6US+2jGYtF40R5WKPMOTUPJ2YEQapg11PI0RTgJD6fHR1jJkWs4osk+uC0Tcw4BN3NozZWocN2EHyzGWa0Efb1X6RKjo/EtZyIfekZnzRNsRwacnA+K9OngTzxnk98eOYn/smOpytkVnqZjc1sgtz56Jxq/uSakY+QcxsZRhf15PBYzn4zb+ARdLeeOXjPf5HT5DAG59xNIxmTnXqMuViiyUf88BlM++oJchByG3lGpyd6MeV45Lx5ej66zZQgjf2Mr8wV6bsymTjHYsxKfd1T9HXkIRfnjn9z5rR/8T6rmtpJ5ifmFXlP70jMjHT9rXOYGXOY90ZzsvqBzK5lPj2cbNNP5sDyHONArRszPszdJLA+5MaezbY8ny19F3JP9Ummp7+jMxBNHFtpOquGJNt1IZ+umkq4+XF/7hxnfus7Eyut3JFZ6EQZ98Tk3jyzUzv5mdUoM5fTxp3rPvoP/c30zCEixmR/09t3xSC6kjg930FF7iO4ax7U+f/ODuEMtmZyLcnogLf2ERuTpqnpMhF14tyb6J2ZS38s95XJjfdcc0x5InfkM1OltfuNzEkPb2w1M6IvpKc6TNeNqfE2bGYT5E4ERv+umU0S66GoDLuRFO9JktOJCOkn6twv0sUdOdV64uUBl6WEMwP71hm4nJtiNLctnOBzR3M09a4QT46OAMUltW7fmjTJNZZT1U+kwAfIPYfngsYMCHk1czhLEM2JVPB2LiZennl7bzXndyZ+dea09k0eMvfxCIyGWGYPU0TldsJ0oJg11Zs+8kmneyc1jGM533HEw3wHtKM5UMu2eYpzeHq+NHOSA0ynhyA6I06Sqw7pIj4+e5n5+LwldRredEdQvzGZnk/+cJJMyyvwRDwvc6N+MbXT15nMam7XiW/e2eQuzN0dkOzpq6uvTUc1be+kkjrez/pKpvHW/btNHP9PfwiUFUovNBWcstpH/GFE6ot6osk6TVAsYnahJpo9Wvd1L/VimnYmfvXVyxybDalF+9BJ6khrZRf9g+4hp4NZQ1LVG6k1dZKax8VaaQ39QHLCaWBPtLlW/EInj0OxGEG/FIplu7FtKVZattFW/kT8oTRaOqlWleVs+J2kava1Ykfjr+RYarToiZSV2gPTrq04bdnH3Vp2S8TGxxxJeFBCxIakI4IyAd772DDZxsUKceHktIiSnb0ZWcKNhz/cq3bSc+aYFS7Xok0PPlq6UCxLWLdHStRbeaFXHuYelBYLOQMkWI0kjPzb05j+C5PAH4eJRa37kLBWxYbpM84J0RstidnYIgmEDWXZlmTZVpZ9p5TMSk8sLfpKmizJtizJtvr3ytXjnYmXS+KoKBPErNGOkPkT68oor+yNkZzJDJ0kan6RuPUym6QkEi4emgJGQXhqYt2ZGmmd1PvazjJRetLJ4TYduB2m9YHSPkJZaf/QcgT7Tl/0qOykMSLrnam9eU6l9kBSmGXjMhc4Oz4kQSzWXWvlodXFiMVJ2BsJ7W6yb8yp5BapiiZ1ka+uYLsIdO1IvpAZErWTYkWL7FCpJTwpqVpdSScYWl+UKZvdD9TKL9LiZLxrYuOSMptwoyemgBFHb64Vn8wMcpLsRd1JTbMMDieUHaUbvfQiPbbTRF7KFvlIsdIKtDFyNMlDnEzuxZOeg3QjMAIlpazon04REw/GOIFoYFKutndK5k+sb5LEjMdKNkw5MnRC9Ebm22hcuD2xDSVSd5KTyOPSNyVZWu4rO5McTIdNTIdtqeyuSlmlyeHCv7RYyYPWZ2OfpImEv1Ms4zGr8yfMLlmzThJgSuMrKbQOhSeGNnGmLdpLJ4cf6plmQpqeaIlZlofEwu3opO5Mblys1ZYjcv6s7Jq8ZQk3fjDxi3v1XEgOLVZnEocZaFsYbqnWTfaiQrObujdKosfKshywD0WkrkNXsNkrs2hftaIfvYfZsNRBe8ts+BpFNFbdDW2ZXWsPD+3msjtp1B+kTJP6DOILZVXrSpTOvKrWniujX+jk8VeaOalv9NInLdtJil22ZbHemBIeax/BhxN5Jsg2Vd3opUMJgUth27NZilYpnRQrOdBctmo2TNE/Xaw20gUxEY0hMGVBTM0nwPMssWHknfBGS7JsS7JsK8u+UUufVKPJfuJo21O7kFz1YuLTOd94UZKdvkUJjYtlCRNlhdnMZmntB700THOVpTB4JR2p4+uYDopc3LNJi6MtVS8mjvewWMmD5IKdf5UyIz0wEDzcJoPbG5lvoy9EYCutqeqFbj67xeKQydjdpUV7NCBF7JRMHP5waXqkxXVGGxPjdLCTX/tosZIDyTuU8g6xHkmPnU303ahoy3aKMn9KLFf/hx8Nxe+I/AoJ2PNDYXUL+eUweTLVi4mXH7885tdEjtNMAaOz1q1DSZa0TCMBOfb2XFjxvB0zfjG10xnTmFtCZN8K+3Z4POcsJ4fP6/gOiDm92m6aQ5PJzolaN/pfmPTyjGYEvdyQHNHoiqg+N9MRWKJxTqA74Z2MaccrKcRyKY39TtDrUuYiWhuyc233D+ni6D/aOnuc6WyOXkhPdbhqhMebLqR8jLqzI7ZkRvDonMDzHQLqE2U/OjYSYj32yhTw3seG8UTmkcvB6tyTYJHq9PCExhfmFAksIw5Hcjr7Vu9M9COZnDw+/67RnK9eBBmaO3YmfeqKY2snYmfiF0/6HITAOMyDuw+Te/OvszTy/h48mJ7TM5cewKdl/1izbFiTJRs245Jl5uh1OhrnHwtLhXw09/U75cw3O45+iticWrkvzbzm0kUPs5OZmURfOs3Jw74BcpQ2Dte6kXphKznJwbREf5zJ5HeNpDt7uvewubQm2Jn4dAKsX0aYAedjm2DsjenJzJMVf26d0tm0wo8mql4kzuh+x01lyzPgHGWPLvr0RDlWZsNXd0bh881xasXRdNQSr8qhYTMQu9yRe+IMwqjWur3ozE895GHTRfCmKS3rPYk5XixeH0TlaAx3p3TpfdLJxY/ZiU8/ki/MXXyeuYMeLN9bU7MhScbSWzL8YEJiMCM4kzYOfXSKyZ/MgXx3YTv/R8kZLcnO27wWyPu/c7IAym7Zbffs6BO1CJCiPLP/OhdTqXNWkhyVkGvZnZXuzL6SLoz831prHGz6Y87s1jKFAi4md/rQIrX6J2lJnRh/1+OcN5lJ27xHkrfaXZ+utCd/I3d4NmevNUlvkrIH6hdTO4LWfWDsmxW5tzRPX4ODzQ+UTSuCnY87frYrW6HvibU7Ptkac9P8jlq8Mm9MPz6/v+qQ3uYX5u0YQ9rmDQawm4d0kE/G1Milo+LDXI57Mm3xN9LaMlaJ5kofT9qcWsjN+j3uxTR8xboYtNbkc3QG8pUU2P3HO0mSD01k5mJ+j0zi00N8HVUAABAASURBVKiTnJo8e1zKEcSz7k/YauvMrvNK5lGbz+BG9hYMun46xmpffqdznUupNYsX/USa2rOYNtLMBJ35RXpaD7nbHePUJGNykqe2D8GN5Ccd/Dq53vLJlVxm4lUvJid9/nimpQbOz0ieOPzkxMg5862T3X6HmHEy65X0tP7EvBOfhnx230Fn1qlTO6MdqF9MjcHszGDc+69iNfT/tmkc8np9yIxcpsTQF01P6xtJu9cN8nvH0nknP81JWqs3ppb2k9SqYXbykwg2H9u9Dqo1F5MfgZX3wP1bq9NGLS1NOdgdO6QrCd/Gxr9pLvZ3ejItubCR2jyxfESyBGmryRs8UtadGdX47YV8Af9kdSFuvMpUnjRzsDMybVfWwbpy3Vh+ahM8xSRydnsunBJnSyfTcwQTs9sQL+LOeIl5jDFt+EFKx95amx4z4KmTRJ8kqYbMmX9PvhAPOb9jkiXzZSjqPe+cf4Oca1r7R+MwpPnJ3MdJiU7svhciz/zUebO9JGUPWje2hK57J8X6O/MN0TDtSRf77qbngzBSaA9H80Vmt2fxP85fAomT5nL0hVL/aCgNU1thk7BbeKIw0/NKsejhVHr0WYd7ONWdhQMP/UVqImwqhL2xV6NFC5SgutKW5ErLmOY01KIXRfPk6zz0ybmBVDuM/hXpSh3Oto67Mnc5vEIUrCzLAecXxxCt0/GlMbJXgx1B66Id/Qky/Rimv1cn0LaY+ajrTGr4lpUtciV9pTR1daUtydD6YorCP2kyPzqYbGrWRvLqxeRnWHnPXtRiNXn1zsyI3pgeZS2f1ET2F5lb/5GWbXGwD0qI7KFY9FBVzKFmIdiT56zogdqZ/CVii4OtN6ZG8BltSVuiuolY1qFtL72onUJFP1GimK2sdnGwFXPopLKHJGzy6KeQpi69U5Kll/DyrSzbaAIqGUTJtiRrsKhFUyGQmvqmxaLGljg8B6c/GlUBTRx5aGXNqdSacrCV9cR4Z5CwlQ87SYK2oYhFm7wzh/ZiPGKUckNZj5o79S/EqV5MviLDbItNOGOhPiFNLr3QskSYOJh8BYNXRp3Mqwc2g2zRpqzwCFGwc0j2op5oXKdp2PPQYhkHcDrYImMrV+GjNyPpUQh/RYalfmEEkTng2CPn1PltJhNrkVnNXinZ5mCflBSL+CLGtFlhGkNUdan9bAfOCx2feKXV+Rxs8o+Wc8+yJ0hEFnOjpNTFOpiUyHYO4sPJLONK9hPx6pu61MPSI8VKDeiRmGyleFBZFSThhNODo8Vqi8XR3WOqkypifaqGvlJLl5a+WAd3KJZRXgQofYICe9OenMctybYsybYsyfYtDm9RmrpY6R3IMEd4xFhRorTTS0NmtHpSrPggXYbU2ElU1qv81qLI1iNTuIdY8UDuBDu3UtMeNEG2xAexb6SCaT9Q4gq+9E7Nmi4pPCJqctcXbySzeyLv5EZqfiKexJ0tpNHSok/KeBxecagrxUoHSJ93SnyKsi6kp7rMIfoWFRKLXqSDbXX1MtlB0te9rmRMe447F9JUvZicsKO5tWijlwRa8pspEqtb34xjfEsMsbyRFI2dM0LNp+VH7qnpiXj1F5OfkSfi70yurr5NFgJ901J2Cict2/j+pljUDChqqCv1WZ4KhonsG5ml9LxSUmq5dlISOlJZ5EXJwRYNU7e+KEuEiW+OI1brVrtykFZcaWW+PYwgBUsrJF6ZkanvTP4SDLckM08sezLbKMm2+h9EaYBjKeJLi0WNLXGwb6xD6co2SctPbaLzcbNTfaY0vlTO1ZUj2MqgUBzsFk8msWxr1tBypb9Ye1zrRi+90ZKYzV7EQNhhLKdMWFm2ZRLbi7pSGi3B1dPsrql1xs7V443pQWsRJE3DN0Vjdw/UTo/uaakUy2SA08HOMYSlrLwdHlox0nMhRjUUkXzx4f8PQMbxF0N2/9w4bMrBjtE/JuY4dP5CGv3A9ZdGKmlGTR+CXTcPEtmphcSR5j1k/mqJ1TvJE/1LMPX/i8ya/ozqxIzCjQ74ptqLmd+vRsM0N1v+XWf2NTKXG8wcP3qPW4032veLqSXyDZnbnJlvTA/Rn+64A2nn8/P+BIJNI7V8A4J90zMkV3mQe08aj1ucaVkZM2N0bm5Xcz98ifbmeutrFvrwh5nBZHrYSfhmwBsfzaXqRXKmcaJpYgIyZzRpKk17MI9a0vSW9Jz5vRa9RWc96MPnU/NzMHbeiU7tYN5J/oupPQQD2Z+3Edn5+A+ZHZH3h2TdPdaXcIVsNj4JU7nJybut3phZ46eNO+x404ZgR09Mz71WzVvtgfk9zcxexl6kVj/E4qsiURUb1zuAy/gkPMKmn1u018fIW4m7jneJjuDuK1eN12b80nnjvINXvZg8kTvhJfKp6duZ/IhPjevspclm8xWZV0EtJJIxgR+XejQ9o/nI6o3U2ClPP1fyO6Ht1CRbvQ3oK3tnLjGcL+jQpPQVi+TZVfR8E6f+Inne73zyJ8ZLzPN5O5/HfR7iSq5P0FD9yNwjUjuC5jqvnHcoM59Onpw8fuLwdiZfkXe4gEpz1MwhI+FMZaKa+TQmzU+2iFM/JMlmJg3UK/5vciHDeJ8pa1Y8puHjZd/EyJwEd/LVc+emqdV/JOPr7+SxGREzVz/kC/PvnrdCCtSrPkzPEZmT/BdTO4NZzXcm/8foW/Se5Av5+Ri5vg89Px4n+VaLsf9MVHuHg82E9BII9qG5hcemnXexKWaPpsynsCl098AdcqN9HGw8OkmmnnwGY6WTOhuxNoLdx2C/vZzrc5V7eOn5aAxE+3njN/MUMzoy9+561TIvPU+M98/B/PYufs3kvX7GxvTk5whzN/kDmcivIfcmRnOml5kUs2NspJBND2PxI9KyOCZnNHPJaOLcdBU6DGA2U9Kar066SAM7hTwZthfBpo83khD9d/uLmUoPYFQGZ8RO5qXII3XpDTM75FIro3FS/xkznxauMrtXDlLLtP/qUzv0hfRXQwZxRk0c+uQ2Mx3be8jPO/S/aZrYvUjLX+SXxSy6eJgva9KUQng18ntjaArU00+d+zw43o/8crfXODJl0BEM+SY99UPm8yoyJxefNF6GHO+FY6W/V1NewZzYNLDxorfgh+39X0ztiMxKfuF6k+/vrNR4jP39Hub0bN+wPJrZHx/BSx16I+9hx6Q7GSmPkmV2qj95ey/vHEGJ68xij5ehE63xUjZNLYeT8CVteGAv4If0JMudYSbwWHePlGIu0oUdwVX86E+Mv2neyM+OQ6nnjYxIT38k6sxm48QneKT6wvQRdHV2aq+xZjBkem8676YGGcdmbnWP0evkZr/9NxnUb4G5xxguZXNtZmMvHYsGdg2Yb5y8gtYhnWxynNZhe/MMecB0erLp685RF3MjdmbwmeMnITrvT+YKs5jRfh4OkYzEr6aHb2JUTmLp1tJDUORcd8h2nfwM7jZ/Y+6+1fB5fb4vfcSmeTzqjHbnB4nzSgrZfBNtjIjg5kXzTvUD51J+E7mk/+SPgeavgaEOmoxAqj75hxGpLyo0p2M+UCzjA04HsICjR/U8jJMr6QfQEf4KWpT6hRE6bd1Gaq2xvcqLzJosp6VDn8RS/I3UamEfrBUtqblUcpYW/7kq2QSNnmw7j55Fh8QvpkaIZVtswlI2wrZso638J/IPpdHSSUnWrD/JrHYu2rlBLNorP0l3853JV4Dr47m/TFJtxcrqZCazxHmEkzuqB+qghMgeYkfksz60qrWIYEvVeIvfug7VnclfgqGWZFuWZFuWZFuWZPs1KMiSbMtindTSi9Km24n+Ra86ZGZuF3EtFgdbh06+on0rpyzliP7F1F5DrA4Y3tMv7U4SH2JulEmiT5JUQ3rsP0hP9nRJ4RFRk3t8ZlmSbVmSbfW/k8szTCVM7UJq1VASZSE19EmZGgdY5+g5v936sdN9IZXqRfK8RZvsiPhXUsDMjk+ISK9Yd6aGrZN6X/e71TPbuR+9wrZiadFGS0iYfWp1LUm9ctFypR9oiUvW5z9SNtqUyGZbtIlTpam9haz2aCd59WJyQjRakvufWMlUZWVZtCT5QUvZq9GukP1CsahRFU06qCwEO9kZd625IR1kVvNXSkotg260MdlaESnWldbojXK6OJ+o5S/Swo7Al3JYAJNNwibJGxPWhYre4tAnc5+6JHtRkqU/Qyzb0weRsg18JZ5tYWZfKVZKQG+k5lUs0YqWOC1xvkbKqV8oxVJW/F+RxtQvjGHZZsInLKPFeae66nKwN236kcwy0BPx6m+0jeXcKJPZlnHAlfHO8NQ4Xc9kIha5nMzuKfvDdpkzHiSjzkmORcImF3HqCvxfpGZiuiyRmxiKNUp4nSuWCfZdK0ZqP0lD65AZvfNAe9VTI65KGu0ruWOxLsSpXiTPJTtasjdK6E+Itcr1JWv0Rkko4uConj68xUNfSK16MTmRgbbFJkwx2+RD+aBJjTAUa5GLRgn3yjjqouXG6dQq2Gj2aAOLYwtptFSKlTvgoyMIrnLe9mF+s05nkUHLmn0jtfonpdHSFzHSlsKHzKu/mHyFWG6unpauxGArs57pqdHAJo/+EdL0iMUFF5ahlm6ag6h/4TiWcSU79A9KFLMvlCVxN1AP6ZkU2S0ebGPEU4gVH6Tvnj7peASfI3GwP5RlW5JlW5JlW5JlW1mWA847a+PrjCTpOkLMaH6hsQkR8S/BrOpFSUhZ0islpS6WybwIqrxOhRlyoVh0GNSH5G1LSo6tavIvKiaNiy6NQdDs6EtQqt6ZfIXvXAazWgljQbaUY4VNYQsbLdFyp7pWWVPVjV76Ri7FsXtyaWgPc8kmd0oW6TWkm149+sHUHoJJuHNaWVbea+acetAUstP4RNXkvFMSd3BLZaH/kz8U8qdA/pIYJ38xDHH4w2Ky1sk/jKASo2mPGFwCt78wxlkFUno5v3XNOY6WUbQuI+/Fe2K8Ix57Yn5G5RPj5Ep4xLzE76DGE+ngUisnmZuBKR2kttIU+7utRU9GNycJ0xBm5snU1oD65GF7V21GjYtFR046ptA342TmlTRkp3CSOdUwk5Iv0nIZWp2B/xzHjcXO5nKJ98VVo9Qfooy3AuTTgmfmQqr5WYb8ACTRqX0iDgXGxEsXnB2BT/VJ46XYTycpOdi9sP/FP4Ouug63dib/DoZ9fgV5EyOzAP4Yo/lJ+vgief1wmvselxbnrYiZ8q1zLcHEgNg7k6/gjd6OPAci2Kef/C2YnGvBkEb2ebdmjLfIzdR2Ju+EdaBpYVdfyU8Yg5+DTT0aA9HfYa6SA359+CT/vWu87KkyApE8Qbp+AuYicsY/yazmMDeD0TRzs5qDTZnKXOZbqJOz8bt7fOs6mcSFtEQzB+dQYYt4qV70GLt1tC7SwO4HPZGZrZ3kWn+YjakhP49UvBx5JKXFbVadajKYn7KjycPLv2dbOBiVMpjPJLnqTombES9Mz0SamjE6vOvMpnR5q17N/Aa4Rc4ZwfX/CsK5AAAQAElEQVSKK6vit+vlm7DbF3ZUk7w1SU++gzlJV6G/o1jRJ0mq4dbL5SiGH/7I3+fq5dum76bzTmon00UPm4e6+y768630VEN2r57kd0QtF8dHU6s+mYb44bWSlnHjoxDs4xNq7jrflHdO8rN89LzRGn6GzN34mb2YlMhO/ScznIbMBIycG6OZ1/pOuuKlDQb5FNz+LI+syfHanMJLxM4DFx6zFlNLINN6iYjWONj9SL47PH7G5Al+ykzgRhs31kY/kFZ2rk+d2aPXtGiCXyybCnnePSITm5N82HH0L6ZGZDOh74SjJ1uvUYuOWuS9TMns4bqVcrpDYrX1TewPpz1nrlNKc+QwL7VA5ZmrN2hPk8/BmIpXUmD3g06S5IMTufzC+ZnTMMGtSdZ56CvnJ8rPUp/Zdb64OmjqOweZTet8Lh5ycpL44KIzO21X7mreSU+zJtQvpFL9RArZeTzMv8EXmVc/7Bfm6DBayefEIP9jn60rybu5sjP5GRSbL4L+gi6MINZIsm0f5jfHyTnRn470T9Kzfh39kfN5pyap/sXUVuRD896MTJaRd8ZbQSN7+xWs3nkUn2p29El6qmEf/IP0cJVz3kzy0Z+sfuYm4ecZpE7UD+PemBoWH5vi0yObTyO7TQdbrSAL98A6viVMaVlNe2BAdsemLTGa300SvpHdxg9b4LN3ZkT0E7nOTvUIZJ46g2GT80h7NrY3ekV7acr/e4LFg3xrm0h/kRrXONM32brJ29FRV6Yz0Xfoyv5oRqUd1E/+FmlI7ZEp3OMYujP5S+R6SidXwoc3g/m9JfJ7C4+o5u43Mdm5CvLlwQvzu0t5Z/KJvNWMYWGGhEhSMj6y+UFGHZqG7Iwoc3Aj/wykuZAUVr2Rga0vpo10obORX+RKbHw62SR5DA+RD0zDhSlRA+1d7P8CULL4Y6Ckg2RWV33yDyMoxWjaI4a4LuVI7aRY9HAqnrLuOt6Ko4Rs2lkRntsP2rZE2GHSjRIltLRRXWlPMlVp6EfGTchWaPfspWZO6pSJRS2a2lscPQ/EYvsMppDPaWW5WpxWlsVnJflBS9lpPGnZxvdJktFipQbieTGILn8evUHH4jZLwqveKSlerRzSXaeslAixqk9aozfKqXI+UctfpMVxvGvy6sXkZ1h5z15USLwyM1LfmF6J8xpiMXZ8I9j2JPZOy3aqQ3IbTbCFmT0UC5OqxMH+pj7Laap0T1UnX8GseifFosZWesN/jI447sCPngH2IrXMdjmZWB+NYJtIy29aM3Zn8okU7cltyEz7TsmSsFVKD/TybuRSHNsSHbZzyrYkK7CHEaSxkw7Fsr61WPHVg3NjFXqjyBNxQ3VZfS+5cxBfxGC38YnC7JBv2niMVHok2YdW16GutLyqJXe+iVN/kVyEHS1SE0Oxll0PWZpkfMvJOd/pVnty6UpNzTvJ0WLRriOEZ1tswlJ3D9KdXjoU6y+KfnVl9iQ9ZftIShvNpiCdJKkfSmoulWJFg4+OIGjnvO3DtNzKnEI1Y5bJdXJVvJGaok9Ko6UvYqQthZ3e/eRntBP1QscnXmnlHfuJeCJSgyozC0+spQ//ZEpEtnMQJ7mDpHUce6eXv5Pu9HiYlCZpaWUlf+VTMd5LxM5w6EUtntrSsoaHLq3jG0tFW3plK8oyPQdNkgB1kyciwsweOpbsjclfQ9PrRWm0tJFcrPQMREomOJnJxBrm9CjeFTX70GJZlVq0VP1EsfC1wkmMt+jSGMQxJN4ZlJo/EY9rnHpqaSkzk0A2fZbtD2XZlmTZVpZ9Y0xi2ZqqXuj6OS0Wl4xj95QW7dEAi9wpmTzcQhpPeiF3JOW0tOjyqizFDb5Ipf4TKWT3Q1OP2MgsUbMck3OIYBstlonsg8lf4mhhZjueGO81uNWaZK9hBx5pWVn+QdNg6paYaXkjafXGKYvWmGXyCS+9qCfi1Q8z4i+mZ4U/FMs2kyTbyrJh9oWeOh6ZEGwPxaq/U6Lao5RGS/Dq2FetaryTYkUDLaZGqpPUqmF2cpiyhGCHp1aWdWgyjJyGkvlPrNJC9dgoIbKHlCMCMZSN76Qn7WhLsmxCBBTLJt+ZWvRJkb3E/a4tS7JzDm2PLg9Pwsy+UixL7B7frEN9p5f+sJfjWiwOth40Vuz3SEPu8u1J2xgdEe+LYrWBylBkYvkkgm0i1pWOJTHbYoVE9RPb0k5aPkxm55RyNjjYHy2Rm7gz3gpmNDu5er0xtehbZDCWKCvM4Tk4nQHDnuhHimUqgDOzFGrWaOlOWV02CVsXYlRDEclPcq16OP8LQP5SyOYviPz9Mn8kJEbHivjB9ZdGbqYJlX6CLH9pTEaB17JHXfSXtQw+oBnMnET/EvygD3/I9PYs8mz9CxHstNGVL416IF9AU362zAj7HXR+NBPS01Y6HpmeI24926xj5hfTcwZzmi/mvWhYB7LzmfxMONu30YZPtd4/MlPS/4uprci3T8p8ktHkzOBr2OTzIamOTu2M2PRk1/vWsc8RJNUXcrl6kZyHONE08y+AzBlNSmX20ulp2oPfGT1JG9z7YrwVDMrPjOJezxszK/7G3MmPmcjsC2+9/TY8yGD25HkTwc6A8RDZeehDZkfQhd/dgxsf0lN9Mio3YN7lezMjF/ruRecSvez2lPHeggZ2ejv6MqsFnhkeb/EVHTaknDvLSZruD1cXw8dHJ4k+SVL9Yd5KzHflzoq8k94L8w1ErvMw6Fl+9TIn1frkT4x3Ruamb2fyfADsLEg/KZtXu3sszX2y/iwhEYdbWPRF537J3DtpWeXpR5PkOkCwSaqHGLmQYFa9B/b3m+dSgx+NYDOFmfOlmfGq8w7R+38yI5nJsPbnneSLVPMUX7R6mtUlO0gN1TPvJX8ld1LLGyfjHcGUS+2jGcuOJsjyYc0y59R8ODkjSFIFu55CrqYAx/j87OhsZlJkV3wRox+ctskZh6C7PmpjFTpsB8k36zCjjbBf/0WqePxIPMuN7C8942PTlJ1LQy7Oz8r0acAn3/3kR2R+8p/seLpCZqWX2eyZTZI3H4Nb9U+uGfkRcm8jw+iiHo/Izt1v5hv4CLpbzxyi97/IbTw2g3PvppGMyUk9m7nsZONH/IgZTPvqCXIR8ho+o9MTvZhyInK+eXo+us2UII39GV+ZJ9J3ZZwE17KZlfp6p+jX4UMezhv/Fsxp/+J9VjW1k8xPzlfke/pGcmak62+dy8yYy3xvNDerH8js7synh5tt+slcWJFrXOjuwYwP8zYGux9yY+/mWJGfLX0X8k71Saanv6MzEE2evWw6q4aY7bqQn66aSrjF8X7enGB+6zuTr+AVyjlzNfzmuM8nl/ka7vSEzE0nn9YM0lIfG9JXLwcdLd6ZntThXOJ809vvarpinJHfQUXeIblrPiiP/x/RIfSz10yexYwO+GY+FdXRZWyaapfJ6CNPU7J3MiHvcKXfXsab6L16THkib+QeVVp73sic9PCNrWZG9IX0VIfpujE1vpE9s0nyJoJN/66ZjcnupagMuxGL74nJ7WSk9JN17hfp4o3caj35ioDHUiKYwf7WGbiCl7Jpbls4yeeNejT1rZCIR0eA4pHuHt8aG3ON5Vb1EynwA+SdI/JAcwaEfDVzuEsSzY1UiHYuJl+ReXtvNfd3Jn8N5rT2TT5k3uMj2DRkZ/YwRVReJ00HillTvenDj53undTYXMv9jiMf5ndAO5oL3Tm2SHEuT8+XZk48wHR6SKIz4iRedUgX+fGzl5lPzLekTsOb7gjqN8bp/fhHYDItX0Ek4/MyN+oXUztj3cmsertOfovOxrswb3dA3DNWV782HdW0vZNK6kR/1lcyjW/df7fJE1T2IXxLnmcQSH3+F4D3PxJedIRkL+qJxnWaoFjknEJNNme07uteyjvp2Zn8NWhuTbLXsEX70Oq6SU3VP2iJS5Y3klZvpKfWSWpzRVnL1tAPxBNBA2eyLbTyFzo+AcViBP1SKJbt5ral7NKyjbbyn8g/lEZLJ9WqspyDuBOr275W7GjilVxLjRY9kbJSe2DatRWnLeeEW8tpidzEbEeSHpQQ2UPsiKBMQvQ9DrZsE2KFhAg8LaJk56wjS4SJ8Ed41U567hyzwhVatOkhRksXimWJ3eOREvVWXujlw7yD0mIhZ4AEq5GkkX9HGtN/YQzicZhY1HoOSburONj6jHNS9EZLYjZ7EQNhQ1m2JVm2lWXfKcVZ9uTSoq+kyZJsy5Jsq/+9cvV4Z/IVkrgqyiTZ1mhHyPwn1pVRXu6NkdzJDJ0kq79I3nqZQ1KMpIuHpsCmICI1se5MDVsn9b62u0yUnnQ8wqaDsMO0PlDaRygr7R9ajuDc6YselRObTWa9M7W3yK3UHojFtmxC5gHnJIYY5GLdtZYPrS5GLI5hbyS1e8i+MbfiLVIVTerCr67guAh092G+kBkStZNiRQt3qNSSnpRUra7YSYbWF2XK5vQDtfxFWhzHuyavDglJeQMLmojemXyF7ly9kmxqknJa2phcXeOLmrrsOJK900svUrOdJnwpR+QjxUor0MbI0ZiHOBnvJWLPRboRbBLFUlb0z6DIFh/M5gaiibFcbe+UzH9ifROTbSK75GArV4ZOit7IfBtNiLAnt6GEdSeehE9I35RkaYWv7Ew8mA6bnA7bUtlTlbJK4xEivrRY8UHrc3COaTIR7xTLRLbV+ZPmlKxZJ0nYSuMrKbQORSSHNnmmLdpLxyMO9UwzIU1PtMQsy0NyEXZ0rDvjTYi12nJFzn9WTo1vWSJMHEz+El49F+KhxepM8jADbYtNWOruIXtRoTlN3Rsl0WNlWQ44hyJT16ErOOzlLNpXrejH6GUOduqgvWUOYo0im13dA22ZU+sMD+16OR0b9Qcp06R+BvmFsqp1JUqnr6p15snoFzo+8UozJ/WNXvqkZTumOGVbFuuNKRHZ7SP5cDLPBNmmqhu9dCghCClsew5L0Sqlk2LFA/VyVHOwFf0zxGojXZAtstkItrIgW/WTEPkscbDxnfRGS7JsS7JsK8u+UUufVLNxP3m07aldiFe9mPwM7jdflGSnb1FCE2JZYouywhzmsLTOg14aprnKUhi8ko7UiXVNB4WX8BzS4mhL1YvJE70sVnwQL9j5Vykz0gMDwSNsHMLeyHwbfSGCvWxNVS90/ZwWi0vGsXtKi/ZogEXulEwe/ghpeqTFdUcbkxN0cOKvc7RY8UB8h1K+Q6xH0mPnEH03KtqynaLMf0ouLy2pWgpxta/5XwDi5A+IIH8U5C+GZPkjIXH85bEFdItfjEEcQ+bvjGsI+NLxXuKY8YupncGc5nxZiOy3wn47PJ4/y/EIvrjnT3Kpf0VlSEnzn0zPCh7o5yAXuY3g5IOzye76eKvsBLIXcreVV1LI5ueYvgiy6KY5iLyAl6wfSsvJ1KL/KTqBzkVmIvhBd01eP6SanLTv3Un5fD61Tecag+MQ/B45n/RUcs6AZGktsdi99soUiL7HweZTnFxgsgAAB81JREFUuY2Xi9V85PzfW3xi6bSMaiduODHfMHn6Dn1hhmPMbHovmsnRROtlm/m+RZBHO5+DzZCYBIJNsu/D2Zn8JWJ/PcC8+ovJ3+LrLo38HP3Ig+k5g5nN00Fv5IoqDnadkoOd5rnFzNH87tIVTeQX1t8hXVdyNXV665d4i4AbSyMy+xrzzpz0MSv5zCL70hkSHzKZMpfYa2iAnY3Z3ePjN6O+M/kEkxk8eS4mCzHZKDbJxfrS6TmDhJ3fH4/Sirh8dCw80J5wGsmWT/Yvu92dTTf8aLLqRfI80d9xrRz8SPHnKmd0cX7WKudqC9yCx29syC3qyScQ7OSrwqWomUVWTQ0yrG+lluAim0J3jxfNHCq5TBdjogHes05tou8kncaMiLp9ENbRGO5B6bwU/0nHS6w3kn7iMF/YmdRO5mY0n8jPl933Y6WnpOdgUnLQtt6q5nd0MEUGVZbJqJOnlOzOoyMtzTnYfeNKbmPk/9b6eRxs+mL2a5rThej5TR6hm09Y9WYc7PG5Qp59dJzMYxTyPuhb7a5PVwYkf2Mv5SDSA/icnB2zDvRjcfmpHYG1D4h9syL3lubpa3Cw+UGyaUWw8x3zM+ZninGwFfqeWLvjk+VWRIlR8rt5Yt46/fQckXvJL8zbMYaU80xFZhxBB35USjv5WajUzWXyvD963Wo7fSHRNkolmitpL+ZIMRZFdrLxK6ZYI3oPSvV3Jl+R1qSvpMDuP95JknxoIrMX52dkWDVfuIjTza1/IL+T1dV+ZtR55XqH5r5fxpvIKK7mK68/AoXxO506F+M1ixf9RJras5g20swCfeOL9LQecrc7xqlJxuQkT20fghvJTzT4dXK95ZMruczEq15MTvr88UxLDZyfkTxx+MmJkXPmWye7/Q4x42TWK+lp/Yl5Jz4N+ey+g86sU6d2RjtQv5gag9mZwbj3X8Vq+PzfGt14o/MVMwSXoS86LUR2+5KsWDdQR+VG3mIwOz7BRnT3iE7PhWtcPNL+Mk5iss+71yJdKe6BtXru31qd1tXSlIO9jacrBt/Ixr9pZvd3eTItubCR2jyxfESyBGmryRs8UtadGdX47YV8Af/edSFuvMpUnjRzsDMybVfWwbpy3Vh+ahM8xSRydnsunBJnSyfTcwQTs9sQL+LOeIl5jDFt+EFKx95amx4z4KmTRJ8kqYbMmX9PvhAPOb9jkiXzZSjqPe+cf4Oca1r7R+MwpPnJ3MdJiU7svhciz/zUebO9JGUPWje2hK57J8X6O/MN0TDtSRf77qbngzBSaA9H80Vmt+fk6gXjJ/nE/C8A0dsfCaX8mXCFTcLWG0UxtVeKRQ+n0qPPOtzDqe4sHHjoL1ITYVMh7I29Gi1aoATVlbYkV1rGNKehFr0omief075zbmCrFaN/RbpSh7Ot467MXQ6vEAUry3LA+cUxROt0fGmM7NVgR9C6aEd/gkw/hunv1Qm0LWY+6jqTGr5lZYtcSV8pTV1daUsytL6YovBPmsyPDiabmrWRvHox+RlW3rMXtVhNXr0zM6I3pkdZyyc1kf1F5tZ/pGVbHOyDEiJ7KBY9VBVzqFkI9uQ5K3qgdiZ/idjiYOuNqRF8RlvSlqhuIpZ1aNtLL2qnUNFPlChmK6tdHGzFHDqp7CEJmzz6KaSpS++UZOklvHwryzaagEoGUbItyRosatFUCKSmvmmxqLElDs/B6Y9GVUATRx5aWXMqtaYcbGU9Md4ZJGzlw06SoG0oYtEm78yhvRiPGKXcUNaj5k79C3GqF5OvyDDbYhPOWKhPSJNLL7QsESYOJl/B4JVRJ/Pqgc0gW7QpKzxCFOwckr2oJxrXaRr2PLRYxgGcDrbI2MpV+OjNSHoUwl+RYalfGEFkDjj2yDl1fpvJxFpkVrNXSrY52CclxSK+iDFtVpjGEFVdaj/bgfNCxydeaXU+B5v8o+Xcs+wJEpHF3CgpdbEOJiWynYP4cDLLuJL9RLz6pi71sPRIsVIDeiQmWykeVFYFSTjh9OBosdpicXT3mOqkilifqqGv1NKlpS/WwR2KZZQXAUqfoMDetCfncUuyLUuyLUuyfYvDW5SmLlZ6BzLMER4xVpQo7fTSkBmtnhQrPkiXITV2EpX1Kr+1KLL1yBTuIVY8kDvBzq3UtAdNkC3xQewbqWDaD5S4gi+9U7OmSwqPiJrc9cUbyeyeyDu5kZqfiCdxZwtptLTokzIeh1cc6kqx0gHS550Sn6KsC+mpLnOIvkWFxKIX6WBbXb1MdpD0da8rGdOe486FNFUvJifsaG4t2uglgZb8ZorE6tY34xjfEkMsbyRFY+eMUPNp+ZF7anoiXv3F5Gfkifg7k6urb5OFQN+0lJ3CScs2vr8pFjUDihrqSn2Wp4JhIvtGZik9r5SUWq6dlISOVBZ5UXKwRcPUrS/KEmHim+OI1brVrhykFVdamW8PI0jB0gqJV2Zk6juTvwTDLWWasmyTS7aVZVv9DyqZJZGznykWPWyJg31jHUpXtklafmoTfQc3O9VnSuNL5VxdOYKtDArFwW7xZBLLtmYNLVf6i7XHtW700hstidnsRQyEHcZyyoSVZVsmsb2oK6XRElw9ze6aWmfsXD3emB60FkHSNHxTNHb3QO306J6WSrFMBjgd7BxDWMrK2+GhFSM9F2JUQxHJT3K7+pn/AwAA//+VP6iaAAAABklEQVQDAGaxBigPXFjqAAAAAElFTkSuQmCC" class="kg-image" alt="" loading="lazy"/></figure><ul><li>検証項目：機能テストとパフォーマンステスト</li></ul><h2 id="%E6%A4%9C%E8%A8%BC%E6%96%B9%E6%B3%95%E3%81%A8%E9%81%B8%E5%AE%9A%E7%90%86%E7%94%B1"><strong>検証方法と選定理由</strong></h2><p>従来のテスト自動化では、テストコードの記述やCI/CDへの組み込みが必須でした。しかし、今回の試みではAIエージェントがMCP経由でブラウザを直接操作することで、より自然言語ベース・統合的なテストプロセスを目指しています。</p><p>この方式を選んだ主な理由は下記の通りです：</p><ol><li>自然言語でテスト指示が可能<br>　「ボタンを5回クリックして」など、直感的な指示で実行できる</br></li><li>複数ツールの統合が容易<br>　機能テスト・パフォーマンス測定のツール切り替え不要</br></li><li>柔軟な検証が可能<br>　テスト手順や基準の変更が容易</br></li></ol><h2 id="%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E6%9D%A1%E4%BB%B6"><strong>定義した受け入れ条件</strong></h2><p>検証に入る前に、今回のアプリとそのテスト全体に対し9つの要件と受け入れ条件を明確に定義しました。<br>この“要件を仕様としてAIに渡す”という考えこそ、仕様書駆動＋テスト自動化の根幹になっています。</br></p><h2 id="%E4%B8%BB%E8%A6%81%E3%81%AA%E8%A6%81%E4%BB%B6%E3%83%BB%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E5%9F%BA%E6%BA%96%EF%BC%88%E6%8A%9C%E7%B2%8B%EF%BC%89"><strong>主要な要件・受け入れ基準（抜粋）</strong></h2><ul><li>基本機能要件：「押してね」ボタンで連続する数字がインクリメントされること（1から開始。無制限クリックOK）</li><li>UI応答性／パフォーマンス要件：100ms以内でUI反映、50ms以内のJS実行、LCPは2.0秒以下、CLSは0.1以下</li><li>機能テスト自動化要件：Playwright MCPでクリックと数字検証を自動化（高速クリックも含む）</li><li>パフォーマンステスト自動化要件：Chrome DevTools MCPで各Core Web Vitals、UI応答、JS時間の自動計測</li><li>異常系テスト要件：数字が正しく増えない場合もAIが気付けること</li><li>テスト結果/履歴記録要件：Markdown形式で全履歴・実測値・合否・スクリーンショット等を時系列記録</li><li>自律的な問題分析・修正要件：AIが失敗理由を分析し、修正版を提案・再テストできるように設計（今後拡張予定）</li></ul><h2 id="%E3%83%86%E3%82%B9%E3%83%88%E6%9D%A1%E4%BB%B6%E3%81%AE%E6%95%B4%E7%90%86"><strong>テスト条件の整理</strong></h2><ul><li>機能側：クリック操作・数字シーケンス・UI識別・高速操作の検証</li><li>パフォーマンス側：LCP, CLS, UI応答, JS実行時間の閾値基準</li><li>結果記録側：Markdown/時系列/合否/スクショ/タイムスタンプ</li></ul><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A4%9C%E8%A8%BC%E6%89%8B%E9%A0%86"><strong>実際の検証手順</strong></h2><h2 id="1-%E6%A9%9F%E8%83%BD%E3%83%86%E3%82%B9%E3%83%88%EF%BC%88playwright-mcp%EF%BC%89"><strong>1. 機能テスト（Playwright MCP）</strong></h2><p>Playwright MCPを使い、UI操作および表示内容の自動検証を行いました。</p><p>検証フロー：</p><ol><li>ページロード（file://kiro-test/index.html）</li><li>ボタンを10回クリック</li><li>数値表示が1〜10まで正しくインクリメントされるか確認</li><li>スクリーンショット撮影</li><li>ブラウザをクローズ</li></ol><p>実行コマンド例（概念）：</p><pre><code class="language-javascript">await mcp_playwright_playwright_navigate({ url: fileUrl, headless: false, width: 1280, height: 720 });
await mcp_playwright_playwright_click({ selector: '#counter-button' });
const visibleText = await mcp_playwright_playwright_get_visible_text();</code></pre><p>結果：</p><ul><li>ボタンクリックテスト：合格</li><li>数字シーケンス検証：合格（1～10）</li><li>UI要素識別テスト：合格</li></ul><h2 id="2-%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%EF%BC%88chrome-devtools-mcp%EF%BC%89"><strong>2. パフォーマンステスト（Chrome DevTools MCP）</strong></h2><p>Performanceメトリクス取得にはChrome DevTools MCPを活用しました。</p><p>検証フロー：</p><ol><li>ページに移動</li><li>パフォーマンストレース開始</li><li>ページリロード</li><li>トレース停止・メトリクス取得</li><li>JavaScript実行時間測定（10回繰り返し）</li><li>スクリーンショット撮影</li></ol><p>実行コマンド例（概念）：</p><pre><code class="language-javascript">await mcp_chrome_devtools_performance_start_trace({ reload: true, autoStop: false });
await mcp_chrome_devtools_performance_stop_trace();
await mcp_chrome_devtools_evaluate_script({ function: '...カウンター処理...' });</code></pre><p>結果（抜粋）：</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: left">メトリクス</th>
<th style="text-align: left">実測値</th>
<th style="text-align: left">判定基準</th>
<th style="text-align: left">合否</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">LCP</td>
<td style="text-align: left">217ms</td>
<td style="text-align: left">≤2.0秒</td>
<td style="text-align: left">合格</td>
</tr>
<tr>
<td style="text-align: left">CLS</td>
<td style="text-align: left">0.00</td>
<td style="text-align: left">≤0.1</td>
<td style="text-align: left">合格</td>
</tr>
<tr>
<td style="text-align: left">JavaScript実行時間</td>
<td style="text-align: left">0.01ms（平均）</td>
<td style="text-align: left">≤50ms</td>
<td style="text-align: left">合格</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>LCP内訳：TTFB 0.7ms／レンダリング遅延 216ms<br>JS実行時間：最小0ms／最大0.1ms／平均0.01ms（10回測定）</br></p><h2 id="%E3%83%86%E3%82%B9%E3%83%88%E7%B5%90%E6%9E%9C%E3%81%AE%E8%A8%98%E9%8C%B2"><strong>テスト結果の記録</strong></h2><p>テスト結果は自動的に test-results.md に記録され、下記の情報が時系列で残ります：</p><ul><li>総合判定（合格／不合格）</li><li>各テスト詳細</li><li>パフォーマンスメトリクス（統計値）</li><li>スクリーンショットへのリンク</li><li>実行環境・条件</li></ul><hr><h2 id="%E6%B0%97%E4%BB%98%E3%81%8D%E3%81%A8%E5%AD%A6%E3%81%B3"><strong>気付きと学び</strong></h2><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E7%9F%A5%E8%A6%8B"><strong>実際に得られた知見</strong></h2><h2 id="1-ai%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E6%9F%94%E8%BB%9F%E3%81%AA%E3%83%86%E3%82%B9%E3%83%88%E5%AE%9F%E8%A1%8C"><strong>1. AIエージェントによる柔軟なテスト実行</strong></h2><p>従来の自動テストはスクリプト化が前提ですが、Kiro＋MCPでは自然言語での即応テストが可能です。<br>指示文を修正するだけでロジックや手順を即座に切替でき、探索的テストや要件変化への迅速対応に適しています。</br></p><h2 id="2-mcp%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%AE%E5%AE%B9%E6%98%93%E3%81%95"><strong>2. MCPツールの統合の容易さ</strong></h2><p>Playwright MCPとChrome DevTools MCPをひとつのAIワークフロー上で同時利用でき、機能・性能検証を一気通貫で回すことができました。従来必要だった手作業や別ツールでの結果統合は不要です。</p><h2 id="3-%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%81%AE%E8%A9%B3%E7%B4%B0%E5%8F%96%E5%BE%97"><strong>3. パフォーマンスメトリクスの詳細取得</strong></h2><p>Chrome DevTools MCPにより、Core Web Vitalsの細かい内訳（例：TTFB、レンダリング遅延）も取得できるため、ボトルネック分析が容易です。</p><h2 id="4-%E3%83%86%E3%82%B9%E3%83%88%E7%B5%90%E6%9E%9C%E3%81%AE%E8%87%AA%E5%8B%95%E5%B1%A5%E6%AD%B4%E7%AE%A1%E7%90%86"><strong>4. テスト結果の自動履歴管理</strong></h2><p>Markdownファイルへの自動記録によって、履歴比較・品質推移・視覚確認（スクリーンショット）の管理が一気に楽になりました。</p><h2 id="%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%BB%E6%96%B0%E3%81%97%E3%81%84%E7%99%BA%E8%A6%8B"><strong>メリット・新しい発見</strong></h2><p>メリット：</p><ul><li>テストコード量の削減（自然言語指示＋抽象化されたAPI）</li><li>多様なツールの統合が自動化可能</li><li>柔軟なシナリオ変更への即応性</li><li>パフォーマンス分析の精度向上</li></ul><p>新しい発見：</p><ul><li>AIエージェント環境がテスト実行基盤になる</li><li>MCPによる周辺ツール拡張性（APIテスト、DBテスト等）も期待大</li><li>Markdown記録で可読性・共有性が高い</li></ul><h2 id="%E8%AA%B2%E9%A1%8C%E3%83%BB%E6%B3%A8%E6%84%8F%E7%82%B9%E3%81%A8%E5%AF%BE%E5%BF%9C%E7%AD%96"><strong>課題・注意点と対応策</strong></h2><p>テストスクリプトの実行環境の制約：<br>Kiroエージェント環境限定のAPIのため、CI/CD本体に組み込むには別途工夫が必要。</br></p><p>対応策：</p><ul><li>KiroとCI/CDパイプラインの連携構築</li><li>エージェント用／CI用スクリプトの分割</li></ul><p>非決定的な動作の可能性：<br>AIエージェントの解釈や実行タイミングにより、出力が前後することがある。</br></p><p>対応策：</p><ul><li>重要シナリオは厳密なスクリプトで手厚く担保</li><li>判定ロジックを明示し、結果検証を厳密化</li></ul><p>パフォーマンス測定の環境依存性：<br>結果はローカル環境依存が大きい。本番想定なら条件を揃える必要あり。</br></p><p>対応策：</p><ul><li>本番近似環境での測定</li><li>複数回実施・統計値の採用</li><li>実行環境の記録</li></ul><p>スクリーンショット管理：<br>テスト実行ごとにファイルが増えるため、ライフサイクル管理・保存ルールが必要。</br></p><p>対応策：</p><ul><li>定期削除／重要ファイル選別</li><li>クラウドストレージ化</li></ul><h2 id="%E4%BB%8A%E5%BE%8C%E3%81%AE%E5%B1%95%E6%9C%9B"><strong>今後の展望</strong></h2><p>CI/CD統合：<br>GitHub Actions連携や自動テストコメントなど、パイプライン自動化との一体運用を進めたい。</br></p><p>テスト結果可視化：<br>データのグラフ表示やアラート機能、履歴比較なども今後取り入れていく予定です。</br></p><hr><h2 id="%E3%81%BE%E3%81%A8%E3%82%81"><strong>まとめ</strong></h2><p>今回の取り組みを通じて、定義した要件と受け入れ条件をAIエージェント（kiro）に明確に渡すことで、「実装＋テスト自動化」のサイクルを一気通貫でAIが担えることを検証できました。</p><p>従来はプログラミングとテストの自動化は分業的でしたが、「仕様＝テスト条件＝AIによる開発・検証基準」とする新しい“仕様書駆動開発”の形が具体的に実現できたと感じています。<br>これにより、従来は「8割AIに書かせて残りの2割を開発者が担当する...」といったところを「9割AIに書かせて残りの1割を開発者が担当する...」といった温度感にできるのではないかと思っています。</br></p><p>また、今後は複雑な要件や大規模プロジェクトにも幅を広げ、「要件定義→実装→自動テスト→履歴記録→自律的な修正提案」まで含めてAIが開発を担う。そんな実践フェーズがやってくると思っています。</p></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[世界一詳しいAWSのAI IDE KIROの使い方徹底解説]]></title><description><![CDATA[

こんにちは。この記事ではKiroで1500クレジットを消費して得た知見を全て記載します。誇大なタイトルにしてしまいましたが、この記事は1700
wordsを超える内容となっていますので少しでも参考になれば幸いです。これを機に、AI IDE
KIROの素晴らしさを感じていただけると嬉しいです！10月30日現在KiroはGAされ、claude-sonnet-4.5を無料で使えるタイミングなので、ぜひ使ってみてください。

Kiroとは
Kiroのトップページ [https://kiro.dev/]に記載されているこの説明が、すべてを物語っています。

要するにKiroとはプロトタイプを一気に仕上げることにも向いていますし、既に本番利用されているプロダクトの開発にも対応ができるAI IDEとなっています。

どういうことか？

既存のAI駆動開発
既存のAI駆動開発ではプロンプトを元に機能を開発し、人がテストをしてダメだったらプロンプトを書き修正を行っていました。その後、プロンプトから生成AIが作業をする前に必ず確認するドキュメントが設定できるようになったり、テストが成功するまで修正を続]]></description><link>https://tech.anti-pattern.co.jp/kiro/</link><guid isPermaLink="false">Ghost__Post__68e8b35f71fa390001b340f9</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Fri, 31 Oct 2025 05:53:34 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-10-16.20.22.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-10-16.20.22.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/><p/><p>こんにちは。この記事ではKiroで1500クレジットを消費して得た知見を全て記載します。誇大なタイトルにしてしまいましたが、この記事は1700 wordsを超える内容となっていますので少しでも参考になれば幸いです。これを機に、AI IDE KIROの素晴らしさを感じていただけると嬉しいです！10月30日現在KiroはGAされ、claude-sonnet-4.5を無料で使えるタイミングなので、ぜひ使ってみてください。</p><h2 id="kiro%E3%81%A8%E3%81%AF">Kiroとは</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-6.09.41.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1476" height="464" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-6.09.41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-6.09.41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-6.09.41.png 1476w" sizes="(min-width: 720px) 720px"/></figure><p>Kiroの<a href="https://kiro.dev/">トップページ</a>に記載されているこの説明が、すべてを物語っています。</p><p>要するにKiroとはプロトタイプを一気に仕上げることにも向いていますし、既に本番利用されているプロダクトの開発にも対応ができるAI IDEとなっています。</p><p>どういうことか？</p><h2 id="%E6%97%A2%E5%AD%98%E3%81%AEai%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA">既存のAI駆動開発</h2><p>既存のAI駆動開発ではプロンプトを元に機能を開発し、人がテストをしてダメだったらプロンプトを書き修正を行っていました。その後、プロンプトから生成AIが作業をする前に必ず確認するドキュメントが設定できるようになったり、テストが成功するまで修正を続けるなどのinstructionができるようになりました。また、MCPのcontext7で最新のパッケージの情報を取得したり、playwright MCPでフロントの画面テストをしながら生成AIで開発など様々なMCPを使って開発ができるようになりました。</p><p>しかし、課題もありました。プロトタイプを一気に作るには事前に精密なドキュメントを用意する必要があり難しい。既存のリポジトリの状態を把握させたり、ドキュメントのアップデートが大変。テストを良い感じに作ってくれない。プロンプトのタスクを実行した後にやってほしいことが複数あっても、対応してくれない。といった難しさや面倒くささもあったかと思います。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-6.03.47.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1908" height="846" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-31-6.03.47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-31-6.03.47.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-31-6.03.47.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-6.03.47.png 1908w" sizes="(min-width: 720px) 720px"><figcaption>既存のAI駆動開発</figcaption></img></figure><h2 id="kiro%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA">Kiroのスペック駆動開発</h2><p>Kiroでは、スペック駆動開発という開発方法を用いることでこれらの課題に対応しています。スペック駆動開発とは仕様を明確に定義した後に、設計、実装、テスト、ドキュメント化までを一貫して行う開発手法です。</p><p>具体的には、プロンプトを元に要件を確定させ、その後設計、タスクへと落としていきます。プロトタイプ開発であれば、「〇〇といったウェブアプリを作りたい。」くらいのプロンプトから要件を洗い出してくれます。そのまま、設計、タスクを言われたまま進めればそこそこ良い感じものを作ってくれます。これにはテストもドキュメントもタスクの中に含まれています。</p><p>次に、本番稼働しているようなプロダクトであれば、まずは既存のリポジトリの状況を把握する必要があります。AGENT STEERINGで既存のコードの状態を分析しドキュメント化してくれます。その後、生成AIとやりとりをしながら要件、設計、タスクまでを確定、タスクが完了したらAGENT HOOKでコードの品質確認やテスト、ドキュメントの更新などを行うことが可能です。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-6.04.06.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1992" height="882" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-31-6.04.06.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-31-6.04.06.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-31-6.04.06.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-6.04.06.png 1992w" sizes="(min-width: 720px) 720px"><figcaption>KIROのスペック駆動開発</figcaption></img></figure><h2 id="%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9">具体的な使い方</h2><p>さて、冒頭が長くなりましたが、ここから具体的な使い方をご紹介したいと思います。</p><h3 id="kiro%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">Kiroのセットアップ</h3><p>以下よりダウンロードしてセットアップを行ってください。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://kiro.dev/downloads/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Downloads</div><div class="kg-bookmark-description">Kiro - the AI IDE for prototype to production</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://kiro.dev/apple-icon.png?4cefa8c54a20b098" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"><span class="kg-bookmark-author">Kiro</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://kiro.dev/images/pages/downloads.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></a></figure><h3 id="kiro%E3%81%AE%E7%94%BB%E9%9D%A2">Kiroの画面</h3><p>Kiroを開くと左側にKiroのお化けマークのアイコンがセットされています。これにはSPECS, AGENT HOOKS, AGENT STEERING, MCP SERVERSが設定できます。右側には一般的なVibeコーディングモードとSpec駆動開発モードが使えるようになっています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-6.50.12-1.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1192" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-6.50.12-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-6.50.12-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-6.50.12-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-6.50.12-1.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h3 id="kiro%E3%81%AE%E8%A8%AD%E5%AE%9A">Kiroの設定</h3><p>まずは、Kiroの設定を行なってください。左下の歯車マークから設定を開きます。ここでやって欲しいのが、<strong>Trusted Commandsの設定でこれを全許可</strong>することで、コマンド実行を逐次承認する必要がなくなります。※ただし、各自の判断で行なってください。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-7.09.00.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1952" height="442" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-7.09.00.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-7.09.00.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-7.09.00.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-7.09.00.png 1952w" sizes="(min-width: 720px) 720px"><figcaption>Trusted Commands</figcaption></img></figure><p>また、通知の設定も便利なので、入れても良いと思います。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-7.29.11.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1196" height="568" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-7.29.11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-7.29.11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-7.29.11.png 1196w" sizes="(min-width: 720px) 720px"/></figure><h3 id="agent-steering">AGENT STEERING</h3><p>AGENT STEERINGとはKiroがプロンプトを元にタスクを実行する際に必ず読み込まれるドキュメントです。最初にAGENT STEERINGを作るとproduct, structure, techという3つのドキュメントが作成されます。※空のリポジトリでは作れません。</p><p>product：プロダクトの概要、目的、主要な機能</p><p>structure：フォルダ構成、命名規則、インポートパターン、アーキテクチャ</p><p>tech：使用するフレームワーク、ライブラリ、言語、開発ツール</p><p>最低限これらファイルを管理することで生成AIが今までと全く異なるコードを書くということを防げます。</p><p>他にもKiroは標準が英語となっているのですが、<strong>STEERINGファイルを用意することで日本語対応</strong>ができます。</p><pre><code>---
inclusion: always
---

# 日本語コミュニケーションガイドライン

## 言語使用ルール

### ドキュメント・コミュニケーション
- **ユーザー対話**: 日本語で質問された場合は日本語で回答
- **仕様書・設計書**: `.kiro/specs/` 配下のファイルは日本語で記述
- **README・ドキュメント**: プロジェクト説明は日本語優先
- **エラーメッセージ**: ユーザー向けメッセージは日本語で表示
- **コミュニケーション**: 回答は常に日本語で行う
- spceモードの出力は常に日本語で行う
- .kiro/ のドキュメントは常に日本語で行う
- taskで作成するドキュメントは常に日本語で行う

### コード規約
- **命名**: 変数・関数・クラス名は英語（PEP 8 準拠）
- **コメント**: Python コード内は日本語コメント
- **外部API**: ライブラリ名・API名は英語のまま使用
- **技術用語**: 不自然な日本語訳は英語併記

### ログ出力
- デバッグ情報: 英語可
- ユーザー向けメッセージ: 日本語必須</code></pre><p>STEERINGファイルを更新する際はファイルを選択し、Refineを行うか、セッションからSteeringを選択しプロンプトで指示を行うことができます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-8.06.39.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1180" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-8.06.39.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-8.06.39.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-8.06.39.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-8.06.39.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>AGENT STEERINGの更新</figcaption></img></figure><h3 id="mcp-servers">MCP SERVERS</h3><p>MCP（Model Context Protocol）とはAIと外部のツールやデータソースを接続するためのプロトコルです。これを使うことで専門的な情報を確認したり、公開されているAPIやツールに自然言語でアクセスできるようになります。</p><p>MCP.jsonはRoo CodeなどのMCP設定と同じく、MCP.jsonで管理されているので、左下のペンアイコンでMCP.jsonを開き、Roo CodeなどのMCP設定をそのまま使うことが可能です。加えて、MCPのツール単位でdisableすることも可能です。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-13.40.56-1.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1180" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-13.40.56-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-13.40.56-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-13.40.56-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-13.40.56-1.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>MCP SERVERSの設定</figcaption></img></figure><h3 id="agent-hook">AGENT HOOK</h3><p>AGENT HOOKSとはIDEで特定のイベントが発生したときに定義済みのエージェントアクションを実行する自動トリガーです。<strong>トリガーは4種類（ファイル作成、ファイル保存、ファイル削除、手動）</strong>となっています。トリガーが起動は<strong>特定のファイルや特定のディレクトリ</strong>を指定することも可能です。</p><p>AGENT HOOKSをはじめに使う際に3つアクションが簡単に作成できるようになっています。（Update my documentation, Optimize my code, Language localization）<a href="https://kiro.dev/docs/hooks/examples/">他にもテストカバレッジを確認したり、MCPも使いつつ外部データ整合性を保つことも可能</a>です。</p><p><strong>hookを設定するとKiroのアクションだけでなく、他の生成AIや人が修正した際にもトリガーが起動</strong>します。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.12.25-2.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-14.12.25-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-14.12.25-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-14.12.25-2.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-14.12.25-2.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>AGENT HOOKSの作成方法</figcaption></img></figure><p>AGENT HOOKSで作成を実行すると、“Creating hook:~”というプロンプトが入力され、真ん中のファイルが作成されます。作成された画像は以下です。</p><p><strong>hookは左側のvisibleマーク、または中央上部のHook enabled設定でで有効・無効の設定</strong>ができます。作成後にも追記やトリガー設定の変更が可能です。また、AGENT HOOKSの作成は英語になってしまうようなのですが、プロンプトで日本語にしてほしい旨を伝えると日本語にしてくれます。AGENT STEERINGは右クリックで削除できますが、AGENT HOOKSはファイルを開かないとできません。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.58.35.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-14.58.35.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-14.58.35.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-14.58.35.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-14.58.35.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>作成されたAGENT HOOKS</figcaption></img></figure><h3 id="spec-%E3%83%A2%E3%83%BC%E3%83%89">SPEC モード</h3><blockquote>製品の概念的な要件と技術的な実装の詳細との間のギャップを埋め、整合性を確保し、開発の反復を削減します。Kiroは、各仕様の基盤となる3つの主要ファイルを生成します。<br><br><strong>requirements.md</strong> - 構造化されたEARS表記法でユーザーストーリーと受け入れ基準を記述します。<br><br><strong>design.md</strong> - 技術アーキテクチャ、シーケンス図、実装上の考慮事項を文書化します。<br><br><strong>tasks.md</strong> - 個別の追跡可能なタスクを含む詳細な実装計画を提供します。</br></br></br></br></br></br></blockquote><p>SPEC モードとはSPEC駆動開発を行う機能です。説明にもあるとおり、従来のAI開発で辛い整合性の確保と反復性の削減を実現します。まさにウォーターフォールが想起される開発方法です。ただし、SPEC駆動開発はウォーターフォールよりも要件は小さく、はるかに短いですし、Spec（仕様）を追加・修正することで反復的に開発が可能です。</p><p><strong>Spec（仕様）→ 開発→ ドキュメント更新→ Specに要件追加・修正→ AIが再設計・再実装（＝反復可能）</strong></p><p>始め方ですが、左側かもしくは右のチャット側で初期プロンプトを入力することで始めることができます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-21.38.57-1.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-21.38.57-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-21.38.57-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-21.38.57-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-21.38.57-1.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>SPEC駆動開発の始め方</figcaption></img></figure><p>実際のRequirements（要件）はWorkshopのサンプルを用いて説明します。内容は以下のようになっています。</p><p>はじめに：Specの概要</p><p>要件：ユーザーストーリーが要件として記載</p><p>受け入れ条件：<strong>WHEN(WHILE) どういった時に THEN  誰が SHALL どういうアクションをするか </strong>構文で全て記載。日本語も同様</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-1.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1286" height="915" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/image-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/image-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-1.png 1286w" sizes="(min-width: 720px) 720px"><figcaption><a href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP/spec">引用</a>1</figcaption></img></figure><p>次にdesign（設計）です。ユーザーベースの要件から開発の設計に則したものに変換されました。mermaidでアーキテクチャを記載されていたりと、わかりやすいものになっています。ここで実装のためのコードイメージが作成されます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-2.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="1288" height="926" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/image-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/image-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image-2.png 1288w" sizes="(min-width: 720px) 720px"><figcaption><a href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP/spec">引用2</a></figcaption></img></figure><p>最後にtask（実行計画）です。ここではRequirementsで記載された要件が具体的にどのタスクになっているのか確認することができます。実行されたTaskは<strong>Task competed</strong>となり、実行することができるtaskには<strong>Start task</strong>と表示され、その中でも実装が必須ではないタスクは<strong>Make task required</strong>となっています。以下のようにドキュメントを直接編集することも可能です。</p><pre><code>- [x] Task completed
- [ ] Start task
- [ ]* Make task required</code></pre><p><a href="https://kiro.dev/docs/specs/best-practices/#how-many-specs-can-i-have-in-a-single-repo">ベストプラクティス</a>としては以下のようになっています</p><blockquote>1つのリポジトリには、必要な数の仕様を含めることができます。<strong>コードベース全体に1つの仕様を持つのではなく、プロジェクトのさまざまな機能ごとに複数の仕様</strong>を作成することをお勧めします。<br><br>たとえば、eコマースアプリケーションでは、次のように仕様を整理できます。<br><br>.kiro/specs/<br>├── user-authentication/       # Login, signup, password reset<br>├── product-catalog/           # Product listing, search, filtering<br>├── shopping-cart/             # Add to cart, quantity updates, checkout<br>├── payment-processing/        # Payment gateway integration, order confirmation<br>└── admin-dashboard/           # Product management, user analytics<br/></br></br></br></br></br></br></br></br></br></blockquote><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-4.55.04.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-31-4.55.04.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-31-4.55.04.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-31-4.55.04.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-31-4.55.04.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>taskが多く必要な場合、taskが作られた後に右のチャットに以下の質問がされます。タスク次第ですし、どちらでも問題ないですが、Specモードは大量のコードを生成するため、多くの場合はMVPから始めるのがおすすめです。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-3.54.43.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="710" height="206" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-3.54.43.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-3.54.43.png 710w"/></figure><p>taskが完成したら、Spec（仕様）作成が完了したので、出来上がったtaskを実行していくことで開発を行います。ファイルを開いて<strong>Start task</strong>ボタンをクリックしても良いですし、チャットで全てを実行してもらうことができます。この時に、様々なコマンドを実行するため、途中で止まらないようにするには大きな権限をKIROに与える必要があります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-4.14.24-1.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="854" height="982" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-4.14.24-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-4.14.24-1.png 854w" sizes="(min-width: 720px) 720px"/></figure><h3 id="vibe-%E3%83%A2%E3%83%BC%E3%83%89">Vibe モード</h3><p>Vibeモードはインタラクティブな開発をしたい場合に使用することが可能です。ただし、KIROは逐次的にプロンプトを処理するため、現在対応中のタスクを<strong>CURRENT TASKS</strong>に待機中のタスクはキューに入ります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-5.28.30.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-31-5.28.30.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-31-5.28.30.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-31-5.28.30.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-31-5.28.30.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>そのため、SpecモードとVibeモードを同時に使用することはできません。SpecモードをKIROが実行しているときにVibeコーディングをしたい方はデフォルトで使えるようになっているAmazon Qを使用してください。今ならclaude-sonnet-4.5を無料で使えます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-31-5.35.30.png" class="kg-image" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説" loading="lazy" width="2000" height="1204" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-31-5.35.30.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-31-5.35.30.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-31-5.35.30.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-31-5.35.30.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h3 id="%E3%81%AA%E3%81%9Ckiro%E3%81%AF%E4%B8%80%E3%81%A4%E3%81%9A%E3%81%A4%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">なぜKiroは一つずつタスクを実行するのか</h3><p>KiroのSpecモードはRequirementsからtaskの実行まで2時間程度かかります。これは一つずつタスクを実行していくためです。では、並列でできないのか？</p><p>おそらく今後も難しいと思います。理由としては個人のワークスペースは並列でコーディングするように出来ていません。gitで管理する以上難しいと思います。もちろんワークスペースを複数立ち上げてRequirements単位で並列で行うことは可能だと思います。</p><p>ただ、Kiroを使っていて感じることはボトルネックになるのはレビューなので、並列で実行したいという要望が出るのはまだ先かなという所感です。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>いかがでしたでしょうか？<br>少しでも知らない使い方を知って頂けたなら嬉しいです。<br>また、まだ使ったことがない方は騙されたと思って、一度使ってみてください。<br><a href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP">Kiro<a href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP">のワークショップ</a></a>もあるのでぜひ触ってみてください。</br></br></br></p><h2 id="%E5%8F%82%E8%80%83">参考</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/blogs/news/introducing-kiro/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Kiro のご紹介 – プロトタイプからプロダクションまで、あなたと共に働く新しい Agentic IDE | Amazon Web Services</div><div class="kg-bookmark-description">コンセプトからプロダクションまで、AI エージェントとの作業を簡素化した開発者体験を通じて開発を支援する AI IDE（統合開発環境）、Kiro の発表を嬉しく思います。Kiro は Vibe Coding ”も” 得意ですが、それをはるかに超えています。Kiro の強みは、スペック (spec) やフック (hook) などの機能を使って、これらのプロトタイプをプロダクションシステムに移行することです。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/main/images/site/touch-icon-ipad-144-smile.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"><span class="kg-bookmark-author">Amazon Web Services</span><span class="kg-bookmark-publisher">稲田大陸</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://d2908q01vomqb2.cloudfront.net/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f/2025/07/14/emlUxRBb.jpeg" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://catalog.workshops.aws/vibe-coding-agents-with-kiro/ja-JP"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Workshop Studio</div><div class="kg-bookmark-description">Discover and participate in AWS workshops and GameDays</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://catalog.workshops.aws/logo192.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://kiro.dev/docs/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Get started - Docs - Kiro</div><div class="kg-bookmark-description">An agentic IDE that helps you do your best work</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://kiro.dev/apple-icon.png?4cefa8c54a20b098" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"><span class="kg-bookmark-author">Kiro</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://kiro.dev/images/docs/getting-started.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/Earthfreedom/items/72eba6528f2d6d7f21fc"><div class="kg-bookmark-content"><div class="kg-bookmark-title">【決定版】AWS発 Agentic AI IDE Kiro 徹底解説 &amp; 導入完全ガイド - Qiita</div><div class="kg-bookmark-description">【決定版】AWS発 Agentic AI IDE Kiro 徹底解説 &amp;amp; 導入完全ガイド（2025-07-17） 「Vibe Coding」から「Viable Code」へ。気分で書いたプロトタイプを、仕様付きでちゃんと“製品”に持っていく。その道筋をゴーストが引いてく...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">Earthfreedom</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnMzLWFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20lMkZxaWl0YS1pbWFnZS1zdG9yZSUyRjAlMkYzMzY2ODQlMkY2NDczMTVmODUyNjJjZGQzODViMjA0NzFjY2FmMTVmNmI1OWZhZDJiJTJGeF9sYXJnZS5wbmclM0YxNjM5MjYwOTU2P2l4bGliPXJiLTQuMC4wJmFyPTElM0ExJmZpdD1jcm9wJm1hc2s9ZWxsaXBzZSZiZz1GRkZGRkYmZm09cG5nMzImcz1lYzVmZDI3NjIxMWFjZTJlY2Y3OTkyOTNiMGMyZDU2Zg%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3D9436efcab559a428e769b4e183013cf6?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;fm&#x3D;jpg&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk2MCZoPTMyNCZ0eHQ9JUUzJTgwJTkwJUU2JUIxJUJBJUU1JUFFJTlBJUU3JTg5JTg4JUUzJTgwJTkxQVdTJUU3JTk5JUJBJTIwQWdlbnRpYyUyMEFJJTIwSURFJTIwS2lybyUyMCVFNSVCRSVCOSVFNSVCQSU5NSVFOCVBNyVBMyVFOCVBQSVBQyUyMCUyNiUyMCVFNSVCMCU4RSVFNSU4NSVBNSVFNSVBRSU4QyVFNSU4NSVBOCVFMyU4MiVBQyVFMyU4MiVBNCVFMyU4MyU4OSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1wYWQ9MCZzPTgwYmNhOTliNzljMzJjMjgwYjA5YTY1NTkyZjNlN2Qz&amp;mark-x&#x3D;120&amp;mark-y&#x3D;112&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTgzOCZoPTU4JnR4dD0lNDBFYXJ0aGZyZWVkb20mdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtcGFkPTAmcz02NWMwMDY3NjBmYzE0MWU2ZDIwZjY5NmE5MTI5ZGEyOQ&amp;blend-x&#x3D;242&amp;blend-y&#x3D;480&amp;blend-w&#x3D;838&amp;blend-h&#x3D;46&amp;blend-fit&#x3D;crop&amp;blend-crop&#x3D;left%2Cbottom&amp;blend-mode&#x3D;normal&amp;s&#x3D;b08980477b660885b8f215b677cdd728" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://zenn.dev/galirage/articles/aws-ai-native-kiro"><div class="kg-bookmark-content"><div class="kg-bookmark-title">最新のAI駆動開発ツール「Kiro」を徹底解説!!</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.zenn.studio/images/icon.png" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"><span class="kg-bookmark-author">Zenn</span><span class="kg-bookmark-publisher">ますみ / 生成AIエンジニア</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/zenn/image/upload/s--qWoThvfk--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%E6%9C%80%E6%96%B0%E3%81%AEAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB%E3%80%8CKiro%E3%80%8D%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC%21%21%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:%E3%81%BE%E3%81%99%E3%81%BF%20%2F%20%E7%94%9F%E6%88%90AI%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2ExNzA3YjIxM2QuanBlZw&#x3D;&#x3D;%2Cr_20%2Cw_90%2Cx_92%2Cy_102/g_south_west%2Ch_34%2Cl_default:og-publication-pro-mark-xcosax%2Cw_34%2Cx_217%2Cy_158/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:Galirage%20Inc.%2Cx_255%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2M5ZDA3ZmI1ZGEuanBlZw&#x3D;&#x3D;%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png?_a&#x3D;BACAGSGT" alt="世界一詳しいAWSのAI IDE KIROの使い方徹底解説"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Claude Code Spec WorkflowとKiro、実際に試して比較してみた]]></title><description><![CDATA[はじめに
POSSEでエンジニアインターンをしている井上岳です。

最近、AIを使った開発ワークフローのツールがいくつか登場しています。今回取り上げたいのは、Claude Code Spec WorkflowとKiroです。

 * Claude Code Spec Workflow
   [https://github.com/Pimzino/claude-code-spec-workflow]
 * Kiro [https://kiro.dev/]



どちらもrequirements → design → tasks
という流れで仕様を決めて実装するというアプローチを取っていますが、実際に使ってみるとかなり違いがあります。今回は同じお題で両方試してみたので、その違いを紹介したいと思います。

試したお題
今回は「ECサイトの注文から配送までのドメインモデリング」という課題に挑戦しました。関数型プログラミングのアプローチで、型安全な状態遷移を実現するという、そこそこ複雑な内容です。

投げたプロンプト：

ECサイトでの「注文から配送までの流れ」をドメインモデリングしてください。]]></description><link>https://tech.anti-pattern.co.jp/claude-code-spec-workflow-vs-kiro-shi-ji-nishi-sitebi-jiao-sitemita/</link><guid isPermaLink="false">Ghost__Post__690373bd71fa390001b348b0</guid><dc:creator><![CDATA[Gaku Inoue]]></dc:creator><pubDate>Thu, 30 Oct 2025 14:33:04 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>POSSEでエンジニアインターンをしている井上岳です。</p><p>最近、AIを使った開発ワークフローのツールがいくつか登場しています。今回取り上げたいのは、Claude Code Spec WorkflowとKiroです。</p><ul><li><strong><strong><a href="https://github.com/Pimzino/claude-code-spec-workflow"><strong>Claude Code Spec Workflow</strong></a></strong></strong></li><li><strong><strong><a href="https://kiro.dev/"><strong>Kiro</strong></a></strong></strong></li></ul><p/><p>どちらも<code>requirements → design → tasks</code>という流れで仕様を決めて実装するというアプローチを取っていますが、実際に使ってみるとかなり違いがあります。今回は同じお題で両方試してみたので、その違いを紹介したいと思います。</p><h2 id="%E8%A9%A6%E3%81%97%E3%81%9F%E3%81%8A%E9%A1%8C">試したお題</h2><p>今回は「ECサイトの注文から配送までのドメインモデリング」という課題に挑戦しました。関数型プログラミングのアプローチで、型安全な状態遷移を実現するという、そこそこ複雑な内容です。</p><p>投げたプロンプト：</p><pre><code>ECサイトでの「注文から配送までの流れ」をドメインモデリングしてください。
顧客が商品を注文してから、在庫を確保し、出荷・配送を経て完了に至るまでの一連のプロセスを想定しています。
・不正な状態遷移が起きないようにしたい
・副作用（例：在庫確認や通知送信）はできるだけ分離したい
・将来的にキャンセル処理や再配送なども追加できるようにしたい
このドメインを、関数型的な考え方で安全に設計してください。
型、関数、状態遷移など、あなたが重要だと思う単位で自由に表現して構いません。</code></pre><p>要点：</p><ul><li>注文確定 → 在庫引当 → 出荷 → 配送完了という状態遷移</li><li>不正な状態遷移を型レベルで防ぐ</li><li>副作用（通知送信、在庫更新）をドメインロジックから分離</li><li>将来的なキャンセル・再配送機能への拡張性<br/></li></ul><h2 id="kiro%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F">Kiroで試してみました</h2><p>Kiroは要件定義を書くところから始まります。プロンプトを投げると、まず <code>requirements.md</code> を作成してくれます。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><p>要件定義では、User Storyの形式で各要件が整理されます。Acceptance Criteriaも明確に定義されていて、「何を満たせば完成なのか」がわかりやすいです。</p><pre><code class="language-markdown"># Requirements Document

## Introduction

ECサイトにおける注文から配送完了までの一連のプロセスを、関数型プログラミングの原則に基づいて安全にモデリングする機能です。この機能は、不正な状態遷移を防ぎ、副作用を適切に分離し、将来的な拡張（キャンセル処理、再配送など）に対応できる設計を提供します。

## Requirements

### Requirement 1

**User Story:** システム開発者として、注文の状態遷移を型安全に管理したいので、不正な状態変更を防ぐドメインモデルが必要です。

#### Acceptance Criteria

1. WHEN 注文が作成される THEN システム SHALL 初期状態（OrderPlaced）に設定する
2. WHEN 在庫確認が完了する THEN システム SHALL InventoryReserved状態に遷移する
3. WHEN 無効な状態遷移が試行される THEN システム SHALL エラーを返し状態変更を拒否する
4. WHEN 各状態遷移が実行される THEN システム SHALL 遷移の妥当性を事前に検証する

..... 続く
</code></pre><p>次に <code>design.md</code> が作られます。ここでは型定義、状態遷移関数、副作用システムなどの設計が詳細に記述されます。Mermaidによるアーキテクチャ図やTypeScriptのコード例も含まれていて、実装イメージがかなり具体的です。</p><pre><code class="language-markdown"># Design Document

## Overview

ECサイトの注文から配送までの流れを、関数型プログラミングの原則に基づいて安全にモデリングするドメイン設計です。この設計では、型安全な状態遷移、副作用の分離、イミュータブルなデータ構造を中心とした堅牢なシステムを構築します。

## Architecture

### Core Principles

1. **Type Safety**: 型システムを活用して不正な状態遷移をコンパイル時に防ぐ
2. **Immutability**: すべてのデータ構造をイミュータブルにし、状態変更は新しいインスタンス作成で行う
3. **Pure Functions**: 状態遷移ロジックを純粋関数として実装し、副作用を分離
4. **Effect Separation**: 副作用（IO、外部API呼び出し）を明示的に管理
5. **Composability**: 小さな関数を組み合わせて複雑な処理を構築

### Architecture Diagram

```mermaid
graph TB
    subgraph "Domain Layer"
        Order[Order Aggregate]
        States[Order States]
        Transitions[State Transitions]
        Events[Domain Events]
    end
    
    subgraph "Effect Layer"
        Effects[Side Effects]
        Inventory[Inventory Service]
        Notification[Notification Service]
        Shipping[Shipping Service]
    end
    
    subgraph "Application Layer"
        Commands[Command Handlers]
        Orchestrator[Effect Orchestrator]
    end
    
    Commands --&gt; Order
    Order --&gt; States
    States --&gt; Transitions
    Transitions --&gt; Events
    Events --&gt; Effects
    Effects --&gt; Inventory
    Effects --&gt; Notification
    Effects --&gt; Shipping
    Orchestrator --&gt; Effects
```

## Components and Interfaces

### 1. Order State Types

```typescript
// 基本的な値オブジェクト
type OrderId = string &amp; { readonly _brand: 'OrderId' }
type CustomerId = string &amp; { readonly _brand: 'CustomerId' }
type ProductId = string &amp; { readonly _brand: 'ProductId' }
type Timestamp = Date &amp; { readonly _brand: 'Timestamp' }

// 注文アイテム
interface OrderItem {
  readonly productId: ProductId
  readonly quantity: number
  readonly unitPrice: number
}

// 配送情報
interface ShippingInfo {
  readonly address: string
  readonly method: 'standard' | 'express' | 'overnight'
  readonly trackingNumber?: string
}

// 状態固有のデータ
interface OrderPlacedData {
  readonly orderId: OrderId
  readonly customerId: CustomerId
  readonly items: readonly OrderItem[]
  readonly placedAt: Timestamp
}

interface InventoryReservedData extends OrderPlacedData {
  readonly reservedAt: Timestamp
  readonly reservationId: string
}

interface ShippedData extends InventoryReservedData {
  readonly shippingInfo: ShippingInfo
  readonly shippedAt: Timestamp
}

interface DeliveredData extends ShippedData {
  readonly deliveredAt: Timestamp
  readonly signature?: string
}

// 状態の型安全な表現
type OrderState = 
  | { readonly type: 'OrderPlaced'; readonly data: OrderPlacedData }
  | { readonly type: 'InventoryReserved'; readonly data: InventoryReservedData }
  | { readonly type: 'Shipped'; readonly data: ShippedData }
  | { readonly type: 'Delivered'; readonly data: DeliveredData }
```

..... 続く
</code></pre><p>そして <code>implementation.md</code> では、実装タスクが細かくブレークダウンされます。各タスクには要件番号が紐付けられているので、トレーサビリティも確保されています。</p><pre><code class="language-markdown"># Implementation Plan

- [x] 1. Set up project structure and core type definitions

  - Create TypeScript project with strict type checking enabled
  - Define branded types for OrderId, CustomerId, ProductId, and Timestamp
  - Implement basic value objects and interfaces for OrderItem and ShippingInfo
  - _Requirements: 5.1, 5.3, 6.1_

- [ ] 2. Implement core order state types and data structures

  - [ ] 2.1 Create order state data interfaces

    - Define OrderPlacedData, InventoryReservedData, ShippedData, and DeliveredData interfaces
    - Implement proper inheritance hierarchy with readonly properties
    - _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 6.1_

  - [ ] 2.2 Implement OrderState union type
    - Create tagged union type for all order states
    - Ensure type safety with discriminated unions
    - _Requirements: 1.1, 1.2, 5.1, 5.2_

- [ ] 3. Create Result type and error handling utilities

  - [ ] 3.1 Implement generic Result type

    - Create Result&lt;T, E&gt; type with success and failure variants
    - Implement Result utility functions (map, flatMap, mapError)
    - _Requirements: 6.4, 1.3_

  - [ ] 3.2 Define TransitionResult type
    - Create specialized result type for state transitions
    - Include newState and effects in success case
    - _Requirements: 1.3, 1.4, 2.1_

..... 続く</code></pre><p>実装に入ると、「Start task」ボタンで各タスクを実行できます。（画像のTask in progressの部分にStart taskボタンがあります）</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhQAAACrCAYAAAA+eQVsAAAQAElEQVR4AexdBWAURxt9d0kISZAQILhLseLuWqS4u1txd/2B4rRYsUJxKw7F3SlarEBLoXhwTwKRf95c9nKXnMWwDmRmZ+eTmXk78o3crj5dqkzBUXEFs38TbMvlyFgwSvqjkjclG7Vnq/BT+Kk6oOqAqgOqDjhaB/SI4r9HL2/Alnvj/yyKKShxhYBCQCGgEFAI/NcR+PTLH2WD4tMvosqhQkAhoBBQCCgEFAIxjYAyKGIaYaVfIaAQUAgoBD55BFQGo46AMiiijqHSoBBQCCgEFAIKgf88Asqg+M9XAQWAQkAhoBCIaQSU/v8CAsqg+C88ZVVGhYBCQCGgEFAIxDACyqCIYYCVeoWAQkAhENMIKP0KgU8BAWVQfApPQeVBIaAQUAgoBBQCnzkCyqD4zB+gyr5CQCEQ0wgo/QoBhYAjCETZoHCbfA101hJzylsdsYcdQuyRx+DaZzNc2y+Ac6lW0MVJBKds5aDPXBy6RGkA51jWVKh4hUCMIJA1+1fo0qMjChcriKTJkyJe/LhGFydOHLM0S5Yqhvad2iBsvBmTulEIKAQUAv9hBPQxXfbAM5vg978SeDe3DfDcB/qMBaFLlw9wcoJeXF2KNUGsSj3glLMSECt2TGdH6VcISAQSeydC+W/KYvWKtTh+5Hc8uPcAL1+8MrrXr19LPs07eOAIrly+isbN6iujQgMlmq5KjUJAIfBlIKD/IMWI5Q7n2sOFEeGMwJvngGcPEPzqCd5vnYJ3G0Yh4NoROJdtD5dy38HhlQqdHtA7W3bRUCh9sixwqdrfoD8K+nQJUsClYjfAxTUKWpRodCOQKXNGXP3zGh76PDKqTpchLeo3qoMefbqiz4Ae4VzBwvnhldAL5SuWMcpYCzjp9RZJOp0uXHyBQvnA1ZJwhI8UkTJVclSu+s1HSl0lqxBQCHyuCFju9aKxNLo4CRGr2gDg0Q283zEd8PkHeOkDBAUAwQEIfnYPgSfX4t2CTtBnKQnnwg3sp+4cC26TrsBt4mWLzrloY/s67HDoUuaAcxmxqiJWUuyw2iTrk2aG8zddoHM1X0K3KaSIkULAxcUJiRMndEg2VeqUuHXrtpE3fcZ0+LZaZVy8cAlzZs7D1MnTw7kjh4/j5ctXOLD3kFHOUiBBggToO6gXylYobUZuJFY3+g3sZRbHm0KFCyBX7pwMxoCLuMoUqVJ8UvmJeAmUhEJAIfAxENDHaKJiVi63N5J9JY2J4BdiZcLvNYLfvjBPNjgYwc/v4f3m8XDKVlYYFqXM6WHvAt7B/4fa8P+xDvxnNZfUgENLDPciLvDsbzLuU/AC/zkJ/2kNEfxGfSQtpp9HkqRJ0KBxPYeSiRXLBf7+74y8HNR379yDyxevwNfXD+/fB5q53HlzI0/eXFixZDWePXtulLMUePbsmdDhi4wZ05uRU6ZMgXv37pvF8WbNqnXYuWMPg8opBBQCCoHPFoEYNSh08ZNCnyg1gi7vlQYDB9XAM5vBQTYcYmLFIvj+VQT+fRTO2csLcvilYRFp/Au6cxFBty8Id1HG0SAx3F9AsK/BYHFttwBuY/8AD43G/t8JuFTuDZgsOXM1xLXPFkl3G38RseqNgbV/Lt90Q+xhh6FPk9cai1m8zi2u5I/dfztitZgGXey4RjpXbWKPOAaX6oPAK/MYq/ZImOYNNv455a0hdbu0mC5WaP5E7NGn4Fy8qZmES8XuiPXdYrh821fS3Sb+CReuFAkunVcqxO66WsrKcreYAZisoOhTZIPrgB2Szqtrm7mI1WiikAz5c3aR+XYu2RISP6Gb5dB5JpcMTnmqIfaQAxJX4u5cwmD0SaLw7OHuUmt4qDzLVqi+kIrZv6TJkuDfG/9aTCR3npwoUCh/iDHxzIzH2s31v/9BAq8EcBGrJuRJnjIZnMRq1+VLl3krXeVvv0HPvl3RqFkDFBL6ZWSI56TXy20Hbr0MGNIH3Xt1RsZM6eGk10uZnLlyhHCGXsp9Uwbtv2sdGmEj5OzshKo1KqN3/+6gfqZTqEgBMwnS+4mVll59u6FIsYJGGleBOnXrgP6De0vZHn26iBWNr430ajWroFXbZtKRp2OXdjLvGgO3VLr2/E7K89q8dRNwq8mUThnKMv26DWqB+dXo3Jpq26GVlCdPZ5EXjaauCgGFwMdDIGYNigQpoHP3QvD9v8T2RjDw7i2C7v+JYLH9YanIwW+fI/jFQ8AlFnTxElpiiVAcV0T8F3aF34RvEXDgFziX7wDnAnWlDp1nMrjUG4XgG2fgN64i/Oe1QZCPyKekmno6aWg4V/gO738diqB/z5gSrYaD/d7g3cJOIt350MX3BpycQ3mdXKCLmxBOBWvj/cYxCNg7D07FGkGfKlcoj42QziO+1KlPnA7cKgr++3e41BoGnVt8o5QunjecMhaGU57KCNg+Fe9+6YLg54bZcaw2s4Ak6fFu1SC83/YjnHKUQ6y6/zPKujT4HrpYHni3pAeC/jwIfbbS0POXOBqHTi/z71KtP4Lv/ol38zsi8Mgy0CDSZy6GWE0nI+j6Sfj/1ERsZ22AS80hhl/yALCHO40l5+JN8F7k2W9sBYl5sO9LxPS/x4+eIGmyZBaTef7ipTAmVuGZWHngVomLWN2wyGgSee7MHwIOHTJn+UrGfv11dnk9/8cleaV3/OhJrFuzAUFBQYjvGZ9RRlfx2wpikM6Js2fOgSsYL1+9Qo3a1RAoeIMCg5Dpq4xGXi2QKXMGvH37Vru1ea1W81vkEHn669p1LFu0Avv27Iebu5uZTIoUybFpwxY8evwYJUuXMNKcXFxw699bWLn8VyxbvBIPHz4Sxk9FJBBbPWSKGzcuuFrE7aGN6zfD1TUWSpcLXXWsWuNbYSA4Y9uWHbgpjLjkyZPBM6T87h7uaNKsEdWAsocOHkWGjOlRQGwLyUjh1ahVFc7CUFu2eAWWLFqO69dviFj1pxBQCHxsBPQxmQFdLHehPhjB796IqwN/YuuDXDQsdO4JGYySe7d6EIIf/g19ajFQv/cHggKhS2Ho2BmWyjnQC1rQ3ycQcHChjDL1ODt3KlwP/tMbIPDPfaYk2+HgIATdOi/Sv2mVL/DAQgSe3YL3u8QKgdjGccpS0iqvJQKNEebJf0VfSdZnLyevph4NiYDDSxB4eQ8CDi2CLl4i8FxH4JEVCDy1HgH7f0bQ1SNwyhlyCE+sVHCFImD3Twg8v0MaPMH+lp8fjYZ3Iu3AKwdkGYKf3YVLSTFDFjgH3bkAffJswoi5B4iyOZdoaciWoMmAHdx1zi7Am6cI/GObyMd2KRKT3llhAFSsUgHJkicNl8zNf24KY8KwzVG6bAmkTJUiHE/YiDu3xRbe+/fImu0rSUqXIR0eP36C9+/ey3t6NFD+vXEbgQGBvDVzHOx9fX3h7/dO5CkZ7t4W2Lq4IFuOLLh9+w6SpzAYPx27tEW9hrWlbPz48fHP9X9l2J6X+atM8PF5iE3rtwh9d3H65Dns33PQTGz7bztx5fI1Ga/T6ZAmXSpJ5y9itmwUzyUgAGnSpMKzp89kfHKxCiMDwgsOCsa6XzdK+YsXLiNhQi8RKxbCXF2l8XD86Amc/+MiNm/YisDA0PIXKJAXOr1OGiyJEyeGs1jVefP6DfLlzyPl6el0OmGs6REk+ot7d+6D+WS8cgoBhcDHRSBGDYpg/1fQuXoAYpnW0WJKfv+3EGaIoyKW+VxcEXvwHsQesBMuRRvBKYNhyVYXy1XyB798iPdbJkKfuzJiD90PuTRfsJ6kmXq61IalXH3qnKbR0RIOFAaHpijY9xXg7qndOnQNunnWwCcGfG4ncUXCEGHwg8XMPujuZcNNiK/zTClDQbf+kFd6QbfPA86xxHNyhlO6fIySxpAMCM/ailLgxV2CGuYvkdAvDAgnsVKhuaBrR4HXjyWjPdwDz/0mDJ1NcKkzQmzVnIZr3y1wdJtJJhBJ7+L5Szh+5ASqVq8MLuFzGT1evDiR1GYQuylm32nSpBYzdFc5iF65dNVAsOM76fWiyejFoKlD+ozpkC5DWvmeDJ6/0Oud8I/YTvHw8EDCxAmFXk+kS58WqVOnlPxXrthPw93dXfLeEIYSbPz799/bkvriuWELkXKMoOHQf1BvNGraAF9lzYykSZMwGrGEwSMDwnv1+jWCxYAvgnj18pVMj+F0GdLwgju37sorvVdi9YVXOq9EBsMjUeJEYLnpuDrzRKySkE637bcdiCVWiZq3bALmo7pYsWC8cgoBhcDHRUAfk8kH37sGXcLU0MUWHbPoJC2lpUsg9t3d4hpJOu+MCObg8+qJMS4yAecSLaDzSgW/8ZXhN7UO3q0cIAZMJ0AXWuSAffPgNygP/CdVF9sd18UWiFj2F4YITP75i+0Qzua5paBPldOEEh3BoCgp0SfPapB3jgWdRwJwVcAQEeKLbZeQkPESLAwp3uiSZQav0iXNJFcREBSAwBunZZQ+xJDijU5srfAa1gW/MczazeKf+0ic/ee3h6l7v2umkc0m7iIP71b0gW+/7PCf21qUK6EwLoYZZaMrwMFOp9OZqTt39jzmzf4Fc2b+jIXzl+Lly9dmdN5wQA/SVlkYYcNdEDNwFzHwFStZRHKdOxtqxMkIKx63NYLFDP/li5dYvGCZmaPhc/XKNSlZWayo0Mh49+4dSpQujgCxYvD08VNJs+VxW4Tl5yFRW3zWaJUqV8B7sfoycewPmD93Ec6cOidZdWJlQQZseNo5lRSpUxi5uEWi3bwQZWZ49869ZuVesfRXRkvHVZOpk2fip2lzcPnyn8iWPQu43SOJylMIKAQ+GgKho2sMZCH47TNw9uuUpzp0nqEdiGlSzsWawjlPVTFwJIAuaWbhMsjBXTtYacobkXDwE8PsSpdIGDQ8L1F7hJm4LmFaOPOwn1jiD3ostiVC+KF3MeNjPt5tGCXy9DdidVgA03MKZoxhb/TOAI0Tl1gGigyL1RGd3nAfDb7LN12l0SQPmwp9gRd2Ct/2X/Dze+A5FefCDUADySlbOTiLrZag66cMgv6vEXTvCpzLtoNT1jJw+baPYZXJQLXrB/y+FlztcPm2L3TxxcxV4OssVn70GQpIWXu4678qCacspQGBE89nEH84CSwRvf8e3PdByhTJLSr19fXDmzdvwtFcXJzglTAB7t15EI5mKeLa1b9Bw6BAwXzCOHmF12Lp3pTPRczo6cT0XRRXB4aZBnlu3LiJxN6JUbBwfjEbjwXPBJ6oULEseMbA19df/ookZaqUuHzxT/AAaCqxQuHz4CFFHXJ379xFipTJUbxEEak/ZarkyFcwj0Oyz8WKhd5JD56Z4MpIiVLFHJIjE/NOo4G/quG7N/i+CycnJ5Kko1FHY6dipfJgnngYM0u2zOC7OiSD8MqULyXxePXqNfgcRRScnEN18F45hYBC4MMjoI/pJN/vnAGdWPp0Kd9RDExxwiWni58YcBKDuEtsuFTshuCb5xB8TyzbiplqOOYIRASeSG5AIAAAEABJREFU347Av4/DtcMvYkvjAHQpvpIv0xI9vNSic48Hl7oj4fb9GbiNOw++A+P92hGAGFAlg6kn8vJublvomMdWoTNtU5aw4VgNxgm9FxCrxXRJij1kv7x3LtlC3AcLJ/4ELsI3/AVztSIk3hBj30+YAtzWcS7dCgGHlwtDQawOGKWoK3Rv2hgtAu8WdQVie8C1xxrwgGbQy0d49+sgQTH8vV89GNDHQqy2c8BfbAQ9/AfB7/0MRPrGfDMNRoS6wDMbESCeuXPp1uAr14mvS53h0MUyrELZw12fJANitZsLt4mXwde1c7B9vyo0b6EpRS107epfyJojK9zchJHnoKo8+fLgwQMfOTt3UAS379wRRdDhWsiqgiZHw6B3/+7yVxZx4niAWyO879m3u2TZuG4L7t65h7LlS6NXv27o2Lktcub6GnphaJHhzm3DlsGFPy7h/B8XGIUb12/KqyPeul83wUcYIMWFMUD9TVs0RgJPT4No+MdqiA/xD+0/DJ4F6dC5DRo3b4inIWcoaDyRJZgblsY6Yoihr7ktG7dCr9ejRq1q+CpLZmlocXWF9KdihWXLpm3glgfz1GdAT9SsXR0JExm2QsiTN19uiQd/4VG2XGnwWXLVgjTlFAIKgY+HQIwbFFxGf7dxNHRxEsKl+gDoMxSEzp0dlw7QO0MfLyl0CdMg9neLoRNL9wFHl4ArGw5DIgwA396ZEbB/vrmI6NDezWoOv+GF4fe/kvCfUAV+I4rg3aqBko8rJ1xW9/v+G/iNKS9pAcdXSRq9wJNrQL14789bBIuZvW//HHj3U1N5b8+Ty/YiX9Rh6vhrk+AXPlJ30LUjRjV+I4vhvVgJMUY4EOB2DH+h4jckH96vH2Em8e7XIfAbXRaW/gX9exZ+Q/JDln1UKfiPLQ++YEzjDbp9QWBWHL59swkdpeRKQ+CVgxoZPGTJMvFAaWhkaOj9jmnw7f+1/HUNf6nhOyAnAv/cKxmCbp+HLdwDDv4C3wFfy20ov2GFwTLycKsUtuP5+/nj0aPHdrgM5Fv/3gFn9o2aNRSDeSr5c0wDJbwfP348FC9ZFPkK5MX2LTvDM9iIWb54FcaNnoTdO80P9L5981bGk2bqJnw/RWrz9/fH0kUrMHnCVHFdLpf3GX79+rWkr129QcqT798bt2X48KGjkuaIx22PhfOXYMqEaVL/1MkzjHk8ceyk1Kfpefnylbz/M+QMyKNHTzB1ykzMnb0AP0ycjuVLVkk6D7ZSZsWS1Zg1fS6D0v1+/LSkyxvh3b51R8pNFGX9cdIMYdTFxj8mv9S4dOEyuJ0y96f5WLhgKSaP/wHbf9slJA1/k8dPxawZc7Hol2UY//1kefjTQFG+QkAh8DERiHmDQpQu+NVjvBODTLCYCTvnqwnnMu3hlL08dGIrQpc8K5wL10XAuW14t3oogl86NiAItQ79Bb9+iuAXDyzzilWB4Cc3Efz0lmX6ZxDLA5PBPNAZibzKsof8lNRUnK9Bj9VgLJyLNoJr+4XgQVlrxoOpnFlYrOoE+/yF4Mf/QlsVMtLt4S6MuKD7VxD8xv55AKNOEeBAt2r5GhFy7G/3jr3gmQQuoXfv3QXdenYK5/j+h2atmsitjpVLV8PeS60cS9lxLq4E3Ll9T26ZOC7lOCfPX1C/r9jmcVzKwMnVBBo0hjvHfeLNd0sUKVZYvqvCSWx5aMaIqRaufPAXJXzJmGk8wy+ev8T9u/cZVE4hoBD4RBDQf5B8cAC5fw0BJ9eDPzGUA4XYcoBLbAQ++AvB/m/lnr2rWIJ3bTULOrHs/UHy9ZkmEvzkLgKv/x5juQ++/zeQKA2cSrRAsLMz5LsurBllMZaLD6P49+OnwAOYM6bOFrPhJeHcLz8vwowfZ2HT+t8+uDHxYRD48Kn4iG0jT09P5M2fG3onJ2wWWyA0ED58TlSKCgGFQHQiYMWgiHgSieOlg00XJxUSBTjB6+Y1JDizB15XzyCRbwDiLxmEuJMbI86oKog7tTnirZ0g4oNs67KX1hdO97rzD+IvHRpjGHndvSGey2DEm9lOpuN1+3qMpWWzznzA5xg/dgq4BicK75D4iy/7h34Gj275Y+OK/Vgxfxs2rTiAh//6Kow/YF3/0M/7U07PwzX0bE7ERz0lERaBaDMowipW9woBhYBCQCGgEPiUEXB3jY/P3qj4hABWBsUn9DBUVhQCCgGFgELgwyJAo+LDpvjlpvZJGBT1mlTD8Qvbpevcs5VDaLfv2kzyU65xy9oOyXwIprQZUiFFqmQfIqnPMo0s2TPA0Wf8WRZQZdoMARcXF/QZ3AlJkiU2i1c3UUcgc7b06NKrdYQVFS2ZH70GdkSFKqXMZPXOeqnPO0kis3hHbkqVK4LqtSs6wmrGE5U0zRTF3I3SHAEEPgmDwtXV8C6AMoVqYda0RQ5l/+efloH8ZI7lGvLyKN7YcQm9vTBx+ggc/WOrdHbYHSa37tgYe4+vx6qNP2PdtoU4fPY3h2Xjxo+DzXuWItvXmR2W+VwZS5QpiqatGkRr9vsP64IJ04ZHq04q+3nZD2jRrj6DH8R9ifXAI44b6jWqgSzZwn/M7IOAGg2JfOh64GiWi5csLNpSxOrnnEUTMXnGaJQpXxy5831tllScOO5o1roBsucyfH/GjGjnpmmremjXuVk4rkpVy2D1lp/DxWsRUUlT06Gunw4Cn4RBocHh+9YX/JKidm/rSj7y2+KxRJs+ZyyKliiA589eQKeLnuLTym7TsQn+uvo3qpRthNqVW+LQ/mOWkrcYx1mcd5LE8EqUwCL9S4pctXQ92jbrEa1F+iprphgZsDJmTo8MmdJFa15tKfsv1QNbOHxqtA9dD2Ky/NlzZsO6X7egWrmmmDhqhllSr1+9RdcOA3D88BmzeEdu/jdkEnp3HRaONUXq5OBbXMMRQiJeRyHNEBXq8gkhED0j6idUIHtZmTJ+Fkrkr4ZjR0JeNW1PwAF66XJF4ezsjAXzVuLJw6e4e/s+BvYcbZSM5xkHi3+dgWPnDds6S9b8hNghb2jctHsJNu1aKnkn/DhcrmzMFrMIGWHH23N8Heo0qGLkOnh6E8pWLC7vl6+fgzW/LcDhM1vk1hDTdI1tfyVn0Mju2H5wFXYcXo0TF3fIK7dxpFLhFS9TSOrkkilXYbjlNHrSAEEBSpYtLFdpKEdauy7NZDy9PAW+BuO27luFaXO+Z5SZGzm+P46c+02myfS5nKsxeIsl2JUb50r8qJt0lqV+sxpSZ7YcX8FbGGTUT5fpq7SaqM3r2B+G4MCpTTJN4sRlWwpMnjlS6nVzi40KlcrIMPEgjc4WBraeCWVbtG9gTJOrZNr2j616kL9wbvDZcgWDOjjrY74Z1ty+kxswdExvI/7rdxhW+mzVPU3W0pVpbTuwUtYdYr772FoUK1XAyMrVONZT4s3nNmBENyONdZJ4sm7MXjjJGO9IoGCxPNh+aJVMV8qbtAVixfS0/BQqns9MZXRjYKsetOzQEPtPboSbu5sxD8SD7Y4RvFprf5F9JtQ7amJ/2Q5Yd6rXqsQoo8ueKwu27l8hsSN92Pd9jDT2P8TOxcUZtepWkXV60owRRvrSdbOw78QGTJw6EjlyZzHGFyiaB3yW0+eNlemyflev842RzjbDurh0zWwMHBY6UfBMEE/KtenQBHq9DkybjlvVmrC1NDlBm7VwolxBZh1Yt32haN+JpJi9/OTMmx1sS5SjW7hqupRT3odB4IMZFDpRqT5MkUJTsZTmqePnEBTA11yH8kU0FFbvob0nEBQULBrjcAwZ1ROp0iY3Uzl97lhwlrN4/gosmLtMzHrTomO3lpJnSL9xGDNssgz/Mm8F+nUfjsnfz5T3pl7YNEnz8HBH/ASeDErHrSPtC5kJvOIjVZoU2LPrEDas3YpMX6VHw2Y1JZ/mWdKZwCsBEnh54uGDx/hp6nx4eHhg0IiemgjcRQfqEssFtetXw56dBzF10hw8evgEeic9vp80BEHBQaDRxtdGt+3YVKRrGNyvXPpblm3vroNCh7tRHwMduzVHpW/LYt/uQxj3vx+lcTZiTH+SpJu9aBJSp02JTeu3olfnIbh75wFchAG3e+t+qfP2rbvg9yGIHd2tf+9JOc3TWah7NH7KViiBtas2o12znvh15Ubwg1eUmTZ5ntTLl0r9cfaCDA/oOYok6axhQKKHjWdCQ6RTt9by+xND+4/F/NlLEd8zHsVgqx5wWZjP1klvaK5x4sVB7NiGbUIpLDy32LHxbfUKcpVswqip+DPkrZa26p4Qk3+W8HHS60Fcmc+BvUfhnf87jJ0yVPLTc/dwQ87c2bFgzjJcvngVNetUAesAad36dpTv7PhhwmwkFsYg48I6nYVnwnL+MHO0fP4/TV0AznoDAgKlKLcDm7dpiFs37+DHibPlK8gnCANcEkO8qGBAFWHzZKsebFq7Qz6DliFbYrHFBCF33q/B+kJdttqfI8+EOsLmJ5XoV76pXBZnT5/H4vkr4Z00Edmk4yA88+fxcHFxwYQx07F7xwHWB2iG+ejhU2Q95ndSdm4ztJvpU36WsvQmiT5nopBjveJzYBydR0h7z5w1g2jXM2UbadepOUnSnT19ASMGjcdDn0dIlNhLxtF7+fI1+vUYgV3bD4Bpsl3SbVi9jWTprKXZpWcb5M2fE/v3HMbSX1YjaTJvsU09XMrYy0/fQZ3hKtpG9+8GY1Cf0bh25W8pp7wPg4Chh4pCWrXSAD8VAyb/NNLMjRjXz6jVXeyjpk6XAvETxDXG2Qtk6VMc+WZWC+cyfBc6S7KlIzJp2tKn0Szp5UA0oOdIPH38HNXErOHXzQtAC1uT4ZL840dP4RHHA/HixQW3WyqJAZT082cu4cSxswyKQeAajh48JQaFm/Je89wjgR9lX716jeH9x2PciGl4+uQZSpQuwmjp7On8rmUfLJq3GkcOnkCmLOmljKlHI4W6Vyxaj6kT5iFfoVygofHLvOVYtWQDOrXpL9lrN6gqr9yeYtlu3zIf7EmsXrsyOHg/f/ZSGFvpcPPGLaTPmAbs2OKJ1Z0UKZNJY2Ps8Gk4cuAk2jTujtev34oyvZB4vRKdF1+7Tf10/n7vqFY6e+Uk041/bskyUJb3//5zR+oNCAwUHeVjGT578gJJZi4sBmZECzfNWzcADc9GtTpg52/7MX/Wcnw/fKrkdKQeSEYb3r83b6NDi77CSNqKQb2+l5y26h4ZrOHDZ9G+WW+w3ubKk0Pi4Bpy1olydCePn8GC2csxauhk6HQ6FC1ZAFzN4qA0fvR0WQ+WiAGBvKbOWpp1GlWVxsRooW/xz6uxdeNudGljWP2q07CaVNGxVW+wzi1b9CuYjulsmgyRwYBylvJkqx48ffwMTOvbGoaDiC3bGc4FzZu5hOqks9b+7D0TClvKT826VWT96dSqH2ZPW4xLF66QVbryFUvKV5hfu3od6TOkwcsXrxAQEIAOnfntIODa5X+g1e9bwihjmOmTThkAABAASURBVOWTwsI7d+oiDu47JkKW/2YJA+/XZZuxZf0OYTiEGjIvn7/Gvp1HwD7NVJJb0kyDr7gPDoZMm/cPfR4b2aylWbpcMdG+38g6PGPKAtEv/iUmJhmMcgxYy098z7jS2GR/sHfHYWP7ooxyMY9AlA2KdHGArJ7AV1kyhnPG7IsKZQw7GIiXJTHiZ/UO5+JmSOiYhkik6ZBiK3oP7DmGmhWbi73JJjh84Li0sCtVLQP+4kOn04lZuRuKligonZ+fP3x8HjqUnGSykqak2fB8HjwyUu+IbZi06VMb72FDJwd3Dthkvixmuu5ubuAMjPeaW7NikxaU1zRiBYGBIwd+50Vu/bBD4+xCRtjw4sT1gBiRJDbEyCthAty7+wBeiRMgS/ZM4L/9exz/TgX5jc5KOQ/uPS5mkxfRpEVd7D6yFlxWTS2MXqOcA4GwGNgTSeydEE8eP43yCpm1dI4eMmCv0R2qe1bw4VI+t1k46y1boTiSpUgi1ZrWg/PnLsu4WzfuymuiRAlQrmJJGT566KS8njx+Tl7NPCtppkmXWs5m9+8O/6y9vRNJo5MDGHUdP3qGF6RNl0peNe9oZDCgsJU8kWTNrVi8FonFM2W9+bbGN9LAePrkhZHdUvtz6JlQg4X85Mn3Nd68fkOqdNeu/iOv9DJlTscLkiVPYmxHTJ/fYZGEKHoH952QGh6IPkVvYXVJEqPJixs3jljFC+0fr/z5F/h6dlP11vLz48Q54MrOnIWT5RZq1z5tTcVUOIYRiLJBMeUSUOY3oGrZJmauUc32xqy/feMLdjovnr0yxtkL/N52PfaWnR/Oneuz3Z6opEcmTQoWLZkfC1ZMxYz543gbztnT+1BY4H26jECgmN2WKlsU9+/7SB1/nL2I2pVaGl2Lel1lvPTENgGvLmJ/k9ewzlqaQUFBiBtPDMZCgGcUxMXsL6Ho4LUIb9EhPxTbGNq9NZ2kc6XBRSydMpwufRq8fx8AP19/3hqdz/3QmQYjH9w3dAC5xR4m77m6wHMlT548561N5+vrh9diNcUUH4ZZZ27+fVvKFiiUW14teZwB6XQ6SyTYKidn4CXzV8OcGYtER5wU3Xq3M9MRLKwuZ2cnszjTm7AYkGbrmbx4/hJeCT3JZtlZqQevxWoMBRJ7e/EiDPcM8hrWe/Y0dDAjzZG6Zw0fnlfg8ytbuBZ4gI+rEdSp04V2GcSdcabuZMhqW46cWWV0thwGg1DehHjW0nwg2opOp0Pu/DlCOEMv/IYK66VryDmgHDmzSOKD+6FGMyMigwHlrOWJNGv1YMOv22Xb6Dekq9jjT4yVS9aR3egstT9HngkVWMoPVx/cPdxIlk4z4nlz9859XjBt0lxjH8M2NHJgxM6wSCUWvCDRn1mIth8lKol4pPb5TDh8fX3FKoihrjM6nZgIsT9lWHPW8sNVifJF6qB1k+64c/uenDDQONbk1DVmEQjtHWI2HQQHWTC5P0KaPGzGQ27c72NFZ1jbZ2R2smTLjOxfZ0G+AjYGsDBl4bsV5i6ZAh6K4kDac0BHaVGvWblZzkZ9HjxE/kJ58M23pZkESpUrghbtG8gwPc5qOGjXbVgdXOLX9qJJ05wl/DjbLVOuBDh77N6nvcZqvHp6xket+pXl782TiH3Io4cMswyNwZJOjTZ0TC+5/1q8VCHcuP6vFm31evrEebkcy5+dpRJ7vdqW196dB63KaIQTR0+D5zb401saMpm+Sou+Q7tIMg00bmlUqFJG4se94h79OyC22LOWDMK78Mdl+XlrGlWkiyizP0vl5IE+YuMvtkd+27hL5D3Q7IAdFdy/4yNWmnKB5bGklzxhna1nsnXLblkvxv04VBgW8SW+TVvXNaqwVg/OnDwP7kO36tBYypQpX8IoYyvAs0L26h7lLeHj5KSHThgPiZMkRLFSBcR2WVGy2nXnz16WS+2sj5y5N2pWx6KMpTS3rN8pyzlkZC+xMpVBtoXu/QxG3t6dh6SeEd/3hdTbtLY02i+ErJJIogXPUQwoailPjLdVD44fOYkCom1zNW69yfkAyllqf1HJz6a122X9obHHup4zdzYmI92enYclHt1EP8DzJmxHzdvWR+nyjj03qSQGvENitVan04F5YZ4cSeL8uUuIHz8e+H4iHtKl8egjVkYckSU2yVMmwZ8Xr+Hqn3+Ldh0k6lSQI6KKJxoQ0EeDjs9KxTeVSoLLuIWL5odOp5Ph6XPHGcvAQ4XGGwcDgQGB4C8NFiybij3H16Neo+o4ffIPnP79vNTQu/NQ+Pn5YdT4gfIXBROmjkBWYbhIYoi3XQw2efPnwq7Da7Fiw5yQWNuXDWu2gobChh2LxQDlKZk5Q5YB4fn7v8OAYT0wesIgvHnzBssXr4cj/zgbKF+xFJasniW3aub9tDicWHDIbFoj8IzEnJkLwfMOa7b8IgagInLrh/umGo+166jBU+ThqQ5dWuDw2S1YunYOSghDRuPv230EdGKmQ/yOnduG+o1riGcXWnVXLd0g9vqfYNaCiTgm6OxQNVlr1/QZUktsTlzcIX9l81osJY8eOsWMfcmCVbIDZ3kOndpsRuNNWAwYZ+uZrF6yEQf2HpXvANh2YLXE96us5qsNluoB96NPHDuNct8Ynomf2DJjWmGd6bPXaI7UPY3X9Dpn+mJZZ1j2KTNH41nISpNpmcO2FS399aJechDgWaL4nvFM1doM3xMG3IwffkbylEmxaNVPsi3QYKYQt0GOHz2Fst+UBPUmTe4NHtz0FwYh6ZrT8qDd8xpZDChLZ6sezJm+kCw49Xv4rR1r7S+y+bl84Rr+/usGeDh19i+TYDpLf/XiNcaNnIokSRPjlxXTZTv6rltrOPJT9JJlC8t+iX0PCzNuyjB537FbczEYGyaCYZ81+eg27loseXPmzi5XaU6I9sRfv5BGx7Mb1/+6ic492sg89RnSmdGwleb4UTNEe36KPgO7YPocQ988fMB4KRcs+gEGrOWHZ9jWb1+Mo+e2gn3YxrVbw62uUl65mEEgtFeOGf0OaQ0WS8s6nU5WzO4hMxJ7grREWXl1Op2x0tuTIX3tqq0olKOimatYvD5J0i2cs1LSiuSsJO8d8f66ehPF83yLetVay18MFM1VBTw4pcmSzjSqV2iKTq37opxYRh7QY5RGltfRQ38A02TeGlRrJ+PseTzUV6ZQDTSu1R7VyzeT+d60dqdR7Mqlq6hYoh5aNeoKLgPyIJmRaCPALYhS+WugXfNeKJ6vKnjeQGPnYULmMewWCOnErkTeaujYqg/KF6uD3p2HM9rMpUufCmE/ec1Drc3qdpa4dG7bXyyxN5Hl0QR5ILJ0wVqoW7WVMU80YDT6/bs+kr/w15UkBux4NZq164pF61GqQHWZ18qlG4LPh3pM+bdt3osKxepKncVyf2sk2cLA3jPp120kSoptFtaDauWaYGhfQ0epKbdWD7q3Hwye0aks8lq1bGOZJ02GV5Z96YI1DJo5q3XPjCv8DQ9lss40rdMBFYrXkWmbPnemx+etSZKm1b1Jo2dKGda7coVry7we2GP9wJ+mg1eWge2HS9ZMm2VmPB0xYF46tOyNonmqgLyM1xzzFDaOtMhiQFk6a/WAtJy5DasEc6Yv4q2Zs9b+opKfJrU6onbllrItsE2wzFqim9btAOtps/rfoU3T7iiWtwrWrRT70RqDuJKfB2lF0PjH9s3nF9bNnrYYfG6Mf/n8teRfs3yzfJ7yRng1KjSX9+TRXOkCNQQl9K9xrQ5GHtYNUmylSeOIdZzlbNGgE0rmqw6ufFHOXn4qlWwgsWnfQtQR0Q+P/98Miin3gRD4JAyKZQvWGiscfzHgSNln/vCLUWbR3FWOiMQ4D/f8tYpvKTEfsd97WqxaaHvilngiGseB/fpf1rckODA4MsCGTZeDPH95wCXasDRb95SjAcBOwZRv+Ng+WLZ+NspWKCkPQ5rStDBx4c96uc2hxZleb9+8h8jkyVSHaZjYMa+OGlqmsrbC1GvrmXBWzXpgrZzWdNPgiWxeI1v3OPhpg4m1fFmKp0xk6p2m69IfV8L92ok06uWvAyJaLykbWQwoa8ktWj0dvQd1AX/JYK2sttpfZPPD99ywLVjKE+O4KnDx3BVEBiPKfyqO5bxy6XqEs0Ns2E9EWFAJRBmBT8KgiHIplIJwCPC35nt3HwkXby/i0P6j2L1jvz22CNPfvPEFB8PJ42aCM80IK/i8BFRu/wMIvHjxCps3bEfzel3ClTay7S+cIhWhEPiMEFAGxWf0sCKS1R/GzZbvAYiIDHm5bD12+DQGo9VxqbNru4Hgb9mjVbFSphD4SAh0azcIbCum229aViLb/jR5df2wCHi4JviwCX6hqSmD4gt9sF90sVThFAIKAYVANCLg7uoJZVREHdBoMygSeOnwoVzUi600KAQUAgoBhYBCIBQBGhWJ46VDTDsPV6/QRL+wULQZFF8YLv/l4qiyKwQUAgoBhUAMIeDuGl+shnyZRoUyKGKo0ii1CgGFgEJAIaAQsIQAjQpL8Z973GdvUPCNiTnzZJMfkvosHsYnlEnX2LHAjysRw+jMVqlyRVC9tuGjSdGp92PoatG+AQoUzfMxko5wmhHFnW8hbNGufoTTiWkBvpW0S6/W8E6SKKaT+qz0J0mWGH0Gd4JLyGvxoyvzfNMu9drrBxo0q4l8BXNGV7IfXE/dxtVQtmJxi+kS2yGjeoKuXZdmFnkcieSzIZbU5wj/l8bz2RoUfMX1qk3zcODkJsxb8gP4hsomrevE+PP5edkPiK5OmK+a5su5LLk5iybGWFniecaBht38pVMlhoP/1yPa0mvaqh7adY5Yo+Qr0TfvWQpH3nIZbRl1QFGrdo1RtcY3DnA6xsIPxq3e8rNjzBHksoa7tTRr1K6Elu0bRzAVx9j7D+uCCdPCv9jMEWm27WatGyB7rq8cYTfyRDbNT7XuGQsWEsiaPRPqNaoBjzhuITHRc8maw6CXr7+3pbFjt5ao07CqLZZPmtaybSM0bFrbYh5Z5/gV2DIVSqBJc8s8FgXDRPLZ8BllyZYxDOW/cfvZGhTT5o1FqjQpMLT/WBTPUxU/TpyNF89exvhTy5g5PTJkShct6axZuUm++ZFvpLz5zy34+fkb70cMip6P+ljKaP+hXSV2/XuMlNiNGT4Zt2/ds8Qaqbj/DZmE3l2HRUiWlr13ksQOvSo4QoqjyNy+RU9MnTg3ilpCxVOkTo5UqVOGRkRjyBruMZmmteyzc45sp/r61Vt07TAAxw+fsabeYnxk0/xU657FQn7EyC5tB4i2MO8j5iDmkuaL6JrV7YTfj56OuUT+A5o/S4OC1iQ/4LV/z2HwNch8OyNfpbxl/S7jI1u6bhamzh0DznqPX9iOw2e2IKG3l/zg0OJfZ+DY+e1g/JI1P0Fb6ivzTTHs/329fAU46eu2L4S2dDV55kgcPvsb3Nxio0KlMjK84/BqY3r8MNjW/SukzqN/bMWw7/tO3TZSAAAQAElEQVQYadYCfOsf3+hGx7dEBgcFyjdB8p5vReQXT1dtNm/A2w+tgraasP/kRqzYMFeWhWkOHdPbmBRXIayVM1+B3Hj44LF8rS6x47snFv8cWhYuhTMd4kM322S1pHiZQiCWvQZ2BPEgffSkATJdLrkfOLUJS9fMxsBh5isey9fPwZrfFoCylFkicHcVWy4U3LR7CTbtWsogJvw4HNRrmqYkWPFsYUARa/WAy+qzFk4EcWN++Ky9TZbYf1k5TeZjwbLpaN7GfFugdsNvwXS5ssTyVq8TuoJBvROnj8CRc7/JekQ+fsHWM0E8sOxtOjQBP//MMtK172p7JadKjfJgGtTL8mjOGO+khzXcHUlTr9ODZScG/CaM6YfytLQsXXPmzQ4+N8rRLVw1XbLVb1YDLBe/beMtDESG6fjBN8kgPGvPRJBA2r4TGzBx6khwO45xmvMWz2flRkN9J/bbD64C65AjaWo6wl5ZBmt1LyrtLzL9gZY3W+2PPGMmD5Ztfs/xdTCte/bS5PYd6xKxY73n5wuoz9Txw4R8lmz/XgnjS9Kgkd1lHfxp/gQ0bmG+Crz3+HqwrfIZs84PGNFNytBjXdp1ZI1sB9S3Ze9y8MN+pNlzI8f3N7YhPmfqogy3H9mOposJJfvosBjwI40sG8tIPn6PhHKaS502BRjPOsu+U+v7Nbq1q602X6dBFaPO2QsnWVPxn4iPmEFhBxKdXmeVwxbNqlAIIaxs1pyGpdCjh06GcIS/eHl5gh8A8/d7h6mT5uDwwRNw0ukxfe5YcJVh8fwVWDB3mVhtSAsu5VGDm5sb+HW8bh0HYcr4mUiSNDEmhizbTps8D/26D8f7d+/xx9kLMjygp+F7HOzs+cExznQmjJmO3TsO4NvqFaA1Auqm0+mt40N6WHdg7xGkTZcaaTOkkqRvvi2NBAk8sXmDwXByE8ZNmnQpZTkunv9TLs1rHwOyVc4Tx86A+6bsvNlQ2InIBIRHY+2HmaPh7OwsP77EWW9AQKCgGP7c3d3gEssFtetXw56dByW2jx4+kcSzpy9gxKDxeOjzCIkSe8k4zUvgFR9cUdqz6xA2rN2KTF+lR8NmNSV5SL9xGDNssgz/Mm+FxHby9zPlvalnCT83GxhQ1lo96NKzDfLmzwkapUt/WY2kybwxcXroEv3Y//0o84HgYJguBfOZ9h/SDXfv3MfIwRPB1wP3G9KdSUk3eGRPlCxTRH4sqlfnIUL/ESRKlBAvX75Gvx4jsGv7AaEyWOpmfdqwepuUM/VMy8lXkceO7YriJQuassg0AgICwA+HWcPdkTSp+/mzF5g2eS68kyZCy7YNzdLhjWl+eE/Xd1BnMZi7ovt3gzGoz2j5cTfG7966X5bt9q27ePHipQyznLf+DV0B8/Ky3DYpP0k894miDTFfrIuM09zsRZOQOm1KbFq/FcT27p0HcBH11JE0qcNSOYbYqHuRbX9R6Q9YZlvtj+XImDmd7J84GWjXqTmjYC9NTgQ6dWuNB/d95Kru/NlLEd8znpTVPL1ej2VrZ8u22afrcDx98kKSli1aK9u1k16PxN5eMk7z3D3ckDN3diyYswyXL15FzTpVoPUnbAtsnz9NnY9HPk+EbEIkSpxAE5VXnYU+kUZApW/LYt/uQxgn2iH7ohFj+kt+j5D+J3PWDOEwIMPbN2/wo+jvucJ16cKfaNW+iejj05AkHfvPfXsOYe3qLUiXIbX8Cqok2PDstflufTvi2bPn+GHCbCQWRq8NVV88SR9dJXQTFStFyhSIGz9uOJXWaMPGDMOIcSPCuSLFCxt1WJJNmTKppD98+FherXnscOt+2xpcvRjQY5QY6B6Dy6KPHz0V+5AeiBcvLtiZsvJSx9aNuzF84EQkEA0tbfo0ePXqNfg1T9L+/ecOjh48hYDAQKmHYX4HgrTyFUvKlYtrV68jfYY0ePniFZh2h84tSJbOXex78rPL8ROEx0cyWPDWrvzNoKeLQU8TMTugbq5gaOx/nL2EeTOWoGPLvnKgqlm3siTZKufEUdNxaP8xZMiYDhwcaeVXqFJKytVpVFUaE6OHTgZXLYhJlzaGFQjJEOLRKBjef7zEduqEeTL25fPX2LfziMRURoTxiCdlxo2YJjqrZ/KLpGRheU4cO8sg/rx0TeLMb0jIiBDPFn7WMAgRlRiGrQelyxUDvzA6qNf3mDFlgUj3L9GRZtBEwO8h8BnzeRsjRaBNh6bCB86fvYhsOTKLTvQKXFycwRUDEspVKC7qxyP5evEjB05ixIAJ4EebOPBTH7/7IGwUWUbeh/2eR9hyku4ntsKKlyqERi1qyVkbB50sWTPhxvV/mSSs4e5omp1a98Pyhetw/a+b4MqfVBrihc1PSLQYjOKCqxv+Im97dxzG98OnShIHIZbrlTCgSGOYzl8Y9pIhxGP7CPtMSOJ3Og7uC/8hsXieccAv2XKQGTt8Gohtm8bdxTN8K+rSC4mnrTStlcNW3Yts+4tKf+BI+5s1dYF84+yW9TvEAJ2IsMFems1bN0BQUDAa1eoAruryI3bfhzwzqUB4s8WKXdr0qeUHDi+euyJiDH/s+9iu3wcGGCLC+CePnwE/ODZK9Bk6nQ5FSxaQHBkypAMH70XzVqNru/B9iLVnUr12ZTlx43dQuL1888YtpM+YxuzgvSUMmGiPjkNxTEw08+bLibt3fRiF3GI1TQaE9+b1W/lBvomjZuCRGD+KlywkYm3/2WrzacVkj8bv+NHT5ZuJl4jJiW1tH476MVKKNoMiMpnPmDkjMmYK75ImT2ZT3e1b9yXd29vQmOSNBe/fG3fMYlOkSgadTgfOsouWKAg6P9Eh+vg8lHz8ZcLRs1sx5H+9Uax4QWEkiNm4s4uk2fIyiRkD6cmSJ5E6qdfnwSMxK33FaIMLNlwi4nNAOHXirNTJpd3MWTJhx7Z9Zio4ADOCvH6+vihQOA/slZPbK326jECRnJXEysAUiqNnv47ymkasiASLEW//7qPy3pq3ZsUmaySr8cREI965fR/svLR7u1cb+FnCwFRf2HpAWty4ccRszfDceX/lz7/g5OTEoE2XLLm37JgLFc0vn0veArnA1Qp3YVBT0DW2Gy5duMpg5JyFct65fQ/Zc2YVW22lpbFXvW4lMRNKCNaNyCUSKvVW1Bl+zIwxNK5jixUfho3OQn5I+3HiHHB2OWfhZGnkdO3TltEOO0vPxJZwluyZJHn/Htv1UjJZ8qyUwxKrFsc2RYzZniPS/qLSHzjS/g7uOyGz+ED0MfqQGb69NBN7J8STx09h64NhCRN5gfoyRvCM2Plzl2V+bt24K6+JEiWQZ6G4kqnRaBzQiJQMmmflmcSJ6wHRUcv2Rey9EibAvbsP4GWyumEJA4h/3CL+dfMC1KxXBbnz5hAxgJuHu7zSM+2D2G5TpU3JaJvOVpsvJyaTFNZWy08eP8fb/6yLNoPC942v6Fjv4pWYnYdF0xqteb3maFqnaTi3fvV6owpLslcuXpOz8ZJlihr5LAVevzZ8clej3RfLfQz/IWaXtSu1hOZa1OvKaHTq0Ro+Dx6ieN6q4GeTXzx/KeNNvWAEi07dfOBhxSTPtElzjTqpe+TA0P20twIfNrgXz16R1WE3a9ovoAU87ochbGP4eeYSM9l06VMZ7zmYXf3zb9grp1FABDh73rPjINiZiFsxyPqIdHTInd/QGBlnyfnct706ZEkmoehotHhvYQw+fGCiIzhIkjjbl4Ewni38LGFgKh62HpDmKwZS022ZdGJmFihWn0iz5Z49fS7Jdau2NnvW/KwzCe/evRNGcjoGLTthrOl0lkmMtVTOs6fOg7NzztaOHzmJGnUqizrojG1b9lLEvrOTpi0FlvJD/r1iVYKfN+dnxmnwNGlRF25iOZo0OpGkrEcMW3KWnoklPi3u5t+3ZbBAodzyasmzlaa1ckg9NupeZNpfVPoDbknodLbbX5CFemovTfZlXgk9ZXGtee1b9JKrXv2HdZPnzazxhY0n7mHj+CFAGhDZv84qSXHjx5F1Vt6EeNaeia+vH16L1WH2oaaO/WeIKCxhkDNPNnCLuE+34ahUogGmCqOX/NzK4ZXOK5EnL9J5J0mMh/cfybDm+Ystbb2Tef9uuc23BNv8yZCV1RzC4KeObDkMhi/D/0UXbQYFwQsWS2q8WnK2aJb4TePCynKGzf26EqWLyKVm19ix0LR1XbMDSqbyWpjWuY8wGPIXyoNvvi0to3mgrUX7BjL88uUrxIoVS2zbxAF/guptYT/s/h0f5M2fC6nSJgf3LSH+7dl5GByMuvVpD/7s0cXFRe7NlS5fVFBD/8KWI5RiPXTl0nWwQhctUQj/3rgtthPMjZw8Ii9sSDzspBezlQ1rtsJeOcdOGYyWHRrKcuYp8DVKly0G7gEyF1vW75TG2pCRvZAlewZwqbl7v3YkRdl5esZHrfqVUUFsr3Ar6eihE0adXCp//z4AdRtWl2nqncJXTWv4WcLAqNhK4Py5S4gfPx7qNakGHoLLkTOLMCbNOxdLohvWbpOzuHFThsJLGEg8+DhwZDdoB9gu/HEZKVMnB3/LzvpRtVYFcP9a08UzOjqdTtYP1hMt3vQatpw7tx0Qq2WxJcuMKT+DnSY7ay5Fy0g7niNp2lIRNj/k5YG+5CmT4E9h3NOIDQoKEvXGYBSSThwSihkv6xdxYFxU3EOfx+CWRoUqZWTbpU7W+dhurka19tK0VA4K26p7kWl/UekPItv+7KW5dctuuQI37kdRbxPGl+e72Gey/Jp78ugZOrXuK2/nLposr1HxbvxzC9xarFytLLSzaGH1WXomJ46eBs8t8Wf1bCM80Nt3aJewouHvRbtiZBKxGpM6XQp0E/0x700d2zwPUZatWFyemzp25JQpWZ5/c3V1lf2Ud0j/b6vNnz97WW6pdhdpMc1GzeqY6fuv3YTvtT8TBLp3HIw7t+9i+Ji+OHhqM7r2aod4YoAwzT6X7k3vGe7deSj8/PwwavxAefp4wtQRyJotM0mY99MSxI0XF7uPrEXXnu3E3uwzGW/qLVmwSjbMNVt+wSGRLmmvXrzGuJFTwUOcv6yYjsNnt+C7bq3lgEN6VN020RlQx8ql63gxc8FixWTekh/QqFltXPnzGm5eN8zkbJXT3cMN33VtJcs5+5dJCAwKxKQxM6Xee8JgmvHDz0ieMikWrfoJuw6vRZlyJSTN1AsOmdWZxm3ctVhiykNa3sL6P3FxB/grB43H3/8dBgzrgdETBuHNmzdYvng9TP9tF+WkscY0V2yYY0qyGbaGgSYUbGEKNV7sofIsTZ+BXTB9zjjJOnzAeHm15XEvedO6beDBy237V2LHoV9RtUZFMfsybI0N6j1a1Mv7aNuxKY6d2ya3z+KJOqXp5NkMnlXo3KONrCd9hnTWSFav3OcPEsY6B+6/rt4U9ddfLgFrAvZwt5amJVw0nfau1WpVwvrti3H03Faxf18KG9duhbZ1QtlVSzfgxDHnhgAAEABJREFU8aMnmLVgosQh29eGNkYanaW0S5YtLOsPnz95xk0ZJu87dmvOW/TtPgI68SzZdo8JbOs3riFWQUK7MHtpSiVWPFt1L6LtLyr9ga32p2EWZKHt2Utz9ZKNOLD3KMqUL45tB1ZjyepZ+CprhnBo0LgaO/JHpEyVHNpEgr+mYFt2d3NDuW9KyWfCX4JowmHzEySMS9ImjJ4heqdgjBjbXx6E56TL3/89STbdqMFTcO3K3+jQpYVsI0vXzkGJUoWkjC0M2E4o129od3Dbw8XFWcpo+YHIjZ/Y4iZ97OSh4ErI8oVrJY/mHd53An+cvYT+QsfmPctAY8Zem18vJnGckDDN+J7xNFX/yWtoa/zMis8GVO/bNihfrA46t+2PCsXrYOmCNcZSVCndCB2a9zHeawF2yBWL10f1Ck2lNV6ucC3wwCbpu7YeQPE836JN0+4omqcKqKOsoJOmuW2b96JCsboolKMiiuX+VouWB+9436z+d1K+WN4qWLfyNyPdXoAHzEoXrGWRLX3GtODsff3qbeHoP89agnrVWqNWpebQtm7IZKuc3TsMQemCNdGhZW9ULlUfxGP39oMUk444Fs1VBVzOblqnA7j9IwnC44Eult108BDR8q9GheYSF9I1V7pADUmjd+XSVVQsUQ+tGnUFl8u5LMp4zY0e+oM810HZBtXaadF2r9YwoCCfoaV6wPpTtWxj1K7cEi0adELJfNXB2QZlNMdVEm438SClFsfrmGE/yvpB/BrUaCvrAWfQpL18/hp1q7SS5WS9LF+kNniwlTTNNa7VwYjTpNEGQ06jWbvyvEv7Zr0kuVT+6mDdlzfCs4e7YIGlNIf0GYcyBWqSLF3XdgPBuiBv7HiVSjZA3aqt0L5Fb7CujP/fDDMJ/uy5evlmKPx1JVnWyxeuGenWnsnBvcclL5+/qZs9bbGU5SHo0qKNMN12zXuheL6q8H3rK2n0bKVJui1nq+5Fpv1xKzGy/YG19ndgzzGJD+sYy8Ild+LEMJ29NPt1G4mS+auBqxDVyjWRhxMpx+0r6iF+vN+yfpdMRztszbpHuqlr2aArWeXzXThnpQzTIw9/hs4wB3jWL6bZoEY7ORHbunEXSTYdf73SrG5nsG9mG2JeWZcoZA8DypGf7ZoyzA/xpGzVsk3A/qiCGCvYB5UrXBtauyVdc2xnWr1lP8p4W22ebdhUJ9NkPin3X3OfrUGhPSgODPxpndbItHh7Vx+xd3b69/PylHhY3ovnrshtg7DxjtxzNhgVedM0cufPgVWb54E/f92ycYcpySx868ZdcGZjFhlyY62c7Ih5op4zkhDWcJdLf1yB1qDCESMZwcNZpoNLJNWEE7OFQThmk4i7t++Dy9omUeA7FjgD23ZgpYz+dflGeTX1uK1E/LQVIVMawywn6yW353j/JbrbN++Bg8aHLpuWLp9BTKYdHe0vKv1BZNufrTT9/d7h9O/nLQ6k0Y1l1z5t5XuAJs/8n3wHDQ8As891NB22HbYhS4O+LR3kZ7u2xsOxIjJ9EOubtTYfWZ3W8vi5xn/2BsXnCrwj+eY+uc+DR/hp2gKMGzEtnAjPIFw6fzVc/KcYsXPbfuzdfSTasxYTGAS8fy/3638/dhp1xGoDO4toz7hS+Mkj8CW1v48B9p4dB8FtOjexVTJ/1lKUE6t1HyMfKs0Ph4AyKD4c1hFOiSsd3doNwqK5qyzK9vxuGGgxWyR+YpE/jJstf6cd3dmKCQw4e+Hy/9C+42FrphPdZVH6Pi0EItv+Pq1SfLzcsB316TIC3M7ltgNn+B8vN59eyh6uCT69TEUxR8qgiCKASlwhoBBQCCgEFAIRRcDd1RNfmlGhDIqI1gLFrxBQCHxEBFTSCoEvBwEaFYnjpYPmPFy9PuvCKYPis358KvMKAYWAQkAh8KUg4O4aX6xafL5GhTIovpSaqMqhEIgGBJQKhYBC4OMiQKPi4+Yg8qn/pw2KoiXzo9fAjuCbG00h5Fv4uvRqDe+QN6WZ0qI7XKh4PvnWxOjWGxF95SuVBL86GhEZ8vIrfMSJ4S/V8U2Ybb5rjD6DO8HFxfDyqpgsq1eiBOAb9yKbBvPIvCZJljiyKiIsFxNpZsiUBmnSp4xwXr40gci2zY+BQ0zUg6iU41PLD8vSol19+WZehr9E91kaFI1b1gbf3EZ39I+t+PW3+RHufOYsmojJM0bLN8flzve12bPl1xybtW6A7Lm+MouPiZuadSqjdftGMaHaYZ0Nm9VCy7YRz0PxkoXRtFV9h9OpVLUMVm/52WH+j83IT7xvP7gajVvURckyReDqGlWDwnqJ+Pp41uNt+1fKt/ztPb4+wnWa2j3iuKFeoxrIki0jbyPt8hXMaWxjbGd0h8/+ZlFfdKVJ5TRs2aaXr5+L1ZvmY8fh1YyOsvuU6t7abb+Ew5YTG0uFjGzbDKtLe5sqnyPxXbJmpujfsoRli9J9dNYDfvtj856l8lMGppn6WPXSNA9RCbds3xjVa1WMiopPWvazNCh0ep0EdUCv/4GviU6c2AtLfv0JXFmQBAe87DmzYd2vW1CtXFNMHGX+lr/Xr96ia4cBOH74jAOaFIujCKRInRypUqd0lP2j8zVoWlN+o6Vc4drgW/f4op2YylSPfu2ROk1KDO4zBvWrt0Es11jg64FjKj17ei+evwK+jXLLxp2StUv7AWjbtJsMx5SXNkMq9B/SDVcu/yXf4Mo3wB47fCpakvuU6l7PTkMktu/fvcdf1/6R4QWzl0dLOa0p0el08mujfCvsL/NWgB+aGzDU8LZLazIfM95FrAZ6J0kc7vMFH6NefkwcPre09Z9bhk3zy985L1+4Dn17/E/MHl3RvI1hthzPMw4W/zoDfAf98QvbsWTNT4gd8hEhxnOm5eLijFp1q4DhSTNGGNUuXTcL+05swMSpI5EjdxZjfIGieXD4zBZMnzdW6t1zfJ3Zx8iy58qCrftXgOlxBjDs+/Cv/TYqCxNwdoklZ2KcPXBGxq0EjYUflmK6nMEwr9Q/etIASZ67ZAqYFuXIo33zgESWc9Gv08GZLmXmL59qNLj4VcgVG+bKvFIuVZoUFDG6keP7y09SU+/2g6vkh4Q04qiJ/WX5mW71WpW0aJtXbhswnTYdmkAvjEGWg65912ZSjmmY4sX355O/dPmi4PcdyLts/WxjfqvWqiDl6JnizjyZ6mE5Kcd4loXPzBGjUz5rMRtv0KQWnJ2dwfTpWK+YZueerWQcde4+thbctmK85vad3IChY3pL7MmzfscijWT1WqJ0UTx6+AR8BTo/+nXi6Cmky5DGyG+rHvBjR8SLz3n2wklGGQaY58VW2gLpA0Z0A/M3Z/Ek+VzZZqrX+QZ8oyLfgunz4CHZcOHsZZi+UdRWmlIgEl7P/h0RFBSMTq37gW9w5dtPRwyYIDXlL5wbB09vAmeujOCKw4FTmxiUjm833bR7iawjxIFvOiXBXt1jfZi1cKJsR5Rbt32hcauTuO3/fb3UuWrTPMnD9qltSdmqe0zbWj1guYhtYFAQ3rx+I982yjerUoZ1doWNtkmeyLp3/u/lM5w3YwnOnbmITF9lMKqyVg/IYKu+26oHfAbjfhxKFdLxrb9DRhteH8+IFu0bgM+QbYRtlOkwns9x066lDGLCj8NlW5stVpQZ8THqJesc35p7XIwlzCvbfLFSBZgd6djHMn/sI46c+w3EUhKEx75815E1ckVq+6FVcHGOuVVOkdxH/4tWg0InBgtrJbJFsyajxduTPXn0LPjRmCxZM0mR6XPHyo/RLJ6/AgvmLhPWeFp07NZS0kYPn4J+3YdLfr69keHpU36G9m/S9zMxccx08BsO3PrQ4j3c3eASywWZs2bAlPEzwffNt+vUXJLZKc38eTxchFU9Qcju3nEA31avYDYQk9FaOVyEccMPVc38cT483N0xaHhPskvnHpJu7frVsGfnQUydNEcOPCS+ffMGP4p7rqZcuvAnWrVvIspqGIT4tb4sWTNj766DWL54LfjxmlJli1AMLdrWF4NVaqxZtRkH9h2Bp2d8GU+PRkmlb8ti3+5DGPe/H+WAOmJMf5LkF1a/qVwWZ0+fx+L5K+GdNJGMD+uFLefLl6/Rr8cI7Np+QOJOzOk2hHyb5O+/bqB8xZJGNW0FrtRxcN9xeHi4C1ydkUTMVn6YMBv8ImyfgZ0krz3cBwzvhvQZ0mLUkElikOqL34+dgZPOScpqHtPRwtr14rkrso6cP3sB/v7+Msz8cuWKH7lq3qYhbt28gx8nzoZep5ednibLq1vs2PL5/3X1b0wYNRV/XjJ/m6lOryObmYsT10M818fGuBvX/wWNL60O2qoH3fp2lF+LJT6Jw5z7sdUWmFiCBJ5IniKpqDfpxDNdgRVL1oKDOmm2nK00bclpNJ0FDFKlToEXz1+YfWRM4ycO/Aqkk97QZcWJF0e2UY3ed1BnuMZ2RffvBmNQn9HgR6JIs1f3uvRsg7z5c2L/nsNY+stq+QXKidOHU1R+8fL1a18cPnAcadOnxsKfV4j66AF+lMxe3aMCe/WAPGFdCxttMyyvtXtL2JryusaOJZ53Wvj6+RmjrdUDe/XdVj1ImCgBEonVYy0RL68E4Goy72kgd+rWGg/u+2Bo/7GYP3sp4nsaPqw1pN84jBk2mWzgagrb3mTRL8sIO56t/NgRNZLD4uek1+P2rbsynwN7j8I7/3cYOyXUUHL3cAM/iLhgzjJcvngVNetUAb8DRIWDR/YU9TIWZoq+/dmTF7IvY3xYp7PQHsLyfA73htYZDTl1E6CmSJlCzCDihtNmjTZszDCMGDcinCtSvLBRhzVZI0NIgF+y80qYQN59JQwLDtAecTzALz0+f/YClcQgSeK1y//g6MFTDMpBgWHOCGWE8PjmyYP7jomQ5b9ZUxfg12WbsWX9DtFYDAMqB0M3t9i4dvW6GMDS4OWLV/KTth06tzAqcRd726nTpUD8BOHxIdN3rfpg8c+rcXD/UaTPmIZRZm7D2q0Y3n88Vixaj6kT5klaj45DcezQSeTNlxN37/rIuNx5s8srvefPX4AfPZo2cR64vFq6XHFGo3jpwnjo8wj8qM3g3mPBd+xLgvCq164seTlj4rLozRu3ZH7ixHFHTbGiw8GmU6t+4AebLl24IiTM/yyVMygwCMSZH9kKDoYM8/6hj2EAnTtjsVxh4gE0aitcLD9On/wDlOM93fw5S+WbNn+cOAduwujyFgOnPdxFP0BR6c6KGdnAnqNBQ1BGCM9SXkW0/OAU8/fo0RNwFskwHfNTp2E1sqBjq97yWSxb9CtofObIHbqaRYZ/b95GhxZ9sXbVVgzq9T2jpLOWZixhrPr5+Useem/fGjr7REkS8tboNoSpB2nFNgHTHz96usRniRgUjcwiYKstCLLxr1v7gZg1dRFYV7as32WMtxSwl6YlGdM4axh4xHGHr6+h3Kb8joTje8aVxp2/wHDvjsP4fvhUKcZnxmdnrTkPdSwAABAASURBVO6VLlcMr8UqAZ/RjCkLhPH3l9nM/eqff4ETDyqbO30Jnj19Jtp9QmkA22vzlLFWD0iz5IrbaJuW+MPGudvoZ5Ik8wZnyft/34T48eNh9dL1YcURth7Yqu9RqQfNWzeQhmujWh3ADw7On7Xc+My4enPi2FmZtz8vXZP9hSPfFIpKfmRiwrOEH/vC9s16g2NKrjw5RN/5WPZXgt34d/L4GXDbatTQydDpdCha0rCCkSFDOmGsHpF9Oz90ZhQwCVhK04T8WQWjzaCITKkzZs6IjJnCu6TJk0VYnZOTE548eoIUqZLJB8oZXdESBUHHjtrH52GEdVoSOLjvhIx+8OAR9CFWZabM6WRcsuRJZHpM00fQOZuWBHpiIOXFkuOXRF8+fy1J3CN0dXUFl2plRIi3ZkXo8m5IlPxw2K+bF6BmvSrInTeHjHYTM3oZEJ7pa6PZUXuKTldEI2Wq5MLivsegdA9FXmVAeJwpCwCN5aCRdu/uA3glToA8+b6WS7SCTf5du/qPvJp5Nsppxmdyw698Pn/+As1a1wO3OThAzp252IQD0PbSjx74XcaXq1QC9nCfNXWhnPWPGNsfR89uxSyxtC2FNS8SefX2TgQaZy9Dntfxo2ektrTpUsmr5h09ZMindm+8WknzndhP5wCl8bm7x5ZBn/sGo0veCC9sPSgXsrJzVBiWgoyTx8/xIp2jbYHl4fahFHLAs5WmA+KAFQzevH4rjEVDuR3SY8JEQ1Mn2uOchZPldl3XPm1NqNaDcePGEbPkh0aGK8KAYF+iRfC50EjhCijjAgOCxGDiYrfukZfuqLV6QKIFZ6ttWmAPH2UFWzJytY2rdLOmLUCZQrWkAcl4zVmqB7bqe1TqQWLvhPJMR3S+jjsq+dEwsFQ33cQqMbfbuApdtkJx8LA2+WOHbKMzfP7cZV5w68ZdeU0kVmcSenvJVe2LIRMvfl05ICBA0s08G8/MjO8zuIk2g8L3jS/u3rmLV2J2Hrbc1mjN6zVH0zpNw7n1q0MtZ2uypmlwn12n0+HPy3/hvlhCI+2PsxdRu1JLo2tRL3oOIAUFBlK9mbt75768nzZprjE9pj1yYOh+9luBDyvbi2evJK+pxy0PV7EMybj0GdPK1Q1axbzXXNiBJWeebEibLjX6dBuOSiUaYKqYuZNXrw99pEFij5ZxYd2jh4/lFoIWnzBh6ItUaHi8fvXarBwsC/POFRh3DzdNDGnSpjSGtYCtcor9DtoqGqvZddvmPcicJZPYtmmE58K44LaDKUPOXNnkbc68hitXMOzhfu+OD6qXb4pq5Zpg9479yCuWtqvUKC/10LOZVzJYcM+ePZedhPa8uJVEtgf3H/FidM+evjCGTQPW0nz96o1x7578GYWRGhQUDN+3vrw1urD14GTITC5HzqySJ1uOTPJKz9G2wEGT/I46W2lqOngav3XHxuDZBy1Ou1rDgMvKnp7xhVERWsc0mdfC2GA4seikef0qSwZejG6vWJUoX6QOWjfpjju376FJi7rmesTSmOgijPxawNfXV6w4hNb/dOlTg6udGp111hg2CdirexqrtXqg0cNebbVNjZdniIht8pRJtCjj1Rq2ZHgu6uSwfuPlbDlsvSLdUj2wVd/t1QNOlNzFaiJ103mIFShe6V48fwmvhJ4MWnbBQTKefaMMOODZyw9V0BggdsSQ92GdJfx4toNnqcoWriX6kqbCaD8jxXS60L5WVC8ZZ+o9efhU1qUMISvONEyox5SHYUtpMv5zdKGIREPug0UHaE2NLZo1GS3emmyefDnAyjFqwiBwFWLpL2tAi9fnwUPkL5QH33xbWqooVa4IWrRvIMMx4e3ZeVhWnG592sufObm4uMh3S5QuX9QsOWvlINOwMb3lmYtSZYri3xt3GGXbhfSOSYSlz62UbiJt2wKh1BPHziB5yqQo800x1G1cDXHjxTESTxw9jQRenhJXloMHJPsO7SLpm9ZuB2dvbGB5Cnwt9g2zyfiwnrVyHhJ70TqdTmJD3aZyP89cAkFClmyZsWvbflOSDDdv0wCp0iZHx64t5QoBt67s4V6/WQ1wYHsotlb27Dwk9cSJ5yGvmmctrxo97HVviJ4R3/cFcW/UtLZ89hdCZihh+S3dW0rzwL6jSJjIC5WrlQWXbvMXyot/rt+0JG4Wx9Udznq6i+cv89OsjpEelbZAg4mHU1OkTC710TCgEcsbW2mSTte8TX106NJCrjrxPqyzhMEP42eLOqADf9LtJWZ4adKnxJjJA6XomZPnxdgejFYdGst2UqZ8CRmveayTHGD/vHhNfuEySBjTwSGDEnms1b3z5y7J5f96TarJ9wPkyJkFPiYrdpS15PbsdKzNW5LNkCkNiK2TXo+4cePKMMtLXlttk3S6rr3bSWyLFMvH23DOErbhmByM2GujvturBzw7lFpMOljebn3byb5DS3brlt3yftyPQ4VhEV8+06at62pkeSiXBkndhtURzzMO9E6GoSqq9bJQ0TwSO2JoTCxMICx+TiJtnU6PxGL7kYcxS5QuGkbC+i2NZG41sx9lH2+NM2ya1vg+9Xj9p55BS/nTwB85bgDaftdUdAAP0azed+B+Kfl7dx4qDAw/jBo/UJ6unTB1BLKKgYo0W44rHTzFu+vwWsk2bsowKd+xW3PZmTEyyKST4j3dqxevMW7kVCRJmhi/rJiOw2e34LturaF1EuSx6oRpyxkRO8glq2fBQ1jxc2YsDMdu2jmSyH1GHjzrN7S7fG+Bi4szo8W+pMGyF2qNeZYE4QUzUlyXzF8tD76xfH0HdRFYhe7djxo8BdTLwYDlWLp2DkqUKiSkAC6L8wBl8zYNMfuXSQLvQBnvqEcj4PpfN9G5RxuJUZ8hnY2inIH+8/e/Ms9htzvI5JUwAdZs+QU8E7B6xUZGidUw27gXK14APy2YKE/pj508VP5Eb/USg6xUEAlv/+6jOH70FMp+U1LinjS5N36augD+fu/MtHFAM4uwczN90jy5DcXtmVUbf0bA+3cY1Ht0OKlgC/Vv/Zqt8tAtt7/iexoOtmmCkW0LHFhnzB1nPHs0efr/MOuXiZpa2EqTTHHEQMnr0yfPeHHI3bx+G5PH/yQPVG/bv1K+h4ITAwqzbZ84dhrlvikFthM/v9A6S3q1WpWwfvtiHD23FeUrlsLGtVtlHSeNzlrdGz9qhtwb7zOwC6bPGUdWDB8wXl41Lzik3fA+WKyJB4l7R9u8pXowYdoIEFse8s6QKa0Mt2xnmPDYaptMn44/Keb1/v2HvDjkTMvgkEAIk736bqserFm5RRrbfKdI/UY15ERAywfb4YG9R1GmfHFsO7BaPtOvspqvOm0XRkfe/LnA/njFhjkyR1GtlwmF0U5Fvm8cP6szZ/pivHnzRvY/U2aOxrMnz6lC9FWGvpY3QWHapfbc58xYhHjx4oH9aKmyRSUe5P9S3WdpUCxfuA6FclSUrmiuKqhfta1x74oPigd4Khavj+oVmqJT674oJ5aqBvQYRZLRFf66kjxEY4wQgYN7j0udmm7tygOIB/Yck7SXIXvna5ZvlvdCTP5tWrcDxXJ/i2b1v0Obpt1RLG8VrFv5m6TZ8gb2GgOWoXi+qvL36LwyLU2GB5aYDz9f8w6U9GZ1O4sluCaoXbklqpdvJvPDzwSTVr18U7Rr2otB6SoUqwse4uSNj1ie5/Jdq0ZdUb5YHZTKX13INyUJPLRIvcSMh4i4XVBd6JZE4TWp1VGmV7dqK5QuWAvEUUQ7/Ne4VgeZT5aJh0JNBRMmToAb129Bw9iUVrl0A7mczfzy4KBGs4V79w5D5PsMurQbgFIFqqNp7e80MYeuQ/qMQ5kCNcPxdm8/GBWK10GHlr1RNE8VaJhrjMQkbJxGs3bl861bpRVYZ5vW6SCxNT0sbKseEEfmh8+zXOHaEl+tDtlrC/27/w9lRfsIm6/Tv5+XevicNMf6rfHZSpM86cUsPEisWHLVgfeOOg40bA8tGnSSbamiaMeaLHGvWbE5KpduiKplG8v8abRKJRuAdbJ9C/FMRJ8w/n8zNJLxaqnu0TCgLrYhplkyX3Vw5k0hvqOG7ZP9Ap8p42pVbIHenYYzCFt1jwyUsVQP6lRuJfOu4crrlLGzKQJbbZMMCcWWj7ubGx49fCIPKzLOEVejQnMQO2u81uoB+Yl7BSv13VY9OHvyAti3sF4Wz1sVdFofRL39uo1EyfzVwD66mtiWHNrX3JDjgfIiOStJrBpUa0cRRLVe8sA3Fc2cOp8Xhxy3n7mdxnZJHIgjnxnbLBXwOS+cs5JB6UjbtHanDHMrrmS+asa+nXWb/YokfoFetBgUnyoubJysgJz9fqg8ciZ08dwVcLk5ImmSn6sOvEZEjsv5pocvIyLLFQd2qJZkiNmp4+fkieawdKZ3++a9sNGRvm/Sug627F0OT7F/PuOHeVb1XPrjilyVsMRgDXe+z4Dl8A+zgmBJR0TiaPTwF0ERfV720mCdpRFgjy8snfnh8wwbr91Tb3S3BWtpxhNL1PzJ5O4d+ywah1qebF35zgs+07A89+/6gIfbwsbznnWSbYjhiDrWaaYZUTnyM5+RafOUteb4LC21zYpVDNu4k8fNtCYaI/F81tbqO2nMr7WEbdHYLlkv2Y9Zk49ovK38pEufBqxDu7YeiKhasF1Sd0QFOUljvYzuviKi+fgQ/F+0QfEhAFRpRB0B37d+uHrlLwzo9T8cOXDSTOH16zfl+yO4n2pGUDefLALsdDlrCzvj/GQz/BllTFud3bfzyGeU608nq+WL1rG5UvPp5DTGchKjipVBEaPwKuWOIMCtIS4jW+okOfvr2m4guIfuiC7FoxBQCCgEPmcE3vq/+GyzrwyKz/bRqYwrBBQCCgGFwCeFQBQzQ2Pijf/TKGr5eOLRZlA8exqMD+U+HlwfPuW3/s/x6OUN5RQGqg6oOqDqwBdeBz5nY4KjY7QZFFSmXPQiQGPijb/jP7uL3tSVNoWAQkAh8EkhoDLziSOgDIpP+AEpY+ITfjgqawoBhYBCQCFghsBnYVA0aFZTvvHQLOfqRiGgEFAIKASiDwGlSSEQRQQ+mkHRumNj+RbKExd3hLvOWRT6Rj6Wr2O3lqjTsCqDMe7ixo+DzXuWyldox3hiKgGFgEJAIaAQUAh8IQh8NINizcpN8u1h7Zr3ws1/bsnXPzNMN2LQJDN4u7QdgKkTrb/wyIw5ijcuLi7wTpLYsddmRzEtJa4QUAj8ZxBQBVUIfPEI6D9WCV8+fw2+PYyOb2UMDgo03vNNZszXoJHdceDUJvw0fwIat6jDKOn4DYj9v6+X32jYfmgVdh1Zg8Nnf0PVWhUknW/qW/zrDBw7v13yLFnzE2K7uUoav/i2bP1sHP1jq1wZ2XN8HfTOBhg27V6CTbuWSr4JPw6XOmeHrJZw5WLbgZVSH1dVdh9bC34ohsz28rN8/Rys+W0BDp/ZIuWZH9eQr4tSXjmFgEJAIaAhRPFPAAAQAElEQVQQUAh87ggYRtJPtBTLFq3FiEHj4aTXQ/tsMbPq5RUfsVxd5UeZEiTwBD+r/dDnEZq1qk8yps8dKz8wtHj+CiyYuwz8AA+3TUgcMLwb0mdIi1FDJsl3yP9+7AycdE4kYUi/cRgzbLIM/zJvBfp1H47J38+U9056PfjluKH9x2Jg71F45/8OY6cMlTR7+Ukg8psqTQrs2XUIG9ZuRaav0qNhs/DfiJDKlKcQUAhEHAEloRBQCHx0BD5pg4IfR+LbE98HBoQD6uWLV1j882rw63W7tu3Dn5euwiOOh+TjFykfP3oq7+PFi4vnz14Yv5oo7ALJQ+/smYsY2HO0/CAW77lacuLYWQaFvms4evCUfH87I/iBmPbNessvE+bKk0N+48JVGDWk0dnKD+mvXr3G8P7jMW7ENPALjCVKF2G0cgoBhYBCQCGgEPgiEPikDQpbCAcEBBrJ/Orbu3fv4ezihBSpkkGn08Hd3Q1FSxSUzs/PHz4+hk/9zpq6EI8ePgY/E3307FbMWmh+ANSoNEyAWyUHT2/CzJ/Ho2yF4kiWIonk0LZSrOVHMgnP58Ej4Rv+7ty+j7TpUxtulK8Q+PQRUDlUCCgEFAJ2EfhsDQog2GLh7t/3kfF/nL2I2pVaGl2Lel1l/L07PqhevimqlWuC3Tv2I2/+nKhSo7ykSS84SF5cXJzlVfM692wFZ2dnlC1cS8g2xcnjZyRJp9MgtJwfySS8hIkSCN/w5+2dCA8fPDbcKF8hoBBQCCgEFAJfAALaaPgFFMVQBH4i1ufBQ+QvlAfffGv41G+pckXQon0DyVC/WQ35TouHPo+xZ+chGRcnnoe80uPnrvlly7oNqyOeZxzonQwQOYkrjYfESRKChzFLlC5Kdoedp2d81KpfGRWqlEKSZN44euiEw7KK8QtHQBVPIaAQUAh8AQgYRstPtCD8lQZ/UeHu5oZy35SSv8pYuGq6PDehZTlYLAwECU/8aVHo3Xko/Pz8MGr8QCkzYeoIZM2WWdKLFS+AnxZMlL+2GDt5KP669g9WL9koaZq3fctusXKRC7sOr8WKDXNk9Jzpi/HmzRus2fILpswcjWdPnsv4YLGiEWySOINh80NGf/93GDCsB0ZPGCT1LF+8HuqfQkAhoBBQCCgEvhQEPgmDok3j7ihdsFY4TIvkrIRCOSqauZYNumJw77GoWraJ5CfPzt/243+DJqFSCcMqxF9Xb6Ji8fqoXqGp/CVHObFNMaDHKMnfvcMQVC5VH13aDUCpAtXRtPZ3Mt7UGz30B1Av025QrZ0k8VBm+SJ10LROB1QoXgc1KzaX+eL5DXv5oYIrl66iYol6aNWoK6jn6eNnjFYu5hFQKSgEFAIKAYXAB0DgkzAoYqqcPvcf4fTv58H3XJimwW2NU8fPwd/vnWm0Q2EaKy+fv3aINywTjZLLF66FjVb3CgGFgEJAIaAQ+OwR+KINik/l6ezcth97dx/5VLITvflQ2hQCCgGFgEJAISAQUAaFACGm/34YNxurlmyIcDIerqG/DImwsBJQCCgEFAIKAYXAB0RAGRQfEOyIJuXu6gllVEQUNcWvEFAIKAQUAh8DgWgzKBJ46fCh3McA6mOl6e7qicTx0imnMFB1QNUBVQdUHbBYBzxcvT7WEGWWbrQZFGZaP5cblU+FgEJAIaAQUAh85gi4u8YXq9kf36hQBsVnXpFU9hUCCgGFgEJAIUCj4mOjEJMGxccuW4TTT5IsMYaM6ilduy7NIiz/KQnUbVwNZSsWj7EsNWhWU75xNMYScFAx86E9syzZMzgoFXNsXfu0Raav0tpMgPnkq9xtMn0hRBcXF/QZ3AlsW44WSe+sR5dereGdJJGjIjHO55kgHtp811iWhWWK8QSjkADxq9Ogisxr5mzpo6DJcVHWadfYsRwXCMPZol19FCyWJ0ysutUQKF+pJGo3/Fa7/WSvn61BcfSPrfItmCcu7jBeo9p44sRxB79UWqZCCTRpXvuTeWg/L/sBbHARyVDLto3QsGnMlaFjt5ao07BqRLIUI7wZMqaRz6xarUooVCx/jKQREaVNWtRF0ZIFbYqUKFMUTVsZXsJmkzECxP7DumDCtOERkPgwrB5x3FCvUQ1kyZbR4QTZDpu1boDsub5yWIaMMYUBPwS4/eBqNBbPtmSZInB1dWFyn6zbdXgNeg7oDOY1bbqY/Qhh9TrfgG80XrTqJxw8tRlDRveKFC4t2zdG9VoVIyVrKmRvXKhUtQxWb/nZVOSzCDdsVgvs02Mus9Gj+bM1KNo27YEBvf4nUVizajPaNe+Fv6/dlPeR9a7/9S+a1e2E34+ejqyKGJHLmDk9MmRKFyO6I6u0S9sBmDpxXmTFo03u++FT5TMzff15tCmPIUWrlq5H22Y9olU7DeGIDNrRmng0K3v96i26dhiA44cNH+BzVH1MYdCgaU0EBgaiXOHaqF6+WbgX5Tmavw/Bx0lVnDge6NCyt8wr3yIcU+nyO0f9h3bHndt3Ub5YHezYuhfValYE8xBTadrTa29cSJE6OVKlTmlPjaJHEoHP1qDgGycv/XFVFvv+3Qc4f+YS+GEwLpsdPrMFh8/+hiPnfpPWKC3ogSO7Sd7l6+dgzW8LQJ7jF7ZjyZqf4OhSHZec9p/cKFdEDpzaBFrnVNpnSGfs/329/D7I9kOrsOvIGjD9qrUqkCw/Mrb41xnSktfSjO3mKmlcDt6ydxnWbV8o5TfsWGxskJNnjpR63Nxio0KlMjK84/BqKeeIlzptCmjlXLFhLrQ0y3xTTOaXqzvEhmmbLkmP/WEIWD7SKV+qXBFjcoNGdpe0n+ZPEDO2OsZ4BrjUOnH6CIk7ZYlV0ZL2Vw1Ypp4DOlKFdPz4GtNNmyEV4saPg20HVkpsqHP3sbXy42yS0Y7H776M+3GokWvV5nlmM6iR4/sb87r94Coj7kYBKwFuV/D5avkpVDyfGWeNOlXAmRKx/d+E/kZangJfg3Jb963CtDnfG+O1gK38cPl/5ca5sg4xXebXVSwx82N31Jktx1diiyCx1M97bdvFzd0Ny9bPlvmh3J7j68DnpKVp7WoP973H12P2ookyPbazASMM7Yv6uNzO58e6PnvhJEY57Jaum4V9JzZg4tSRyJE7i1GuQNE8oM7p88ZKDFgOrf3Zw4Af+bPW/pgA875+xyLMWTxJ6uZzo26ZpuhHGjSpJb80TFzpqI9yc5dMMeLKvHXs1pzR0hFja22B8rbyY6v9SeVWPD6ThStmSOqchZPBvNZrUk3ec5WFfQufCevmtHnfGz98SAZrGJBmzZWrWELiMmf6Irx68Rpjhv0gv7PUrFU9owif59S5Y7B5z1LZholTQm8v2dbYT7JOss90cTZf9bHVFoqXKQTq6TWwI1hGlmn0pAEyTWvjAresKNOmQxPo9TopR9n2XZtJOXrW0uSz0vr3VZvmyWfOPit1uhQUs+l69O8g02I5iTvrLw0xCtnq+9lu2WezbMx3qjT206LOj+2i1aDQiQdlrUC2aNZktPiIyHp4uMMllgsWzFkmxePFi4v9uw+hag3DcloCr/jgw9mz6xA2rN0q9rvTo2GzmpLXlkeru/+Qbrh75z5GDp6Iu7fvo9+Q7lLES+iM5eqKn6YuQIIEnrh29Toe+jxCs1b1JX363LHgKsPi+SuwYO4ysdqQFtwyIJH5SeydCM+fvcC0yXPhnTSRWNpqSJK4n4d+3Yfj/bv3+OPsBRke0NPwTRLJEOJZw4d52bfnENau3oJ0GVKjeVtDftzc3HDowHF06zgIU8bPRJKkiTExZLm8ZNnCKCu2fNZy1adZT/y6ciPev38fkhKwbNFajBg0Hk56PRJ7m58qHjyyJ7jMeur3c+jVeQj27zmCRIkSGmUZsJRXn/sPUalqWZKla9KyHt4HBuDm9dsyndu37mJo/7EY2HsU3vm/w9gpQyWfPS9hogRIlDg0j15eCZA45J6df6Vvy2KfqBvj/vej7BhHjOkfTmXY/Gb7OjOat2mIWzfv4MeJs6HX6THhR/OthqTJvLHw5xXymVWsUhbJUyaReq9c+ls+w727DsLd3V3GaZ69/MxeNAmp06bEpvVbJbZ37zyAi7Mzdm/dL3USoxcvXsow68ytf+9J1QOGd0P6DGkxasgk+V2b34+dgZPOSdI0T6fXaUHj1UmvB3Vaw93dww05c2eX7ezyxauoKYworaPs1rcjnj17jh8mzEZiK+cgLKXJxCd9PxMTx0xH7NiuiCO2IBlH5yEMI7brzFkzyDrLOtmuU3OS7GJgq/1RAdtJ8hRJRbtMB7bRFUvWIigoGBfPXZF4nhdtz9/fX4aJLVdQKPf2zRv8OGmOXE25dOFPtGrfROhIQxJstQVb+Slpp/1J5cKzhF9/sWK7eP5KQQX+N2SizO+e7Qfl/aQZI2XfskjUy0P7j6NQkXxo37kptH/WMNDovIZNM2361IzG2TMX5ZWfMgh4HyD6E0N9Z6SXlycKF80vP3MwVWB1+OAJUf/0Eh9XYRDP/HE+nj15ARcXZ7JLZ68tuIfUhdr1q2HPzoOg3kcPn0hZa97Ll6/Rr8cI7Np+QBo9fI50G1ZvkyK20kwgyvD6tS8Oiz6TZWbb9vDwQP3GNaSs5oXFh/F60bZWivrUqXVfrFiyDgWL5MV33VqQhARi3LDW97cQfTX7bK6+H9h3BJ6e8aVMWM9SmmF5PuS9ProScxMdTIqUKcSMMm44ldZow8YMw4hxI8K5IsULG3VYkzUyWAksmL0cL56/xNU//xJLcfvg5BTaib569RrD+4/HuBHT8PTJM5QoHToDt6IObToYGt/5sxeRLUdmXL54RTaCKjXKS5GXL15h8c+rZWXdtW0f/rx0FR5i6ZFELsU+fvRU3tPAofHAwYw0zXVq3Q/LF67D9b9uIvvXWWT0v//cwdGDpxAgllsf+jyW4bMnL0ia5rmLPWpayvEThMf9zeu3GNp3PCaOmoFHDx+jeMlCUmzrxt0YPnAiEnjGQ9r0aUA8kohBUBJNvBv/3MLUCcIiF3nQopmnfTuPyAFfi9Ou5SoUl4ZU9/aDceTASYwYMAGb1u3QyLCW19XLN8oGw3KQmQPViSOnGQS/f9K+WW8Qv1x5cgj9j8UetmF1RzJE0qteuzJoqFE/t5Nu3riF9BnTmA1ilvJbp2E1mWLHVr2xYtF6YWD9Cg5+OUxm0xf+uIy505egY4u+sj7UqldFyvi+9ZXP8PYtw2AvI0M8W/mJ5xkHKVImk8bP2OHTJLZtGneXS+/8Lg3ryCvRYfr7+Uv9vGfnTtV6kxbOjn9gz9HgYEwanaUyMp642MP95PEzYDsbNXQydDodipYsgLRiVYl4jB89HauWbMCSX1ZTnZmzliaZzp26iIP7jjFo0c0SRvuvyzZjy/odwlhMJHnsYeBI+6Oibu0HYtbURZgmtvK2rN8F7Xk9evQEgUFBRmyDAoPIjh4dh+LYoZPImy8n7t71kXG582aXmGdK6AAAEABJREFUV1ttwdH8WGp/VG4Nv5NHz4p+5y+yiG3bMzK/xIYR6cTgf+HcJVm+/t3/h7e+vij7TUmSzFxYDDSipTS9xIBI+rOnz3mRjhMBDxNDkJEBAQGo+21r2V4G9Bgl23CGDOnACQf7zM5t+5PN6Gy1BSOTCGwQE0L24ysWrZf9lIiy+sdnxnZx6987ok1CYsN79qsUspcmxxF+QoG8bNvPnj4T9S8hb6Vzt9IPTxk7G4vmr0aWHJkQW6w0c+ssc9aMUkbzLPX9xUsXFjg9wqTRMzG491j5vDR+7WotTY3+Ma4m3c2HTz5j5ozImCm8S5o8WZQyo+2nBwQEwt//PXxFR6vT6Yw6fR48MobviJWGtKKxGSOsBJIl95azlkLC2i5aoiDyFsgFrla4C0OKIkyLVzo/X3+8E6sKzi5OSJEqmexsaVVTjs5P5MfH5yFZpWPjpgxvaGyw4jHskAu2zmVaTuY1lZjhkrt67Yo4enYrhvyvN4oVLwiuWLiELDke3HtczKwvgocLdx9ZK7ditIGesraca2w3XLpg2IayyGclr+y82dBatW8EbsdwtsKVHOrg0t/B05sw8+fxKCsMFi7dMj52yJYRw5FxceJ6QDwY8HnQeSVMgHti68wrcQIY/1nIr7dYTaIh8jLkA3HHj56R7GnTpZJXelcu/82LdG/evEXufF/LsC3PVn6yZM8kRffvOSqvEfFmTV0ojckRY/vLZz5r4URzcQtlJIMjuJ8/d5msuHXjrrwmEitC5SoaBqmjYqBl5Mnj53gxd1bSNGeyfHdw3wlJeCDasF7M/uSNDc+R9kdxPtPLF64x6LDjFtqvmxegpjAYc+fNIeXcxAopA9bagr38ONT+Ioif3kkvJ1SXLoaW76HAL15880mITQwspPn48TMWFYkSeskrPRcnZ7x5/YZBo/v3xh1jmIGE3l5yFfnihSu8xVOhJ0AYHfJGeLbagiAb/9as2GQMRzVgL0325zTYtbElMCBITGxcQpO1gA+JYyYPBA/JtmnfFEWK5Rddjh40uEmjs9b3p0yVXKwQhk48+LzIb+aspGnG84Fvos2g8H3jKwbYu2Iv7VW4IlijNa/XHE3rNA3n1q9eb9RhTdbIEIkAl8I1MQ4QDx881m7l1V8YA3onJxnWPM0Kr1u1NWpXaml0a5ZvDmGx/HTv3zfMXP4QKxumci3qdQ2Rs38JRrBYkjfPjyb1VuDODv3Fs/C4eyXy1Njk/vrD+wZDqlOP1vB58BDF81ZFzYrN5UqOkVEEODMtmb8a5sxYhGTJk6Jb73Yi1v7fu3fvhIGYziqjrbxyVl+8ZGE0bFoLnG1fu/yP1NO5ZytRdmeULVwL1co1BWfFJOh05lU3WMDvLmYApGnuvVh+dTfZWvAwmTn5+vrhtVipMn0mDBNLTd5SfrmUz6V3V7FcS74cObPwggch2PImbfpQ48JN5Onqn6EGBumWnK383Pz7thQpUCi3vFryWH6dTheOdO+OD6qXbyqwa4LdO/Yjb/6c0FbVyGypjIx3BHemSV5Td/LYWXmbI2dWec0mZmYyYOJZS9OExWowSKzWWSMyPzqdOQaOtr93os1b02spPmeebOAvKPp0G45KJRpg6sQ5kk2vN9TLd1bagiP5sdf+IoofZ+fcwuEvomQmhZcwkReoRwSNf++sYEAG8rJtmPYz//5jqJe58xuMKRr5zmLr4v690MkSZV+/fs2L0T15+FQectXyQ+PVWWzfaQy22oLGw6vPffN+m3F2nagkYaqIFLGbppCTjFY8S/i4uLig3Del5Ao5+y+OHRTX6czrKOPCukdiRTlJksTG6IQmRpsWaSlNjfaxrobaH02pB4t9R2uqbNGsyWjxlmRZifMWMMz8UqdJgQJF84gtCBdNxOaV+1G16ldGhSqlkEQs9R89ZJj1aEK7dxwQ1qcryOMdsge8Ye026MWMaJzYv/cSMzEe8hk4shu8Elre29J08aAoB+/8hfLgm29Ly+hS5YqgRfsGMuyId18MCnnz50KqtMmhdw7/yCzhQ73x48cDD8iVrVgc3Nc/duQUo/Hy5SvEihVLbE/FQZPWdYSxkQjaPx4wZLn9/d7ht427xKpMINjgNbqtK42ClKmTg+/wYD55KJUHqExlrOV1+aK1iCdmTDlz58DB/aFL3k5Oeuh0erEXnxA8rFmidFFTdcbwo4ePULFKOaRJn1KWiwRuO6VOm1Lua3fr207O0hhPd+LoaSTw8kTrjo1lveEhxr5Du5Bk5sLmd+/OQ5I+4vu+SJ0uBRo1rS07xwshs3USc+f9GjnF0nfXPm1lmpvWb2e0TWcrPw/FdheNrApVysg6RGx52IsduKaU2CcUgwQPfpKuxfPAYr6COcXy6WOx32zIe5x4HhpZXsOWkZGO4k5eU3f+7GUEiNlm9z7tDfg0q2NKNoYtpWkkRjJgCYPoaH8WsxMyKCTxTijL2U2U15SPebHUFuzlx9H2F1H8OEDlFlszrAuNW9ZG3LhxcC7k7INpvm2Fw6a5d9dh+aw7dGmBeGJbbtiY3tDpdHIb0JYe0ng+p3S54mC7oxzjNGerLWg81q72xgWeHdPpdPI8GQd8TU9U0tR0hMUnMChQ9g2ennFlnzRm4iDoxRii8du6njh2BslTJpUrtnynUNx4cSyyh03TItMHjNR/wLSiNSn+ymDkOMPJXp6qnzF3HNJlSgVzgMXcXliWwcGGPU8tA/7+7zBgWA+MnjAIb968wfLFoSsiEP8Oi2XVP85eAn8StXnPMlnpeW5g07pt4KHDbftXYsehX+VBT2exVRAs0hBi8o/BIOGJP3lPr3fnofDz88Oo8QPlL0QmTB2BrNkykwRTWRlhwVuyYJUcmNZs+QWHTmkrIhYYzaKCRZr+6De0O8ZOHgpa4MsXrpUc835agrjx4oJbGl17tgPPkUiC8NJnSC2x4ankTbuWin36Nxg9dIqgGP54Ap40dzc30PpmmL+mIHVQ79HgFlLbjk1x7Nw2uaUST6RDmj13YM8xsT3lLxvc/FnLjOxzpi+Wz4hlnzJzNJ49eS5pwWGe6ezpi8CBcvWm+eAJdzKtWblFNujl6+eifqMa4JJucMiDGTV4Cq5d+RvsDA+f3YKla+egRKlCFLPp9u8+iuNHT8n9Zy53J03uLQ/j+gsDTBMMFh3JvMVT0LRlPXmGR1tt0eiWrvby07f7COhE3lmHiC0PhOl0oc131dINePzoCWYtmCix5+FRplOseAH8JOJ4Wpz14K9r/2D1ko0k2XRzHMA9KMwzCAoKkjrXr9mKHGLlhvjE94wn4xzxSpYtLNvHrsOGejpuyjB537Fbc2M7CZumqV5rGNhqf6byEQnzV2WsP2xfLKeLmJlTXsPAVlswz88OmPYH9tof04iMGzloApz0elkXuvfpIFcoJ4r9+cjo0mS48jHp+xlIniKZWNZfK/uDLRt3Imx919qcJscrVz/jxYsn212pskVlO2U8nb22QB664DD1j3HWxgXS6Jg3nlPr3KMN2O77DOnMaDiSZrBof5JZeMFi1TjI5F5EhfsjPps37EDBIvllX1uiVGHZD2t6tGs4QRGxZP5qcBucbaDvoC6yLxfRn/xfaI/0yWfVPINFc1VBoRwVzRwrCzv8wl9XkszVyzcDDyD9fuSs5JORwrty6SoqlqiHVo26onyROuAenog2+2vfrBeoh2n8dfWmpI0Z9iOK5qkif+PdoEZbFMv9rZz5De49FlXLNpE8RXJWAn/7/b9Bk+RSKCMpX7F4fVSv0BQ87VtOLN8P6DGKJAzpMw5lCtSUYXpd2w0EeRnW3LbNe1GhWF1ZBqapxdu6Mj+lC9RAheJ1ZDnLFa4t80qZXVsPoHieb9GmaXdZniqlG8ktBdJWLFqPUgWqo2OrPqhcuqHMy/2QA2eks3zExNS1bNCVJPBcQd0qrUBsedCqfJHa2Lpxt6Q54pXMV12W8e7t+0Z2Hg4sL55R0zodZFm4RcO02diMTCLAdMhHWuNaHUQMwAOspfJXl+UvLrZ36HiQjkQeTGxWtzP4LJjXauWagPWFNHuue/vBMi8dWvaW+C1dsMYowjpTumAt1K3aCrUrt0TzeuFXPdKJLRH+asAoJAL28sOyaHrbNe+F4vmqgocGhaj84zNi/pk+MdDOA3TvMASVS9VHl3YD5HNtWvs7yW/Ps4c701k4Z6VRDdPctHanvOdBMtN6RxoNRkm04fH8AHnDutnTFoPyjGcdowpuNfKeYc1Zw8BW+6Ms+4iyok0ybMmFbaMaD+tPNVFv+JyJPfOj1QXm01pbsJUfe+1PS9vaVcOJz8+U5/Tv58H6zz6vVqXmsq6b1h97GJjqMg2vX70NxfJUAesk+41RgyebksG+pUPzPmZxvNm74zBK5qsm5ViX2Z8TZ9LstQX2r8Q6bB9AWeohzdRxXCBNc+wfNDrrKuNtpcmt1oG9xoD1k/We/LUqtkDvTsMZtOnGjZiG0gVD+yD2yRoeLK+1vt9HbKGyTvJ58R0f7Meqi61Lm4l9AsTP1qCIKnZscFqnGxFdXLLkSXT+pDEicuRlJWHDfv36LW8/iGPHZq2cF89dke/uCJsRNlQOYJYMrbC8lu6J7anj58TqRvSVk50wy2IpPXtx1spPOT4L5pXbCrx31DEvrAesD5Zkbt+8B1PDiDzDx/aR74QoW6GkPPjKuLDOXn6ol7Nja+mG1cd7nvRnGU1XURjviIss7sTHFu6OpB0dPKY6YqL9sd6Efc6madpqC9byE9X2Z5p+2DCfCc/VhI2Pyj1n4qyTzHdE9HAQp5y1umyvLUQkLUd5YyJNtjvi7mgeTPkox3d8mMZ9yuH/nEHBn/7s3X3kU34mKm9fKAJv3vjK1bDJ42aCqxxfaDFVsRQCCoH/KAL/OYPih3Gz5e/j/6PPWxX7IyLA5VVuafE9Ch8xG9GYtFKlEFAIfCoIvPV/8dGz8p8zKD464ioDCgGFgEJAIaAQiEYEaEy88X8ajRojpyraDIpnT4PxoVzkiqqkNATe+j/Ho5c3lPvEMVDPSNVRVQdUHXCkDnwKxgTHl2gzKKhMuU8fARoTb/yfffoZVTlUCCgEFAIKgc8KAWVQfFaPK+qZVcaEhqG6KgQUAgoBhUB0IvBJGBR8jXGO3Flg+ua/JMkSo8/gTvIthrYKXKpcEfDbFLZ4Ikrjmwa79Gpt9gbJiOqIbn6+mbPNd40dwiS601b6FAIKAYWAQkAhYA+Bj2pQxPOMg1Wb5uHAyU2Yv3SqvA7+Xw+Z56zZM6FeoxrwiOMm7615TVvVQ7vOzayRIxXPzyY3a90A2XN9FSn5sEJrt/0i3/h34uIO47XXwI5h2aze84NY2w+uRuMWdeWbOl1dHXvFuFWFH4CgklAIKAQUAgqB/xYCH9Wg6D+0K1KlSYH+PUaieJ6qGDN8stkX1hx5FP8bMgm9uw5zhNVhntev3qJrhwE4fviMwzK2GHt2GiLfCMdXP/PVxxD61RYAABAASURBVHyr3ILZy22JmNEaNK0pX01brnBt+YY7vnzFjEHdKAQUAgoBhYBC4CMj8FENinwFcuPhg8fytbp8axpf3bv459VmkIyZPBj8fsSe4+tQvc43Rhq3Og6c2oSla2Zj4DDDqoZGXL5+Dtb8tgCHz2wBv2GwZM1PcA35OqQtGuWXrpuFfSc2YOLUkeA2DOPo+PEx6ps+b6zF/PAjXIfP/mZMj5/c5od4KMuv9PGNcIFBQXjz+g0Y5hv0SOO2zpa9y7Bu+0Ipu2HHYmTOlp4kyDSFzgZNaskvblI/XTxPw4diSpYtjL3H18tVD8bzo1xSUHkKAYWAQkAhoBD4wAh8VIPixLEz4HI+B/HaDb+F3il8djJmTocp42eCBke7Ts2N8Jw9fQEjBo3HQ59HSJTYyxjPQAKv+HLlY8+uQ9iwdisyfZUeDZvVJAm2aGSY9P1MTBwzHbFju4JbH4yj83B3g0ssF2TOmsFifrr17Yjnz15gyoRZSJY8ifxaaZy4HhS16ZifxN6JpOy0yXPhnTQRWrZtKGUunruCft2H4/zZC/LDWQzTcQWFWH0/aQiCgoNEfmbh7p174Ee5+PU+Kaw8hYBCQCGgEFAIfEAEwo/gHzDxiaOm49D+Y8iQMR36D+kGrkJUqFLKLAezpi4A3yy4Zf0OYTgkMtJePn8NfgGUg7gx0iTw6tVrDO8/Hvw4C7+mWaJ0ESPVFo3fZzi475iRN2zAUn4yZEojDZAJo6dh9ZKNWLxgVVgxu/edWvfD8oXrwC/hZf86i+Tnx3uOHjyFR4+egKsbDNPx3fn5CuWSBs4v85bLN392atNfytRuUFVelacQUAgoBBQCCoEPicBHNShev36LPl1GgF+wHDNsiix3z37mhxUP7jsh4x88eAS9XifDjng+gl/ju3P7PtKmT63dwhbNyGQlYCk/pSsUl9zHDp2W19Mnz8uro95bX1/5qVry00CK7RabQZsuTdqUkn7kwO/y+uThUwQEBCBpMm95rzyFgEJAIaAQUAh8SAQ+gkFhuXib1u3Anh0HkTCR+fZFUGCgZQE7sQkTJTByeIsthYcPHhvvbdGMTFYClvJz5MBxyV2gSC55zZk7q7zGpPfg/kOpPnfe7PLK7RlnZ2c8efJc3itPIaAQUAgoBBQCHxKBj2pQjJ0yGC07NETc+HGQp8DXKF22GJ49i54B0dMzPmrVrwxuoSQRs/ajhwwrHQTXFo30iLorl66Dv+DoM6gLSpcviuatG5ip4JYID1g66fWIGzcuGPYyMXjMmB28OX3iPIKCgsGft6ZKmxwjxvWTknt3HpRX5SkEFAIKAYWAQiBKCERQ+KMaFO4ebviuayvsPrIWs3+ZhMCgQEwaM1MWITg4WF556FAGwngbdy2Wv27ImTs7vJMkluH9Jzcaufz932HAsB4YPWEQ3rx5g+WL10P7Z43GX03wXRG7Dq+VrOOmDJN6O3ZrDnv5mT1jodxuGP/jcPj6+kn5tyHXCdNGYMbccfLMQ4ZMaWW4ZTuD0aHplQIR8Hi+Ys7MhUiRMhnWbPkFJUoXwWGxUsIzFhFQo1gVAgoBhYBCQCEQLQh8VIOie4chKF2wJjq07I3KpeqjYvH62L3dMMM+sOcYCuWoCB6+ZEnXLN8s7xmmq1Ghubwnj+ZKF6hBknRXLl1FxRL10KpRV5QvUgdPHz+T8fSs0Q7uPR5OJ3XPnrZY/rSVYWv5WbpgDYrmqoKS+ath47pt8r0RJ4+eZXKoU7lVOL1Txs6WtCF9xqFMAcMvUBjRtd1AEAeGNReWR4tfOGclSuStho6t+qB8sTro3Xm4RlJXhYBCQCGgEPi0EfjicvdRDQqiyZk2f1nx9MkL3kar47seLl+4ZlGnLZpFATuR85ZOwYoNczF93jh06NwCly5csSMRPWT+nPbsyQt49eJ19ChUWhQCCgGFgEJAIRAJBD66QRGJPNsV2bltP/buPmKRzxbNooCDketWbcGTJ08RJLZtBvUejXZNezkoqdgUAgoBhYBCINoRUAo/OAJfpEHxw7jZ8t0MltC0RbPE72jcts170aXNAHRs0Rf7dx91VOyD83m4hv765YMnrhJUCCgEFAIKgS8WgS/SoPhin1Y0FMzd1RPKqIgGIJUKhcB/GwFVeoVAOASizaBI4KXDh3LhSqEiIoQAjYrE8dJBOYVB2Drg4Wr+HpgIVSzFrBBQCPynEYg2g+I/jaIqvELgC0HA3TW+WMFSRsVHf5wqAwqBzxABZVB8hg9NZVkhEJMI0KiISf1Kt0JAIfBlIqAMihh4rtmqNUTiLF/HgGal8lNBIJa7BxJmzArn2LFjJEte6TMjlofhM/UxksB/W6kqvUJAIRADCOhjQOdHV+mdLTcazP/N6GpOW4nMFUNfHhWTGdQ56fF1zWbwSm/4YmhMphVV3d5Zc6HaxIXQu8SKqiqH5OvN3Wh8Jnw+Nacud0jOM20G1JiyFPV/3iLlU+Qr4pCcPaZKo36S+pgXzemdXeyJofyQKag1fTXKD5yE2jPX4JthU+3KOMLAulN+8GTUm7cZFQb/gFrTVsEzVXpHRFF59Cxo+BbpOMAhGcWkEFAIKASiE4Ev0qBI9nU+idHusX1w5KcxCA4IQM7aLaGLwNdKpYJIeMGBQWC613dvioT0hxVJXbAEYsf3QtD7dzGecGzPBNA7OePChiUSH2K0RzwfOPDPwysxnt25gZf3bklunwtn5DWqnkfCJHh49bwxPztH90BQwHu7am+dPChl1naug38O7UCCNBmRNEceu3L2GEr3+R7xU6bDsdljQd1nVs7Bi7s37InJVZJ3b9/g7tljkvfhtQvy+tE8lbBCQCHwn0TgizQoEorVgcB3/njy95+4c/oofK78Ab2TszAonOVD/qpKXdSZtQ71529BlbFz4ZXhKxlPL13JinLWSRpnsHUFXyox8JJWdfwC5G/ZlUHpav6wDLnqt5Zh1/ieqDtnA+oJV6LLUASI9CUhxMtavRG4UlK82zA5k6T+7DUbSyq3R2r+uFzOlnnNUKaKjE+Rt7DkZR7qzd0kZ6GUK9i6h6TrhIFUrPNgwbMJnL2XHThRDi4kcmbLvJTpPx6c8TJvmt4s39aX+UxfohL0Tk4yTN64SZNTVA6OcsYrZspM79ux82S85rknSiLLWmv6Ki3K7jV5nsKS5/rB7fK58Nm8enBPxtnz7p45joNThgpM/RDgL1wYbO3JW6JzVcbZNTbu/nECT29clXl6duMvS6zh4q7t2CD5A/z88PbJI0l/89hHXiPrpS5cGt6Zv8aBH4bi3h8nQd1/7dqE4CDDN21s6SXvnu/74EWIwXXvrOHrt7ZkFE0hoBBQCEQ3AvroVKgTA5w1fbZo1mS0+IjKxkuSAr7Pn0hxGgMp8xWTs1vOPtMWK4fcdVrh4Z9/4MTPUxDLIx7yNf5O8ibKnB0FWnTFs1t/S1qcREnhFMsVT65fFcaIDu6JvI0DCPfQXeN54uWDu1L2/du3ODxjFN4+eyIGgSAZZ+oly54Xrh5xkShjNlzZvgbXdm/Em0c+cPNKhDJ9xuKd72sc/3ky3j59hNz120rRZDkLiHSdcGb1POidnBDg74/n/15Hshz5Jb1Y5yFIkacI/j6wFWdXzUVCYUhlqVxX0lIIY0Tv7AL3BIlwatE0BIpViGyV64H/bh3fj0Mir0Ei7sk/V2SY969CBvhinYbAycVVlOd/ODZnAnzELJ5ymkuRpxCchO7goEAtyuyqs1APknxl+LR7zSnLpDGXt0lHMxlHbuJ4Jxf4PHSE1YzHUn6S5TSsYuWp3w51Z29E2QHjBdY6MzlbNwXb9sI3w6che/UmeHD5LDTsbMloNEv5yVyuGmgEl+g6TBp4NYSByS0pTcbkajWYSNStoMAA+Io6aJVJERQCCgGFQAwhEG0GhZuHG1KkTIG48eOGy6o12rAxwzBi3IhwrkjxwkYd1mSNDBYCseLEAwcfzq6LdhiA1z73sG/yIMmZr0kncDZ5btU8PBWD6d1zx8DZPIl5xEAeIGad+8YPwL/H9uLJzb8QFBgojIiHSPTV19CJ//fO/U5WJMtVSF7v/2G45+D84MJpuLh7CCPjtqSZenGFkUNdm3o3x4V1S3BuxTzcPLIHxb4bKA2QIzO/l/nhloBzLFe5auKVJpMYqG7jQcgS/+llP4n8BMD/9UvES5EGKXIXxq3fD+Jvsb3y4PwpYaDcR6r8xWWyHFyCg4Oxc2RX3Di8C28e3pfx9N4+eQgfMQjqY8XCnXMnhP7T0pFG5+TqindvXuHZzb9xW+g/tXA6o42ORs+98ydxZed6Y5wWcI/jhtTpUiB+AvN68OTmNZwUhs3ROePg9+IpMpWthtjxI/bWzlgecfDs33+0pBy6WstPkNgGu7hpGQ5OHY77F04icaYcyCgGdUeUuosVmuQ5C8IzdXqIB4I/t/7qiJjksZYfT7HVQeP18V+XcWzeBNBgzVm7uZRx1IufLBX8nj91lF3xKQQUAgqBaEVAH63aIqgsY+aMyJgpvEuaPFkENYWye6bNAJ1Oh5vCILi8ZaWc9bnEdoP/i+dihSEJnF1ji6s3Ko+ZK126ohXA2Ts1xE+VDo+uhu4/u8R2h/9Lw1dKk4kVBg7Qz28bBrQk2XKBKx5+Lwx0ytPFEoPe478vM2jmXIWRc/vkoXDnFTzFQKJz0qPiiBkyPyW6jQDTCfB9A4/ESfFYGD3JcxeUcU//uYY43snw/M4NpClUUupPLa5aWeKIGfx7sZdOQvxkqcXg+zfe+77lrdT10sewmsKIxF/lhE78vx9iEDFOc/+IbQnPNBnkQchKo34Cy6TReL17+hgOTR2BK79ZGEiDyRHeXdu+Dv8c3CEMlEM4IowncmQoXZkXhxx/UcH8+vx5ziF+I5OV/NwX2wqXNi7HfWGIHZ72PwSJmX2aQqUBo6D1wFuxvbGhW0Os6VgbEHUtd73WcPiflfzohXH35tEDHJo2EreOHxArMY8QN2lKh9WS0TVeAuO2B++VUwgoBBQCHxKBaDMofN/44u6du3j14lW4/FujNa/XHE3rNA3n1q8Onflakw2XSEhEMjFzZPD8ukW4uH4pLm37Fe4JvRE3WQqxJWA4K7GlX2usblvV6NZ1rksRODm74PUjw0xeJ5bt46dILTpow2qDV7rMeCdWBiSj8JKL7QjfMLNBrwxfgYPePTFICRbjH1dAdDod/jm80xinBTiQ0PAxzQ/Dr8RWioubu1hJOAfvzDnw7tULKcLVF58r5xFPGAw8p7G6TWg5KLd7TG/J5xrPE09uXJVhei7uHjA1dHhwlYbLizs3STZzpxbNkIPl5a2rET95GmT9tr4Z/asq9ZCjVlPjeQ1T4ltRD27duIsXz8LXA40vTZHSMvjk+p/ySs89oTfKD54snVuChIwyc8wvI+6J1QReTV2yXAWQrVpDeKXPbBotw47kh89H7+QsVpbuSBnNK9ljpMxPqpAzNFq8duWgD6vqAAAId0lEQVSqVLBYwXIWBqsWx2tE86MTBiXrjc+18xSXzt3LG35iJUfehHi28uMuVk30Tk54+NfFEG51UQgoBBQCHxaBaDMomO1gGwfIbNEoa8tFRNY7Y3Y52/R9+liq/EvMjIMRjMzla+DumWNypl+gZTdwsHaNEx95xV4+BzMyB/j7IUm23HKgLNljFPROznj49yWS4OziCiexuhHbMwHyt+gCyr64+y9M/3HQY1o8cGgan5wrDCIPj8KcRSCP75NHyFCiEuImSQ6eeeDPWzmAJQrZYuFMOkGq9Hjx4I4cMHXQ4d4fJ3DjyC5wayRzpdrQ6XWInzIt8jXvTJViBSYJ9E5Owhg5K+8TZc4upHS4f+GUvKfn4ZVYYsF0dWJAYxxdDmEoxEueEsGB7/FOrJIw7qnY+uCVLpYwTHLXaYnsVRshKCCQUeFc2OeVvWZj8KeernHiI3fDdshcrroYLJ/hwUVD/qggZf6iSJg+i3R+IatCjHfzSgTvrLnAcyNBQUHSwGGeSdNcwRbd5U91k+TIp0WZXcPmJ3XhUiBuLEvGclVRqvdoBAnDgAaoJkhasq/zy/w4ucSS0Ulz5DHUFzF4E9My/cfDKZYrbp08KOmaF9H8BAcGwVeUOclXucB0WSf1Tk64bLICxPiw+WF6zrFjS3y+qlCDt+AKlVf6zDKsPIWAQkAh8CER0H/IxD5EWvGSpZSDlZZWwDt/cF9ZDkgB73Hj6C54i8G69oxfwfcgpCtWAX4vn0v264e2y5l/nZlrkShTNhn3IGQQvrZ3M5zEsnSNyUuRIpfhjMfDEGOjyti58hcaOao1kQM332lQb+5GKU8vUYaseC+2HsIObKRdFNsyTsJQqfL9PHkYL1fdNmJwC0Cy7HnAQ3qUc/NMiCfXL4MDJrdZuH1z79zveHbrOnKL5fb687ag0siZSJQhG/gvuTBgeL0fcvYiqdAVLAyap2LLhPF0f25fC5EQmG79uZulUcL4TGWrofKoOfKXIV/XaIp/TxwQ2xShA2bSnPnJBhpfzIu8seNlKF4RxTsNkXh/VaGmXM7f9b1hJUUTTSwMQYZZXg6wDNMVad8PZfp8D6+0maDX62U4V/020P65iFUcrsawfHd+P6BF27ymzFMEeeq1Ad8lwQO5Ts4uOPLTaHlWRhMk1lr43rkTMpgwY1Z59qPa+AUo138CEmfODp5hMTVEIpMfKr/82yqwHMxTJvEMWBd5joc0Okv5YXyGslUlJpmFwcz7/E07o2TX4QwqpxBQCCgEPigCn6VBwVmZNbelfyts7tvSDEQehNzS37DPfXLBVPzavgb2jO+Hzf1aYW2nOgh6/07y86Dk+q71sW1YJ1zbtV7O4J+F/JTw1vH94NbI1iHtsbFXU6xq8y2ubl0j5bYObC/vGac5piGJwjv443Cs71JfhML/3Ti4Q+rdMaIrtg/vjF/bVcPd08dwfs0irPmuthTglfd/blqBXzvUlHH0do7shnXf1cHeiQOwvlsD7BDyjP9792aZH61cHPBWi60R0jTHclHXKlEOOs3YWd+1gczHzhHdsEakdXzuBE1EXm+J/X3yEzcZ4YC3qU8LqXPfpEFY27kOfhvYDm8f+5hJHpk5RuZ5XRfDL1E04t5x/WQ809Tc4emjNDK44qHT6fD3vt/wKuRXKkailcDRWePks983eTA29m4KpnlPGGim7DyMqqX37s1rSbq0YbnMP+vOztE95LM6Nme8pGleZPJDWT6zteJ57xrTUz7jU2EOwlrKD+VYB7V8atcNPZuQJFewrLUTndNn2fRluZSnEFAIfJoIfHa9ilsCb3AFwZpLX8qxg36Pr10Cf+0Q9rFwhvxSbGUkypTd7MwE+QL8/PDqfujBRsZFl3t++x9YOs9gTz9XYB5duQBt0LPH7wid+WB+HOF1lIc6H/75B4ihozKO8KUuUBKvHz3AmaWzHGE38vDZP7x8TqxemR+qNTJYCTD/rDs0yIItbPFFNj9ack/FKpKjKz+ajLVrzakrrLaVkt3/Z01MxSsEFAIKgUgh8NkZFH4vHmHHqG5WnekycaQQCRF6/NclXNuzKeROXpT3CSLAlZLfBoRugXzsLH5K+dlpo52cWDD5Y0Ol0lcIKAS+MAQ+O4OCs8LnN6/DmuMMMjqe0YV1S3B588roUKV0KAQ+CgIv792x2k78nltfmXnrb/hF0UfJtEpUIaAQ+GwR+HQMis8WQpVxhcCXgwCNiTf+T7+cAqmSKAQUAh8MgWgzKJ49DYYld/f+M1y7+U+0ukcvb0A5hYGqA9FfB5Qx8cH6XpWQQuCzRcBaxqPNoLCUwFv/53jjb31p1ZKMilMIKAQUAgoBhYBC4PNDIEYNCmVMfH4VQuVYIaAQUAgoBD4mAp9v2jFqUHy+sKicKwQUAgoBhYBCQCEQEQSUQRERtBSvQkAhoBBQCHzWCKjMxxwCyqCIOWyVZoWAQkAhoBBQCPxnEFAGxX/mUauCKgQUAgqBmEZA6f8vI6AMiv/y01dlVwgoBBQCCgGFQDQhoAyKaAJSqVEIKAQUAjGNgNKvEPiUEVAGxaf8dFTeFAIKAYWAQkAh8JkgoAyKz+RBqWwqBBQCMY2A0q8QUAhEBQFlUEQFPSWrEFAIKAQUAgoBhYBEQBkUEgblKQQUAjGNgNKvEFAIfNkIKIPiy36+qnQKAYWAQkAhoBD4IAgog+KDwKwSUQjENAJKv0JAIaAQ+LgIKIPi4+KvUlcIKAQUAgoBhcAXgUCMGhQergm+CJBUIRQCCgGFgEJAIaAQsI1AjBoU7q6eUEaF7QegqAoBhYBCQCGgEPgSEIiyQeHbOzPoHr28AUvujf+zLwEnVYYYRUApVwgoBBQCCoHPHYEoGxSfOwAq/woBhYBCQCGgEFAIRB2B/wMAAP//4CT8/gAAAAZJREFUAwDPt2/651ARwQAAAABJRU5ErkJggg==" class="kg-image" alt="" loading="lazy"/></figure><p>タスクが完了すると自動でチェックが付く仕組みになっていて、進捗が可視化されます。</p><p>必ず反映されるのが便利ですね、、！！！</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><h2 id="claude-code-spec-workflow%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F">Claude Code Spec Workflowで試してみました</h2><p>一方、Claude Code Spec Workflowは少し違うアプローチを取ります。</p><p>まず、コードベース分析から始まります。既存のプロジェクト構造や規約を理解してから仕様を書くという流れです。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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EogPAnEiqB8/ehxTJk01VPFRaeZJAiRAAiRAAiRAAiQQjwSYNQmQAAmQgCWBOBHULUtATxIgARIgARIgARIgARKIAQJMggRIgASSCgEK6kmlJVkPEiABEiABEiABEiCB2CDANEmABEggzglQUI9z5MyQBEiABEiABEiABEiABEiABEiABMwJUFA3Z0MfEiABEiABEiABEiABEkhcBFhaEiCBJEGAgnqSaEZWggRIgARIgARIgARIgARijwBTJgESiFsCFNTjljdzIwESIAESIAESIAESIAESiCRAnQRIwIQABXUTMHQmARIgARIgARIgARIgARJIjARYZhJI/AQoqCf+NmQNSIAESIAESIAESIAESIAEYpsA0yeBOCRAQT0OYTMrEiABEiABEiABEiABEiABErAnQDMJGBGgoG5EhW4kQAIkQAIkQAIkQAIkQAIkkHgJsOSJnAAF9UTegCw+CZAACZAACZAACZAACZAACcQNAeYSVwQoqMcVaeZDAiRAAiRAAiRAAiRAAiRAAiQQlQBdohCgoB4FCR1IgARIgARIgARIgARIgARIgAQSO4HEXH4K6om59Vh2EiABEiABEiABEiABEiABEiCBuCQQJ3lRUI8TzMyEBEiABEiABEiABEiABEiABEiABMwIOLrHqqCeO08g/AP8HXOMY1vT5o3x+huvWeZasVJFLFm+wDLM0+T51ttvoEiRwqrKr9SqiTJlSytzQtWkjZd/vQRffrMM0ucSajm9LVf5CuXwUrWq3kZP1PHiqu6z5k5X/WfSlAlReLm6HxYunYsaNatHiUcHEiABEiABEiABEiABEvCWQIwJ6vYFaNaiMRZ/MR+ffDoB8gK8aNk8e+84M8sgwTu130LDRvUt82zVtjn+OXDQMownns1bNkWPnu8bRrHyM4wQD47NWzXF2+++qXJu3aYFmjR7T5ljSgsKClJCUZWqlWMkSRlMOHXyNOrXboR/z5y1pRkbrGMjTVuBTQxvv/Mm6jesZ+KbtJ3jqu7tWnfCvDkLEJg7ENI/7am6uh9279qDJs0b2UehmQRIgARIgARIgARIgASiRcCloO6XLx0y18qNdMUzuZ3RW5pgkSJFCvz1504lAKdMmRLZsmd3O75dwFg3li1fBpkzZ8K8WfNjLK+ChQpAlFGC4i7KyC8xuckAiFl5rfwkTpv2LXH79m2EbN4i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EiABEiABEoh3AnEiqO/evQdhYWEoV75sFBWTBI4eOWqa3Nlz5039rDxOnTpl5W3qd/zJCe6mAeLQ498zZ3HyxOkoOcpMf0IqZ5QC0oEESIAESCDJEGBFSIAESIAESIAE3CcQJ4K6CINTJk2FkXK/qAxJAiRAAiRAAiRAAg4EaCEBEiABEiCBJEkgTgT1JEmOlSIBEiABEiABEkiiBFgtEiABEiABEohfAhTU45c/cycBEiABEiABEnhaCLCeJEACJEACJOAmAQrqboJiMBIgARIgARIgARJIiARYJhIgARIggaRHgIJ60mtT1ogESIAESIAESIAEokuA8UmABEiABOKRAAX1eITPrEmABEiABEiABEjg6SLA2pIACZAACbhDgIK6O5QYhgRIgARIgARIgARIIOESYMlIgARIIIkRoKCexBqU1SEBEiABEiABEiABEogZAkyFBEiABOKLAAX1+CLPfEmABEiABEiABEiABJ5GAqwzCZAACbgkQEHdJSIGIAESIAESIAESIAESIIGEToDlIwESSEoEKKgnpdZkXUiABEiABEiABEiABEggJgkwLRIggXghQEE9XrAzUxIgARIgARIgARIgARJ4egmw5iRAAtYEKKhb86EvCZAACZAACZAACZAACZBA4iDAUpJAkiHw/wAAAP//cigqGwAAAAZJREFUAwCerr6cu+TRygAAAABJRU5ErkJggg==" class="kg-image" alt="" loading="lazy"/></figure><p>その後、 <code>requirements.md</code> が作成されます。</p><pre><code class="language-markdown"># Requirements Document

## Introduction

ECサイトにおける「注文から配送までの流れ」のドメインモデル実装です。このシステムは、顧客の注文受付から在庫確保、出荷、配送、完了までの一連のプロセスを安全に管理します。

関数型プログラミングの原則に基づき、不正な状態遷移を防ぎ、副作用を分離し、将来的な拡張（キャンセル、再配送など)を容易にする設計を目指します。

**価値提供:**
- 状態遷移の安全性向上により、注文処理のバグを削減
- 副作用の分離により、テストの容易性とメンテナンス性を向上
- 型安全性により、開発者体験とコードの信頼性を向上

## Alignment with Product Vision

本機能は以下の観点で製品価値を提供します:
- **信頼性:** 型安全な状態管理により、注文処理の信頼性を確保
- **拡張性:** 関数型設計により、新機能（キャンセル、再配送）の追加を容易化
- **保守性:** 副作用の分離により、コードの理解とメンテナンスを容易化

## Requirements

### Requirement 1: 注文状態の型安全な管理

**User Story:** As a システム開発者, I want 注文の状態を型安全に管理する機能, so that 不正な状態遷移を防ぎ、バグを減少させることができる。

#### Acceptance Criteria

1. WHEN 注文が作成される THEN システム SHALL 注文を「注文作成済み」状態で初期化する
2. WHEN 「注文作成済み」状態の注文に対して在庫確保が実行される THEN システム SHALL 「在庫確保済み」状態へ遷移する
3. WHEN 不正な状態遷移が試行される（例: 「注文作成済み」から「配送中」への直接遷移） THEN システム SHALL 型エラーまたはコンパイルエラーを発生させる
4. WHEN 各状態遷移が実行される THEN システム SHALL 遷移の成功/失敗を明示的に返す（Result型またはEither型）

..... 続く</code></pre><p>ここまではKiroと似ていますが、おもしろいのは次です。</p><p>要件定義書が完成すると、専用のバリデーションエージェントが動きます。要件の完全性や明確さをチェックして、改善点を指摘してくれます。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><p>ユーザーストーリーのフォーマットに修正点があったみたいです。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><p>バリデーション結果を元に要件を修正してから、design.mdの作成に進みます。設計書でも同様にバリデーションが行われます。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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tafaYebQKK5ShLi9e/ai4wftIV8NFJE2rokJCZAACZAACSQzApwOCZAACZAACZBASiWQYCEqsQt8t3kb9SWzJYuWoUunj9Cp/Yc2uz6uhodj9IhxkC/iWffd46PemDF1FtatXa9+dG/ZvM3SLLtkLAUHmfZtO6kf6XIc0D6IoOLA5T+tkh/+iZmA3G/1OI+KJWbsx2ErIpN8yfBx9OWsDxFeRECULx/KDiQ5mmZvKwKLvI+O7vfSbUUsFRv5EqNep6c9u/exEXXksnQ5Qigiq4yv2zlL5d2X91rEPmc29vXy7NesXqvusLJvc1UeOWyM068x2vuKwCr/jpZpIql9G8skQAIkoAgwIgESIAESIAESIAESIIEkEHhiQlQS5kRXEiABEiABBwRYRQIkQAIkQAIkQAIkQAIkQAIpnQCFqJT+BDn/p0GAY5AACZAACZAACZAACZAACZAACZAACTwGAslciHoMK2QXJEACJEACJEACJEACJEACJEACJEACyZwAp/esEKAQ9aw8aa6TBEiABEiABEiABEiABEiABBwRYB0JkAAJPEUCFKKeImwORQIkQAIkQAIkQAIkQALWBJgnARIgARIggWeNAIWoZ+2Jc70kQAIkQAIkQAJCgIEESIAESIAESIAESOA/IEAh6j+AziFJgARI4NkmwNWTAAmQAAmQAAmQAAmQAAk8qwQoRD2rT57rfjYJcNUkQAIkQAIkQAIkQAIkQAIkQAIk8B8SoBD1lOBzGBIgARIgARIgARIgARIgARIgARIggdRPgCs0JkAhypgPW0mABEiABEiABEiABEiABEiABFIGAc6SBEggBRCgEJUCHhKnSAIkQAIkQAIkQAIkQALJmwBnRwIkQAIkQAIJI0AhKmGcaEUCJEACJEACJEACyZMAZ0UCJEACJEACJEACKYgAhagU9LA4VRIgARIggeRFgLMhARIgARIgARIgARIgARJIHAEKUYnjRWsSIIHkQYCzIAESIAESIAESIAESIAESIAESSIEEKESlwIf2306Zo5MACZAACZAACZAACZAACZAACZAACaR+Ak9mhU9EiPKotRkMZPA43oEn89qzVxIgARIgARIgARIgARIgARJIxgQ4NRJIxQSeiBCVnHmVye+GLm+6o1Q+U5KnmSsrsH2cJ34e7Jnkvp5EBy89Z16rrFeCozESsobHyczRHBJaV75CeSxdsTCh5oZ2NWvVQNv2rVXInSeXQ9uSpUqgUuVKDtv0yhYtm8E3s69eTJZpcP58T31eT5NL1ZerQMbLlTvQ5ToT8tylE2d9OnonjPo0apNxkmsQno/rvXbELCnrXrRsHqrXqJaULuhLAiRAAiRAAoYE2EgCJEACJPBkCTxzQlSdciaEvuyGt8olfeluJrOY5WZOnuyTeoTem1cxr1XWK8FRF24JWENimU18zwPf9fVAjsyORnz0utbtWuLQwcOWDsZPHIN5i2ZZypIZOLgflq1YJFnDkEcTn/KHBKP2a7VQomRxh7b1GtRBi9B3HLbplXXqvYWgoDx60TBt2aoFunX/0NAmMY0rvl6KL79dbhPe/6C9pYuxn49UbaPGDleprNXS+IQzieGSlKnMXzwbHd5vhwoVyyFHjhwuu0rIczfq09E7YdSnUZvLyT6iweN4zx7n83PE7BGXptx279qL5i2bqjwjEiCBVEeACyIBEiABEiABEngGCCRIjcmRMweeL1cWISH5nwEkCV/i2bBYtJoYhXZTohLu9BQt358ejbrDInHvgfNBn8QaiuY2IaefCT5pH59CV+b50siSxQ/zZy+wLGbr1m3IkCGDpSyZ4PzBOH36jGQNw7w5C/HpJ/0RGxvr1G7q5BkYPnSU0/bENoQUyA8JifUzst+x7W/06tnXEmZMNQtzg4cNRGCuQIweMQ6N6jXFrBlzEHHrllFXKa5NdkD5+Pjg094D0LljN2zftsPlGlw9d1d9OnonjPo0anM52Uc0kHdMwiO6P3Y3R8ySMsiiuYuQMWNGVKlaOSnd0DceAVaQAAmQAAmQAAmQAAmQwNMh4OZqmGovV0HllyohX768KF22FBo2ro9s/tlcuakdR6sHeGDbWE8Vvu7toXzK5jdh00hPrOjpgfVDzG3Le5jbxKBGSRN+GeqpjrxtHu2J4aHuUm0Jcz/0wBatXo7E/TbcA9KfpdFJZmgLd2zV5rF5lCeeC7IVR4zGk11TjtYgw3ylrUfWMbOTB0a3sp3jx3Xc1HgyT1mb2PVrbLaR/Kp+Hlg7yFPZTG7/cO3Sr6Mw8B0Pxey9WubHVVxbg/Sz7GOz74KuHhYmMua8LuZ66etCOBDjRGwxWoMRM2fjffC6u5qnb3oZGViozUvmGVrNPO+Xi5vw61AP9Wz/1J7F+7XN9WLd8mU35TtD46k////1fXjk8cXKlXD//n1cuHhJzFXYsHaDSl9/s7ZKs/r5IV26tNj0x5+qPHBwPyz/crHaDSRH+uo3rKvqXUUlS5XA4uXzMX7iaLR/v52NuRzZkr5WfrMMY8aPsGlzNl6NV6qrXVqFixSCf4C/ysuurcDAnMo/r/Zva8acqZA+Zb7vdWir6hMS3bx5EyePn7QE3adI0cL484/NFnHm5582YPOmLXqz07REqeJYsHiOYiZzlJ0x1sYLl86DzE+3mTh1vGo24uJqfc76VB07iWT8MeNHqtbhIwcrpvpxLdnRJPNRjVq05IsFECFTyxr+GfVZ0uCdMOzUSWPou82wYMlc9cxnzZ2GuQtnqTVUqlxReRgxk3n2H9hX2S9buRit2rRUPq7eM2XkJBJezt5ro7kEhwRjyvQJah3y/g4ZPsgyghEzGU/eL/EZPnoI5BkVLFRA+Tpbn2rUoqvh4bhz+w4qVqqglfhHAiRAAiRAAiRAAiRAAiSQ0gg8VAIczDw4f3A80clkMilhyoG5TVWPuu7IltGEzYdjsPtUDPx8zM3pvE3w0vSF4OwmpInTS0JymPDOS27w9zVhRKgHMqQFTl+JBbS/V0q5odPrbsp5TmcPlMhrgrtWvHANSONuQsFAW2EJdv/5ZzLh1dJucNPMIqOBoGxaJs7G1Xg9nKxB3GX88Fuxai1+Pg/7lLZ3qrir8e7eB2Rtsl4/bf1ZNR6Sz57ZpNYuXhUKmZDHak7ibx+2HYtR4wgLaatT3k2VTwkjrUJYnrsaiz8PxeBBFCBCVdtX3LUW4z9nazBiJj06Gy8sIhaXb8RqwpdYAdc0PlK+egvwywCMfNdD7ZKKuAu1fpljdU2cEuvMGkNhU1YTKuW9+Od6LDJ4S4s55M6dCxE3I8yFuFh+kN6+fRvlyr+gaqrVrKbSH39Yq9K7d+9izqz5GNB3sDrS17R5EwTmfHh8Sxk5iPbs3ovxYyYi7MpVZM2axcaiXfvWuHnjJmbNmIus2bLatDkbb8PPv2DYkJE4f+6C8pW8hAsXLir/wcMGwNPTE9OmzsTG3/5Ardo1ITtzVKOLqOKLFTFxyjhLKPpcYRQuXEh57dy5W6WJiXr16aE9vxjMnD4HFy9dUncv6YKZ9JM2rTdeebUGjh8/gSmTpuPYkWNSDSMurtbnrE/VsZNo5LAx+HLF16r183GTFN9fNvymyunTp0dGq51yXl5e8NHqVKNBZNSn0Tth0KXTpkyZMsHLKw3mz12EzH6ZcULjGRYWhvoN6igfI2bp0qdD0WKFsXzpChw9chSvxwmxrt4z1bGT6FGfn/h5eXtjUP/BGDl8DE6dPGUZwYiZ+N3QRFR5zwI0cdZLe0Zp06ZVvs7Wpxrjohs3biBnLrOQG1fFhARIgARIgGmepyoAABAASURBVARIgARIgARIIIUQcDOap7Mfwx4ecQqSgXPaNICmWeHmHWDct9F4uV8U4v5TSUwsUKVPJOatj1ZluVg7tJpJ+YgIMW99DNbujFFtIiRJRkQoSdtPjULd4ZGo1CsSP++OxSuaWDVKEznsQ9/G7qhV2iQu2H82FlU/jcQVTShRFVrkajyjNXSdHYXOs8xz17qy/L0dd/fUsYuxqNE/EscvaQu1tJozskGper9IHL5gbqtRws1wDWv+jtHEAU1E8zev5YUC5nTlJjOfD2dF4eC5WE2cMuH2PXOfOivziI5jZ2swYiY9ORtP5tNgZBREaBK77vOiIWWZf9OX3JU4JwKjcPluq3nuodXdxdQSbmjvS+XekXhraJTipzf4+maC/HDVy3p68MAh6JdxP/9CWVy7Fq43YczI8di7Zx+KFC2Ey/9cUfUhcbsuVMEg2qWJOBERtsJX9uz+8NZ+dE+bOgvr123AVyu/senBaLwD+w9CRDPZ1SV5CeL8QrnnIT/ARYjIFRiI27duIzIyCo3faSTNLsP9f//F1bBwSxAxzD/AvGPxevgNl/7WBiJgpUmTBiuXf6XW16NbL9Vc45XqKtWjs2fPYehnI7Dx19+VGGXEJaHrs+9TH8tZevjwEU28Oama5UiezlNVPGLkqk9H78QjDqXcbkXcwprVa9Xx0E2//6mJSseQThPMEsJM5rLq+9WYNmWW9r+ZJhQrUUz1KRwcvWeq0UmUlOcngp+bmxse3I/Ezh27IEcRrYeRedr/OxIxWP4dzZg2CyKefbXyW2sXlRc/R+tTjVp0/foNZMyoqdtann8kQAIkQAIkQAIkQALJmgAnRwLxCLjFq7GqkB+5VsVEZUV8EIfXn3fDko89segjW/Hq+m1pBXaeMAsnwQFAnmzm6ciOocHN3NXxPrHKlA5qR40IW1Ga9rP7lNlH2q5GxCoRp3oJE+zDG9rYz4eYRZtDmlAj9if+kdgcjMYTC1drEBv7UK6geTwRoqTtxD8P5yplCXfvm+tkR5WU03oZr0FspD/Z1fVSETfkyGyC9rsPe+I4zP7AA/pas2Yyj+9jtZtI/BMTjJhJP48yXu6s5nnpz2HrUTODrHa/JY/EiXMyjnW4ceMmfH19ratUfsP6X5WQkzVrFuTJkxu7d+1R9RKNnTAKU2dMVBeSFyteVKqQVhOSVOYRonIVyiuv/Xv3q/TA/kMq1aNHGS8or/mi84AAf7xQrqwKYVeuaILULb1bw3Tn37sw5LNhlnD61FlcvmwW3TL7+Rr62jfmCMyuqnbv2q1SiUQU848TtqQsQYQfSfVgxCUogeuz71PvOzWnUdHa/5jFLfC+9g86MjISHu7uSAizwwePKM8rly+r1C+zr0ofJUrK85s3d6EmhAEjxgyFHBNs0tS1gFpWE19lnnt375NE7VZUGavI1foya+uNsNshaeXOLAmQAAmQAAmQgCLAiARIgASSJwGz8uNkbsdPPDxmYW0iuy6sy47yA5ebL8r+6s8YREYBRXKZUD5OpBH7jJq4JKl+tO7SdSDsplmckHuNxF8PA5bHIDzud7mHO5Arq3g+DIt+icaE7+OH0V9H4/B5c5954o6/5fB76Gc0nlgNdLEGsbEPO46ZxyusrVfaCuY0CzCS14PsiNLzemq0BrHRd4d9VNdN/fDTxbjeDdxV+WJ4LF74OBLr98SIuU2IjjbPoVQ+c2rT6KBgxCwh4+ldprHSHsNumueVN8A8B3kfxO7mXYkfhgeRZn4Pa8y5s2fPOdwBIbswoqKi8E6zxvBM44l1a39WDrJLKigoDwYPGo72bTtZdmqY3NxUux7JZeXeXt560TDdv88sQAWHBCu74OC8KpUoIePFIhaye0Ts9XAlTjSaP3cRunb+2BLk6J9uk9j0yOGjapdNubgf/An1Dwu7pkwLFiqoUok8PT0gIqDk9RBxM+4fY1yFEZeErs++z7iuHymJjo5GOh/z/8CEFAhx2EdinrvDDhxUGvVp1GbfVUKYSX/2fnrZ0XumtzlKk/L85N9fm5bt0bN7H1y8eBENGtVzNIRN3a6du1T5uWJmcbhAwfgfwTBanzj7Zs6MixcuSZaBBEiABJInAc6KBEiABEiABEjAKQHbX+V2ZtfCrmL/voOQH3Z607//3sfqVWv0otN0zUAPtKjmjrNXY3HnvtlMdjOZc4CnOyCXUXd6TctolVsOx+KH7TFaDsiZGXjrBTd1EXn7V93R+EU3VS93Gklm2ceeGNvaHav6eaBpFTfIsbulG2NgH/63NQY/7TILG+UKmLCkuwfyxh1vk35cjedsDfmzmzCmtQdElJF+0npBlQc0cYeMKXVyj5Jcpp4vTniROqNgtAbxW/JbjCYuALnjdhZ9+5d5N8X5a+b1+Xib8F4td7xczMxKfPQgdzVJfmwbDzXPV8u4wWgNRswSMl7EXfOcRr/rrsYT9t9vN9eJADW/i/m5yZzW7TI/c8kbhb82/wW5R0aO9djbXTh/AVWqvYQHDx7gpC6eyvY5zVC+tOcfEIDWbc0XOmtVNn9hV8JQtXoViI1Ng4OC9B2pqarvtm6h7G0u8k7AeLLLI7NfZoRYiSO/b9wEEdJkfkFBQWrU196ojVKlS6q8q0j6kyN1etA/JHD40BFUfLECKlYqp7qo/Votl3e7yU6vmJgY1G9YV90N171HV+W75c+/VOosMuKS1PU5G9Oo/nr4dbxYuRL8/Pwgz8qRbWKeuyN/R3VGfRq12feVVGaO3jP7MazLSXl+DRvXh3wk4PSp0zh+7ITN/62wHsM6f+7sefVvtf37bdV7Ln1Yt7vKy3NNnz4dtm7b7sqU7c8oAS6bBEiABEiABEiABEggeROIr1rYzffQwUP45qv/QX4c/bxuA1Z994OdheNihrQmNNQEpO513CFH6w6dj8XfJ8xihHjcewDk0AQnTw/gzr+x+HpLNGSXz4INmuCiGcjxMLlvKdAPuBAntnSbE6V2RsndTVU1wSXA14QrcbuoNBeHf6cux0KC6ASFAk2QO4jEUHYluRrP2RpkF1e1YibodzWJqCbl18qacc76KQayPjdt0Ctxd1JFx5p3AsnY9kH77W9f5bB88bq5WgS9DXvMLEWgkjFkh1n7V91w38GOomFfRuNMWKx6DjLPmiVM6pJ3yTtag/CSoE0f9swSMt60NdFq/f7a85ExyhV0gxwtnPtztBLTigWZIDvbth2LxaJfzUKUeTXm9TmKd2zfCREYWrYJjdf815ZtMJlMkAu09caTx0/i2NFj6NylI6bOmACPuHvNYu1gL128DD4+6ZXNqLHDlfvkaRPw5bfL8VyxokqQkfyiZfNU25rVa1C0aBFlnzFTRlUnUULG+2nNz7h29RqGjxqs+teFp8kTp2vj+GPshJGqvpW2Rl+/hB21KlO2NIaMGGQJHT9oL9PBgL6f4cL5i+je8yPVZ9v2rbV1+qg2o2jRgiXIGZgT02ZOgghZWzZvxYH9B21c7BlKozMu0paQ9TnqU3wfJaz9cR0CAvwxc+5UZM5s5igCm3Vfjp67dbt93uid0G2N+rRvs97xI/mYGPO/Db0vV8xiYs3/bnR76/U5e890W0fpoz6/Wq/WxHSNs3z9rmq1l7Bm9U+W7o2YLV6wVBNz/dF3QG/8e+9f5XNf+39yqIwWGa2vZavmkHuwftuwUbPkHwmQAAmQAAmQAAmQAAmQQEojYFZOEjDry/9cxo3rNxJgaTaRC6ffHhqJdlOiUK5HJFp+HmVuiIuvRsSivFbfYnwUqvU1C0zSNPXHaHP9uEiEaj4vfByJEV+Zd//IRdevDorEG4Oj0GaSuV9dkBFfZ6Hx6Cg0GhUF6euVAZEqHbrS3KfReM7WsObvGNWH9GcdKn4Sqabg5Ql0mRWFjtOjkMbTLECd04QgWbPYvxx3cXu3OdGqnxlrbX9Uqk4cRHWHmeeuj6ObvDEkCipoXKRvGaPt5Ie85S6phiPN65e2ngui4WoNRszUWDKmk/HkmchF9DKWhCmrzaxlnfIutJ5onssHMx7OcdIqMwu54Fxfl326dMkXageFff1XK79Bo3pNMbDvYJumT3sNwHutO6Lje53RuWM3ZbN2zTobmy2bt0GOFol/rx6fqrYPO5ltpU4PLZu1UW2LFy5T/fTo1hutQ99T+T2796o2V+OFh4ereTSu30z5nTlzRvlt3rQZzRqH4qMuPdCzey80adAcvyXgR7bYmefXVPUn+cEDh6k+Jeretaeq79dnoErt1y429kF2O8r8+nzSX/mMHzPBxkTaHPVjxMXV+pz1aTOwg4JwlzXbN32vieXCptsH3RVvsdn0x2YbM0fPXQyc9Wn0ToifBGd9OmqbOnkGOrX/UJrU85Y7smbPnKuOkUqlETPhJc9J7CTYr8/Zeya2zsKjPj859tqpQxf0/qQfmjYKxSJNyNTHMGIm75DYy9zX/bRe7Qo8fPiIcnW1vnIVysX7UIByZEQCJEACJEACJEACJEACJJAiCCRYiHqU1ci9TyKCGPk6u5z6yEVY7ney95ddUPvOxNpXG5ZFxDIycDae4RqcdNjoRTfM7uyBBV094JseiNR0mEk/aJET+8dRLbuihMvj6Evvw4hZUsaTY4j6GIlJ5SttIjAkxufGjRu4evVaYlwSZKuLSPbGSRnv/LkLkMvG7ftMavnI4aOJ7uL4seOJ9hEHZ1yk7UmtT/p2FC5cvOSoOkXVPW1mj/L85Nih7AhMDNhBQ/pj9LgRGDi4H1q0bIbEvKMi2loLcYkZl7YkQAIkQAIkQAIkQAIk8MgE6PjYCDxRIcp6lhl3vAmfba/jzJVY/HEwBmv+TpyQZN1Xcs9/tjwK32+LgewMkqOGleJ2SiX3eXN+JEACJPA0CKxZvQ7Xr19HTHQsRg0fi0H9hzyNYTkGCZAACZAACZBACiXAaZMACaQuAk9EiIpaVwn2oVr1KqhesxpOLq2ILk3KY3qP8vFs7H1SannduIoY2LY8erQoh4ndUu86n8bzSV3/3LgaEiABIbD1r60YMXQ0hnw2DLt37ZEqBhIgARIggeRJgLMiARIgARIggcdO4IkIUY99lsmkQzlC4ht3+XFCppQ7T66EmDm0qfpyFXVkJVfuQJv2kqVKoFLlSjZ1NWvVgFxGLSEpY9p0ygIJkAAJkAAJkMB/SIBDkwAJkAAJkAAJkEDqJJCihKgZc6aqL4DJV8z0MHz00zvSUafeWwgKyuPyTShfoTyWf7kY4yeOUfMNbdXcpY+1wfzFs9Hh/XaoULEccuTIYd2Eeg3qoEXoOzZ1eTTBK39IMGq/VgslSha3aWOBBEiABEggkQRoTgIkQAIkQAIkQAIkQAIk8MQIpCghymQCrly+gl49+1rC+NETnhicR+24y0ed4OHhgevh11UXb9d5E/4BASrvKpIdUD4+Pvi09wD1xS/5mpa1j3xta/jQUdZVmDdnIT79pD9iY1PvvVs2C2Yh1RLgwkiABEiABEhjDa6QAAAQAElEQVSABEiABEiABEiABFI3AbeUtrz79x9AvtCkB/2LaCVKFceCxXPUDqRlKxZBdi/pa5MdRnLUTS8v+WIByjxfWhXFp//AvhCfZSsXo1WblqpeIvFZumIhVn6zDGPGj5Aql+G5YkWRJk0aRETcUp9ij3wQqXzefKu2So0imcuY8SOVyfCRg9WcqteopsolS5XA4uXzMX7iaLR/v52qS0iUN19eyE4yWYPs0nqvQ1uLW3BIMKZMnyDrU2HI8EGWNmZIgARIgARIgARIgARIgARIgARIgARSHYH/fEEpTojKkTM7Jk373BIKFiqgIPbq0wMxsTGYOX0OLl66pO5XCgzMqdrSp0+PjBkyqLxEXl5e8NHqJJ8ufToULVYYy5euwNEjR/H6mw8Fo3btW+PmjZuYNWMusmbLKuYuQ+7c5nuhwq6EoXuPrvBM46l8/AP8VWoUjRw2Bl+u+FqZfD5uEoYNGYlfNvymynt278X4MRMRduUqsmbNouoSEg0eNgCenp6YNnUmNv72B2rVrgnZdSW+sj4vb28M6j8YI4ePwamTp6SagQRIgARIgARIgARIgARIgARI4LETYIckQAJCIMUJUVFRUfjn0j+WcO/ePRQuXEjtQlq5/CusX7cBPbr1krWhxivVVeoq2rVzN1Z9vxrTpsyCyWRCsRLFkD27P7w1kWba1Fmqz69WfuOqG9WeIaNZ8BKBq0Kl8ti+dYeqFzFMZQyiw4eP4MTxk8pCjuQd2H9Q5fVI5hkREaEXXaYvlHseadOm1fo8gVyBgbh96zYiI6PQ+J1GylfEOTc3Nzy4H4mdO3apI36qgREJkAAJkAAJkAAJkAAJpCYCXAsJkAAJkECyIZDihCjZETR8yCjo4dzZ88gRmF0B3b1rt0olEsHFPyCbZF2GwwePKJsrly+r1C+zL8pVKK/y+/fuV+mB/YdU6iq6efOmMsmRIzv27zuAS5cuqfLt23dU+jSjoLzmi9UDAvzxQrmyKoRduaIJUrfUNObNXagJb8CIMUMhxxKbNDULVKqREQmQAAmQAAmQAAk8BgLsggRIgARIgARIgASsCaQ4Icp68no+LOyayhYsVFClEnl6euDGDbMoFB0djXQ+6aQaIQVCVGodObrke/8+swAl9yiJbXBwXklchnNnLygb6XPwwGHIH5JfleWSdZV5gpGM6e3lbRlBH3P+3EXo2vljS5CjhmIku6DatGyPnt374OLFi2jQqJ5UM5AACZAACaQOAlwFCZAACZAACZAACZAACSQ7AqlCiJJdSzExMajfsC6y+WdTdzMJ6S1//iWJ+nrdi5Urwc/PD++2bqHqXEUnT5xSx9jE3j8gwObycyPfQwcP4f79+zCZTJg9fwaeK1ZUmf+w6keVPsko7EoYqlavYvlC3+8bN0GOMrZu2xJBQUFq6NfeqI1SpUuqfMPG9ZFVY3L61GkcP3YCItipBkYkQAJJJEB3EiABEiABEiABEiABEiABEiABRwRSlBAVG+toCea6RQuWIGdgTkybOQkVX6yALZu34kDcHUtrf1wHOZ42c+5UZM7sqxxEuFIZLZJLzrXE8qe3rVm9BkWLFsHUGROQMVNGS7urzNRJ0yB9+PpmUqarV62BiESq8IjR5GkT1BcBRdgSse3Lb5dj0bJ5Nr0tXbwMPj7p1XxHjR2u2iZPnK6Jc/4YO2Gk8m/VJhS+fmYGtV6tiekaE/miXtVqL2HN6p+UT4qOOHkSIAESIAESIAESIAESIAESIAESIIFkS+CxCVEJWWHefHlRqXLFeCEhvmLzfrsP0L1rT8nGCyL2NK7fDH0+6Y9G9Zpi/JgJFpvvv/sBTRo0R7cPuqNzx26qfdMfm1W7+IivKmiR+OptixcuU7Y9uvVG69D3VF6+XqeZGf5t2bxNjderZ1/ls2DeIkN760bpX+ZgXSf5DzuZ5y1temjZrI00WYKMK0ftpL1Xj09V/eZNm9GscSg+6tIDPbv3UvP6bcNG1da+bSd06tAFvT/ph6aNQiFinmpgRAIkQAIkQAIkQAIkQAIkQAIkQAJOCLCaBJJC4KkJUbt370VkZCTKPl8mXkjKAux9jx87bl9lKV+4aL443FKRwMyZM2cSaGlrdjLuC3i2tf9N6fy5Czh96my8wWWnVnKaZ7wJsoIESIAESIAESIAESIAESEAnwJQESIAEUjyBpyZEidgxecJUOAopniIXQAIkQAIkQAIkQAIkkMoJcHkkQAIkQAIkQAKPg8BTE6Iex2TZBwmQAAmQAAmQwDNIgEsmARIgARIgARIgARJINQQoRCXiUbZo2Qy+cZedJ8Qtd55cCTFzaFP15SqQ8XLlDrRpL1mqBCpVrmRTV7NWDbRt31qFpIxp0ykLJEACJACAEEiABEiABEiABEiABEiABEjgcRJIUULUjDlT1Zff5Itxehg+esjj5GHYV516byEoKI+hjTSWr1Aey79cjPETx6j5hrZqLtUJDvMXz0aH99uhQsVyyJEjh41fvQZ10CL0HZu6PJrglT8kGLVfq4USJYvbtLGQYglw4iRAAiRAAiRAAiRAAiRAAiRAAiSQ6gikKCHKZAKuXL4C+RqdHsaPfvh1vMfzdJLeS5ePOsHDwwPXw6+rzt6u8yb8AwJU3lUkO6B8fHzwae8B6gt/27ftsHGZOnkGhg8dZVM3b85CfPpJf8TGxtrUs0ACJEACJEACJEACJEACJEACJEACJOCMAOv/CwJu/8WgSRnz/v0HkIvP9XD16jXVXYlSxbFg8Ry1A2nZikWQ3UuqQYtkh5EcddOy6m/JFwtQ5vnSKi8+/Qf2hfgsW7kYrdq0VPUSic/SFQux8ptlGDN+hFS5DM8VK4o0adIgIuIW2rfthMgHkcrnzbdqq9QokrmMGT9SmQwfOVjNqXqNaqpcslQJLF4+H+Mnjkb799upuoREefPlhewkkzXILq33OrS1uAWHBGPK9AlqfdI+ZPggSxszJEACJEACJEACJEACJEACJPDECLBjEiCBZ5ZAihOicuTMjknTPreEgoUKqIfXq08PxMTGYOb0Obh46ZK6XykwMKdqS58+PTJmyKDyEnl5ecFHq5N8uvTpULRYYSxfugJHjxzF628+FIzatW+NmzduYtaMuciaLauYuwy5c5vvhQq7EobuPbrCM42n8vEP8FepUTRy2Bh8ueJrZfL5uEkYNmQkftnwmyrv2b0X48dMRNiVq8iaNYuqS0g0eNgAeHp6YtrUmdj42x+oVbsmZNeV+Mr6vLy9Maj/YIwcPganTp6SagYSIAESIAESIAESIIFUTIBLIwESIAESIIH/kkCKE6KioqLwz6V/LOHevXsoXLiQ2oW0cvlXWL9uA3p066WY1nilukpdRbt27saq71dj2pRZMJlMKFaiGLJn94e3JtJMmzpL9fnVym9cdaPaM2Q0C14icFWoVB7bt5qP1okYpgwMosOHj+DE8ZPKQo7kHdh/UOX1SOYZERGhF12mL5R7HmnTptX6PIFcgYG4fes2IiOj0PidRspXxDk3Nzc8uB+JnTt2QY74qQZGJEACJEACJEACT4IA+yQBEiABEiABEiCBZ55AihOiZEfQ8CGjoIdzZ88jR2B29SB379qtUolEcPEPyCZZl+HwwSPK5srlyyr1y+yLchXKq/z+vftVemD/IZW6im7evKlMcuTIjv37DuDSpUuqfPv2HZU+zSgor/li9YAAf7xQrqwKYVeuaILULTWNeXMXasIbMGLMUMixxCZNzQKVamREAiRAAqmKABdDAiRAAiRAAiRAAiRAAiSQHAikOCHKEbSwMPM9UQULFbQ0e3p64MYNsygUHR2NdD7pVFtIgRCVWkeOLvnev88sQMk9SmIbHJxXEpfh3NkLykb6HDxwGPKH5FdluWRdZZ5gJGN6e3lbRtDHnD93Ebp2/tgS5KihGMkuqDYt26Nn9z64ePEiGjSqJ9UMJPB4CbA3EiABEiABEiABEiABEiABEiABEogjkCqEKNm1FBMTg/oN6yKbfzZ1N5Osb8uff0mivl73YuVK8PPzw7utW6g6V9HJE6fUMTax9w8IsLn83Mj30MFDuH//PkwmE2bPn4HnihVV5j+s+lGlTzIKuxKGqtWrWL7Q9/vGTZCjjK3btkRQUJAa+rU3aqNU6ZIq37BxfWTVmJw+dRrHj52ACHaqgREJkAAJkAAJkAAJkAAJkAAJkAAJkECKIZCSJpqihKjYWOdoFy1YgpyBOTFt5iRUfLECtmzeigNxdyyt/XEd5HjazLlTkTmzr+pEhCuV0SK55FxLLH9625rVa1C0aBFMnTEBGTNltLS7ykydNA3Sh69vJmW6etUaiEikCo8YTZ42QX0RUIQtEdu+/HY5Fi2bZ9Pb0sXL4OOTXs131Njhqm3yxOmaOOePsRNGKv9WbULh62dmUOvVmpiuMZEv5lWt9hLWrP5J+TAiARIgARIgARIgARIgARIgARJIEAEakQAJJJJAihKi3m/3Abp37elwiSL2NK7fDH0+6Y9G9Zpi/JgJFrvvv/sBTRo0R7cPuqNzx26qfdMfm1W7+IivKmiR+OptixcuU7Y9uvVG69D3VF6+XqeZGf5t2bxNjderZ1/ls2DeIkN760bpX+ZgXSf5DzuZ5y1temjZrI00WYKMK0ftpL1Xj09V/eZNm9GscSg+6tIDPbv3UvP6bcNG1da+bSd06tAFvT/ph6aNQiFinmpgRAIkQAIkQAIkQAIkQALJngAnSAIkQAIkkBIJpCghKiGAjx877tTswkXzxeFODZw0nDlzxkmLcfXJuC/gGVs9ndbz5y7g9Kmz8QaTnVrJaZ7xJsgKEiABEiABEiCB5EeAMyIBEiABEiABEiCBRySQ6oSoR+RANxIgARIgARJIEQQ4SRIgARIgARIgARIgARJIyQQoRKXkp8e5kwAJPE0CHIsESIAESIAESIAESIAESIAESCCJBChEJRFgcncPzp8PpcuUUiG5z9X5/NhCAiRAAiRAAiRAAiRAAiRAAiRAAiSQGggYC1EpcIUhIfnRqEkDvFyjagqcPVCiZHFUqFj+sc09Y8aMyOyXGSEF8qNAwZDH1i87IgESIAESIAESIAESIAESIAESSEUEuBQSeEoEUqQQlTVrFqd4SpQqjtjYWKftyb0hS1Y/TTjyfWzT3L1rD35Z/2uKZvLYYLAjEiABEiABEiABEiABEkiGBDglEiABEniWCKRIIapK1Zcc7u6pUu0l3L59G5GRkQl6hiVKFkPd+m+jYeP6eOvtN/B23TfRoGE95M6TS/kHZA9AnXpvqR1WUl+ocEFVr0fiW+b50hab2q+/qpoy+frizbdfV/02aFQPYqMaDKJ8wXnV2FmyZEH69OlVXsbUXYzmYtSm+yc2lXUH5ctjcavfsC5y5MyuyrLD6rU3XlXrE3bWu8+M1m7kpzpmRAIkQAIkQAIkQAJPlwBHIwESIAESIAESeMoEUqQQ5YhR9uz+8PfPhnVrdioyJAAABklJREFU1ztqdljn5eUNd3d37N61F95pvXE9/Dpu37mDwkUKKfsXX6yodhL9vWMnbt2+pY7NqYa4yMPDA8HB+RCu+W3bth3Xrl5TLdVrVIWbmxu2b9+B06fPIH/+YFVvFJ06eRq//74JtyJu4f6/91VeyrqP0VyM2nT/xKaenp7wSuNlcRNOaTzNZblzysPDE7/++jv+3LRZ43bDYme0diM/SwfMkAAJkAAJPCMEuEwSIAESIAESIAESIIFnkUCKEaLyBAWh6stVVHBzd1N3Hkm5UuWKkP/KVyyPs2fOSTZR4cH9Bzh+7LgSnM6eOY/wa+FIkyYN5Pifu4c7Du4/hJMnTlkErhIli9v0HxERgT82bsKZU2exfdsOBAbmhIcmUImolSljJkQ+iER0dDQqVCpn4+eoEHYlDA8iHyAqOgqSlyB2RnMxahPfJxG8vNLAZAJioqJx6eI/kON/Mo6rtTvzE18GEiCBp0iAQ5EACZAACZAACZAACZAACZDAf0QgxQhRaTw94O3lpQK0/zw8PFVexI0SJYtBdvBcvXoNefPlUbucvL29ERAQoFka/8XExlgMIjUBKCYmGm4mN/hkSK/qjx8/oVKJRFBK72Oul7KEC+cvSmIJGTNlUvl06dMjR84cKty5c1cJUqrhESKjuRi1PcJQCXLRhaeataqjfsO6eK5YUeXnau3O/JTzMxJxmSRAAiRAAiRAAiRAAiRAAiRAAiTwLBNIMUKUCEI/rf0ZEmKiY3D40GGV/3XDRnimSaN2NJUuUxJlny+rhCi5Z6lU6RL6s010evfufeUTFBSkUonkeNr9++Z6KUu4f/+BJJZwVxOdpLBn1278tGadJfy9Y5dUuwyxMbEwmUw2dkZzMWqz6UQriHinJQn6kwvfRdwTYz+/zJJYguyC+v5/P2DdTxsgd3IVKVpYtblauzM/5cyIBEiABEiABEiABEiABEiABEiABJJOgD0kcwIpRogy4vj39p34+stvLeHBgwe4du2aEqqM/Izarly+rMStIkXN90VVjDtad+7seSM3nDlzBjExMShZuhQyZcqobEMKhEDusFIFF5Hs6kqbNi2sxR+juRi1weq/O3fuICjvw8vHrZocZu/du4fceXKrtpJ2gl6RokVU/c0bNzTO4YqTVLhauzM/8WUgARIgARIgARIgARIgARJI6QQ4fxIgARJwTSBFClGyu+jY0eNOVye7eZw2GjSYYmMRa9W+Z/de+GTwUV/Ny5U7N86dO6fubrIygabC2BSlsO2v7UifPh1q1X5F+crOLK+03tLkMuzfdwB3795F9ZovK19dzDKai1GbPuC+vfuRJo2n6rNmrRp6tdP0+LET8PFJr+y9vc1zj407xhgSEqzq5Yt5efMGwfpZGK3dyM/pRNhAAiRAAiRAAiRAAiTgmgAtSIAESIAESCCFEEiRQpTsvDHiK8fG5MiekY20yeXiq1etkSy+WvkNLly4iJ07dmHV96tVnQgsUr/h51/w5Yqv8dfmbapej6RNjgzqZT09d+48vvnqf8pHjq+JnVxmrre7Stes/knNR8a8eTNCmRvNxahNOWvR+XMXIFykz/XrNmg1xn9HjxyzzEHmI35nz5ovgxc+Ut6w/le1C23vnn2WzozWbuRn6YAZEiABEiABEkhhBDhdEiABEiABEiABEiCBhBNIkUJUwpf3eCzDw68/ckdyfO2RnR04Gs3FqM1BV0muki8DGnXibO2u/Iz6ZBsJkAAJWBFglgRIgARIgARIgARIgARIIIURoBCVwh4Yp0sCyYMAZ0ECJEACJEACJEACJEACJEACJEACiSdAISrxzP5bD45OAiRAAiRAAiRAAiRAAiRAAiRAAiSQ+gmk0hVSiEqlD5bLIgESIAESIAESIAESIAESIAESeDQC9CIBEnhyBChEPTm27JkESIAESIAESIAESIAESCBxBGhNAiRAAiSQyglQiErlD5jLIwESIAESIAESIIGEEaAVCZAACZAACZAACTx5AhSinjxjjkACJEACJEACxgTYSgIkQAIkQAIkQAIkQALPCAEKUc/Ig+YySYAEHBNgLQmQAAmQAAmQAAmQAAmQAAmQwNMjQCHq6bHmSLYEWCIBEiABEiABEiABEiABEiABEiABEkj9BGxW+H8AAAD//8vXAaQAAAAGSURBVAMAMFgU3IUtpW0AAAAASUVORK5CYII=" class="kg-image" alt="" loading="lazy"/></figure><p><code>design.md</code></p><pre><code class="language-markdown"># Design Document

## Overview

ECサイトの注文フルフィルメントシステムを関数型プログラミングの原則に基づいて設計します。本設計は、型安全な状態管理、副作用の分離、拡張性を重視し、注文の作成から配送完了までのライフサイクルを安全に管理します。

**設計の中核原則:**
- **型駆動設計**: 不正な状態遷移をコンパイル時に検出
- **純粋関数**: 状態遷移ロジックを副作用から分離
- **代数的データ型**: Sum Type（直和型）による状態の明示的表現
- **Result/Either型**: 例外を使わないエラーハンドリング

## Steering Document Alignment

### Technical Standards
本設計は以下の技術標準に準拠します:
- **関数型プログラミング**: 純粋関数、不変性、型安全性
- **ドメイン駆動設計**: ユビキタス言語の使用、ドメインモデルの明確化
- **テスト駆動開発**: 純粋関数によるテスタビリティの向上

### Project Structure
プロジェクト構造は以下の方針に従います:
- **domain/**: ドメインモデルと状態遷移ロジック
- **effects/**: 副作用の定義と実行
- **types/**: 型定義とResult/Either型
- **tests/**: ユニットテストと統合テスト

## Code Reuse Analysis

新規プロジェクトのため、既存コードの再利用はありませんが、以下の汎用パターンを活用します:

### Existing Components to Leverage
- **関数型パターン**: Result型、Either型、Option型などの標準的な関数型パターン
- **状態機械パターン**: 型安全な状態遷移の実装パターン
- **Effect Systemパターン**: 副作用の記述と実行の分離パターン

### Integration Points
- **在庫管理システム**: 在庫確保・更新の副作用として統合
- **通知サービス**: メール/SMS送信の副作用として統合
- **配送業者API**: 配送追跡情報の更新副作用として統合

## Architecture

本システムは、以下の3層アーキテクチャで構成されます:

```mermaid
graph TB
    subgraph "Domain Layer (Pure)"
        OrderState[Order State Types]
        Transitions[State Transition Functions]
        OrderState --&gt; Transitions
    end

    subgraph "Effect Layer (Impure)"
        EffectDef[Effect Definitions]
        EffectExec[Effect Executors]
        EffectDef --&gt; EffectExec
    end

    subgraph "Integration Layer"
        Inventory[Inventory Service]
        Notification[Notification Service]
        Shipping[Shipping API]
    end

    Transitions --&gt; EffectDef
    EffectExec --&gt; Inventory
    EffectExec --&gt; Notification
    EffectExec --&gt; Shipping
```

### 状態遷移図

```mermaid
stateDiagram-v2
    [*] --&gt; Created: createOrder
    Created --&gt; InventoryReserved: reserveInventory
    InventoryReserved --&gt; Shipped: ship
    Shipped --&gt; InTransit: startDelivery
    InTransit --&gt; Delivered: completeDelivery
    Delivered --&gt; [*]

    note right of Created
        注文作成済み
        在庫未確保
    end note

    note right of InventoryReserved
        在庫確保済み
        出荷待ち
    end note

    note right of Shipped
        出荷済み
        配送開始待ち
    end note

    note right of InTransit
        配送中
    end note

    note right of Delivered
        配送完了
    end note
```

### 将来の拡張（キャンセル・再配送）

```mermaid
stateDiagram-v2
    [*] --&gt; Created
    Created --&gt; InventoryReserved: reserveInventory
    Created --&gt; Cancelled: cancel
    InventoryReserved --&gt; Shipped: ship
    InventoryReserved --&gt; Cancelled: cancel
    Shipped --&gt; InTransit: startDelivery
    InTransit --&gt; Delivered: completeDelivery
    InTransit --&gt; DeliveryFailed: markFailed
    DeliveryFailed --&gt; InTransit: redeliver
    DeliveryFailed --&gt; Cancelled: cancel
    Delivered --&gt; [*]
    Cancelled --&gt; [*]
```

## Components and Interfaces

### Component 1: Order State Types（注文状態型）

**目的:** 注文の各状態を型安全に表現し、不正な状態遷移をコンパイル時に防止

**型定義（TypeScript風の例）:**

```typescript
// 基本的な注文情報（すべての状態で共通）
type OrderId = string;
type CustomerId = string;
type OrderItem = {
  productId: string;
  quantity: number;
  price: number;
};

// 各状態を個別の型として定義（Phantom Type pattern）
type OrderCreated = {
  readonly _tag: "OrderCreated";
  readonly orderId: OrderId;
  readonly customerId: CustomerId;
  readonly items: OrderItem[];
  readonly createdAt: Date;
};

type OrderInventoryReserved = {
  readonly _tag: "OrderInventoryReserved";
  readonly orderId: OrderId;
  readonly customerId: CustomerId;
  readonly items: OrderItem[];
  readonly createdAt: Date;
  readonly reservedAt: Date;
};

type OrderShipped = {
  readonly _tag: "OrderShipped";
  readonly orderId: OrderId;
  readonly customerId: CustomerId;
  readonly items: OrderItem[];
  readonly createdAt: Date;
  readonly reservedAt: Date;
  readonly shippedAt: Date;
  readonly trackingNumber: string;
};

type OrderInTransit = {
  readonly _tag: "OrderInTransit";
  readonly orderId: OrderId;
  readonly customerId: CustomerId;
  readonly items: OrderItem[];
  readonly createdAt: Date;
  readonly reservedAt: Date;
  readonly shippedAt: Date;
  readonly trackingNumber: string;
  readonly inTransitAt: Date;
};

type OrderDelivered = {
  readonly _tag: "OrderDelivered";
  readonly orderId: OrderId;
  readonly customerId: CustomerId;
  readonly items: OrderItem[];
  readonly createdAt: Date;
  readonly reservedAt: Date;
  readonly shippedAt: Date;
  readonly trackingNumber: string;
  readonly inTransitAt: Date;
  readonly deliveredAt: Date;
};

// Sum Type（直和型）で全状態を表現
type Order =
  | OrderCreated
  | OrderInventoryReserved
  | OrderShipped
  | OrderInTransit
  | OrderDelivered;
```

..... 続く</code></pre><p>タスクブレークダウンは <code>task.md</code> として作成されます。Kiroと比べると、各タスクの目的（Purpose）や活用する既存コンポーネント（Leverage）が明記されていて、より詳細です。</p><pre><code class="language-markdown"># Implementation Plan

## Task Overview

ECサイトの注文フルフィルメントシステムを、関数型プログラミングの原則に基づいて実装します。実装は以下の順序で進めます:

1. **基礎型の実装**: Result型、Effect型などの汎用的な型
2. **ドメインモデルの実装**: 注文状態型と状態遷移関数
3. **副作用システムの実装**: Effect実行器と統合層
4. **ドメインAPIの実装**: OrderAggregate
5. **テストの実装**: ユニットテスト、統合テスト、E2Eテスト

各タスクは1-3ファイルに限定し、15-30分で完了可能なアトミックな単位に分解しています。

## Steering Document Compliance

- **関数型プログラミング標準**: 純粋関数、不変性、型安全性を遵守
- **プロジェクト構造**: `src/domain/`, `src/effects/`, `src/types/`, `tests/` の構造に従う
- **TypeScript標準**: 厳格な型チェック、readonly修飾子の使用

## Atomic Task Requirements

各タスクは以下の基準を満たします:
- **ファイルスコープ**: 1-3ファイルのみに影響
- **時間制限**: 15-30分で完了可能
- **単一目的**: 1つのテスト可能な成果
- **明示的なファイル**: 作成/変更するファイルを明示
- **エージェントフレンドリー**: 明確な入出力とコンテキスト切り替えの最小化

## Tasks

### Phase 1: 基礎型の実装

- [x] 1. Create Result type in src/types/result.ts
  - File: src/types/result.ts
  - Define Result&lt;T, E&gt; type with Success and Failure variants
  - Implement utility functions: success(), failure(), map(), flatMap()
  - Add type guards: isSuccess(), isFailure()
  - Purpose: Provide foundation for error handling without exceptions
  - _Requirements: 7.2, 7.3_

- [ ] 2. Create Result type unit tests in tests/types/result.test.ts
  - File: tests/types/result.test.ts
  - Test success() and failure() constructors
  - Test map() transformation on Success and Failure
  - Test flatMap() chaining behavior
  - Test type guards work correctly
  - Success criteria: All tests pass, types compile without errors
  - Purpose: Ensure Result type behaves correctly for all operations
  - _Leverage: src/types/result.ts_
  - _Requirements: 7.2_

- [ ] 2.5. Create type guard utilities in src/types/guards.ts
  - File: src/types/guards.ts
  - Implement type guards for Order states: isOrderCreated(), isOrderInventoryReserved(), isOrderShipped(), etc.
  - Implement pattern matching utility: matchOrder() for safe state discrimination
  - Purpose: Enable type-safe pattern matching and state discrimination at compile time
  - _Leverage: src/types/result.ts, src/domain/order-states.ts_
  - _Requirements: 1.3, 7.3_

..... 続く</code></pre><p>実装フェーズでは、カスタムコマンドを使ってタスクを実行していきます。こちらも完了したタスクにはチェックが付きます。</p><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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l4PpTxo1x7VrN3Tdpd/+gEsXL+u4sWGa9WbNmGtkYfiQUbqtOcMmsv2/7WZrJhat//NvqzTzvv9uGYZYvNmPeWzXuEFTjFdiENNGoKDV6fOuaNu6Azq0+wKD+w8ziiLsu3TqjhZN26BD285Y9etvEcojy6CFF8cRWT0pFwJCQAgIASEgBISAEBACQkAICIHXh4CMRAi8aQRiXYhKcCQRvH7whvthD7hccTMH0zVXc9wy3/2QB1J+7wW2e9PgyXiFgBAQAkJACAgBISAEhIAQeGcJyIkLASEgBIRADAi4xKBNpE3iH0oEn6np4TsiY1gYqfYMRtpi7zMtvYhQkP+EgBAQAkJACAgBISAEok5AagoBISAEhIAQEAJvKoEXIkS9qTBk3EJACAgBISAEhEAkBKRYCAgBISAEhIAQEAJCQAg8BwERop4DnjQVAkJACLxMAnIsISAEhIAQEAJCQAgIASEgBITAm05AhKg3/QrK+F8GATmGEBACQkAICAEhIASEgBAQAkJACAgBIRALBF5zISoWzlC6EAJCQAgIASEgBISAEBACQkAICAEhIARecwIyvHeFgAhR78qVlvMUAkJACAgBISAEhIAQEAJCQAjYIyB5QkAICIGXSECEqJcIWw4lBISAEBACQkAICAEhIAQsCUhcCAgBISAEhMC7RkCEqHftisv5CgEhIASEgBAQAiQgQQgIASEgBISATGqsAQAAEABJREFUEBACQuAVEBAh6hVAl0MKASEgBN5tAnL2QkAICAEhIASEgBAQAkJACLyrBESIelevvJz3u0lAzloICAEhIASEgBAQAkJACAgBISAEhMArJCBC1EuCL4cRAkJACAgBISAEhIAQEAJCQAgIASEgBN5+AnKGzgmIEOWcj5QKASEgBISAEBACQkAICAEhIASEwJtBQEYpBITAG0BAhKg34CLJEIWAEBACQkAICAEhIASEwOtNQEYnBISAEBACQiBqBESIihonqSUEhIAQEAJCQAgIgdeTgIxKCAgBISAEhIAQEAJvEIHXUogqUDC/FUJPT0/kyp3DKi86iWzZszqtnidfHhQvUdxpndgorFmrBtKlT2vuKl+BvOjVpzt4fubMKETatm+N8hXLRaGmVHmdCLys++xVn3OpMiVfyhDGThgFL29vfSzPpJ7o1be7jjvbsE2KZMl0lTbtWiFtujQ6nidv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EAJCQAgIgU+DgAhRH/E8rF7qjfcdafMRuxmVu5K2hIAQEAJCQAgIASEgBISAEBACQkAICIEvn0CEj1CEqAijEkchIASEgBAQAkJACAgBISAEhIAQEAKfGgHpjxD4vAiIEPV5nS/prRAQAkJACAgBISAEhIAQEAKfCgHphxAQAkJACESagAhRkUYmFYSAEBACQkAICAEhIAT+bQKyfyEgBISAEBACQuDzJCBC1Od53qTXQkAICAEhIAT+LQKyXyEgBISAEBACQkAICAEh8N4ERIh6b3RSUQgIASHwsQnI/oSAEBACQkAICAEhIASEgBAQAp83ARGiPu/zJ73/WARkP0JACAgBISAEhIAQEAJCQAgIASEgBITABxP45IWoDz5CaUAICAEhIASEgBAQAkJACAgBISAEhIAQ+OQJSAf/GwREiPpvnGc5SiEgBISAEBACQkAICAEhIASEgDUCYhcCQkAIfDQCIkR9NNSyIyEgBISAEBACQkAICAEhYE5A8kJACAgBISAE/lsERIj6b51vOVohIASEgBAQAkJAJyBbISAEhIAQEAJCQAgIgY9O4P8AAAD//8SL0oIAAAAGSURBVAMAuhICAZ4+4JoAAAAASUVORK5CYII=" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKIAAABbCAYAAABAti1IAAAQAElEQVR4AeydB3xUxfbHTwqE0HsJvUmvPlABpYoNlK5/GyCWZ/chiv0pKIjt2VAU0WcBBcT6EEURUaRL702K1EAggJAESP73N8lddjd35m422WST/Pgwt8zMOXPOd+bezZ7MTCLr1myYxkQGHAMcAxwDHAMcAxwDHAMcAxwDHAMcAxwDHAMFegzwuz/jH2ExBiKF/0iABEiABEiABEiABEiABEiABEJIgKpJgARIgARsAgxE2SR4JgESIAESIAESIAESKHgE6BEJkAAJkAAJkEBYEWAgKqy6g8aQAAmQAAmQQMEhQE9IgARIgARIgARIgARIwJ8AA1H+RHhPAiRAAvmfAD0gARIgARIgARIgARIgARIggbAkwEBUWHYLjcq/BGg5CZAACZAACZAACZAACZAACZAACZCAjkDBCUTpPGQ+CZAACZAACZAACZAACZAACZAACZBAwSFAT/I1AQai8nX30XgSIAESIAESIAESIAESIAESyD0CbIkESIAEskuAgajsEqQ8CZAACZAACZAACZAACYSeAFsgARIgARIggQJBgIGoAtGNdIIESIAESIAESCB0BKiZBEiABEiABEiABEggpwhoA1GV48oLExlwDHAM5JcxkFMvReoJMwI0hwRIgARIgARIgARIgARIoEAR0AaiCpSXATpzzz33SIUKFQKsnb1qV155paC9OnXquCrq06ePjBgxQqV69epp6+t0XnDBBXLppZf6yJl0msp8lBTAm169ekmXLl1y3TOnPsp1I/wazOptQfAhqz6zPgmQAAmQAAmQAAmQAAmQAAmQQNYIhDwQ1aBBA1m0aJH06NEja5blQe0bb7xRYG+om549e7Y88sgj0q1bN6lVq5Z/c5nuEXxq2rSpDBgwQNq1aydO/0w6b775Zrnrrrt8xEw6TWU+SnLw5v7775fRo0dnWWOwcrqGbr31VsE40JXr8hs1Ok8mTZokCxculGnTpumqafOd+khbOUwLCoIPYYqWZpEACZAACZAACZAACZAACRRMAoXSq5AHoh566CE5duyY/PTTT4USsL/TmAFVunRpGTZsmPTr109+/fVX/yqZ7l955RW55ZZbJC0tLVMZMtx0Pvvss/Kvf/0LVT3JpNNU5lGQwxcItDVr1izLWoOVy3JD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pivDhukoQztoE2dvW9auXqf8Rv7Pc35BMz4JMra8badPhRy6wabYsME7LZi/UGnHXyjEWPhx9hxlqz0bCoVu4wV1cjohYAImy5b8EZDq/fsPKru9fcO13ZcL5i/IVL4gw3cEc+E7lqrivHDBkoDatCs59R/GJux3GvMzv50l3uMA93hWoc80PqEPelEPCf7Z48ytj+KqV5P16zZAjIkESIAESIAESCAoAhQiARIgARLIjwRcA1GhcmrvifRNl0OlPxC9d55fQx7qUEf+eX51eahjLZmz/XAgYgHVsb+06ypjSZVTGf46l1O+nXcoIfCAoC1jOmO/IFN5bpfpuOS2HeHU3tEjR7XmuI0XrWA+KQjFeMjOmA/GHl0fIdDlHcTKJ11CM0mABEggnQCPJEACJEACJEACJBAkgTwLRAVpb46K/fxnghw6mSJn0kQe+mmrvP0H92rJUcBhquyvv/YI9uEKU/NoFgmQAAkYCbCQBEiABEiABEiABEiABPIzgUIdiNqUcFI+WLlX3lu+R3YcPZWf+5G2Z4HAwt8XyZEjR7IgwaokoAjwQAIkQAIkQAIkQAIkQAIkQAIkkE0ChToQlU12FM81AmyIBEiABEiABEiABEiABEiABEiABEigIBAwB6IKgof0gQRIgARIgARIgARIgARIgARIgARIwEyApSSQSwQYiMol0GyGBEiABEiABEiABEiABEiABJwIMI8ESIAEChMBBqIKU2/TVxIgARIgARIgARIgAW8CvCYBEiABEiABEshlAgxE5TJwNkcCJEACJEACJAACTCRAAiRAAiRAAiRAAoWRAANRhbHX6TMJkEDhJkDvSYAESIAESIAESIAESIAESCCPCDAQlUfg2WzhJECvSYAESIAESIAESIAESIAESIAESKAwEygsgajC3Mf0nQRIgARIgARIgARIgARIgARIgAQKCwH6GeYEGIgK8w6ieSRAAiRAAiRAAiRAAiRAAiSQPwjQShIgARJwJ8BAlDsj1iABEiABEiABEiABEiCB8CZA60iABEiABEggnxD4fwAAAP//4iOtrQAAAAZJREFUAwC/kT1e6ZnTKAAAAABJRU5ErkJggg==" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><h2 id="%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%8B">生成されたコードを見てみる</h2><p>「ECサイトの注文から配送までのドメインモデリング」という課題に対して、両ツールが実際にどのようなコードを生成したのかを見てみましょう。</p><h3 id="kiro%E3%81%8C%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">Kiroが生成したコード</h3><p>Kiroはクラスベースのアプローチを採用しています。Orderクラスが状態を内部に持ち、状態遷移メソッドを提供する形です。</p><pre><code class="language-typescript">class Order {
  private constructor(private readonly state: OrderState) {}

  // 在庫確保への遷移
  reserveInventory(reservationId: string): TransitionResult&lt;Order&gt; {
    if (this.state.type !== 'OrderPlaced') {
      return {
        success: false,
        error: `Cannot reserve inventory from state: ${this.state.type}`
      }
    }

    const newData: InventoryReservedData = {
      ...this.state.data,
      reservedAt: new Date() as Timestamp,
      reservationId
    }

    const newState: OrderState = {
      type: 'InventoryReserved',
      data: newData
    }

    const effects: Effect[] = [
      {
        type: 'SendNotification',
        customerId: this.state.data.customerId,
        message: 'Your order inventory has been reserved'
      }
    ]

    return {
      success: true,
      newState: new Order(newState),
      effects
    }
  }
}
</code></pre><p>このアプローチの特徴は、状態と振る舞いがカプセル化されている点です。オブジェクト指向的な設計で、直感的に理解しやすいコードになっています。</p><h3 id="claude-code-spec-workflow%E3%81%8C%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">Claude Code Spec Workflowが生成したコード</h3><p>Claude Codeは純粋な関数型アプローチを採用しています。状態遷移を純粋関数として実装し、状態と関数を分離しています。</p><pre><code class="language-typescript">// 在庫確保への遷移（純粋関数）
function reserveInventory(
  order: OrderCreated,
  inventoryCheck: (items: OrderItem[]) =&gt; Result&lt;boolean, InventoryError&gt;
): Result&lt;ReserveInventoryResult, OrderError&gt; {
  // 1. 在庫チェック
  const checkResult = inventoryCheck(order.items);

  if (checkResult._tag === "Failure") {
    return failure(checkResult.error);
  }

  if (!checkResult.value) {
    return failure({
      _tag: "InsufficientInventory",
      productId: order.items[0].productId,
      requested: order.items[0].quantity,
      available: 0
    });
  }

  // 2. 新しい状態の生成
  const newState: OrderInventoryReserved = {
    _tag: "OrderInventoryReserved",
    ...order,
    reservedAt: new Date()
  };

  // 3. 副作用の記述（実行はしない）
  const effects: [ReserveInventoryEffect, SendNotificationEffect] = [
    createEffect("Reserve Inventory", async () =&gt; {
      return success({ reservationId: "...", items: order.items });
    }),
    createEffect("Send Reservation Notification", async () =&gt; {
      return success({ notificationId: "...", sentAt: new Date() });
    })
  ];

  return success({ newState, effects });
}
</code></pre><p>こちらは完全に関数型のアプローチです。状態遷移関数は純粋関数として実装され、副作用は値として返されるだけで実行されません。依存性注入によってテストもしやすくなっています。</p><h3 id="%E3%81%A9%E3%81%A1%E3%82%89%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E8%89%AF%E3%81%84%E3%81%AE%E3%81%8B">どちらのコードが良いのか</h3><p>両方とも型安全で拡張性のある設計ですが、今回の課題に対する適合性を見ると、興味深い違いがあります。</p><p>Claude Code Spec Workflowが生成したコードは、確かに教科書的な関数型プログラミングです。純粋関数として実装され、依存性注入によってテストもしやすい。関数型プログラミングの原則に忠実で、理論的には美しいコードです。</p><p>ただ、実際にチーム開発で使うことを考えると、いくつか気になる点があります。まず、完全に関数型のアプローチに慣れていない開発者にとっては学習コストが高いです。<code>Result</code> 型や <code>Effect</code> 型の扱い、依存性注入のパターンなど、関数型プログラミングの経験がないと戸惑う部分が多いと思います。</p><p>一方、Kiroのコードは実用的なバランスが取れています。クラスベースのアプローチなので、TypeScriptやJavaScriptの標準的なコードスタイルに近いです。でも、関数型プログラミングの重要な要素はしっかり押さえています。</p><ul><li>イミュータブルな状態管理（`readonly`の使用）</li><li>状態遷移で新しいインスタンスを返す</li><li>副作用を <code>Effect</code> として分離</li><li>型安全な状態遷移</li></ul><p>つまり、「関数型の良いところを取り入れつつ、実用性も保つ」というアプローチです。オブジェクト指向に慣れた開発者でもすぐに理解できるし、それでいて型安全性や拡張性も確保されています。</p><p>今回の課題である「ECサイトの注文から配送までのドメインモデリング」という実務的なユースケースを考えると、Kiroのコードの方が現場で使いやすいと感じました。状態と振る舞いが <code>Order</code> クラスに集約されているので、コードの見通しが良く、新しいメンバーがジョインしたときにも理解しやすいと思います。<br/></p><h2 id="%E3%81%A9%E3%81%93%E3%81%8C%E9%81%95%E3%81%86%E3%81%AE%E3%81%8B">どこが違うのか</h2><p>両方使ってみて感じた違いをいくつか挙げます。</p><h3 id="%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E5%A7%8B%E3%81%BE%E3%82%8A%E6%96%B9">ワークフローの始まり方</h3><p>Kiroは「要件定義から始める」というシンプルなアプローチです。いきなり本題に入れます。</p><p>Claude Code Spec Workflowは「既存コードベースの理解から始める」というアプローチです。新規プロジェクトでなければ、こちらの方が理にかなっています。</p><h3 id="%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%A9%9F%E6%A7%8B">バリデーション機構</h3><p>Claude Code Spec Workflowの大きな特徴は、専用のバリデーションエージェントがいることです。要件定義書や設計書の品質をチェックしてくれるので、仕様の穴を早期に発見できます。</p><p>Kiroにはこの機能がありません。もちろん、書かれる仕様自体は十分に詳細ですが、第三者的なチェックがないのは少し心細く感じました。</p><h3 id="%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%B2%92%E5%BA%A6">タスクの粒度</h3><p>両方ともタスクを細かく分解してくれますが、Claude Code Spec Workflowの方が若干詳細です。各タスクに「Purpose」「Leverage」「Requirements」が明記されていて、なぜこのタスクが必要なのかがわかりやすいです。</p><p>Kiroのタスクも十分に細かいですが、どちらかというと「何をするか」に重点が置かれている印象です。</p><h2 id="%E7%B5%90%E5%B1%80%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B">結局どちらを使うべきか</h2><p>ここまで読んで、「じゃあClaude Code Spec Workflowの方がいいじゃないか」と思った人もいるかもしれません。</p><p>確かに、バリデーション機構や詳細なタスク定義は魅力的です。でも、実際に使ってみると、Kiroの方が使いやすいと感じる場面も多かったです。</p><h3 id="kiro%E3%81%AE%E8%89%AF%E3%81%95">Kiroの良さ</h3><p>まず、シンプルさです。「要件書いて、設計書いて、実装する」という流れがストレートでわかりやすいです。余計なステップがありません。</p><p>次に、スピード感です。Kiroは要件定義から実装まで、一気通貫で進められます。途中でバリデーションを挟まないので、テンポよく開発が進みます。</p><p>Claude Code Spec Workflowは、バリデーションでいったん止まって修正を求められるので、リズムが途切れがちです。</p><p>最後に、学習コストです。Kiroは機能がシンプルで、エディタ上でボタンを押していくだけで進んでいくのですぐに使いこなせます。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>どちらも優れたツールですが、使い分けが大事だと思います。</p><p>大規模プロジェクトや、複数人で仕様レビューが必要な場合は、Claude Code Spec Workflowのバリデーション機構が活きます。既存のコードベースに追加開発する場合も、コードベース分析機能が便利です。エンジニア向けのサービスだと感じました。</p><p>一方で、小〜中規模のプロジェクトや、個人開発、プロトタイプ作成などでは、Kiroの方が適しています。シンプルで早く、それでいて品質も高いです。特に、スピードを重視したい場合や、少人数のチームで素早く開発したい場合には、Kiroの一気通貫のワークフローが効果を発揮すると思いました。</p><p>（今回は関数型プログラミングという高度なお題でしたが、Kiroはもっとシンプルなタスク、例えばCRUD操作やAPIの実装などにも使えます。そういった一般的なタスクであれば、エンジニア経験の浅い方でもKiroを使ってプロトタイプを作ることができるのではないかと思いました。）</p><p>個人的には、Kiroの「シンプルだけど必要十分」なアプローチが気に入っています。AIツールは複雑化しがちですが、Kiroは必要な部分に集中していて、かつ使いやすさも工夫されているなと思いました。</p>]]></content:encoded></item><item><title><![CDATA[NotionデータベースをAIに渡して振り返りをしてみる]]></title><description><![CDATA[POSSEでエンジニアインターンをしている吉川唯音です。普段から「コードレビューでいただいた内容をNotionデータベースに入れて振り返る」ということをしているのですが、より効率的で、面白い振り返りを実現したいと考え、今回のアプリケーションを作成しました。

現状の課題感
 1. 振り返りの内容に偏りがある
 2. 副産物的な学習が少ない
 3. ぱっと振り返れない内容のものがある

これらの課題を、Amazon Bedrockを活用したWebアプリで解決しました。



アプリケーションのイメージ：

 * ユーザーが振り返りボタンを押す
 * Notionデータベースの内容を取得する
 * Bedrockに内容とプロンプトを送る
 * 分析内容をフロントに送る

使用した技術
 * Next 15 / TypeScript
 * TailwindCSS v4
 * Python / Boto3
 * AWS
   ・Bedrock (gpt-oss-20b)
   ・S3 + CloudFrontによるフロント配信
   ・Lamda (Serverless Framework)
]]></description><link>https://tech.anti-pattern.co.jp/notion-database-ai-retrospect/</link><guid isPermaLink="false">Ghost__Post__69036f6771fa390001b34854</guid><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Thu, 30 Oct 2025 14:15:09 GMT</pubDate><content:encoded><![CDATA[<p>POSSEでエンジニアインターンをしている吉川唯音です。普段から「コードレビューでいただいた内容をNotionデータベースに入れて振り返る」ということをしているのですが、より効率的で、面白い振り返りを実現したいと考え、今回のアプリケーションを作成しました。</p><h2 id="%E7%8F%BE%E7%8A%B6%E3%81%AE%E8%AA%B2%E9%A1%8C%E6%84%9F">現状の課題感</h2><ol><li>振り返りの内容に偏りがある</li><li>副産物的な学習が少ない</li><li>ぱっと振り返れない内容のものがある</li></ol><p>これらの課題を、Amazon Bedrockを活用したWebアプリで解決しました。</p><p><br><br>アプリケーションのイメージ：</br></br></p><ul><li>ユーザーが振り返りボタンを押す</li><li>Notionデータベースの内容を取得する</li><li>Bedrockに内容とプロンプトを送る</li><li>分析内容をフロントに送る</li></ul><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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gAIUoAAFKPA5BVg3BShAAQpQgAIUoAAFKEABClDg/QIMgLzfKHbnYOsoQAEKUIACFKAABShAAQpQgAIUsHwB9pACFKAABShAgQ8WYADkg8m4AAUoQAEKUIACn1uA9VOAAhSgAAUoQAEKUIACFKAABShg+QIf20MGQD5WkMtTgAIUoAAFKEABClCAAhSgAAU+vQBroAAFKEABClCAAhT4QAEGQD4QjNkpQAEKUCA2CLANFKAABShAAQpQgAIUoAAFKEABCli+AHtIgY8TYADk4/y4NAUoQAEKUIACFKAABShAgZgRYC0UoAAFKEABClCAAhSgwAcJMADyQVzMTAEKxBYBtoMCFKAABShAAQpQgAIUoAAFKEAByxdgDylAAQp8jAADIB+jx2UpQAEKUIACFKAABSgQcwKsiQIUoAAFKEABClCAAhSgAAU+QIABkA/AYtbYJMC2UIACFKAABShAAQpQgAIUoAAFKGD5AuwhBShAAQpQIOoCDIBE3Y5LUoACFKAABShAgZgVYG0UoAAFKEABClCAAhSgAAUoQAEKRFogzgZAIt1DZqQABShAAQpQgAIUoAAFKEABClAgzgqw4RSgAAUoQAEKUCCqAgyARFWOy1GAAhSgAAViXoA1UoACFKAABShAAQpQgAIUoAAFKGD5AuxhNAkwABJNkCyGAhSgAAUoQAEKUIACFKAABT6FAMukAAUoQAEKUIACFKBA1AQYAImaG5eiAAUo8HkEWCsFKEABClCAAhSgAAUoQAEKUIACli/AHlKAAtEiwABItDCyEApQgAIUoAAFKEABClDgUwmwXApQgAIUoAAFKEABClCAAlERYAAkKmpchgKfT4A1U4ACFKAABShAAQpQgAIUoAAFKGD5AuwhBShAAQpEgwADINGAyCIoQAEKUIACFKAABT6lAMumAAUoQAEKUIACFKAABShAAQp8uAADIB9u9nmXYO0UoAAFKEABClCAAhSgAAUoQAEKWL4Ae0gBClCAAhSgwEcLMADy0YQsgAIUoAAFKECBTy3A8ilAAQpQgAIUoAAFKEABClCAAhSwfIHo7iEDINEtyvIoQAEKUIACFKAABShAAQpQgAIfL8ASKEABClCAAhSgAAU+UoABkI8E5OIUoAAFKBATAqyDAhSgAAUoQAEKUIACFKAABShAAcsXYA8pEL0CDIBErydLowAFKEABClCAAhSgAAUoED0CLIUCFKAABShAAQpQgAIU+CgBBkA+io8LU4ACMSXAeihAAQpQgAIUoAAFKEABClCAAhSwfAH2kAIUoEB0CjAAEp2aLIsCFKAABShAAQpQgALRJ8CSKEABClCAAhSgAAUoQAEKUOAjBBgA+Qg8LhqTAqyLAhSgAAUoQAEKUIACFKAABShAAcsXYA8pQAEKUIAC0SfAAEj0WbIkClCAAhSgAAUoEL0CLI0CFKAABShAAQpQgAIUoAAFKECBKAvEmQBIlHvIBSlAAQpQgAIUoAAFKEABClCAAhSIMwJsKAUoQAEKUIACFIguAQZAokuS5VCAAhSgAAWiX4AlUoACFKAABShAAQpQgAIUoAAFKGD5AuzhJxJgAOQTwbJYClCAAhSgAAUoQAEKUIACFIiKAJehAAUoQAEKUIACFKBA9AgwABI9jiyFAhSgwKcRYKkUoAAFKEABClCAAhSgAAUoQAEKWL4Ae0gBCnwSAQZAPgkrC6UABShAAQpQgAIUoAAFoirA5ShAAQpQgAIUoAAFKEABCkSHAAMg0aHIMijw6QRYMgUoQAEKUIACFKAABShAAQpQgAKWL8AeUoACFKDAJxBgAOQToLJIClCAAhSgAAUoQIGPEeCyFKAABShAAQpQgAIUoAAFKECBjxdgAOTjDT9tCSydAhSgAAUoQAEKUIACFKAABShAAcsXYA8pQAEKBNC3BgAAEABJREFUUIACFIh2AQZAop2UBVKAAhSgAAUo8LECXJ4CFKAABShAAQpQgAIUoAAFKEAByxf41D1kAORTC7N8ClCAAhSgAAUoQAEKUIACFKDA+wWYgwIUoAAFKEABClAgmgUYAIlmUBZHAQpQgALRIcAyKEABClCAAhSgAAUoQAEKUIACFLB8AfaQAp9WgAGQT+vL0ilAAQpQgAIUoAAFKEABCkROgLkoQAEKUIACFKAABShAgWgVYAAkWjlZGAUoEF0CLIcCFKAABShAAQpQgAIUoAAFKEAByxdgDylAAQp8SgEGQD6lLsumAAUoQAEKUIACFKBA5AWYkwIUoAAFKEABClCAAhSgAAWiUYABkGjEZFHRKcCyKEABClCAAhSgAAUoQAEKUIACFLB8AfaQAhSgAAUo8OkEGAD5dLYsmQIUoAAFKEABCnyYAHNTgAIUoAAFKEABClCAAhSgAAUoEG0CsTYAEm09ZEEUoAAFKEABClCAAhSgAAUoQAEKxFoBNowCFKAABShAAQp8KgEGQD6VLMulAAUoQAEKfLgAl6AABShAAQpQgAIUoAAFKEABClDA8gXYwxgSYAAkhqBZDQUoQAEKUIACFKAABShAAQpEJMBpFKAABShAAQpQgAIU+DQCDIB8GleWSgEKUCBqAlyKAhSgAAUoQAEKUIACFKAABShAAcsXYA8pQIEYEWAAJEaYWQkFKEABClCAAhSgAAUo8DYBTqcABShAAQpQgAIUoAAFKPApBBgA+RSqLJMCURfgkhSgAAUoQAEKUIACFKAABShAAQpYvgB7SAEKUIACMSDAAEgMILMKClCAAhSgAAUoQIF3CXAeBShAAQpQgAIUoAAFKEABClAg+gUYAIl+048rkUtTgAIUoAAFKEABClCAAhSgAAUoYPkC7CEFKEABClCAAp9cgAGQT07MCihAAQpQgAIUeJ8A51OAAhSgAAUoQAEKUIACFKAABShg+QIx3UMGQGJanPVRgAIUoAAFKEABClCAAhSgAAUAGlCAAhSgAAUoQAEKfGIBBkA+MTCLpwAFKECByAgwDwUoQAEKUIACFKAABShAAQpQgAKWL8AeUiBmBRgAiVlv1kYBClCAAhSgAAUoQAEKUCBEgPcUoAAFKEABClCAAhSgwCcVYADkk/KycApQILICzEcBClCAAhSgAAUoQAEKUIACFKCA5QuwhxSgAAViUoABkJjUZl0UCBXQNMBoBKysAGtJ6rmaFjpfParXarrKo5LBoKaGJPVcTVNJ5VF5Q+ZEz70qT5UdmtRrVbKqV6XQ12oaEwUoQAEKUIACURXgchSgAAUoQAEKUIACFKAABSjwCQXCjKh+wlpY9KcRUIPQKn2a0mO41FhanfJVAYbQQIB6rqZ9THNleR9vbxw/egyrlq/EiiXLcXD/AQT4+wMyD+omj76+vjh25CjWrV6LrZu34OrlK3rQxGQy4f69+9iycTM2rF2Po4eP4pnXM7xcFh9/83D3wMplK7B21Trs2r4T7m7uUMEaN1dXXLp4KaStKhDy8VWxBApQgAIUoAAFKEABClCAAhSIVwLsLAUoQAEKUCDmBAwxVxVrilYBGSAPCAjA0ydPAIMG/WwCmRatdURXYVFpl1pGBR2srYGXyUqeRzaFWS6qQQtpg/dzbxw+eEgPBuzYuh2Xzl/E82fP8bHBBj8Jdpw4dRa9+w1G43/aYN+BwwgKCgJUUEH128oaQYFB2Lp9Fxo2bYVRYyfhkgqAGGwliwH3Hz7E0BFj0LFLT+zeewDqvQBZBvqyYiRtx0fcnj71wu9/1kCrdp2wdPkq3L5zF6dPnMK4iVMxcvR47Nl7EL4+PtJe7SNq4aIUoAAFKAASUIACFKAABShAAQpQgAIUoAAFKPDJBAyfrOQPLJjZP0zAbDLhxo2bGDxsNKZOm4UTx44jwD8A+gD4Rw5+v9ESVZ4aWH8ZiAgTXHjrNBvAOiQFq4F9VYYa3H+j8AgmSF43Nzf9DIclCxZh+eKlWLl0uaQVkU7LJf+yRUuweP5CHD8qNhIs+uCghbTj8ePH+G/bLj1QMXjoSAwfNQ7rN2yGRCEiaHjkJ2maJjErDba2NjCKodFoJc3T4PbwEVavWIV1q1Zj0+YtOHv2PB5KsOPWrds4ePgotmxYizXrN2L37n24e+8+bty6K3nOYct/27FhzXqsXbUGu3fsgqeHJ6RARPWmaZq+6I0bNxAcbNLb6efnh9GjJ2Lq9JkYOWYcjolrkH8gPqYe8EYBClCAAhSgAAUoQAEKxDsBdpgCFKAABShAAQrElIAhpipiPdEoIIEET8/HmD5zLgYPHYGu3Xtj8LBRGDZyLPbu2gNfH18gqmc9hG+mDIQ/8/LCf5u2YPL4yZg8cSqmTZqGKZOmYNIESeMmYeLYiRg3ZgLGjh6PMRIgGC3tGD18NEYNk4CBtK9P/yGYPn1WyKC8alf4OsK/ljqfPnmK9Ru3oO+Aoeg3cDj6Dx6OAYNHRDoNHDQcffoPxdCR43Di1BkEBQaGr+X9r6Udj588we3bd3BfAhNbtu7EvgMHYWtv//5l35PDoBlkFVlLspJklLiVUeIImgQ17mHM+Cno1W8wRojnocPHkCJlSjz1eoZVq9ehz4AhGDRkBObOWwh1dkqihI7Yu/8ARo+bKFZDoKxXrFoLT89wARB5z0gleHU2jfXbn0uwy0p9L4neBwNsbKzh6OiIIoULYs3KBShcuBA2bNwMFQh65OYKWEmgS61X8dIX4R0FKPAhAsxLAQpQgAIUoAAFKEABClCAAhSggOULsIefScDwmepltR8hoAbzL129iuEjRoeUIgPPK1atQ/de/dF/0DAMleknj59EoBr0l3khmaJ4rwEBAYE4c+4CuvToi959B6GPBCVUcKFPv0Ho2XcguvcegG49+6Fztz5o36kn2nXshjYduqBtx67o0Kkb+g0YjLadumPegsXwcHWDjPTjnTdps8lshq+vH86dv4RTp0/juPTn2PETiGw6fuIkzp47B08JFAUEBECKe2eVEc6Udqjl7967B/W9G0YJDOTMkR1FCuVHlAqU8mCUPzkpx8rKCKNRg8GgCYcmz40Sn7CCra2tvt6CggJhMkOmGaUqMwyyrGYw6JfJUpfKUv0xqLKgbhpU+0zBwTCZTZDF1MSXySyZXR89woqlyzHr31lYOHch1Jk1SxcuxptpKZYuWoI16zbCaG2DJEkT48rVa1i7fhNWrlqDK9eu44sc2ZAlSxY89/HBxs3/Ydb06Ti4/yD0wJu082XFfEIBClCAAhSgAAUoQIEIBTiRAhSgAAUoQAEKUIACMSNgiJlqWEt0ClgZjSiQLy9OHNuP1q2aw8PdHUGBAXBJ7qx/N8PosZPQun1nbNi0BV5eXh9XtYyma5omA/FWePLkCTwkoPDg4SM8uP8Qjx65wl3qfvzYE8+8nsoA+HNphx9MwUGwksFzF5cUSJUqFVKnTq3P9/T0lMH+SDRHBuytJEiQ3CU5ypb5Bt9VKIfKlSrih8rfRypVlnyVvv8O5b79FpkyZUSSRIn0QEMkan6VRfrs8+wZbt25B1cVtJE5VrY2yJkzB1KnSvnhARApz9/PD5cuXMKuHTuxe88+XLp0Bd4SRDBKIOOaBBb+275TPD2wbNFcbNu8DssXzUGV//0CFbxImy4tunfugF1bN+C/DasxcsQg3faZtw9q16wmgYzZ2LRhBdatWope3TshY8YMgMkkrYaYa/CWfFu370ZPCVYNGjYSg4aNwqChEaRhIzBo2GhMmfYvkjsnhZ2trQShLmKqvB4wZASmTZ+Nk6fOwN/fH/sk6DFl2kzUa9RCD5AFBPiDtygIcBEKUIACFKAABShAAQpQgAIUoAAFLF+APaQABT6LAAMgn4X94yu1t7dHvty5MLh/L1y/fAb9+/aSgXpX+Pg8l8F+A3bt2oMkSRIjQYIE767M2hqywDvzGAwGvZzs2bKhcKH8qFjhW/z264/484/fUb3aX6hdqwYa1q+Dpo0boGXzpujQrjVqVP9DAgUppFxNP2tBnuD778ojaTJnQAIc6vVbkwzcZ0ifDj26tMfaVUuwctkCLJVgwNKFs/WB/sg8Lls8F2tWLsK6lYvx+28/wc7O7v31hm2QBCzcXN2hAhOPJfBjMpnxRdbMKJg/L9SZGO/tQ9iy1HNNk2DUM+zcuRfde/SDulTVshWr4ebmgcCAAKzbsAm9+w7ExCkzsFaet+/UDZ269sL6jZuRPHly3L17D1Omz0Szlu3Rql0njBw1Dvfu3YeDvR1Wr1mPLt37oHXbzhg4eLg+3crWVtUakqRue+m/Ouvkzp27uP/gIU6ePI0TJ0+9mU7ItBMncebMWYmfmEOCJxKkOXP2nH4WzpGjx3BWnt+9e1df9ujR40JhQqAERNSZJiEV8p4CFKAABShAAQq8W4BzKUABClCAAhSgAAUoQAEKxIQAAyAxofyJ6tA0DbYysJ0pYwZ0at8axw7uRpXff4WnpwfGjBqOnDmyQ50t8tbqrW0xZNBw/QwDGA0RZ5NgRaJECVGnZjWcObEfu7ZtwOrlC7F4/kzMmzUVs6ZPxLRJYzBh7AiMGTkEI4YOwNCh/VGoYAEEBgbpg+Ourq7o0a0TsmfPKnVokt7/azQaYSdBngQOCfTgiwrk2EswJzJJ5dWTWlaSjQQDNC1y9b5smQR9Hrq54srVq3jy1AvPvX2QKUM65M+f72WWD31iksCOumzU3n37cejwEdy//1CCDCY9yODu7onDh4/ixs2begBj9pz5WLh4qR50sJYglTpTZPuOnfh31hzMmbsA6yVIoi4RZpB2qqDEoiXLMHf+QixesgK+6jtgwjZO+m4wGmEwGvWpgUFB6N+7OyZPHCtpXIRpyKB+SJo0Cfz8/JE9W1Z069oJUydPeC3vxAljME7eZ316dUOOnDn0y3fpFfCOAhSgAAUoQAEKUIACFKAABShAgfACfE0BClCAAp9BwPAZ6mSVHyMgg9nqP+19fXwAaxvAoOmlWVlboWChApg5fRJ2bt2ASt+VRTJnZ31ehHdGA65duogBg0bi9z9q4NKly4AMpsto/BvZNU2DlQzCq0CCjY2NVPv2ZGVni0sXLuPEydNwdXNHcLBJL69SxQpImiwZZMRffx3hndQDNUgfmtTr6EjKKLRM1ccIKw8zUeoM8vOVQMQ93Ll7T/oQDFNQMLJly4YM6dOHyfgBTyWQpM5CyZo1k36GTJNG9ZE3Ty69ALPZhPTp06JVi39Q7a8/0LRRPVy9eBInj+7X896/fx/ZsmTGtCkTcPfmJZl3Sg9CZc6UQQ9QdOvSEccP78H1y6dxaP925FHlSh/0wiO483ryBH9U+Q2N6tdG4wZvJjW9RrU/kTljej2Y5pLcGRXLl0HDhnVC8jeqi8ZN6qNp4/po3qwRenTtiHJlSkGdlSQRrwhq5CQKUIACFKBAeAG+pgAFKEABClCAAhSgAAUoQAEKfMgiQsMAABAASURBVHoBw6evgjW8U+BDZsqgdkBAADZu2ooEiVKgT69+uHn9JmBtGxK8kLIcnRxRWgajs2XPJrEMTaa85ddgjQWLlsLG2oh9+w+hQJFS2L51O4KDgiJeQAbw9cHt9z1qBuzcuRvqLAeDBB7c3FzRtXNHCR5khb58xKVDGgsV1Llw7gJOHj+Jyxcv4ca1G3r/bt6Qx49I169ex7kzZ3H08FE8uHdfYjAhQRm87SbODx+6Shuuwl2COCpbzpzZUTB/Pqg+vdEPya/ar/K9NYlbosSJ8MvPP2LokP74RwII6owYV3UJLAmuGA1GlPu2DJJL0Kr/oOGYOHkG/p01F8dPnEKSpEnh+fgxtvy3DWPHT8akKTOwfOUaeHl5wdbWBgcPHcGsWfMxadJ0jBozAc1atcOJo8cgjQ1pjtStt1k9hkyB0cpKmqxB7t5Imqw3KysjkiVPDnXz8noOdbYJDAao/Hdu3cbqFaugHmFtA03KAm8UoAAFKEABClCAAhSgAAUo8G4BzqUABShAAQpQIMYFZEQzxutkhR8hoAbkf/jlf3B0SojefQcgU7bcaFC/kf6dDaFng8gI/7uDDTKQ7fnoIdZv2IxgUzCSOieBk4MDkqVwgcFojHrrZCD8pAy87ztwCB4ej19+98ePlb9DMhcZTDe9I/AgQQQ1yD9m/EQJxpRAjlwFkTlHHmTKnlv6KI/Zop6y5MiL3PmL4bvKv2PX3n0ICg6GGsjH224GDQ9cXXH+0iW4uXvC29sXWbNkQuHCBWQx7dVS4ghJKhDh4eEJ9fzVzAieqQCEJK8nT3Hm3CVcvHgZiRI6wVrcHjx4iPETJ2Pv/gOYNXc+Ro4eh7HjJ2Hb9l36pcTu3nsoQY+1GDp8FEaMGos58xbh1p37ePbcW88zVpYdJtPHT5yCmbPmhQQswjQhONgk6/qVv62NBM3Uupb26+0O+yjrwmC0gkvyZHoJj588EQNv/TnMwM1bd/FrlepIn+VLNG7UDLeu33h/30OW5j0FKECBlwJ8QgEKUIACFKAABShAAQpQgAIUoIDlC3zuHjIA8rnXQGTrl0FpH29vTJn6r75EUFAQnJ2dkSJFCsz4dzbyygD/sGGjcf/efZkvo9Ry/9ZfGfgeOGQErl6/CTs7W3h6PkHVv/6HTOnTvz7A/9YCIpghA+hej59gzfrNWLdxM4xSh4eHByaPH408uXNBD8pEsFjYSZqmIYH63o8ECWFlbQMbO/sIk61Md06WDKlSpULq1Kn15OLiAjt7B6h54ZdT01Q92bNlhpUEGzT14m1J2hDk54+H9x/gzp27UN+XYTBqyJkzBzKkTwcBgrop/yOHj6JegyZI5JwGbdp3xtUrVyEdV7PfnqR8r2fPcO3adVy8fBk2NtZSpCbBiWCcvXAJR4+dRP48ufF9xQr48YdKkiqiTKkS+LZ0CRQrUlBf5+llPRUrWhjflS8j00vqeVTeHyp/jwrly6JIkcLSz7CBLLOUHySrICQAkiplKvxWpRqKFi+FIsW+eZkKFCqBEt9UwOIly/T1kDZdWr0f9+89gI+Pn/7cx9cHD10f6s/VXbasmWGfwF49ZaIABShAAQpQgAIUoAAF3i3AuRSgAAUoQAEKUIACMSzAAEgMg0e5OrMZCRwd0KN7J6xduRi//lwZqVKmhLe3jwyKJ4OLSwp07NwdufIVw+49+6H+4z/CuiQAsFUCFNt37ob67omgoGDAHIx6tWvByclBnpsjXOydE2VQXwrDmjVrsXTZchl8t4Krqxv+rv4XypYtA3VZLjX/nWXITIOU45QwIUqWKILyZUujXJlvIkwVypVBpgzpJdZglGLNepAiuQREypYpibIRLKOmqcBAeglg2NjYSE3v+JU2PHz4COcuXMajR67QJOuXX2RH4UIFYJAgj7wEJI+6JNSGTVv0sy0SJ0kC9UXk27bthCkwUJ+Pt9zMwcFwd3fH7Tt34O7mIUVpulfixIkQLMs6yDqePmUcNq5djrWrloSk1Uuwcul8dGzXBiqolD5tGrRv3QKr1ywLmR+aT94Xm9evxOHDe1D0q2KQiEdIK2SVBgUGy3siOOS1dOro8RM4cuQYjh49rqeLF6/g/IWLePzYE1YGKwnM2CBzpkx6flc3V/j6+kKw8UACQzt37tGnG4y2KFOqJFwkEPWyLn0O7ygQGQHmoQAFKEABClCAAhSgAAUoQAEKUMDyBdhDCnxeAQZAPq//h9VuMsPK2ho//voz5s2ahgljh6Pm339JIMQFHp6PYbSyQb78ufXBa02TUe7wpcsAvrsM7k+fOQ8XZMDbVoIB7u5u6NWtM7JllcFuLQpvB1WPBGd27dqNlWs24P79RzJObkbqVClQv15tZMki5YZvR0SvTSa4pEiB7p3bQw3ib9y0Fhs2RpzWrluPXj27IGvWzPqgvpurK5o1aYD1G1a9dZktm9di/pzpqFyxAqzFUBoZUSsgEQm4urnh0mUJgLi6w8fXD1kyZ0b+vHmgB0Ckr2pZJwlY/PXH7+JfDU8eP5bAxBNs37UH+w8cgmREhDexevr0Kc6evSDpPJyTOcMk5SVOlAjFihZBmjSpcfnyFeTIWxyaTUJo1k4hycoJNg7O+O2PqlBnvVy6chV/VK8lTbUPmf8in8E2EcaMnwJPCdwgOORsD9UOs9Th5+cH9f0x0jj9klrqbJGffqwMlSpX+l6CX45I6OQIe/sEEmhLACsba6RPn0Ytrqd7Dx7i4d17uHvvPiZOnqZP69G1HVKlTAHIutMn8I4CFKAABShAAQpQ4N0CnEsBClCAAhSgAAUoQAEKxKhAFEa8Y7R9rCy8gAxmywi2BDusUKpsGQwb3B+9e3SFOiMkOCgAdWvX0C/XZDBory9pMOC5lxcGDB6Odes3IXEiJzx48AilS5VE48b1kMAhAdTA/usLveeVDOibZfD7+ImTmDt/CdZt2CLBF2s8f+aNb78thcQJnRCszjB5TzGhsw1SnrXNizM0AgOAQP+Ik8kXTx8/haeHJ9SZLgbNRh+0R1BQxPlVOcHBeuDDyso6tLo3HzUNft4+uHXnLm7eui3MQVDf0ZEnTy6kleCEJoYvF5LyvvgiB37//WdkzJARAdLeAwcPY8++g/B090BEQRCTBCXu3r2Pg4eP4PjJsxIkSgk7W1uJH5gkyJIJf1T5TQ8aDRnQE5kzZ4K6vFnePHlQuVJFfFehHAoXKoggqdfOzg4FC+RHpRfTixUtjJQpU8LG1h7OSZLAJtQQITc9AOLvj5AAiKav5jEjh2DqxDF6Gj1iEBImTAhfP39YWxmhvg8GBg2Ojg56ASqwdvPWLWzc8h9Wr9uoT7NzdIL60vY06dJCOqBP+9A75qcABShAAQpQgAIUoAAFKEABClDA8gXYQwpQgAKfU4ABkM+p/zF1vwiEODg54H9//IrBA3rJYPZYFC5YQAbtE75esgzsP/d6hrETp2LJspVwkIFtdWZDEhksH9ivJ1KmSAGYX1/kva+kTJMEP06fO48Zs+ZjxszZSJI4oYyFm5BYHucvWIxmrdpjz/79EhB5Dkh+ROam+vWufFKOr7c3nkgwxz8gAMGmYGTLnhFJEiV611Ih8/Sy39FRKfuRqyvOnb+I+/cfwGQ2IUeOrChepAgMRmNIGeHuixYuhGpVq+DpkydQZ1ls3b4De/bsh1mCHa9llbI9PT1x4PBh7Ny9F5kzpUdOCaCkTOGC58+94ZwsCRrUq4UGdWvCwcEB/v4BeiDj2zKl0LJFUzRr0kgPhKizXZImTYKKFSuglT69AX796UcJVjhCv5yZBC6kqteqNkm/vcVMXbZLncWSKlUKpEmdCiklqKOSupTapUuXJDAScoaRo6Oj/n6ws7bFn1X+BxVYu379BtZv2Ix58xbpZbdq2hDp06XWn/OOAhSgAAUoQIFICzAjBShAAQpQgAIUoAAFKEABCsSgAAMgMYj9SaoyyYC+DLZnzZ4dDZs2QC71heOhFclIuPrvfzdXN4weMwFDh41GQGAg/AP84f38OYYP7ouCEjDR9DMbpJzQ5d73KPkDJfhw5sxZzJo9HxMnTUVyFxcESztckieTWIcGF3l9/MRplKvwIxYsXApXdVkmVa60ST0AUbyXulVw4s6du3rAQQ36p5QATuLEiaNYYJjFJKDz4MFDnJcAyIOHrggICMQXObIjd+6csLaykqBAOCMJLKROlVL/vpLixYrql8u6cP4S9uzbj6tXrwFhgiZB4q7Oojh46CjOSdAoU8b0yJQpA1QwI1DmqWCSkwQenJ2Tip8B6rVZ1m2ArCs/H3/4+PlJUMRfb6wpOBhBEiBR0319/eEreVR+NVPTVBs19TQkibea9/SZlwRansPKyqifzaKCIlIJVAqW8lRmTdNgbW2lXw5LvXZwSIBvvvlaPcXFS1ewbcce+Ml6LyTvmUoVyyNDxgz68noG3lGAAhSgAAUoQAEKUIACFKAABSIU4EQKUIACFKDA5xMwfL6qWXO0CqhB7MCgkAFpGchWg+/ez71x7vwFDBw6Ej36DIStrY0+SK++c2L08EH484/fYGdvD8hAfqTbYtDg6+2DffsPYrAEVEaPGS/Bj+Rwc3XFrz//gA7t26BunRpImiQJHBIkkHkuaNysJcZPno4bN29BDd7LCD+ifJO2Xrl2HWcliODn54/nMrCfI3s2pEnzkWcjiNnjx09w+fJlXL9+XUyAjBnSoogM9idJnAhvbbMslz9fXvz2688IlICJCjDt2r0XR0+cQLAEC/TlJI86o8PDwxNubu7S1jT4pmQJpEyugkbBCP22DhWsUgly0zQNAYEBmDRlOn6t8heq/V0bQ4aNhPoOkEeu7hg2aow+vWqNOujbbxCePXsGqzABFyni5a+69NbTp17w8nqmn+iTLl0aaPKjZ5B6goLlfSMvNEnq8lmJVX/FWV0C66tiRWQqoM4csZP3T4B/IGrX+hu5c30JyLIvE3ijAAUoQIFICTATBShAAQpQgAIUoAAFKEABClCAAjEm8NkCIDHWw/hSkRqMNsjqlPRMBrpvXruB1WvWo2GTllBBihQpksNVghQZ06ZB967t9SCFY0InqDMAIkUk5avBeXcZfF+3cRO69uyHRUtW6Gd6qOBH7Zp/65dvqlH9TzRpUBf/NK6PNKlT6kEB9f0U/foPwpDho/XAhTobQh84j1TFYTLJAL/bI1ecOXMOl65cRZAEfRydEqJw4YJIr76LIkzWD34q/Xv06BFOnj6PW7fvITAoCF/m/ALFixWGnZ2digAARvGVNuBFMpnMUJeWCpK8qVKlRLasmQENeCRtPHHiNK5dvwGJHEAFmNRlxwoUyI8q//sFP/1YCcWLF0GKFC5QQRxI3ZCbpmmS3SBJg7oZpZ56dWth0bxZmDljClq3bI4HDx4gmXNStGjWRJ8+a/pkdOrQFvYSyFLtMcj6NxqlnfKoylBJneHh6fkEbu4eEpQJRuZMGWFlbQW9HxrgLtM2mIodAAAQAElEQVRVPumO/p0kSZIk1ttsZWWFBBLEypwlM4KCgqEu1fXbL5XxTYnicE6ZQs+jLuvl/fw5pNGqCCYKUIACFKAABShAAQpQgAJvCHACBShAAQpQgAIU+FwCMlL6uapmvVEWkIFyfcBZDXLLILkaQH/+7Dlu3byFM6fO6IGPBk1a4O/a9XHuwiUkS5ZMBuUf4ddffkavHl1Q7c8qcHB0BNSI9/sa8aIuXx9fnDl7Dv/OnofGTVpLIOMCnJ2TSFDFA00bN5RUD/nz55VmGZBOBtirV/sD7du11IMCvn5+UEGQKVNnYNCwUTh+/CQC/ANk0Fx7X+2v5ktfnz99iv+27sD69Zvw9IkX1KB++bKlUCBfHqjBehVoeLVAJJ696JssjKCAANy5ew+XLl3GMxnQT5I4IbJKQMPRyQmPXN1w+8ZNXLt8FZcuXMR5cTh76jQOHjosbdmMGbPmYtPmLTBrZlgZreAnfTt85CguSFmmwMCQhpjNErhwxvcVyqNJw7rIlCG9VGuQJptgkHZoMMDDw1NfRl3iSwWbDEYjMmXMiK8kWFK8SEHkyJYV6pYggT2yZ82iTy9apBC+/CKHfnaPvb0N7ty5r68bt4ePYDKZVHYESN88PD1x4+YdwKAhcZJEuCxtu3rxEi6dv4jdu/fp+awkcJIoYUIYbOxhlmXv3ruPvfsP4oEEvaysjNIvfySV4IudCgjJfEif9u49iPUbNsFV6lOBFr0g3lGAAu8S4DwKUIACFKAABShAAQpQgAIUoAAFLF+APYwlAgyAxJIVEdlmqIFxFex49PAhbsqg/MVz53H48FGsXbcRAwYNw1elKqBm3YY4cOiIfnbGM6+nsLG2xqB+vdFRAhK//PJDSPBDBq/fW6cMzPtL8OLqlavYvOU/dOvVD5269IBRBsPVYLfRYES3Lu3QpFFdFCyQH7ZqYFyVGxQEZxcX/O+3X9CjayfkzpUTvn7+UEGQRYuWYeSYCdLmY/D39ZcB+fe8BQ0h89WZH+s3bMH8RUtwVoIQZpiRyCkhyn5bRoIsWSQGpL23O69lkL75eHvjyuUrOHX8BHbt3Y9dew7g1u3bsLe3g6ODgx5kWbVmPSZN/VcP3LTv3AO16jRGgWKlkafgVyhRugL++rs2unbvjaXL1+DRQzepwixBIE2CDbdx6tRZqCACjCF9MEjwwSWFC/KJlXPSJAgONkt+vGi7htNnzqJd+66YMGmq9A6QCAamTvtX6iuFEt9+j36DhiJp0qS4decu+g0egfxFS6Fk2Uro3L0PvL19oC5ZNXTEaBT5qjQOHD6CwBeXRHvk6ooH9x/AFBwgRQbrgRh1Bk+jpq3QvHUHtO3YDcmTu0jwxogcObIB5mBcEpfZcxeiUZPmsBKrh4/ckCRxIv37Xrbt2Amvx4/h6+uHB48eiUFdzJyzAI+fPIEKsEjL+UsBClCAAhSgAAUoQIEwAnxKAQpQgAIUoAAFKECBzyMQMjL7eepmrR8qIAPRPj4+WLFyDWbNWagHEtTgdbES36J6rXqYNmMW7BPYw9nZGT7ez6EuedW4YX2MGT0U9erWxFfFi8LW1lYGuEMG3vGOmzp74N69+9iw8T8MHDICv/3xN7Zu24UUKVLA3d0N+fPmRs+uHVC39t/IletLWNvYvF5ucLAeaKlcqQK6dGqHDOnS6t8/kjJlCqyUoMKYCZOwb/8BeD97DokA4I2b9FVNe+zhgWPHT2L2vEXS3/HYu++gxBOMcHdzQ82af+G7ct8iobqUl8r8IUnKV2dczJKB+/yFS6L8dz9i1LhJ8PB8rAeM1Fkgc6TO9h27om+/gZg8ZTo2bNqK85cuw9baGrZ2CV6rLTDAT//ycPWl5iazSQI+fvoZIpclkGAOCn6VVwWITCZ18sSrafJMmiP3gPqydXU2iyav1FoyGI1SrhMcJCBjbW2DRIkS6cEZPUjj6AAnSTY21pI75NdW1oOdnSOMmlFYNQQEBuKCBIzUF7sncHBEvjw5kTdXLiRKmBA7du2WdboDz58/g5ubK8qU+Qblvi2NQ/sPYuKUGejesw8MRmvky5tLD3I5OTlKO5wwa/YCbPlvG85fuAD1xe6qZnXGizpLCNDA23sEOJsCFKAABShAAcsVkH03WIVeapT7RZa7otkzClCAAhSgQCQEmIUCFIgVAoZY0Qo2InICMkquvjOidv3G6Ny1B8aNn4Tdew/oZ3oklaCHKkQFBpImSYLePbti3aolaNPyH/z8QyW4SOBBzX9j5F2fGPHd06dPMXTkaMycNVfqSAGDwYBHjx6hUcN66N6lPf784zdkyZwJRnWgpwb2wxcjA/1GOQD8rnxZ9JH22Nvbwt8/QAbfnbBy9Xps3b4TT6QOSL9eW1ReP3n8BHsPHMSCxcvRq+9AdOjUFVeuXoe1DPa7uj5Ck8b1UevvqvplqjRp12vLR/KF6o+tBIRSpkqpXybMMYGdftbEs+fecHXzQIAENcIWFeDvi+fPvJAufTpUrFAGzf9pgiGD+mHh3JnYumkNpk8dh3p1aiJxosQIlqDHpUtXcPL0OTx8+AiCF7ao156rs3pUypEjuwSL2qJG9aov5mv4o8pvWDR3BhbMnoZ5s6Zgzr+TMXfmZP31kvn/YvaMSWjTqhns7e3h6+uP+nVrYfXyucib50tZLwYJVnng9NkLOH7qrM5cVgJGKkjz008/oEvn9ujQvjX69emBCWNG4Msvc+LWnTto076L/t5SjSj3bSl0bNsazZs2xD9NGsLb+xlOSFnTZ87F1OmzcOTIMZUNpb4pIQEvh9eDYPoc3lGAAhSgAAUoQAEgVhjIPqa+Q/S+R7VvqZLK9wENDw4OxiHZf923a49+yVT1vXx6fR9QRoxlVX2LTFIOoSnGGseKKEABClCAAhSgAAUoEH0ChugriiV9cgEJMlhbW6FN6xYvqjLA+/kzqDM9Uri4SFCggT5APksGxRvIQPj3FSsgx5dfwEYG+SHBiBcLRerBYDQia5bM6N29M5JJ2SroUKRQAUwaNxqtmjdB2W9LI7lM1wuTdumPEd3JPGsbG3xfsTxGDR2EQDkwdHNzQ5XffsL335WHc9Ikbw6aa5BARCDUF4k3b9kO6tJX6syTx489ERQQKMGdbmjaqD7y5c0DFWD5kKBO2CZaiaWjkyMePngggQJ33dEleTIUL1oIf1ergrZtWmDQwL74d/pkrF+9FLu3b8T+3f9h1rQJ6Ne7O1q3aILaNarh119+RLkK5VGuTGmUL1saxYoWhKenB67fuAF1BoiHpyfCHPzi1S3kTBB1xog64yZ1qlT46qtiyJEti54l2GzSL+9VvGRplCz9TUgqVRLFixXVp6dPlw6ZMmVE8uTOEqwJgJeXlwQxcqC05FHfw6IugXVMXd5r914JPPnLe+U5ypcro58x8508NpFAVtNG9VC2TCn4+Pnj+vUbqFq9Do6dOKXX/+svP6Fnt476Muosn19/qox2bVpJcCcA+w8cxrR/5+LY8ZC8hQrkk8BWwjfXpV4S7yhAAQpQgAIUsDgBNXgeOjAe2cfPiKD+2eTZs2fwl32ewIAA/dHX1xfe3t5Ql5dV+1FPnjyRfThPeLi5487tO/pztVzE+3HhOiMeKgBSvVYDlPy2ImbPXRByeVCZHi7n538pbVJ99pP+h1qo5+pMczVdWTwVi8eej3ULdSnVe3fuAkYeOn7+lccWUIACcUyAzaUABShAgVggwL3YWLASPqQJ6oyFMt+U1BepU6s6JowbhR3/rcfCOdPRQQbsf/31Z3z9dXGkSZc2JDggAYcoBQgkcGFjZ4eiRQqjf89uGDtmGIYN7quf9fFlzi/w8vs+9Ja8506CL3YJ7PHjD99jzIjBaNSgLhrWryuBgsKwS5DgzUFzkxnqMl4qmNChfWsAJqgzT2rWqI6Z0yehXu0ayK1fdssaUeqblKiWc3J0QsXyZbFn+yYc3LsNRw/uwoK50zFq2CB079IBLf9pjDo1q+N/EqypKMGab0qXwlclS6BIsSLImz8fsmTLihSpUsLO3g4SFVClIl3atMifL5/0rQjGjhwmgZp6+rTwASgzzAgyQSbLnVgHB5v058FBQVBBIv1gWxxM8lrCQYB6VEnWpzozZ+euvRg1biKmzpiNNWs34vlzb1k+CDYSbDKoQQjJp2kaEiRw1C+ZpS7RpfqQL3cuPU+ixImQPkN6ZMqcGVkk0LVt+w4sWLgYgAEB/n7o27s7+vfrCXXZNHuHBDIdyCD569b+Gx3atcazZ14wm4Lw5MljNJZASkaZZ5S69Yy8owAFKEABCrwhwAkWJSD7GGqw/N7de3hw7z5cH7nCzdXtzSTTHz14iJvXb+K+5IXR+HkYpL3qLOR5C5Zg4aKl+hnGCxYvw4JFSzB/4VLMW7gIc+cvhrr8qUqzJHihznSdNWcBbksgxCz7su9tuOzPXb12Q/+HEpXXaLRCCpfkgExXr2NVEo+t27ZjrngsWrwci8RCfc/efN1iSYiFeMyetxDKYsbMuZgxay5OqX98UfuZsaozbAwFKEABClCAAhSgAAXeLcAAyLt9on/ux5QoB1BqgPubkl/h9PED+n/nV/3zd5QqVRL5CuZH5qxZ4OTkFHKgpQ7UJP/HVCcj6vrZAlX+9wuq//UHChcqiKTJnEOK/NCypT1OiRLi919+RJeObWVgvQhs7e2h6ggp8PV7g9Ggn4Hyy4+VMGzIAKxZsQg9urRHxe/KIV36tDAY5QD6Q9sQtgpZVl02KucX2VGy5Nco9lVxFJJgT/6CBZArb25k/yIHMmTKCHV5rIQJE0owSeqToIIeiFCPKkmf9PZLWXrRcjCZSPpY5befMWPKOFSv9gcKqDMjEidC+INfkwQ8/Pz88NTLCw/u34evtzckE4KlTD8/Hzx8+FCCPg/h6+8v01//Ve8Bf5k+fMQYDBg4BIuXLIM6O6ZEia+ROmVKWKszfqRNtrY2KFKkAJo3b4zvK36Hpk0aIFnyZND/i1Hm622X+lIkT45B/XohkazbX37+Abu3bUSj+nX073bRz7CRPKr9VtbWyJE9K5r/0wjzJOD21x//Q8vmTdGwfm2kSOECvTzwRgEKUIACFKCAxQvIPs+D+w/0gMGU6bMw/d85mPbvbEybESap1zJd/bPGxKkzMGHydBw7chT6fghi/hYcHIR/mrdG3YZNUadeI9Rr0AQNGjVH46Yt0LRZGzRv2Rat2nRAm3adoL4Drr/sY7Xr0AX7DxyECva8s93ioeb/O2ue3jF1pvR35b+FrWNS6N8HIvtQeF+KycCC7EfvO3gYjZo0Ry2xqPPCQr1u2qyVbtGydfuXFj169UWvPgOwbuNm+Pv6QvUVvFGAApETYC4KUIACFKAABT67gOGzt4AN+CABTdOQJGkS5MmXF5myZEbSpElhkGkIHZBXA9sfVOK7MxvlAMlZBsadnZ3lWEf7uEFuGUhPnCQxMmbOhATqrAJ5jbfdpB/WNjYokD+fasel3wAAEABJREFUfhZGhfJlkS17tpDlZJ4akH/bopGdrtgMoQebyi98Uu1TSa8vEqVKPisrK2TImAG5cueCswo2qMVkunoIm5Sri0sy/fJTjRrURbp0acXXACvxTp82LerWqamfKaOCPeH7qgI3X39VDIsWzMKCebOwfPF8bN+yAdMnjUWe3F8ibH4VvCkpeUcM6Q915pCtmIadD3UzaMgrQZ/92zZh9PCB+hlE6swW/T0Vtu3yXAVB0qdPh19+rIwhA/ugY/tWUmcuWNvYvFavKpaJAhSgQFgBPqcABSxIQHaivL19sGjxUvTpNxDdevRGt+6S1GNoevG6Z+9+GDZ8FAYOHoYtW3dAdnjwOW6apuHv6n+hUsUKqPZXFdSqUQ316tbS97eaNmmIFs2aoGPbVqhdszpy5vwCyZIl05uZKVMm2NnZvXs/R3aRjx8/gRGjxiBJkqQSMPHFsWMnsWjeHCyYM0/SggjTPJk3f/Z8TJsyDQ/u3UPM2WhInCgRypX9FlX//B9q/l1V3/dsUL8OmjZuqFu0b90CnTu2g/qeQWexyJE9O9KkSaWfSfzGviR4owAFKEABClCAAhSgwCuB2PaMAZDYtkYi0x4ZiNYHp0MH5yOzzMfkUfWp9DFlhC6ryolsuyWvCpQkk0CBnTpbRF7HiQOu0Haqfob2O+yjzHeQAFDpkiXQpVNb9O7RBT9UrqgfUCZIkAAVypdD/97d9enlvy0NfV2HWV4FTzJkSIefKn+Pn3+oiO8rlkfJEsXxRc4ccAw9Ayg0v9SVwMFBDuRzQJ2dEjr5tUfJYzAa8OWXX+jBKaMEcd56NofkVetA1aPOkEkjwRr9O2bU9NcK5QsKUIACFKAABSxWQLb7jk6O+hnCXWWQvHf3LujToyt6hUv9+vRA6VLfIEWKlDpF5oyZ9McYv5P2qiDG4AF9MGXiGAwb3B+D+vdGv97d9P2tHl07oGvndmjbtgW+k/2wCxcu6t8P169PT/1714zq7I23NVoCK6agYPQfNFzPoc7AvXrtOgYOHYVqNevi79oNJdWPMNWUeTXqNECjJi3x+MlTffkYuQsOQv06NTFz2gQMHzIAg8Slf5/u6NuzK3p066BbtGvbEt+U+BqeHh7wcHdHuXJlUOm7CtCMxhhpogVVwq5QgAIUoAAFKEABCnxmAQZAPvMKYPXvEZADVpjM7/6vu/cUERtnqyBGosSJkCp1aqRKk1o/q8dg0GAwGJA4SWKkTptGn544ceII+66WV4ENB0dH/awYa5sX34eivBDuJtM0TQs3MdxLIVaBDaigjeQPN/fNlyqPyquSev5mDk6hQDgBvqQABShAAYsRkG1/Wtl/adiwDtq2aYEWzZugebPGaBkutW7xD3J+kQNu7h5613PnzimPaqdDHmL4V+1jpU2XFukypIf6rjy1r5U6Tcj+ltofSyn7Xup7Qs6cO/+yZZUqlkPSpEmg7x+9nBruiZUNFixeipWr1ujfYacuY+rrH4AnXl4wyDxrWzt9emrxcnFxkefJ4OiUCFY2tpAMLwvTXj6LgSey/5YydaqXFmmk76nDWsj+acpUKbFuwya9MdmzZ0PhQvmRQpZ5p4Wem3cUoAAFKEABClCAAhSIXQIMgMSu9cHWxCcBGTzQDyLlIFQPPoT2/W3TQ+eHPqp8YVPodD5SgAIUoAAFKECBTykg+x/qDFB1KVZ1yc+kyZLijZTcGVbWVggKCoQpOFBvTaaMGYC3xT8MEgJQZ6G+TEbA6kOTlSzzIuk1hrtT+1xvSeaAQFy6dBlDR47VF+rTq0fIJUrfdcaDtS12bduG9h27SV9tkCplSmzdtAY3L5/Cg5sX9HT/xgWsXbkIDx95wtXVFe3btsDxQztxX6Y/un0JD+9exYPbV5A5cyaxeYFjNAAvHVR/PsJBtT+if4R5i0PovumRw8cxaco03UJdevXHSt+/ap8+lXcUoAAFKEABClCAAhSIGwKGuNFMtpICFIjrAmw/BShAAQpQgAIWJCBBEP0fOPSBdBm4V2fshk3QcPv2HXh4PobBKIP40nV7ezu5j/jX3dUda1etwd5du3Fg7z4c3HsAB/dFPh2Q/Pv37MX2/7Zh29ZtgOEDDnMkUHP5ylVM/3cOTBKwcXZOjh++Lw+X5MmhBwQiarK1Dfbs2olO3Xrj0SM3CfQE49dff0S5smWQTJZzSZkCKiVLlRLJnJ2lXD+9lCyZMiGLBDuSp3DR56eQoIk6G8NWfc+IyiHBj4vnL2Gr9GN3qMUHOCg35bdv915s3rQZZ0+fgb+f1B1REETVFz5JPj8fX7Tv1F2fkztXLlT6rhySS3/eaqHn5B0FKEABClDglQCfUYACFIhNAh9wZBCbms22UIACFKAABShAAQpQINYLxN8GykD6vXv38VgCIKbgYOTPn/etFmYJpri6ueLn36uie68B6NazH7r27IuuPeQxkqmb5O/Wsz+69eqHAer7OCIbADEa8ejeAyxdvhpLlq3Q2zh5/HD9u9EgfdAnhL+Tsq9cuIhadRvj0KHDMteM8uVKo3vn9tADL3pQyKQHT8wBAXjq5SV5Qn4TOCaAwcZGn6cHFELzioGew2DEgUNH0H/gUHQXh26SPsShq+RXy3QXhzZtu2DfgcPw9vbRi47UnZUduvcegN1790h2DaVLl8T/fv81pL0yhb8UoAAFKEABClCAAhSIawIMgMS1NRZn28uGU4ACFKAABShAAQrEGwEJHtx78ADunp7SZTOKFC4oj/IbOtAvT0N/VQAkOFgCBjJh1+492LFz94u0Sx4jm3Zj567dOHjwMA4fPSUlReJXgh/PnjzFug1b0EMCL2qJFs2aSFsLwd7JCfoZLmpi+CRBi2xZM2PC6JH6HPXdIiuXzIetvT30oIY+Ve7E4OlTLxw8clxeAI4JE8NOBT/0V2+/8/f1xeEjJ7Bnzz7pv7KIrEFoPmWxBxcuXoSfnx9Mylx7e30v51g7YOL48RgxagzsEzii0vcV0LFdSxjV2SmqjJcZ+YQCFKDA+wQ4nwIUoAAFKBB7BBgAiT3rgi2hAAUoQAEKUMDSBNgfCsRjATc3D7i5uesCuXLlwtvOqNA0DbYSGCiYvwBqVK+KWjWqRynV/Lsa/vf7L6j25694a/ACL24S/Hj6+DH+nT0PDRo1hbNzEqRIkQJz5y/Glv92wMvzMfTv4XiR/Y0HaXPlyhVw6MBOnDl2UIIbEjCRwMhr+QwGePv4YP36TfrkCt9+g8SJEr27bRJocHFxwW8/V8bf1f6KkoPyUxaVKn4n/XKGtbWV1Kk34e13EvwYMqAfmrVog+TJkyNRQkccPXYSEybPwGM3N0ghb1+WcyhAAQpQgAIUoAAFKBCLBQwx1TbWQwEKUIACFKAABShAAQrEFwEN6uyHR48e6R3OnTMH3nYSgqZpyJ4jO44d2Y25s6dh9swpUUpzZk3FssXzMG3yOCA4WK83wjsV/PD0xOjRE9C6bUckSpwYHh7uUG0NkuUa/dMCLdt0wL3bt/HWIIgEKlSQpWjhQkicRIIa4YMf0qdAf39cvnoNmzZv0ZtRosRXyJQ5IxA+rz73xV1QEH7//WfMnzsD8+ZMj5KD8lMWG9Ytl4DSnxLMSAjV1hc1vP4g7YS1PTp1aI/O3XtLwCSZBK3c8PDhQwRJW4YOG4l6DZvh5NFjgLXt68vyFQXeIcBZFKAABShAAQpQILYIGGJLQ9gOClCAAhSggAUKsEsUoAAFLEtADZgb5BBCPb4tqflBgfDxefXdE/nz5YX+/Rihy6g86nmozouAgj5QHx3PQ8sN/yjBj8fuHmjfqQd69x8ER0cnPH3yBIsXzsWmdSvkdQJ9idlzF6DoV+Vw6fyFV+3W54S7C21ruMmqr26ubvizei19TtEihVGoQD4kdXF5ezBCzyl3oWVG16MUGeGvWgcSlmrUsBGGDh8lwQ9nPRDUtnULXL98Bo8fe8JgtMaq1WtRo05jbFy7FmAQJEJKTqQABShAAQpQgAIAiBBLBQyxtF1sFgUoQAEKUIACFKAABSgQWwQ0IDAwEOqLzW/dvAV3N3d4SCAhovTYwxOnT5/V86oBdNUFdTaB54v8KjBw4/oNfT70QXiV4xOnF8GWW9dv4tcq1TH931lwkOBHokQJsWbFEvz5x2+o+ENlrF2xCBXKl9Mb88D1Eb7IXQjHjhyD+iJ3vChDn/m2O5VH+uT+6JEEDRrB3TXkEmANG9RFyRJfAUFBb1sy5qa/aKPrI1f89XdtTJs+E4mTJIWHhwf69u6OEaPGIlOWzHC9dx05smfR23Xh4mVU/rkKFsyZA0gQ6f0W+mK8owAFKEABClCAAhSgwGcXYADks68CNoACFLBoAXaOAhSgAAUoYAkCmgGPnzzBhEnTkDFrLiRPnQnJUmWMMCVNkR75Cn2FBYuWIXmypFDfKZEyXVY4p8yg53dJkxmZs+eRIMRsGUy3+uQ6ZrMZPt7emDN3ETJmy4Xde/bCaGWDnDmyY/rksfjp1x+hn3kSGIDCxYtjzMjBaCQBC4MEMpwSJkLhr0rj8LHjErtQwQst4vaqoIKkYAlwXJZgQZ4CJbBj5y49b/Wqf6Jg/jywsrMLqUef+nnuTCaTHsxZvmwFUqbNiiVLlusWTx57Yvzo4ejRq49Eup5BXUIseQoXHNq7DX9XqyrLBCKBgyP+rt0Qc+fOh1nKYRDk86xD1koBClCAArFYgE2jAAVipQADILFytbBRFKAABShAAQpQgAIUiF0CBgmCODk56o3KnDkTMmeWQMZbUsi8jHBwcICTk9PLvFkkf8YMGZAyZUo4OqqyzHp5n+pODfjPnbcIDolTonb9RrBL4IBkyZPj919/wNBBffD9j5UhkY1XgQkJguTMkxsd2rVCi38awtfXD4kTJ8FXJcri8OGjEhdQQZA3WxvgH4DHnp6YPGUGcuQuCHdPD9jaJcCPlb+XYEodFCxaJKSeNxeNsSnBwcHYvPk/FP26LKpUrQUzNBisrFG8WGEsnD8bzVo1l+CHN17eJMjhlDgxpk4ajRbNmkgQ6bmsy4SoVacR5i9aAhXsgQR9XubnEwpQgAIUoAAFKEABCsRCAQZAYuFKYZMsSoCdoQAFKEABClCAAnFfwGyGnZ0dChcsiNEjh6Jz+zbo1KHVB6eOskznDm3QrUsHKSv/q8DDpxCSwXl16a1tL87EsLK2QfEiBdG9U3uMGj4I31YoLwP+gW/WHBiIrF/kQIM6NVGvdnU8ex4SFFiwaCn8/PzxxqC/1LN+w0YkTZEBzVu3h70EWWxsbFD1z9/QvWsHlC5XLuJ6EIM3aaO/vz+uXL+JM+cu6RUXL1oIrVs0wcK5M1C12h/SxgB9+mt3EjRJ4OiIvr26onHD+nj2zEufffzEady4eRNvWIA3ClCAAvFagJ2nAAUoQIFYKMAASCxcKWwSBShAAQpQgAIUiNsCbL3FCUgAxNHJERW+L49WbVqgYdOGaNSkUZRS42aN0Xaub7MAABAASURBVLzlPyhdtsynPStC2mxja4sJY0bgOwl2tGreBAP69ECrdi2RJm3aiAf8Q1ecBEFy5c+vn71R7c/f0aB+Hf37MRwcHSIM2pQuVRKVK1XUly5auAC6d2mPLh3boliJElKPBE30OZ/xTiwSODmhetUq6NqpFerXrY1+EtQYMXQg0mVI/+71YDIhcdKk6NOzCxrUq4N6EhiqU6OqBIm+AGTeZ+wVq6YABShAAQpQgAIUoMB7BRgAeS/RR2bg4hSgAAUoQAEKUIACFLAEARlE1y8XJcEBREcKivhyUtFKJW1OkMAeY0YOQa/unfF16W8kIBEYuYH7wAAUKlYMLZo1wsC+PZE0SRJAynujfTItqbMzBvXvhc4d26FH1476GTI5ckqAQMp4I//nmhAcjGQpUuCvP37Xz4ApX7FCSEtkesiTd9xLoCNFyhT6mSAqkJS3UMEQx3cswlkUiJcC7DQFKEABClCAArFOgAGQWLdK2CAKUIACFKBA3BdgDyhAAQrEFgGDwYAvcuaAU0KnDx+0lwBG0eLFkDyFi3THLOktvxIEyZsvL/r36YFy35WHZpTDrMgEFt5S3CebLEGnLyQwo1uo9km7I12X5E2VJjXyFsj/4Y6RroQZKUABClCAAhSgAAXimkBsb6/smcf2JrJ9FKAABShAAQpQgAIUoAAFPkLAZIr47I3IFKkCBWr59+WVPEYrObySIEOEZ4q8b/mYmi/tjHL71LLKI6baGvfqYYspQAEKUIACFKAABWKZgOyhx7IWsTkUoED8EdA06F+eGVcfwdvbBTiHAhSgAAUoEA8F3nGSSDzUYJcpQAEKUIACFIgXAuwkBWK3AAMgsXv9sHWfQkANthvkrR/VZDQCcSVZSVtjZbKCCnx4uHvA09MzTiYPDw/A2hqIlb5h1ntceK9G5W8RvFGAAhSgAAVioQCbRAEKUIACFKAABShAAQrEKgFDrGoNGxM7BSIbMIjqQGuUB5BlEN3qw1NQUBDcHrnC3c3tg5OHuzsuX7iIyxcvhST1PKpJyjh14iSOHTkm6Wi0p0MHDuHA3gOvpf179mH/7phJ76xnz17s2rUHs+ctwrwFS+JkmiNtP7h3f+zwDF2ne/a/tr4PSPuOHDoc7e+tY0eO4vjRY3pSz8+dORvlv4dL8vdz/eo1eLi5R/rvUf39mtQlOCL19x8mGPS+z5q3fYa9K0ATOz+12SoKUIACFKAABShAAQpQgAIxJsCKKEABCsRmAQZAYvPaCW3b2wbf3jZYp6brA30fHhxA+AFFa2uogMGjBw/h+vBRhEkNRl69chVqEPRD05mTp2XAVg3afnjatX0ndm7bgR1bt2H7f5FLO7Zux7p1mzBj1jxM/3fuB6d/Zbl2nbujfaeQNGjoKAwcMjJKSS37T4t2qPhTFajno8ZOwqixE6MpTZIyR6JX34Ho1W+Qnrr17Is10vf/tu/Clm07P2/aKutOBu19fX3x7NnzOJl8fHywacu2z+sYZj2q9bpg0TJ079VPX99qvffsOwhDR4yR91T0vbdGj5skdfTHj79Vw+9/1sKPv1dHl+59MCgqfwdDR6LfwGHoKe/TGfK3FZm/yZmz5+NfSes2bpa//e3v/NtXnw0qCPT+dEA+hw7gxLHjOC/BnLCfY2dPn8H9u/fgKkHT8J+B6nMR1jZ443Mz/Oeo/loCMeqzOTRF9Lke+pnPRwpQIC4LsO0UoAAFKEABClCAAhSgAAUoEIsEDLGoLZbblNAzKEIHvkIf9UGxdwQprEPmqcG3h/cf4GWSYMTtW7dx8vgJnDp+8s104qQM5u2X4MB2STsiTLu278DmDZv0tHHdBrwtbZJ5K1aswZTpMzFp6r8RpsnTZqLvgKFo1a6zPpg5WIICg4aOkgH4d6fBw0ahz4AhaN66I6bOmA1VTmTTlOmzZFB3otQxEnv3H8ahI8clHXtvOnj4KC5cuoQUKVxQrEgBFCmU/4NSwfx50bblP2jzIjWsXwsN69eOUmpQtyaGDe6HNcvmoWfXjujcobWkNtGUWmNAn+4YNWwQRg0dqKcxI4egZbPGaNqoHv5pXP+zJ9WOhvXEL86m2p/dMOx6bNq4Hjq0bQG1nkPX+WhZ/726d5b3VDS+t9q3wYC+PbFs4UwsmDMNyxfO0stvoNbjh/4t1KuNJg3rol7tGihUIO97/xbV36yzcxKoDdf585eg/p4PHXnb3/1xHDh0DBMmT3/nZ4v6LOk3aBh+0gM5fTFo2GiogGRoGjhkREgZEXz+qc+tTRs2vP75uWEj1OerCs6qpJ6rYO3BfQegzvhSn9knj53AjWvX8VA+y0M/1+/fuw+z2YyQy6qFfPa/EVgJ3Xaox7ABFLWNsdwtKHtGAQpQgAIUoAAFKBDrBdhAClCAAhSgQOwVMMTepsXhlqnBKDVApQIc1jbw9fHBvbv3cPH8BRw5dARHDx/RL0mzY+t2PQCxaeNmbJG0ZuVqrFy24lVaugLL5fXocZMxdsKUl2mcPB8+ahw6dO6JISNGY/DwUa8lNXA3eepMzJm/WNKit6TFetBh3KSpuHTlGs5fvBJhOnfhMu7cu4esmTOjQrnSKPdtqTfSt6VLonGDOujbowvatmqGVs2boHUkUqtmTdC5fWtMnzwOnTu0QdeObSOdukj+IQP76IO9jRvWQUM1+CqDqQ0jkRrUrYU///crvq1QHuW++/D0bfly+LZ8WT19/U1JlCgV9fT1NyWgyshbIB9y580TrSmXlJcrb26Epjz58iJ12jRwSZmCyRINUqRAhkwZod5HoetcParX0ZlUmQULF9TftyHv35D3cFT/DkqW/gZlK5SL1N/it/I3+2eV31Gn9t9QAcR3/71LcE0ClN06t3/n50oX+dwZMqA3Nq1dgv59uqGVBAnDfn6pz7QfKlVA2TLfvPbZ9135MnBwSIBz5y6+/Oy8cOkKTp48q5+hMmf+IsxdsBhjJ0zF71XroFO33hgyfIz+WT1Igr+jxk7COPksD/1snzBpGhYtXo4V8pmvtgMrlq58uX34b9MWqKQuN3ZUtiEnJIDyQAImKjh+785dPHn8GPqZKNbW8viW4Il+VqARCBs4AW+fRICFUoACFKAABShAAQpQgAIUoAAFKBBrBAyfqiXxtlwJfvj7+eHS+Yv6gNWiefOh/sN4hAQsevcdhJ59BmDoiLH6fxirAbLlK9dg+YrVWCaPcyRgcevOPdy//wh37z/U04MHj1D1z9/w2y8/vEy//lwZNav/hSEDe6Nz+zbo0qHt66ljG3Tt1BZq4O9tqWundhg6qC9GDx+M2jWqoW6t6m9NdWTer1L/1zLQrwYrI0pq8FPNL1q8KAoXK/JBqUChAsiR8wvk+DLnhyVZ5gtZxkUGfpO5JEdkU/IULnBwdAACA4GgoNiRgoOBmEjqexOYAEs2iIn3karjc/ztyN+so6Mj1N9wZP7ek7u4IGeuL9/9uSKfIyo4WLiofG6pFP7zS6apQE/4z72vJPgZ8tn598vPzjo1q6NBvZro0bUj1Gev+pwd1K8ndmxehXGjhsrndWv9s7qbfP7WqVUN6rNcfbb/77efkEva4e7piXv3HoR89j9yxYrV67Bq1TpUr90YDZu2htp2DBkxRh7HYMTo8RguaeSYCfoZLovmLcSCOQuwbNFSrF21BqslrZVl18qjOhPl4N4DUN8BdO3qNdy9fQe3bt4KCYboQRMVOAlNoQGUcMESFTiJtxt2dpwCFKAABShAgfcJcD4FKEABClCAAhSIrQKG2NqwONsuCYC4e3hg0rR/9f/+PXnmPL7InhV1a/+Nrp3bYcSQ/ujTswv69eoGddmjbl06oLskNVim5qkBtb+r/6kHOFSQo0a1P1GwaGEUKVY0XCqCgoULQZ05ED7lK5BfH/DLkjUL3peyZsuKJEmTIKlz0rcmZ2dnJHBQAYNIBAvUwGhMp6gMZqtLzcTZNxkbToF4LKD+dj/kbz46Po+CJEAZPuAjwRjnZM5vfG4md3GB+lwN/ezNLoGNvPnzQU8F5PFFUp/foZ/rhYoWwS8vAtvqc1+lGtX+gAqUdJVg9u5t67Bp3TL07tEZfXt1lW1HB9T6+y/UlYCLCp4kSZQYT589w3MfH1y5dgNrN2zG5s3bJDAyA3Ubt0L/wcMxdORYCZyMhbpE4cChIzFMXk+eMgPTp/6LafK4dOFSqLR88TLs2bkb+3bvw51bt/VAyc0bN+Hm6gZY20oKDZS8eFRnOoYmdeajCpSEJtkexuN3KrtOAQpQgAIUoAAFKEABClCAApYtwN7FEQFDHGlnnGqmKdiE02fOosTXX0Fdqqlc2TLI82IA7Ms8ufX/SM6Z+0tkypIZGTJmeJUyZdSDEYmTJEbYhEAJPERlEC+yg4RqQDEyKU6tBTaWAhSgwCcWiOhzM/znbmQ+uyW44uDo+NrnfqLEiZBetg8q5cz1Jb74MmfItkOe58ydC3kl0J0nf158VbwYqlb9H6r9qdLvaFS/Dnp164TuXdpj4rgROLRnC6ZMGI1hg/pixNABaN+2Bdq0aIoy35SEjY0NDBKsUI87du/Brr370OCftlCXWBw6Ygx69R2kpz79h2CYvB4/dizGjRqHqROnYs6seZg7cy7UpRu3/7dVP+Px7KkzuHH9hv79JlevXIVZWVjbAHqylscw6WXQxAAYXyRpC3ijAAUoQIE4KsBmU4ACFKAABShAAQpQIHYKyKhD7GxYnG2VDIilSpVS/8/dg4cO4+nTp7BOkAD6pZbCD4SpwaHwSZZH+BRnMdhwCsRDAXaZAlERCP+5r16Hbh/CbzvCvNY0DYkSJULCRAnhlDAhnJMnQ5p0afXv+8mQMeOrswCzZdWfq8sNZsuZA5Urfwf1XUgqVfntZ/Tq3gnqrMRTR3Zj3OhhEugYiu5d28v0jmjX6h/kkcBLkkRJoM4I9PcPwJEjR7Fq7Xr0HzxCAibjMWL0BPToMxCduvbSU0953nfAUAweOAQD+w/CZAmaTJs0TT/bZNqUafr3m6jvvrp+9TquXr6KK5euQH2vCaztERIwsZHHMAETa3keGjRRj+psk/ApKu5chgIUoAAFKEABClCAAhSgQFQFuBwFKBAnBAxxopVxqZEyaGVlY4O8eXMjc6ZMGDV2Im5evQqowZu41A+2lQIUoAAF4oaAbHdeBs5DgyZve1TBk6BgJJDAvKOTI1RS34mUImVKuKRMgfQZ0oekjBmQOUsWZJKUO3cu/O/3n/Hbbz/ht19/RJ3af6N3jy6YPH4UVi9fiBlTJ2DW9IkYP2YoRg4bgDEjh6B2rer4Ins2ZJYgTLZsWXDt2nVcvHIFPfsOQt8Bw/WAydARY9G8VXu0aN0Brdt1RpfufdCjWzd069Id/fpIOaPGYfTIsXqaP3s+1PeZqDNOVi1fiRPHjuPKxcu4fPGSni6cOw+ogIh+tokKnoRPEkBR2+HQ9LYgigSU4sZKZyspEPsE2CIKUIACFKAABSjqwVYHAAAQAElEQVRAAQpQgAKxUcAQGxsV59skA0/JnJ1Ru0ZVODsnxdjxU3D98hWAl/eI86s2Eh1gFgpQgAKxXyBs0EQ9l+0WIkoqYCK9Ud8DpYIm9hI4cUropJ9pkjyFC1KlTqWnlPKYJm1apE2XDqnSpkHZ0t/gl59/wM8/V8bPP1RCj64d9EtznT22DycP78bCudOxaP6/mDV9Eub8OwUTxo7Aj5W/R8H8+VGkUCGoMylv3LyJe/fuY/+BQxgyYoweNBkxZgJGjZ0kgZMOqFWvMWrXa6Kn5q06oFmz1mjZvDVaSGr+T0v97JPB/QdjoKSRw0djxZJlWLp4KZYsWgJ19smlCxdx4dyFl+n8mXPw8vLC62ehhA+khL4OF1BRgRUVgIkocdsv76DP/KvWjx4ck/X2mZvC6ilAAQpQgAIUsCgBdoYCFKAABeKAgCEOtDFONlGTAQ/1n7Q/yYDOkaPHcffuPej/nRone8NGU4ACFKBAvBZQQZKwKaJgSeg0CZpY29jAzt4OdnZ2sJWUUL9MVyI9cOKcPJk8Jkey5Mn1s05UICVjxgz4+adK+KFyRUnfoWb1PzGgTw/9TJMZU8djz46NWL1iIdasWIS1Kxdh/eql2LB2mZ42r1+Jbp3b4fvvyqF8+W9RQVLl7yvi4SNXeD59And3dwwcOkoPoIwcLQGUMRPRpUdffFf5d1T66X8v059/10HNOo1Qq2Yt1FTPJf1dvRY6tOuE7l17SurxMqkzUubPnQ+VFsxZgEULFumBlHNnziJsUt+L8uD+A4QEVWzlMWyykddvSzJQrw/ah3uMKMCipsk+x+d/f8bCFrwwnDxxKmrXrIeZM2aLuX0sbCibRAEKUIACFKAABShAAQpQgAKfSsDwqQqOt+WGdlwNFMnzfPnz6gMzx46dxGNXN4CX1wBvFKAABShg4QJqGxhRCg2ShH+UvDa2trCxtYG1jY0eNHFwdISDowOcnJz07zlR33WikgqmJE6SGEmSJNFTwsSJULpUSVSSoEflit9BpYrflcXg/r3Rr1c3DOrfC7evnMF/G1dj26Y1etqzfSPOnzqIcydD0vnTh7FiyTw0blAP1f+qgr+r/aGn2jX+RooULggMDESQBHakmVizbhNGjBkPFUxRST2v9nddfJm3MHLnL/ZaylOwOH785Q9pW2V8X/GHl+m7CpVQt04DtG7ZFq3CpLZtOsi0dpg6eboM1s/ErOmz9PSvevx3lh5cOXPyNMKmUydO4e6du4B1AklhAyyhz21kekTJWqa/JamgyrtSXAi4iMfE8ZNRqeLPmDt/EZIkTYIBg4Zhy6b1gLoEmoX/CbJ7FKAABSgQQwKshgIUoAAFKECBWC9giPUtjMsNVCMlMoCQOHFinDp7Fo9cXcHLYMXlFcq2U4ACFKDA2wQ+erraZkYlSTDFKNtaK2srhCajDHCrM1DU2ScqJXBIgNeTgwRXHF8mdXmv7NmySoCiHL6r8CpVKF8GbVr+gwF9e6B/7+7o06srjh3ciUN7t+Hgnq0vk/9zD/g/d38tBXh74NG9axjYrzfatW6J9m1avUydO7TB18WKQrXRUdqmUsKETjh+4iSWLF+FMeMmYcSoCRg+epyk8Rg9diLq1m+qB1fyFvoKYVP+wl8jXeZc+OKLL5E926uUN09B/P7bH6hXt6EebKkrAReVGtRvrE8bN2oc1JkRkydOlseQNGXCFAm+TNUDLCePn0RE6fjR43ion9XytoBLaOAlMo9vCcBYv2O6rFv9jFpZ5288vlzOSfo0Ds1aiHOJ4ti3a4usv274+afKOH36HPjPKOCNAhSgAAUoQAEKUIACFKBAlAXi2oIMgHzyNWaGWQZ0TDJA88mrYgUUoAAFKECB+Cog21rZ4CLKSdwMBgPCJk3ToIIpVjKwricZfLe2CTlLxdrm1aM6c8VGP4PFFqGP1jY2cHFxgTobpXy50gibyn5bGg0b1NHPUhnQt6cEWHrqZ6vs/G897t+8oJ+ZcubEAZw5cVDSAZw+tg8m/6evJXOAF5553sfWTeuw87+1mDx+DKZOGq+n6VPGo0PbVvgiR3akSZ0aadOk0VOG9Olw6/YdbNqyHaPHT8awEWMwdMQ4PQ2Tx+FjJqBx01Z6gKVAkRKIKBUq9g1Spc8mMQQrSbYRptKlyuHXX/6HX37+PcL0R5Wq+OvP6hgn9Y0dORaRTeq7XDZt3IwTEoQ5duQYwiYVrJk6cSrGS7DI1s4eTZu1Qa8eXdCjZ1dIIyVWYsSTJ0/g6ekJwEoSf+OtgPxdyxsC0ZqsjID+PTM2cedRPs+i1SA0KKl849ebi72lAAUoQAEKUIACFIjlAoZY3r643zwzkDhRQhmPMYd8uWrc7xF7QAEKUCACAU6igIUKRENg5YNk1OChJE3TZNw+JMkTqO8WC5vUNEcnJ5QrXwaly5RCmW+/eZlKlf4GNWv/jYED+6BfPwmuvEi9e3fHf1vW4f7dK7h29ayersujSur1lUunYDb5RJzMvvDyuI9d2zZi784tb00H9mxD1b+qIF++PChYIP8bqUiRQti7/xBOnzmH0eMmYcyEKZFK46fMQLsOXVDph99QUIIwhYuXQthUQAI2jZu1Qou2XdGsaQOYzf5Q/UVQEGAywd7BASOHDsSevQdw5cJZwMhd4A96X0Y2swQREToQHvZRgoiIFckGgQEB2L1zL/bujsa0az+6du4uQbfe6NypKzp3jKVJ2tazey9069oDmzdswb49+6LVYdeOXXqgMSQY9I4zufT3ggoWvS/Pi/kRBWs0LbLvSuajAAUoQAEKUCDaBVggBeKWAI/+YmB9SQzkRS3cUX8BwQcKUIACFKAABSIS+NCAiwzuqwH+N1JwMBBRUgGBqKTAQDgldEKpb0ujRKmSb03FS3yFps0ao0/fXujVp8cbqXuPrnhw/wYuXDglAZjzuHbtQqTS5Utn9KCG2Rwoj+9IQV4YOWo4EOgf0n/lqZxfPBpkgP78+QuAxl1gfMxNk31asYRK6rlKEvC4cvkKdm7fiZ07d79Me3fvx4B+gyRA0ANdu0jq/DlTd/SWtpw9fx5WMqiuaZrEEj8yvSjj5x8r4ZeffsDgIUMwWIJtsTJJ22rVqIYfK1WEk5OD/g7QtOjpv6ZpsLGxwZJlq/QAUNd3rOee3XuLux3U47vyqXmdJJj074zZ2LNrz8v31PatO+Hp4QEYDZCCop7AGwUoQAEKUIACFKBAfBCQvcb40M3P20dN0+Dh4YmAADkYl+eftzWsnQKfRoClUoACFKCAhQuoIEJkgicSLEFggAQh3pZkf0gFKKKUfKXcdyVVttQbwaqwsjLi2zLfwMx9sQh0PmCSBD0uX7qM9jIw3UeCCf0HDkP/gUPRu/cAXLp0FQkS2MNOBsJDk5WVAWXLlNLPSBo4qD8GDv68aYC04Z/mTVD86+Io8U2JaEpf6eUVLFwQCFTvT3kPvvNv4HPN90XWbFnxlQQqvy75dTT1/ZWhKrdRkwZ6AOhd67lv/z4SyPSHenxXPjVvyNDBEliqBKME2ELfU46OCbB23Sb07TtIf++p919EqVffgdi7dz927t6LXRJAOXToCKRiBAcFSwqSuLHptRQcHPJaXb44bNL/OtTnRmSTvgDvKEABCli2AHtHAQpQIC4JMADyqdeWDBYkT5YMJeVAw2R6dS7Ip66W5VOAAhSgAAUoQAEKvC7g4+OLmzdvA1q07QIjPt7Uf/onSZwYv/30A7r37CmpK3r37YEff/kBRYsX04MBKsAQmtTAONQZSbEmKBAYcoaQalN0p9j+hlBnjUV3n8OW994AaGjwx1+CRaHP3/XoD2dnZ3wtAZvQ91PR4kVRu35t9OzdXX/vde/ZNcLHPn376oETB3t7ODg4yFswCEOGj8bAIcNRv3EL/TJ8I8dMQGgaMXoclixfjb37DmCXBE5U2imBEzc3d4npBiDA3/+N5Ofr+8a0YPEIn0zKXdPwUWesRHZ5fODtRbmqzR+4JLNTgAIUoAAFKECBOCHAo78YWE0mCYIEB5tioKbPWQXrpgAFKEABClCAArFXwNbWFmXLfANXVzcZ/A6KvQ2N7S2TgdyMWbOg2l9V4B/gD5P/cxnIloCCGvhWZwjJ4K+MNItx8OsptveL7Yu9AnIs9cZ7Sr3f3pt89bNdihQrgsJFC0sQpQQ6demAHr26Ydbs6WjbvjXad2z7MnXs3BHly5aCvQRMEjo6QqUkSZJg285dmDxtJqbOmP1a+nfmXDRp3gYz/p3zcvq/s+dj/4Ej2LP/4KskwZQLFy7BV4IlPt7eiEx65vUM3m/JGxgQoAdkInoMkHl6IMMQyWCLwaC3y9/PD1u37QDkNXijQKQEmIkCFKAABSgQdwQYAImJdSU77eo0ak3TYqI21kEBClCAAhSgQEwJsJ64ISD7YtYSAClUsAAOHjqCc2fPA0Zj3Gh7bGylBDoyZ88Ga2trHD9xkpaxcR2xTSEC4QNyL4Mm6qyTF4G7l9P8kSxZMj1Yoi5nplL+gvlRtdpfaNGqGZq3/Oe11KR5EwmkzEDTFk1fTm/SuD4cEtghSaKEL1PSpEng4emJOfMWYeGiZe9Ni5eswIDBw/X8CxYvfS2/eq0+w/YdPIyI0n4JvFy8dAXPnj6D19On700+z59j7vzFmDN/IU6cOiPLPYV+lgp4owAFKEABClCAApYjEG0BEMshieaeyAG3ukxAIicn+Pj4AHLAGM01sDgKUIACFKAABShAgUgIqMvQ7Nl/CHfu3AEH+fBxN1PI2c3quxk+riAuTYFYJCDHbm+cbaKO314GSQJfnfGkTwsXSJG/i4JFCiFfgfwvU978+VDq21Jo3LQh6kuA5H2pbsO6+veoNG3WGA0aNXhtGfXaSY4rk0lQJaKkLr3sKcGWlavWYs3aje9NS5avROGC+dCwcUNU+f0XdO/dH7CyitQKYSYKUIACFKAABSgQVwQMcaWhcbadshOdOHkyfPllDpw4dRbu7h6AOiU5znaIDacABShAgTACfEoBCsQhATVYX+W3nyT2ocWhVrOpFKBAnBIIDnf5N/U6SKbpAZPwAZS3vQ4XWAmzrDorJXfePIgo5cqbG9+U/ga16tVEjTp/vzfVqVcbBQsX0oM6Wb/IBUcHxzhFzcZSgAIUoAAFYliA1cVRAQZAYmLFSRBE/cehlZURGoMfMSHOOihAAQpQgAIUoMDrArI/ZmVlhSyZM8HPz+/1eXxFAQp8oACzfzYBFVB5XwoMkqBGJJMqS+9MMMzyoz/lHQUoQAEKUIACFLAgAQZALGhlsisUoMBnEGCVFKAABSgQhwTMePz4Me49eARoPAsEvFGAAhSgAAUoQAEKRF6AOSlAgTgpwABInFxtbDQFKEABClCAAhSgwIcKGI1WSJUqFfx9fWVRBkAEIcq/XJACFLA8AVOw+m4ffjZa3ppljyhAAQpQgALxW4ABkPi9/tn7jxdgCRSgAAUoQAEKxBEBa2sruDpmPwAAEABJREFUZMuSGR6Pn8DX6yl4Fgh4owAFKPBCwIwvsmeDx8OH4HdWviDhAwXeFOAUClCAAhSIgwIMgMTBlcYmU4ACFKAABShAgc8rEAdrN5thbW2NdOnS4NbtO3j4kJfBioNrkU2mAAU+lYDJhGzZsuD8hYuAxmEC8EYBClCAAhSggMUIcM/mY1cll6cABShAAQpQgAIUiBMCRhsbpE+fDnfv3sVTLy/wDBDwRgEKUCBEQILEWbNkxs3bt3kGSIhIxPecSgEKUIACFKBAnBNgACTOrTI2mAIUoAAFKPD5BdgCCsRJARngU+1+6vUM7p6eYAAEvFGAAhQIETCZkCJtOhw/fkpec5hAEPhLAQpQgAIUoMALgbj+wD2buL4G2X4KUIACFKAABShAgUgLWFtbocTXxSX2oUV6GWakAAUo8ELAsh/MwfiqWFHAbLLsfrJ3FKAABShAAQrEKwEGQOLV6mZnKUABCkSXAMuhAAUoEDcFjAYj7Oxs4fXkGcAYCHijAAUo8FJA0/D46VNAHsEbBShAAQpQ4KUAn1AgbgswABK31x9bTwEKUIACFKAABSjwgQKeno/hqS6BBUZAPpCO2SlAAYsW0HD12jXpIT8bBYG/FKAABShAAQpYiAADIBayItkNCsS0AOujAAUoQAEKxDkBsxm2trYokD8fAgIC4lzzY1uDNQkgaZoW25rF9lCAAh8hoM6S+4jFuSgFKGChAuwWBShAgbgswABIXF57bDsFKEABClCAAhSgwAcJGAwGODk4APpesH73IcszbxiB597P8ezZ8zBT+JQCFKAABShAAQpQgAIUoEDsEuBRX+xaH3GoNWwqBShAAQpQgAIUiGMCZjMcHBKgYIF8uHTpKh7duyuBEO4OR3Ut2tnZwd7eLqqLczkKUIACFIgzAmwoBShAAQpQIO4K8Igv7q47tpwCFKAABShAgZgWYH1xX8BoRAIHezx77o0Af/+435/P2AOjWKr0GZvAqilAgegW0FSBRnXHRAEKUIACFKAABSxCIMoBEIvoPTtBAQpQgAIUoAAFKBC/BMxmGI1W8PT0xN179wF+hwWiejObzFApqstzOQpQIPYJmEwmnD5+FJAAZ9jW8TkFKEABClCAAhSIqwIMgMTVNcd2U4ACFKDA5xBgnRSggIUI+Pv7IygoCAyAIGo3CSQ5OyeFczJnQJ5HrRAuRQEKxCoBswnfV6gAb2/vWNUsNoYCFKAABSjwmQRYrYUIMABiISuS3aAABShAAQpQgAIUiJyAna0tChcqELnMzBWxgMmE9OnTIUPGDGAQCfHgxi7GDwEzrK15+av4sa7ZSwpQgAIUoED8EWAAJCbWtWaAwUDqmKBmHRT45AKsgAIUoAAF4r6ABrh7eMLV1RWQ5+AtagJGIw4fOowzp06Dl8uJGiGXokBsEzCbtdjWJLaHAhSgwOcTYM0UoIBFCHBU/lOvRgl8PLp7F4eOHIe10epT18byKUABClCAAhSgAAUiKWDm939EUgp4W0ZN06Bp2ttmczoFKBDnBExxrsVsMAUoQAEKUIACFHiXAAMg79KJpnmaBEGsjUaYYI6mElnMZxRg1RSgAAUoQAEKxHEBDRp8fXzh89xHeqJJ4i8FKEABCqjDVU0zwmzmcSvfDRR4IcAHClCAAhSwAAEGQGJoJar/o1FngBg0Ief+ZAypsxoKUIACFKAABaJHwIJKkYE9BwcHlCpVEiaT2kOzoL6xKxSgAAU+RiA4GN98WwrrNmwCDHLc+jFlcVkKUIACFKAABSgQSwS4V/OhKyKK+YOCglCgQB4kcUkOyIF3FIvhYhSgAAUoQAEKUIACHymgaRpsrKyg9s8gA34fWRwXpwAFKGA5AqZgWFvbWE5/PrYnXJ4CFKAABShAgTgvYIjzPYhDHQgONjH4EYfWF5tKAQpQgAKvBPiMAhYjYDbDIVFCFC5cAMdOnMLtm7f4n84Ws3LZEQpQgAIUoAAFKEABClDgYwUsbXkGQCxtjbI/FKAABShAAQpQgALvFpAgSHBwMKysrGAwGt+dl3MpQIH4LMC+U4ACFKAABShAAQrEcQEGQOL4CmTzKUABCsSMAGuhAAUoYFkCmnTH28cHAQEB8oy/FKAABShAAQpQgAIUoECIAO8pYFkCDIBY1vpkbyhAAQpQgAIUoAAFIiFgMBhw/sIFPHrkCmgqHALeKPCmAKdQgAIUoAAFKEABClCAAnFagAGQOL362HgKxJwAa6IABShAAQpYkoDBaETaNGkk9sHghyWtV/aFAhSgAAUoQIGPF2AJFKAABSxJgAEQS1qb7AsFKEABClCAAhSgQKQFTCaTBEDemZ0zKUABClCAAhSgAAUoQAEKUCAOCzAAEodXXsw2nbVRgAIUoAAFKEABCxEwm2FlNMLe3h5+fn5gFAS8UYACFKAABcII8CkFKEABClDAcgQYALGcdcmeUIACFKAABSgQ3QIsz2IFbGxs4OTkiKfPnoM3ClCAAhSgAAUoQAEKUIACFLBMgUgHQCyz+zHTK00DNE3uwBsFKEABClCAAhSgQGwQMEN+zGYY5Cc2tIdtoAAFKBCbBNgWClCAAhSgAAUoYCkCDIDEwJr09vaBh4cnrK2spDazJP5SgAIUoEAcEWAzKUABCxbQNA2axn0zC17F7BoFKEABClCAAhSgAAUiK8B8FirAAMinXrFyYO3t7Q1XNzcYVQCEx9ifWpzlU4ACFKAABShAgfcLyD6Zj48PAgKCAA28UYACrwnwBQUoQAEKUIACFKAABSxDgAGQGFiPmqbBYFBH1nKkDd4oQIE4JcDGUoACFKCARQrY29sje7Zs8A/0l/6p/TR54C8FKEABClCAAhSgQPwVYM8pQAGLFGAAxCJXKztFAQpQgAIUoAAFKPBWAbMZ1tbWcEmWDGZ5/tZ88XgGu04BClCAAhSgAAUoQAEKUMASBBgAiYG1GBwcDDd3D6jHGKiOVUSvAEujAAUoQAEKUMAiBcwINpsssmfsFAUoQAEKUIACURLgQhSgAAUoYIECDIB86pVqMiFL5syYPnks8uTOBcjrT10ly6cABShAAQpQgAIfJxB/ljYY1O4wL4EVf9Y4e0oBClCAAhSgAAUoQAEKxCcBdcQXn/r74X392CXMZiRwSIC06dLB0ckJkNcfWySXpwAFKEABClCAAhT4OAF16SuVrl27AY9HDwGNQRDwRgEKUCC+C7D/FKAABShAAQpYnAADIDGxSlXQQ535oR7VfxnyADsm1FkHBShAAQp8hAAXpYBFC8g+WaJEiVAwf148fvwE/n7+YAAEvFGAAhSgAAUoQAEKUIAC8VDA0rvMAEhMrmEJfty7ew9eT70AeR6TVbMuClCAAhSgAAUoQIEwAkYj7O3sYFaT+M8pSoGJAhQAaEABClCAAhSgAAUoYGECDIDE5AqVoMfBg0ewYvU6PFNBEB5sx6Q+66IABT5IgJkpQAEKWL6AOST8YfkdZQ8pQAEKfICAUQLEH5CdWSlAAQpQIM4LsAMUsGwBBkBicv1KwCMwMBA+Pj4wmU0xWTProgAFKEABClCAAhSgAAXeJ8D5FIjvAnLMOnf+IlHgUIEg8JcCFKAABShAAQsQ4F5NDK9Es2aGpmnQYrheVkeBDxVgfgpQgAIUoEB8EDAajDDIvll86Cv7SAEKUOC9AmYzqletItnMkvhLAQrEFwH2kwIUoIAlCxgsuXPsGwUoQAEKUIACFKAABd4moGkatu/Yibv37gPyHAB4owAFKBDvBfTPQwZA4v37gAAUoAAFKEABCxFgAMRCVmT0d4MlUoACFKAABShAAcsWsLa2RubMmRj7sOzVzN5RgAIfKsDYx4eKWUB+doECFKAABShguQIMgFjuumXPKEABClCAAhT4UAHmj18CMshnNstd/Oo1e0sBClCAAhSgAAUoQAEKUCDeCLw1ABJvBNhRClCAAhSgAAUoQAEKUIACFKBAPBZg1ylAAQpQgAIUoIClCjAAYqlrlv2iAAUoQIGoCHAZClCAAhSgAAUoQAEKUIACFKAABSxfgD2MJwIMgMSTFc1uUoACFKAABShAAQqEF+Dlr8KL8HV8FWC/KUABClCAAhSgAAUoYJkCDIBY5nplryhAgagKcDkKUIACFIg3AgajEUZJQUHB8abP7Gg8FdAMgJ6M8hg+aeCNAhSgAAUoEC8F2GkKUCBeCMiecLzoJztJAQpQgAIUiL0Cmgw+haawrQydph7DTlfP1TSV1POwSU0LTaHTQ1+rx9BpfKRAfBcwm2FvZwdHRwc8ffoUiOd/H+DNwgTUdkUO9TQJdhhsAKM9YOUgKcGbSeaZDbYITdCsAbWcngzgjQIUoAAFKEABClCAAnFZgHu0cXntse2fQoBlUoACFIhZAaMRvj4+eOblBa+nXjDLoKzeAE2Dl0x75vVMnx52cFbl8ZIBW7UcDK825YGBgXpeVU6AfwD0eVK+n6/fy/L1so2vltFf844C8VRAXQBL/T1pmhZPBdhtyxPQJJBhBRht8TLgoZ5rBsDsC/g/ALxvhKSAR4BJthUS6NCMNghNsLIDrF4ESox2Up4NZCZ4owAFKGCBAuwSBShAAQrEAwFDPOgju0gBClCAAhSInQISvHh47z62/LcNy1etw8IlyxEQoAajNMDKCmvXbsSylWuwZ+8BwGjU+6AGa+/dfyB5V8j0/fCT4IkeHJGy1PQVK9di6YrVuP/gAZ5JQOXq5SvYtn2HlBMy/djxE7hx7TqCg016ebyjQIgA7ylAgTgvoIIcEuzQjPaAwRoIfg74XAO8zgFPjgHu24C7A4GrmYFrJYD7owGPHcDj4zL/RJh0Fnh2UYIld6ECH5qUCSv7F4EQA3ijAAUoQAEKUIACFKBAXBLgHmz4tcXXFKAABShAgZgSMFpJ4GMtfq1SHXXrN0aTf1riwYOHgH4WiIatO3aiXoMm2CoBDKiBLU2Dn78/Fi1ZoeedMn0WLl26IgNdsjk3GODu7oG6DZtgw8bN8PDwxM5du1GgaCn8+OufejkNGv2DwsVLY9DQURJo8YceOAFvFKAABSgQ5wU0CZK/CHyYg59JAOM88Gg9zLf/Aa7nBm4UluDHTzJ9vXQ1j2xnkknAY4FM+x64WUjmF3yVrsv86zmBe8MkOHIS8JbtDDTogRCjHeQJeKOAxQiwIxSgAAUoQAEKWLyAjJhYfB/ZQQpQgAIUoEDsE9AkmPHMC0+ePEWaNGlQs0Y1WNvYYvuuvQgKCpL2mlHp+wryCIweO0EerQFZRs3r0KkrbGztcevWbdy8dQuQ4EeQn58EQNyhbtX+rIKECZ1w7ORpPJc6JowbhU3rVmDLhlUYPnQQChbIL4u8vguglmOiAAUoQIE4KKDJ57kemJDHAHdoD1cBN6tIAKQqNL87gJZPthMvkpYQ8iIkaUnk6YvphjCPRnkOCYJ4rZVyCgC3ugCe+wD/e4AKtOhng1gB0MAbBShAAQpQgAIUoEDcE4hvLQKoGnQAABAASURBVJa95PjWZfaXAhSgAAUoEAsErIw4eeo0Dh85inTp0iJ7tmwoXDAfFi1ZFtI4kwllS5fSnydOkhTXL53Vn+tniMizvLlz4tjxE3D39JRXVrh//wE2bdkmzyEBlVSwMhrh5uauvy5UIB8qVv4eFSr9gDq1quGHSt/B2loCKvqZJnoW3lEg3gpoGgdx4+3Kt4iOy/vXYAuoIEiAbA/uzQRcawEmNT2fTLdB1G5ymKiCJSowEnAKuFMJuDcZeHZJL07TzzZRZUs9+pQ4e8eGU4ACFKAABShAAQpYuIDs2Vp4D9k9ClCAAhSIhACzxKiApuH546fYf/AI1qxdj0oVK0hQogKyZsmC//7bJkGRY0BwMJKlSqc368ljT2zc8h/UpbG279yDDBkyoHjxokju4oKHD13h9+wxnj1/jjHjJqF0qZKws7NF4sSJkDpVSn35JctXYZ3Uc+PKRTg7OyNdhvQwGAz6PN5RIL4L+Pv7vzjrKr5LsP9xUsAgwWyDFRDoBTxYDDzpCKigBWR6dHVIc5CSMgJPR0ogZIA8yjbKHAQYJQCi6ueZIOLDXwpQgAIUoEBcEoiGtqrjSaMRkGNbRHRT0981P6JlQqcZ5Vg1/LLvqy902ag8hrY1tE712qBFpSQuE0sF5B0VS1vGZlGAAhT41AJqo6Y2rFay0VYb009dX0yUr/qk+qIeY6I+1hE1AVk/no8f48HDR/ryv/78AwoU+RpZsmTSX69euwEmk0meB6Nhg7ryCHh4PIFZpm3eshV5cn+JkiW+xo+VKuLs2fO4eu06jAa1STejSJHCEvxIjCQuKfH9d+XxvQRXRo4ai59++QPjJ07Fjh27EBwQgLfuqII3CsQjAbMZ3t7eDIDEo1X+Rlfj8gTZlsAgQQizvwQl9gOe/yAk+BGuU5oZkF0dGOQx3Kw3XlpJnoiSUbYxxqxAwHbgngRCHh+RRVUQxBZmgypcXvKXAhSgAAUoQIHPK6D2DaysAHW2f0QpdIBfHTu+K59aNnwAQJWt9gdkWXWsev/uPZw6cRLPvJ7h5bGlyvMiubu549yZs3j+TOYj8rfAwCBcPH8Rp0+egp+vH/Sypc5HDx/iyKHDeOz5OGQaoukm7fX18cWZk6dx+oSq0xdPnz6F2yM3mOVYAVL3R9Uk5UNZK/uPKogLf4yA4WMW5rIUoIDlCHyynqgPerXxjOjDXm1I1HT1GL4BaiOh5kUlOKGWVWWq5dXziMqW+eq/ftWGdc/O3XBVA9EyLXzWOPVa+urn6wu1I+Lp6QmTWQbQlYFaB+9KEfVbTVPLSpm6Qeij/iKCu9D8ocuo/Oq5qtda7YBFkNQ8lSd8cWpZVV7odPU69LmlPEq/79+/jytXruo9un37Nk4c2Y9nz54jSdKk2H/gIAxGNaBkwvcVyut5zpw9B02mrVq9FpkyZcTXxQrD3t4Op8+cw5lz53H33n09X+ECeZEmTWogOBA5c+bA2FFDMWbEEH3eyNHj0K1XP2zdtgNBgYHQdybBGwXir0CCBAmQ68svQw5u4i8Dex5XBTRr6J/jAY8Bt+nyPDteu2khwQx/fw17jxhx47YVzOrSWK9lev3F/NU2WLbRVk/LN9lg5WYbbNxhheNnDXjyVAOskkkQZDfwcDzgFXJpRk2/BJfaZr1eFl9RgAIUoEDsFYhUy9RxvDqWMxgilZ2ZollAk+2uSpEtVvK6ublh4bxFWLpwMRbOX/gyLZbnixYswt7de+Hj7YNLFy9h9Yo1WDz/9XxqmcWyrErXr94AXqx7FQi4L8eba9ash4dbyGWWr12/gfkLl8LDwwPQDDh77gK2yXHm0ydPoQb8z8ox6tARYyWY4CXzNUTqpmnw9fXBtBlzsHb9JgQEBrxc7Pr1mxgweATu3L0LvGjXy5kf80QDvH28sX7Tf9iweSueSPvPSV8mTJ6Obdt34rkK8MhxeJSqkP6oANCyxctx5OBhICrlqL6q5dTYmJ5kbMUqXFJ/pyqpfFFqqOUvZLD8LrKHFIjHAuqDMvwH49tef4oPSqlrw/oNmD1jNo4cOoLg4GDoB+rSLhVIv3b1GtbKYO7Vy1ehNqgIvclGQkXc1TJ7du7B7Zu3EKgGa0Pnv+cxwN8f169ex4kTJ6H+60CvM3QZKdvfzw9nT5/FqjUbsH3nLixbsRo7pJ6nT57gtbz4zDe1TvSdThngELOX/8WhpkfUNOnbvXsPMGvuAhw7dgKeno9x9PARrF21BuvXrMOGtetfS2rasqXL8fD+A4TuQATrZxj8h7my06SWDVRnCkh9+mA5ZCBFnr9hpOq9cxc7ZGfnzKnT+n9Sq3Vw5uQprFm5GiuXr8LqcGnVspV6u86cPA19J0DKCAgIhPpOjKnT/8XJ4ycB9R+l8h5SdZtMUrc8f6PuiBxi+zTp61N3dxw4dBSrZb3Y2Nph7IQp6DtgqAQ+DsFBBmT37juALVu2ArI+ypcro/fopvwd7N61W3/ukjwZ0mXMgL/++B3nL1zAISnr2IlT+jxnmWcjZahl1eButi9y4O/qf+HSuePo3LEdDhw4hAZNWsLf/9XOpL4g7ygQ3wRkQ2RjY4Pk8jfz2jYovjmwv3FUQAMMsn+gts3+roDvckCzx8ubxCNMQRqOnrbCtGXW+KuVNQ6f1eCnPvpVYORlxjBPjCbU6BaMPzqYJQFV2mv4vZ2Gyi2s0HmUDWautMa5yxpgTA4EbJMgyHTg+WVAk0NKvS0aeKMABSgQLwXUcYo6blPHShYEMHf2XCxeuAT37t4DDPJZ/6n6pmnQj/NUHSopx9CkbEOTmoZ33NSyaj2oFLqM/igbxfADx6F53lHca7NU3WoZlfQyQwegVdmhz188huZ5rYBIvFDtV2Wr5a1tJBDgi+CgIEB/Ldt8Ne9dxYjjExm8r16rHs6evwgbGxtYG60lFmEFTR63bNku4x+7ESDH+OrYsmnLtnji5SXFW+v5VF61zLVrN1C1eh2464ENWTdSp6ZpcnhpQsdO3bF7z34YpE1Go1EPFhgMBrg+eijBkCW4ffe+1Ccm0HD/4UP96gOaOpNElpdi3v8r+VT7Ro4eCycnJySUBJn25PFjnDx9FunSptWnywDS+8v6gBwaNCnSpNtA6suWNQsyZkyHcROnYeac+XB7+AiQfn5AkSFZpSxfXz/8Ua0mDh459uFlSJ0PHzzEvn37cXDfQRyStH/PXuyScazt/23DpvWb9XGVlUtXYOniZfoZOfr4SkjtvA8jYAjznE/jtQA7b3EC8kF5Twalt/+3FRvXbZAPxo1vTWr+sSNHoQcoohNCM2DT5m2o06AJzskgrYw1QbYquHH9BmbPW4jDh49h8dKVWL5qLe7du/9qYyAbCXVao7oM0ORpM3Hx0mXZEAVCbYjwvpss6yUb8aUS1JgwcSrOnDmL1zYA0ggr2XEwGA04KQP0ly9fQ4rkLlDLPH/ujUjVgU98k3UHSYcPHtb/c2PW9FmYOHkq/p36LxZJYOLIocPQ2yl5EPZmNMLP3w+bN/8Hd09P2WHyw74DR1C3YQvUa9gcP/xSVdIfL9OPv/6JP/6qibv3ZIdW3FSZ6hJLq9duxNDho/BANrS3bt3GwvmLMX7SNEyZOhPbt27HY9n5UO0LrTo4KBhXJJg1aeoMjJcdBBV88fbxwbGTZ9Cj90A0atIav1apIan6y/TbH3+jbcfukuckQstSZ+ScvXAZjZu2wq27d3H/3l0sX7IMqu4Jk6dhmwQEnj97/jJ/aP1x7lGsn3v76AEq1fZUKVPg/MXL+veBPHzkirvSdzV9994DUH8vCZ2d1UuoeXNkXegv1J3BBlkyZ1LPoAIm6tJY5cp+i4SOjpC90xAnea+r9eqcMiWyf5kfxYsWQpHChfQ6OOCr0/Eu3guY5c9MAqzx3oEAcU5AkxZrBiDwCeA2CzCEbA+gghs2wK3bBoxbZIO+E63RYijQrZkJJfIHwdbaDJg1WTiCX5l+QeIoF1ebcGllMC4sN+Hw/GDsnB6Imj8FwU2qSuwoy8MEaCkBnwnAU9lWmWT/yWANXgoLvFEgDgmwqdEmIPvbK5et0I/V1PHla8ee0VbJ5ymoVp1G6NtvCNzdPaCOKRDVmzpuFSfIoHlEyRQcjGfPnkFd4ujm9Zu4eO4CTh4/AXU8vG/3HuyQY9C1q9bgwrnzb99vkzquXrmK+XPnQ53toMY4tssA8Z4du3BQjqsOSFLP1TQ1b8G8BfrxpYzWv79Xcpyt2jN/9nw5Pl+KzRs2YdvWbdi7c7c+IH1gzz7s3rETquwNa9dBlb1VjskjVbaqXY4PlYv6x8Sd27ZjyYJFmDntX0yQY/DxE6Zi6uTpepnb5XgY0s+3vsdk826QsjJmzIBChQqgbJlSKF26BL4t/Q3KlCqBggXzQ/2DnEHKsJF1kTKFC74pUUyfr/KppPIWKVJQtUrPqz9Rd1Kui0ty9OvbC/MWLsaVS5f1AIuNrS3Usf8RGdxX4zYF8+eBg5MTEBiAJ55PUOV/v8LO1k6V8CpJWRG+n2R6kARnTpw8jaJFiqBwwfzQDQ0a3NzcsWz5KlSo8C0yqWNgoxWU2evJBhHaSLmv55NgkvT/5TSjDWylHyrgomkaVBAoeer0+Lvqn2jXupk+TqaPlUkQSfcP7Ym8LxA+sKa/z8O0TdppbWONL3J+gQR2ykHaGLbu0OeyTkKLfe1R2nPt2nX07jsILVp3QPNW7dGsZXu0bN0Rrdt1Ro8+/TB95ly07dQdf1athV0SnJI/kteK4IsQAUPIA+8pQAGLE5CNxI2bNzF2/BQ0bdFW/3BUH5DhU4/eA9BLPkzXbtiMwKBARLghQtRv9vqHPGAlH+zy2Q1VfuLEiXDi2Ans2XdA/yJnJydH+Pr5yQG5GaE3tYF5+tQLrq6uCDn749W80DwRPkolQTIgf1UG5PcfOIynXjJgroXJaTTINssAe3t7FMyfD7lyfYlKlb7TN8zJk8lAswRIwuSO+aeaAY8leDF71jz0Hzwcf1avIwGMpmjWvC3qN26GajXrYuCQEZgrA+GPJECBFxvKoKAg3JdgxfnzF6Cm3b59F7dv35GdVXf8+MN3EjiZiasXj+HGlTMv09XLp2XaKXyRIzv0AfMXvfXwfIxUMmDuIYGOWXMXonqtemjTrhOaNG+N4aPGY9uOPXgieVQ9ahGDvNdyi+OPlb7HsRMnMWPmHJyTnVZvb28kSuSEkcMH4u6N87h38xLu3rwYkm5cxI4ta6GWkT0KqI20n7wHvJ4+xlfFi+HGjVtYsGgZqshGXNXdsnV7dO3RB7tkB9jn+XOo9xHi6k12lG7fvo3DEnRUXZg/exoO7vkPR/arnejNGDFsENKmTStBwgWA7DDBbMI/TRrqQYv9Bw6hVKmSKFXya1k0SGYbUb3anzgmBwg7ZAdc7ei6JE8OyDq5JgcAM6bNwKQJU7BmxUps37JOAmKH8Uj+pmThOE2o2h9tiQVRgAIUiJMChpBWB/vjZBtfAAAQAElEQVQDXqMALaH+2a+u0rBhqxH9ptqg9TAgZTIT9s82SQAjEGklZmEw4u03k4YvspmRI5MJ2bOY5HkwinwZjJL5Tfi9XBDa1gpEGhdZXPLJvfzmBJ4sh1mdBSKvNE0O+KHJM/5SgAIUiEcCmhH/ysC4Ola7JIPCocdIliKQNGliyCF21LtjMODB/QdYt3qtPog/699Z+oD+hHGTMG7UOIwePhqDh0kaOgoDB49Av0HDMHDoSDnuHIdhI8bqlzzq0q03fv69Ko4cOQ51zBhhg6SR7u7umDR5BqrWqIfKP1fBH9XroFHTlmglA8Wt2nZCn/5DMGb8ZP3x75r15bh2t34c+t7OSdn37t2HOg7/s3otfP/j76hWo74cH7fRy24pZau2j5Y+qbEVVfbm/3YA2ottNd5xEx/1T4iHZGxk2MixaNepBxYuWaFf/qlDp27Yf/Agzp89hyFi9E/LdhgzerwEH64A1jYRF6ppuHnzFhYtXoYhYqsMh44YI55j9QCCrbW1zqfJ8WJCGYcZP2k61PxhYq3SUMk7b94ivWyDtE1/8uLOxsERFcqWksBAFSRJnBhWclxrLQP+/v4B8PHxQ7MmDZAvbx5Apqs2nDpzDt99Vw4ODg5Q4w1qqEUlk4zXPJdjepPJ9KLkVw9q/aq+qqsgFC5UUF/O97k3Lly4jO07dmLjxv8wYeJkjBoxWo6bR4VLIzFgwBAcOHhYhhiCQwoVD3VVi6EytjJZ1v3ECNKkCZMwZfpM7JHgwcFDhzFtxmxMmTAeM+fMw979B3Hp8hU5Nl8o4xoj4froEaBcpI8qILdv737s3RUSpNuycbN+5Q119Yuli5dC/fPqgjnzMV8CRuqqFrv27sPsGdMwbcoM/W9gigS4psix+rgxE6CujqKXG9LqV/cCliVLZgzo0x0zp0/CogUzsXzJPKxaOh9rVy7GskVzkTdPbty8cRPt27bCX1V+A2SZVwXwWaiAIfQJHylAAQsTMJmRIkUK/P77z+jSoa1Erlu8kTq0byUbqNw4cvQYnjx5Kp+T5k+AoOllapo8qiSv1MayceN6yJAhPYoUKYRqf1VB+vTp3vigVtn1szUMVrKULC/3kfnVZGNuJZF4e3s7qG0TIMvKhlm9eHD3PpYuW4UJk6fj9t27+Lp4Edlg5EIS56RQ/70gCNBvqnK1cPhklI9NNU3PFM13UqcKfqgzHtRZM9bSh707t6Bu7ZrInDkz5s+dgTPHD+hBjVp1GmHD5i0IVpcGk/Z4e/tg+67dssM4HNeu3cD8BYv1S3udlZ2lVKlSYu+Bg3rQZI7szISmWbKjfuL4qZddVr1RZwWoS2cFSTBs2/ZduHDxEpbLxvXG5TNYv3opnj9/hq1bt+H2nbswB5vUItA0DcmSJ0PFiuXRuH4d2NrZws7WVp9nkvfhQ9lJUGeIXJYB+StXruHy5au4eeuWPj9ZyhQI2Rkyw8/fX96Hz/Rlj584hf/+245VyxbgrgRNNqxbgdRp0kBdKsrDwxNSKeLkTaw8H7nKjuwRbPlvm+y4DUFuCR6lzZAB6SWlTp9BDxo9fOSGu2K8cL4EQTQDKr74HpALFy4ig/ytlCzxFWSvDgkkkFfia3n+AiO/7PyovyuYATd3D4yfOA3/SOCqa4++6NF7IIZJAOu2BMamTBoHa9n5fbEYHyhAAQpQIK4JGKxDWhz8FOozX5358ewZsHGvNX5oaY0LN4CtU0wY3CYQRfMEwckxZJsdslAE9+qLz40yXbbbCJtkF8pobYaDoxnJnGXjIq8lV8ivJoMvgWuheV8BTL6AapOm9tlCZvM+dguwdRSgQPQJmPUPYinvPR+1kiMO/mof12Y5/nn48KEMwI+HCgzUrd8UjZu2wKixE7B63QYcOX4C7q6usE+QAHnkuOinyt8jT55c2LhpqxzPrtT/cbFOnVrYvHE1ysrgu606zoxogFcG0/PmyS0DwnP048c7Ny7ixKHdWC2DxLNmTMLShXPw08+VsGbtehw6fESCL8PQsnkT2X5FYqUFB6PUNyWxdfPql2Uf2bcdyxfPkwHtyXrZalxjrfTn6LETmD1zCjp3bC3Ha0HvtpNBdHXJ7sUS8GjTvqve19nS1hlTx+OnH77Xl23RrAl6dO+E/zaswthRw9G6fWf0lyDR3p27gAiP58xInTo1qvz2M9q0+AetWjRB6+ZN0UrK+fWXHxEofdELlk26+v7JRvVrh8yXfHreFk1R9c//6VnC3qmrQPTo1gsTJWCyc/d+TJ85V4ICi3D8xEl9nGHTlq3YuHkrBg4ajltXr0H9M+6uPXuxYOES9O43CF2690XPPgPQd8Bg9OzdHyog9SDsZaXkfaKCBOs3bMLdBw9QqlQJ2DgkgDrud5Xj5+kzZ6N27RrQZKynbYdeuHnrNoKkLwEyHhKa/AMC4OX1DEbrMPsi8l6xlmPmTl16YL4Ehc6dO4/Tp8+8lk7J64sy7vHk6RPcv/8AKs/JM2dxXMZK1PdsGg0G/YoXW7dtR4AEe6BuMm3lyrVo1aYTmjZvKwGxevjpf9VRRQJjtev/gzZtu6Jrzz4yPjMMU6bNgmrj0aMnMGf+YixdugLLl6/EsmUrdbthw8fIOMgTqL4i/E3e1ylckqNQwQIybpATWbJmRWYJiGTKmgUZJB08eETGTbbJ+60dunVuhxQy9vPaAE/48uLxa0M87ju7TgHLFpAPykwZM8iG7xfU+Lsqqlf/841Us3pVFCtWVHcwyIbktV0bg3w8fGjSXitBLzf0zuvpU5ikTbCSjZGUmyN7NjRtVA/58+ZGkiSJ9VMOQ/NCijHLC5Vf0zRomrzSZMIH/hplh8JotEaQry8OHTyMcRLt791vsH4mwYiRY/TLbtna2MCodhxU22TjqFchdfr7+eG2bFSvyYD9jes3EJquXLoCPTqvZwx3J8tB+vbBSS0nKSDAHyvXrMegIaPxbZlvMH3KeAlQ5cGVa9eQVIwKF5CNXp7cmCaD1+pSRosWL8d+CWyo+uwk6JA/Tx4JltRA2jSp8f33FVCqZAmowXArzYDkzs5wSZEcyV2SwUVPLnBO6oxUqVPCxloGMF50xVesfH19cPPWXagvGfvpx+9RtnQpZJSNbL58efXn12/ckjbdkGDIc8jKkQSoxxQpXFDj778woE9PZJD3niae7jIIP3fuQvQbMBQdOnXHb3/8jfby2LvvYMyTjb+PGq2RvqvAi+q/OvX5ogRIjhw9jpp//4nvKpRDmnTpUPLr4ihfrrQeNFCXx1KnxiJ6bjFbivRVnRljLzthTZs0lJ3TlEInb27ZeZM/ECAoANX/+gM9urbHP00b6TvBMJtQvnwZ1KtbC61bNkPhAvlhUKcRy3s2YcKEKF+2NBo3qq/nT5NGyrOWQTEpr0D+fJgh76Ehg/qjQvmy8rdeGE0a1MbFM0dRQz4PbOS9D1lH4I0CFKAABeKYgGw3DPJZr4IOz48CKuhg1uCUwIzMaU2Y0z8I6yf4odxXgUjqbILRIPllPtQtNNChnocmmbZonRE7D0g+o0y0MQEyTZ7pvyaTAb6+ZiBYkj4lzJ32BeA+EfC6GjLRoAqQckJe8Z4CFKBAvBDQtJDPPbM6bo1Mj1V+OVaF2m+3lmOxl0mOldW88GWE5lXHmmr+a8vJ9kDND11G5Qk/X00LnR/+UZWnjtFftkHao16r6eHzhn2tynytHllOvVbTw+aTY5aMGTJg/JhhuHfrElzvXYfr/es4tGcrliyYLdOHo1fPrmjTsimq/O8XXLx8GStXrZFjnxo4f/qIfjxTS44xvypWBA4JHKCuFCEHUGFrCHkuxzUJHByQMnUqpEmbFmnTpUV6OSbNniO7jDckway5C/R/hGzcsJ4M0J9D3To1kVL9M54sF1LAO+4lj1NCJ6SSwEJo2RkyZUCOXDlhknlzpOwx46fKIHRbuN2/gT9+/xXOyZK9O7givs9kjGTzf9tRrWZdtG3VTE+5vsyJpC4p4Rfgpzfoy5xfwFkGwF1kYPvbMiVx98YlzJk7H+psk6fqOzrUNl7PGfbOLE5mfdA9MDBIf1QD8EFBwQgKCpJDQDPUd3+qY3A1/7UUEPQqSBJapLRVxfjUWRtWtrZIJ7Y3btzA6LHjsXvfQRw/cQLp06dDOkl+EoRwl3ZdvnoDhQsVwNdfFccXX2RDrpw5pE3B6N13IBycnKD6ZS/HxNKY0FqgAjJVa9RDya+LoWD+vLqfz7PnOHjkOIKCTWjWuD5+/+VHFC2cFzWq/YEW/zRCi6YNXyV53a1ze+TPkxvGsH8TmvyNAPjlp8oYOqgvBg/oEy71xuCBfdBKAmLqbItmUuZQea3yDerXCwMljRjSH/NmTQ95z8h7GpLKyJjNsCH9sGjevzh2eDfuXD2LWxdP4vL5Yzh5dDeOHNiJfTs360G5VClSynu6JlYunYeF8//FQllm8YKZWL1iIY4f2Y3cub7U+yvNfONX07RX/ZF6Q83GjhyLOo3+0cd+unfpgMRJk761DPAGAw0oQAHLFVBnT6idAAdHBzjIzkD4pE5h1P+DIhxBsAye3rl9B/fv3sPDBw/fm9Qprbdu3oLXUy/5LH7z4NhRNnBz5i5Cl269sWbFKsn3FEY7OyRMkjgk8CE7DbLg662QaWqDrGma7N9Ien3uq1eaPH1to2+Gpn5k0P+GtEmdtthSovKduvREy9btMXX6v/jf77/g0L4d6NmtEzLKTpHaeEkpr36lTnUJqclTZ6K5LNOidQe0aN0R6vJhHbr0QGfpx8JFS6DvsL5aCr4SPFBm6kviIuV2774eZPHx9oHq/wOx3rBxE3x9nmHh3H+RRO00Sfl79+5HokSJkCVrZkDaliFDerRq8Y8eDLhx47Y+Ta3HXLIDVuabEkicKCEKFsiH/PnzyAB7Khw/eRqP3Fzh5+svyReqnb6+3rIDEoRDR47gxq2bUN/jAbn5+fkjSHaMvJ49Q7GiRfB18eJILOtJtU+dbZBO6laXJPPw9NTP2FDtCfQPhPqvjJs3b+Le/QdQZ6ME+PvD3z8A6uyTrFkz4Y68lxrKzuaF00fRoH4tbN2+Cypok8DREaG34CAT/CTw9ODBffz4w/coLsE5e3nfqvVjZ2uH5EllJ1IyqzrUF6OpuuVl3PqVHZZUqVKhTs1qUDtV6j+cHB0d9PWvd0Te9/bS53atW2DIgN6o9F15QP4e1bVaRw8fjH69u4tfbSAoUM+uDLJkzoThg/vp+fWApuRX68tWgmL5JMDYXHbg1HJ9e3XDUMmXQw4CVHkhBfCeAhRQAgZ1sC7bDfWciQJxRsAk2wKf/YCWEfrNYEbBL0yoVikIN+5ZoUore5w+L4NpocEMCWzMW2WDfUeNCAzSlwi5k/2oMXNs8G0jW0DKqNIsAeatkkCGvQbIeJbaTfmpuUxbL/NDywpZUu5lWtAp4Ol6IOAhYJBBBhWQkTn8pQAFKECBCATkeC5YBqHPnT6L6ZOno1+fAejaeIG2lgAAEABJREFUpTv69+6PpYuXwcfbWz5LDa8WlIHcI4cOY1C/wVDH3WrZuTNno3vXHugmy6nL+hw9LMFwa/k8lrLV8eiMKTPQu2dfPY+6xM6dW3LMKOW8KvTFM5mmjtvUd5gM6DcQHdt3Rt8+/fXvt4CVbAAkm1mNfMvjy1+pQx2n37h2Heq7Kgf2HyTt6IE+vfpBff+Gu5sbZLT2ZXZ1XJI4cSJ9wFudmZA8hQuSu7jAOXlyJE3mjCRJkyCRHG8aDQb9cler1qxH+7Yt0U+OXXLK4H9iyZdAjm+vSX1Nm7fBOXXJZ2n3qwrCPJNjKXXs+FqSvC3adEDvvgPQToIMo4YPghqsV2Mkqm1hln730/BlmwEfr2fo1WcgeondprVL9fGFZBKsUGez6G14V4lWRly6eBk16zSRQNAcVK5UAUmdk8rhnaYv5en5RH9U3x8BdWamHONZ29ggTbo0OHvyIJbLuIr6vlQYZbur5wy90/SzGAYPH4VadZvoqV7DZmjRpiM6dOoKX9moq+CHOp4+Ie/BLj366Gcw1KnfVM9bq15j9B84LLSwkEfpe6JECdG/T3e0/KchfpC23r5zBz9U/h4/fl9eH3NIkMAef0oAq3ePzjLe4KcHsXLnzoVff66Man9WQbWqVfTAhiqwTq1q+KdJAySR94W+DuQ9paarS4CpRxsb25fjRKqedu27oWqV31BExifUuIemafr4VgIZZ1JjTaHJSV4nlHbaSJBGlRM+OTnYwyFxUn18Q41xvEyJE0uQyQVp06aBh4cnbGys4STBhMTy3rS2toIK/KhgTdLkyaDG2PRyZX0ULVII33z9Fb788gukSZMGLhJQU4Eql9RpkUze42pcLamz8wsfOzjK2EdC52RwlnGepC+Ss5SZTN7jtjI+plvohb/jTv5O1J9kFxmXatWuk/530rVTOwkqOQIy1vCOJeP9LEO8FyAABSxdQDZW+gdpRI/yyal2Xl4jkI2Jt48PWsigf6N/WunXzGzUtOV7H+s2aIoDB4/og96y1X6tSFtbGxw8dBwjRo1Fp2698U+Ltpg9YyY83d0hWxBAfYi/tkTIC9VkDerHEDIh7L2Vlb7zM2HSVOzauSfsHP25dANq50vtGEyaMg1ZMmfEsiXzcOf6BaiBYPXfCGqDZyUbNH2BcHdqw5k795coJQGFkl8Vlw1bceSRDbga3N+6dRf8AwNfW0Jt3C5fvoIuPfqiYZMW7/XSTf9pKTsZjXH5yhUEBATi2o1buHvvAWr8XQ0ussGUSAROnDyj15M2bWoYJQigNmpq41uoUH59utfz50BwECAd1mRHwV52PNSGf+PGLVi9dgMuXLiEDZs2Y+78RZg9dwFGjZmEGf/OxdhxU9C+Y1e069ANZ86chWo/5BYo/QqS8tJLfUUKFUCa1CllqvzKytBkgMTa2lrG3oNkx9xHmif1yrpTl7iaP38xGjZthfqNmmPYyDG4dv0GPD0fQ30fRflvy8BONuiHjxzFfQluHDp0DD/9+D3Kly8rBcuvlK3ehybZYKv6ZQq+KloIWbNlfbUR18zQjBpckrnA080DgXLQoPLFxWRlZYQKTKodNbVzrA+8hu2IODg4OkDNf7kjJEbqv44cnRz1ZfW/abWMTDcajXpeR9nhs7WVAx+ZpmapPGpeAocEMt8RaodLvTdC5+mPvKNAPBcwyQGl+vw5e/4i3B48AORzLp6TsPtxScAk2+EnEwHNHvrNrMFoBVjZmvHcx4zlO4Kx87ABXmoMxc6Mw8etMG6hEdduG2QbrkFdNgsvbh5P5DVMgNkkywWg8ygbtO1jjQUrjZizxohtR0y481Ayq2zy8NqvIR3gNQtmP1d9cqT/A1rPzTsKUIAC8UhA06ACDlu27UCFyr/K8VML9OzdD4MGD0cPCTy0ad8FKj15/BiQ4yxdRh5PnToLdTmdvXv3yXFmK9Sq1wQDBg3DQFmuaYs2EjgYjv82bsR1OQarXb8JGjRpjj4yKK/y/CPH9eo7Ki5duCgbCNlI6IXKnZR75+Yt/fswOnbthe4SMBk2YjR6SSDmr+p10bd3Xzlmqwy1nyS5X/4GyXHY4WPHUfa7n1G3YVN0kwH0gYOHQQUYmrZopx9f3pJ2QI5RQhfSNE26Y5BtjBnqePa1JJPU665yHL1sxWr06NYRv/38I+wcHKD+yW5g/8HYtG4D1Fkkxb8qhqnTZ+GWBEPClo933aS90yeNxb2bl6Q/P8BeytWzhx4z6S+icCfLq0H/0SMG47HrbRQvVkS/jJfqi6C9u0Blf/0mlkp/O7Zrjq+KF0ECR0foy4mV/3MvPH78RNpbWXZNtVdlSZ0qT64vv0T5st9i587dCJSxGzUW8DKT5FFnMQzs2wMbJCizUdKyxXPQoU0LXDx7TIJt7ZE4USKUK/ctAp65omnD+hjQrzvWrFiEDWuW6mn44AEviwt9YjAa4SDLPXJ109+j35QsgXatm+vH7D//UBlnJZiivsvllDxevX4dm7dshTpLRIMGG3t7GGU8QF3tQZWXNEkS3UrTNPUSal2OGTcJg4YMR5Xff9PHJowGA9xcXdGxS0/8/NP3KFmiuOSzEl6TZDdCffcI1KU4rWyA11KY93hI6S/v9WNlWEv+cMlo0O2N0kc1hqHGfJQzpH3n5e+mTYeu2LZ9J/xUcFKmhRaogiEqaZqmL6+W8X3ujZ7de+K336vip1//wp9Va+pXw7C2tpHdLrMsaoJ04s0k601mvvtXxsB8pA1qzGXw0JGYOUPGdGS9qn9slj8w6Em15d2lxNu5spbjbd/ZcQpQ4C0C6ku4Vq9ZB3X9xbWys/G+tG79RuyQja+PbHzf+A8RqcPD3QML50/Df5vXwjGBo/79FOrLvVQQYO7sufBQgZAIPqjVJZSgAWb9k0qeSFn6r2yYvGRwXZ1F0K//UMyYORc3ZOdNn6cWkCdq+5FbAhYL5kxHgLcHJo8fjV9lRyqtRPVt7Wxl2yCFqkxqGyT5X/uVAWgXicT/VeVXdGjbEu3btYT6vpT6dWoghwzKJ0+eBOnTppWGvb6wCmLs3ncAGzdtwfvM1Px16zdh1+49shMcgCAJOty6dQd37txH2dIloGka1M7lmnXr9Kapy1BBAlbqhUna5+frp56GJM0gAZQAnDp2TAIdi3FWNtJz5i3Uv9vlgQzojRoxBL/98hPs7ewxbFAfZM2aBT26d8aje9dw6dxxVKpUETYSpFKFGWRHwywDgurSSmnTpoJD2B0xP3/cu39fgg+BsLe3g/rSM7WRTyQ7Ql9/VRQ/SDnqzIInT57o/yXh7umpisR3FSqgVs3qWLp8DTrIDszhI8dQ8buyyJ03N2TvRs+j38kq1mTw8cucX0DVL3s2+mR1Z5I2PXvmDVd3VyRMnDCkbjUjrib9vWeG8ouwCxHNj2ha6MKRnafyhS7DRwrEdwH5e1D/eVi0cAH9zLVgOUAG5IMI8ePGXsZlgRfvU3kPh+wayD5N2O4EA8XyBGFef6DVcAP+aGeHJauMWLHFCofPmVAkbzDs7dQ26EU5smyihHJALo+wMsD7oBn3PAIwagHwdzdrNB9iRJ0fNTSrGgBIzEVlez1J/UGXoMm+jJquaWrw4VXZahoTBShAAQqIgHxu28hAsEsyZ6jL7Jw9cQi+Xq56OrxvB74t9Y0M8M/E3r0HEeAnx3tyTChLIfR7G3r1G4x/Z83B/t1b4ffMDR4Pb2LYkAFYtXqtfpxVo3ZDFC1SGOr7L3yePsLBPdtQp0ZVff72nXvw2M0deFGmOtZatHSFBFGG4eq1a7h++Qz8n3vA77k7xo0cjF59Bsjx5HHox3x4dbOytkaKZMn0/+hXbfZ56qq35eyJg2hQpybmzFuAPXsP4NmTp3hZF95xE5NFS5dj1Jjx6NCuhX5WgSbHpGqQWJ05UqhAXjRr1UFvY6UKZXHt2g2cOnsWAb6+eGv5oX2E3KT8RIkTI3XqVLCylu2THEvL1Kj9hi33RQmpU6dEYhnQV8fRbz22e5H35YMc86rvvxg6fBQqVSyPtOnTQfVXny99v3L1mvT3Or4qXkxWk1Gf/PJO+qP6/ddfVSTAcAsqL2SZl/PliY2NDdRxub2TExwSJoT6Z8Qr4jZr1jyoKzlosg5tEiTAxUuXMXXGTKnaLMffTnBMlBD2CRPCwcFeSgnzK/1W+8nrVq/HN2Uq4YsvcqBh/TpwkDK8vLzkPVcQnTu3kyBQUezcvRdDho2ButyzCuL4+/sjxEXDjdu39UI1TfYRVD/UKxnbWbhgCVq37Yh6dWqhcuWKkt2MRxL8GDpiDK7fuCnjOJWRWcYwYDZJ1zXs3LVHf7/XqVVbxhnqhKQadfDbr1Uwcfxk+Mq4lGRUpb9Iwfrjug1bJLDXA7169NZT7+690b/vAOzavgswGPX3urLT26yWkGlu8jezRN6f6dOlg530F6HtVvPDJytr/O+vGhLwGIL0GdJj6KC+Eqgqg5Hjp2HLf1ulSVr4JSL/2toGd2TMq+rfdeUzYDaOHtiFX36qhLPnLmDz+g3Yvm07bsg6DgoIBCQvwr0nIl+R5eY0WG7X2DMKREqAmcILyAd6IhnQDvZ7ApP/00inYL+n+PWXH+SA2u7FBu71gtVplt+W/gYH923F1i3rkCZVaixfsRrjJ0zBwYOHEaA2jGpDqC+m6cfzwdIWTdP0DYU86HMk1A8P2QjNnDMfk6ZMh8FsxE8/VET6dGkhGSGVS1K/ZtjIht/RwQnWsqGytrGG0fDiI0/KVTnelTRNg1E2xlbW1rKjZA2DPAYFBUN9p4WtrR1Syw5U2I2fylukcEFcv3Ai0mYm8Q0W56JFC8vG1kr/jwCpEn6BwVB9efbcG8NHjkU62dj+IDsCerBA2uUrO3vqOzIgN9VHGIx4+tQLW7bt1HdgL0oAZOa0SWhQtybUtU8TS8DAwdEBfrITnS1bDml7apw6dRodO/dEjlwFcUgCEqF9UTubx0+clH56wsHBETC8MJN6A4MCcVM2ukajFZLIe0SvW3YgEyZ0QrGviukBEHXJJVsJMLl5PMb9hw+RLHlSZM2eWXZkvkOZUiWwfftOFJCd2N9++VnKtoLqJ17czLJD81R2lP38A6B20l6uS1lfz8VC/TeGypohQwa8PDNCTWCiAAUoEFUBOQA1qg9etbx8zqkHJgrEegHN+O4mmjXY2AKVSgZiQDMzthwy4a/O1hgyB/ijnBnJEknwQ5MUppS82WXfQ14/umdAAgczgo+ZcHF1IBYNDsCGcUGY0isAsrmXTbMmud7yK9txfY5Bbd8N+lPeUYACFIhlAp+/OXL8VKhgAajL1uTKlRN29vZ6KiLHU7/J8bS6lM6xY8f1f3ALbawmn9k2cgx6QY7zTh7dj69KfKUfD6nL6NSvUwNfFSumH999W6aU/j0S6hhQnWleTPLVqlFNL+bY8RN4KoPV+vGXlRF7d+7GNjXwK3Pd799EpkwZZdthA1tbW1T7uxpGSMoyZvAAABAASURBVGDloRzPAeE+96X9GTNmwIC+PVCkSCHYJ7CHOjbLlS8vfv/1RxTInw8n5FjzufdzWTTcsgh3e7HvVU0GdRvIgPo/zZrKdka2T3L8p45PVbAof/68+Lvan1DflZFEAg0tmzfGw4du8A37D4GhxUp56pjSHBwMyHOE3lR56nnoo3r+oUmOi/39/AG13yjPX1v8Q8uVLvr7+6GkrB/npEnxWlulbLWe1T+kVv6+PPRj7gjKz5kjGy5dvozLkl5bHopQKlAjKkFBeP70qVCaUVTGKh64uuHYsRN4LsfcvvJeWLl6Hb7IkV0fS1HH2089H0OiIXp+Keblr0k8Dx09hp9++wNV//odA/r0gJOTI7x9/FC+XBl57oScub/E18UK46oEb6pXrYIass6SSaDsubcPpEApy4x7dx+gdq2/pbmavJZfWUfqOz6qS/CiYsUKGDtqGFQ7VH51ZkUKFxf806Qhvvv+uxdlyDIvftVlpJ0SOsq+iZOenJwcZDETHBM4vCpf5ZU6TGqsSZ5fv3EL27btkjGJXdixYzc2bdmG2XMWyPvpoczVoMZ+1NiJ+h4TaEZ4PnqEM+cuomf3LkiePORy3JIx4l8rK+yRMtU/wy5fPB9jRg9D6VIl0ahRPdw4f0RfRo1vAVHYP7K2l6Dnbvzvzxp48OARBvTrgQZNWiKpS3rkKVAM3//4O8pV+BGZc+RBoeKlMXniFHi6ewDSJr1i3ukCBv2edxSggGUKqA88a1vgbQl2UJc0iqjzBqMRmmx8I5sMRsPrG5pwhYYeExulTeXKlsHhA9sxf+4M1KxRHfny5oHauZEt1qulZCNvkoU0TYOVtENtANUH+IUz5zFg0HC0btsZly5dRteubfHzTz/AKOXqy6ttvSyjaRo0VZrsLKoHfZ7+JMyd5IFKYSa98VTaEbqsujTYvfsPoAbn1ZkkaucgfP7IeoXmMxiNUG0wSB+Tp0ghG9bkWL1qLdTZNMNGjIa6lZbAgXPKVC83+o8euaF+42b6f4SkSyPTZecmUaKE+O3nHzB/9gz89OMPcJSdAf/AINy9e0+/nFZCp4SyEx0Ie3sbpEuXBqtWr8fsufMxfep4FC9SGKoNqp8pU6aAOeApzp46iIKFCkAPukjb/H18ZKf6HA4dPILsWTJBfZFZosSJXrZJLa9pmjwYoK5XevbsObhLoKpQwYI4KgGWfv0HYc3adVC3BQuX4C/ZyV2+dKl+KS1ZCEZxyJkzJ+bMnIprl06h5DclAAk4QQYnzbIOjssOu/rPpiyZMiNtqpSwsrFWRTFRgAJRFuCCuoD51ceY/pp3HyYg2weDQbZjH7YUc3+sgGZ4fwkmDUmTmNG1cSDMZwNwfa0f3HcGYMmoICR3NskbX3tVhsmMEgXkjwEa9h+XsmXfyWBlRo6MEjipHIxKpYNkAObFMjIPoelVCYCWHvBaBQTcB6Qc8EYBClCAAu8U0OT4Rx3fhiQ5ttFsoQZ8c36RHVdvXIf6B8KwBQTIgLmVlQPyFSoK/RhNjpHU8ZuVlTWKfyXTJHO2LJnhnDIl9OPUF/OTJk2CP//4nz4wHRAQAMgxG2Q7cuXKNWzesgOtWzaTwHcC6LcXy6hy69errU96250m+wByEIew7VeXNlID6jdu3kRgQODbFn01XdOwdccu/XWB/HkAaZeqG6E3CbakSJ1aD6yoS3RdvnIVP/zyExo1rItEYY9FQ/Nb/Z+9qwCwqujC37ztXnLp7u7uLuUXRQExsZBQQBREpCXFAAQUi1bpUkQFpbu7u9kFtuv+35n33vJ2WRAUkJi799yZOXPmzMz3bs18e+/1xuAhI2HzDkb41avQfcUdWNjXOE6iD+P4vFr1erh0kZPLyuU6ejtVsNxVkhIHDx9B0aJF7NgL7kk+FI6fPK1T2bNng03mOXQq+SaG7RFNQoIFpNIUm82Gi5wEH/bxKPgHZ+J+UxnfT5yMZv97GgFpM8M3KEQ/5fP56LHIkCW31nV4q5ved9hEuC42NzdULFcW+3dtwbARQ+GfJj3kezQNmzyNLNzf0mfmPYCyIVf+Qvp14291bI8qnPwvXKggZs9bAHn11XH298Chw2hQtw6kbfp3Zr99/f0wf/YM/DT1O5JvHohzvJI7ODgY73R7C+1JICTtz2yUzA3I/EivHu9g1OhPMXr0J1rGjPkMc2b/iOdfaAOZr9H+aS+r1C/hQBIHfy7/HcuX/4a/VvyOhfN+woGDBzknxjkzzqn4+fmS1CuHQ4eOIDr8Cnbv2Yv3en6Ax5s1QkbOQeh2iKPUhKCtXbNW5zSoXxtJ9fN3EJJQMg4fPoIzJ46BAEjy74VlQfLjuwkTUKNuM6wnCbVh40b8NHMuOnV8A7u2rcfl8ydgxYfjysVTWLPiD1QoXwbtO7yFYR9/hlPHTwButr+v5xGxMEg8Ij+06eYjiAAvlD8vWIQmjR9Hg3qN0ahBs+ukaeNG+HzUWNjceMOV8qrJi5E+ad9O+Dcwy8WK1xXIhUP+S6QNyY+Ond9Eskc+HT54GWf1ifD08NAXzL+Wr8Tbb72DIiXK4ZPPRiFnzpyYMX0y3ni9nf6PExo7SgI2XiiUsuHy1SuIjuZNHniq40UbycTGZiRCbhzkyY6kwhLhxQv0kVIiwsNx6vQZ5MiRDf7B6QGnHVyW28HLxVYm9KvxxrVggfxYvOQ3+PGGZPDQj7Xjgf0+ZCgTDxa2b9+JvIVKMA00btQAdWrXAuLjOTHhiXy8wSjNG8fY2Bg2TeHCuQuQd2+GZEiPgABfWPxL5CRH7RpVNYHx0aB+eOqJ/8GPZEkSftImRbykBokTs0j2e8bs+WjR6jlEx0ajcrVK0E/ASP/FToRxi4RVYmIC5FHXk6dOIX26tNi8eQvKV66J6T/MxAfv98DFM0fx1fgxkPfXPvV0W96gjpDSdpH67DHo9rDuON6kz+d+/Ozzr2DlqtUYMOBDpGd/wH44TU1oEDAIGAQMAikQuBdJXidPHzuObTt2Qa6796JKU8dtImAp6OtlvELunDakIyGi06J3dcV0odwWNQq7j7AMV1CnhUQKRJgLMQn3BsI4URYjT3mIQjIoKg1wcRAQxUkhJs1qEDAIGAQMAjdAQPEky3FOxNVwrFu9Ft9+9TXHSb3R/vXXMJSTllu27YAl512XU6zTU4P61RhNoFxblVIIDgqEt48/fHx8mOFa0NI6IVauXAmH5TLeuhoRQdt4lClTEm42x/iPGr3SLig4yBF19UcV6wPbL+NoGetN+nYS+n/YD2++8Tp69/sIq9eu51g0hT8WS3Wlry2btiBz5iyoUrEyr1nJ+6bLJMSjGImC+KhQVKtZHZwhp519bKzznRsPT3zx+efo1ae/Hm/asXBm/ouQbUzkeHvMuAn4sO9AfMTxaGBAwD93SH8yIX/w4BFkyZxZ/z5Jzojrrq3bsG79JvR4pws83D3AHy0p2zWye+8B5M6VC9mzZ4G+trtmMp5I8igdx83vdO2IS+eOI+ryOcRGXMJuTpq/8FwbLP/zV9hfX3YBUVfO49LZo8RvJHhTd32V3B/knzDnzluIcWPH47NPPkHfgUNQs2Y5/TaJcWPHYNwXX2L8mC8wcdJUHDt+XLcpJEM6fNC7n55zWbZsOX755VfImy3cOFfFJtpXtrNZ8yYICAqCtFkrZZdjnRJXSiFlgxI5F6D3ZbFheRZEkohOCjqF5S9fuaJTAX783awEaAIxIYFFGFc2ePt6MT+RBGQIGtevh1Wr1rCtv+G3P/5Cl7c6ISQkBCnbwALXrVnkt6B2wc9LAJlj43Flcd8RQoVq/aTJ2bPnwAMEf7uw7BUSZZ07doJ8aychPhY93u2mf6vNmzfi5VdeRGEeF4FynBKDgMAAVKxSifv+aKz8cwmGDh+JRYt+RaJ+u8jf1vZIGNziWemRwMJ08iFE4FHvUmR0NDbyhmLthk1Yv+l62bB5C7bv2InEhDie/HkTcVcAsxxeU/iXCxPZ/aQbGIeVM7B4EhdiYubshfjfU21Qr9Hj+OzzMciTJw+6vt0ZC+dOx5MtHoc7CZJkFyP6TZsmGFkzh+DA/oN4+rl2qFKlJl5++XW88VoHPNv2RdSq3RDKzR9uXkH4bNQ4XJBvkPACIxeiaGK2ZctWfPvNRIwaMx5jvvgKY8ZSPhuDqdN+whXeqMo7Jcd9MRajeZH/dTEvbq4XcGcHbjdkf+VVUu906aSJjYwZM6Js2TJY8vNc+Pn6oMObnZEzfwmUKFNJe5b/1Hn5xbbwYp7uP/stF/J4Xsjd2Z4zZ87h8NGjqF2rBi/oPuyaG/34YgHJhI0btyBNcBq836uPfuw5Wh5LVUr71Rv6io2Jwf79BzBlyg9o/dxLaPv8y8iUIQPavfQimjVuiPQhGcGdRpvLZv+evfh24lSM/fJbHOOEWJ7cudC/7we8kX8Fn386AvKe2gGD+iAtSZFXeLE+fmg3pk35Fo8/3hQQ7MWJQ6TuI4eP4MfpM1jvq2j+ZGuc5280bMhAknm14B8YCN1nh70JDAIGAYOAQeC/QUCIDzc39d9U/ijXyuv0LXXfeQsmxpwsgJAaEk8p1GdOa79PO3qKw0PXewKn7aUAYEV+YFsOYFc2YGMu4GQGwOZSCYvC/uE2lpIEA7MaBAwCBoF7iMB9XxXPr/LNhMmTp8I/TSZUrFobL7/WEdN+nKn/oeDMmbPQrwxSqfckT+7czHA57zIlq0wGh2RMq/8pjgMlUSWJ5CXyuqGUq1OlJ6XFKFPGTByOpThn09453pLyYqeFPqKjorCIY0pv//QoU64qnn/5NXz9/RRs3rINJ0+eYvsj4FqTLneTzflLl5AuXRqEZErPpl/fN1Al41s9ac7J5FRdcTx5kOPRX39findJHLz0fBtoe+lHqgVuQ+nmhuXLV2LixCkcn05ExQrlr5+DuA13gquPtw/kzQvnz59HDOcfkoqzH+s2bsQPP/6ENm2fgb+/3/WY8DcQ+89Hj4G8tixv3rzX24iBiE0hwN+fY/8geHl7wcPLk0N4C5GRUciYLh18OJfg6ekBL+rl9WIBAf6Awz9cFtkHQsNC8U6PXphEgmMM50EmT5uBqKgY/PzLEowd+6V+6uCjYR+jV98hOHf2Aqz4OI3VKy+/iHncX2bNnY9nWz/DfdTDxbMjKr9rar9VajpHkUTOn7AzkHmjlOIwsQfE4PTpMzqePn1aF6wsyNxJXh5TAX7sN/cz5e6G4DSBOMvfZeTno/HR0E/xbKunUv2HXe3QdcM+PNaksda07/A2Jn43ESdIBP00Yy4qVKmFwoUKs75ENtl+v6UNb7ThbxB+5Sq6v/cB56TGodXTLXHh9BEMHvoR53a8YcVGUmIh8z9JLgQrtkF+v/z58qJLpzexa+9eaDJKpTi+kwo9WhGDwqP1e5vePkoIJCagRrUq+PP3hVi74nesIgt8vfyKgf17o3jx4vDy9ITFAfAdh0gG3E6nllxVnImbhLTz8PTpjB29AAAQAElEQVRERk64lyhRGNWqVkHrZ1raP/A2YwqGD+mPosWL2R3Q1h65trW5uemJ9bc6d0CNKhURHR2F1Ws3YNmKVdi2fZf+2K34fKxpY6RJEwzFGw1n6ejoGOzYtZuT+ZMxcNBQDOFFfMjQjzFs5Of4c+Uq5MqRDafJ2g8aPBSDPhqO35ctBx3gTixKKd5ElsGiuT9h9fLfsGH9ChI/DXiT4Im/lq+Bp7sNTZs0wrixn0HeuZo1OycgSHhI3bEkk7aSuJHHIY8cPY558xfqm5HixYrik09GY+iwTyBPZYwa9xVWrF6Ll198Fm14A/LkM89i4aJfIU9ayMVSfMnNxI6du1CgeFkSEC9j67Zd+rHpkcM/wuskL7JkY73yeioxdrPpR0OFSPr2+8mQG4QmDetj0c+/olS5KnitfWesXbtek0iPNX0C9Rs1R2Xe6Dd+vCXefe9D/PDDTJw9xRsSx28Qx4v2lu070PHtd/DMsy/wd1uPJo0bYuZP09DhjVeRjvtEsgu9tMGIQcAgkBKBm6d5rtHH+9+FN/dicg0CGgGbzZ27k9Jxs7lXCMTfuCLFe60wf1ibc8BamwfYRKLiTDAHyTf5jXivljuffUD+5WzacU2qQPzFcLLiACemvGjj5hCOIq2rnkCEF/QrsZB8seT8klxlUgYBg4BB4NFGgOdFmez+femfeO6FV9HiicexYN4MXL10CgcP7MLKlSsxcvggVKtU4YaTpDbHmCk1IGWSGuA5OrXM63QWnK/Clm9J2sumMGJ7k2l4bYjnmHP9ps1o2rwl6tWtjWlTvsfFs0dx9OherF6zGl9/ORr1atfkRG9CsqI3THAsX69WLcjrk7dv3wl5suRmtjfMc7NpAmbuvAV46YVnYROc6PuG9reTQRxOnT0L+a5J1UoVr/0D4u34SGErRIPMK/y65A/99gRwkl76fmjffuK4AW1aPY1smTNDcV4jRVGwc5Anb/btO4BqVSshXUgm/uzX/+5CGm3bvBU2ryAoz0D4pcmOTFnzo2KNBpg1bxEKFiuLEKbTZcpLMi473HwyaNvYyMjr7uuUUnr+xbLi9D9oPvvsMxjUrxf++HU+li5bhknffQn5HszsnyYjMiIUdRrU0T5y5suv56TavdoBc0iAvN/jHXh7e4MTT9d161YVSiks57xOj1590brNi2jV9mW0psjHwes2eBwjPh1NgicSbAD0omw4duKEjmbNQqxkv6APKyGRRM155OD8jn6iR/S0CgoKQknONQnpNWH8pyhYsAB4QDKHK8txm/rK8gFpg7Hyz99RpEhBvPp6Z2TPXRiDh4/Ae9274rFmjZA2bRqSfenwt/2nL/80wWhYvw4mjBuNKRO/4u+cEYkxUdi0cTOGc25q7FffYtfuPYjnMZnUV2kZy3p5eaFg4cKQfyoNCw1Dsnw8ugtvXR/mzpu+GQQeYQQ4mM2QMQMKFSlMKcQTYMHrJG+B/Hit3QuYO2MqunXpBB8f778/Gd8WpIkoVaoY3nm7E/LkysXzrro1/2Tzc+fKiQ7tX8WYz0Zg6qSvMXXKN3jn3W4oXrIEbG5uHMjf5KaKJ30hSD79ZBjmzpyGaZO+wZTvv8LUiRN0/KdpEzF/9g+YO2s6Xn3tZYRkCoG+qLGcf4A/GtSri7GjP8Gvi+ZgIckIEbGfOvFr3tSNwfdfj6N+Bn5ZMAPtX2vHttxkIuK28KKxEBq8YcuTl5MWJAPAC5q8i3LK91/i2wlfYOYPk/D6G6/D18+P9V7DwNPTkzcbkZg89UcUyJ8XHd54DZ07vIFataqjcOFCaNiwLj54/13MIR4TvxmHBk2a4J0uHdG929soygu0By+Szguxzc2NusL47qsvMHzoIHxFwmX8mE/xZMsnEBgcmKxecD+TR6obk/QYOXwwBg/sg4EDPsSwoQPRp3dPFGHdijd0clMt2Mp/XeTJnQulShZD/Xq1UaJEMd54Zbbjz+7LjXhx7rNdOnfS5b/84lP+dl+jxVP/Y599k9dNe7MaBB4qBOSm+m4Kzy0JPMfIjbIMwOU/+EQiIiIQfjWcctUh4fb/RpO2PFQAm87caQTkP0pzZs/KwVxaOK8hd7oO4y8VBHi/orVyjOrRnMvER5wbrCs+UDGekOsvmMbBDMBZ/kbyShVd0LERckNEnuKI4z2aQ319wEoSeO8lJiJiwFBd8gMukVxRLvXLv+pKvhGDwH+CgKnUIHAfI6AU5AkPeS1N+gwZ8G63t9D0scfgL69Tiotlw2Nw6VIozpw7Zx83U3M3Vz8/H+3+4JHDkH+A0wnnhm2Nl7Eo0zaO5RhwVfrV1HNmzWMc6Mixeqs2bZA2HSd0OWaFFQN5ukX+6U4pXiS01d9seD2rXLmCNpo87UfEhIfbryK3Wl6XlI1COCfuJZYQn2DHT3w4RTJEnOnUQsm/gTixiJKnNdhmVoAkgWNJzafoHNlJAcu7kwTImiULQi9fwbaduxF6/iKuhl3G7LkL8eVXX+Odrp0hE/H8YZKK6fqYunD2HMpUqI4qlSuibZtngMTU5yLkN82WNYsmKf78/WcsWfgTZkz7Fm91eBWFC+bTb5sYMaQv5s2azHmPn7BsyRzMnvmD/ufLVO/pZAwRdRWbNm9B336DUKhAPgjJcuHMUaxatRZNGjVEZvlORkIU4Nh3pG158uRCo0YNUKtGDWTmvEuqpA77dbur1JU7d07k5rxRLocU5rxGoJ8foXLd/xR27tyj3QemC4G8ek7GQVc59tlB7HPlyoEQebuFWLCP8raPiIhIyJM1hdlHf3nFFH8zwVNeXRYn+7rYpiZx8ahSvTKW/roQy5cuwm8kiBbNm4lub3fExCnTIE9m5MiRg7+Z631Tao6oYz0tWj6Jdq+3g82N92CcI3vv/T4oW7EG1m/YhOXLV6Bc5Tp4qtULCOV5g51mIa7c52JiY/S3TYpwXiUTMU/196Tpo7bybvZR67Lpr0HgEUKAk9P6v+V5Ik815IXJz98fufPmRkbnSf9OwsMLQOvn2mD4J8NRpVoVuMmJ+xb9K6WQI2cOVKtZDdlzZOdFwgLkxlD6wgsQ/m4RO0owmfOCnIQvU64MypQri2KccM/Fi7DolY2nQGLgemPhzjYKFkKglCxdEiVKlbihlCxdCrl40XUt/3fNuqV86R8vcE5bwa0E21GtZnXIt1M0DmLjNHCERYsW4c3LLHz39Vg8/r9maNXmaTzR/DF04w3UaBIYHTq1Rzli4OHpSSxjUJqYDBvcH4WIT7I+0LfU88JLL5B06or6vGEJThsMvQ/JPuWoTwe0TZsuLW/eG6F165YQXH39fFGvfl307d8HX04Yi0mTv8eUaZMwbfpkLVOmTtK6r7/9Es+//DySbpDEIf35+PqiboM6unyjpo0RnDaI7Y3DQ3Xh5v6tb1LuVmj8AnJ8P0AiAyt5/dutity4a9KCA0UdXg0neXG9yLtjw8LCEBoaisuUVavX4pfFv2PQkBHo1WcAhgz/FE2bP60/fFixal2UqVhTx8dx8MVRjRyVj4QopaAeiZ7e+U4m8LwtJPed92w8/i0CNncgsD2vj1FJptalIKgTvGYLqSFa2bHdE4FzfkCUN5Ke1iDxEROjEHbFjRNawKjJHqAjSiorfSR4JeBKhIWoWAtJB4sQH8xDKovifpGK2qgMAgYBg8BDjYBSbuwfT4yp3oMqyNPuZzmBXaJYYcjkMZxPbNA+MSZGf/xanoZQij7o6a6tPEfnyJYNVapUgnxfUyZ2IXWyHfoemvG//lrlqF7ZQ+oSOEY9efosynAc7CX/PAlOvtOXlLE4YXvm3Hn93/k28WMvdfMty/oH+GPkiCGYNHkanmn7sn4Ns9zn6nsL8cN6b+6EuWxX6ZLF0bRpI7z3/oc4fuIEIsIjEBMdo/9DXtotE9jyT0CxMbHUR+unBK5euYIrl69A7r91/+nqupVtzEayolSpkpj2w0ycOHYckRERuoz4E78iEhc/MSRJIjmBLmSQ3IdL3nU+OU+RkxPvQwb1xYsvv4Y2z7dD3YbNOPbuifFjRyFfvjywufMaL3232TgM5vWXBM/effv1B8uzZ8+O7u+8jfyFi0CP0a+rQNSJSBsSgtr16qJGnVqoyrkE+cfPMPZXnkh48onHMX/RYmTnflC5UkVUr10L/2vxOLhj2kmolD7ZFhmvXL58Ge1ffxWfj/kSb3friQkTvsfg4Z+ift1ayJzdMblPW8FTsPpp5hz+BvFY9tdfmL/gZ01ASF5K97ealv2iFvvSnXMcHw0ZiiHDPtIydPhgjPnic7ze4XXIfAJBS3K5fOUqyJs0EBepn3bp2bsfPho6As+/8iZKFC+GTMRTvtWxY+cu9Ok/GAcPHSYuWbFh81ZcvngR4BzRpdAw9Bs4FDtImlgp50SSamKE80ueXp6oQIKqbv168PbywsefjUFe+SfQEkXpy0ajW1zpCzyu5PjawraMGPkZPhrYFz/9NAXTpk/DymW/6Ne5v/hKe1zh7yrttLhvnThxEiM+/hTFSAhlypIZyeZ6brHqh9HsNpB/GLtv+mQQMAjoCwNvGO7aSZEkCJzExe3CLe2KT/h3J2zesOibAl4IkkLxK3qR1Nok+a72N4uLbWo+7rRO2iBY3KjN1AcGBSJf/nwIlG9kiL0I9fq3lQuniFMn7RN/EoqNhK4iOrEXkQvvzS7yYpvAyRWnb0lLGfndtcQAcSKxDEUkLiJxEhuu9Urctbz4uVndYv+Aidw4RkdF4cGTaMiTAmFhYbicioRRd7+ItO/CuXO4wEGYXSR+J+U8zp05o+Usw7Onz+DfyHkOhP9auZqDgl+wYOHiv5X5i37BjJlz0b3HB+jVuz9v1D+6Tj7sPwiDh32Mzl3e09/RSZ+tACpWqwf577rfly7joC8KaYLToFCh/Oj45qv4cepEzJ4xBfNmTdPf79m1ax+PLEV5+FcZo0XxmJRJiYe/t6aHDxUCNk/AvxZgHbB3K84GFekB2HhNFo3iRnZwEU/eTzlJEaqhbNh1yIY01T0RWNUTkxa4482WCh2fUYDrdddi2iMOF4Mu4Omhl/HL9ijAJg4cIiSIKKwoWD6tAQ9fR4ajDY7UvQpMPQYBg4BB4L9E4DInh0N5Dyr3dikl4vJVjtMCUKFCOfyx9C8cPnwEYefPQ15RE3bpEmbPWcB7wJ8h52fc7YXjthrVq6F2zRo4e+YcJk/5AWdOn2ZbQhF68ZJ+dU7dhk2RKVMmToZb9tZwjObl6YWqVSvrpwD27z1ob7+MAdj+pcv+xJQp0+HnH2C3v41tl85vYggndtev24CCRctgwtffY/eevfpe3k4iONpwI58ck5coXhRtnn4SMlGdI08R9Ok7EHPmLsRfnPzevHkLtm7bgRW83/5l8W/4YcYcjB77Fdq93pGky0v6P+pBoiFV98SqVMkSeKvDG/hu4mRkz1sYAwaPwPwFv2h/G7dsxeYt2zTxI6+W/uHHWfjk8y/Q5rmX0fq5Q66XngAAEABJREFUV3CG9/nX+SaWadKlQ9PGDfDt12ORPXs2lC5dCt98+QVatXwCAUFBSORY/XLYZVw8fwF79u7DoKEfo1Cxsniyxf8wfHA/khUtObbmmDrVRuMax8DxdNSVq9i5bTu+GP81PEisNKpfWz/BU6VyJTRp3lL//iePHkUk9189P4RUFrbZ28cHTZs/jlGfDkO3tzth1eo16Nm7LwmxEogm8RMeeonFLSQSsxMkoT4d9YX+5qy8JWLsmM/wQrvXsfjX3zXpdB0mrlUq18T18fiEeOgnMRLZfz3fEAskhZxfYFt1Kf6mYRcu4I8/lqFR/bq8R/HEgH49SEp4Ex8bPhs+CA3q1SYvEqH36Y5vvQN5+8bIYRxHDfgQo8aMx1/LVyKOfTtJUmEnCRLLSrx2TOhKUmwUG0/RhODxE5jIY2sox2Td3u6ImnVqI9k/f6YoerNkTEy0zq5UoYLdR2Ks/ofW0Z+N0K8/n8hjL5y/3/oNG/Hk089pkqpkieJgR2EWOwI2e2C2BgGDgEHAIPDAIyAXet78wbIe+K48tB1wc8O+/Qcwc9Y8zJ236IGSefMXYeLEaXi3x4fo8UG/ZNK77yD0HTCEMvi+kP6DhiFP4bIoW7kWKlavh2dfeE0PQGQQcifk2RdfRUi2fFoyMXyt/Vt6ACWDqH8iL736JkaPHg/56OEWDk62bNuGm8nWrdux78ABZM6ciQPTEOTKlRM5c+ZILjlyoEihQnjyicfwDm+4Z0/7Vr8G8IvPR+KTz0ZixMhh+ODD99GqTSs89fRTaNm6JQoUKqhfmejj44tTHAQDCo/CopTCWg64L8p/eDH+KPTZ9PFBR8ACEjnAt3kDfuXBkbi9Q0JwuDNPjl0evuExiTgVGovIKJIRGSIBbw6ehdAQaw7gC+RMwJgeifioow2fvBuDoV2iMeoD2ri+DktZiEtIxNHoKCw+HY6o2HjWxyGkVBPACQd/EiISt/ZBZXiT7clD76JgYFaDgEHAIPCIIBAZyXMs+/p6+05IG5IDGbPmuU5mzZ6nv3FZs2ZV1K5Vk/deL6AFJyrf6dELdRo8hlFfjEeL5o/hf481gTy9wJMtPdrX+HiexxmNjeV5l2HylefpuHgcO3Yc8TIWTJ6pJ6Sl3Dn5MLWMFyWfoU+gP5o1aYDXX2uHLt17Ih8n17u9+z6ebvMCcucvht69eqBqlYo4d/a89sEN5El/aX/TJo3RuWt33W75UPP/nmqDd9/vi+pVq+KFtq0Qxol7i3VIVX8rYsf7L3lrwacfD8U73d7GhO8moWjJCvpph+8nT4c8XQHa3NAXfShOdrd5vi0G9vuAZEo/XL4ajjHjvkT7N7ugPMcEZSpU0/frwz7+lGOxOdi5czcyk+CpU6M6/P38buha+p0mXVq0ffYZ/Xrufh9+gFOnTpPkGKP9VahUE+Uq1cAbb76NTzjhP2f+Ahw8eAj58+XTr3yW18+m6pwkgTyR8eJLL5DQGIARQwbipZefR2BwMMDfMYGT/GPGTUD6zLlQpER5yDdSBg3og8GUZ559lhP+9n3O4TtFYL8Ox0REaPJEJsfbd+wCTw8PdOvSEelDQhAQHIwXn2+Dvh/0xJ8rViJbrkIci2yGEBOp/nbE32K7rvB++fCRozh4+DBCMmbUr8wuX64M3uzUDd9NmoYTJAo2kxD6sN9gjfHwIQNQtkwpvPLScxgz6hM8+cyz+ObbiThFu9SejpGW8+eEvGY1RaeuJcXoWurGMWXDtB9+1PnNmjbWuMr45yNiPXjoILR/41X4+/tjEvexynUaonLliujRvQtKliuH4iTUevfsjifaPI+Fi37BmvUbcZHkYEb2WT+do72m2BAj+SfHM9w/hHB78ZU38DaPk2+/Ho/mjzeD/ofcFEVuKUncS5DMeOO1V3jMNcGGzZtxmvidOXkSadOmoQsbxn35DY/J91Cxah083bIFXn/lBRQuUeKf10mvD9tqe9g6ZPpjEDAIGAQMAgaB+xkBeYriEG8aZZDyIMnRo8cQHhmBwgXzo0DePEmSj/FCnDiXb7cULVIE94NIez4ZPggf9uqOD3jj2u3tDniHN/t3Srp2fhM/L5yFXxbY5dOPh+AzDtj+jQz5qC8HNH3Rf6BIP4Y3l34D+uLDvr3Rk4PTTm91QGeSHK7yVpdOJH6exWP/e1zL4080RxkOTtzc3YBkT2RxElWe9BLhQAyc6CxbugT0f1Xh0bhNVBwcyccolVL386nDtO2WEHiEjIQAke66+wNeVRmLAeRVV34MbQlMK2w8FIOs717C3M3hCJVJMyFISGgwEyAR4ucLvNk2Bj3bR6NqOYsTQJxRkKJiIHaUS2E2/LbWHRXa2NCzlTvq1rIBQSRJ0pH4yBbK+BX6YjlbWsA9UEpCkzMkWOwJszUIGAQMAg87Aolo83RL/Rqn1O4FP+E94sgRQyDfKwAnoMuXKY0BfXthGCdhK1Ysj/Tp0qN1q5YY1L83J9lboR0nxB9v1hju7h524DgbLPffI4Z9hFo1qlFnJ0MY0aubmzvKly2Fz0cOQ85s2XgO5jlZ53DDqEzw1qlZHT3f64IATvbKhD5zeD8Yj0rVquHtTu0xYdxo9OzyFgIDgzQ58z0nbLt3ewvPtW2Nzh1eR5C8YYDtkFczFylYAAPZfmlP0yaNkCZNGjRu1ECTDi+92BbPtn4arTgB6+Pro6u5pQ19uxOblq2ewofvv4thH/XDNxPGYfCg/iiQLw88fb2R1O4bOaQP3sCiTv26eK/nO+jzwXuQV0yN+XwE5s6ejtk/TcEXo0di2OD+EJKk34c90bd3T3Tt0hElOUF/08lpTkBL+xo2bYTebF/fD3pgKNs4dtRIzJs1HXNmTIXUM3RQX/62H2i/4vutju0dr/NO/psldYF+ER+PoOAgBAQGAJIWYV88fH1RsGA+vV9N/OZLSHvfZ935CxXgbxeT5CJ5ROlkeEQk4bKwZ89evNq+M3bu2o23OV7o+W5XZMuZ0z4pzvv+YJIgLfl7DerXG291epNDhBgcI3mzd/9+7cdXfkO2RRIysb9123aM5UR78xZttM8e73bhGKsT5AmekcMHs07gy68n4rEnntFPUsiTHyVLFIey2eDu6YnnSCJ9/dVYfDTsU+TOV04/5QM3N7gucbxfiYmJRXQ0+6js/XHNl7gepzjaJelUhWUjr17Fmx274gmOh3Llz2/vt4x54uMQdeUKZsyeg2Ilq2DW3Pn4ZswodCAhkr9IYY2vH/f52rWqY9xnH2PQkI9JcHXGqy+/gMAA3nfdqG7WefrMWeTJXxyly1dF1qxZMZP73dNP/g+aNLlRuVQ74KJkOR8eu291egMjhw3W/5DY5PGWkCc9Xnj5DTzRvCkqVSiHHDmy62/gduVvXbJcWfYjNcLUxe8jFrU9Yv013TUIPBoImF4aBAwC9ycCvNEsX7ECevd5H915Y/7AyXvd0KV7l2TSjek3O74B+UDbq6+3w/0i7V59Ce1ebYeX2r2ABo0boiEHaHdSGjVulORTvqOUN39e/BspwMGkzY23ZUmPb/OG9ZbjcbzBvYFwUCUDKy3c//TI5G+ODnlNm7wSKjo8DOCNPB7yxZ2kUJo0wYD1kHfUdO/hQsBJMHhwIJ6hC5Bo/8An/EhMZCEp4ROLTBktdGwEtPkuFF8uicO2ve7Q/6QsRIh81JYkCOI5uSBPfAjxIWmSHuBcBOcfsPOADV/P9kCTDja809aGlv+LQEjZM0D+o5TjQPBVIJHG1iUgsDPgnc6Osf4gqzmg7GCYrUHAIPDQI8AJVbkP7kLCoHPXzkgpb1MnedWEvKCtt48PqjLenfp3Ke+98zYkLjohDZpxMvMl3sf6+ftB37fxXq5ug3qQe+5nnn0aiIu/BqlMjHKSunmL/6FTl06Q7w4km8jnZHqWrFnQqm0rvNm5PbJmF4Ik8Vp53msW4oRvu9dfwTvdOuM99qEH2/P8y8/rCfnmnDh+s/ObyJUnN/TkPOsTIqBU2dKQJzak3e/SXsJ6DesiMDgQVapXwavtX0XGkBB7mWu13TxG33K/KkRAfRIqcg/fo/vbqFGjKv3cxjWFeAkG2TgZLG2p17A+Hm/+OP731BNo2Kgh21cVxUuWQK7cuZAmbRq4ubvbJ8Zv3jro34LYK96uy72//F4yxpB/NmpO/OuxzZWrVUbR4sWQI1cOTWro22j+Bn/nWvuW/rsacl9p3qwJunTthOdeeg6lSJxJv7S42rnG6UOeqggKCIDNZkOunDkwYsgAyJMMLZ58AsHsr2CcVIT24D6QifvFUy2a46tvJuK5F1/DlCk/onu3t5ElcyZ7v1ng0qVQvPhqB1y6dAl9+/TA+yRTqteuCRkr+Pj5oVGjesiZPQu2bd+O/h++j14cN5YqXcqOr9RDHAICA/HyC20x6duxePLJRvpJGSkPxyK/cgL7ncAxS3R0tEPrEtCP5F28GMrdUaxd8lKJynhm8Ef9IYQV9L3JNSN5pdSePfvRt897EEKsLY+RbMQBrF9bsQ0hWTLjmaeexIihAzF18jdo8cRj3MeDkzDRdq4bti9L5szoQ2Jt2qRvIcd2C5aXJ6fYYFfL249zv5ZjtQuP82H8TYcM7ovuXd/Cuzxuu/M80p37yTtvd8Lj3BczZuKx5+zH7df00JawPbQ9Mx0zCBgEDAIGAYPA/YgAb6b0jZXclBjBPcGCN4z6Zv9uhbyh1ze1/zbkTfP9sMtmzZoF6zduxb59B8DR0/3QpFtuwz81TPVR/3/qzJQzCNwTBDjwTyBRavMh+cDJIc/q0E9eeFGXhYREjgsoWDES3V6Ox7f9gEXLbCj5tBvmLfPA5l0eOHHKsreS/IUQHlrcLYRetmHrbjf8vs4DxZ50x7ufumH6UAsdWsWidHGWEbIEHEJaLCiEiXixTgIBNQCvrIClmRTRGjEIGAQMAo8OArdyTy9jAEFE7vfknpRxmYAXYRT6XtWZJ/4krjO4EXvRcQKeqeSr2DnznXW4Wsj9qS4bB32/6poncSnDSXAvb29k4oSvzd3Nfn8u5Zx+JS62IlKflKFOvkGZPkM62NxYRmzlG1LxvA5IfcwX89sW8S++xAcL+/j4QhMEjN/WKvVLW8SXiGAnoYij/dqv1Hc7jnkp1DiKn+uEfXf1fTt+U7F1F3JG+iBYiN9UbJKp2Gf5TeTpFPmuSFDatKhYuRIyhGS071/MT2bvTLAfpUuVRK8e72DYkP7o16cnur3dEZ4+3nbsyeRkyJAeE8Z+Dnm6oOUzTyMnCSQ9jhP86NfNwx2lS5fU5EfbZ1shE8cTGifJd9ZDOygLDZs2xfvvdcVjJHj0fi/5tHOz2VCrTg2SJM8iSJ6IoU6ykoQYyDhlyKA+SJc+rb1tSZkpIiybjm3u9OZrKMF2JSOOmBcUFAR5O8Br7V5EqbJl7L6kfa5uWJ8QcjXr1EJr9ildhgzQfXK1cY3Tr5e3F7q83UGTjgUKFeSxxPsy6l3N/vIEifgAABAASURBVHGc7YGViHLlymoy739PNkdjYliZpGNBEpn+8nSK7Csp+/GPK3y4CvLu9eHq0P3eGzeeOO5BG00VBgGDgEHAIGAQMAgYBG4fAd6nFMifD1GR4XBzM7eJtw+gKWEQuIcIWBxUS3WegUCGtwFrN0UB8oRHUASQNgy5Ckfjucdi8XH3OPRqB7Tu6YYyrRQGjPfEik0e2LjdDRscsnmHB6YudEOpp6Gf+njveYXfxsfhmSYxyJWDFWnyg6Hrap0h+fEB4JdPay35D0sOznXCbAwCBoF7hYCp50FFQCZGRe6H9ks7ZOJUwlttj9gK6SHhrZa5Xbu76ft22/IA2IdkyoSmjzdDzly5oCf9ZdJcftebtZ0YyxNHJUkUCGFSoVJFhMjTHwmOp4WY7+HpiXIVytn1JMyuIwJomz1HDv06MW8hTqTe1OoUAikuBsVKloBSKpmFED5Vq1aBPLWfhuQNWG8yAyYKklR48umnkCVrVlzXBuYnW9lvPz8/Ow7JMqDr9vP3hyYNSADhRou0QfKFQKO/G5kl6Wnv6eVF4oOE440wSDL+hxHxK21KEgfxxrr/ocdHopgZ2d6rn5kHdvTVqzh/MRQ2spr3qlpTj0HAIGAQMAgYBB4dBExP7wQCibdyc38nKjI+DAIGgX+HgAx09VMgvkCaupTPOBmw1e5Tns4Q4ZhY/jG3XMl4dHgmjoRGAhaMspAuWKH6ywrl2thQvo2bFiFGlm90w6JRbvh5dCI6tIpB3WoygOeQUSa47J5dtsxzywCkbQr4ZIc8/aEsl1ezuFiaqEHAIGAQMAgYBAwC9wABuY+XiXEJb6c6fU/BmwaZXBdJWd6Zn1LvWofkSVmxddWnFhe7G+ml/TfyIXVIvoSplU+pu5EfsZM8EYnfSbkbPu9k+x4qX7feGd7N3rqxsfwXCJAAuXjxEo6fOKmZxn/hyRQ1CBgEDAIGAYOAQcAgcNcRUMrcJt51kE0FBoF/i0BiLJDICQuPICBzGyCgF9MOEsTpW4iQeIXMmRJRt0o8mtaJw5vPxODPrxOxZKyFJeMYUn79IhEfvhmLxsxvVCsO2bPxHJDaUx/ar/xXaBgQ3J51FtAaS9pinv7QWNzzjanQIGAQMAgYBAwCBgGDgEHghgjwrvaGeSbjDiOgbDaYpz/uMKjGnUHAIGAQcEHARA0CBoE7gYD9cfQzZ84Ayh6HWQwCBoH7FAGLhEc0IMSDVzogGwmJYJcnQVxbncjjmVwJSGpky2KhRoV41KsmEscwDvWrJ6CIvMkqjj5JmCDVpz7EYRzr2w4EdQZCngI80kK+P6KEiJFsIwYBg4BBwCBgEDAIGATuAQKmCoPArSJgu1VDY2cQMAgYBAwCBgGDgEHAIPDoIHDKECCPzo9tevpgI2AlAglCgpC48M4KZH4SSO1JENdeOskQIUSE7BCR+A1JD0dh6wpgcwfSj2E9LwKeGSGvvoI8/QHW7zAzgUHAIGAQMAgYBAwCBgGDgEHgfkHAECD3yy9h2mEQMAjcAQSMC4OAQcAgYBD4twjIQx9+AUFQSv1bV6a8QcAgcK8QsMheJMaQjEgEvDMD2TsC6cYyvZUSegdaQb+J+0l4VAKyfAJkag14hdB3vIN8Yf4dqMW4MAgYBAwCBgGDwK0jYCwNAgYBg8CtIWAIkFvDyVgZBAwCBgGDgEHAIGAQeGQQKFQgH5R8N+CR6fED3lHTfIOAIJDoJCOY8MoEZG4F5FwNBDBMFCLkBDNul6igvUUCxdoOpOkB5BoEpK0OuKcBdH0O0oWezWoQMAgYBO4bBGy2+6YppiEGAYOAQcAg8N8jYK4K//1vYFpwBxEwrgwCBgGDgEHAIGAQ+PcIWPI9gX/vxngwCBgE7jUC8iRIQhTJiTjAI5ikRQUgW1egwEESFz0BRSJDyBAReZ0VSHDAubCMkB2JO1mehEkCRYgP/6ZA/n1A1jcB39yA8gASSHwkymu3XMvDLAYBg4BB4J4ioCsTssPdHRDx4PnJwwcHD/CcJ3ptYDYGAYOAQcAg8KgjYHvUATD9NwgYBAwCBgGDgEHAIPCAI2CabxAwCBgEriEgBKYQFPFCUFj2V1X55QEytyORcZxkyD5Y2eYAQU1IdJAQEaJDxC2WhEkb2n0P5FxKuz1AQdpn7wf45Qc80kF/7yM+EvqbHxZ9X6vVxAwCBgGDwN1FQF7NqUkOkh2a6PDkeckHZ8+cxR9LfsfCeQvw1fivMWTgILzyeids3rQFkDIwi0HAIGAQMAg86gjYHi4ATG8MAgYBg4BBwCBwHyIggy8ZsN2j/0SzbG6Am8cDJBzI3oc/26PcpJgYToSau8RHeRcwfX/gESA5YcUB8jSIEBZWPPQTIT7ZIGSGStcQyDYAKHwaKOKQ/CuArO/ByvA/IE01wL8gIPZeGZBEfIg/ecrkgcfHdODhQMD04qFFQO6d3Xg/q4kOD56/vHD1ylUsX/YX5syYja9JdPTt0x893+uBjm91Q+9+H+HPFauwc+cuZM2aBRO/GYf8+fI+tPCYjhkEDAIGAYPA7SFguz1zY30nEEiMT0Ci+Y+pOwGl8WEQMAgYBO5/BDiACwsNw2+Ll2Dfnr3A3SBBXFAQ8sM6vh1xf36B+OVfaoljmFJulGfXT8DN7OOXT6DfayK2Tp3EnWLXfZnMl+gkP6mev8YhYfN8JCpzS+LyM/6nUaUU6tWthYMHj7AdivLwrzY5Lh+Nrj78P6bpYXIEZMwhhIU8DRIfAQgZIt/usHkDHmkA70zXxCsEcA+GcvO1+0iMJu8RyTJSLspOgog/e67ZGgQMAgaBO4NAMqLDE/DwQnxcHFavXI1pU6bhy3Ffkuh4H6+83hE16jTC6x27YfW69Qi9FIo8eXJj2Ef9sWD2dHzQ4x3079sLLZ/6H7LnzAH/AH+et0gG35lWGi8GAYOAQeD+QcC05LYRsN12CVPgXyEQxwt52TIlERwcbC7G/wpJU9ggYBAwCDwgCCiFixcvYuac+Th3/gJgU3e14eLdio2CFboX1uXDWsDwejmi89RlTnI78iUuZXD5EOCik7jorbDDAMW6fJBlr4k9356WuHKUtduxjCMteaKzh9K2g/R3EIkR52FeUYD7aFHw8fZGVHT0fdSmu9uUtes24erVqzD7Iczy0CLASUB5NZaQIQk8tuPDSWzcTGiTEAeVmMAxSyJRYXlu77fVtMcgYBB4wBC4juzwxKYNm/DdN9/h66++xdudu+LZ1s/h8RatUKVGPYwd/zVOnDiNiIgIvP7qSwgPPY0Duzbis5FDMXhQXzzfthVy586FNOnSITAoCIGBgfD28QESed4yhO0DtnOY5hoEDAIGgbuHgCFA7h62qXq2eBH28PQA5D8NU7UwSoOAQcAgcNsImAL3MwIkQBI5CIuMJCnBawCgcE8WG681yg2gKIqErmIp3gJQ7wwlzxl3hq46icPmBmVz1z7Bsq6i1DW95ZLnrNsZOsskpelPqXuECcxyawhYkL9H5Vfx8/ND5UrlkJDAid5bA8hYGQQecARIZsj16GbCs8AD3knTfIOAQeC/REDmO5JeX2V/qgMeftizaze+mfCNltdffRMN6jdB2Yo18VK79pg2/Sf4+vqiWLGiGNSvN6KvXsCvC+fgg57vYMTQgahVszr8AgIQQJJDrt1i6+XlZe8l77Xhek6za83WIPCwImD6ZRAwCNwmApz9uM0SxtwgYBAwCBgEDAIGgdtGwPYfTfIrtpRTXdxevyrY/yRHySaFKOaLSsmGIqFMjDOqV0nrCDep6RXLS91K53PDVVHHINlqH6+KZTK1SRgE7gECFpRScJdv9NyD2kwVdxoB488gYBAwCBgE/lMEeA3lRRTw8KA4iQ5fnDx+AlMnT8UXo8ehQ/tOKFO6AtKkSY/Cxcuh3asd8GG/IQjJlBHly5XFyj8XIzHmMhYvnIWB/T7Ae++8hdKlS8LL2wvePt7wJMkhYhNSJSXRITeRMItBwCBgEDAIGARujoDt5tkm1yBgEHggEDCNNAgYBAwCLggoxkUY6H+GU1ASTSaKOiEt5MnEZBnJEpwcZtqi2FcppXRUttf0oDfRQC9OvfgXhTNtj9tTsnWW0KEZwAo8Rv4jBMzu9x8Bb6o1CBgEDAIGgQcDgSSiQ0gOES/AwxdXLl/BnJlz8fHwT9C5UxcEBWeCPBWcLXchPPtcO3SgztvHB40a1sO0SROQEB0GKz4cJw7vQv8+vTBowIeoUqUSFMkNN3d32NzcoIkOQUUuzq4iOiN2BMzWIGAQMAgYBG4LAdttWRtjg4BBwCBgEDAIGAQeLAQ0u3CDJgsLkZRlN1RQSRrJFnFqhCwREQMZj4peiT2NhOyQuGKmok4xvNmqaMNi3MLxohV1M3OTZxBIFQGjNAgYBAwCBgGDgEHgDiKgeD9GEkI/1UFCwvlkR3xcHH5esAj9+vRH1y7vQCkvijuC0mfFEy1b451339evkuzetRPmzJiK8LAzsKwYSjQ+HjkUHw0ZiEZNGsHm5oak73PIzWRqcge7Y1wZBAwCBgGDgEFAEDAEiKDw4IvpgUHAIGAQMAgYBJIQEGLBmVBQJBjsGokrZijqQK2McZVS1AASKCiInpukNZlGEo4cpewJi36kmJKNzlN6q2vkRlLKkecMxUCXk4gWpqxEHTMbg4BBwCBgEDAIGAQMAgaBmyLwzzLl3u06oSvRMdCrmw1Lf1+KHu99gF7v94FSPhRvePimRZPHn8KwkaMQERGJkSOGYPrk73D25EGSHPGUGIz54nN88OH7aN7if5BvdCAuBoiLpcTZRb61JYSHrshsDAIGAYOAQcAgcO8QMATIvcPa1GQQMAgYBAwCBoG7jgA5B9g4kHUKo0lpiStFGkKBg1nlEOh8cGGW1jnLSqiU0vkS12JTcNM6JLflHQXV1Ine7tPNTTEtAu1D8m3cuIpSCgpc5J3ODG5vNdZ3BwH9i3AyQ/amu1OD8WoQMAgYBAwCBgGDwF1AgPdVSCmsJpH3WQnx8ZAnOeLi4pBIMmLTpi0YNORj9O4zAJVr1IfyDISy+eGFdm9g8a+/4ezZcxg75jN8M+ELHNizlfcFCYi4egHjv/wCXbq9hWeefQYZQ0JIbkRSnGQHCQ/WQ2PWalaDgEHAIGAQMAjcSQT+uS9OV/zzwqakQcAgYBAwCBgEDAL3JwKKc9g2LcoxDnaGcKQlVLDRSGxFGHXkudra4zYacGW+AjdalFKM2gVclJI4UuicaQnt4upLKUVyxEKiPEkCs9wvCCTEJ+DM2bP3S3NMOwwCBgGDgEHAFQETNwjw/ok3XEgSm31qJy42DjHRMZRoREVGIjoqCnv37seYcRPw/of98Uzbl+DpmxZu3sHo8FY3rFy5GmfPncdLL7TFV2NHYePa5Th27Ag2b1mPCd+MxxtvvoaX2r2EvPnzkuSIoDiJDsdTHSRWYBaDgEHAIGAQMAjc5wjYr5L3eSNN8wwCBgGDgEHAIJD+3AcIAAAQAElEQVQaAkaXOgL2MbGCHhQDUPrPETJT0k4SQngHpUSjaKCglAijUCQmGAeglIIsUsbGqCSTCTMV5A9QiqGSkAIFpUQY1yHjUJBFMVSMKGXBspQWKLkt0VrJMUKMcEPBXVsUfwJ/f39d812rxDg2CBgEDAIGAYOAQeDvEZCLslOE5HBIbEwMIiMiEBEegSuXr+BKWBiJi+OYOGU6en7QF2927gbfoBD4BGZEpy7dsX79RpIh0ahftxa+//YrrPrrN6z6cwkW/TwfX341Fq+98QpeoZQpV4Ykh+sTHQ6iIyHx79tqLB5OBGT/ezh7Znr1ACJgmmwQ+KcIyEzDPy1ryhkEDAIGAYOAQcAgcD8iYEFPXnMeGzJmSSaA1oFLUr7EmeCKJJGIq96RpuqaDROivs6/q94Zd4YskNzeRn+xsOIuAQmhsBLCjNwUA8HosvBWRPQurJYFGydXqlQqj5jY2LtQgXFpEDAI3AEEjAuDgEHgYULAeWMk/2WixQZejAE3NwjRoQmOK1dw8cIFXDh3HmfPnMHMWfPQvWdvTXZUrdUAQemzoX2nbti6dRs8PDxQtkxp/Dj1Oyz7bRFm/TgZEydPxGejPsEbb76B519si8pVK0Pxeo/UvtPxMGH7IPZFKejfX34fid+oD5L3dzY3Knsb+pjoaEDqwn+0SN230k+nndimlJRNT5kvaSmf0s6kDQIGgYcGAV5ZH5q+mI4YBAwCjxwCpsMGAYPAg48Ab0XijiHx0vtIvNiTIeViD0coccolu1iOMNER6jRtdUidDl3STjsJXfMk7iqSnyTSBhGHP6ddUj71zrjkOePXha7tYDxRy7V+SFkRKSehUyR9IxGbxEvvwgobh8QEddd+eoskSEICWbS7VoNxbBAwCBgEDAIGgUcQAZlglYlWVyHJId/luBwWhksXLmk5d+YsTp08hTOnTuGXJb+j14f90W/AELRs/QIyZMmNdq91xI5du5E+XXoULlgAg/p9gMU/z8E3X43B56NHYejwwXiz4xu0fwY169SCf0AAEBdFiaU4n+hIAHi9h1nuLwS4j8TGxuL82XPcB07q15jdqIHyirPT3E+uXL6Mf01QyD6J65ejR49h0eIlEBLuX9dxvfu/1xAPIWBOnTiJ0EuhSExMTL0M7S5evIjTPGbOnDrNY8cucixdPH8e8g0cTSqxtMTPnj4DwU5spYzIFZKM/0kf2SazGgQMAncfAc463P1KTA0GAYOAQcAgYBAwCBgEboyAGxIRDGWjqDRQtrQcf0joEMWQYlGUQ8BQC211yLTkQwUDjIudM3TGcZ1tGtjLpEkqo2wSD9JpKS8iNjaWTfJD/6IXcep0iCB7u5kvfZB8iI5loUV8J69T29Deop2I9sO0DqnTIdNiJ+2ASgtL+bJ9CmZ5hBEwXTcIGAQMAgaB+xcBxWu0zQY4hSSH/HNBGEkOmZA9d/asnnw9duQojh0+ghUrV2PEJ6PRq88AjPx8DDp3fQ+FS1TAy692wJYt25A1axbky5Mb73TtjEXzZmD0pyMwaPBHJEX6oH2n9nj8ieZo0LABQjKFkOBIQXTExxui4/7dU65vGfedU5zAf6trD2TNWRBzFyxCQgLJKupdjWV/2r5jJ7LkLID5tIG7u2v2bcXjuY+cPH7CThKkKDnh24lo8VQbrN2wEfJEUorsu560EhOxWY6BXAXxCY+Ns+fOQR9XKWt29yD5Nx5ZchRA5hz5k6RC5Tp4q1sPbN22HVeFKHKzQQimkZ+NQdFSlbSdlHn9zbexadMWgPkpXZu0QcAg8HAgwKvyw9ER04tHEwHTa4OAQcAgYBB4eBCw2BURBsnWJJ2V/L++RK9oaVEvoRZlv7URHbNgkVpxxiVfdFpYRkKtY1yHonCIpMW/lAfzLcuCxdCRrYOktEOvHHUrJaW1SfKNww4MxbdkiqX24yir48yXPBFJi42IlNOhZLBfOjAbg4BBwCBgEDAIGATuPQJyrXchOECSQwt1YaFhkP9Yl0nlg/sPYP/efVjPCeTxX32HHh/0xYiRozBg8HA80fJZvNr+Lfy5fBVCMqRHmdKlULlCObzy0nP4aeq3GDnsI3z44fvo8f57muho0rQxGjdrglx5ciUnOjiBDRFOFt97IO5tjY9CbVaiBW9vL93V1s++hEOHj+h4yo3Fe1PRxccnvz8WXZLIfuqUJKVLhPut+G/8+FMkBuIA7r8Qe4dJ88ea4NuvxqJo4UIgQ+LQpgjEXiSFOlnSNV/irpLM0CXBtly6FMrjY6VWLl32Fw4LFtRrRYqNl4eH1owfOwpTvv8a30z4Aj16vI3o6BiUqVAdU6bPABIS4enphTdefRljx4zU9q+/1g4f9noPJUsW1/laaTYGAYPAQ4eAfZbgoeuW6ZBBwCBgEDAIGAQMAg8cApaCTPI7yYGbtZ+WOtsSskBdu53RackRHfMUmMe4+HQKZBEd80UHxkUlIuUV01pPhVIKyjVNnXNN0jNfdFJWylkckFr0LTqx0aHesC3UO3WiEklKix+Ka9oZF79gntgDMIFBwCBgEDAIGAQMAncTAaUAEZlsFeFEsSY4JHR3x9UrV3H86DEte3bthsj2rduwZfMWfDdpmv4+R9+BQ/Bm52549Y3OmL9wMTKkS4uaNaqievUqeOapJ/DxsEEYMWQAenTvgo5vd8Krr7dD08eboV7D+mjQuCEKFS3MCdkEIM7x6iohOUQM0YGHeuGul8j7xada/A9+/gEYOHAowq+GQ++PuH5RSt8lJs+QfZf7alxsLISQk9dIQfZjEaeljRUxvmLFamzfvgNRUVGIjoxEZEQELN7LSn3yLZm2zz6DLJkzIRkB4vAvr5O6fPnytfaJf8mjX+eaQNJBXtel02yTfNfm4oULuHjhov7GjT6udOb1m0uhoZg4aSpaPtUCadOmw5EjRxHN9knbUlrLMEJ0z7ZqiTbPP4uX2r2kv3nT+/3uyJEjO9p37ILDR47A5uGO3Pnzon7d2mKOYkWLoFylqkiTJg3Yca0zG4OAQeDhQ4Aj8Qe5U6btBgGDgEHAIGAQMAikjoCi2imM6jW1tM74TzcybJNxFjiAU8oGaaWzQRYHgBChQjFPpxmXVexEJ6HoxY+kdSgGFNFLvojTD9XQaYnQt6LoqISsQ+LX8pNiUMxz9e20c1pIvuhEXOOSFtF29CFxEfElInEtUj8lmU5nALqs5BEoybcYwiwGAYOAQcAgYBB4pBC4w5212QARTsrqSVhnSIIjmpPBly5dwoljx3Ho4EHs2rETmzduwsZ1G7B5w0b8OHOOfppDnuT4oM9AiHz7/RRMnT5DP83RrGkjPPF4U/Tt3QMjhw9Ct7c74uXX2uGFl17AYyQ55NsctTgBW7xUCXjJf/unJDmE6JBXH93hLht3/wECso+JpCAGbtaSuLh4VKxYHm+89jImTp2OX3//A3pfvVkhZx7rEdJjy6bN+P2PZfrJh1+X/I5N3H8vkXTQZiQ/wi6FYf2adVhCG9EtWvwr5i/6BXPmLsS5c+cB+tmwYRMWLPwZx4+fuFY/+xIdFa2PCXl9248z5mDuvEVYQ1/HebzExcXpspCFtkePHcPPv/4GITMO7NuP335fiq+/m4zvJ0/Xde/bsxf6+BN7p7Du6Mgo7N17AD6+vnisWRM0blQfCxb9qkmQm2ERH8/6RaQdlJJlK+KZJ58guZGIDfKaK/ZdyJyEeJKLrE+/YgwsY+6tiYZZDQIPLwK84j+8nTM9MwgYBAwCBgGDwEOJwN91StHAKYzKAEaLxLU4MzmVzgGGVsGpk1A0ErqItpO05N1hkWaIpHBLFaB4q0LRcQDKEXemJRQRO2mdjoNjHIpeaS+h6KWs2EhaizOPoeRrnZAMOpJ8o8sxT7RJtpK4gVi0dbWTuIjTXPtjwjWU9kk/qNarM0/Kieh8nWPBcv6bm06bjUHAIGAQMAgYBAwC1yHAyVc9sZpEbLhBfyuBBIdlWTh/7hzkQ8h7d+/BPsqOrduxbvVarFm5CnPmL8R3E6fi01FjMXDwCHw0dCS6dn8fk6f9hGk/zISfnw+eeuJ/muTo8c7beO+dt/Q3Orq+1QGtn2uD1s+2RpPHmqJytSooU64sgtMEX/8kh5PkYFuua7tRPBQIyBMSp0+dxpFDh+1POyjn3d3fdy8uJhYvPd8GzZo2xpMtn8Wh/Qeg9+ebFaX/sNBQTdCVLl8Nk6b+iJMnT+n9tmzFGpj6wwxcEBKE974XSfCtWrsehw4f1h537NiNrVt3YD2JkkiSD1DA7HkLIK9q23vgICDHE/3HRkdj+YqVeObZF0n8DcBhll+5Zg2q1WmCYR9/jv1sZ4Ls2+KVZXbt3KPbP3/hYrzV5T3dNvnuyEoeZ80efwpvdX0PR+lD+5cyIqxHniz5btIUNG5YH/Xr1ESJooV57P2EE6dO2Z+MErtbkgR4e3try5gYEh3SMZ0yG4PAA4SAaeq/RsD2rz0YBwYBg4BBwCBgEDAI3IcIKLaJwgEEI/ZV/uNJCy//HJDogYbkS5ymkAEBs7Re7ERHiUtIxKWrMYiOi6cJFWIngYR/I/EJFv7pIlU4BSQUnH6cOvGs48yT0HKEYidpKHaGuqQ0I2Ij5USYhLYB7L0Qe9gXydc+mJQyDCC2ohPBDRZnnhJfjrqd8xrOPKc/Z1pcSX2iF52IMy15khaRuBGDgEHAIPAoI2D6bhBIQkDxyij3L05yQ0ISG06CAx6eOHf2HHZs246d23focNXylVi1fAWW/b4UCxf9gq++nojPx4zHe+/3wZhxE/DN95MxYMhwhlMQx4nSQgXyoVGDumjb+mm81fENjBz+Ebq93QFvd2qPVs+05MTwE/qbHOUqlkf5ihWQJWsWZMqSGclfWZVgn6x13gzALI8SAufPX8D4r77VRNo27oeQffYWAFBKIezKZRQqWABvtn9Vl/ho2CeIj40BmIfUFuojIiLwK/fv93v3x5hRn6DPB++hQ/tX0O/Dnkx/jO69+nDfX4zwy5eRPVtWPP9sK1TmvivuXn/lRXRkXe907Yzs2bMCiRZ8vLyQP38+8i68p6aREBs7d+5G954foknjhhj1yXD6fxXdu3TC7B8mkWw5iW9JHOonSBx9dXO3oXrVKnjx5dfwHMnB99/rhlfbvYD+fXthQL8++GXxEkwmUQM3d9ZgXxNJoJw+cwYzZ83R3x/JlD0b0mdIj6eefAKbN2+D4HojLG02Ep1yPhDx8MCVixf0ky02+i9Voij7dZNvptirN1uDgEHgIUTAfhZ7CDtmumQQMAgYBB5iBEzXDAJ/gwAnBSDiNGOcg6LImARcuByNc6GRDonSYXhUPPS4nGZXI+Ow+/glhJLwAMvExidi76kwbDx0HofOXUV0LEkQffdAY664iVymr+W7TwP0Aw5+OHoCIAXAJWVIFVdLxEEcMKpX0emIYyNpEfEgpIHEHVlwxkUv+UrZknTahmmt1wnANa7LOPIhcDL6twAAEABJREFUC9uh/VGnk9yIjeiknIQiVOvVNa4V3Ig9R1qMOVb61GUZgiL5Uk50YD0S15bM02GKjdiJJPOZwuZOJW1KauIg8k45NH4MAg8TAnJ8yOSK9EniNxLJF5F8mQySUNI3EskXceZLmdTE1UbiYiOhs9ythNJ+KXcjW8l3zRP/opPQVZ8yLj5vZiN5IlJO/DlFyrnGnTYSSp6EUkbClCL6G4lr2RvZGP39hYD8vvK7iTj3iWTkBic1r1zBmVOnsXvnLsirfrZu2oLly/7ELz//gp8XLMIvixZh3JffoNPb3TFk+Kdaxk/4nkTH1xg/4VtO1J7mxG851KtTE106t0fbNs/g5RfbYnD/PujZvQueeboFmjzeTH+Po079uiQ4yqN02TLIliM7snDiGPIdjrg4gBO1kFdViYhO5P5C07TmP0JAnv44yX2034CP8NmoL7Buw2a2JOlOj/Gbr3HxCYjlPla/Ti0SDJ3x9Tff4eeffwXcPVMvyONGXts2ZuxXEDJDXsFWoEhhZOX+WqhYETzzVAv04r79Rsd3cOlSKDx9fJAmY2YEBARof1lI3mUiiSf27iQOoAcHOsu+of/IyEgs+3MFAvz98HjTxihZriz9Z0PufHnRsEEdPE2CYsTHn0L6rcsr6CU+IR5Vq1RCs8YNUKBQQWTImBFFS5bAC22f0fnbt+9kqChcWU94eAR+++Mv/K/5YySB8osS2bNlQ4vmTSH9O336DCDnB+akXPft36+f6JLzwpoVq/DdpKnYsnUberzbFYUKFeAt9ANJgKTspkkbBAwCt4mA7TbtjblBwCBgEDAIGAQMAg8MAootdYiyYcuhC1i++wzWHzxPuYANTC/dcRqr9p5GOMkRcMDhwYmGi1djsXTHKZy6GEGVgq+XJ9IH+sKPoU25AfTFjR7767GRYh0yCJEQjDOMikvAij2nMPmvw/h96wks334KizccBtx468F8yCKhYoSSSJrCOSRU2j/1XEXHbMBFB5dFbEVEJaHYikhakwskEpLSVKaMiw3VrJ1b1uFMg+UspsVeRNohOlrBmdYfnaSd6EREL2FKUfQjOvGt40xLKP5F7yznDHVdOoNYSUiRsgxgKaeVpO6eWMrCRQ6OL509BdjU3avIeDYI3BYC94kxj8NQHh8b1q0HeM6UuIi8c10kNDSUk0uXEH41HKCtiHxP4MTxE7hy+TLgnMhlWcmDc6GtlAkPZznR8bx6lpM88g0Cp8j71Y8fPQZ5xYkuyzJRnJCS16vIO9mv+baJhxsL697OCaGTJ07A0ify5KYycbd18xaA5ytnPeFXr2Lb5q24HMY+KIVUF7b5JPt58cJFu1+mIeI0Zrnz584jXp4opG7D2vXYvGGTfpf8BerlffSSPrj/AGJjYiF1X71yFXt278Wlixc5z5wAScurUbSwLRJKe5HawvqOHTl64zYzX37DJNxcf5vU/BndP0dA9gOncP+DO+8ntLgjCX+ZdKXIf5nLfnTwwEGsX7sOG9ZtILnxFxYv+gUL5y3A3Jmz8fW3kzDqiy/Ru+9A9B0wBD/MmI0p02bgi3ETsGPXHmzduhN1a9fAoP698VbH1yFPbbz/Xlf0fr87BvT9AG1at0RtEht1G9RDzTq1NcFRrERxFCtZHLnz5oGnlxfAyWdNcBiS45//7o9wSaUU0qdLi+efa4PHH2uGIjL5nnSTdyvAWPo86u7tjQ5vvobg4DR4vEUrHD98EIrH0HX3hEpxd43HX3+tYF0FkZlkht6HhZTjOTddpswomD8/oqPDER0TA30jjwRdh7QmMZGNE1uRVK4LYhMTG4uVq9egUqWKyJMnN0BiQ/shAejp54vs2bMgR45sOHz0OCIjIlnEfq2Ijo5B7RrV4eHhbq9X6uDxlT1XTtoA4REROtQb9kOugwM+GqafPvFi/08eOYLQsDB4+/ri6NGjOHjoEKLlWklbXcZl8+nocfqVdV26v4/K1evirS7d8d2E8Xjj1ZfIHfG4vkHfXFyYqEHAIPAQImB7CPtkumQQePgRMD00CBgEDAJ/h4AMCJKExpzE3nMyDGkDPFE0e1oUz5kWJXKlRcY0Pjh05ipiSVgACgfOXkaWtH4onisdfDw94GazMbQhJj4B3h68beDE+Ilz4dh38jI2H76IU5ci9NMi2w9fwOVw+2RVXHwi88Ooj8PbzYogY7APth6+hD92n4N9Ml2xKgrrYwRgeLOxCIdjcF2kpGvaNS62IlA2KIqEznxnOcuFtJB8sXfmSRlJi17KSVzkunzJTEXE1qkWXyKSlvLOuKRFRJeyHrBtQqw4bcWfbi/7okMWFKwsS5dm6u6sNthw8eIlnDlzFs42wiwGAYOAHQFOPF2+cgU/zZwD2Lzx7cQp+GPpX/jjz7+wdNly/LHsLy179+1nvg1QioRIKFavXqf/K1a+NTBv9nxsJZkQEx2t8yEL7a6SZJgxa44+/sB65EPLK1augVNWOuLHT5xM8h1GEmD5itWQCaMtGzdh3uy52MsJ4IQEl/9ypW89yczJZcgElM0LK1jm5MnTkIk0OPUS8rxvWRY2b96ORYt+5vxWPDhrhKioaKxavRYRJFzg7kGdu70NjrZLe0VWsZ9CSshHfOUVRELaJMhkl9jR98lTpzBp6g8Az2vhUZG4wj4vX74ah0jsRBGP02fOYfWatRAsQEJC/uN4M7EKYz9PnDyFBQs5Cb5wMX759Tf8suQ3Tnr/xL5z8kwpe5ukf1qkjR74/Y8/cYykjPQBoieukIX2QuqsXL4CM36YidkzZmHe3Hn46ccZkFcmyTvqxcxICgSIG/g7ahEs+RvJ75RMZD9KJl44zd9dyDshNlavXIXVK0RWY+VfyzF31jwt0ydPx7RJ0/ANyY3hn4zCoCEj8F6vvhj68af48uvvMXPOfP0Ng/WbtqBYkUJ4onlT9OjeBfKh8Refb4Pu3Tpj5LCP8PILbdHupedQtUY1VKleDeUqlKeUQ8HChVCoSGHky58PAYGB0JPDQm6IcAIXTpH9lccAzGIQ+BcIKB4n8lRFnw96YPiQ/ihbtjTwT/Yr7pc58+XFNxPG6NaMHf8NhHRwk+NPaxwb2kXKtzuY9Pb2hJyPGXVZE+HpyfM2NXJ/F0cCgtHbWBUSOB6YOXsu0qVNizTBQUjWHxIoPj4+KFm8OHbt2o3wiHD6VhQglsRJSOZMvBza01opGzmfMJRrDgPQAPKNEXld2JXLYdiyZRumTp+hyc7RJDznzF0AWRb/ttR+j0qMJe0qVStWRO1aNdCjWxdsWPMXtmxYiSeeaIbsOXMAxMjV1sQNAgaBRwcB26PTVdNTg4BBwCBgEDAIPKoIcLDBAQZXZEnnj1whAcgREohsGYOQLX0AfLzcIAMOKA5QOGG2Zt9ZhEfFwcfbDfpJjt1ncPFqFLxJiAA2hEbGYMuRCzhy7ioOkQw5cPYqDpBEiSaJkhBv4dDpKzjIdK1iWVE8dwbkzZwGe06F4bU6BQEOjqAXpbfOjXIOCC27xhHYEym2kucsLXGLpEGSiSMu+ZKnQ4dO0tpO2XSgN448HedGfEkZESbtq4uN9uFIWyQhFH1JGaeAec642DrF7ujaNqVe6tOi/UkMkK2TDLHH7e22YyUTm6LFXVkSEuJg46BSUe5KBf/QqSlmEPjPEeAxceLIUWzbth2HDh/Bob07MOHbifo/XqMjo/UkT1xMDOed3BASkhGw5GgH5L3s8s7yXbv2YjlJDJm4WkkyYc/efUh0TsjQNl26tAjJEKL/mx2clP158a+cyKmO2rUptRzCePZs2QCZpCUgcfFx2Lv/IHbv2Yu16zdBzg6/k4jZt38/2BCAJ/8LFy5i0fyF+P7b7zGZhM2M6dOwYtUazCeZMJkTzpMnTsaU76diwpcTEEry083LC40a1SPpEYU1a9dj6sSJmDV7HtZu2IjZnID6YcpUEi3zcUITC+7YsX0HJtKH+Jk1Zx5JisXafiH9b9+5x95HtkPanC9vXpw8eVITMDJJdoaERwSJkGiSH9t37saZc+cQExMHWS6ShP2LBMWuPXuwgeTO2rXrcJmESaFC+VGhbBlUrlhe9zsmNgY8aWHB3Pm6f1PZx6kTp2L65CmYu2ARZsyaix+mTMOk7yfjz6V/QuPCCtzc3JEhfXoUKJAXhTk5Hhp6BTLBFk/s5TeiycO1cv8VnJJJSgLD5g530cETSEZikFDy8EQcJzIPHzqMYzwOdm7bgT//WIa/iKnIcpJ/8hv8MO0H/Dj9R0wikfHNl99w4nYCPvl8LAYP/wRDKC+/1hHDPxmN4SM/x6+cyFzE/Xzhz4t5bKzC1YgIBKUJwiskMOSpjVEjh6H/h+/rbxl80OMdfNT/Q3R+83XUqV0T5SpWgJAbpcqU1q/VyctJYiE30mVIj/Tp00GOIS1yjLmKHDs83h6uH9f05r5DgPuYHEt58ubh/lkA+lVT1P2jdvKc1LRRAzzd8kkMHjoCP//yK4KFxHN1xnOs87wlu7hrlj2ueAqWK4Qc2h6w0d6ud2yVI7xZQJs0wen0tUFIcTDtai4ESWRUFDzd3ZP5t3j/7+nl4WqaepxtEr/fT57O83sFlC9XBom8t5ZztVI25MqVC8+2aYXxX36Nc+cvABy3pHTUrFkjPPm/x1CnTg2ULV8WJUuXQqBgJeeAlMYmbRAwCDwyCNgemZ4+XB01vTEIGAQMAgYBg8DfIJDiEm+JuYL8gVvIwkGGPX3NtnC2dKhWJAuypfNHfAKwbv9ZXCYZUjBrGgT5ecHTww05SJqUypMeVQtn0nZnwyKRM4M/gpnPsQlC0vqhepHMyJbBDwkcbKzYfQq5Q/xJhAQDjnbYm6CkFRQJbVrFJjF9bZUccOCj5ZoaQjLoJPOUVMqEuJa4LsM0mCcBHPk6zo3ki4g9k9dWp/01DcROymvbVPyIqaI+pUgZXVYM6FfaKz60MC3qpHwmRM/AvjryJWGRZJGyEheRMpaSraTujgjxUaJEcYRdvnx3KjBeDQIPAgLOieJUjrdwTtCevxSGWE7SXwoNQ+ZMIciePSv8/Hw4weUHf39/pA0ORkZOwsLi0U0f8TwX7t63DzKxXqNaZTSoXxt5c+fEn8tX2Z/2kPpo6+ntjdokOhrUrQW4ucHbyxt/LF1GsmAVli77E3/+tZIkx0YEO30TSxvPQZu3bIUQCf97rAkaN6iPXDmyYd26jQi/fAVg/X6+PihSpDAqVSiPqpUq4uDhw6hSqQKee/YZVKtaCVUrV0LlSuVRrUplePt447clv0Nes/VYsybIx8m78uXLoUTxosiZIztKFCuGciQfihcvjKCgQIAzbZmzZEZZTjIdOHAYr7Z7Hi2eeAxVKldAPfajcoWy8CChAlnYR//gQLR/vR3y5M6B7ydOQ1RMFNzYxr1795NsWce4hVCef06cOEnXiYgk6Z7IOqKjYzUxkiVTJsiHgXMXKIwceYpAPuQrrkUy8rcoXbIEKnFivCr7VVFro1AAABAASURBVL58WRRnv4sUKoTy5UujIvuRl/3Rvwvb4sO+FihYACVYRkEhJioa3d7uiMKFCkLJbyJOb1U44UfmAHdNriMjPHA9QeHUCXmRUrxw4fx5HDpwCIcP2uXI4SMkL5bh919/S5Jlvy3R+9rUyd9h4ncT8d03EzH68y/w+aejMeqz0Rjx8ef4sN9H+rVTPT7oi9bPt0OvDwdgxCejMHTEp5g1ZwGWc7/+i/vqbyRGokgIKuWGQvnzocMbr6BD+1cxZ8ZUDB/cX8trr7yED3u9hz6930Pv999Fq6db4LEmjVCMv0mJUiVRtEQxFC5aBPkK5EOOXDmRM3cuyO+sJ3o5KcwbDU6C8oaFxxh3GL0/6pC/763+dA+AnWnig4wAz196ov7f7JMsK9/sGDa4n0bis9HjcOrUaR1P2tgUvDx53FMh59A4eVpPKaYcK31E8jwqKXk1l5ucUyRxy2LBzeaG2rWr4QRJ7LMkq8HrT1Jxmw1CfvxOUjQ3j1NvHx9m8RrIrV4tl7ZoxfUbi8fxmbNnMf2Hn9C8+WP6fCyvsHur0+sQ6dzhNTzP61ZJnh/Wrt2AS5cuASq538AAf/gHBcDDk1jQnz5HsO8wi0HAIPBII2B7pHtvOm8QMAgYBAwCBoGHFQHFAYcMSpJEwc3Nhj0nw7Dl8AVsPXQB2w+ex45jF+0fNteDBwUfHw/kyBQEeZrjh+X7sfdEGGqQEMmVIQjOJdDPG/kzpyUh4o2L4TGIT7SQlaSHl6c7bBx8Bft7IUNaf471LCzbcRJrD1zAi3WKAMzTPpTeAhLqejlfgUQ7N4LUF6XklgWcs0qEFIMjrRiyp8nKSlq8SJ6EcBAK8jSFpCVfROJio/0xoeP0l2RPndg585mExJXYSMIhYiPiSOpA7HTEuXGUEb2Ul9CZJaGknUSH5Is/17TYiE5CQcK6hUGk2P4jUQpp0wQjQr+7+R95MIUMAg82AjYbzp45i6OHj5DkiAF4TMC5WBYn7nORACiFbNmyoBwn2E+cPIUt23ZAJpauhIfjSngkTp48je07dgL0BS4Wy504cQJZs2ZG/nx54cGJoTy5cyMs7LL9VU+0kXqiHMddDhINUG6QiZxDR48jnD5r1qyOoDSB+P33ZWKdJEKqxMXF6faEZM0CLz9fyGtXzl24iIsyOURLH19f5MqdCwU5sS/EQXBgoH6S4iTbfpxEg7QtJjYOhYoV5XXAh+RMLnw/eRo2bd6CkGzZkb9wcRQkUZA5c2YULJAXeQsVQ+78BeyvEeLkXrqQzJxjSsCVK1ewY9deLP7td31elleOnDp9Gr+SUEmQyWqlEEFSxt/PHxkzZsSXX3yGbFmykEgJQtNG9dGoYT2kS5cB9evWRu7cORlPhypVKiB/3rwkMMogX7482Lx1K2bNnY8F8+Zg0bwZWLFyNS8O7CQxLsNJsaLFi5GDcMeSJX9g9dr1OMb+5ebEeZ4CBSFkR7bs2aAnyFlEfh9p1/p1G7Bq9TqULlsS+TlRL++ylzz5TcTsb4X9mjVzNn5Z+PNdkcWLfsGX4ybgq/FfY/zYr24oX477UpMVw4eOILkwHIMHDUmSoYOHonefQXj3/Q/x3vt9tPTo1RfPvfwG6jX6n34aY8QnoxmOJtEUi/UbNmPDRsqGjThy5CjSp0+vf6cyZUpiQN9e+OD97vh85FCsXPYrJn/Hej8bgS8+/1h/c0MIjd693sWwj/ppkq3lk83R8qknUJT7l7yCqmDhQpCnNfIS66zZssIu2ZCJRJr8p7bsr2QLwZ3KRRLtvxv3t6Tf729/GGNgEHiIEOBkfk5eNyZ9+xUWk7ScOGU6Sekc1zrIG0Vfnv+7vNURc3iO1Ncgd2/whAh4eGE3r0m//fYHGjSoB32MOUr6+/vp2J49++zXLCFzHdcuneGyEdu2JCC++XYitm/fZT8mhUjx8IQ8sbee5wwxz58/D/z9xC8bJYpbEhuiSZgu+mUJypcri3LlSiFtSAgyuki6DBlQpkwptGnVEp+OHotLoaH2Nrv4l+stODYBrwku6uRRnrPd3Ny0zl331R23fL6HWQwCBoF7h8Cdq8l251wZTwYBg4BBwCBgEDAI3BcIqNRbIa9Oung1BqfDonCWcoZy4Uo04pMGCApzVh3EmLmbsWjjURTMngYtq+ZD3kzBHDs5nCreOpBQOH0pHD9vPIIDp0JRKld6ZAiSQY7UqzhnYWEviZXxi3fi+IVIvFavMNIF+kDPhkH8uAr9UWeDjVspbzcTC3sKUFIn7ItrPGlIxfaAYuNgRlsxLnmWhBQpI3E4SAPtm3ptm9qG9Ul5ydK2EqG9xLUfSYuQZNJp5kn9onKW03oqpIzUzyg7xskbHbFvxEby7SlASb3iC1wkZFr8is/rbEkY0equrVbSPnHXqrivHNt3Hddf475qnmnMvUaAO8SaNWvR5d33cfbsOYBpOBceG56cvE+fJg2E+FjCSahsJB1ioqIgZU6S+EjkRL88ESJPLTiLJSYkIm3atEhDchEy6cJJXC9vL3h7eiHpeKN++YqV+IIT3BO+nQQkxOnvbXR4vR0W/rIYmTNl0k+AdOrwGsDy2jfDqOhoFCpUgBP3ee16ttGdE1huJL0TExO0GSux59GeEVwgMZIxYwgJiwiEhV3B5s3b8OOMWUm2uXPlwNud3iQZmhZDPhqKzz7+GGPGTcCinxdj/ITvMOqTTzCw/0fYsH4jwImv/bt26vxCJFieavE4cubMge8mTUWfvoMgk1n+JGCU4jHGdk39YSZGfjYGCxYugvwH8dI/V+D3pX/il8W/EcMNWPLHUhw5cgQenFSzeXkiOChQk0Rz5i2EvDYshJNhuXLkwIYNm3i9icc73TpDJuWkj9Jv2Nwg/x1du1YNNGlYX5e9HH4FkPOq9F9EespJr+jIKNb7O4Z9/Ck2bN6sv9Py7fdT8PHwT7FuzTrEENtkv7+Uu4H8wT58NOwTjPh09B2Xjz8dg34Dh2Lg4BHYv/8A9uzZm6rs3r0P+5h/4OAhKP7+eUkc5eWEqUiObNnw5huv4LORQzByxEdaRgwdgFUkME4c3oVvJ3yBb78ao6VG9aro92FPyLcL+vV5H716vIMnHm+Cp554HIJrrjy5Ia/1yZ03D3IznpPkWg7+5jlINGXm8SBPaIRwfw3JnEm/ekaeigoIDIDebzmJq4kN+R1SE+6/ELkBzkZtEHikEeAx04LHYY3q1fANSQhfX95fOwFhXkYSBG1aPaVfkfXpqLGYNmkSflu8BDOm/4hPPv8C302cjPe6vYWQjBlgP84s5MyeHcHBafD5mPH4449lWP7Xcpw9fQbgOdLpWoc8Lr1J3pcrUxpPPtGc59mxGMPr1WISv4vmzWf5cej+Xi988vFQyBMgurzcxOrCt7aJjYlF13d6oFbN6qhcoTwQHwd93mDfdMjzh5CxRXjNO3ToEOSpwxiex2/Nu91KrrmXLlzA2nXrtWIfz5f7dm1HNK/jt3q+1wXNxiBgEHigELA9UK01jTUIGAQMAgaBRxoB0/lbQYAjDQ5QrrPk3Pv/KudFi0p5ULNoFlQrkhlVC2fGM9Xy47maBfXTHFKmeuFMeKZ6fi0V8mdCuiAfztXJ7QJFUcSIob+vJ8oxv0HpnMiRIRA2TrRAMZ8iT1oEMb9J2VxowTpD0vjCPsiSwqlLYooJfYsTVeyJNpa4RCQtcRFJK25Ex0CvFvut02yDVsiGcYu+JKrzJEJR1Et5RpOvtBU71zwpL/ZiKKHkS9xyECoSF70OZSNC/xCCROJOER3jzvIaL5d0kp46Z55ERcS/tEPi/CklMHIHEbh69ar+dsMddGlcPeAIZOeE0HPPtkJAgH/y85ebG1YvX46hH3/GyZIYVK9WhXMyCZDXxrkxr1qVSrhy+TInqQ/iuHwfQ9nPJvKdjjycKM7MCWEWAKi/ePEifP194eOcwOLETlWWr127BomXszh+9BgyZEiPYE5odX2rA97o0AVFixRC/kKFoCeQwYV+uCVRkQbpM2aE03dkRCRCQjJAvm+R7PxL+6uhF3H+wkU0blAHDRvUptRBgQL5yLdwokmcifB8FZIpBO4e7nit3Qt44n/NIE+VtGjeFG2eeRK1albDm6+/jCKFCyI+KhKbt2yHvH6rbeunsW/fASxe/DtWrVqrbV975UWUK1saNplMIzn0zFNPoHDhAiQ5jmn85LVIWTlp/lizxihZsihakkBpUL+ufhJl385d6NN/sH7CpjbrzJcnFwqxrZUrVUBmEiFChlQsV1bbuvZTSAL5z+A41rdy9XrWdQSCOZwLcbh4/gJGjR4L+c5Kj+5dMGLIALz4XBv9ehWp62dOGsrTMcnKOcunDC0LA/p+gFk/TsIPk7+54zJt0gRs27ACm9Ysw4e93kXf3j1vKAP69sKwj/qj/Wsvo3mzRnicxIXIE/wNixUtjKwkQrJx/3ZK1uzZIJI5Sxb9BEZG/hZeXl4ITJse6dLbJU3aNNxPfeHr5wtP5un9zzkh+XchsdG/jYQwi0HAIPB3CAhhfpoERGhoGPSx41qAx5Gvvx++/nK01sq3nyIdr7USheJ5tlTJEliz4nfIh87bPP8yWj37Mlq2fg6///Enfv9lAeQ64+HpaffNc+T/eF6X8/S3303Ea290Ro1aDbFn7wHwpE0COZzXswOIi4sX97pM1iyZMZzny9q1qqNj565o9PjTaNq8JfoPHIKv2C65DqQJDoa+HrGUfABdvuMURYKBzafm+lVIWyTGkuRfrjPz8XrpGxSE6/ovuexjrpw50bRJQ4we+yXOnT9PrZtuKyNIvFElkslzfzSJ7Xd7fogmjz8lGnw+6gu0e70j614BDnq0zmzuHwRMSwwCdwoBzlTcKVfGj0HAIGAQMAgYBAwC/zUCcs8vApXiEk9lgK8HRHy93WEXN50O9POEu03ppqcL9EP6YF8E+/vA092NAw+l9a4bpRT8fb2QPb0/0gb4wOYo67Rxk4/KpvFHrpAgiG/ABqgbiYIs5AoksAtJCLG359hVeku9oh8RnZaNQydREV1GdEyInaR1KOWosyjOVQgFSbuK1JuU74hIeaetQ0VcSENIPeJXi4L4kXyxlRAkSKR+iUso4oyLjWta9CLOuiRPC32D9Yi95NvFgrMue9ps/y0C8fEJSI7xv/Voyj/QCJCIkO9dNG3UUL/yhzvHte7wXJqTEy8vPd8GBQrmhZeXN7y9fKAnjAMDSFAUxqx5C5ArVw40a9oYzoniokWL4O2O7aEnhRzejhw5jhw5smryQtdB336BgUifPq2u9+dflqBJw4awYuMw7YeZ+vS0YNFiHD5wEPDwsnthGXml1jtdOwEyEa0U4qKicfTECaRPmxb+QYHQvu3WIKOBJUt+R84c2SFPo3j7+sLTzw9XI6KQISQTrexnF4u+duzYiUWsL21IFvhxwu3SpVA0btyI1SRi0+atus++/v4Q4qdZ00Zo1LA+Vq9Zg737D+ELviDhAAAQAElEQVTVl1+AkBTyn7pBadLYJ83pXdoSmC4tMqRLh+joGIz98hvMnbcQR48dw8QpU7GFRMrylWsw/afZkIk9wfoV+qpauSJCSPD4+PhoUsrN2xd5SIbs2LUHsXFxgM0m3u2SEI9Rnw7XT54Ibh3av6KxkLrtBvattLtGjWro9nYnnD59Tj+Vsv/AAQQHB6NM2TLIkiUTZMIOxNRe4ubbNOxnepJV6e6apEc6EmKBQUEICg66sTjy/fjbeHlz/3QKsVNKgT/g34rF/YpGXHmt476gsROdU24Ohck1CBgE/ikCPN5y5syO2T9N1q+Yk3OePv5c/dEmLwmC0HPHEHb+uCZtQSJDm/AYdffwgHynaeaPk3HiyB4s/W0Bjh/ajS3rl6NGjSqQ80KST9r78Drw4Qfv4eyJg5j07Tjs2b4RlSqV09evD3v3QCjrqEmyX1/PWInNzQ25cuVEz3e74dypQ9i1ZTX27doMac9zrZ/hNSwdT5s819BWyjRsUA/i45WXn4enpweS6nbkX2I/1q1aCjk31atbG6HnjuO5tq2Q1CexcxVeowsVKoBpk77BlO+/RGaS9YiPxgc938Gls8cQxOtosjpcy7K/3jwnjhgykPXY8ZP65s+ajurVq0La62pu4gYBg8DDg4DLneLD0ynTE4OAQeBhRcD0yyBwAwTkaubOPAkZPMqrvObKPj2uYHGiI5mQiLAozICIxJ2SDDOLgxYOEJLpUiQEaqVol0LvTLo588SXU3mjUJy55Cllg3i2nBP/TEtcTGRqTkTyJQ3mSagcocRFJzZJQj+iFx9STuupcy0jelAndilFl6N/beOSKeUlTyQxMQGSL76lfok7TUUn4poWm6S0o14pI3aKdUmexCWUtFOcOsjvIwXEwMgdQsAAeoeAfCjcyKuUPL08oVSK/YITT1myZIZMksv7zVetXoM6NatrOykjhIO8Xz0uNpbEQhDPtTxqebx6enrCL8AfSiZ/3N3x59I/sXbDRpQoWhTenHzSx7QgZ3PXT47I0yO79+6DPMXRqu1LaPG/xzDms48xqO8H+PiTUfhh2jSAfqSIrjcgQKcTOTH029JlOHz4GEqWKM76xcIhnBQ7evAgFiz6FS2aN4MviQ82nJnuOMCJf3lnO+S96Y4+fznhezRqVB/yX7l79x5EpozpkDFLThIPuUmWpMfyFasAEg9KKfryhWJcXkdSo1olkkP50aBeXcirj2BzB1kS1uNcPfW7469GhKMJ/a9YtQZPPN4U7V97FfXr1sHOXbuRmyRT3jx54OXrg0yZMsLX11u/cuzUmXMQLGEl6P9iPnbsuMYL/F2c3iWek5Nz8qRE88eaYOq0H1GnTi0km9jibxJEcqhihXKIio5CZHQ0XnqhLTZs2Ixt27bjwL79uo26LvA3THJ+kwh9St13XaSefyo3ab7JMggYBO4PBOScLkRnACfylVKpNkophWCSrkHBwdDncjknOC0ZF4I3gNeFrFmyoBgJ+GzZsupvNrnzOpB0vXGx9+P1IGNIRlSsUB4FCuTTBLfY+dNHMOtISZoopVivLzKQ8C1UsADy5c2j26Pt4LKwLd4kX8WH1KFUiv4wX8jjIBK3Up/0JThNsH7iTNKAiy+XqGAk+Ej/JS620tY0adPwsmRzsbw+qpRgF6zbK+WlvmBi6et6Lb6+mNEYBAwCDzgCNz8zPOCdM803CBgEDAIGgUcAAV7Jlu5WGPkzcOgc++tOMSsRkAGGq1DlWC3e+Is4kjqQ9K2IGIudhHdSLHkEhO1SStps92yzuXFuzgbRKGWDTjPL5mIjeVQlrUopSL7onSLlwEV8MIDWK5tEk2wloRw6yZe0+JEwSU/f9rQF5bRlKPFrdZBSctjZbRUUIyLySixGr6UlQVH0wUCv2k5ixMNZvyRFlFJQEqFYFLM+QgiYrv43CHBiJtWK3T1gs9k4p++GvgOGoGHDelhBIqR3nwF4991eqFyhAiZN+wkr/loKGiW5CAsNxfzZC9D6mefwx7LlePO1l5Erdy7oCXOxos95s2bhm+8m63eyyzdEIiKi0Pv97pp0kG+OiK71M0+RjMggJezCc0PoxUv4/uvv8cRTbfQrqNq92BaZnK/bEis3N2xevwFd2b63Or6BHDmyQ961vmPbDpw8egifjxmH8mVKQyaRRBYt/h3u7m6QV1P17t0P7Tu9ja++mYQXnnsOr7V/i6TCT/oJi+1bttr7KFi52djOXBjw0XD07NUHq9aswYhPPkfzx1tgzuz55B8SAPoc8tFAbNuxg23IgYGDh+PJJ5ujXLmyCA0LQ5EiBfH8c22wbt16kjiHAV4H3N3coZTCnHkLYSNGMpFHZ/D190ebVi31e+2PHj0uvbQLbSPCI/D1NxNRolwNzPxxEuQpFOmX3cC+VUpBfh9vb2+sWbUa036YgeOnTuPxJ5/FK290Rts2TyN/vrwkThLtBczWIGAQMAjcKwTknCpys/ok3ymp2Uke9UopbrlKWoTR61bRU+QcqxTtGdc2EjpFK1w2Dr1SSp+j9TlWdC4mOio6p2hFio1rnjMuYQqz65JiI+LMkLiIM32zUOxSk5uVMXkGAYPAA42A7YFuvWn8I4eA6bBBwCBgELgOAc4E50hnITwO6DZbYcFmWngobh7NVU/TEJPrey+YuIpYuKYlLrqbi5P8kPBmIl4kX0IR17ikXSURNo6ZeEvCgYhFUUrpgZTEhTSQb4qIvU5LxEWUstsqpVy016JKKfq2tD+7L2WPO0xcfSqlHFp7YLl8l0Qpux+dYym7D5IUklbqWp5iX+CyuPqHlHPJc0aVUjqqlLL7lRRtXcsqpUSbJCpFPTDLP0ZAcI6Ni/3H5U3BRwwBEgl//fEnnnj6WVSpVAHPtmmJU6fO4PSJUziwZyuGDRmA6tUrY/jgfjh98gx4UMO5eHh4IEu2zBjYv7f+wHSOnDnshIPTwKbg4eWFkSMG4+2unfB25zexd+9eTJ76oyYSPiaZ8MX4r/HLr7/jYugVZykdurFd8kqQL0aNxFud2iNd+nTXfPP8cZnky4pV69Cn13soUaIYFIkETw93zF/4M7p1fx9DB/ZDugzp4SRjQjKkQ7cunchXuKF2zeqY+cMk/LJgFr7/ZhwmjB+Fyd99hddffQlx8vop3QJu4hNQv35djPl8BFq0aI7yZUvjsaaNMW7Mp2jWuAG5BjcaKeTOmR1ffPEZXn/lRXTu8Dr27t6LseMn6Cdbvv52Iv76awVALOT7Hbu2bkOtus1w/mIo8a6IyhXLIU3atOCJHdLWgkUKoSXrOnH6VLK2yH8Ey/vvzxzdDXn9mBAmrPz6NSFBkzZDBvdnGxujTs0aWPLzHN3XChXKa8Ll+kJGYxAwCNwrBEw9BgGDgEHAIGAQuBMI2O6EE+PDIGAQMAgYBAwC/xkCFpA3A/Bhc+DlihZGLgcGzKNSSBD1n7XqP6tY6dcpsf9Kcd5NBDoEF6q4hSOtcP0iupuJlEiZLzoR0UtoF8tRmYQiopXwOuEklxAcdlH2trkQCwpyq2LTeqUc+UBSGi6LUioppZTSNqJQSkkApX1BL0opKJVcJEOpazqbS1zn2ZBUBlwU/SmlIItSSudJXEQpe1qp5CGLQLn4UUqJ+d+VZT5/U1oqpRi/RrhQZdZ/gwAJt3ScTK1TqxbnUhP/jSdT9lFBgBPmNWpWxab1K9GkWWO8+OLzaNS4Pjq/3RF55WkBwYH7VeYsWdDy6RZIeoc5dX6+vihbphTy5s0DKEBP4jNIWkkgNG7UAIGBgZAJ+9y5c+H19q9iCEmVzz4dgc8++xgjRw7FgAEfosUTj8HVd2BQICqSkMmaLavdL+tL8st4UFAQOnV8HSVKFodSrJw6RtCzZ3dMnz4Rz7/YFjwIkoqUK1dGP/3h4emBOnVrI1/+vPp1J2BRpfQGRYsVQRl5aoSYJBWkX3mdSflyZVGzVg1dX+bMmfTTJNomPh7PtHraXhf9VKhYAT1JygwfPlj3bciQgRg4sC/efbcrihUvhiJFC2PXrg3o2PENPPnU/1CgQH57We2MG/pr0LA+qlapDCGYqIHg6uXthQ8+7An5domktf5GG55ePUk8FSyUj32tifwF8sLbx1v7uVERozcIGAQMAgYBg4BBwCBgEHhwEOAQ/MFpLGDaahAwCBgEDAIPHAKcJ5EJk7sqAkoc8FhZ4OtWQFy8Qp/ZwOELzHjkrnQCOPvtCKCB55YTTdxCKXuGUkrHlboWgotSitsbranliU5EykgoInERZ1xCp4j+b8QS29RthChJPcdF6yBQXDTJorfkgyUstiOZLdNU/+NVfOmepfAj+r9zmrItnK/7uyIm/xYRsMA/TRzeYgFjZhCQ703IpH8CSTMJnWkJLcfRKaGkU6Il39iQPIdZymxNQki+ZEgo/lOTlL7FVnQSStmUInrJF3HNc/Xtqhd7LVRKmZTtljynjibJVp1HbHQ5hpJ2NRC96EQk7toG17jkiY1T50y7+pK46EUk7hRnOQmdupuFYicifm7Ur5uVN3l3CQHj1iBgEDAIGAQMAgYBg8C/R+CRmxb695AZDwYBg4BBwCCgEZCZXBGdsP+jpJ474KSOzB3oOQTOe8hbhHadVNhxQmEnRcKp64AfN6hk8s1KoOcc4MN5KlX5gHrJ/3oFMH29woYjwE763XpcISZOQdcZC+ROD/RvYcHNZmHQImX/LohLOx3NfbCC22itvM5HBPKoQbJyiikRBjdYlbLnK6VcyBG4xF319jgci1KStieUUoyIMIAzlLiIpFOKy+0IyYskQsART0qzOHcvbq+tkueUa1pHjOUdsWSB5SAgpJxkSCjijMursiR+Q7mBX6cPXd7FxqlPWa/Tv/RJ27iU0T4cBjqPcbFjoFdBUEfMxiBgEDAIGAQMAgYBg4BBwCBgEDAIGAQeHgRMT+44Ai4zDnfct3FoEDAIGAQMAg8qAjK76irshxAMcYmASHyCQmysQhyJh2MXgC3HgZ93ktTYqDBiCTBgEfDcJIXnJlK+V/j4d2D8MgvjKBJuPgRcuGLh7OVrEhENFM0I1MxnoUbe5CK6IhktZA8EokhyXLpq4SeSKOOWWhj9B/DSJKDfQoXuc4EdJES20H/vxkCDQkBf6pewbdfNw7NPD//KHzEZGSE9pk6D8Xeh2IqInYSpi1IKSilHpnLE7aFSEkLrlFJwXZRKnnZzpJ1amfR3xqWcTpMgEF1SnGnJc0qSngodd4a00+kUIbPZtmu0gthoHTcSF2FU20g8SahMirv4pNpuy4hrO5m062krcZFk5UVBcS3jGmeWvTwjApOUtYRZZNqsBgGDgEHgYUbA9M0gYBAwCBgEDAIGAYOAQcAg8G8RMATIv0XQlDcIGAQMAncfgbtTg55hpWuXUN7mEROvNLkRSUJCJCIKOHdZYekeYDpJh1mbFb5ZBXSbbeGVqcBnvwHTVgMHTgOXIyyUyCwkhkK7isDAxywM+h/QskGc4AAAEABJREFUu6mFUS8qCrQMbwu8WR/o1CC5tK0G1C0G1CueXETXpoq9TEeWk7JDW4svhQH0P+wJoH5BEijpFFYesDCV7XtjCnD4koV86S0s3a1wmn2A9JVdfphXefpDBHqmXHrKTnNNSus49a4hk9evrgYSFwsJUxNnnoQpReztOqUUm2EX0ShljyuloNssSiMGAYOAQeBBQYDnrttq6u3a35bzf2B8K+25FZt/ULUpYhAwCBgEDAIGAYPADREwGQYBg8AdRsAQIHcYUOPOIGAQMAjcdwgotshVeOYXoiMqBhC5EgmEXQVCKasPKkxZSwJhg6Wf2hi8WKHjTwof/2phzT6F0CuAN8sXCQGeLqXwXj1gcEuFoc8CnRsDr9UFGpUCahWxUKeohdwZgBxpLORKxzbEWUCchA6JZ5hSEqi7maS0p89MQRaysY5qhSy8XNvC62zDMBIs7ze1v5br6EWF2szLnJb1c2UND/Xq/KntnZSUxFxDiacQmeBKEtonZTPCFVpk45LHqF3vjDhDsRORtIhrPLW06PhbiZmIPWm2BgGDgEEAwP0LQnxCAiIjIjV5mxqBKzoRZw8SExMRFxsLCZF0vr3+pCf5upzYsHACy0ldSRKfgPj4eLsf5ssqZeLi4pAgF3cp5xTJvIFImZiYGN3+G5jovLjYOF2f1OkqCey/bqdrYWe9Nt4ouIqrjYkbBAwCBgGDgEHAIGAQMAgYBO4xArw7vcc1muoMAgaB20fAlDAI3CoCMpfiFJ7h5bVVkSQ6wqNIcoQDF8KUlk1HgB/WAzM3A1/8JU9zKAwj2bF+v4VI2gV62l8f1aQoiY2aFno9BvR6ykLnJkDzchaqFbZQnVIkmwVPd7IKQmzEs5EirgRGInXMhgijd2UV3yJSr9TvkHQ+QAZ/oGI2oD7JGoj+rjTg/nJqEWyBA/obIIqNE2GAlKHoUhOxc4rkO+MMZXJL+0kZFzsK1TqbUYitFiYkRLJMUboI9CcvrESxgVkMAgYBg8D9jYCbDadPn8Gs2fMQGRmFQ4eO4PDhozh27BjlOI4eO47DjJ89d06TByAZcPHiJWzatAXnzp9H+NWruHTpEiLCw5MRGWJ3+swZHDt+HDHRMbh6NRx79+7Hli1bsXX7DmzbtgNbt23Dlq3bcP78BYi9EBkXLl7EFuafPHUKkRERCBXfDBPlJsAVSTkXsy2iOnnqNFavXUfSRC6egBAoiSRbJM8p4nflmjXYyHZv2rwFIhsYbti4Gdu370ZYWBggPmFfoqOicJFtOX/2HM6dPYvz7P9Z4iS+7RZmaxAwCBgEDAK3hIAxMggYBAwCBoE7igCnx+6oP+PMIGAQMAgYBO4VAooVOYVnc4uz3vIdjcsRwKWrwNmLwLajwJzNwE+bgO/XAgMWWxj5G7DuABBDUkSe5qibH3ijqoW3GwBdmgMdmwItKpA4yAdUzm+hdC4gkGSCfnpDSASZK3GKk+BgU+6blZjExCl8u0rh2AWFpyoTmHjKfdPAe9EQ/jDyvQliAS2yYb1JE1WSvpHQTheS8FaFvrRvhlLWNS5pEZ3Fjc6jX0a55SoREUbNeosIWPo/s2/R+IE2M403CNx3CPAcFkdyIjQ0FHv370c4SYxX3+yMKdN/xA8/zmY4A1Om/YTZM+dp8iImNhZgmdCwMKxbvwkHDhzC4t/+wNjxX2PBz4shRIQ8TQFZaHfmzDnMnDkXm0l0HDh8GPMX/owVq1bj+NFjOHr0KOUYjp88hausV/xK2dOnz2Lnzj3YvHkbFv28BOMnfI+fF/+Os2fPJp0rEkmGXL1yBadJkgipsvTPFVi1ah2OHD2Ovfv2YxNJlSskZsSnNEWe7jh48Cg++3wsfe/G1q07tGzZsh3L/lqBOfMXkKg5ASFhxD6R5IkQP3PnLsTEKdM1Bl269cTTbV7EBZI/YmPEIGAQMAgYBAwCBgGDgEHAIPBfIMAps/+iWlPnbSJgzA0CBgGDAKAALXLmZlzIDiE6LlxROHEe2HEMWLhN4YeNCtMonyxTWLYHiI9WCPYAKuVQeJHExpu1gQ6NgNcpT1UCypPoEAkJJEngfJIjAUCiizCLqQdjtQFrDgFbTgKt2d+0/mz2g9R+NvffrDJpBf30B4HQO4x4UwAn1iALo0gpok8SyZSEhLcirrYSv5GIL0eebgvTEjKAhLrNjnwTGAQMAgaB/xoBOS+JpGwHdTLRv5Fkg4Tbd+xE7pw50LRxQ9SoURXVqlTUUr16FZQvXxZ+fn70YMHGcucuXMCmLdvg6emJRo3q4woJiT+WLUdY2GXo82BCAspWLI8q9BEdGYloEi0hGTKgTJnSqFypIipWKK/DWjWqIXfunLxOJ0JekSUkzJUrVyGEjJePF2qzHRdY15r1G3CZdQhJIUTJiROn8Msvv2Hsl1/jj6XLkCljBqxevRbr1m3EpUuhUPwD2wnH4uHhhnx586Bo0cIoUqSQlqKFC6NwwfwICckINzc3hyVYhQ25c+XE0y1b4I3XXkbzx5qwH5XQt3cPpE+XFq5+YRaDgEHg7xAw+QaB/w4BeVLQ5fz+3zUklZrlGuXGMY6EqWQblUHAIGAQuBECPHPcKMvoDQIGAYOAQeA/Q0CxZqfImZrx85cVRI6eIdlxFPhlu8LUDQoztgDfrlb4dSfLyDcxfC2UzQa0LmvhFZIdz9e18ASJjooFLJTOA2STb2Ek0jae4kp0PAwkAXGKjVWYvNFCs2JAoZzslPSRXX20VvmBnT0mKM4oJJ6KyCBCCw1TyaYW1xWFc5ECrnFJu4rkOdMSd5Vr+kTNuLnmSdyIQcAgYBD4DxDg+TA6KhpRkVHJX1HlaEpAQAAyh4QgTZo0mghITLRw+vRp2F+BdQJHjx5n/ATOnT2HhHhebHkpSkxMxLlz50g6ZESNalVRtnwFFC9aBGGXL0OeDkmId1ysaF+xYgXUqlsbgf5+ENJk/JffkLT4BqvWrsPQEZ9i7vyFiIiIBNhOi37DwsJw/vx5lChWBHVqVidhUgqlShTDqVOncOHCRcji4emBwsWLonnzZqy/MiqUL4dq1SqjSeMGeO6l51Cvdk3IN0FioqIgfsElEZZ+DdeZM2cgT6acPntWP1Vy/vxFxBAfQMF18fT2hpe3l+774iV/oCTrq8X2ePj4uJqZuEHAIGAQMAjcDAGe28kw44ZiUzcr/e/ySH4cPHAQe3buAqQdcCwSF1LkOuFAlWWS2TqK3PGAbbjCa+a+3Xtxkdc2+z993fFajEODgEHgP0Xg7lXOs9Xdc248GwQMAgYBg8AtIiD3sSJyVnYD5LsdZ8IURHYdBrZRvltjYc42Cz9sBuZtVXC3LOQOBEplAVqUAl6orvB0TeDxCkCl/BZK5gL8vVl/PCWBInPiIpyIYerhXN2BJTssZPRWqFOYHZW+P5w9vWGvuFvAsmRnuqHJTTKkXCrCAQeQQp8imTIbsoiNzpCEiCgcon2KjsL2yhu7LP5kTKWyyoEhkkrWdaob2aXUu6YlLnKds1tUSFmRlOaiu5mktJe02Et4MxEMb5Zv8gwCBoF/i4A82bFo8a+4cNFOICT5I+EQkjULihUrjDTBQfppjpiYWJw4dQZXIyIQGxsLHx8v+Pp649TpMyQVYkEWhYRFBLxJEOTKlQO+QghYCTrtw7h878OyEhEdHY3Dh45g86ZtOHroMMLCLuunLSpWKIty5cqiYb06KF26FLJnzYrAgADwZM/VYrlYKKWQOXMm+LFN8mSG5CckWPZvkDBP2h9OomT16jVY9tdKZEiXDqtXr8NX33yPTevWY8lvf2DJH38iPDwCdAZZbFDshw/Spk2LdOnSID3DtGmDERwcDA8vT7ABFMfKOsKvXMGaNesw6ovxxMUdHu7uEBx379ipySSHpQluBQFjYxAwCDyaCPBcGkmCe+/uPdi+ZRu2b7XLjq3bsYvn0n3UXyQJrcmRu4GQmwfad+yKwiXK8xTvuDFnm+J4bduyaXNSe6Rd0p79e/dDvvUUHxcH0A53cyHRsnvPPhQsVhbySkn5x4K7WZ3xbRAwCDxcCNgeru6Y3hgEDAIGgQcEAZm/FJGzsBsgr7E6eQnYf1Jh6wFO4m9XmL0VWHUImLRRYd0RhVIhQPHMCs1LKDxf1ULzKkDT8pYmO4rmsJDe+Qqrh4jsuK1fk1geOKbwFfFqR3yC/Fjacd/O2COxWsIgiPxdb50DFAlF/s4+1XzZgW8i2i/zJUwSOqIKIozaQ/5wTCcyYf+5mEZKEWORlHpJp9SnTIuNiKte4iKiF5G4iMT/iUhZkZRlRXczSc0+kQVc9Uwm4SFxBUXCiKNSSRgxCBgE7hICZ86dw4YNmyETUfrc6qyH57MLp09j27ad2MOJmNMkOXx8vOHv74ujR09AXkUVExOnyRAhNCwSG1I0Lj4e/gH+SE/iwcPTQ1SanPBwt8HPzxduNjedvnL1Cn6YMRMrVq3B2bPnodzc0IDEx8VLl/D9xKkkJLxRvHhRwCbnCZ4JeOJMRCLSp08Hf3ndVqIFed1VXHwc/frB08Nel0xeycTRth270KhBXZQpUxKZMmXE4cNHsODnJXRnQ3nq5OkWsiq6fdL26JgYkjjXSywnuyzH9UbCM8Rh0c+LsfDnX9Ggbi0UyJcP4SSEjh8/gZ9mzcWyP1fo13Vpx2ZjEDAIGAQMAqkjoBTOnTuP/oOGoUTZyihRxi7Fy1RC0ZIV0LL1C5gy9UdNRIDXh9Sd/DttbGyM3YGc49keSURGRqF0+WpJ7ZF2SXvavdYRX379HTaSHIngOR8Oeylzx0XJNY8XPTpm1H6pkgjTZn14EDA9MQjcLQTsd853y7vxaxAwCBgEDAKA3JjJ2VaEZEdsgv3JjmMXgK0kODbsUZixASQ8FBbvAdZyEt/X3UKZLECJzMArnMxvWclC/bLQZEfBrBaypQMQR3lUyQ52PbX1/FWgR3UgD7GDYJOa0UOusyADg8TreykDEqfIgEYsJBQRvaRdQ4m7ijNfdBL/RyIHQwpR0l5wUh8c1VBue5UD63YL/ZMyt1vHP7GXdom4lnVN2+OWAzNXKxM3CBgE7iACPM9VKl8OHdq/iixZMkMpdc054/JUiBAkQiAULlwI6Uhq5MiWDdmyZUXlyhUgr4qK4kRQhgzp4e7urstmY36L5s2QIQMv4PRhkUAIDQ2Du80dAYEBUG42EiQBKFm2HKpXrQR52uLy1avw4ARX9mzZceniRUyfMRuRkZHw8fYBHE3y8HBHiWJF9SusMmbMCFkiOVF16tRZpA0OhpPQkP+UTZ8uLR5v1hhF2OaNGzfhwKFDyJEzB2pVr4ZGTRqhAPWeXp48F9vPy76+vsjK/seTvIlkveIjioSIG0mVdGnTkozxBZSC6E+cPIXY2HjUrV0L2bNnJyZpUa1qZTRt/hhatmiOz0aP1QSP2MMsBgGDgEHAIHBDBIRUlnN7+XJlsHDuT/jj1wX47Zd5+HXRHHTs8Abe6r4XcbYAABAASURBVPYu3uzcDcePHgPZ69T98Nx8S+dbsRNCXUTi9GaTOEMo2djFkYWXX3oef/7+s27P4oWz0e7F57CShH2vPgOxaxcHsjKusBdJvhUH4lfC5Dmpp8RO7EUk7rBKalJq98JiJ+KwNYFBwCBgEHBFwOaaMHGDgEHAIHB/IfAAt0bOriIkPCKigcNngd0nFNaR7Fi8BZi61sLSvcDSAwobTwIFMlionMNC4yIWnipnoX4ZQL7ZkS+LhbyZgSAfYiGvc5J5bRH73ASVZk1CgLhULmShUkGCI1glZTxiEQ48LP2EAPudbBBAXCwK1detopcRhYSumZIWEV0yX1RI2lWouuEqds5MZ9wZOvVJoTTEVZIyGHHqGf3Xq/i6kRPJE0mZLzoRV70z7Qxd81zjki/i1N0oLvnOPNfwWlw5f18xNWIQMAjceQQSE5EhYwZky54Nnl5eyf3znJgnd27UqlENuXPmxMGDR5A1axYI0SEihMnly1eQOXNmFCxQAF4+cgGHJlLKliuLgDRpYCUkYM+evThy5Bhy5cxufyWWsxYrgSRHNA4dOgJfb2/9DZCFixbrpzU+HjIAXh5ekPShA4d0CU9PTxQsWABFSIIEpAlGXHQ09u0/QN9HSERkQXBwkCY0vOgrd768yE85wkmz02fPo3HDBqhbqwZCQjJoX5DzMvsnCaUUcrD/jRvWw4EDh7F67UbExMRh5849yJIpI6pWKg+ZpDt/+gzcSNIUyJ8Xj5FccXe3Qb4Zsn37DixZ8jtiwiMgpEnmzCFQ4tiIQcAgYBAwCNwcAZ4s5VScIX161CGpXLt+XdRtUA/1GzdE29Yt0a1rZ6xYsQq//rYUPAFf88XztqTlbl++kSGiM3mO1mHKDQn62JhYnDpxUktcbCwt3KGUYpj6WiB/PtSow2sH29OAxHmrZ57Em6+3w++/L8XmzVsh1z86uFZY6mY9YaFhOEWiPIGEOi+YSGYDl8XGATTLREdF4fix4zhz6jRieF2TfrlYXR8lUSJPoEg9Qspfb2A0BgGDwKOOAM8ujzoEpv8GAYOAQeBfIiD3iHI2FXEH5AmPfacUdh1XWL0TmLsBmL6RZMd+YPlhS/9/fvVcClUoLUpZaFneQp3iQNl80GRHWn+2R55eSGToFLmTZdKsf4OAE6+/MXtoszla4srucQey4jjpRSaIk2mQx2H0a1ioT6ROpxlaFImDwImdFuoSnWUZFxspI7pElteT72T2JNTCHd+igDp5VZOOM60kTZHQqXO1kbJJ9rRjq+1tZyTZKgeYU5wZzvS/CcWXlHeGEneK6EScaWdInUQhG6dQJ2lJSnhDETsRMRS5Udw1jzbOJKPQvvmz3mRgCrM8HAiYXvz3CMgJiUQIZ/mTt4V6Tz8/uLnxPMcJl3kLFqEASYXQy5exbdsOrFu3HiVKFsOBQ0dw8NBhxOsJJbuLyPBw7Nq2HQt+Xow//lyBvHlzo3iJYvCWJzpoEh0VjS0bNuH02dM4ePgIwq6EwdPdk/meKFOqJIoWLYwiRQoijgTK6bPnEB/HczTPBxbbeSUsDNu3bMV8tmfNug0oVqwIChUqCA9PxxMdbDdop5SiPy9cZVuEzDh//jwOHTmCP377A0sp7BhAG/mvYjdOQsVwcsyDJFBrTnIVLJgPOUmKFCLhkp3hgQMHsXffPkiZwOBg+Pr5su1nceXKFfj7++O7ydMx/adZmDFjDtq/9jLnvDx4AjM3NDCLQcAg8GghwGuFnCf1ufU2ei4T+QkJ8YCQBiJxcfAJDETBfBw00o+caxnYV563Y2NisHnjJsyePRdffzcJ33w/GbPnzMP+vfv0qxFd6xffWzdt1q8oHPvlN/hi/Nf44cdZ2L97m/3JQbvX67YJCRwzyGsIHO3x4vVQnip8umULbNuxExcvXsS1ehR28Jq3aP5CfDdpGsaxnpmz5uAXXgPlenfNDknL2TNnsZD209iWL8ZNwPivv8PMWfNwmNcbKPt4IclYRxR4ccHunbsxnWUW/PwLYohDar61udkYBAwCjywCtke256bjDwQCppEGgfsSAd5nybytFt6Hyfc79pxU2H4E+Hmdwux1FqauB/4g4bHvEpApGGheBGhS2MIz5YD6JYDyjOfPZiFHBkATHhZ7KveTIhJn0qwGgX+EAImOWN9MuJKxGkKDy+BiGoqEwaVxkeGlpLAMLjGtdUGlkvJEpyWotM7XcSkTVAbn/TLjkuc5ygXKRYdI3CnUeVE8Q5lHnRfF0ynUO9PahmlPCuNhtAfkwAKcAWQRlYjEXUV0tyo3Kyd5io64SlTLzeLOPAlTihROqXNNS76Iqy5lXPJFXPVOQJw6yTdiEDAI/HcIcCLr+OEj+O2PpQgI8EP6tGmglIXTp8+iSpUKyJ07F6pXroTiRQvh8OGjiCKpQQPd3ujoGJw9dx7yWqs6NauhUsXy+gkNOQ2JwdWrVxEaFoYaVavglZefR44cOVhUcTInDlu37sDceYuwdfsuKJIZPiQlEkiESDkR+SaHvDfex8dHf+OjXNky8A8ISE44sJyHpydksqpxg7pIIOktr62Kj43n/Fo8/ElgaF8kPXZs34HpP83Gnn0HUL1qRU2++Pn6Cl2O+YsWY87chThz5hwyZOCNjPxrB8kVdxImtWpUQ548edhuNzR/vBkyZUyPVk+3gLTHJqSRVGDEIGAQMAjcAIGHSs2Tu5ynD3LyfhsJ6qjIKPDkiFtdbLzeuLm5Qyb4tXgwzgHor0JW00nZ0iXt53jWE09yZCtJ+A/6DsS3E6chKCCQVSkM//hzfPzJaOzffxBWomOQ6eGBjRs3Y+BHw9H2+Zch36ESUnvZX8sxZPin+jpE97e8iteE+ATI9cfNXdrIom5u2MI+Dxn2KXr16Q95OiM4OBjTfpyJxk2fwORpP0LKsJE0tq9yfRz/1bdo9r+n8euvvyEoKBDy+kX5JtbFS6F2o5Rb1ndgz16MGfcVPv1sNPLkygkP9g+83qU0NWmDgEHg0UbA9mh33/TeIGAQMAjcAgKKNnK2FOE93aVwYOdxhR3HgFkrgYmrLExbD+w+q3A4DMgQCLQpAzxW1EKzEkD1wkCRXECuTNDf7vDx5G1iAn06yQ4mmTKrQeCOIMAxEBL90iIqXV5EBOdGlEOi0+SBFupj0uZFdLp8WmIlnT4/4iixGQpAJC5jQTglPqQQRHQ6XVYkpAmlRF6TtIyLpGGYJOGID468JmkiEBdMCXKIjocjjunYoHAk+kfDw90NUHKQ8YBTDgFDEWfaGYouScDFYZeazllGQp1Pc+cqxbSOEa46KnliKyIKCUVEr8VpeLNQGzo2DjtHAPF5ncC+SD1iBzAtEYeI3llGYyTjXXPiIEhmNQjcewQ4qSJEQOUKFdC4QX0817YVSpUsgQb1aqFJw/ooXaY0MmXJTHKjAsqVK6WfttATMSwXEOCPsmVLo3atGihcpDB8/fx4MF/rguSXL1cWJUoUR6HChVCtSiVUrlQepUsVRylK+fJlUKlCWVSpXAG5cuaAh2OSRymFYE4UVShfFrVr10T+Avnh4+sDeeLjmndHjO0IDApCmdKlUL9OLdSpXQM1a1ZFzRrVUb58OYCkiky6pU2TBuXLlmKf6qEI2yqv2sqUKYT9rI3KFcuheLHCqFevNtuRk/XYz0dKKWTJmpX9LqPb2KxxA9RlHSWIj82N53jW7WiFCQwCBgGDwMOPAM95Qo6P+GQUho/8HGvXccBIUuNWOm7j+fRSaBj+JCnx1x/LsOz3pVi88Bf8MGUaZs/7FV+O+xxyvZBztvgLDQ3VZEeuHDkxYugAyKup2r3YFv379sKBgwcxZ/5CnD9/DuC5+NzJU5g5Zz5mzJqD5Ut/0YR7q5YttG1uEghr120Ul6mKPBkIeHAV8UTU1XAS9Nswc/ZclC5ZAhkzpAfY9kP7D+CbiVNw7sJ5jBv9KV5/5UW88FwrfD5yGN7r3hWvvt6BpP5C3R6xF6LoW9r36TdQ923Y4P76+yJvd2yPHu92QeFCBQBLBs9IWtxJCB1mPeMnfIely5Zj/BefoVLFCnCXa2OSlYkYBAwCBgE7AjZ7cL9uTbsMAgYBg8B/gIBinXJ2FCHhcTnSTnhsPwrMXAF8uxz4cqWFfecVzkQq/K+EwgvlgTqFgFYVLFQtpFAgu4WcIUC6AMDDRn9yvyZiMS7CwKwGgTuNgOxaMnElN/7eXj6QD9j6+/rCj5Ns/r5+CGDo5+cPeTWJv38AAgICEegfiIBAisQldEhgYBACOEkWwFAmywKDghEYGEDxRECgiwR40Q8lUMSuD2S+qwTQJikdQBuKP3WiD/D3gZ+/Jzw83XGLY0IkX1TypE6lptMZ3Eieq1Cl19R0OsOxceY7kjcNnLYSOg0lLuJMu4aiFxGdhCISv5nQhgPrm1mYPIOAQeAuIMDjLm26tChSvCgyZ82CkMyZNOGRLXt2nsv8oUmHxET97RD5KLkmKRzNkHhgYCDkexygHy2OPIl7+/jAnySJnmCij4CAAGQn0ZGPhEaBggUgkp/xPPnyQtpgs/E84Cjv7u7Oc3MgCRdvexvEvyPvuoB5Sind3jRp0/C8Lm3ySjJzJyGdJVtWFCMRI/2Ttol4enmR4MiCIsWKojAlW/Zs7AvL0V9SYbbbzWZDcJpgLXI90pi42iQZm4hBICUCJm0QeHgQSOD58MzZsxg3fgImT5mOXXv2QM6lt9JDxfP7mrUb0L5TVzz30mt49oVX0KhZC7Rq+yI6vfkiqlauBB/eo4u/hPh4HDx0BD/NnAUhzgsWLYmg9OmRJmMWkugV8dSTT2DmrLm4cOEiYHPDzl278dfylejT+30IgZ8+Y0YEBQchC69jr7z0PGKio27YxK1bt2H2T9Pw49TpmErCYuyXX+PzMePxfs/uqFatMsl3XwihsXvPXowaPRZvd3xDE+7pQzIgHduUPXcudHu7I/LkyY3OXXvQ1g2yyCu5er7/IV575WW0frolxC5DSEZ9nc3B66CfP6+v8rShGFOElD908BC+nzQVP82YjbGjP0bFCuXYPfoz1xsiZFaDgEEgJQK2lAqTNggYBAwCjyQCir2WM6I7EB4N/cHyTYftT3h8uRQYt9zCzjMKJyMUniwNdKkJ1M5voXVFC3myUbJaSB9oIW0A4OXGaWghO0QYpWezGgRuD4F/as392MaBjUyEyUSVt48vPCne3j7w4sSap8QpXhTJE/EkQSJEiY8vbbx94UXxpnjRXpdjWU8vyfPhhJ4nPD3d4eXl5hBn3Ma0iF3v6ZLv6WnXeXu7c2JO7D3gybiXl8RZxpviZYO7u+J4SeHmizPfNXTGnSVTS9+KTsqLnVMknZpIvugldIqkU4rkOXWucadOwpT6lGmxcRXXfHNycUXGxA0C9xQBmVxJSICe2OcEV1IoemdDJC7iTDtD0Yk4066h6EWcOom7+neNS57TzhmKTsSZ/rtQbF3F1V7qcvbRqRdbp96Hz2w+AAAQAElEQVSZJzpnvmsoeqe46k3cIGAQMAg8Igi42WzISqK8U8f2aNP6GZQtVeaWe56YaKFqlYqYOX0iliyag18XzcXihbMxcsQQ/PbHn/jhp9nYu3MHeAONmNhYbNm2U/vetGUrfpgyWZMTUydOxKzZ87Br1x5s2LgJ0TGxtHHDxYuhWL1mLSpXrsD7ek/7tUzO1/HxyJQ9G/Lkzk271Nc5839Gi6fb4plnXyIp0w7duvfEC8+3QfcunZCNfRVChjf0CA+P1A4KkrT38PIC5Nshcv1gHRmyZEf+fPlw8uRxID5O250+c0aHObJlhX+atNTH29slZUSkfdrCvjl05Jh+HeOIkWPw/ddjUYWEkH79Vgo7u7XZGgQeAARME+86Ara7XoOpwCBgEDAI3I8IyDyinAHd2DgPhTNhCusOArNXA6OXAGP+tLDlBHAhRuF/pRR61gcaFbHwfGULuTJDS5oAII0/y3MORL8U22JchIFZDQL/BQIK/ONgSwYAHh5CVnhxYEPhwEMGHx6eXhDxZOju4QERDx9PrD3qjjNXPeDm4Q53d3f931NCpNjFBht9KmX3rWwMlQ1Ki8RFnGkJXdMKUlbEaW9zU3CnP3d3G9zc3aBDNxvtFJRSAG4m4CL5DLSdhCKic0pq6VvRSXmxc4qkUxPJF72ETpF0SpE8p8417tRJmFLvmnaNi62Iq07iRgwCBgGDwMOFgOmNQcAgYBB4mBAIyZgBfXq9i0+Gf4RSpYpBEwS30EGLE/mBAf4oKE//FSqov8NUq2Z1vPLSc/h85FD0HzgYU6b9CCgPcgjx2L5jO+PuWLzkD/T4oC969u6npe/AIZg1Zx5ksRyvkIqJiZEksmTKlPQqRa3QG4Vs2bPqWGqbzh1ew9kTB3Dq6D4sXbJAm0RF0Z/ivTzHEKKwSLSEh4dLlPf57jpMvklEliyZtOrEcZIgvP8XkkYUadKlZSD/RcjgBmuOHNkx/YefMHb8BEREXMFVki3yCq0bmBu1QcAgYBDQCNj01mwMAgYBg8DDjoDMHcoZz40dJeEhr7VatV9h7jqFT+Za+ORXC2sOKVyJA+S7HX2b2J/0aF3BQv4sFrJkAIJJdgT7sbzck4kI2SFC1R1ejTuDwD9GQCkFNzc3uHEQImSGhDY3d+pE3GAj+aCUsofuChsPAVPWKuw5y4OEadxsuaX9nX5u6ONGeaIXuWHBRzDD4PEI/uimywYBg4BBwCBgEDAIPEQIyH13ugzpkTFTCJJef3iL/bNIgoho0oRxTy8vBAQFoWaNatrDxk1bEBtxmff4bsiYMQR1alfD8MH9sHHNMmxYvVTLmuVLsHndcpIWB1G0SGGWi4fN3cYQiIiKRKI8XaFT1zbRUdHXEiliaVh/xqw5kZkkSamSJfH5pyPQu89H2LFjB8DxBbgoD3d4eHkw5lgdekdKB2Fhl3UYRH8SyZCBg21G5KPngMLNlviEBHh6emBg/97o8W43TfgcPHQYVip9uZmf+yzPNMcgYBC4ywjYz3x3uRLj3iBgEDAI/CcICNkh4g7Exiv8uUdh4SZg4E/AoPnA0j0WIhMs5Muq8EZN4OWqFlqWA4pkB9IHWwgi2RHg42h5IkOZ/BVh1KwGgfsRAaUUlFJsmrKHjCvliFObbFXAOY49fiIJGB6rMGezhXX7uYOTIATzktk6Esx1xP5BIIMttuUflLx7RaSfNm5EpG03E7ERuY3WWJaCCHTf7+wtF1sNSHthFoPAw4SA6YtBwCBgEDAIGAQeMgQSeQctk/MWw3/TNUf5EydPaS+enp4QUkTIgPLlSmP9hs2QJyHShmRFhpAQF8moCRj5zhRvTOHr7Qsod+zbt1+/Piv5/WQidu89gBstCboNCUB8AuRbTzWrVSH5kg4/zZyLQwcOgmwMYLPBm20TH+fOX0BiXJxEr4mVCGcfAtKm1U/FFCqYX+fr75SAg3edSn1ziv1/5aUX8ViTRmjatCEyZw7Bh/0+wsVLl3TdqZcyWoOAQeBRR+DOjsYfdTRN/w0CdwoB4+efIaBYzEF4gOFvOwCR0YuB9360MHG9hd3ngOK5gNdqAV3rAy3KKDQuBuTOCPiT7PD1AmyKfuT+1ClMmtUg8NAhwDuAxduB81GAmwJCAoFPlipMXm7hdBgVXF37LIcDRyhUpcig5m9XDzf8MOsQQsNiAC8OavRB9relUjdwY8PpD38nnm6wH8ypu4ECoqITceZMFM6fj8al0BhcYvtuJBcuROPgoauQ8esNPCZXs4+nz0Wia5/V+G7KTly+wr4rtj251T9O6d9DD0L/sQtT0CBgEDAIGAQMAgYBg4BB4H5AIJU2uLm52V9R5e4JeDjEzQOfjRqrrbNmyQy4e8DD0xPFChfC1SuXsXrtBlw4cwJw86DwXpg+4Oa495b7RkrBAvnw4vOtMfLTMYiK5ECAPuBBGw8//DL/Z/oJ0/5vZVOQxMXQQf3w+eix2LZtJ2Kj6I915MuXF089+T8MHDwMly9fBjy8KGyThz++nfAt1q/fgPZvvJpUhSf7IImVq1bjrz+W0JYkjYfYi7Dv0g8xcIifnw+b7IFqVSrj+TatMHPWHIwaMx6R8uotEjAOMxMYBAwCBoEkBGxJMRMxCBgEDAIPIgJyFuO9HTwUToYqTXh8RsKj8yRg3GqF9UeBbOkU2tdh+hmFt2orNCthIV9GwIf3YV7uFtzd9FSifW7XEX0QoTBtNgjcFgKcoN91EvqbhFHxQPFswKTngfWngR2neCCoG3lj3o2yUtOznj27L6HVq4tR+8l56DNwHYRM0ETIDetIzRF1JD/WrT+LcV/vTJIxX+3AqHHb8OkX2/DJ6G0YMWorhn66GT1JPBw/EYEbkiBK4cTJq3it+wrkrzoTJevOQsk6N5bS9WYjX8UvERNDsG6FyFDQtp+O3w0PDxuCgnnCsRLZCbPeDAGTZxAwCBgEDAIGAYOAQeBRR8DGSfxDR45ixCejMGLYCIwYMgIf9OiNVk+3IXExCiEhmdD17Y5AYoKGKiQkI+bO/gEDPxqKt7q8h3FfjMOcGXMw5fsp6NWzN/r1/QhHjx6DPAFSqGhhVCpfFlu3bkP7Tl1pMxkL5v3Meoagyf9aokjhwtrn325IdHj5+KBokYJ4vm0bDCDZIU+VgPfYZcqWQaOGDTBv/iK80bErvmR7Zkz/Eb179US3Hh9o10MG9uNAJE63yYNkx84t67Bi5Wq89/6HGNi/P36Y8gO+GvsVy/TByuUrAOUO5yKvBktk/VLXM08/iYF9e6P/wCH49feliI+NhehhFoOAQcAg4IKATB26JE30PkHANMMgYBC4EQJy1tKEBw1Iesh3PBZvAzp8Z+G1H4GlB4CswQo1CyrMaGfhvYZA85IWCoSAk5AWPEh4uNlYVtbbnMeVIkYMAg8FApycP3bWwoVIhaxpLBTLbD8Y3L0sfNIcqFeIvUykuKwsAsU/aHEeREhlSZGXaKFQvjS4uPclNKuXF/1HLEPlZnMwetwOxMawEiUuXMvcKE472u7afxHtuy+i/EVZjY7vbUDn97ejywe70bXfXvQfvR9TZx/BkM93YtYiMqD6gHf1ST+yWgohGf3Qv3tZ/PZDQ8yf2AgLJjZMIaKzy7zvG+CP2W3gIU+eXEdkXO/fiod+qiRLjkBkyRQIcDCIZIuzjDNMlsmE6EUYTWWVMR9HjKnk3AEVcXZL8Z92d8CrcWEQMAgYBAwCBgGDQOoIGK1BIAkBeY3VyVOnsHv3HvTq3Q/d3+uF7j0/wKChw7F+4xZ07/YWDu7Zgjx5cpNASODtoKW/L1K/Tm0smPMjppJoaN/hLTzRsjXavvgKPhoyHEFBgfDz82MdvOdPTMSrr7yIr8ePwU8zZmmbx5o/qev5Y/ECNH+8Ce20Wx3KJpH38xJeuXJFgmtCX/kLFiAB0gqbNm3G5Gk/4tQxEi287233YlvMmjEVP/40E6+zPS1bv6AJmkoVyiH03HEEBgUADr/isHDhgtiyaRXWrF2P3n36o1XbF/Ham53x65Lf4WZzExPExcfpMCZGQvaFN8Se3l544YU2eOrJJ/DEk62xc9ce8kIcY2hLszEIGAQMAnYEbjyytuebrUHAIGAQ+G8RUKxezlTyDx8kPLYdBRZsAbpOBpqNttDlZ07iXgWq5AMWvm5h0OPAU+UsPElhSf3P37z/kijAeyR7xGwNAo84AjwWcmQAGhUDBrXgocG0RUJAjhEbj7ekY8YFJkvbcAM5KCWDhkhNUssD0qbxwcBe5XFu15twdw9Ap16bERsvtvYBDbQv8UedDHLkcX1Gr+mZR/sXnykK63x3SnvKK5QXKc9SnoF1piWuHG0NL08PlrShc7siQLy0mckk//QjcaoD/T1Rqnh6lCuVEaWKpUPJYulTiOjsUrpEBtSumhXu7m505vAhfrRQpUOHXrkh7Eoslvx1Em0fz6wJIOhxmCNf2zrLOEPXPImLXkTirqKoVJDfSH4TJu74mhifgGV/rkSWzJnuuG/j0CBgEDAIGAQMAgYBg4BB4AYIkFCQ10f9+vNcWPHh18nBfVsxbOgg+Pn72W/gnW54U+jj64OmzZrASohAxOWzOLh3G86eOIj4qDC8/VYHpM+QHppwoK3NzQ0vt3sBVtxVHD24C6eP7dfxWrWr46NB/SB1K6UgT4yIyPc+RDdkcH8gLtZZqz1km+vWra3LSH6WLFmABBIzLP/E/x6HtOfCmSO6nsSYy1i0YBbEn/i1O7BvlVIoWby4to+NuIgDe7biDNu/ZsXvqFS5IuuNQbVqVSHtaN68Ke/J3e3tY/3ZsmXDTz9M0nklSxaHzca2292arUHAIHBfI3DvGicj6ntXm6nJIGAQMAjcCgJyvyJnJ84zhkUAf+5V+OxX4NkJQPcFwB97gfK5gcGPKaztTH1VShU65oSmTOAmE6rNahAwCKSCAMclT5bnQcPjLYFBKhZ3RiUDEB7L2hkHKBky+GH36uYI3fUk/P1JVHAQpvOcGw5+9u4Pw7K/TgD66Q1nhjNkY+W/xVIT2k+fsgfrN+7GV59UgfKUgZGzXIqQ9WgWIYX6b5O3Uk4BUVHx+PTbYyhaKB0yZ/OHHnD+rfNbNbA4ZiQOt2r+D+yUsggPO6JPqP/AgSliEDAIGAQMAreOgLE0CBgEDAJOBOTemPfMuJmIjdPeGYpOypB88PX1RZ68eZAxUwjc5J93RC/5KW2py5EzBzLJ90QkT+ycImmn0C6pPU6da5iUb4E3qfYcp47tSZcuHaQeZeMgX/xLnt0q+Vb0tPfw9ETefHkRwvbrMqIXSwlTK+/Up5Yn5YwYBAwCjzwCPPs88hgYAAwCBoH/EgGZXxNxtoHxY+eB6esUPpoPtJ4ILNhqISPnD1uVAma8CIxsrdC6MlA8G2+wElmQE7kQYdSsDzYCpvX3GAE5bngY3VqtYihya9YAD2Z3hRnzD2H4qK24Gh7NARHsEp+A4DS+gJAYYke1XjkoD2ja2wAAEABJREFUOnc+At//sBszFx7A4cNXAOrgagNZlGySC4mJqPA4tG6/hvpAvPJCESBOOsikXh1lGETFxOPw0as4duIqTp+JwOmzkTh95pqcORuFM9SJJNdH4sSpcGzfHao93nDDfl2+GoOEuFhkDQl09NNpzQZc1x9n3u2Gt/N73K5vkPqwoJS09/bLmhIGAYOAQcAgYBAwCBgEDAL/EQK3QwgIaSAiZe5Wc8X37dThtL+dMner7cbvXUXAODcI3CsEDAFyr5A29RgEDALXEOB8mtzTJJC8SOD85PnLCpPWAaP+UGg6XuGDBQoXw4CyOYBvWikMdxAej5WxEMA5U8RZ0IQHy19zamIGAYPAvUFAbh14EOPvRFrjhn0HLmPMd7sRmGcU3hu4AZFRCdDfa5STgPYhdg5fPLTPX4jG4M8OoGGtHMidNxh2ksRpkzJ0lBM/bm4Y+NkmIP4U5nzXiIYueZJPDSRUNkgdrd/4EznLfIcsJSYjS/GJDEUmMZyCzMVHU8ZQvmFadPa8zMUnIXupKShRcwIgvlIT+r96NQ5zfj6G55/MhKKF5XUDbAv1kdEJ+Gv1Kezad4nFbxVHlk2tHtzdxbIU8ufLi0LFyDzLifruVme8GwQedQRM/w0CBgGDgEHAIGAQMAgYBAwCBoG7hICMvu+Sa+PWIGAQMAgQAZe5u5h4hThKeCSw9jAwcS3Qax7QbRZw+LRCOj8L/RtYGNPaQofGFhqWBDKnsZBEeJAsAZP0alaDgEHgHiNg/ZODLz4R779bHqvmNcfgD+pjyV+H4ZdzJOb9cgxwt7n0gCcKm8LpsxH4/JudePv13ChWOAMgLKmLFTQRgOsXmw27d1/CN1P24vUXKqL5//LyvCEnjOtN5bH8kPR+mDquJg6sfQFHNj5LaeuQZ3Fi67MYM6wxihUtiJULnsSxzc58CZ/FofXPYtuyV1I4ZvudGkYjo+Px4ecHUShfOmTK6m8ncaiXJ0qmzN6LiT/txcnT4QD77Cx2e6GiOX+Ru3w+TJT/ukM86zKrQcAgYBAwCDxKCJiH/x6lX9v01SDwXyJg6jYIGAQMAvcGAdfZh3tTo6nFIGAQeLgRkHk5EZ5douMUomMVrkQAEVHAd2sszN4KvDpd4fftCl42oGkRhffqAx8+BbSpApTNAwR4E6I4isxf3uUJPtZiVoOAQeBWEJBjUUSTEHKQ30jEmTOP8Zh4ZMnijx7dy2PqF43Qrm05nA8lC6p4AtC+aEPziIg4rN90Bl9OP4lm9XIhV54gO3HAbGg7GkEW15Bx+jlNMqFrnxU4c+Y0Pni7DBAvJw/mibkuqyP2Dfvg5e2GPLmCkDdPMHLmCHSRAGRlOm2AB3Jk8UGu7IHIniPIkR/AMAC5cwWieLF0sC/KHrhsE0n6nDoTgezpE5EvVzD7kMhc2iVayJM3DV5tUxTfzziJrTvOIjaWeWw/dBtpc10ILq56JmHjhp3g1qwPEQKmKwYBg4BB4D5CICoqmq2R6w8DsxoEDAIGAYOAQcAgYBB4wBGQUfQD3gXT/IcJAdOXBxQBGR9R5J+1I2OAyyQ8Ll8F5m62MJPSdRbQex5JkMtANs5pdqtloZeD8Khe2ELR7JzMc32tFZMPKBKm2QaBhxqBWzs0eTJIhgLTnPxHdDwKFUyDCSPr4qXWhQDn9zlIAERExmPp8uNo/sJifP9xadSqmo0kBsmBJELA6ZC+dJQhV4nKdzxe7fYnEngCqlO9AJ7tsBJnz5JgkUz6lgBJfqQQRToibUoplkJ4WDROn49A2RLB8PB0BxJorO1AMkOEadFpn0y7hqwvIioBU+YcxNPNsqJsqUwsLzYirJfl5JVYwz4ohsFjduPAoTDJuImwTLJcZ9oRsinJsk3CIGAQMAgYBAwC/xYBXmJWrV77b72Y8gaBW0LAGBkEDAIGAYOAQeBeIGC7F5WYOgwCBoGHDAEOjPScH88g8pTHlUjg4mWFrUeB+dsUJqwC3p8PnLkEeHCC7pXKCu80VOj6P4UqBSyUy0s8nISH/KO2zHNSZVaDgEHg/kZAKTn4b6+NlmsZkhQWLLi7uQGitymEXo7G7yuO4bHnFmHkgCpoUCsX3DxsoBluuLCslahw8MgVdP5gBY6eikCfbhXQr3slZM+ikKnoJOw5EIq4eJ5caHtDPykz3Ojz8GUsXXkWtSpnRlCgV0qLv01fvhKDj0cfQdFCGRCYluUtngQdpaTvPv6eKFciM7Jl8sT6LWdwNTwWUAq3vvA3cPaJ0VsvZywNAgYBg4BBwCBwCwjwslW/Xm0aMsKtWQ0CBgGDgEHAIGAQMAg86AhwhuF+6oJpi0HAIHDfIiATbTxjyFxeeBRwgYTH6QvAn7stkh7AF38xvgdwp0G1XAovVATeagw8XRWolN9ClmAOooT04HwkRO7bjpqGGQTuEgJyDN0l1/fEraP9QmikJs42SJ7EnaHERSRt0Yey2QASHxFR8ThIsmHSjH1o3nY5Rg+tgTZPFkKmzP5AIqkCTvJbqQjcbIiJTcSufRfw7oBVCL8agxF9K6NKxcyoViMbenetgi5vFEHhql9h9YbTiI3nuYf1OdsgoYirb0mD7YqKiMfWXeexfGsUsmcLgKe3WzIeRspoW24k7irSLqlr2epTePKxIFQunxm6MNtLxgeSn5AAhF+JRdq03qheKRN6Dt6FEyRvoGxw9SVxVqFXiScXqnme5ZYr+8atWQ0CBgGDgEHAIHAnEZCnKu+kvxv7MjkGAYOAQcAgYBAwCBgE7j4CtrtfhanBIGAQeCARUGy1CM8ScSQsLlxROHMR2HIY+GWHwvRNwKS1wNHzCjmCgGbFLLSvp/BkZaBiAQsV5CkPmZuT7+eyPCROl2Y1CDySCCiFuLg42D8qnQoCD4Lqb45h5yS9dEXizlAJ+UASQFESExXOnYvEwUNhmLf4IPJVmK1ffTXzu2p49skiCAnxgyVPiRAvKe8qSskJCbh4MRrLVp9Eh16rEBzsgf7vVUJ9Eh9KkUSITUDBQsHo0bk8PnynJmo+/gOWrz6OmBiehFi/+JO2iUhcRLt1t/H3ScTSVScwbOxuDHirAEkKX4DtFRuxF0kZl7RIPEmWyMh4XLgQiWFjdiJvriAE+Hng2NErOESSZ//+S9i95wIJmVOYMf8ARk3YjiV/nsXpU2HYuP0swiNioNh+8eUUqU/EmU4W6kYDSTxIskyTMAgYBAwCBgGDgEHAIGAQMAgYBAwCBoH7FgHTsHuOAKc273mdpkKDgEHgfkVA5hflrMDwahRw6hJw6BSwdi8wczMwd5vCMsZ93IDy2YBnKgAv1bZQvShQOg/g7ckZUifhwfnG+7Wbpl0Ggf8CgatXwznJHvdfVH3H6rRuk8lUJD/Ono3A/gOhDgLgBD77ahvy1f0Fk3/chy9HlkPf7pXQ4vECJDM8NfmRWmOFHLgUGo2t28/ji2+34tVuq9C4Vhb07FQelStkgo31WJb9pGPFJyIjiZQub5QlEVIR9Z5cjD9WHkdERBwcvEFSFUrZ+JtYOHUqHH8sP4YJk3bSbwhaNMuDdOm8STDYfSYVSCUiPvcfDMOCXw9gxoID2L7jAFZuuIg+wzegE0maFzotR5s3/0K3vmvw45x9uHjpKvLl9sPzT+fFB12LYeT43Th1OgJwtD+VKm6i4jn3JrkmyyBgEPg/e2cB2MaVdeHzRmCM7cQQO8zMTUopMzPTbtvdwrZ/290tbHnLzLhlZmbmpmmahpmZE8cQO7YlzX/vSOPIjp3YjlE+07l6dB99I8ntPZ0RCZAACZAACZAACZAACZAACbR2AhrqbO0MuH8SiH0C1e1QhA6o6TeB2PINwLJ1wJ9zgc+nAB9MNfh4OjB3rcGADBt79gLO2hM4fJQNvcujawagj+pHUCbQOCFjcQKCJwlUTcAYA1s/b1U3t4DaOnzARZj47LulOPac7zFg9Fe49rYJSEwweOfhEbjlP7vir6cMxNChmVDRwg5tY3zLxhIRKW66fyKWryrEw7eOxIVnD0OvnmnQo/KdEHoXSVqaH//392G49Lx+uOqWP0R42AzINUDk0GzhplKMm7gKdz36Jw45+WcM7t8O//jrEOS0T4Yd3MZ6ImO4ybKVhXjhjXlYvrIAD91+IM4/ozf227M9/npyD1x92SDce+NOuO3qXXDFxaPwj3NG4K+nD8axx/TFyWLZGV5MmrEORZuD0cvDdg9dntp2HelAAiRAAiRAAiRAAiTQqghwsyRAAiRAAhUIWBVKLJAACcQ+AQ3AqnmAQokHLlsPTF8CjJtl8NLvwC/zDb6aBWQmArt0snH0UODk3YA9BwMDOttIbyOI3Ls8GHwTGDxJoAYEJEIf1B+AqIFr83Sp7b0fkV3Id0SfHqm45arB+PytXXHfTbvjvLOG4vhj+mHE8Pbw+QxU/Ih4V5+EDLp1SsFV/zcUl1+4E446uAdSUnzYlmiibR2y24gAMgx3XTMSGekJgFyHLZNYKC0NYeacXBip/+Dl3XGhiB/du6ducalBTrpilOzlzut2w8XnDsdfTh6EM08YiJOOG4Bjj+yDww7qjr337Izhw7LQpXMbJOjvigREMS4NoFf3NFxy3mC0z0hAnQ79Lq9Tx9bTiTslARIgARIgARIgARIgARIgARJo3QSs1r39VrN7brS1E9AgmX7avcCKXIPFa4E/Zhp8MgH4cKrB93MNZq21sXdXYOeuNs7cHdh3GLBTL6BbJpCoj7YKCkSJ2UECmpLjSQIkUFMCEiFPSEhAr549nEB7Tbs1Oz/ZR3hN+mUSzlX/Gvax5XtjlxHZOPbwvjjkgB4YuVMWMjPiYZeJoKK/9VHD7xN9vFVaahx2HZUDvevDGA9U4Ngyf3i+ymVdcvduKTj0wB5ITBDBxFY/NUDHbNc2Hkcf0lNEkhE44sCeyM5OwpZxw37hMaPz4ZotrxbapsVjyOAMdO6UjNSUONhG9lcWhIo75ab7DUl9ZM+2rCU+3ou9d+uMPXbtFFnfllGrzuk69Au96lbW7hgBY4St2o4Nw94kQAIkQAIk0NQEOD8JkAAJkAAJkEAUAf0v6agisyRAAjFDQOI40E+4iB5rNhrMWwX8PsPg1d9s/LbI4Ku5NrqkAnt2s3HkYBvH7gTsPgjokQ10ShcK0Xd5RAJ2UsuTBEig1gRsJCQmoFOHDghqRL7W/ZtrB/2CcU3X6OY1dcuAx2M5ooIt3ym2IwIYbRSL9tP8tk3RqaCytUCh/WQ45wtP82paVhOhI2Tg9K3wPaY+si6py8xIRPduaXB+R0R8UT6O9g/7aW5LvVvnpjKHHUJ4beG5Kvpqb9dXU7es/YCEeB8sCbrrGsP9trRrLlyn/dTCNVonUopbYFoPBCzLwqpVa1CcXwDI9QAPEiABEiABEiABEiABEiABEiCBFkSg+qVG/9d09V5sqRcCRkaxDJELBp4NRUDfZB4Z3AuslxjOhPnA95OAV8aK6LEA+HWxjd27il1TqP8AABAASURBVNAhoseZu0oqgseQ7kDXTKCNPoElKH15l4dA4EkC9UxAAu0tX/yQLxjZByApKv8tq1xG5FDfSNZJ9AvKrdM0uuw41OBF+7hu0Xm3TlMd212T5rWusoXrbVEetogqlX1qUg6PU72nuw7XQ8tb+sj0bkMkdfekqVqkukIiX9TOtXBeKrSwUDcCHvn3s2UrVqCgQP54UgCpG0T2IgESaD4EuBISIAESIAESIAESIIFyAvpf4eUFZhqQgPzHdF5eHhYvWQJjtgQ+GnBGDt0aCOhbST/FEiMrk3jY0vUickw3+HiswWtjgB/mAWuKgD17GOzTCzhlJDB6ANAlSyxDAEkfqGkMTU2qeJJALBHgXuqHgAbp9Y6D8NeEfvGo6diabstcH03VwiMA2geRQ+u0rBapqtCu9a5trz3ar6q8W6epjqWpmubVNF9b037yJeysWftqWVPXKpe1vqo6rVdz2zSNNm1T0zr54nezWqTVCwG9CwT8d7R6YclBSIAESIAESIAESIAESKCxCXA+EqiOgPwXdHVNrK9vApuKihwBpL7H5XitkIB+ciXeVlwKTFkMjNFHW/1k8PZ4YNwyGwVlNnbrAZw0Ajh0MDCqt43OInp0aBdh5YoekSITEiCB1k2gVL4TVEStHYXaRODV17XKs2i9W6d5NS1rqqZ516LL0Xm3va6pjqVW1/7R/SqPU7kc7VuTvPZXc30jedGNVJhya5mSAAmQQBQBZkmABEiABEiABEiABEiABCIENIwayTJpaAIGBh6PRK3BgwTqQEA/rfL2CUqg8s9FwK+zDJ7/HnhtvMFvS23ktLNx0nDg1FEGR0q6U0+gUyaQkhiZS/pBAmaRUitJuE0SIIHtEpDvhv36APuJUOrcEbbdDrV1MJEObqrF6LyWXauufnvtbj83Vf/q8tpWU6s8RnS5pmNU5VeXcdw++segqjFZRwIkQAIkQAIkQAIkQAKtmQD3TgIkQAJVE+B/RVfNhbUk0DwI6CdURA993P7v84Exsw0e/wp4f4LBklygc6bBZfvY+MvOBnv3N+jUHshOs53f83Ce4iGBTYoezeNSchUk0GwJyPfEbj0M2rWRFW5LJHVuN3AdNBhfU5Nxob5uWjkfXY72ceu1Tq2qstapuety/bSuury2RZv6qUXXufnoes2rRbdpWc2t07RyWevUtF7NzWta2bbVrm2uaT/I13v0vt02piQAgBBIgARIgARIgARIgARIgARIgAQcAhpedTJ8IYFYJNAi96SfSjWfwZi5Br/NMXjgE+CVP4BleUBOusG/9rdxxGAbBwyykZ0OZKTaiPdLIEwCmRIR06hYi9w6F00CJNA0BBJ88v0h57Zm198ACbfrF1Q4V3+v4YD+1uNpvWtua+Wy1ldVp/U1sbr2dftpGj1P5bLbpvVqbrmq1G1308o+FevNdq5Z5d4skwAJkAAJkAAJkEAsE+DeSIAESIAESKAqAg0RxahqHtaRAAlsi4DGtPTTKKLHHwvgCB/3fWDjsV+AlfkicLQFbjsCOFwEj8OHAe1SgTaJQIJfBqXoIRB4kgAJNDwB/aJq+Fk4Q80JqP6hVkWPHaoyxsDj4fUGDxIgARIgARIgARIgARIgARIggRZPQEOuLX4T1W+ALSTQzAnoJ9AHbCgE9BFX94roce/3BstzgZQUg6dOtnHYIODEkQYpyUBSvIoeEu6i6NHMLyyXRwIxSMB5BFYM7qsFb0l0ivKHi9XbNmTQUCiEMWP/QJzfX2/DciASIAESIAESaHgCnIEESIAESIAESIAEtiag4deta1lDAiTQcAT0U6e/6+EzmLXC4O4PgcvfNfhgCpAqosfTInocOxz4624ieCTAebRVvD6ehqJHw10TjkwCsUaA+yGBHSCgWldhYaHzRMUdGIZdSYAESIAESIAESIAESIAESIAEGpoAx98uAQ3FbteJDiRAAjtIQJ8kEhE95q8GvhSx4+4PbVz5MRAXZ3DfcTZuPRI4d7SNlCTA67Hh89rh3/KQZAdnZ3cSIAES2GECRr/HdngUq8YjGFN5wpr3BWrjq0uqrX9d+2i/+jH9TRZblYr6GW6rUTxeD7Lbt9+qnhUkQAIk0JwJcG0kQAIkQAIkQAIkQAIkUJlAXf6Lv/IYLJMACVRHwEiDz2BFrsHHk4B7P7Zx3jvAzBVA50yD504BLj3ARts2gEc+jZYY/5dbYcZzRwmwPwnUOwGNtRtnVH3VL6stZozWaeP26mwYo77qp/5q4bwxprzNGAPbNtJoReokW35aklOTxDm35I0J93GqnRdtq84QGVvbIYcVKUvWEVAsyahJ4pTDqTFb5jBG83D6GaN5y8nD8bfgpsYYyevp1oXzxoTrjdFU27TeNS27BmdcY9TPNTTgYTtjG6NzOVm+kEC1BDzyPjFG36vVurCBBEiABEiABEiABEig4QhwZBIgge0Q4H+tbAcQm0mg1gQ0XqSfLC+wLt/g3k9snPiKjWlLge5ZBi+fYnDZocCpu9jISJEgk5wUPWpNmR1IoEUSsKBfEC1y6c7XlH5dSawTxtgVTHdkjNlmnfq4Fu6v/mq2VFti4VPbwjk440EOY8J+xrhpuI8xbtmIV3gM7R824/QP5+0KeXGWstFE0i1tWmGMqVBnjFsOp2GfcJ9w3hVr4PSDHJXnlCpp29IfIpCoj1sfTnVME/HTVMuuGXVxTJYDRIq2DRGK5AU8dpSAPmVyR8dojf0teUMuXLgYa9euBSSPJj+4ABIgARIgARIgARIgARIgARKoSCAcLahYxxIJkEBdCGhASiy3EHh9nMHDXxkc/7KNkjIpnwpcfbSUR9no0E6CVQGZQKMtkpVc/Z8ckQRIoBkSaMwPvHwZaTCyHs1A/nHGk391cFJB7KQGqJACkCo4dUA4NTCW7N8AKDfJmLC5YgDKDwvhOitSs3UabtdmbbPEX8bSomOWvFY2qYqcxri+ro82uPntperrmvpC5pa9QQ8tq2leTfNqmg+bMUb8jRSi6928ptEmbuWnW19ewUx9ENBLpyYSnwpK9TFkaxpD0RljIu/p1rRz7pUESIAESIAEmhEBLoUESIAESGCbBPS/prfpwMZ6JqD/pVjPQ3K45kEgbxPw2PcGp78CLFwJ9Mmy8exxBtcea9AlU9ZYJhc/KKkk8sqTBEigtRCQz7wxBn6/H+PGT8DqFSsA53l3DQTA8iA4/zeUvXMuyj64DIEPL5P0UgQkX/rhJXAtEJXXOrfs+H90meOneW0r++hSmK/+A/P9yyj9MYCyH4skLRbTtKKV/bhZ2jc7bZovdXzVR/2j7AetK0LZ90UITCwVJh4BYkVMEmh+e6nro35qWlbTfGXTetdUgda86xOdd+uqS9XXNdenpmX1c/toqmU1N69ptGmba269lk2kIG+uSI5JmECtX0X1SM9uj51HjkAgoP93Qq1HaL0dQiFkd+qIAQP6IiT51guCOycBEiABEiABEiABEiABEmjOBPS/opvz+mJqbRqm8HgsGPmngTfG4RuTgAEKioFL3zFI9Nq453CDa44DDhkK9OogV12FD421NeaaOBcJkEDzISAB1nbts7DTcPlSkFVZxpLXBj4tP+x4UV7j0mD704C4trAlb/nToWb87QDJa6qmdVq2pF79jS9N/NrByUud1htfKowvQUzW7gMsMVOFwSffe2Lapvnq/Cy/CY/lB4zX3sFHORnU7qjPa1CfY9VuFxDUtry/atmL7pUJCMNgUP8PhcoNLG+XgAgfFD+2S4kOJEACJNDQBDg+CZAACZAACZDANgg04X+1b2NVMdtkIycnB16fN2Z32Co3JgGoNonAC+fYOHsfYGAXqVDRQ2MpFD5a5VuCmyaBrQhIgDUU0i+FrVoapELlANeiJxCZQYryHeW8hlPJShxdW9S0VJXpaOF6ExHx3d5uWVuNvlQy18+tdn10Njdf8avSrXXT6J6V67RN69xZ3LKmrmm7mpajUzev9a5pnZpb1jS6HJ3XNjW3TlPXtN41rdO8m2p+e6a+rqmv5jVVi/pXN6k2YlpLIwESIAESIAESIAESIAESIAESIIHWQ6DmO436r+iad6Jn3Qk4/6dmdJym7kOxZ3MioNdUn5yhVjGS15xWybWQAAm0EgIqLojmIsIGwnKFfEe5cXLJIvowYY/oKqdftJ+Ot8XBlh6mvFixrby62owd1eLmLRnRtnVMtSgHqUe5IXKoT7Rp9fbKrk90qnm1yn23VVe5Tfu6dZq6pvWuaZ3m3VTz2zP1dU19Na+pmuZpJEACJEACMU9AFe6aWlV+MQ+IGyQBEiABEiABEiCBmhGwauZGLxIgARIgARJo/gS4wigCkVi5IzJI3km3bo6q2XZWhohyqDxauMmtNY5oAXk10MNITlM1oy/RJp1CW0kuW3lF96jHfE3nqalfPS6t2qGiVXaRn2wBWK0vG0iABEiABBqdQLQYYcl/btfRiouKUbRpU51sk/QrKwsA0XNHr6vRoXBCEiABEiABEqh/AhyRBGpKQP6NrKau9CMBEiABEiABEmgxBNy4uKTGFSCcPKRk4B4SQnezVafSRxsiiWS1r5pk5dScmmSdU/M6pqZaoakTc5FZLc1IpSZWpGxZBsYYVB/HN9pDLPrUuurK2qam7dGp5tW0vrbm9tNULbq/W3bT6DbNa72a5tU0X9m0Ptq0XctuGp23pBCur56ZuPAkARJoTQS41/okIH+T5A8THLPkOzfatC26XDkv7QX5+SgsKEB+Xh5Wr1yFVStX1trWrFqNSZOn4I/xEzDuz4m1tj/++BNz5szF6lWR+VesRG5urrMuXZ/zVIIq1u7sWfYAHiRAAiRAAiRAAiQQQwTk3+hiaDfcCgmQQCsnwO2TAAmUEwjHyAFJVZDQmyyMEaEB4cMVNIw6SJWmxknh1ITzBtIFBoAlr0ZMTzVjpCQmTYCkVsSMMdC8MZpCmgz0kKLkIWbCZkVSA1gAQs6NDUZylU2qnFPrNROdal7NrXfzbjk61bya+rhWuezWV05dP03VtL26VNuiTf3U3DrNVza3zU21XfNuWlVe22gkQAIkQALVEtjyhwcV7oSoHPiPLns8KNlcgryNG0XAyHcEjGVLlkJt6ZIlyN2wASuWLXfKWlfBli7F4sVLMP7PyZgwcTJ+GzseH37yOcariDFOhIxa2JjfxiIlpQ1ycrLRoX37WlvHDh1QuKkQY8eOwzid94/x+FOEFF3XnxMmYf6ChVi2dBnc9eve8jbmIU9Em0LZe2P+blm1148NJEACJLBdAnQgARIggZoR0JhDzTzpRQIkQAIkQAIk0CIIGOg/kFc4h5Y0DqRCiHFqbBEdTFS7UwljpK6CwamzVKyQf2OQJukndQAM4JjTBkDbjDHVpNpuABgYIwYDiCIjWRijeS1J1XbPsO923WrssCPj7UjfGi+QjiRQMwL0IoFYJKB/H1yz5I9Qbczrgd7xkLshF2qLJOC/sAamfjONQzz2AAAQAElEQVRnzcKEyVOdOzAmT5uOadNnODZ16nSsXLkaM2bPdspufXk6bQZmz52Lrl07oUOHHPTs2Q1HHXEojjjmaBx17JG1smOOPxYDBw9Cn7590Kdf7a13397YZbddcfRxx4TnlXTY0CGOoNKlc2esWLESU6L2Nn36TOgdJxNl339OmIJ9995T/jC7/6tELL65uCcSIAESIAESIIHWRED+TbI1bZd7jXUC3B8JkAAJkECYgIbnjTGwxBAuwBgTZYjkt6SIOkwkL10iOThjGWOkH6LMwLKkDmqAMZKacIpIaoyBnJVM6gAYAEZjLM7znJwSEK4FnBRyuPWSrfasiY92ruwXXa4q79ZpWlV/rXNNfaJN66PLmtc617TsmltXVao+0fVb/vXNwRbdxDwJkAAJNDQB/UKX7335o4Dtm3xfeTxAHaystBTr1q7D+nXrsXzZMsydMxdzZ8+pkc2fMw9fffWdI1RMmjoNX3/3o3N3xsKFi7Atmz9/gdAz6N6lMzp27IC9Ru+OQ0TEOOTwQ3HYkYdjwOCBOODA/aHlquyggw9Cj5490Kt3L8eyc7KBslIgEKi9BYNwbo/UWyTrYtrfnbesDBmZGejdpzd69OqBvfbZC4fJnsr3cMThItx0QddOHdGpUw72O+jA8HqFBk8SaM4EuDYSIAESIAESqAkB+TfSmrjRhwRIgARIgARIoCUQUC1BY1PGGGe5mkTHqbSsBnkxxkjiGiJ5OPEsY4ykYTPGOG0wgJoxBsaEDZFDilIHGKDGhqjDtqWnnFFVkWx0pears4j7VrNrfXQfLau5dZpX07KmatF5LVdl6lPZKvtpe1V1Wq8W3ablaHPbtE7zmromZdt2fjdFuQOQCp4k0HQELEv+k0KtDkHuugTGq+2ja3CtqdcSw/OrMLFm1RqsWb1tW7tmLeaIYDFDBIgZ06bDtZnTZuD338ZC0xlR9ZXzemfF1BkzMX3GbIwfPwkzZs3GmrVrsXrNmu3a8pUrnUB+t25d0UPssEMOxD4H7If9RLzYlu1/0AEYNmIYuvXojp69eiI+IV4EjCjxwhEVRJhwhYWq0spiRdN9NCvOLH83ygUVZx9R+xKRplv3bujes4ezb0e0qdibJRIgARIgARIgARJosQTkv1Za7NqrWDirSIAESIAESIAElIAGxo0oH0YEAcekwqpgEIEj2kykbGCMGpwUcpgamLjU+XRiMqrc1HmEbXXU1W+rvTZt9TnW9ubVudS258d2Emh6AnPnzsPUiZMwuZFt6uQpcG3KpMnObzOsWrHS+d2GqZPCbY29ph2Zb4rsYczPv2LinxPqjeWUiZPx+5ixGD/uj3oZU9c49vc/MOa3cZg5e66IEnOqtxmzsGH9BhQUFqKgoGCLFRZg3YZcqY+qi26XfH5+AbxeL/pIQL5H9y7YacRQHLjfPhi9157Yowa2l/iM3nMPdO7SGV1FAOnYqaMIGWXhuxqqEi2i61QccEUM/QPV9B+xxlmBu2dNG2fGepiFQ5AACZAACZAACZDA9glQANk+I3qQAAmQAAmQQPMmUGl1ol844oX+kQ/ngapD6VXXovyob1XCnS+SuovT+ep7Kh2zFZgtwTm1VrBVbrE5ErBD6NqlCzp37oSysjIEJXDcWKbv+wULFmPSlKmYPHWak86eMxdzRIxRmzwlXKd+jbWm+pgnEAwgGAiiPsZyx9AxA86YoR0eNyBCQVJSIvr374M+vXqI9azWeol4sfPOI7HL7rs6v0ehv0mhtvOuu+DwIw6DplquynaVPoOHDkFHeW91EhFDLTEpKSxgyPtMNoIamQbzXWuOnyGuiQRIgARIgARIgARqS4D+tSagsZFad2IHEiABEiABEiCBZkxAxISIxLCdRYrjdjzqp1lXoxYZTbMqfkSKeuuJBindYv2ksf2vOBWvnAKtH2ochQRqRSBkIys7CyNG7tToNmynEdhn7z1w8AH746AD9sMhBx2AAf37oW+f3ujTuxcOOnA/p039mmJ9dZlzuOxpr333xshdRtUbz+EjR0DvhFBBYYTkR9TTterbry9yOnRAh47Vm4oXzuPRRHzZSqwQIWWruqqEDVe80FQE38rvT5ZJgARIgARIgARIgARIYHsEYjs6sL3ds50ESIAEYoMAd0ECzZSABOajhQ4porzsFGTdkobg/J4FIHm4h/uvKJpWZdF+0e1uvaZa76aad03r1NxydKr1alqnqZrmo61yXVVlrXPN7bu9suu3rdQdQ9OKMojW0Eig0QmICFKjQHZVwe0dqZMAempaqggw7ZHVPmztc7LhWla21IlB/JpkfXXdW1ViQV3Hash+KkjUxBr9DckJSYAESIAESCDmCXCDJEACtSSg/4Vdyy50JwESIAESIAESqAsB/T9hjYkO8tdllObaR/cVZbpPLepyNdWyI3A4Ba2txvRfTdS02U01L6ZdJQmf2qYWLm151To1tyY6H11XVb22a71a5byWXXPbt1UWHyMGtWi/bZUjfhX2GakrT7RRLVyh/0O0gzZc5CsJtC4CtoiA2wvCty4i3C0JkAAJkAAJkAAJkAAJkEAlAtH/FV6piUUSIIEWQ4ALJQES2DYBjRd7xMW7HVMf9RW3+j6NMZg7bz7yCwrqe+j6H88j/3pgiVUeWfYAbVPTvPp4BJpXTfy9YpYAlBMVxA6nAhUPrVMDbBEKJIwJpwu2cahTuEvVTttqq9yjNr5u3+g+0Xm3vXKq661cV5NyVf1qMl9NxqYPCZAACZAACZAACZBAyybA1ZMACZAACdSKgEQqauVPZxIgARIgARJoWQQkcFy0GXjjV+D5r81W9uI3Bq98Z/Cy2FeTgY2Fsj3pI6/1fBqsXLkKJSUlgIoHaJ5HMGTjg98W4ufpKwAVOJxlGuiaNxWX4YfJy/D5uIXYuKkUC1bm45VvZ+K5L6bimc+mSH4WNuQL7Gr3J+PANYQP11dvZXAD/+oSbt361fXZukWUFKncVl9pLj+3NY46RY9TVX57/SuPoeUdsZrMtyPjt9C+XDYJkAAJkAAJkAAJkAAJkAAJkAAJbIsABZBt0Wk5bVwpCZAACZBAdQQkcGxZBm3bAJ44Gz06At07wEn7d7WRLPVjV9r4bB7wxSwgd5MMZMQa4DTGOOH/Bhi6foY0QEgEkLs+nYEfHQFEKspXbFAWDGHG0g34bc4qlJYF4fEAc1bl49zXJuPraasxsEs7pCT6AWFecUGRcTTRBk1dk7ItedU/JBs+t+ofri5fihalz1ZlrY/uW9lH213bVpv66DjqE53XOi3X1dzxquqvbWpVtVVbpwtSq9aBDSRAAiRAAiRAArFHgDsiARIgARIgARKoBQEKILWARVcSIAESIIGWSSDOZ2PvvgbH7wTs3svGPv1sDOpgY9Fa4Oe5NvwSyM9KsjFCxJG2ybLHeo8p2/D5fGjbNm1rbUCmaz5nOAK/MG+zCBwBWVa47AgNmhUBxzK2FA1EJ0HXzBScvncfXLJbR+zVrz16ZKfCq4/Dkp4QL8ekj5uFHjqOU+EWLBhVQLSo5rRrppJpvR1Vp3lbylovSZVgXR9tr2zVtbnjqb/6aKrm5t1U66J9tVzZon0rt1Uuq6/a9sas3E/KdgX1SCp4kgAJkAAJkAAJkAAJkAAJkAAJkEBMEaj7Zqy6d2VPEmhgAho083oh0TRA8+BBAiRAAnUjoDHleBFBkpKAQBD44E+Duz4Fpq40OHs34PQRQEI8MFQEkDTxqTKYXrepw70ksG3J95jH4w2Xm8WrUlHTxWiqpnkLfsvI164B5HQs/AI4qYXyw2MhJd6HJLEEvxfGRNpkr3D66gsih+Zd0yrNawqo/qFdnJKwclL3xXXTejfvpuqj9ZqqRddrWW1bdVW1RY+n/aOtsv+2fKP7ufnt+ev40T5advtWkVL3qAIKq0iABEigNRDgHkmABEiABEiABEiABGpMIBKpqLE/HVsrAUveKj4/4JoEvSqg0P/j12nzAeVRLNT9kDHWrVuHTz/5DN98+TXyNuahXsYFDxIggVgiUOO9eIHSgMF7vxtc+Rbw83wbx400+O8RQI9sYOkGg4GZQOeMGo9Ya8dwXDv8WuvO9d5BIutyhoeNZCIJTEgUiXALoJVqkMNNJevUW5IxsG1LTLJuNN5xc160UkzzapLdxhnurmNGOWm3aGRu3k1dV/XTfOX67dVF+7tjaJ9o03o1rVN/N6/l+jYdP3rMyuXoNuZJgARIgARIgARIgARIgARIoBUR4FZJoK4EKkUa6joM+8U0ARE/li1ZiptuvAXn/e1CXH/djZg9YxbgiiAifvz0/U/452WX49abb0d+Xj4gAgZqesj48MUBPhFP3D5SN3fuPFz6z6tw4KFHY+GiRYDUuc1MSYAESKBGBET4gAHeG2dw4avA13NtnLKzwT3HA7v0sOWrx8YKET/+WGFjcAcgrUEef1WjlTawk0BQEOUWmS66Wtuc726tjLRvlWibmJzlTZp3zI5UeSKpUxnJRyXGChc0dUz9ojQXbdUqNXdIravK1Efrt+enPuqrpvmqTMeoql3r1dw+0Xm3bntpVeNW1aemfuV9bRGf6rKg8gGqzehSjKWv1bqwgQRIoOkIcGYSIAESIAESIAESIAESIIEaEohEIWroTbfWSUACYoWbNuHJp5/H08++gFtvuwvrN2wALI0sChJjYfHS5XjwoUexdt06SDhGKiud+ku5apWqYVlYuWIFOnXuhWeeegbRIkh8fDz69e2N4449Gkn63Jrw/x68ZQQdT21LTfU52YPOVb0DW1omAa6aBKohoDF4+Yp67w+DE582eH8a8JddgCdOBUb3tmFJu7GATcXA9OVAn3ZAt/Yyli0WU6eR3ahJoqdmXVPBo4Kpg2vRINwOksrpesCIj1N2Xsqrq8wobNfUQfOaRpnR52C5ZRnazW4zdf0qL0HLlU191bY1oNuufdXPTSvntRxt2/Nzx3X7RPu7dZqqX3Vt2l6lyV/dyn8fq/SrTaVBMBjCqlWra9OJviRAAiRAAiRAAiRAAiTQgAQ4NAmQAAnUjYCEf+rWkb1aHwG/z4fkNm2cjasYsmD2bLiCheXUApYIGiaSdxLpA18yfv/td4wbOw6ad/tARQmPD16PF8uXLYXHETPixSfO6Tp81Eh88umnePe999C7X18gFHLqob8L4kvCzOkzMeaXMZCO4T46XtgjXPYlSOoXi0OgLIDZs3S9SXD6u35MSYAEYouAR7bjM3hvvMF+DwPPjwcuGG3j5XNs7NVPostyigdEqQUsYFUuMGapjUExefeHAeSsYBULqHios9YoRIGjvvq9qtWuOXXiUx5w1wYXqtQ7p3xXG+kfbU79tl8qj+Jco2132dJaubOW1dRDUzXNb8t0K2rq4/q7aXSd66N1rlXl57ZVlUb7R7fr2NW1RftVyutlqlRVP8Xy61w/w3GUeiTAoUiABEiABEiABEiABEiABEiABGpEQCIUNfKjhtaJXAAAEABJREFUEwkgGApi6OCB2HuvPfHyK6/jiqtvwLyZs4RMFW8jDeL44vDg/Q/DSBBs1z32wy6j94WR/KMPPgqIOFFSUoI3XnsDWR17ICcnB+f87R8wxqBL117484/x+PXHn6XscWzyhIkICx1+fPT+h07dgCEjMXrvA2E8Sbjk4kshleVmTJwUfbj91jvwr39eDl9iW/QbtJPUefDVl1/J/D7waEEEjGlBi+VSm4SAvkXkY/2hfFXs8oCN5/+wcfU+wMf/APYfJCsKiEUHlsV/5XqDN/8EjugF7NRXKoLiEyunfmZkS1u2owW1LTXhnFsXlZoQCgMqYoiHWy1ZwMAdVuPidvQdG4gcjoMnUqhtInO6XYyb2cE0+pq7Q1U3tuur7Wquv5tqnZrrp/Va1lTNzbup1rmmdWrRZTcfnerY0X7RbZrfVpu216PpUupxOA5FAiRAAiRAAiRAAjtMgAOQAAmQAAmQQF0IWHXpxD6tk8CmomL07dsbJ59wLC44/294T4SIjfp7H/q/UVdG4vHjsUcewT//fZXTcuYZp+GM00+VvIX/++cV+N8TTzj/B/akSZNx6CEHY/Xqtdhll1E45aQTcPk/L0XXLl1E7/Agq302OnTsCK/eHWJ58clHH+P6m26XcYATjj8WfznzdPTq1ROPPPYkLrnsCkDvDpEAXN++fREXn4hrr78JH330KU468XhkZWU5/T755EssnDMPsCynzJcWQGDFStgb8+BEX8GDBCIETCSVj/JnU4GjnzB4/Q+DG/YGPr7I4MDB0l4mYdyqhA3puyHPRlGpQdds8QuKnySxdcom4VrlnUXqNXF8pN3JA8YYXLxHVyxesUG+p7UyYpIsW1eAC96Zgb0GdUJO+/AdgUa+Sw0MQpALISlqcdgyl20ZQFLj9EfVh7hALbp1e+Vo3+i8HV2olNc21yqP79ZHd9E6t+zm3dSt11Tr1DRflUXPtS0/t82gwii27TZUqN6hgseyanUTzg5Nxs4kQAIkQAIkQAIkQAIkQAIkQAIk0EAENFrRQEM3xrCco7EJ6F0bXbp1wdAhGlkE7rr3ASxfvAC+OF/UUjSSE8K33/3o1B2w/3546eWX8fIrL+OO22506r7/4UfEJSfj9ltuwHl//ytCoQDO//vZeP3Nt0XIuAgZOdlSF3R8nRcJjkFCMfPnL8SUKVOxxx6j8cIzj+OFl17BLTdeh27duuKRR0VUCW7pU7K5CEcfdQS++fIjvPnaC3juqcedoebOm4dly5eBAoiDo+oX5a1Wn0G1QAC2Xh8dt+pZt9Sqj9qc+cANInjd/SBM7kZosHSLE3OtloABQhrvFftyOvD2eIOvRQD52yjgjQtsHD5MyFQnfEiTnps2A2vEjhpso3uO1ETdfCClGDwFmqMguKlsUbOShKu1EDavCMnXnzgSL34zG6fd8yV+mLYc305Zind+novb3/0Tp/Zvi8y0ZED4B0U4Ki4JICQX5OvJy7GuoFjqpUHHrWT6+a1s6mIi7rZIKHC/cyJ12u5Y5bJWap0uWfNuqvkdsehxdPzajBXd1+1XVV1027baXT83jfaNWpsrfrip617nVK6Bx2Nh/333gv7Nr/M47EgCJEACJEAC9U6AA5IACZAACZAACZBA7QlQAKk9s1bdo7S0DN27dsFB++8jwsU5eOfdD7B+/Xpkpqdjn733lNiVDQ2cTJ0wSepzHVY333gNEJSgWHAzRu+2m1O3bt0GTJ04CUEJiAfLwqJFOJWIZFnZVgE0j2Vh8fz5mD9/gdP/qn9fBp9PRBe7GIMGDUBqaqpT//NPv0AW4KwDxoPBgwaiW6++ULFj+LDBjo/X65Gi5eT5UjUBW8QKyDXC7DlbXYuqe2ynVgKqePdjmNffhkRKAWNQ7aFt+nsvM2Xut96D3bkDcN2VQO+eMFpfbUc2xDwBedsEQ/J1Il8ZP8wG3vzTYOxcA/kmwAOnAUeOkKiwfH1A2rfHIskP7Nsf2Lm3eOrjsSRpnFM2UR8T1WgMnUtMP1OSoLI5Y7iVTiH8IgFwS75zf33gVLSJs3Dra7/hyud/wUvfTkP7NnH4z4mjMLR3FmAbjJm5HBc++R0WrtqIUGkxnv1qOtZs3ATonFAXI25hk2LU6c4bSWUs2HJxjZgKIVWZtkfXq6/Wuanmo9uryqtvdL2W1dy66DGi67XdLVdOtU3N7RvdHl2n9a6pv5q2a52mWnZN69x8FakQFZY2VPQwRhlKsR5PHVfFrXockkORAAmQAAmQAAmQAAmQAAmQAAnUhQD77DABRoF3GGHrG6BMBIoefQfhuKOPcDb/4CNPYOy48fB4vFKWsIzEIJPbJCMuTiKMUlNQEBUMs8ORSQ2uqVAizeWn7QRxqg/kaB817VBYWChxdA2USYBNAkcarNF6j8enSdikPhjS+cQkoBdk8DzMZVuveg1KSmB+/Bm47Crgtz9gr1sPN5iJuh7CHzntgQmTJWr9PiDvIVsCrFUOJ/NDBDS89BrQsxug77OsTEBFmSo7sDLmCcjXQiBoUFJm8Ns8g7dE+Ji0EIiT+uuOsnHMzvKlI2dNhI8KrPQrRK1CZcMW9P+oDzXWd5HwgdpWW9JK16IazZZ/JdCnDu4+qCP+d9nB+PzWE/DedUfho9tPwv3/2B9Deoj4ob8RIvvYc1AXfHn78XjzxuPw9k0n4Laz90BWW707RILz+n0SNfyWrM69pWQ7RQ8CoVQEgmkI2m3DFpI02irXByPtbhrtWzmvfbWusq+W1bQt2lz/6Dr103pNtd5NNR9tbr2m6q9tmq/K3DZNo019o8ua1zodz24nfFK2AGSOBEiABFoRAW6VBEiABEiABEiABEiABGpLYEu0o7Y96d/KCZQ6j5266MLz8PwLL+PTz7/CrNlzYIwRYSKI7r0HoG1amsPo0y++BDTYLbZhw0anziPRtaSkJOf/XrU1OC61paWlQKBM+odgS4DcwEht+NTYZnx8PNS05rdx4xDQgLjxID+/AMFAUKuRmqrPpFdvp8iX2hCQa4fNm4FffgO++gG49krgvHNhVHyIXKPaDFfBNyjXZ/+9gcv/D5g0CXjvYxiZaysRZP0G4P2PgI8+B84+EzjrDCA7C9D+FQZs9YXWAUC+AspEoMgXDXXsPOCdCTamLQWSPMCFBxhH+JCvEiDQMnDo3WczZ81GYaFsqNGWLBCd79LoNDK5ifwrgJtqtebV9Pc4gvJdWhaEz2vQNTMFKBHQekFE+FBXxzQvdbYIIo5JH1sabP0+kRRbza3rQIXDwHYC+muK98Xqov3FDghbsaTRViRltei6muZr20/91SqPX1VdZZ/ocm39o/tWlZfx1pUcgvzQXkI2CGPCPMN/R8P5CnBZIAESIAESIAESIAESIAESaOkEuH4SIIEdJBCJfuzgKOzeKggUbS4JixMaDA+F0HfgIBx84H7O3v+cMAnLly8XQSMkoSytCmDAgP6awWtvvotVy5Zh5dJlOPbEU526vn16oWvPvpI3IlqkSgpMmjQFY8eOw5Sp0zFv/gJYHg9KRQgpKwtI/DuIzJzO6Nu3l+O7aVMRli1fgbUrl+Px/z2L6TNm4NBDDsbAoUOBYCgsjshKwkEhp4u8aFgOsgdb1ilFnlsIaBBNBAlH/Pj2R+BsER4GDwACIkqpl7bviOkYci3RuTPsi88Hps8EPvwMpqgY5SLIehE/vhPhZW0ucMG5QP8+QFkJH3ul7FqbyV8mialjQwEwfp7Bvd8YfC9vmTS/wemjbRy1s40Ev3yeJR4vH/MWQ0dF3+HD5Duq0VZcg4C4Edi6HjfVfGWzZRz93o/U2/JdUNkiTVGJ9IFaVFUka0y4XhNjJC9mjBGhxXLM77Pg95lKFl3n5sW/3E/yItRoXxVs1KLzvoif1jetQfa4I6acDOTPIzyWB8YY6GGMkbx8JrRAI4GYJsDNkQAJkAAJkAAJkAAJkAAJkEDtCFi1c6d3ayVgSXClZ9fOIlakIM7vD2MIlqFfv764+j+XIyszw6lLb5cOSwNpoQD+dvaZuOqKf6EgvwA5nXujQ9c+OPCA/XDM0Ufi5BOPBewS+OPjMGzoIBEvDsIzz72A3fbcH8NHjcbKlavg83mRnZWJnOz2CD/6qgyjdhqBW266AWN++x39B49EVoceWLx4CXr37oUH770DkDXpQrp06aQJEhMSnDT6pU2bNoiXeVu0ChK9oXrIqwhh//4H8O5HsE88Bnav7sCaNcCG3Cpso9SpSVtBIZy7RlQ8qc6KwyKHM4es1XTrCpz3V2DxItiffQVTKGPoPN+L8KK/O3L8UUDnjhAVS7x5tioC8hdJ9Eus3Wjw53yDR34w0N/6GN3NxiUH2Th8pI02CUKkhQkfsuLwKSJCSMTjcKFhX+3KwxuBW9kq+9SgrMJH1W5GqqNNipVOY4wE6Y1Ta4ymak7Rqfd6vfB6ffLd74fPG1fBvF4/vL64iLl5P3yROp9P8n5tD6e+Snmf6yf12tY05nfWr2txbBtr2bJX3VPYwmuWMYSFx+OD5QgglsMuTJGvJEACJEACJEACJEACMUmAmyIBEiABEtghAtYO9Wbn1kFAAnbt2rXDrTdfhzNOPQk5HXIAqVPr3b8fzj7rdNx796148fn/4cjDDwmLC9LesWsXXHzh3/H8M4/iqccfduyaq/6Nf192sQgde0mAOwgVIVJTU3DbzTfguWcex3NPPY533noF3aRvdvv2uO2m63HT9VcjIyMdCAYxaNgQXPD3s3HPHTfjqScfxROPPYD/Xv8fPPLA3eijdwzIvDrmlf+6BK+89AwO3H8fQH8HRAKPyUlJePbpx3DOX05H927dpD7UOq7f9nYpgUhTUADzxvtA9y4wm4pgvvwGeOUt4K33gA8/LTdbBBK89jbwhtirYl98Bfz0K/DjL9XbT9I2dx4wdz4wR9I5c2HDwB45AuazL52x7R9+BqbMhH3QfkBGu7Co4vHAVrMsOOJJJIWs17Ht7YvtLYeA/CUK2cDqDca54+N/P9v4cbaN0V1tnL+vjYNHAKlJsp2WKnzI0hv3FJjyKXM+J0bgqtVxASp4RFvFYVTAcG1LS/gjasLTS0FOyZstDuW5SJ0uV9boExHDKwKIV1OfT8SCLeaTsk/aos3xjdR5RRRwy1WmIhh4qzMZo7yP4yNCjKcezRF2ZDyZR/fhzCX7cVKp2zr1Y+s6YRHZo0fG88j6PPL9aMn3ohF2xkRYlrOtn4wxOq5a/YxXH6NwDBIgARIgARIgARIgARIgARIgARKoDQGJjNTGnb7NhEDjLkPEg4zMDBx3/LHY94D9kJaWBhUZnEWUlaF339448eQTcNZfz8KwEcPg8/vD7YEAOnXpjFNPPxV/FyFEbZ/998Uee+0BfbSR01/G9sfFYfhOw3H2uWfjbBE3jj/xOHTp1hUdOnXEcScei2OOPxpZIoao4IKyADKyMnH4UUfg7+efiwv+cQEOOPhAHHzYIdBHX7ljHl8nb5oAABAASURBVHrEYTj9zNOx6+67SX1YaGkrIs45fzsHBx16MNJVUJG5Hf9W/qLBTeQXAAP6ABOnAp+JqKFBry4dnTsx7O5d4Zrp2gnolAN06ADnLg0J3qGwCNhUXLUVbQYWLhah42uxrxxzxn/vI5jps8Pvky++hZEyEuJgFi0BvvoWGPsHMH0WzLSZMLPnwSxYGLZly4G8fJkr8hsKEgC0PZYjkEDXrNbKr2eL2b6RlUb+Ai1fB/wx1+CpMSJ8zLMxuitw7t4GBwwH2rURPwofAqHmp1FBwXGPAHbyNXvR74No29JLL1hl29KqOWOMfAyNZNUkQeXUrdN6tUg50k8D+k5gXwP88t3i2Y65IkHYz1uNaOAL16vgUJ3JPO5YXp+ME+UXHtuHHUo90j/aZD5PdHmrvKxBfMrXFMl7HNFDx/LCUuFDzVgwxmWpPOvP9G4lfdxkcf5GyCTgQQIkQAIkQAIk0GQEODEJkAAJkAAJkMAOELB2oC+7tiYCKhaIoOE8lkjz0XvXZ9aIMAERQ/QujXJxRH30jgytd03HCIogoW2u6Xha5/roWNpPTf3VNO/6a17rXH/Nq7ntmmpZ23VcLavpPFqnbZrXOprzGxu23tVz8vHAPqNh52Q7d2fghBOAow6H2X+fcsOhBwEiSEEfU6V2wjHAiduxk2Tc004ETlc7CTj1RJgD9nXmgQTwMGQA0KeXCBt5QG4uJNIIrFoF/PgT8PMvwDffAZ98Cfu1d2C//aEIJN+EbfyfwMTJMDPmwMyaA0fEUSHHEUU8cAJ2DRQYBI+6E9C/OmLL1gPL1gK/zzZ4/jfgJxE+9hbh46+jDfYdBmSkSBSfwkedODv3tgm+2nZW4WNLHxPJaqoWKUYSY4x8xIxTMsaU552KrV6M1LgmWfeMrjIe+TqQwL58fj2WFx5NqzT12wGTMS0r0l/zam7ZSXXuyubZ5no8MkZjmq5f59PUGBeiqfCn10Vc19TId3MXEcHnzpuPBQsXAVKu61jsRwIkQAIkQAIkQAIkQAIkQAIkQAK1J1B/Paz6G4ojkQAJtFQCRkQlu30WcNzRMEMHwTz8JOyF88PbUcGorqaCU7u2Es1OB9LTYeudN1mZIn60h1mwANhlJHDCscDhB8O5q2TAAODIo4BjjgROPA72Scc5IgwOPgDmiINhRu8MZGYCKalwHqn150TgBxFKXnkT+OJL4MuvYE+dAUybDujvk6h5vdC7RCRCG94PX5uGgJFpvcBiET2mSjz1pd+BXxYY/CDCx349gDN2N9hrKJCVJpF7Ch8Cq+6ncQRe4biNIVTs2GIWbOP+64BeKDXt7Kaa32LGbKk3Zks+7KHlyiYt5VWSkTP8eXQy0ghozrIM9DekLMuCZXkqWXSd5utoJqqf5tWc+bbUG6lzzXLaKq+lIctb1hGeu3LZ44gxyskYA+Os1aC+D2MMevbojk2FRfB65INb3xNwPBIgARIggdoRoDcJkAAJkAAJkAAJkECdCVh17smOJEACMUXAEUFUnBi9K9C5A8yrIiqsXgOJtu3YPjUY65qOtG49zCefAQmJwJGHAr0k+j10CDBiKGx9/NUyiY7Hx4tg0g6mbVvYnTvC7tsLGC7R8V1GAfvvDRVEcOThsEWwce5KOeFoEVA6AqVlMAsXAi+/BXz6uQgiXwMTJokgMgt2UVF4LxLY02XQGoGAkTn0r4wXWLIOGDvN4LkxBr8uNNivu8EuXW2csRuw+2Agp60E7GsgfMiIPGtAQD9yUP7iu0XoMCJ0hE2qI2fEySltyRuzJa9NWjTGwBijxYhVzkfKkQSaOqYv2mVbqYGRYD5k/OoC/269p453XFiWB2oe6a+ptUPiRmVhor7K4TVaVnWpJYiElazdmHBeyaoZYzSpNwuFbCxctBBr18mHt57HrrdFciASIAESIAESIAESIAESIIGYJcCNkUB9EbDqayCOQwIk0PIJqAhiJDiIo48AsrOADz+FvWp1+A6KHdyereNuyAU++BjIzYd94jFAxxw4j07zSYR81AigXx/gky9gi0hiS4BPn+nirCkUgvN4NX2kWSAY7tMmGSYtFXa3LmFxZO89gCMOA/YcDXPq8UDXLtDfjbEXLIJ5+z2YL76B/q6IXVwM6F0hVv0GC2uORwL96mw8gBUHeETsqWyWXzxMJdN+alLdnE9dtiULlEu6dD0wbxXwy2Tgxd8Mvp4HHNkPOGKwjV0H2eieLW+BdPGl8CEQ6u+0Rf2wIe8VCVqr+LFlZL04lS2qVfyNMTDGOJXGGCdvjJFyVSbViNRHEqeoLxX6uH6aqrnOkbxTNDBGTKr01TjBfQumHlNLvlPUdExNLUdksGBF6nck1TFd03HcfEOlgIEexhgYEzYt16fJsEhNa4eVK1dCJgEPEiCBJiXAyUmABEiABEiABEiABEiABOpIwKpjP3YjARKIZQL6OKxDDgQ8FsyXX8PkFWCHAmAaSVu/wREiULAJOOUEmByJfquYATk0YJuYCDN0MLByFcy3P8K4Iog0bzmjctLHFUgccUQf05WaAqgNGwJ79G7AwbKHffYEjj0SdtEm2O+8D/P+R8CPv8Kskei8z4cd2hdqcxhAhQ1PAuCYCh9+wJI1VDZPHMI+0b6RvI6hPDXAXZvpq/J1xqmqoQ51Rvp4gE0lwMLVwE8ierw0BvhjEbBik8Fh/WycvbuNkf1tdHJFD9G16mMbMnOLORW5WoMvWPQPQC9KtCHqMDCmokU1RrImkmoSnZeyFh2TFxkHkLTcUOmIbpO8nOUO0Xm30hnPLTTXVBe+xYwxMCZsQDg1puFTNOhh0Kd3DxhjGnQWDk4CJEACJEACJEACJEACVRNgLQmQAAnUDwGrfobhKCTQyAQ0IBNtDTV9VXNY8rHRuxmi2zTfUGtoqnHbZwJHHArssgvglcj2jqxDmJkJEhHPF/Hj9JPg3F2id3NEjal3eiCjHWz9PZBZs4HxE2D0bo3asI2IIiqIGB1fxBDTNg0YMgjmsENhTj4B6NwF+OFn4LW3gO9+AtbnAg0qhEjwUEULrwoYImxYKnh4AWMBoSJRDKYBqz8WleBtWcu3QOkKAAHAEublJv5OP+kbLY4YGaOuCoIxKMjPl7l24DTSV5cgy1udZ/CdXOLXxxh8OAUYu0z0p74Ge/UCDh1iY6c+2CJ8OMF56dvqToPCwk0IqFgn/Btu+wpYbcsMxujFCpeNMRLUDuerfjVR1ZoXkxOOyYv0R7iA7R/i7zppP7eoqZbLx5EKWXL4IywZtw/TJiNgWQajdhreZPNz4koEWCQBEiABEiABEiABEiABEiABEqgTAQ1d1akjO5FAnQl4JVrqCgjbGkSDY+pnydtU8wDUPRAIYmPuRvzyy6/444/x2CQBRa2vd5M5N0sAfu2atSh2fz9CJlm4aBF+/32cU6ftxeJTWlICfeyMNAPST++cgK4b4SMgAU+1cKnSq/opEw3CR5uOU8m1cYsSkMxID//+RoIE7zUyWccF2HYIGNAP9lmnAFmZUIFiq6F0fL8fZvBAiZgfCMxfCCxeioqP8Nmq17YrdEzX2okQ0q837N1GAWefAYwYBvz4C/Dy68A338POzYM+Gsu5ftseteatxgKcx1uJ8GE8sEMFQJ7MufxV2dszwBKx5Y+KAHINsOYvwKrbgaX/k7angSXR9iyw9EURSL4U0UTGkLGggoiMbVvxsh4jVvuzqKgYtvKpTVedSrYF+Rivl6VMWQx8Owl44Wcbv0l+SEfgmMHAmbsYjOxto2MG0EbePpC3AFp5XFsfS1VQUCBvf4VRG+i1890yupG3c9h0BGO25LUMGGw5NO+a1mpeUk3UJIsK/qjmUGcxmQuOiZubShaQtnJDFUcrf5NUQaSpqowxSE1NxcrVa5tqCZyXBEiABEiABEiglRPg9kmABEiABEigPghoGKs+xuEYJFAjAhps/eLTzx3horSkFJAAC6o6pH7Dhg0YO/Z3zJ41ByUiMLi+Xp8X06ZNx9wFCzF+/ETMmTuv9kHcquasok7XO3XGDLz17of47dcxeOXVN2VN46GB4zfefhdPPvMcXnntLXz8yRco2VzijLBx40bMmDYDK5YtB0TAKSwsxK9jxmKurBNWxY9cKBTCrJmz8O5b7+Dl51/Gi8++iNdeeg2PPvw4VFhx9+wM3BQvEhx37syQdEemNyEJ/XZoD1Od+OEOrvOoCDRkEKC/CVIq7xG3bUdTHTsYhP7Gid2pA7DrSODvfwV2EiHkh1+At9+DLe8rRL3XdmhK45HrL5F/S5QCW94b63+GWfgQsPxBYN3VQO4lwEYRPIq+BWwDmD5AYBVQ8IK0XQ9suCLK/g9Yf6EIJPcCix6RMd6CHRTBRuYwHj8ckcXoe6t2wWNjjLzFDLZ7qIsOL1vJLwL+XBQWPZ7+AfhpnsHCjcA+vQ3+voeIHr1sdMsGctpG1qLR+Eh2u/PEsoO8/1JTUzB8+LAG+75y8RmHt4DX6+ZWlqduZXQayWsi7wmUp05GerqpZCucbn0kLe+rTpE6ZzC3rGk1Ju66bP3OVavGqzVXN8neVbhX0Q7l1xE8SIAESIAESIAESIAESIAESIAESKBFEdCQVgtaMJfa0gloYGv8hElYuXwFNPhf7X4kkKYCwIJ5C7FqzWoEA8Gwq9eDstIytEtPR7/evbDfvnujZ4/uMEaiZ2GP+nuVgGVCYiKGDBqEnj27Ye78RZi/aAG6dMpBSnISOmRnY4HU9e3dU9a4BpasTSLZUGFnjqx74aLF2LxpEyZNnoo//pwo+5XwnkciyFFrNcZAg6I9e/TA8J2GYbddR+Hrb7/HpoICxPn9Mpz0qb8dNelIKoJI5Hf7axDuUBFE7wTp1QNGy9vvVSsPI8KTzmHntAd2ESHk4vOAzh1hnn4R9tJlokfs4PtJxQhPHKBpyUpgiYgeq+4XcUMEjNIZANrBETyMKAUmCYD7VewDTFuxTmLdokzEEUcgWQHkPwysuxNm0T2w134F51CRxZMA25L+qMf3jJHRRccpLjX4fT7wzWTgsW8Mvp0pGkwBsIeIHqeOtHHCcGCkCB9ZInpY2kdi7/W5DFlFTJx+nx+pKW1kL/V4jWS0ymdI4NsqqlVugInUuKkUNeuY8yIVempeU9eiy5p3TdrdrKZShDNHeQHVHibi46YRR/0bUaPviYg/k4YloP/zQX6+fNgbdhqOTgIkQAIkQALVEGA1CZAACZAACZAACew4ATfqtuMjcQQSUAKWvKXUNF+lGXi8XlhileJeqHwYCaTp/63vE9HA7/dJs40pIiY8/Nj/8NNPvyIrK0uEie5ISU2RtsjpkWitjI1os2RNkebaJBqIWyrB8PnzF2DUiOEYMKAvMtqmo6wsgA8++hwey8KgAf2RmZmJuDgf/PHxgAS8ExMTECgtxf+efg6PPfkMPv70c4wXAeTt9z7E+LG/i0BSIn4Gehhj0F72MXToYHTr0gXffPsj9t9/X1xw/t+ciq0GAAAQAElEQVRgeWQv6tQazZYAcVwcsIOP3tomOpnDEUJEaLIzM2D22RP2Vf+E6dhhB0UXubaWrN3I9du8Clh6D7DxMaBsNmBU1PCj7od8DlQ00d8IKXgBZpWMvew5OHeOGAvGeSSWzC0B8DrPYaSnLF01mcXrRPSYAtz3GfDZVIM1m4Bde9o4bw/g2GGS7wWkpwJpyYDHkn4qfEjCs3oC+r1Sfes2WmrRZOTjA+eZY9rJyItrUVkjdWryPQvHUOmQ9go1WlaTSk1cc/q6BU2lfVunM2fEQfPyOYSTRuoksXfk/Sv9edYPAY/8Ddp9111QpI+ArJ8hOQoJkAAJkAAJkAAJkAAJkAAJkMD2CLC93gloyKreB+WArZSACALLRDBYs3o1gsHIHRtVoLAk4GWMBMqcIF2Ug/SHBFycYJhWi09ZWRn0jpFHHn8Kl195Hd555wOM2mkYTjj+aHTt0ll0Di+i/2/hP8aOw3tvv4uP3/8YH4l9/fmX4UdR6dg6pprO4fMD2zEjgXGvCCnTp8/EG2++i0WLFuPzL7/GZBFhVPB478NP0KVLJ3z59XcIlsl+ZY4yET6miP/b732A0bvtihOOPQojRgzD6aechFNPPgFjZH3aPxTFx/J5sW7dejz97Avo1as7Djlwf6RmZABeH8pZoBUe8j6JvrYNRkDmcYQQFVuy22NHRRdb3gewvCJKbIS94X2gUAQKpAFG3nOor8MCjLxHgsuB9Y8Ci+4E8icAMDB6F4iR+VGHwwBL1gPfTgNuedfg4e+ACTLFzj1sXH6gjWOGAqP7Gqjg0SYR8HrkQ6yihyR1mI1dGpCA854Olcr3owiu+gg2x6SsdY5JfaiyabvWaVomfTUVsyuZ00/rXB9JQ1WY0y8g46iJv+Mj49tS1jFst0+JiI6SVx7yeaT+oSCa2sIfan+8H8bIFwNUFW3qNXF+EiCB1kiAeyYBEiABEiABEiABEiCBHSVg7egA7E8C5QRCIef3MM678FKsWbuuvLpypqr/A1pjXstFPBk7Ziw2FRZCIi7QkIv+fsaqFSsxoF8fXHbJhbjy35dg9912RUZmBlScQPShHVTcgOXEz4IiMnz57Q+YNXsOYIXf6iqoTJowEVddcbWIKKeIKHHGVnbSiafhgvP+gW9F7NDHUx1/3FEYOLA/EuMTcfN/r8PBBx8gQkUPnHbaqY4IM3hgPxx99OES8A44QsbSpUux2647Iy0tDVOmz4A+6qtHj67o0b2r02/ytBlYt16izLomsVkimNx6xz34/oef8O33P+Hx/z2Nf112BW675XYUbSoCnOATeDQ0AXkTOkFjSes8lVwrY/nD3UtyYdb8GzAdIW9AsUqnxhN9NiTyi20eOpwfQOVU+3q1UoLJhR8Bq58CNk0HjLzXdQ3GoFaHuM9eaXDNxwZjFwPDuokIchRw8d7AfgMMVPBIjJdlqOghy3Y+ZLWagM6NRsAOojCtO1Z2PQHLcg7D8nI7VPJbbFn2IVBbnuPWHeK0L8s+WOoPwrL2h0iqpuVok7r2B2Fp1oFYptZe0myx9gdgmZt3yjqG1qlJvkKdlLOkXup0/rXZu8EKBRzNk3eANNo7pfqJ5DPu9fmwu/wtmzJ1OhbNnQ1Y8t1SfQ+2kAAJkAAJkAAJkAAJkAAJ1A8BjkICJFDPBPhfs/UMtFUPJ+LDqJ2G4uILz488575qGkEJMBtjUP6Ieum3bt06PP3ci1i7di0k7uJ01CBY29RUHHDQfth9913RqVMnJLdpI8KHB06UzPGKepGOI4YOxlFHHorDDzsI++y9Bzp36giPZ8vb3CcBnUEDB+C/N1yNl5//H557+rGt7MVnn8AD996BvfYcjcSEBMd69eqBjIx2eOOtd/HJZ59j7Ng/8Myzz+OjT7/Ajz+Pwbhx4501rVq9GqFACMcdfQQSkxPw/PMvIyU5BX379BEdwyCjXVvn7hgVYoJlZfj0sy9wwcX/wuDBg/H6K8/hztv+i/9c8U/cfsv1SE/PwNXX3QTonSBR22S2ORMwgPECZWuBNY8AaCfmE4s65e2LBIMvf/Li7qf8WL9B+8ibN8qlPOszGHJEPI46Lx7HXhCP4/8Rj1MuicP51/rw6IteTJklfb1iJlnEj0+ADd/BDm4ALC9ssfJxapKRJfTKsvH0qTYuP8DgsKE2VPBQc+70kPbyD2dNxqNPkxGwjAV/YgoSMzoiKbMjEitZktZndHDqkzRN74CEdtlIkHxCuxwkpueEy+3aS5qF+LSw+SWNS82EY2mZ8KulZsCXkg5PG7GUDHhS2km+HbzJbWGJeZLSnLymrlmJqdhiKTAJKbDik+W72gNjGeGmJgnPpiVgDOL8cc4jsEpKSyB/xMCDBBqfAGckARIgARIgARIgARIgARIggR0jYO1Yd/YmgSgCwSD223cf7L/fXkhMTIxqiM6qrBGCJUEurwgf8HqxbPESXHfjLcjJycHo0bsjOTnZERNEJ5F4i0Gczw/HV4fRSk0lMCONmqtgHhnTKyKHpnl5+WiTlITklFRnPNfRK3MmJCQgQda4LfP5/ZCIHOYvWIR33/0Qubm58Pm82Gn4ThjYv5+sM1Hyw9G5S2dsLi11hi8uKZFlGREv0hHvT8DQoUMwaFB/eOPjnDtBli1bifS2qUhJkaCf7KFzx4545YWnsPPI4bj73odwx933OwJJvKz7pOOPxsOPPi7jGkBeebYEAp7wIsuKgdwH4DymCpFD3vN6F8f4KRZOvNCHQy7y4qqHQthYYAFGDFUcxsbUBWX4+JcyfPBTCO/9UIY3v7Hx1PsG/3e3F0NP9OPxV+IArwFMO2D9VTDrxkEPY0m9iaxHK2pgqhUmSLc4nw3NO4KHXYOOdGlWBIxlwS/fOUnyXZrcJkW+q9psMRGRE9skIyG5DZLEEsX0O9dJE5OkPtmxxGRN2yAhqY2IuZomIykpWcpbLFH9pU7rk+Q7Sy1Z6hLluzUxIQmaT5JyfHwCEhISHUuMpFrW+vj4cL3fHw+PfNdbsnbTrGi24sU4f29t+TPthUf+trZiEtw6CZAACZAACZAACTQuAc5GAiRAAiRQrwSseh2Ng7V6AsYYRwDYJgjbcm7gmD5jDm7+7204/uQzcdAB++PM009Bu3Ztw2KFBF7iJYBnjEFuXl54TG884JPorATJNhUUYtOmTTJOJDorfqJOhNu9fkn9WLN2rYgfKcjJygQsqZPAWvm6ZHzpXD5XlXlxDoqwsSF3AzZv3oy0tDRYMCgrK0EgEEAoGJJUhA8RfowxkAgRsjOzMHv2HBx65HH47IsvcfSRh6Jrzz4o3JiHN9/5AO9+8CEGDxqINqmpsGQ9Q4YMQkZGOvQ3Qy664Fzsvcfu+Ou5FzjreuzJp3HVFf+SVUT2KDmezZiAvgf0PapLDIkAoqmaiBgqfKxeY+P6+/wYdbof73wH3PD3INZ8F0LPrkEgVM01lreXPTmAsJU4adHvpVj9bQkmv12Kl28JYI8RZdLfkpnUOgMb7gcK/pSyQa3vApFeFD0UQss2Y4x8HXnhle9Kx/xx8Ir51OQ71B+XAH9cfNhEnPBoXlJvfDzi1LRdUvXRsl/ycdKuabyIx1qvpnVqPmnXsppP/aS/T/x8Mq5Tlrxf6jXvlTonH0n90tcXFydf3z54vF5ZtwdGxEL9igaPZkDAYMxvYzFjxkzAGDTFwTlJgARIgARIgARIgARIgARIgARIYEcIaMRsR/qzb+MQiKFZDIqKC3HYEcfhqmuuRb8+vfHtlx/j+BOPRWJiAhwhQncr0a/0zEwMGNAX74hwkJCSJbEXn1icWDw69x2Mn375VQSIAKQC+rshd956F3r1HIDhQ3fGiGG7YJfR++LkU8/GUcefgquvuhozp0sAR0QH1PQQ35mz5sg8v2G//faWAKIPxSWbHUEmr6AAeXkFTr6wqAgIhQDx79GjG/7970vw0vNPQR+z1bNHd7z4/LPIye6LDRs24MF770TfAf0BEU3cZXg8XvSUftfecAtmzJ6LWXMXwHiTsXz5Ctx59+1AmUTBXWemzZ9AyVpgyenyfpDrbGyUlBi8/4UH2Qf4cOuzBgO7hjDzgwBu+mcZMtPlfVP+LLhqtqbtUZYQbyMrAxjSFzjjmCCG9JN+roBi5DO0+WugaINUAkaEvzqJIODRUATkqw36iCr93mqoOaLHNcbIVGGTDBwDJAnXGWPkq8uKmEdSMY8HHvle0rvlPF4RJjTv84lI4ReRwgef379FXJF2nwgtPr8/Ui/tUvaKvyO+SN4npnmf1Pn8YT+fP5x63TYp65zGWAAM4ChxkvBsUgKWZbDP3ntBvqmadB2cnARIgARIgARaGQFulwRIgARIgARIoB4JaKShHofjUCSwbQIaTLn91ptE5yjGF19+hpNOOxHJbZLhCAIaGYzuLiLB4KFD8MJLz4p/SQXbsGY5Dj3sUCfgJg0iniTichEeZk8fj4njf8aEP36CXZovtgHjxvyAW/57Dfr27QNHqIieY1t5ETWyJNJ84P77op/0TUpIQPv27dG9Sxfsv+/e+Oel/0DXTp3QoUM2/PGJ0HXocPo4mW7duyE1LRWaP/aoI7BqzRxc+s9LkNk+C85e1VFN9uzz+/DXs/+CB++7C4MHDsTLzz2FzQVr8eRTj1P8UEYtxGwncCuLtYNA8Z+A8UMi3Zg2z4Pj/mVBCvjx2TJM+6IU/XqGANW1VNiQFohQokkFi67TvJo6aB/HZAyZCq74oW1q1lBg5UHA+jFaAowXcALKqPKw5T1YZQMrG4SAT0SA38aNx7qVq+QtYRpkjvoe1Jgt6zTGwBgDvYPNMRFLLI9Hyh54VCgRQcTj3MnhE7HEGzanPpKXNsvjgVf9nHqfk7csD4xlxCwZX80gfPC1qQmE5G+h1dSL4PwkQAIkQAIkQAIkQAIkQAIkQAIxTqDhtsf/pm04thy5OgIasC0rA8pKxALlwkGV7iKCOHdAOL7qH2WBLX2NMfBKYFEDb+FxtgTPLMty2iwJrqE2hwSGs7KysNOonWAsC/0G9MMVV/0bO++2C0btMgojdx6J3fcajZNPPQlHH3MEoOvR8aUfJGAE2acxBimpqdBn4zv70Hr1iTb1l75JyUnYdfedMWTYIOcxNI5/tB/zzZqAMb7w+kLyvnTffvIe6JYTxJ+vB1AwpgR7jQzCLrYBFS7C3ghJvqzMVPz/3T3A2EletN9FxvTZ0Pag+MCSviqEiBUUWli8XL7CJR8ZaktiJ4oIMwsIbISxfLAluLylMZKT912WCHLGuIuN1DNpGALy2c/skIORI4bK+AYa7JdMzJzGmPK9GGNgyfetZVmSiongod+hlrwPVSRRszweeLweWJ6wue3GGBFA9M+CvNfBozkQsCt+OzWHJXENJEACJBD7BLhDEiABEiABEiABEiCBeiNg1dtIHIgEmpqABHTduzAqLKW6+gpO1RS0r4owThoSwUaEGy27FtDodUACzWLVDOGsH4URVwAAEABJREFUSftX1+7Wq487rubdeqYtgIABjHyd2vL+KJoseYQP2yC9nY0Rg0MoKja4+v543PtiHDbmS7MEiOEP4b6X/PCPNFi9TvqrwCFN8AD3PO/FmhKD3PW20+4dGQc7YDliyMo1FlJGGzz5tk90N5lb+0Sb1RtYey5QMD9SK2NHchWSFvA+q7Dell4Q3kH9jLf0fdRh/cYYETaM09MY4+SNfGYsVySR1JhwvToZYzShNTkBg/i4eDjvW16SJr8aXAAJkAAJkAAJkAAJkAAJxDIB7o0EGopANVGxhpqO45IACZBAjBIwoloENwOF3wOmC8oPEUH0jo+kBBt9uodw5UM2Js7yYHOxjc0FFsoCGlWMg0fFD/d/epdAec/OIrjBYEOuhf87xSfDGVgj/Lj0Ti/+J8IH4Ed6mg2vH9UfoYDTZizpb/h178DgCwmQQI0J6F06Q4cOwsLFS6WPfldJwpMESKAxCHAOEiABEiABEiABEiABEiCBeiLAiFg9geQwJNAkBKr6v6TdOk1d08VpXlO16HxVZa2LNvWPtug2zbttmq9sbpum0W0S5K/27piQBP+1HdJB86WlgKY6hlpAAvtaluYKp9ZpP/Wp0NBYgTtZd2i9zBwvFnWKCJKUYmNInxD2HGJhv/M8+L/bfdj/3Dhc+1gIXz9RhrZtov2BYf1lLKmaMs/CwzeV4O7LynDRCQZzFnnx/e+W5G0M7y8cxKfK07QHNv0IlK0BHPGjsRiABwmQQKwQEFE2FLJhWfzXxVi5pNwHCZAACZAACZAACTRfAlwZCZAACTQMAf4XbcNw5agk0OAEbH2UTnExYCKBbU1VGNi8GXZQAuPall8ISBl6aKoCgfjZRUVaA6evlB0fTaMNkUP7bNoEFMhYrpWVwemrYoPOWVICFG8OixSIOtQvvwBQW79BgvHSz23WfhtyZX3FsDW45s4dCgJ5+UCBzKnPnlefBQuBwk2wtY+uZ/lKYIOMp2Vdg5rsz161GtB5VDDRNh1T01JZn86rftpf8w1hOv7mBTKyT6zSGTDYaUgAD19bipvON0hJtjByIHDlWQbD+9nwxom/CCXyKhwt7DUiKFmDz3/2AEGDK/4ewCPXFOOey0tx35WluO3SEuw/WnzkFMetT5MFbLxK+K512mxl4eT4QgJRBOQ9a4tF1TAbYwT0+qrVbVs2QvK3JqCPe6zbAOxVVwLsRwIkQAIkQAIkQAIkQAIkQAIkUC8EKIDUC0YO0lAEOG4lAhq8z90IbBBbuQqYMQv2xjxA60ScsJcuA6ZMBRYtBabNAGbOBFQ8UEFhupSXrYD2NeMnS5oLR2hQ8UH76NjrNoiAIPU6pgbM1WRc/PYHMH5C2H4fD6xcDSegrgLH2vXAwiXheVW00D66bE2178JFwB/jYf/wC+xcWau2ubZ8ObB0JYzOp4KNBtnyRDBZuFjqpU1ED+SLGBIXDyQlwqxYGV6z+uRKvZbFx1bxQ/ZpZs0FdD0qkMheHaFn7TqHhyOyqDCia1ABSNfnrqO+Ug0kh2YDppqvVhFBhg2wcYOIF3dcthm3XLIZd/27BOnpomKEbJQfku/ULVx++oOIwFVmYEQLGT4whJFDQkhNkXbpBkkQkPlCBjBaQOTQOsmWV0lZijybnoAxBvpP069EVqBrEZMczxglYIy828Tqsj2986Ndu7bIy9PvblOXIdiHBEiABEiABEiABGpMgI4kQAIkQAIk0BAEGBFrCKockwQaikBQIt7zFsCeMg2QFBvzYSZLfpYE3UVMMBrsnz1PxINlIhSIkNC2HRCQCPhcqZPEniGCyJjfAb/HETEwVsQMFUDmi0ihYsaCBXAEExEQHIFD96FzBspgZ2UAmZmA3wdsLgE0oObxSAqgIB9QP0/UV4qKAakpwJBBQK+eMAftC6NjiLtzlpSG7xpZJULO4sWw9S4RvVND97A+F/aaNcAyEUE2i19iQth3nYgtInZAf9siSepWi8+qNTDBEIywQJrM17Mb4PWKkLNe6vJgSxvKArJcCd7JXm0N5C0QwcZZRD2/yBQwwglynSoPreKEmogbKLPh9wMpyeJkSycVLyRb4dR6p0La5XSyWqdDO2YB+TLA+lRgVVvYa8U2i1CkczjO8iLXHEG5VpI1MM6rvPBsQgLGGGgwubRM3tfONWnCxXDq5kygWazNK9+lQwYNQlC/35vFirgIEiABEiABEiABEiABEiABEiABEqgdAYmg1a5D43pzNhIggQoEJBjliAnts4CEOBEiioG0NkCnjrB79wQyJPguooTJTAfi/MASCfQXbQJKA0BWFoxf+nRoD7RLA4YNhi3/OL+t4fMCSUlA/37ArqNgD+oPo3eEOJNL4DxO+qWkwInYqxghQVypBVTE2LAxLE507ABs3gyokCL9nDsuliyDIzh06wo7VQL10g9qOraILNBxB/SHI5LkZMua44DMDGBQP5iBUu+RdSXGw+mjYkd2e0D255g+6iqtraw7wZnXVvGjreyraDOwZq3UizggazJ2KCzO6F0fm4qANlIfKgM2FYbHRX0e8pXq6wvnt02ih1WBY5OsM1cY5Mn10nxQfKN9KudVvHDrokUNt65QrtcMYTY3S4SiNJj56TCLhV2pD4j2D+bJeuT6V3dXCng0JgENKM+YOQsFBSJQmsacmXORQO0J6NdQSL+va9+VPUiABEiABEigDgTYhQRIgARIgARIgATqn8B2InD1PyFHJAES2AEClnxkkxIloG3DtBcxoI0E01X0SJUAOCSaqkFVFQ309zj0/9ht11ZEBX94Qv09kEIRAAYNAPRuCREEjIgJzrPh1V8FhXnzocMg+tC7OoKh8OOnVIQoFOFA7wJRH71LY9EiQEWNEhEVpkwXYUHm0LJabi6M/obHsuUw+ngumcP5HQ+9O0TvGvF6wuLEytXitxF2iYgX+jgs5xFXIqwEA7BV7NF9dO8KdJCAv959ov1hwVahR0QOFV1M27aw9TFak6bA1nXq3SK5MkZiIvQ3Uez5C4CiYhi9K0XEIJSIKIB6PnTPvo4yqOxDXp1TxYgiuWbzM4FZIlDMknSh2HoRlAIi8DhOVbzI5fzPX0JOQ+5qSXQcSZxT+62TMfWOEI/4yNsCXkk3yrVemwao4OI4yktIBDBb9qprkzGlhmcTEvCJ2Jgq70EDs+1VsJUESIAESIAESIAESIAESIAESIAESCD2CXCHDU5Aw2YNPgknIAESqCcCGvjX3/MQMcHW4L7egaFD6yOqnEdIlQJpqU6gHyqW6F0bRkSGUAh2QhxsCb5ChZG+fYC164DUNjAimNj6Gx5690ahBMsXLAaWLAUCEjTXsfVOksR45/c7bO0rggI8MqYIG444oXdl6LrU9LlOkcCucwdJn94yjgTmVdDIE+FEhBanXteWLWKGVwL2ug8VZ0pKwj11fJ3TSIA4PR0mIQHw+XQlwKo1YYHFFwd07Qyje9UWvWtE1mH0jhARTEz/vkCnDlBhxBYfI8KJSUoGcrLg3HWid5voXTC6Zu1fX2aJoBE/CAIrPKKKFiV+YZ0CFMYDlpF6CyiQuqXtgGKpUx+pLT89kvPaKNhgo2sHYSdUXvtUxpVTWsKnLUmJOMpQ4TGlrGdIKorEsUzaIuPaRueQst7toz60JiWgbzlHdGzSVXByEiABEiABEmieBLgqEiABEiABEiABEiABEqhvAhItq+8hOR4JkEBDEXAEiM3FQJ9eQFoa0D5TguibAb2bQ++W0MC+3uHRMQfo1QNIiAf0kVVZmc5TkYz6eyQYrj82vn490KO7BOtDzu9zQAQEW/sXyfgqrGikVkWQjXmw27aD2WkYTNcuQHyizCc+ZWUwegdKx46wRaiA/n6Hig4iljiPgNL+bZJh9+0Fe2A/sb6wO3eEI2aIuGF36QR7gNSp9ROhRNeWmARnTz26wdY6WbfDUscSEQfGEhGjPdBP9i/iTXmb1wsYERdE6EDvHoDMY/foBn2clt7l4uxN7yDR/jqWa6ivQxQJ/V0SKwFI2k0G3SgWOQulbnUioHdqRKog20CJvATkWrh1mkrx90le/DzOj9c+9eHCO2RfIlzMXyq+2u6aN4Bg+iYsWRPEzOUlgCOsSKMRs8VXTbJ6Gm87wPjkOssa5QQPEiABEqghAf1KgXyl1NCdbiRAAiRAAiRAAiRAAiRAArUnwB4kQAINTID/WdvAgDk8CdQnAWMkHJXeDnbP7jAqXvTrI+KDBLhTU2EnJsJkZsBWEaJzJ0DFA/2NDRUWunUWsaMrMGwwoHdp6KOnOnQAZCznTo9RO4UD5L17wu7fB5DU8VOhwOeDUUGlfRaQlip92gL66Cl9LJUKJNlZMCo6DOwPR3QQ//I9S3+94yPa3LboOs2XiybqEOnn1GlZTUUO3YuuQTmIj1ZvZeonIk/5mOogvk5Z8w1ldlBGluvjywRCki0/5WvWFSSkGZa86Pp94uTRPuWOgAe49iEv9jonhEffsPDyrUF8+nAI558oftG/GeKxURxfhHs/zMMXUyOPHNNh9A4Qv/j6AoA+HstI4onTFkEp84EKiAOjSV/0GsiF0fdAk66Dk7dqAvo9pHfiuSbfmc6dfZrqd2jEjDFYtmyFoy+3al7cfCMS4FQkQAIkQAIkQAIkQAIkQAIkUL8EJDJXvwNyNBIggXogUN0QGqxKSoITzLcloO0TcaJtGpDSBkYEEMTHh9v8cXCCWRnpQGoKoEKIBLKg/UUMcOq0TfM6V6Rex3VNIuaABsHUT8Z3Hp2VkBAWWNq1hTOW9tUxZB0aIdO+WtVgpnOpNdgEOzCw/s6Gdvf4gDanivJQrCUxuU4RRaSoxMa4eUWYvqTUuYMDCSXiZ8Qncop2ce/lAYx5EXj1rjIct38pDtuzDH17yxghDZyLn7Gdm23e+d7gkT8KYAWlXpohfZEqc2YUwrnbxM4FUm6EiZNr5XQTP0l5NiEB20ZCQqJojgGUlMi1h2nCxXDqeiOg3591MUds8Mj3bG3NK322Y/q4Q/1ertL8WLdmHZYvW4YVy5Zj5fIV+POP8Rg/7g+x8fji08/x5Wdf4MN338cbb7+L1998G107i4hOAbXe3jIciARIgARIgARIgAQqEGCBBEiABEigQQlYDTo6BycBEqh/AhJErTColqPNaYwEu7eqdxrhiBvaFiluM1E/NXWS1BE5JNUiLZpAhLkvFci4AAjNCTcmiSiRLhYyyCuy8d64EtzyTh7em1iA/M1lgDfST71FxBg2MIDdRgQxpJ8N1bScGLnUa7P6BgIGT73tx9k3Gpx9lIXj/rIJ6L4e6LUB6LYOSJKy3v0RWiJCzL5AXA6gYpmjkDij8KUJCcTH+REKBR0RxBER6xI4b259nED+dgLyKqbW1aoM4vvgPE6vydv8WLxwEZYuWVorW7Z0GaZNnorffhkj9lutbMxPv+DDDz6q1j6Wtvfeeh9vvvo6XnvlNbz68qsV7PVXX8MTTz2L+x98DC2M09AAABAASURBVPc++Cjuf+gxXHTp5bjr3ofEHsR7H36Ct9/7EO+8/zECpQE88cj9OOKIQ+CI4I3w2eEUJEACJEACJEACJEACJEACJEACJFCfBKz6HIxj1RsBDkQCJNDSCIgoZAdLACOB4IQegC9RhIeACBBlQJf1QMc8tM0uwTGHBFGWVYKTbg7h0dfjMW2WR/wAFTdgRAxRscM1FTK0TkUSy+Drn7x48s04/N/dBn8/Brj14lJ07lkCZIj4kSWWVCwDyWmXAgnHAonZUjBASNbgiCBS5NmkBILBENZvyMWSJcuxTALnixctxuIWbEsWL8HkiZPw0/c/4OcffpS0/kzH0zsR3nnjLbz75tvQ9O3X30Z92RsiDrzwzAt4/tnnw/b083jmqWdqZc8//VxYRBAh4Y677kdN7c6778c1N9yMc8//P9x061245/6Hcfd9D23X1O/Oex/EdTfciq+++haff/H1VvaZ1H36xZf44OPPMW/+QmzaVIzCwqJyy88vRFZGJk456Tj89cxTceZpJ+Ppxx/GzTde49h1/7kc119zBW6/+XqccPzRGDpiODp07CjfI6Em/exwchIgARIgARKIYQLcGgmQAAmQAAmQQAMSsBpwbA5NAiRAAq2KgHEfgxWXBbR/FwjOCO8/XkSKnPWI77MeO+2xCQ9fU4qbL7Bx7WMh3P6UDw++Goc3P/EhWCZihV+CjD4bUPMDm0sMXnnfi8de9eG8G30ifgCv3hbELRcH0CFH/ILhKaBiiZoW7ZlA27NEAOkmJfFx1yUlnk1IIBRCnz69ccoJx+G+hx7BDTffjhtvvqNF239vuQNX/OcGnHH2+Y7ddNtduPeBR5yAvgbra28PR/V9BLfdeR8uu+I6XHTZVXjznQ/w4y+/4oeff6knG+OM9/PPv+GHH3/B8pWr4PX6YVneGpttDEaJQDBC7J+XXIhLLj6/RnbxP87DPXfcjPfffhWPPng37rnzZtx75y3bNe3zwD2346N3X8O1jlBxpYgVFe26a67ELTdei3vvugUXnf83nHrScWLHV7BTTj4eo0aNxJBhQzFk+FAMHjYE/QcOcKxLt67o2q0bOnftguQ2bYBAAJD3bhN+cjg1CZAACZAACZAACZAACZAACZBAzBFovA1ZjTcVZyIBEiCBGCegd4GESgFLlIvUIUDK3wA7N7xprwgbCZvhSypFRxEu/u+0Uvz2UggSP8U/77Vxyn88uO0ZPx58Jh73Pxvn2APP+nHnM3E483oPLr7LxuH7BrH08wCO3i+A9u1DqPKpVnr3R/yRQFIvwMSJD+/+QHM5bBuJyUk47tij8PzTj+G6q6/ADdde2aJN9/C/xx7Aj998hh++/hTPPfUYHn3oXjz28H07bDrOKy8+jd9+/BJ//PotHr7/Ltwgwf36YnbzDVfjrttuwp23/Rd3ixhx0QV/w4nHHYWTjj+mVqbX87ijD0fv/v3Qb0D/Gltf8e0rfXr17Y2evXqhZ++aW/eePdChU0d0rMbCbZ2QnpmBNikpSEmtaKlpqfLdJOJoUBTUyqZih2vynm0uHx+ugwRIgARimgA3RwIkQAIkQAIkQAIk0GAEKIA0GFoOTAIk0PoI2DD6uCndeFw2kHkewj9IHtAaCTiasIVspKXZ2HlgEA/9pwwrvgriz9fLMHaKjX/eb+Pf98Oxf91n4+0vQ1jyeVB8Arj5ogA6dQwhKVGGk7ilvG59hmYCaX8FkvtJmy3zReaWUks4Y36NEljWYHT3Hj3QQ4LYsWAajO/eozvUunbrii5du9Sr6Z0IajkdOyAruz3aZ2fXi2XJODqemo7Ztl1bJCUnI7lN7S1J+jl3SlQWE2pUFjFT3hfOXRYNkaqIUZXF/IeNGyQBEiABEiABEiABEiABEmjOBLg2EmgsAhRAGos05yEBEmgdBOwQ7GCx7FW+XlN2AnJelvx0MQlyymv5GTKwPEBGuyByskMY3jeIV+8MYM13akGs/S7o5H9+KYDOHQKOT7s0GUPEE+dxV6jiCE4G0h8FMg8A9LdIgmUigFSnlIBHUxHQYHRDBLo5JnZIRNDrsiPWVO8nzksCJBALBLgHEiABEiABEiABEiABEiCBBiIgEboGGpnDkgAJkECtCcRGBxMKiAhSAhj5is3YG3bHbwB7qlgVd2PYBhBRw1gGbVNDyMxQCyAjI+DkHdHD8RE/TVHNERLxI/MFoMv5gDdFxpS59HFc1bizmgRIgARIgARIgARIgARIgARIgASajgBnJgESIIHGIWA1zjSchQRIgARaFwEj4oMdLJVNG5jM/YDO3wGePMDeJHXVnCpwhAwQbVpXjXu4ugzQOz/aPgR0PAnQOz9EgEFIBBjY4EECJEACJNACCHCJJEACJEACJEACJEACJEACJEACDUKAAkiDYOWgdSXQ4vsZCV77/IAvLmI+wLJa/La4gboRMCJCuCII0vcFur4D+DPDggVEuKjbsFt62asAswToJON2u0TeawkingRlfBE/7BB4kAAJkAAJkAAJkAAJkAAJkEBzJcB1kQAJkAAJkEBjEGBktjEoc47WQUDEj9wNubjumhtw/HEn4eijjsMD9z2EtavXwBFEKIS0jvdBpV1uEUGkIWUXYMDPIoR8LmJFvggVkxG+I6Q2YoX42pG+bU4D+s8Hso6XweW0AzKm/v6I+EiRJwmQQIshwIWSAAmQAAmQAAmQAAmQAAmQAAmQAAk0AAGrAcbcgSHZlQRaMAEROMrKynDbHXdj9uy58Pl8eOqZ55HVsQceeuBhrF+3DtC7Q8SvBe+SS68DARPaDASKROzQR1J5gPRDgMFLgb5/AsmjgNBUOI+xCs0FbH1slt4doiKGpHYuEBKhRB9z5dhU2El7A4MWAz3vl/dUVnhF+rgtnYOPvQrz4CsJkAAJkAAJkAAJkEAzJ8DlkQAJkAAJkAAJkEDDE7AafgrOQAKtgIAx2LypCN//9Cu8vjh06tQRoVAIt996I15/9UVc9q8rkJHdDQ8/+AjWrxUhxMOPXit4V0Rt0QB2EAgUAiG9Q0OFEGlOGgH0eg0YLmUVNDo/Dfg7APZyIDQf8CYB6WfA7vkN7AHTgGHSf4QN0/t58esiA8ipj7oq2yT+IrJA5pEqni2QAJdMAiRAAiRAAiRAAiRAAiRAAiRAAiQQ+wS4w0YnYDX6jJyQBGKUgGgg8Hu9CJSVwev14P0PPkJRURFOOe0M5K1bjueeeRKPPv4/ZOR0w+SJkwHeCRKj74TtbCsYAMoKgKAIISqKuO5+ETQyTgMGfCNCx0ZguIgaA8cBnW+DSdkfJn6gvGdEEHH8bRE8ZJyA+KioAr1bxDgtfCEBEiABEiABEiCBlkKA6yQBEiABEiABEiABEiCBhiZAAaShCXP8VkgghO7du+HWm2/AN9/+iO+++Rwpaak4+9yzMfbnb/HEYw9hxozZyMuVILeqJq2QELcsYkUoImCoGBIognOHiPP4KhE3qkr19z0Cm0U8KRRTAaVI+lD44HuJBEiABEiABEiABEiABEiABEiABFoQAS6VBEigkQlQAGlk4JyudRAoLS1Fv359cORhh+CKK6/D72PHSbA6iHYZ6bjgH+fh1DNOQaqIIrA12A0erZaACCG6d70TRO/mUDGkOtPf97DLxFvfM9pPTYo8SYAESIAESKDFEuDCSYAESIAESIAESIAESIAESKBhCVAAaVi+HL2VEbAjgsbmzZvRPjMTe++1u9geWLBoEUIiijiCR5kEsQMBEUQ0kB0BxIQEnN/vUFFjW0ZMJEACJEACJEACJEACJEACJEACLZoAF08CJEACJNCoBCiANCpuThbLBCzLQpvUNs4W8/ML4PF4kJ7dCWeefjLue+ARTJw0GVLptPOFBEiABEiABEgAIAMSIAESIAESIAESIAESIAESIAESaEgCFEAakm7Nx6ZnSydg2/DFx2HooIHOTrp27YIOOdmAXYb27dvjgP32xbx5C1FWXAzwdz/AgwRqTMCIZ01M3PQM2UBQfxpFC9X10zYaCZAACZAACZAACZAACTQNAc5KAiRAAiRAAiTQiAQogDQibE4V4wQk8Oo+AispMRGJSUlAKIQOXTrjuGOOwAOPPIYZM2eBd4G0wPeBilaWfF2qtcDlt9Qlq5iRXwQUiG5YKLY2z2BlLrA+H1gn+dWSX7UB2FjofNQAA6wpABasBUoCBoWbAe2jvq7peODRjAhwKSRAAiRAAiRAAiRAAiRAAiRAAiRAArFPoOl2KBG9ppucM5NATBGwbSQnJ+Gj997AkYcfjEy9A0QEEASD6NK5Mw7Yf1/MFAFkc6FEazWgHlObj+HNeDzYVLgJy5cuw4L5C+CKXDG842aztbKgwbTlBj/OAf5YDHw41cazvwGfTQc+mW7jtfHA478AP84z2FQKuTbAzJXAd6IzbhTBZMoyG29MsPH1bBtfzLTx/pQQxs4XpZJ/+ZrNNeZCSIAESIAESKBVEuCmSYAESIAESIAESIAEGo0Aw0CNhpoTxTwBEUCSkpNx5DFHYdfddwPKysJbFhEku3MnHHbwgfj8q2+xRALpsEy4ja/Nl4De7eHzYe2qVfjk8y/w+FPPYtqMmRJklwB68111i1vZthbs99rISA4hvxhYmw8k+IAkH/RGDyAEJMfZiBefsoCNwhJgyfqwrcm3sXCtjeW5xvkYDsoBemUBcfK503HCA4AHCZAACZAACZAACZAACZAACZAACZBAIxHgNCTQVAQogDQVec4bmwREBEEgAL3ro8IGRQRJTExAQkICgtpu+NGrwKc5FSLCx+qVqzD5zwl44JEncPe9D2Kv0bvhqMMPheXxNKfVxvRaVCbskm5hr95Ap7YGHvnYJPqB1EQgfBkspCcZtIkHSsqAlXnA6kKgqMw4+RL5KKpoktMOaJ8Cxy8YBCiAgAcJkAAJkEDTEuDsJEACJEACJEACJEACJEACjURAwkmNNBOnIYHWTECEkY4dOqBDTg7GSVB9U55EavkYLADN6E0RET7WrFqN8WN/d+74OPf8i9Gvb288+uC9OPCA/QC9ZnItwaNRCBSLqLG+0IambeJttIkDNkudaohxPiAQtBG0DRLjDNISbQzsAPTNkrIIIjmpNnxeILcYmL3CYPZKG2sLjdQZgDfxNMr14yQkQAIkQAIkQAIkQAIkQAIksIUAcyRAAiTQNAQogDQNd87a2giEQsjskIN99hqNd979EMuXrwA04N7aODTX/Xo8WLt6DaZOnITX33oXF/7fv9C7Rw88+cgDOO3kE7HbHrvD8ngkcM7IeaNdQgMUlQDT5KPy+fTw3R3JIoAEgsD6IhubS+EII175K5bst+H1GARDYVFEnz6Xv9lAhRL9zZaluTYmLzfiY6ObCCQUQBrtKnIiEiCB6giwngRIgARIgARIgARIgARIgARIoFEISOioUebhJCRQJYFWVRkKIie7PbKzs1GmkVm9m6BVAWiGm9Vr4PNhw9p1eOf9j/DQo0+1qHiaAAAQAElEQVSiU4cOeOrxh3HiCcdg5K47wyvtkUh6M9xADC9JtKZEETy6pxvEe4DVeeG7P0RLRHGpQVEpUBqU/ds2AuKbV2wwaxUwby2cG3UCIoZINbT/wByDJD/QMxMY3Elq5QQPEiABEiABEiABEiABEiCBRiXAyUiABEiABEigKQhQAGkK6pyzdRII2ejSpQuGDxuCMWN+R/6GXDiRWvBodAIR4SM3NxfffPEVHnn8Kbzx1js4+ohDcdhhB2H4yBGIi48HhY9GvzIVJkzwAzlpNtKTgA3FwPKNQIEIH/p7Hyp+lIjysabAdsQR/SH07DZAdgqQlghkSl59OqQBndrayEoWAUX6JomoUmESFkigaQhwVhIgARIgARIgARIgARIgARIgARIggUYg0MQCSCPskFOQQHMhYNuIS05Cn1498MRTz2LtunUAH4PV+FfHYyE/Lx9ff/4lnnnmRfznuv+ie/cuePrxh7DfvvsgITGRwkfjX5UqZwwGgTUFwLpNQKLfhs8DxHmBHpnAoA4QscNALiecx2DFGbQXsSNDhI+gDeQVwblLpGNbIEHaOrY1mL0aWLgG0HHBgwRIgARIgARIgARIoJEJcDoSIAESIAESIAESaHwCFEAanzlnbM0EAgHsusvOOPGEYzFr1myUFBWDd4GgcQ7nrg8/igoK8c77H+DOex5A+5wsvPXaizj+mKPQZ0B/JIlABX3GUuOsiLNsi4AJixhTlwElQcDrATaIEJIcD+gPoFuWQdskyXsNCjYDhSU21uaHffTxWEtzgYxkoEs7gziPja7tbBFCgN8XwfGHjL+t6Ru8jROQAAmQAAmQAAmQAAmQAAmQAAmQAAnEPgHusMkJWE2+Ai6ABFoTAdtGctu26JiTg+9//AUFBRKx1cB8a2LQ2HtVvj4fSjaX4N0338HNt92NBx56HH8/56848bhj0KN3TxE+JFIu4hTk+jT28jhf9QT00nVOB44YBOzdy6BfNpDVBsgXwWNVng39nY+0RBttRBQJ2PqILBubymwM7QAM7QgM72KLWGJDx8lKNdirJ9AuCc6dJNXPyhYSIAESIAESIIGGIsBxSYAESIAESIAESIAESKCxCViNPWFrns8YA8sicrT2ww4hJ6c95s1fgKJiieS2dh4NuX/5zAVF2Hj79bdx930P4twLLkbP7t3wzecf4sgjDkFCkkTDA0E0gfDRkLuOjbFtICVBH3Vl0C0Tju3ZGzhsIHDIAOBgscPEjhtmsEcvoHNbg8EdDU4abrB/f2Cg5HtmyPetjKNA/B4bPbPCvol+qYnUS44nCZAACZAACZAACZAACZAACZAACTQUAY5LAiTQxAQkOtTEK2gt00sgNj+/ALNmzwX46BW06kMEkK5duyA5OVni7iGIKtaqcTTY5n0+QD53L7z8Kq6+/iakp6djwaxJOP20k9C+Q074rg8+7grN+fDIX6g4rw3LwLHEOCBVNKu2yYBamqRqySKUqJ+m7doAmmrZK6JH9P60nBQPfVuABwmQAAmQQFMQ4JwkQAIkQAIkQAIkQAIkQAIk0LgEJLzUuBO25tkCgQA25ObCtGYI3DsQDKFPn94YNWIYnn/xVWxctw6QQD141A8BFT58cXjumRdwzt8uxAsvvoZL/+9C/P2cs9AuMxOJetdHMAhRn+pnPo7SeAT0ro3qTFcR3ablqkx9qqpnHQmQAAmQAAmQAAmQAAmQAAk0BAGOSQIkQAIk0KQEKIA0Mn6Lj8BqZOLNdDqvB/3790VAAvEBfQQTBZD6uVC+RDz/7Is47tgTce7fL0TvXj3xzRcf4bxz/wJfXJyITxQ+6gc0RyEBEiCBuhFgLxIgARIgARIgARIgARIgARIgARJoTAIUQBqT9pa5mGvtBCL/F/pTz7wgIkgAvAMEO3Y4d320wYvPP4Nz/nYB+vXtg+Dmjbj8X5cgLiEecfHxAB93tWOM2ZsESIAESIAESIAESIAESKAuBNiHBEiABEiABEigCQlQAGlC+Jy6FRMIBHDQoQfjisv+D7fdeR82btgAiiCo/eHxAL4kvPbKaxg0aCD+es4F+Nc/L8Htd9wMy+OBz+cLCx92RHGq/QzsQQJbE7AqVVUuV2pmMZoA8yRAAiRAAiRAAiRAAiRAAiRAAiRAArFPoPnskGGb5nMtuJLWRsAAgwcPQEZ6O4Dx+dpffV8c5sycjccffRinn3ku9tpzNOxAIe675/Ytj7qi8FF7rrHQwyubqMrq4y+ejPvlVFS4oWjaUmDuauDVsZF5JXHPshCwOSAfdreCKQmQAAmQAAmQQOsjwB2TAAmQAAmQAAmQAAk0GYH6CAc12eI5MQm0aAIietgSoP/vzbejtLQUvAMENTv0d3R8CXjnrbfQd9AIzJg5E6GSPDz+xCNwfthcH3UlXGs2GL0am0CDzycCxc0f2rhO7PqIXfeBjbs/B2atECEi6q9eSD6DIX2R6hqtS/ouWAVMWg5YMg+krBbvA36cC2SmAHmFMpIR01Pal64BXh9rY8MmqXDrJcuTBEiABEiABEiABEiABEiABEiABGKZAPdGAs2FgIRnmstSuA4SaGUEAgEceuQxuOWm6/Hd9z+hpLgYFEFQ/WEkeuz14pNPPxNMPpx48pm4+qrL8cA9d8B4PECZiEgUPqrn11pagsB1hwG3Hg7cErFbjwCuOBDo114VjwgIeTstWQvc843B7/NtRzuLtJQn4l2eh/jrnVrv/Ql4DHCnCCp3fiap2HuTgL37AgcNAVITpEukox0CNsnbMjvZRrvULfWS40kCJEACJNC6CHC3JEACJEACJEACJEACJEACTUSAAkgTgee0JBAmUIaMdu3w85jfwneBhCtj+LUOWzMG+n/ph4IhfPbxp/j3Fdc5wsemjatw+523wef3QxzqMDC7tEQCEW2h6qWLMFFQBJSUWSgurWibSw2KywwCQXHS3jJQt2zg9JHAT/MNfpiJLW3yl3H+auCjyQa5UXduvD8B6JsDXH4Q8J8jDP5zpMGxwwzaJdro3UHGDcjAMq68QgWTfNE0lxUCHdOlTcQQtwk8SIAESIAESIAESIAESIAESCDmCXCDJEACJNA8CEiYp3kshKsggVZJwLbRsXNH/DF+AoLBICDBfvDYQsCSryhh9P1PP6Hv4J1wxX9uwF/OPBVXXXEZEtu0AcpKUOX/ur9lBOZiiYDoCMs2AIvXAaWukBG9P3m7vDvBxnNjbLwQZS/+ZuN/P9u46VMb05eLDCF+TjcRJTplAOfsBnSTVIqAzBEM2Ph9PpDdxkZyAqB1n0+zkV9ko4f4jVtoo1SEFojfWxNDOEpEEM2j0lEoAkihCCjdM2W9Ir4sywU2iCCi41VyZZEESCDWCXB/JEACJEACJEACJEACJEACJEACTULADQM1yeSctPUR4I4rE7CRlpKCufMWoLh4M4P5Lh4RggKBADYVFODb737Aw488ibNOPwU/ffc5rrnuGqSmpkIUI9ebaWshINrFuDnAq+NsFIgYsZWQIBriX/cyuOgA4MIou2B/4KxdRORoC/TrKAqHo3REoEk+XbS07u0Bv9eGPrbq9wXi4wX6SJ1P0jwRMTwy2am7WuifA6zcaOHV8Tb+XAikJxpkybj6eKzIiE6i42yUfvHSv02yU4X5q4CpS8EblsI4+EoCJEACJEACJEACJBDjBLg9EiABEiABEmgOBCiANIerwDW0XgKBIPbc9wBceN45zu+AlJaWAhL8R2s9dO+WhVAwiN/HjccBhxyNp597CRdd8Df8+7L/Q3pWJnjXR2t9c8i+RZfYpa/BWbsZpCRJWQQRea14iggCfRSVa1LWuzB+nGswpJNBnL+qTuEhiksMxor4MWOlwV49gbYqXIhAkpoIHDQYjkAib08cPcpGjrQ9MxY4e3fpq3NJUn7KOvXxVwtyRUTJkYJM6Zd5B3QA1hcDC1ZLnZzl/sy0BgLcIwmQAAmQAAmQAAmQAAmQAAmQAAmQQBMQsBp3Ts6mjzmSWBhBkEAUgTLk5GTjx19+RaCsciQ1yi3WsxJZDpSVYe2aNRjz2+948eXXcPRRh+O+u2/DQYcdisQkiUKLMBLrGLi/bRCQL89O7Wx0agf4rG34aZMKDGK5hcD4RZDPlo3de8kAIohos5qUnN/9KCgGlq0HvpoOTF1m4/CBMkeGeKiDJM7dHSKEaDYk6Yo1wIxVwCV7GyTES63rJ1k9y2SOdfnA2jyD9DY2Nkp+Xa6BZdmIF5u/xsZm0Toh6wMPEiABEiABEiABEohZAtwYCZAACZAACZAACTQ9ge2FkJp+hTG2gq5dOsHj8cTYrridHSJg2+jXp5fzOyC2PjdnhwZrgZ2NgS0MNubmOnd9HHfSGfjw489w7tln4R/n/w0dO3cCyiRaLD4tcHdccn0TULFBbVvjirCgwsf8lSJqzATyRQQ5Yrh0kHp5DZ+Szy8CJiy18dNc4DvxS4mzccrOQE60+BH2Rkjm3FAA5xFW7082OGyQQf9OUiliR8TFSQJBg7mrDP5cCpQEbExcDPwg4/84x8YPswzKghZWyjjL1ssCnB58IQESaA4EjOFnsjlcB66BBEiABEiABEiABEiABFo8AW6g2RGgANKIl0SDvAP690N8XBwk4tuIM3OqZk0gFMLQIYPRNi0NGzbktq73hgSc9HFXs2bPwdPPvoQXXn4N5//9bBE+zsUuo3dHSmoK+Fsfzfrd2zwXJ3HMaSJ+jJ1vo3974KhRQIJflip6hbyWn3rnxxr5yHVtCxw3Eth3EJCSKM0hsUrn5oAIGXMM5qwCjh8B9Osog1USP7SL6nSBoI3O7Qz26mPQOwvYo7esQfqcsCtw9C7AqC6Ax0h/7UAjARJocgLBkhLk5+fDGNPka+ECSCDWCHA/JEACJEACJEACJEACJNDUBCiANPIVCEmwm2GvRobe3KeT90RWxy4YPGgAvv3uRwQCElVtDUEYvRNKosUTJ03GRZf8GytXrcTVV/wTZ5x1Frr37BFrd32ARyMSEAFjRFfg9D0MhkgKKTuPsYpegnwRd8oAjhDhY5AIEsnx0liVn1Tr6bcMRnSxceLOQHaqdFZfbahkPq/tzLlbbxsDO9volglkJCP8yC75aCOg9UB3EWa2WlOlsVgkARJoBALy2c7duBGz5syD18s7dBuBOKcgARIgARIgARIggVgnwP2RAAk0MwJWM1sPl0MCrZRAAD16dMfsuXNht4bHYInAM2fmLPz08y/45LOvcOnFF+Af552LHn37iPBRAogo1ErfCNx2PRFI8slAolM44odkqzy1XUUJFTM0X6VTuNLrCYsZTmk7vs6cOqaa+qo5HflCAiTQHAkYY+C1PM1xaTGwJm6BBEiABEiABEiABEiABEiABJqWAAWQpuXP2VsLgRrsMzMzHYsWLxEBJIajpXrXh9eLSZMm4y/nXogXX3kDp51yAo4+/nj06tNbxI+yGpCiCwk0EYEY/mg2EVFOSwIkQAIkh4bXiAAAEABJREFUQAIkQAIkQAKxR4A7IgESIAESaFYEKIA0q8vBxbRaAraN7KwsvPHmO7GLwOfH5ImT8fUXX+GBhx/HbTdfj/9cfhl69+8nwgfv+ojdC8+dkQAJtGYC3DsJkAAJkAAJkAAJkAAJkAAJkAAJNCUBCiCNQ5+zkMC2CQSDGDlyBHbbdWcsWboMEEFk2x1aUKve9eGLw9QJE3H+RZfiiaeewz//7x/Y76CD0LufPvKKd320oKvJpZIACZAACZAACZAACZAACWybAFtJgARIgARIgASaEQEKIM3oYnAprZiACB4p7bIwcOAAfPXN96J/xMizdnx+TBLh4+P338e1N96CM08/FffedSuGjdopfNdHMNSKLzq33igE6vpXzsjq1CSp81nb/rX1r+nCGmrcGs1PJxIgARIgARIgARIgARIgARIgARIggdgn0Hx3WNfQUPPdEVdGAi2WQACDRABZsWJlWABpyUFL566PBEyZMAE33nwHHn3iaeeRV6efciJ69O4l4gfv+mixb9PmvHD9zOhfNTWPLFTKs5fLi5zQstarSVk0R4RUZ5S8eAKaapua+BYUAavzDAJBbUDFQ6tcq9hSXioqBZZvkKKOpyZjQlM1zWt/aXbPIvlIFGyGfPalRn3UJFv5LNX1RNp0/bo+1RFd0/ayKF0xJPl82YvWl++x0tyV52CZBEiABEiABEhgBwmwOwmQAAmQAAmQAAmQQLMhEAmjNJv1cCEk0KoJpKWlYO68eREGLTRK6fNj8sRJeOWlF3DL7ffgoAP3x5OPPYjBw4YirW0aEAhE9sekNRBotD3Kx2XOShs/zTD4eRbw80yDnyT9YLLUSeqUZwJj5xqsLwA2lQB/LgSWrZcViiCh4sMsEUt+nQ18PVn6zwfWFdgIqlIiLs4pc6iIoX2XSL+lYsUBqZT+Trv7In9ZizYbzF4FFIr48OMM4MdpMqasyVmHrlHm2VAoHaS7jrlgNbB4HbBZhBAVbSbJ2gJBVWjEJ3Kq4PHnIkDbtc+KXODTSTZ+nQv8MidsP862sXCNCQspMna+iCrThcumzTZWbQQmyLhrZV+RIZmQAAmQAAmQAAmQAAmQAAmQAAmQQL0Q4CAk0FwJSJimuS6N6yKB1kcgFArhrbffk+BlxcBniyARuetj6sSJePCRJ/Cm7OPG667CGaeehO49usMRPqKDyS1iU1xkSyLQNsGgR6aNbulAnywgOw2I9wL9cwx6ZwK9pK5Tmo14H5DgD9vEZTY25AHLRcxYttFGR+kzoAMwsrNBd+nj90YIiJhQXCriyBTgBxEvPp4EzFoFfCYCy9g50hj5a6pv8cJiYEWejTX5wJINBhtEBGnXBkhLstFWLC3RRvsUWYeswRlduq+UNaje8ZMIGSvybawvNvhggjRExlU/S4qd29oYt9jGsg0iloiWGJK6wZ2AgR2NY0MlzUm1YaRe++QXi1+ZwYTFwORlQJH0+Xa6wZqCiIM60UiABEiABOqbAMcjARIgARIgARIgARIgARJoJgSiQivNZEVcBgm0VgJ2CH169XJ271Exwcm1kBefH9OmTMWTjz6Kiy65HHl5+XjwnjswaNBApLaViLIIOy1kJ1xmcyegcXu1yuu0gcxUYHEu0Lm9wc9zbSxYCxE6DGassDFFbOZyIDUJSIoD9CPWO9tgZBcDFTk2i7ihb1O/38DrNbANsGETUFwSnqg0YPD+HzYyRcjYoycwe72NXXsAmp+31sb4+eJnwXmsVu4mYNF66S/ChwohbeIhcxhslHKeCBua+mWOOK/0kXXLKzaXGsxfA7SX8Ud0AUbLHAtkL4tlD5C1qI9ap3bAAf0Mkv02ykTMWCo+U5aKwLHExkSxxbm2swanj/QrknF1vk3iOyAbGNVVOMkcE5bacB6LpYPSSIAESIAESIAESIAESIAESGCHCXAAEiABEmieBCRc0zwXxlWRQKsjEAxht113xoAB/TFh4uSWsX2NIvsSMHPqVDzy+FP4/Ktv8OhD9+DpJx5Gj549wnvQqHI4x1cS2DECEtAvKAaKRJSI6AYVx/MA38yRKvGbuApITQQGdIQjaBgLWJ4fJQ6IW1y8jZx0IFn8pIi1BcDc1TZ+mhO2ScuAjTKfigm/SF3nDIMBnQxURPF7DNoki2AhgsQhAw2+mCYrkjk8YjmpBoNygE5tgb5ZQN5mg+Kg7Qgv8XE2EkUQ2SDjFso+dGydG7DFD+gp/rru+AQb/UWwmL1aWmU/8grHV/aYk2GjTbyINAiLOfnFNnbvCWSnAKvyAZlKWsJnWcDGSqkb2B7onA7E+YG+sralIuAE1dEdO+zOVxIggfoiwHFIgARIgARIgARIgARIgARIgASaBQEJ1TSLdXARMUqA26oFAduGFZeE5KQkbNi4sRYdm8jV58OcWbNx5+2347Qzz8WKFStx9x03Y8jgQUjPzHBitZA9NdHqOG0MErBDwPfTgBd/NdhYKBusHLyXckmZvEiTPvoqI9lGelII6cliInLE+wycR0OJVrFQhIXnvrfxwR/Ayg1w6vUxWaN7GnRuZ6NjWxEVugOZKQA8wIwVwEARU/x+GzNXGAwREQGyHtEtoI+18vkNiooNIKdXfFTEWLzBYLr0s+VzsFzmmLocWJZro6gUKAuKUCGGyFG4WcSUVMDvkwFkfTp2agJQXCpl16cYeOEnG2/8AiyXr4jNMr8jmLQBFq+X+cuAtvFAuyTpoGNIIroqvJaN5Dgp6FBSr/lQyOjSpZInCZCASyAQCMIOyQfLrWBKAiRAAiRAAiRQKwJ0JgESIAESIIHmSIACSHO8KlxTKyaggRcbHidK20wx6Np8cZg/ew4eePhx/PzLGLzw7BN489Xn0ad3L0DbGUACj/onoHdxdMkAdupmI14D+hLMrzyLvv20rliEkD8WGfwpNl5s4lJgY5EqANIqSed0g0MHW2ibbFBSBohGAX0klTfORoLXIF4sKd7A5xF/ESq8ksaJwTL4aa6N0b1kcjmlFTIcNpfZSIy3ERTf2cttvPI7kJVoo0tbOI+16tEO6JQGdE0zzh0a+vsgzh0gOoCY/rB6n3Qbfm9kUPnrvEREkz7tpSynuDh3kBw9VNYWJ2JHiUGeiEB6h0m/TIMf5gJ5m4CRIto4C9IOYiq0ZKdKH78U9JTFrs43aJ9i4FVYkbG1iVavBDhYCyNQJh/eoSLgt89uD/BvWAu7elwuCZAACZAACZAACZAACZAACVRPQEIs1TfueAtHIAESiCkCEgUuyM/HW6+9gaOPPxWzRAS56/abMHToECQmJcEYia5qJDmmNs3NNBsCEqwf0kWC/F2BBN+2V5XkDeG0nYFTRhmcLOnxI4DstBBCMob29IrQkJJgi6hgY9lGg7VFQHK8tEh7SBPnrSwFOSF/Kb0eExYuRJTILbbRI0McxE/bJiwDOreVsp5i+giswwfZzqOy2iYCRsbwe4G2CVB357c+hnaUPumAcxuGTHjKrkD3LAMjVc6LCCkTRLTpJbFYx0fqVQBqk2CQ6LcRkI1sEAGkfSqwPM/G+iIbS/OBxevE0T1l3CFdDA7qb5AiczvjyD6mi0DTVcQWj0cW5voyJYFWT0AESP2g6qMdWz0LAiABEiCBuhJgPxIgARIgARIgARJofgQkrNP8FsUVkUDrJeCBZXlQpv/bdnOD4PNh+eKluOra/+LZF1/Gi88+ge++/BiDBg4Ir5TCR5gDXxuUgGVBPiPVT6EanLbqnSKvjwPe/tPGe+OBT6dqrYU4fcSUkbyY3vmxSASDuWttZLcBemSF6/XxUwERIIwRJ5lPhYNdetq49yvg5i9t/GVXA+MVXxETvpJxv5kJnCoiC6SPZYAUET1SRKgoKgMKxBL9cDQNj4zVKQPo2BbwSV9jIXyIDqHiixN39YSrHvwaOG6ELX7hcvmrZWPBOoM1BYA+LuudCZIX4ePqg8R/GDB1BfDtDKA0KAuRTnEi9MSLYGI8UpC9fz/VRl4p0EeEFWc+qeZJAiRAAiRAAiRAAiRAAiRAAiRAAiRQRwLs1uwJuOGXZr9QLpAEYp6ARCOnTRyPsb+Pw/777dV8tqsRZ18iFsyeg07d++H7H37GbTddj512HgWjbbpSih9KgdbUBCTmX1hs4zsJ8ue0MchIhmPtJM1qAyT4bPyx0IY+fmq5CB8finhhiWKhj75angfMWwssE/OLYOH3AbNX25i/WsSEMoPBHYFrDgMePh7IaQeMmQf87eUQCjYb/OdgGVv6qFDiIJC/rF6xeTKHPsYqPUXHAp4XIWb8Ijh3hPw418bajbJgOaGHpCtyDd4R0ebit4D9+gJ79JBKEUe0WU0fcfXod0CPTFvWapzfNtmth42dutvI32yjJAgM7wJ0zbBRFtzScVOJwa9zgP++D6wSseSkEUBSvIy4xUUKPEmABEiABEhgxwlwBBIgARIgARIgARIgARJobgQkRNPclsT1kEDrJdDs4pEiyqxbuxann3Y69tr/MIz56WvMnDkVI0ftBAQCcH44ofVerm3tnG1NQaAM6Jhmixl0SjPOY6n00VSudWpr0L6NjXgvoCLHXr2B40bZOGEk0DU9LFKMWWAwbYXBgtUG88RUSHD+UMqHM94HiF4CvdNj9+7AM2cYHD9SGnSvkSQk6cylBi+MBXbuBmSJ+LG+UO8KMbjlCOCgwcAhQ4HBHURYiRIpdAi/L4RhnYFHTgSGdNWare2wQTLGEODs0bZzd8jvC/TuFoNPphl8NRMYuxBYX2gqdEyQcbNSbPxrfxun7gqKHxXosEACJEACJEACJEACJEACJEACO0SAnUmABJo5ASeu08zXyOWRQKshYCrGLZtu37oQFT/WrMEl/7wSCxYsxNuvv4Dd9twLKCsG+AOxTXdtOPM2CVxxmEHfDjb6ddza+ktd3w7G+T2MzDZAz0wZSnQ8v/wl7N8ROGIYcNLONk7excbxkqo40k/8vdX9VkZQ+ofEok4VSPp3ErHhUGCf/iJkiKAxQsSS0X1stNG7LtRf+g2U+o7tpKMIJvIKvXskI9lAf/PD+RpQP6dhy0tqEtAnW8qyZp+seVQPgxN2Bv4yOmxn7Q6cvhuwS08ROfziFzkt+Tz3bm+gj+bSx3vpXJEmJiRAAiRQzwQ4HAmQAAmQAAmQAAmQAAmQAAk0LwISQmleC+JqSCAmCNRlE5aFseP+wJChQ2CMEwKtyyg71kfnlXXkbdyIM886F5k53TFo4EC888ZLIn7sCZSV7Nj47E0CDU1AxAEnyK8CQnWmooNr7nrUV4QJvbujgmm961PTVPvoOnQ8zbumc7pjaF10Weu1rKb5qkzb1Nw2HUPnqGxa7/q4qfZTc8tMSYAESIAESIAESIAESIAE6ocARyEBEiABEmjWBCiANOvLw8W1LgIGs2fPQ6BMI6dNsHMRP0pLSrBh/Xpc8q+rMHfefHz/9ae45rrr0LFzJxE/SptgUZySBEiABEigJRHgWkmABEiABBTjB5cAABAASURBVEiABEiABEiABEiABEigORGgANIwV4OjkkAdCBgEAgGcdsoJ0teg0X5fQ4QPWBYKCwtx4cX/Qnr7rkhOSsLtN9+AfQ44QISPIvCRV3JJeJIACZAACZAACZAACZAACZDA1gRYQwIkQAIkQAIk0IwJUABpxheHS2tFBFSEKCvBzJmzccB++4geIQJIY2xfhA+962PjhlxcdMm/MW78n/jqsw/w2BNPYr8D9xfxg4+8aozLwDlIIHYIcCckQAIkQAIkQAIkQAIkQAIkQAIkQAKxT6Dl7JACSMu5VlxpLBMQIWLa9Jn48utvMGL4UEAFETTw4fGgIC8Pn3/xDfba/1B07dIZ9955Cw489HARPjYBgSZ6FFcDb5vDkwAJkAAJkAAJkAAJkEC9EuBgJEACJEACJEACJEACzZYABZBme2m4sFZFQASPPBEjdM/BoP6iseYayERsgdeLvNxc3HjLHTjmhFNw5+034eZbb8fBhx0i4kdxA03MYVsDAe6RBEiABEiABEiABEiABEiABEiABEgg9glwhyTQUghQAGkpV4rrjG0CxoPPv/waF114PiyPp+H2KmOvW7MWi+cvwB133Y/c3I345KN3cNgRR4nwwbs+Gg48RyYBEiABEiABEohhAtwaCZAACZAACZAACZAACZBAMyVAAaSZXhguqxURMAYlhfnI3ZiHIw8/FF4RKer9B9D1rg+fFxvWrsVj/3sGI3bdG31798J1/7kChx95OFBWX3d9tKLrxq2SAAmQAAmQAAmQAAmQAAmQAAmQQKslwI2TAAmQQMsgQAGkZVwnrjKWCYg4MXHSFEwSy87OhDGmfncrgsqa1asxY/JUPPrE01i/fgPeePlZnH3OWejZp5eIH2X1Ox9HIwESIAESIIHWRoD7JQESIAESIAESIAESIAESIAESaJYEKIA0y8vSchfFldeBgOXB7NlzsXbdevTu1QtGBJE6jLJ1Fx3H58O61Wvw0itv4NSz/oae3bvj0osvwIEH7g/nLpOG/r2RrVfFGhIgARIgARIgARIgARIgARIggRggwC2QAAmQAAmQQEsgQAGkJVwlrjF2CRiDTRtzMXX6DJx0wrGwrHq6+yNy18cfY8bi6edexOo1a/HAPbfj5JOOQ8/evcLih23HLlfujARIgAQalwBnIwESIAESIAESIAESIAESIAESIAESaIYE6lkAaYY75JJIoDkTEKHiVxEpPvvia5x2ygmIi4sLixN1XbMlH2mfD+tF8Hj73Q/xzyuvQdeunXHR+edin733hFfawLs+6kqX/UiABEiABEiABEiABEiABMoJMEMCJEACJEACJEACzZ+AREub/yK5QhKIWQLGg5mz5+LUk09At25dsUOPvxIxZf3adfjhm+/w2JNP451338c1V/4Lxx9zFLr17AFLxRHe9RGzbyVurIkJcHoSIAESIAESIAESIAESIAESIAESIIHYJ8AdtjgCFEBa3CXjgmOGgDHYuG4NFi5chOOOOQIJ8fF1u/tDxoHPj9z16/HO+x/hv7fc4fzWx2MP34d99tkLcQkJ4F0fMfOu4UZIgARIgARIgARIoNkQ4EJIgARIgARIgARIgARIoLkToADS3K8Q1xe7BDwejB07Dh989BmyMjNgpFyrzRoDFT7y8/Lx6Ycf4bEnnsEnn32Byy69CMcdexQGDB6ExMREIBSq1bB0rhMBdiIBEiABEiABEiABEiABEiABEiABEoh9AtwhCZBACyNgtbD1crkkEDsEjAez587Hheefg/j4BKCmj6eKCB9Fm4rw4bvv4e77HsQ1N9yCbt0647EH78GB++2DhCQRPgKBmo8ZO1S5ExIgARIgARIggUYjwIlIgARIgARIgARIgARIgARIoHkToADSvK8PV9dSCNR2nZaF9atWYtbsOTji0IPRpk3y9sUKR/jwobSkBG+/+RZuvu0uXH71DejevTs++/BtHHvUEejSvRuSkmUs3vVR2ytCfxIgARIgARIgARIgARIgARIgARLYPgF6kAAJkAAJtCgCFEBa1OXiYmOGgMeL38f9ibLSMmRmZgAiiGxzbz4fbBE13n37Xbzx5rs46ZSz0LVrF/z6/Zc45cRj0bFL57DwEQxuX0jZ5kRsJAESIAESIIGaE6AnCZAACZAACZAACZAACZAACZAACTRnAhRA6ufqcBQSqDkBETvWrlyBn8eMwU47DUdCwjYefyXCB8Ree+U1vPzaGzjhpDNQWlqK9asX4y9nnIKsnGwKHzUnT08SIAESIAESIAESIAESIAES2FEC7E8CJEACJEACJNCCCFAAaUEXi0uNEQIeLyZMmIRXX3sb++29B9qktNn6rg0RPeBLxovPv4hr/nM9Tj/zXOTm5qJgwwqcftpJaJeRgcSkJIB3fMTIm4LbIIGWSoDrJgESIAESIAESIAESIAESIAESIAESiH0CLXeHFEBa7rXjylsiAcvCmuXL8cuY33HFvy9Bdk52xV14vVDh443X3sDJJ56Av55zATxeDzYXrMMFfz8XySkpSEhMpPBRkRpLJEACJEACJEACJEACJNB4BDgTCZAACZAACZAACZBAiyFgtZiVcqEkEAsERACZOGkybr/3ERy4395ITUsDPB7oY65U+Hj3nfdw6CEH49TTz0Z6ejsEN2/EjddehbiEeMTFxwOhEGDbsUCCe4gRAtwGCZAACZAACZAACZAACZAACZAACZBA7BPgDkmgpRKwWurCuW4SaJEEjIVAIIDnnnwQXbt2EfEjCV98/gUevP9h7LnHaJx1zkXo1q0ryoo24LGH74Pl8cCrj8Oi8NEiLzcXTQIkQAIkQAIkEJMEuCkSIAESIAESIAESIAESIIEWQoACSAu5UFxmDBCwLCxfvBi/j5+Ae+9/CLffdT/2GL07Dj38OMybvwA7jxqJ9Svn4YnHH3JED2NM+G6PZn3HRwxcF26BBEiABEiABEiABEiABEiABEiABEhgOwTYTAIkQAItkwAFkJZ53bjqFkzADtmYNm068vLycNCB+yFv3TI8+tijuO+BexCvj7kKBsPCRwveI5dOAiRAAiRAAjFNgJsjARIgARIgARIgARIgARIgARJoEQQogLSIy9R8F8mV1YJAKISOXTrjvL/9FfnrV+DhRx/CDf+9HilpaUBZsVgphY9a4KQrCZAACZAACZAACZAACZAACZBA4xHgTCRAAiRAAiTQEglQAGmJV41rbrkEAgF0FhGkTUobETxKxET0EGGk5W6IKycBEiCBVkmAmyYBEiABEiABEiABEiABEiABEiABEmgBBHZQAGkBO+QSSaC5EVDBg7/r0dyuCtdDAiRAAiRAAiRAAiRAAiSwTQJsJAESIAESIAESIIGWR4ACSMu7ZlwxCZAACZBAUxPg/CRAAiRAAiRAAiRAAiRAAiRAAiRAArFPgDts8QQogLT4S8gNkAAJkAAJkAAJkAAJkAAJkEDDE+AMJEACJEACJEACJEACJNDSCFAAaWlXjOslARJoDgS4BhIgARIgARIgARIgARIgARIgARIggdgnwB2SAAm0cAIUQFr4BeTySYAESIAESIAESIAESKBxCHAWEiABEiABEiABEiABEiABEmhZBCiAtKzrxdU2FwJcBwmQAAmQAAmQAAmQAAmQAAmQAAmQQOwT4A5JgARIgARaNAEKIC368nHxJEACJEACJEACJNB4BDgTCZAACZAACZAACZAACZAACZAACbQkAhRA6na12IsESIAESIAESIAESIAESIAESIAESCD2CXCHJEACJEACJEACLZgABZAWfPG4dBIgARIgARJoXAKcjQRIgARIgARIgARIgARIgARIgARIIPYJxM4OKYDEzrXkTkiABEiABEiABEiABEiABEiABOqbAMcjARIgARIgARIgARJosQQogLTYS8eFkwAJkEDjE+CMJEACJEACJEACJEACJEACJEACJEACsU+AOySBWCFAASRWriT3QQIkQAIkQAIkQAIkQAIk0BAEOCYJkAAJkAAJkAAJkAAJkEALJUABpIVeuBa1bEveZl4voKla9OI9HsDnAzSNrq8qr33VV82YqjxqV6dj6Lp0PB27dr1bqTe3TQIkQAIkQAIkQAIkQAIkQAIkQAIkEPsEuEMSIAESiA0CVmxsg7tolgS8Km7EYcniJfj2q2+wZNFiLBaDLw4qhgQCAUyaMBFPP/E0xo4ZC0cI0Y2oMKGCSLQoIfnZs2bj9ZdfxxOPPIGNubmA+qGOh/QtLCjAT9//6Iw3d/YcZ011HI3dSIAESIAESIAEYpkA90YCJEACJEACJEACJEACJEACJNAiCVgtctVcdJMRqPHEvgSM+flXPPn4k3jw4cdxy+13435J73/oMTz15FNYtGAhbNvGrDnzcd4/LsE7732I1cuXQ+8EUWFi3NhxWLxwkVN25hQBZMWKlXjkif/hH5f8C0XFxdgxAQTYXFKKPydOccZbuWo1VJQBDxIgARIgARIgARIgARIgARIgARIgARABCZAACZAACcQCAQogsXAVm9seRPz46L13cOc9D+LCiy7FAw89igULl+C5F1/Dw488jjfefAcdOnSAz+/H/vvuieeffgIjhg1Fu7ZtoaLGipWrcPtd9+HHn37FpvwCOHeGGCP6hIXUlBToYYyBiiVOmz7CSu8Y0QbXfF5AH28lwolTVe4v9RFf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ECBAgAABAgQIzC1gCwECBAgQIECAAAECBPIqIADJ68rqa1EE7EOAAAECBAgQIECAAAECBAjkX0CHBAgQIFAmAgKQMllobRIgQIAAAQIEahewlQABAgQIECBAgAABAgQI5FNAAFJzXd0nQIAAAQIECBAoO4GKikLZ9axhAgQIlL0AAAIECBAgQKAsBAQgZbHMmiRAgAABAvMW8AiB8hUoxKSJE+PDjz5OBEKQhOCTAAECBAgQIECAAIEcC5RjawKQclx1PRMgQIAAAQIECBQFJk+eEm8PfzcK8o+ihy8EykhAqwQIECBAgAABAmUgIAApg0XWIgECBOYv4FECBAiUsUAKPlq3blXGAFonQIAAAQIECBAoHwGdEig/AQFI+a25jgkQIECAAAECBAgQIECAAAECBAgQIECAQO4FBCC5X2INEliwgBEECBAgQKCcBSZOnBRVVeUsoHcCBAgQIECgXAT0SYAAgXITEICU24rrlwABAgQIECBAIBMoVlVKPjbZaMNYfPHFQgpSJPGFAAECBAgQIECAAAECuREQgORmKevTiH0JECBAgAABAuUr0K5du6isrCxfAJ0TIECAQBkJaJUAAQIECJSXgACkvNZbtwQIECBAgMBMAbcEqgWqItJn9bfuECBAgAABAgQIECBAgEAuBIoBSC46aSFNZP+6sNBC5mqaBAgQIECAAAECBAgQIJAvAd0QIECAAAECBMpJQADShKtdKBTi8SeejnHjxkek++GDAAECBJpTwLkJECBAgAABAgQIECBAgACB/AvosIwFBCBNvPiTp0yJqvRfE5/W6QgQIECAAAECBAgQIBAREAgQIECAAAECBAiUj4AApMnXuhCFJj+nExIgUKuAjQQIECBAgAABAgQIECBAgED+BXRIgEDZCghAmnDps3e9qkhf/IzNJkR3KgIECBAgQIAAgdkEfEOAAAECBAgQIECAAIFyERCANNVKV1VFly5dYqMfbRDeAaup0Bd4HgMIECBAgAABAgQIECBAgACB/AvokAABAgTKVEAA0oQLX5VCkGnTpjXhGZ2KAAECBAgQIDCngO8JECBAgAABAgQIECBAgEB5CJR3AFIea6xLAgQIECBAgAABAgQIECBQ3gK6J0CAAAECBMpSQABSlsuuaQIECBAoZwG9EyBAgAABAgQIECBAgAABAvkX0GGEAMSzgAABAgQIECBAgAABAgTyLqA/AgQIECBAgACBMhQQgJThomuZAIFyF9A/AQIECBAgQIAAAQIECBAgkH8BHRIgIADxHCBAgAABAgQIECBAIP8COiRAgAABAgQIECBAoOwEBCBlt+QaJhDBgAABAgQIECBAgAABAgQIEMi/gA4JECBQ7gICkHJ/BuifAAECBAgQIFAeArokQIAAAQIECBAgQIAAgTITEICU2YJPb9dXAgQIECBAgAABAgQIECBAIP8COiRAgAABAuUtIAAp7/XXPQECBAgQKB8BnRIgQIAAAQIECBAgQIAAAQL5F6jRoQCkBoa7BAgQIECAAAECBAgQIEAgTwJ6IUCAAAECBAiUs4AApJxXX+8ECBAoLwHdEiBAgAABAgQIECBAgAABAvkX0CGBagEBSDWFOwQIECBAgAABAgQIEMibgH4IECBAgAABAgQIlK+AAKR8117nBMpPQMcECBAgQIAAAQIECBAgQIBA/gV0SIAAgRkCApAZEG4IECBAgAABAgQI5FFATwQIECBAgAABAgQIEChXAQFIua58efatawIECBAgQIDAXAKFQmGubTYQIECAAAECLVrA5AkQIECAQFFAAFJk8IUAAQIECBAgkFcBfc1PYMqUKfHlV19HyEDCBwECBAgQIECAAAECBPImUF4BSN5WTz8ECBAgQIAAAQL1EqiqqoqxY8ZEdluvA9mZAAECBEpLwGwIECBAgAABAklAAJIQfBIgQIAAgTwL6I0AgXkLVE2rik022TiW6tYtUgoy74EeIUCAAAECBAgQIECAQIkLmN7cAgKQuU1sIUCAAAECBAgQKBOBqtRnmzZtorKyMt3zSYBAjgS0QoAAAQIECBAgQCAEIJ4EBAgQyL2ABgkQIEBgvgJVVZEFIfMd40ECBAgQIECAAAECJS9gggQIzCkgAJlTxPcECBAgQIAAAQIECLR8AR0QIECAAAECBAgQIFD2AgKQsn8KACgHAT0SIECAAAECBAgQIECAAAEC+RfQIQECBAjMLiAAmd3DdwQIECBAgAABAvkQ0AUBAgQIECBAgAABAgQIlLmAAKQsngCaJECAAAECBAgQIECAAAECBPIvoEMCBAgQIECgpoAApKaG+wQIECBAgEB+BHRCgAABAgQIECBAgAABAgQI5F9gPh0KQOaD4yECBAgQIECAAAECBAgQINCSBMyVAAECBAgQIEBgloAAZJaFewQIECCQLwHdECBAgAABAgQIECBAgAABAvkX0CGBeQoIQOZJ4wECBAgQIECAAIFcCxQKkT5z3aLmylFAzwQIECBAgAABAgQIzBQQgMyUcEuAQP4EdESAAAECBOYjUDV5cowZMzYKFf5IPB8mDxEgQIAAAQIESl/ADAkQIDAPAX/bmweMzQQIECBAgAABAjkWKBTi65Ej4823hkdlRfojcVVVbprVCAECBAgQIECAAAECBAhMF0h/25t+x9emEUh/144ohI+mEXAWAgQIECBAgMA8BSrSH8wqUvix5JJdo0PHDhFCkHlaeYAAAQIECJS4gOkRIECAAIFaBQQgtbI03sZx48bHtGnTGu8EjkyAAAECBAiUuYD2F0Yg+3PZSiutEJ26dhWALAycsQQIECBAgAABAgQIEGgBAvkOQEpsAQpRiC+//CqmTp1aYjMzHQIECBAgQIBAGQtk/zjFqz/K+AmgdQIEciGgCQIECBAgQIBALQICkFpQGnNToaLQmId3bAIECBAgEAgIECBAgAABAgQIECBAgACB/AvocMECApAFGxlBgAABAgQIECBAgAABAqUtYHYECBAgQIAAAQIE5hIQgMxF0ngbplVVxZQpUxrvBI5MgACBooAvBAgQIECAAAECBAgQIECAQP4FdEiAwIIEBCALEmqox1P40aXzErHGD1aPqGqogzoOAQIECBAgQIAAAQJFAV8IECBAgAABAgQIECAwh4AAZA6Qxvy2Q4cO0W3JJVP+IQEJH40q4OAECBAgkDOBivRHtjmrsjKiVav5V+vWEaVS2Vxn9pCz5dEOAQIECBAgQKC5BJyXAAECBOYvUDH/hz3akAJZ7JG9DVZDHtOxCBAgQIAAgRIUKBQiZl7sz27nFVbUKZxoG/9895/xr/f/VV0fpPsj3hoejz/yaDzx6ONz1ZOPPdfWf+YAABAASURBVBF3D7orbrrxprj5jzfXWjf96aa45opr4urfXx2XX3pFg9UVl18Rf7rhT3Od89GHHokP3v8g3n/v/YjW7VPVCGcaJhxZhCdCIQqFipi2CHvahQABAgQIECBAgAABAgRKX6Ci9KdohgsvYA8CBAgQIECgXgIzQ4ssuMgqu0Bfs+YKLtpEtJ5VU6dMiXdHvBvvvftevP/P9+PVV4bEA/c/GA8/8FB1PfLgw3Hzn2+O6666Lq69+vpiXXfNdXHxhQPjvHMuiPPPnlHnnh+nnNYnTj2j72x10mm94rAeJ8SFA38fF1x82Wx1bjrGoLvvj8HpvC++9HLUVoMHvxIvD3ktnv/H4FhiiSWic6dO9a6unTvHx598Otv5XhoyJPqceW5ccMnlaf6pj9P7xAXnnRfnn3thZP1mYcnTTzyVnN6L/3z2eXJsm6pmOFIZka1BFirVa1Hn2Dkdb+zYsfHBhx9G+7bpnHM87FsCBAgQINAyBMySAAECBAgQmJ9Axfwe9BgBAgQIECBAoMUIzDnR7KJ5zVpAaDErwGgfX/znixjx9vB4Z/iI+Oc770b26oV777onsrr/nvvi0nQxv2b17d0vep3Re0b1iZNP6x1HH39SHPvbk4t1eI/j44TfnTYjrLg8hRWXx7kXDIwnn3o2hqXzDHvrrcjqzWHD4630fffuy8aK31ohVlppxVh+ueXi0ovPTYFIv+o67+x+cfnA8+Ppx+6P6668NK67+vLZ6oZrLi+O7X36ydHnjNqrd9p+9oDeceG5Z8a+e+0e++xd/9prr93ipN8eG/16n1Z93p6nnhTPPH5/3HjtFSnY6RcXnndmLLPMMtG9e/cY/NKQOK33gDj7vIviuORzWq9+cWb/M+OSiy4tGmfhyIvPvRjvvD0ixo4ZE9E6BRXVQVMKSWau75xrX8fvJ0+eHCNHjkz5SgpZ6riPYQQIECBAgAABAgQIECDQzAILcfqKhRhrKAECBAgQIECgaQUKhUhXp6dX9gqM2UKMNhHVF8PnvN82hg19M4a/9Xaq4TH0taFx+623xx233xGDbh8Uf/7Dn+PsM8+Jc88+r1h9evWNE477XRx37Anp9vg4vMdxcdBvesRBhx4VB6faYZe90kX6i+OigVfEWeddHB9++FF1ffDBhzF69JhYb711Yt2114611vpB7LrzDukcV8f1WTBx1WVxz6Bb45knHoi//PG6uOXP0+vWm29IIUX/6NPzlFSnzqhTitv223vP2Gv3XWPPPXaJvVMw0X3FFVIgstLstdJKsXzavtzy3aP7XLV8LL3sMrHkUt1SLTWf6hbdll4qOnTskKpj/atDh+jSpUt0W6rmObvFcinsyOa5YprzCt9aMfbbe48UuuwW553VN14b/HTcdOO1cfEFZ8WOO2wba6y+enTq1Cmee/7FyF7JcvLpveOIo0+IY44/OY479vjIwqZs3bI1fG3Iq/HWG8MisufJbOFI9nxIAUn2fMlCkuwVPTH3R6FQiFbZ82ruh2whQIBAixEwUQIECBAgQIAAgXkLVMz7IY8QIECAAIEWJWCypSyQXYSeWdlF6bkqu2A9s7J/5Z9V+xg1cmS8+fob8fawt+Kxhx8tvmXUX276S9x2821xzlnnRs90cbzXGX2id8++ccRhPeLAXx2S6uBi7bLn/rHHPj+NPff9aeyyx/7xk5/+KgZedmWcd9HAuOu++2PkyFHxvy+/TPVVjBz1Tay22qqx3dZbx+abbxLZKyzuv/v2FFzcEn+74+b46j8fxgP33hF3pfv333V79O11WnX16316un9qCj12jN123TH23G2X2GLzTWOpZZaOZZZbtrqWXmaZYtjQbeml0+3SsVS67dK1SyzRuXN0rlldOke79u2rq326H1OnRkyb1nhVVRXRkDW/uU6dFu07TO+vcxaWJIduKYT5ziorx54p9Nll5+3jZz/ZN6676tJ4/umH4547by2GI3sk12232ar4dl2PPPZEXJLW8hcHHhbZOv/fLw+OX/3ywDj5pFOrX4Vz619ujex58vawt+Of7/wzonWHVG1nVWW7xDo1XhnyWspPCqX8q8fcCBAgQIAAAQIECBCYXcB3BOosUFHnkQYSIECAAAECBArpQvHMICP7l/OtZ/wr++Jtm5j1iowaF5pbd4w3h74Rb7w+tHh7/bXXx4033FhdV1x+VRx79AlxwvEnxpGHHx1777VfChL2jD122yO23WmPWGv9jeMHa/8wtt95zzj2t6fGJZdeGWeee2H8+9PPYvKUyTFp0qSYOHFitG3bNvbbb684YL99Y/99947hb7wUQ/7xdLzy4lPp/uAY/fVn8dB9g+Lxh+6JP99wTTG06J/Ci/69T4tzBvSOg371f7HTjtvGHrvuHN/9zirRuWvX6Lrk9OqSbrOQYoksqEgBxWKLLxY1q+Nii0WbNm2iTZpDVsVXFcwvBJj5WF1Dh7w982r2PdMi9ZitYeaXBUCLd+pUDIeWSN5rrblG7LrLDrHzDtuloOvguHfQbfHMkw/GC888Fm8NHRyHHvzr+Ela9ywgmTatKi694tq46JLfx3kXDkzPnQ1jrQ02S+HKHsXn1W677lm83WfvvePA3/SIV14ZEtlbYaXT+yTQQgVMmwABAgQIECBAgACBeQlUzOsB2wkQINDiBEyYAIG6C8wMMbLbYnjROqL6tm26X1u1jzGjx8SQl4fE0NdejwfufzCu/v3VcfWV18a1V18bp5x0Whx04KHxm0OOiB132CXWW/eHsc7aG8T6660fa623cay9/ibF20MOPSoGXnZ1nH/hZfHHP98aX3zxRXTs2CHatWsbi3daLLKL2Mcd2yN6HHFY3HrTH2LS2C9jwuj/FuvTf70df3/yoXj5hSfjovPOjAF9zogBfafX+ecOKF4g33GHbYpBRvuOHVNIsfisSiFFx7St42IdI3vLp+wie83KLry3SgZZFSGLF+arItIF9WLVvGi/oPvFA/iy0AK1uaZ1KBQKka1LVllIkq1ftpZZCNUhrWn2ipudUni13dY/juwtxb74eETxefLCs4/GhDH/iy8+eTcOP/SQOPaoI6fXMUfG/vvtncK23WPEsCHp+bJ9xJQpCz1dOxAgQIAAAQIECDSTgNMSIECgjgIVdRxnGAECBAgQIFBKAumCcPXPxshCjOKrMWq+AmPm/dqCjI4x7I1h8cpLr8Trr75W/GHTM3+g98UXDow9dt879t3ngNhv35/ELjvvHoVC2xnVOhbvulxssNEWsc4Gm8auu+8bhx91XFw08PLo3e/c+Gb06Fhh+eVi2WWWinXXXTvOHtA3Bl50fpx7Vv+YMv7rmDphZHUN+cfT8earL8QTD98Tvc84Jc7s1zPO7NszzhnQJ3ocfkhkF7KzICN7JUbrNm2ibbt2xcpCipnVuk2b6ovi2YXx1im8qKioiJkV6cL5Ir+tU/goOYHawpFsW1rnmWue3WbPhZnPkey2bdssWFs8dt5pu9h+u62m1zZbxU8P2C+FIYfHaqt+NwrpeVNy/S7EhAwlQIAAAQIECBAgQIAAgdoFBCC1u9jaMgXMmgABAi1LoDL9bzgLLmZWuoA/6y2kagsw2ke0nl5TJk+JF557IV76x0vx8uCX44F7H4yzzzo3zjvn/Oo6+MBDY+ONNo8tt9xmRoAxM8iojDXX/VFsuPGWse6Gm8Wxx5+YQowrYsA5F8Y1190YG26wXqy5xuqxxg++Hxuk+5dfelE89/Sj8fTjD8a/3nkjZQrjo2rq2Ooa8dar8enH78QVv78k+vXrFf37945zzxkQO+28fWy19Rax/Q7bRGXqsaKyMioqp1d2wbm6CoU0v9lrtoXMLnLXtWbb0TdlKTCv50otGIVCYfrWbJ/p93wlQIAAAQIEWoaAWRIgQIAAgToJVNRplEENIzDjL9eFQvrLdvpsmIM6CgECBAg0ikDx9+r0m/WCbrN/OV6z0gX+2V6ZMa/vU9jx7oh345knn46/P/1sPP/sC3Hh+RcXf4Bz757ZD/XuE31790/BQMdYrvvK0blr93S/dXW17tAlNt1yu/jRplvFDzf5cey6575x2um94977H4o7Bt0dH3/y7/je91aNffbeI3bbZac4a0CfeOKR++KlF56O5595LKqmjElBxuTq+uBfw+OLzz+Mt99+PXr16Rl9+/cpVv8BfaPH0UfEpltsFltu/eP49iorR0yeHJH9UO4F1bQaP7Q7+3/gvKpRFrCcDqpXAgQIECBAgAABAgQIECBAoDaBfAUgtXVYQtsKhUK0bdMmnnthcIz88qtIV7HCBwECBAjMQyD9nln8fbKhb2s5XVW6MD9XpYv3VTVqWrrYX1s9+shj8VQKMZ568tl48IGH4uRTzoiePfvGGal69eofhx1+dHRfcbX43g/Wj0Jlx1lVaB+r/WC9+PG2O8cWW+8Ym/142/jdSafF60PfjGFvDY9XXxsaSyyxWAy8+Ow49aTjo1+vk+LqKwfGay89F6/849l4+cWn4/0R2asxpqYQY2J1PfvsEzF48HNx2eWXxEmnnFhdp55+Smy93Tax4Y82jE022yTSDinIGF+jJqb7M2tSul+zUuCR/XyErJJJLYQ2ESBAgAABAgSaVsDZCBAgQIAAAQJ1EKiowxhDGkIgXTBabqWVYt2110jX8wpRUSiEDwIEciqQ/fpWkX6zm2dNS78nLqimpovtUyZPjgXVpIkTo7aaOGFiTJwwobqyMf/77//ioYcfj0cfe6pYjz/xVPzpz7fEyaf3jtN796+unn3OjD33/Wmsse7GsfYGm8X6G20Zle0611onn9Y7jj3h5FQnxmm9+sXrr78Rn//ni/j0089j0qRJsf5660bvM06OE47tEVekUOKRB+6K1195Pl7NgowXnyn+gOaqqskpj5geYtx9z6C4487b4p57/xbHnXBcHHPcUTPqmDj08ENjnfXXjfU3XD82+OGGsfJ3sldjjI2YPDO4qHlbM8CYcT+ZVr9yI4U+4YMAAQIECBAgQIAAAQIECBBoMQImuvACApCFN6vHHlUxJV30KxQK6bpgIdKXpq/wsUCBtD7NsjbOG03mXpF+/TVKTf8tdUEX7Ovz+ITx46PhakKMGzu2WGPHjI06V9pn7JgxMWZ0VqPT7cLUmBj9zTdx34MPx8OPPDHveuyJuDEFEyed2iuFCv3jjN4Daq1efc+KnXffLzbZcvvY9Mc7zKgdY7Otdox2i3dLtVR1tV2sWyzVfdXo1XdAXHbFVTHw8ivi4kuviEF33xNffzUyBSUTk+2EYo1O/e2w/bZxyu+Oi98e3yOOPfrw+OP1V8d111wRr738fAwd8mKqF4o15NUh8frQV4r16qsvpYDl/rj2uqvihj9cE+ecd1YcdsRvquuIHofF9jvtEGuvu06smwUZP9wg2rZtGzE5eyVGzfBi5v3J6bE5aurUWW8/lf6fEj4IECBAgEB5CuiaAAECBAgQIECAwAIFpl9XWJvlAAAQAElEQVStW+AwAxpSYGy6eDg6XTicdQExu4iY1eha/xVz9q+WG6ImTkwX1LKL7DXfq979iBoGU9OFxYawbtpjTEoXbMeni9BjYky6aFtrpefb9IvVaUyp3U9zHj16dIwaOTLVqBo1MkambQ1Zo7LjfT0yvv7y6xr1VXz1ZcPU1+k4n3zy77jv/ofTRfBH48GHHov7H3qkQSo71j33Phi/O6VnnNqzX7FO69U/eqYAoGffM9PtwlefAWfH2htuHquusWHsuNs+scMue9Wpdtx1n1jl++vG4l2XS9U9Ntxk61h/ox/XsbaMH266dVx08eVxx6C/xW133Fl73X5nvPDCi5H9fpm97VSbtm2iTZu5q1AoxK9/8bM48fij4oTjesyoI+P4Y4+M227+Y7z9xssx7LXB1fXGq8/F3/56c9xz791pnabXXXcPimuvvyouvPj8uOiSC4o18NKL4qhjjoxfHvTL+PVBvy5Wdv/g3xwY66y3Tqy1zlqp1i5WTB6bQoqJc9SMV1xMzm4np8dqVM1XYaTfc8IrMcIHAQIECBAgQIAAAQIECNRFwBgCBBZWQACysGL1GZ8ucnVZYom46S+3Ra9+Z0XvdOGyd3abVf+z4sRTe8bf7rkvXZR7uF517wOPFP91dfYvrGvW3eni6UcffhT/+fzz+M9nak6D//7nixj80itxz/0Pzu2XLmhnF7VLse5/4OG48c+3xEmn9YrTzug7W52avu/ZZ0BUP8+y51qJVZ9+Z8dvTzo9Vll9/VgnXYzPaq0NNo2ttt8t9t7//2Kv/X7WgPV/sc2Ou0fXZVaqrrXW3zT22vdnscc+P6137b7P/4tfHHhoXPeHP8aV19wQt9z+13j66b/Hk089U+96/Kmn4tnnno8O7dtH61atUlVG+3btotuSSy5ydencOQ475NdxTI9D47fHHhXHpwChLnXcMUfElZdeELff+qd4/pnH4u47/xL3DLqlznXXX/8S1151aVz/hz/EjX+8fp513Q3XxNXXXhkXXHRe9OvfJ/oNmLvOPLt/Mv9F/L+f/yx+Nkcd8LMD4vs/WD1+sNYa1bXm2mvG8iuuEHO/4iILKuasGqHF5Br3s9CiZtXn/wv2JUCAAIFFF7AnAQIECBAgQIAAAQIEFiBQsYDHPdyQAtOmxg833CD6nHFqrLXmGrHSSivGt761UrG+/a1vxfLdl49hw4bHa0OHLnK9/sYb8cQTT8att90Zt98+aLYaNOiuOOq4E+PgQ4+Kgw9Tcxoc+Jsj44KLL4s77rhrNre/3PLXeHnIq2lN3ki16GtTn3Wd376vvv56fJ5CrWWXWSa6des2Wy3VbclYafkVYuUZz7OZz7dSus1+HayVfj3073lKnHTC0cU6+YRjihfkf3tsj3TbcHXCsUdGn16nxr1/u61Y9wy6Nf56y41xwzW/T3V5g9TVVwyMi84/q1iXXHhuXHTJxXHJwIsapC4eeGGcd8E5M+rcyC7+n3zqiXHyqSctcp148u+K++69/96x3wH71bn2SWP3/8n+scnmm8T3Vv9+MWjIwoY61Rqrx6qrrZpCiHGp5gwdFuX7yek486iaQcXM+942qiH/z+ZYBAgQIECAAAECBAg0oYBTESBAgMDCCQhAFs6rfqOnVcWSSy0Ze+6zRxx7/NFxzHFHVdfR6ULvGb1Om/EvnPum20Wrvv37xpn9eqXqmSq7nb0uPv/sGJguyqpza3U476x+c7md1b9XnDWgd1qTPqn6lmT16dc7evU5o5bqGcefeFwcVeO5VvN5Vyr3s+f/kcccGTOrR/r18PNf/zx223P32H2vPRq09kjHzI6bVXbsTTbfNL77vVVjte9/r0ErCwWWXmbpdGE++9kOi3JRv6n3mUeAUPOVD7XdnzI1qn+o9syAoS63Qoj6/f/E3gQIZAKKAAECBAgQIECAAAECBAjMV0AAMl+eRngwhSCRvf97bRcSi+8VvygXPWvuMzE6d+lc/NfV31n1O6Hqb7Da91aL4nv0N8j61Fyrprq/iBe2a32ONvGxsl8rjV6LeAHfRf5G+A3SIQkQIECAAAECBAgQmL+ARwkQIECAAIGFEahYmMHGthCBqqqI7F9Xq4ZzaCFLb5oECBAoKwHNEiBAgAABAgQIECBAgAABAvkXqEeHApB64NmVAAECBAgQIECAAAECBAg0pYBzESBAgAABAgQI1F1AAFJ3KyMJECBAoLQEzIYAAQIECBAgQIAAAQIECBDIv4AOCSyygABkkensSIAAAQIECBAgQIAAgaYWcD4CBAgQIECAAAECBOoqIACpq5RxBAiUnoAZESBAgAABAgQIECBAgAABAvkX0CEBAgQWUUAAsohwdiNAgAABAgQIECDQHALOSYAAAQIECBAgQIAAAQJ1ExCA1M3JqNIUMCsCBAgQIECAAAECBAgQIEAg/wI6JECAAAECiyQgAFkkNjsRIECAAAECBJpLwHkJECBAgAABAgQIECBAgACBugi07ACkLh0aQ4AAAQIECBAgQIAAAQIECLRsAbMnQIAAAQIECCyCgABkEdDsQoAAAQIEmlPAuQkQIECAAAECBAgQIECAAIH8C+iw/gICkPobOgIBAgQIECBAgAABAgQINK6AoxMgQIAAAQIECBBYaAEByEKT2YEAAQLNLeD8BAgQIECAAAECBAgQIECAQP4FdEiAQH0FBCD1FbQ/AQIECBAgQIAAAQKNL+AMBAgQIECAAAECBAgQWEgBAchCghlOoBQEzIEAAQIECBAgQIAAAQIECBDIv4AOCRAgQKB+AgKQ+vnZmwABAgQIECBAoGkEnIUAAQIECBAgQIAAAQIECCyUgABkobhKZbB5ECBAgAABAgQIECBAgAABAvkX0CEBAgQIECBQHwEBSH307EuAAAECBAg0nYAzESBAgAABAgQIECBAgAABAvkXaMAOBSANiOlQBAgQIECAAAECBAgQIECgIQUciwABAgQIECBAYNEFBCCLbmdPAgQIEGhaAWcjQIAAAQIECBAgQIAAAQIE8i+gQwINJiAAaTBKByJAgAABAgQIECBAgEBDCzgeAQIECBAgQIAAAQKLKiAAWVQ5+xEg0PQCzkiAAAECBAgQIECAAAECBAjkX0CHBAgQaCABAUgDQToMAQIECBAgQIAAgcYQcEwCBAgQIECAAAECBAgQWDQBAciiudmreQSclQABAgQIECBAgAABAgQIEMi/gA4JECBAgECDCAhAGoTRQQgQIECAAAECjSXguAQIECBAgAABAgQIECBAgMCiCLSsAGRROrQPAQIECBAgQIAAAQIECBAg0LIEzJYAAQIECBAg0AACApAGQHQIAgQIECDQmAKOTYAAAQIECBAgQIAAAQIECORfQIcNLyAAaXhTRyRAgAABAgQIECBAgACB+gnYmwABAgQIECBAgEC9BQQg9SZ0AAIECDS2gOMTIECAAAECBAgQIECAAAEC+RfQIQECDS0gAGloUccjQIAAAQIECBAgQKD+Ao5AgAABAgQIECBAgACBegoIQOoJaHcCTSHgHAQIECBAgAABAgQIECBAgED+BXRIgAABAg0rIABpWE9HI0CAAAECBAgQaBgBRyFAgAABAgQIECBAgAABAvUSEIDUi6+pdnYeAgQIECBAgAABAgQIECBAIP8COiRAgAABAgQaUkAA0pCajkWAAAECBAg0nIAjESBAgAABAgQIECBAgAABAvkXaMQOBSCNiOvQBAgQIECAAAECBAgQIEBgYQSMJUCAAAECBAgQaDgBAUjDWToSAQIECDSsgKMRIECAAAECBAgQIECAAAEC+RfQIYFGExCANBqtAxMgQIAAAQIECBAgQGBhBYwnQIAAAQIECBAgQKChBAQgDSXpOAQINLyAIxIgQIAAAQIECBAgQIAAAQL5F9AhAQIEGklAANJIsA5LgAABAgQIECBAYFEE7EOAAAECBAgQIECAAAECDSMgAGkYR0dpHAFHJUCAAAECBAgQIECAAAECBPIvoEMCBAgQINAoAgKQRmF1UAIECBAgQIDAogrYjwABAgQIECBAgAABAgQIEGgIgdIOQBqiQ8cgQIAAAQIECBAgQIAAAQIESlvA7AgQIECAAAECjSAgAGkEVIckQIAAAQL1EbAvAQIECBAgQIAAAQIECBAgkH8BHTa+gACk8Y2dgQABAgQIECBAgAABAgTmL+BRAgQIECBAgAABAg0uIABpcFIHJECAQH0F7E+AAAECBAgQIECAAAECBAjkX0CHBAg0toAApLGFHZ8AAQIECBAgQIAAgQULGEGAAAECBAgQIECAAIEGFhCANDCowxFoCAHHIECAAAECBAgQIECAAAECBPIvoEMCBAgQaFwBAUjj+jo6AQIECBAgQIBA3QSMIkCAAAECBAgQIECAAAECDSogAGlQzoY6mOMQIECAAAECBAgQIECAAAEC+RfQIQECBAgQINCYAgKQxtR1bAIECBAgQKDuAkYSIECAAAECBAgQIECAAAEC+Rdowg4FIE2I7VQECBAgQIAAAQIECBAgQKCmgPsECBAgQIAAAQKNJyAAaTxbRyZAgACBhRMwmgABAgQIECBAgAABAgQIEMi/gA4JNJmAAKTJqJ2IAAECBAgQIECAAAECcwr4ngABAgQIECBAgACBxhIQgDSWrOMSILDwAvYgQIAAAQIECBAgQIAAAQIE8i+gQwIECDSRgACkiaCdhgABAgQIECBAgEBtArYRIECAAAECBAgQIECAQOMICEAax9VRF03AXgQIECBAgAABAgQIECBAgED+BXRIgAABAgSaREAA0iTMTkKAAAECBAgQmJeA7QQIECBAgAABAgQIECBAgEBjCJRWANIYHTomAQIECBAgQIAAAQIECBAgUFoCZkOAAAECBAgQaAIBAUgTIDsFAQIECBCYn4DHCBAgQIAAAQIECBAgQIAAgfwL6LDpBQQgTW/ujAQIECBAgAABAgQIECh3Af0TIECAAAECBAgQaHQBAUijEzsBAQIEFiTgcQIECBAgQIAAAQIECBAgQCD/AjokQKCpBQQgTS3ufAQIECBAgAABAgQIRDAgQIAAAQIECBAgQIBAIwsIQBoZ2OEJ1EXAGAIECBAgQIAAAQIECBAgQCD/AjokQIAAgaYVEIA0rbezESBAgAABAgQITBfwlQABAgQIECBAgAABAgQINKqAAKRReet6cOMIECBAgAABAgQIECBAgACB/AvokAABAgQIEGhKAQFIU2o7FwECBAgQIDBLwD0CBAgQIECAAAECBAgQIEAg/wLN2KEApBnxnZoAAQIECBAgQIAAAQIEyktAtwQIECBAgAABAk0nIABpOmtnIkCAAIHZBXxHgAABAgQIECBAgAABAgQI5F9AhwSaTUAA0mz0TkyAAAECBAgQIECAQPkJ6JgAAQIECBAgQIAAgaYSEIA0lbTzECAwt4AtBAgQIECAAAECBAgQIECAQP4FdEiAAIFmEhCANBO8x5xnWAAABuRJREFU0xIgQIAAAQIECJSngK4JECBAgAABAgQIECBAoGkEBCBN4+wstQvYSoAAAQIECBAgQIAAAQIECORfQIcECBAg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" class="kg-image" alt="" loading="lazy"/></figure><h2 id="%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%8A%80%E8%A1%93">使用した技術</h2><ul><li>Next 15 / TypeScript</li><li>TailwindCSS v4</li><li>Python / Boto3</li><li>AWS<br>・Bedrock (gpt-oss-20b)<br>・S3 + CloudFrontによるフロント配信<br>・Lamda (Serverless Framework)</br></br></br></li></ul><figure class="kg-card kg-image-card"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCATJBkADASIAAhEBAxEB/8QAHgABAQACAwEBAQEAAAAAAAAAAAcBAgMGCAUECQr/xAB1EAABAgQCBAIQEQkDBwcHCgcAAQIDBAUGBxEIEiExE1EUFRY2QVZXYXR2kZSztNHSFxgiMjU3OFRxdZOVlqGx1PAjNEJygZKytdMJM1MkJSdSYnPBGSZlgqLC4ShDRFVkg/E5R1hjZneEhYbD4kVGo8TF8v/EABwBAQADAQEBAQEAAAAAAAAAAAABAgUEAwYHCP/EAEgRAQABAQMFDAgEBgIABQUAAAABAgMEEQUSITFRExQVIjIzQWFxkbHRBjRCUlNygZIHQ6HBFhc1VGKyI+EkJTZzoiZEY/Dx/9oADAMBAAIRAxEAPwD+p/Bs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAHHwbOJvcHBs4m9w5ABx8Gzib3BwbOJvcOQAcfBs4m9wcGzib3DkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGM0GaAZAAAGM0GaAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB7bB4kAHtsHiQAe2weJAB//Z" class="kg-image" alt="" loading="lazy"/></figure><p>上記のようななるべく費用のかからない構成にしています。UIはGitHubのようなイメージで作成しました。また、今回はPythonやLamda、Noiton APIを初めて使用したため、自分で調べつつAmazon Q developerに手伝ってもらいながら実装をしました。<br/></p><p>今回のゴールとしては「振り返りをAIに返却してもらう」までとして、過去の振り返り閲覧などはスコープ外にしました。(Nextの学習を深めるために見た目は実装しています)<br/></p><h2 id="%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E8%80%83%E3%81%88%E3%82%8B">やることを考える</h2><p>設計や調査、実装に関するタスクを事前にプランニングしました。また、技術選定やデザイン作成、どの部分で生成 AIを活用するかなどの構想も行いました。<br><br>▼Miroでタスクを洗い出し</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image2-min.png" class="kg-image" alt="" loading="lazy" width="1999" height="1004" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/image2-min.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/image2-min.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/image2-min.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image2-min.png 1999w" sizes="(min-width: 720px) 720px"/></figure><p>▼Miroで作成した github likeなデザイン</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image3-min-3.png" class="kg-image" alt="" loading="lazy" width="1662" height="1006" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/image3-min-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/image3-min-3.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/image3-min-3.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/image3-min-3.png 1662w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F">実装してみた</h2><h3 id="%E2%AD%90%EF%B8%8F%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">⭐️フロントの作成</h3><p>コンテナプレゼンテーションを採用し、直感的にわかりやすい粒度でコンポーネントに分けて実装しました。Buttonは共通コンポーネントとして作成し、渡すpropsをオブジェクトのキーとして定義し、それに応じてCSSを切り替えるという実装をしました。枠レイアウトであるContainerの実装は、自作したButtonを参考にQ devにお願いしてみましたが、スムーズに実装してくれました。</p><p>また、ローディング処理といった軽微な作業もQ devにお願いしました。自分は普段ローディングの処理をuseStateとuseEffectやReact Hook formを活用した実装していましたが、Q devは &lt;Susponse /&gt; 使用した記述を提案しました。「生成 AI を使用することが副産物学習につながる」という点が、とてもモダンな学習方法だなと感じました。(Reactの標準機能を知ることができたのは良かった..と同時に公式ドキュメントをもっと読もう！と思いました)</p><h3 id="%E2%AD%90%EF%B8%8Faws%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97">⭐️AWSのセットアップ</h3><p>基本的に自力でセットアップしてみました。Serverless.yml の記述やセッティングが難しかったなと感じました。</p><p>起こった問題：</p><ul><li>デプロイ時に serverless-python-requirements でエラーになる<br>1. <strong>serverless Frameworkの進化</strong>: 新しいバージョンでは<br>serverless-python-requirementsが<strong>組み込み機能</strong>になった<br>	・プラグインとして追加する必要がない<br>	・custom.pythonRequirements設定があれば自動で有効<br>2. <strong>互換性の問題</strong>: 外部プラグイン版の<br>serverless-python-requirementsと組み込み版が競合してJSZipエラーが発生</br></br></br></br></br></br></li></ul><p>Q devに聞くと上記のような返答が返ってきました。実際に調べてみても正しい情報であるため、Q devの手順通りに修正しました。自分だと時間がかかってしまう作業を一瞬で解決できたという点に驚きました。また、「Serverlessのスタック状態を確認する」などの簡単なAWS CLIコマンドも一瞬で出してくれたため、スムーズに作業ができました。</p><h3 id="%E2%AD%90%EF%B8%8F%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89">⭐️バックエンド</h3><p>Q devを活用して下記の内容を実装しました。ファイル数も少なかったため、実装はスムーズに行うことができました。</p><ul><li>Pythonの記述や構文の質問</li><li>Bedrockに送るプロンプトの相談</li><li>Notionのレスポンスのイメージを出力</li><li>リファクタリングの相談</li></ul><p>振り返り方法は「ランダム」「直近の1件振り返り」で実装する想定であったため、Notionからの取得の部分に工夫が必要でした。Notionの仕様上、ランダム取得ができないため自前での実装が必要なのですが、この部分をQ devにお願いしてみました。しかし実装してもらった Notion取得時のレスポンスが異常に遅かったため、コードをみると「全てのデータを取得」後にランダムサンプリングしていました。そのため、「特定のidのみを取得」という実装の方がいいのではないか？という相談をQ devにしながら修正していきました。</p><h2 id="%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE">デプロイしたもの</h2><figure class="kg-card kg-image-card"><img src="data:image/png;base64,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" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAANXCAYAAABt55MjAAAQAElEQVR4AezdB4BcVdnG8efMzPaS3iCB0AWkg4IKIr2IonSk6keRoiCoIEpTiqJUG1gAQUAUBURAQLogvSNFek0gySbZvlO++9zlJpNlN43dzWbmv3B2Zm4595zfPTNJ3nfOvana2toCBQPGAGOAMcAYYAwwBhgDjAHGAGOAMcAYYAyU9Bjg3/7EPxgDjAHGAGOAMcAYKLsxkBI/CCCAAAIIlJ0AHUYAAQQQQAABBBBAAAEEEEAAgdIXoIflLkACpNxHAP1HAAEEEEAAAQQQQACB8hCglwgggAACCCCAAAIIlJkACZAyO+F0FwEEugX4jQACCCCAAAIIIIAAAggggAACpS9ADxFAoLwFSICU9/mn9wgggAACCCCAAALlI0BPEUAAAQQQQAABBBBAAIGyEiABUlanm87OFeAZAggggAACCCCAAAIIIIAAAgiUvgA9RAABBBAoZwESIOV89uk7AggggAACCJSXAL1FAAEEEEAAAQQQQAABBBBAoIwEyjYBUkbnmK4igAACCCCAAAIIIIAAAgggULYCdBwBBBBAAAEEyleABEj5nnt6jgACCCBQfgL0GAEEEEAAAQQQQAABBBBAAAEESl+AHn4gQALkAwgeEEAAAQQQQAABBBBAAAEESlGAPiGAAAIIIIAAAgiUqwAJkHI98/QbAQTKU4BeI4AAAggggAACCCCAAAIIIIBA6QvQQwQQiAVIgMQM/EIAAQQQQAABBBBAAIFSFaBfCCCAAAIIIIAAAgggUJ4CJEDK87zT6/IVoOcIIIAAAggggAACCCCAAAIIIFD6AvQQAQQQQCASIAESIfA/AggggAACCCCAQCkL0DcEEEAAAQQQQAABBBBAAIFyFCABUm5nnf4igAACCCCAAAIIIIAAAggggEDpC9BDBBBAAAEEEBAJEAYBAggggAACCJS8AB1EAAEEEEAAAQQQQAABBBBAAIHSF+jZQxIgPUV4jQACCCCAAAIIIIAAAggggMDSL0APEEAAAQQQQGARBQqFgvL5vHK5nLLZrLq6utTZ2Rk/+rXXeZtFrJbNl6AACZAliM+hEUAAAQQGS4DjIIAAAggggAACCCCAAAIIIIBA6Qsseg+d2GhtbZVLW1ub2tvb1dHRMU/iI0mEeJ238bZJISGy6OaDuQcJkMHU5lgIIIAAAggggAACCCCAwGAJcBwEEEAAAQQQQACBXgWctEgSGJ7hseWWW+qEE76vCy74uf501Z90++2364nHn9ALz7+gF1/8n5566hndd9/9uuGGG/S73/1ep576Ix2w/4GaMH6ikoSIEym9HoyFS1SABMgS5efgCCAwWAIcBwEEEEAAAQQQQAABBBBAAAEESl+AHiIwP4Ek8eGkRTqV0U/P+pluu+02/eSsM/WNb35dW26zmVZcdZJqGyvVlp+tGe1T1VqYosrGJtUMy2v02BFad4M19fUj9tMPf3SCrv7LFbryyj9pu213iGeMOKniy2fNrw2sG1wBEiCD683REEAAAQQQQAABBBAYLAGOgwACCCCAAAIIIIAAApFAceJjzOix+ulPf6ZHH39EO35hazWOyujxZ/+t3/3hpzrtvAN0zLmf0kE//Yy+dt5n9J1LPqM/3PZp3fnEp3XGZZ/WT675tP7zyi5q6bxAMzuu16gJ72rLrdfQueedqZtv+qe+tPOX48tnORHimSXRofl/CQuQAFnCJ4DDD5YAx0EAAQQQQAABBBBAAAEEEEAAgdIXoIcIIIDAvAK+n4dnfKy66qr6xS9+oXv/fbd22HFrvfTaw7ry72frvMsO0S33/1iPPHexWrMva+zwUZo4qkHLjajUciOX18Sx66mmagNt/9nP6Iwj/08H7rCXRjW2aPiIe9WROkePv/wNvTj116oePUUX/fYXuuaaa7T/fgfIl8RyImTe1vBqsAVSg31AjocAAggggAACCCAwSAIcBgEEEEAAAQQQQAABBBAoYwEnIHxJqlNOOSW+t8fntthM9/znJl39j/P0wNM36P3ZryiVqlBF1XBV1DWqqr5SqaqC0lWKllVIqZy6sh2qquzSBmuM0NiRtQpKq7MzpZefy2va68PV1PauHnvtl7r4X/vp6z+boBETqvW9H3xXf7/+71pnnXXim6t7Bor4WSICqSVy1CVwUA6JAAIIIIAAAggggAACCCCAAAKlL0APEUAAAQQQsICTH3687LLLdeCB+6tp5lR958R9dPPdv9cb7z+v6bNfV0vLVLV3tKq5a5baQ4tymazS1RmlKgvyf81trXrtndl6571WNbXM0LszX9O0ltf11pQ3ddNFb+j9xyr06qtZvfx6vd54XXrrPenM63bULQ9eobXWX1V//OMV2mKL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AggggAACCCCAAAIIlL4APVxKBUiALKUnjmYjgAACCCCAAAIIIIAAAktGgKMigAACCCCAAAIIILB0CJAAWTrOE61EAIGhKkC7EEAAAQQQQAABBBBAAAEEEECg9AXoIQIILJUCJECWytNGoxFAAAEEEEAAAQQQWHICHBkBBBBAAAEEEEAAAQQQWBoESIAsDWeJNg5lAdqGAAIIIIAAAggggAACCCCAAAKlL0APEUAAAQSWQgESIEvhSaPJCCCAAAIIIIDAkhXg6AgggAACCCCAAAIIIIAAAggMfQESIB/1HLE/AggggAACCCCAAAIIIIAAAgiUvgA9RAABBBBAAIGlToAEyFJ3ymgwAggggAACS16AFiCAAAIIIIAAAggggAACCCCAQOkLLO09JAGytJ9B2o8AAggggAACCCCAAAIIIDAYAhwDAQQQQAABBBBAYCkTIAGylJ0wmosAAggMDQFagQACCCCAAAIIIIAAAggggAACpS9ADxFYugVIgCzd54/WI4AAAggggAACCCCAwGAJcBwEEEAAAQQQQAABBBBYqgRIgCxVp4vGIjB0BGgJAggggAACCCCAAAIIIIAAAgiUvgA9RAABBJZmARIgS/PZo+0IIIAAAggggAACgynAsRBAAAEEEEAAAQQQQAABBJYiARIgS9HJGlpNpTUIIIAAAggggAACCCCAAAIIIFD6AvQQAQQQQACBpVeABMjSe+5oOQIIIIAAAggMtgDHQwABBBBAAAEEEEAAAQQQQACBpUZgsRMgS00PaSgCCCCAAAIIIIAAAggggAACCCy2ADsigAACCCCAAAJLqwAJkKX1zNFuBBBAAIElIcAxEUAAAQQQQAABBBBAAAEEEECg9AXoYYkIkAApkRNJNxBAAAEEEEAAAQQQQACBgRGgVgQQQAABBBBAAAEElk4BEiBL53mj1QggsKQEOC4CCCCAAAIIIIAAAggggAACCJS+AD1EAIGSECABUhKnkU4ggAACCCCAAAIIIDBwAtSMAAIIIIAAAggggAACCCyNAiRAlsazRpuXpADHRgABBBBAAAEEEEAAAQQQQACB0heghwgggAACJSBAAqQETiJdQAABBBBAAAEEBlaA2hFAAAEEEEAAAQQQQAABBBBY+gRIgCzqOWN7BBBAAAEEEEAAAQQQQAABBBAofQF6iAACCCCAAAJLvQAJkKX+FNIBBBBAAAEEBl6AIyCAAAIIIIAAAggggAACCCCAQOkLlFoPSYCU2hmlPwgggAACCCCAAAIIIIAAAv0hQB0IIIAAAggggAACS7kACZCl/ATSfAQQQGBwBDgKAggggAACCCCAAAIIIIAAAgiUvgA9RKC0BEiAlNb5pDcIIIAAAggggAACCCDQXwLUgwACCCCAAAIIIIAAAku1AAmQpfr00XgEBk+AIyGAAAIIIIAAAggggAACCCCAQOkL0EMEEECglARIgJTS2aQvCCCAAAIIIIAAAv0pQF0IIIAAAggggAACCCCAAAJLsQAJkKX45A1u0zkaAggggAACCCCAAAIIIIAAAgiUvgA9RAABBBBAoHQESICUzrmkJwgggAACCCDQ3wLUhwACCCCAAAIIIIAAAggggAACS63AQidAltoe0nAEEEAAAQQQQAABBBBAAAEEEFhoATZEAAEEEEAAAQRKRYAESKmcSfqBAAIIIDAQAtSJAAIIIIAAAggggAACCCCAAAKlL0APS1SABEiJnli6hQACCCCAAAIIIIAAAggsngB7IYAAAggggAACCCBQGgIkQErjPNILBBAYKAHqRQABBBBAAAEEEEAAAQQQQACB0heghwggUJICJEBK8rTSKQQQQAABBBBAAAEEFl+APRFAAAEEEEAAAQQQQACBUhAgAVIKZ5E+DKQAdSOAAAIIIIAAAggggAACCCCAQOkL0EMEEEAAgRIUIAFSgieVLiGAAAIIIIAAAh9NgL0RQAABBBBAAAEEEEAAAQQQWPoFSIAs6ByyHgEEEEAAAQQQQAABBBBAAAEESl+AHiKAAAIIIIBAyQmQACm5U0qHEEAAAQQQ+OgC1IAAAggggAACCCCAAAIIIIAAAqUvUOo9JAFS6meY/iGAAAIIIIAAAggggAACCCyMANsggAACCCCAAAIIlJgACZASO6F0BwEEEOgfAWpBAAEEEEAAAQQQQAABBBBAAIHSF6CHCJS2AAmQ0j6/9A4BBBBAAAEEEEAAAQQWVoDtEEAAAQQQQAABBBBAoKQESICU1OmkMwj0nwA1IYAAAggggAACCCCAAAIIIIBA6QvQQwQQQKCUBUiAlPLZpW8IIIAAAggggAACiyLAtggggAACCCCAAAIIIIAAAiUkQAKkhE5m/3aF2hBAAAEEEEAAAQQQQAABBBBAoPQF6CECCCCAAAKlK0ACpHTPLT1DAAEEEEAAgUUVYHsEEEAAAQQQQAABBBBAAAEEECgZgT4TICXTQzqCAAIIIIAAAggggAACCCCAAAJ9CrACAQQQQAABBBAoVQESIKV6ZukXAggggMDiCLAPAggggAACCCCAAAIIIIAAAgiUvgA9LBMBEiBlcqLpJgIIIIAAAggggAACCCDQuwBLEUAAAQQQQAABBBAoTQESIKV5XukVAggsrgD7IYAAAggggAACCCCAAAIIIIBA6QvQQwQQKAsBEiBlcZrpJAIIIIAAAggggAACfQuwBgEEEEAAAQQQQAABBBAoRQESIKV4VunTRxFgXwQQQAABBBBAAAEEEEAAAQQQKH0BeogAAgggUAYCJEDK4CTTRQQQQAABBBBAYP4CrEUAAQQQQAABBBBAAAEEEECg9ARIgPQ8p7xGAAEEEEAAAQQQQAABBBBAAIHSF6CHCCCAAAIIIFDyAiRASv4U00EEEEAAAQQWLMAWCCCAAAIIIIAAAggggAACCCBQ+gLl1kMSIOV2xukvAggggAACCCCAAAIIIICABSgIIIAAAggggAACJS5AAqTETzDdQwABBBZOgK0QQAABBBBAAAEEEEAAAQQQQKD0BeghAuUlQAKkvM43vUUAAQQQQAABBBBAAIFEgEcEEEAAAQQQQAABBBAoaQESICV9eukcAgsvwJYIIIAAAggggAACCCCAAAIIIFD6AvQQAQQQKCcBEiDldLbpKwIIIIAAAggggECxAM8RQAABBBBAAAEEEEAAAQRKWIAESAmf3EXrGlsjgAACCCCAAAIIIIAAAggggEDpC9BDBBBAAAEEykeABEj5nGt6igACCCCAAAI9BXiNAAIIIIAAAggggAACCCCAAAIlKzAnAVKyPaRjCCCAAAIIIIAAAggggAACCCAwR4AnCCCAAAIIIIBAuQiQACmXM00/EUAAAQR6E2AZAggggAACCCCAAAIIIIAAAgiUvgA9LFMBEiBleuLpNgIIIIAAAggggAACCJSrAP1GAAEEEEAAAQQQQKA8BEiAlMd5ppcIINCXAMsRQAABBBBAAAEEEEAAAQQQQKD0BeghAgiUpQAJkLI87XQaAQQQQAABBBBAoJwF6DsCCCCAAAIIIIAAAgggUA4CJEDK4SzTx/kJsA4BBBBAAAEEEEAAAQQQQAABBEpfgB4igAACCJShAAmQMjzpdBkBBBBAAAEEyl2A/iOAAAIIIIAAAggggAACCCBQ+gIkQEr/HNNDBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQTKToAESNmdcjqMAAIIIICAhAECCCCAAAIIIIAAAggggAACCJS+QLn3kARIuY8A+o8AAggggAACCCCAAAIIlIcAvUQAAQQQQAABBBAoMwESIGV2wukuAggg0C3AbwQQQAABBBBAAAEEEEAAAQQQKH0BeohAeQuQACnv80/vEUAAAQQQQAABBBAoHwF6igACCCCAAAIIIIAAAmUlQAKkrE43nUVgrgDPEEAAAQQQQAABBBBAAAEEEECg9AXoIQIIIFDOAiRAyvns03cEEEAAAQQQQKC8BOgtAggggAACCCCAAAIIIIBAGQmQACmjkz1vV3mFAAIIIIAAAggggAACCCCAAAKlL0APEUAAAQQQKF8BEiDle+7pOQIIIIAAAuUnQI8RQAABBBBAAAEEEEAAAQQQQKD0BT7oIQmQDyB4QAABBBBAAAEEEEAAAQQQQKAUBegTAggggAACCCBQrgIkQMr1zNNvBBBAoDwF6DUCCCCAAAIIIIAAAggggAACCJS+AD1EIBYgARIz8AsBBBBAAAEEEEAAAQQQKFUB+oUAAggggAACCCCAQHkKkAApz/NOrxEoXwF6jgACCCCAAAIIIIAAAggggAACpS9ADxFAAIFIgARIhMD/CCCAAAIIIIAAAgiUsgB9QwABBBBAAAEEEEAAAQTKUYAESDme9fLuM71HAAEEEEAAAQQQQAABBBBAAIHSF6CHCCCAAAIIiAQIgwABBBBARTij/AAAEABJREFUAAEEECh5ATqIAAIIIIAAAggggAACCCCAQPkJlF8CpPzOMT1GAAEEEEAAAQQQQAABBBBAoPwE6DECCCCAAAIIlL0ACZCyHwIAIIAAAgiUgwB9RAABBBBAAAEEEEAAAQQQQACB0hegh/MKkACZ14NXCCCAAAIIIIAAAggggAACpSFALxBAAAEEEEAAAQTKXIAESJkPALqPAALlIkA/EUAAAQQQQAABBBBAAAEEEECg9AXoIQIIFAuQACnW4DkCCCCAAAIIIIAAAgiUjgA9QQABBBBAAAEEEEAAgbIWIAFS1qefzpeTAH1FAAEEEEAAAQQQQAABBBBAAIHSF6CHCCCAAAJzBUiAzLXgGQIIIIAAAggggEBpCdAbBBBAAAEEEEAAAQQQQACBMhYgAVI2J5+OIoAAAggggAACCCCAAAIIIIBA6QvQQwQQQAABBBBIBEiAJBI8IoAAAggggEDpCdAjBBBAAAEEEEAAAQQQQAABBBAofYE+ekgCpA8YFiOAAAIIIIAAAggggAACCCCwNArQZgQQQAABBBBAAIFuARIg3Q78RgABBBAoTQF6hQACCCCAAAIIIIAAAggggAACpS9ADxHoVYAESK8sLERg8QUKhYLiks+rQMGAMcAYYAx8eAwUos/HDz4rF//Tlj0XJBD/WWRrxuCHxyAmmJT8GIg+Z+njgse5PyOjP4/ksqAPVdYvtgB/HvF+5N/FjAHGwALGQPLnkQqL/VnLjggg0LcACZC+bViDwEIL+C/12WyXujrblct2KJ/riv7YykYlFxU/UgpaQgYclzHIGBhiYyAn5aPPg+hzMpftjD83s9Hnpz9HF/pDlw37FChE/3iyZzb+86hThchaBf4s4s+g6D3HZ+EQ+yzknCz592X02Rh9Pvrv7dkP/jzKZbPR5yvBpwjhI/+fjxJw2a5O+c+jfPTvo0Iuso28l/x5573HOWAMlPQYWCr/vhP9eRT9nT2f82dmR/zvo7w/M6O/uXzkD2MqQACBWIAESMzALwQWX8BJj66ONo0dP1Frrf9pbbrFztrui/vqC7sdrC/ucQgFA8YAY4Ax0GMM7LTbQdpu53312a2/pLU3+IzGjltW2a42dUafpYv/aVzeexYKBXW0t6oQBfHGL7Oc1vvE5tp8my9Hfx7tp512P0hf3D3684hSVg6cc8Y8Y2BBY+Bg7bTr17TtTnvr05/7vNZcZ2ONGjNOba1tckKkvP9UWfzeF6JEfHtrqyozGS23wmpaf+Mt9bntdteOXz5QX9jjYH1xj0Ojcgilx9+N+HcjY4IxUMZjYPeD4z+Ptvn8V7TJ5jtq1TXWVX3DcHW0tSkXJ0IW/zOZPRFAoFuABEi3A79LV2DAeubER2v0l/tll1tJ20T/cNpq+1219nqfUsOIMWprz+q992doytT3ozKNMhWDKRjwPmAMfDAG3td705rU0pZVTd0Irbn2J7Vl9Pm53Rf310qrrS1/rnZ1dkh84ykyWPD/hSjx4cRRW/QPJFtuu/P+2mLbL2vVNTdQ3bDR6sxJM2e3asbM2VFppszEYAYGvA8YA3PGwKzmduVSlRo1Lkocf3Kz6M+j3bTVDrtqzJhl4j+PSIQs+M+hZItClPhoi/5t1NbWrnU2/JS2+eI++uxWX9BKq35c6YpaNUV/Fk15b1r0dwH+fcS/CzwOBqxEY4y6GWNL2RiIPhunzZitrlzQmHGTtPGm22mbz++pzaO/01dWpOM/j0iEJH/a8IjA4gmQAFk8N/YqY4FCFGzyt5omLr+qvrzn/0V/MO2lYSPH6aGHH9Xlf/qrbvznv3TnPffp3/c/oPvuf5CCAWOAMcAY6DEG/Pl417336ebb7tCV11yrRx97QvWNI7XZVl/Uznt8VROXXyWeDeJrBZfxHzcL7Ho+n1O2q10rrLymdt/vMG282baqrhumJ5/5r/5199164OFH9NiTT0Wvn9ZTzz4blWcoz2LwFAa8DxgD8Rh4MnJ48pmn9dgTT+j+Bx/UrbffqZdefU0TJq2kHXc9UDvtsp9GjV5GnZ5dF/39X/z0KeDAXK6rU+tHSaS9v3qUNvzUVlHArl233PovXXXN9brtzrt1z7/v13338W8j/n3IGGAMMAY+NAaiz8Z77/uP7rj7Xl134y265m/X68233on/TbTb/kdr862/qIaGEfGlsfr8IGYFAgjMV6D0EyDz7T4rEVg0gUI+r1xXR/ytpjjQVNuop596Utdd/w+9HP2Dqa4qpdqqjGqrK6JSSanGoBYD3geMgd7HQFX0OenPy4qUXnr5Ff3pL9fq4SgAVRMF8P35usHGWyqf74pKXvx8WCAfJT8y6bQ++ZntorKNUukqPfb447rz3ns1ZepUZVJBmXRKFZl0VDKUDAYVGPA+YAzMMwYqM92fC5noszQdfWYGFfTKa6/pruhz9OWXX9Lw0eO16Zaf12of3zBKNnfIX4ISPx8ScPKjqrJSn9tuV3183U3kGSD33HWnbvzn7WpqalJDTYVqKjPdfxeoqex+HMi/G1E3xowBxsDSNgY++Gysif59VFeVUT7XpfsfekR/u/4GvfH661pu8qr67DY7a/LKa8RJ+Q99ELMAAQQWKEACZIFEbIBAt0ChkFdHe7vW/eTmWjP6y/2MGU2695579NiTT0f/mAqqqsgohNC9Mb8RQACBJSywtBw+hKDK6POzobZK/33hRd1377+jgMlMrbH2Rtpgk63UHn3uFqLk89LSn8FoZz7yaG/v0Mabba9V1lhX06IA0yOPPaq33303/rMonU4NRjM4BgIIIFBSAiGE6O/0Djxloz+PXtCjjz6qbD5o3Q0/I98fpL2tTVEWpKT6/FE7k8t2/T979wHYRnn+cfx3J8nbsTOc7ey9J1kQNpRCFy2d0H/3nrRAW0oHq6WFQkspLYUOCnRAB9DJzoJAQkL2Xs4eTpx4D0n/5z1nOIkTMuzYkr6KzpJOd+/7Pp9T3rt7Hw1lZ+doygVvV8cuPbVyxQrNmDFTGzdvVX6bLLE/Ol1h1kcAgVQU8G1/lG1JHLlEyOzXNN+O8/1QmsZNukBdCvuoproiFVmIGYHTEuAM+bT4WDllBOJx1dgg3IRzLtbg4eO0zQaZXn7lVe0u2RsMNnkeiY+UeS0QKAKNCjDzdAVcN5qRFtHuPSV6xQ7016xZo0FDx2rClAsUjdbYmFP8dKtIivVdMt69K+zs8y9Tz76DtXbdOi1ZtixIFDHQlBSbmCAQQKCFBTzPU8j3VbJvnxYuXqTSikqNGn+2Ro2bogqXBBEXJxCLRZWekRUk49t16BIkjNzXLtbU1loiKeQWYUIAAQQQOA0B3/ZFId/T2vVFmjVrlioqqnXOBVfIfR17TY0l5U+jbFY9XQHWTzQBEiCJtsVob4sIVFdXqt/gkRoy4ixt37Zdr772uhSPBV8v0iINolIEEEAgSQXcIH7cBlWmz3xNq1ev1qBh44Op1vrhJA35pMKqqa7SyLHnaOCQMVpmiY/lK1fZ7ijGJxBPSpGFEUCgyQSSuKCQ7wfJ5YWLF2tfWblGnzVVHTp0UF1dTRJHfeKhuU8iTjj7YnXq0kNLzWjNug1yb2TwLYF04qWwJAIIIIDA8QQ8zwuSyqWlZXpx2gzVRaWzplyk9pZ4rqurPd6qPIcAAg0ESIA0wOAuAo0JxGIxZWZlacjw8Sop2aN5r8+zxWLy7aTI7nBFIBDgDwIINJ2A53nKy83QwkWLtXv3bvUdOELtO3ZTNFrXdJUkYEl1tTXq3rO/evcfqu07d2jthg1KT4uQ/EjAbUmTEUAgMQTc8X5dba0W2QB/VXWNxk++WOFQOEg8J0YEzdPK2poq9ek3SD16D9S6tWu0au06pUdCzVMZpSKAAAKtUOBMN8m9SazOzgUWL16ktPQsDR89SbFYneLx+JluCvUhkJACJEAScrPR6DMpUFdbpYFDx6lNfjstXLBQZRWVwcfiz2QbqAsBBBBINQHP8+Te1eQGVnJy89Wn/xBV2+BTqjkcjNdObupq69RnwNDgpKeoqMgG4TiMO+jDnZYSoF4Ekl7AJUHKyyu0YtVKderaw/ZHw2z/VJP0cR8rwHgsZoNuMY0YM1kVFRWWHFoq3xPJeHFBAAEEmlcgEg6raONmbd++Td179lWXrr3lfoupeWuldASSQ4Az5+TYjkTRTAKxWFS5ee01YPBIbdy4Ses3bQl+rFdHXZiBAAIIINDUAiE/pHUbNmnnzh0aPHy80sJeMOjS1PUkQnl1dTXq0WegDbwN1TY76XG/leIG5RKh7bQRAQQQSHSBcDikzVu3Br8LMmDIaKWnZ6Ts/qjW9kfDRk1U+46dNWvmLFVVV/PJ+ER/gdP+UxBgFQTOvIBnyWaXcJ47d75q62IaOnK8ampT+xPyZ34rUGOiCpAASdQtR7vPiEBtTXUw2BSXr82bNyndTn7OSMVUggACCCAgd5AvxbVuzVr5obCGjJwk9xsYqUhTUxtVj979FI9LW7dtNQK7Y39b/EoDEEAAgRQR8G2ntHPHDqVnZFlCerDqaqtTJPJDYcbjMbl3IHft0Ue7i3eraPN2e8xXXx0S4h4CCCDQvALuDVBllZUqWr9O7Tp0VkGHjkr1rwluXnFKTxYBEiBNtCUpJhkF4rJjfBV06qra2lrt3r1HoRD/ZZJxSxMTAgi0XoGIJZ5Xrtukqopyde/VT7EUHPePu6yHbaIuXXuqrKxUu0v2yvfZHxkJVwQQQOCMCbh+d8+eEnmWkHfnB9Fo6u2Q3G8j5rfrpLy89tq+bZsyMsJnzL+1VUR7EEAAgZYSyEyLaNmK1UpPz1Snbj0VS/HfSWyp7UC9iSXgJ1ZzaS0CZ07AHeC3s2x6Rka2SktLg++e9zzvzDWAmhBAAIHWL3BGWmg5EG3atEm5uXlq27at3NcTnpGKW0klLt6CgoLgXcfbt++wVqXeoJsFzRUBBBBoUQF3FlBRXaXKykq536bKzMxU3L1bqkVbdWYrd4NsHTp2UTQa1d69exUmGX9mNwC1IYAAAibg+55Kyyu0d9++4A27nty5gZvsSa4INK9AwpZOAiRhNx0Nb24Bd4Cf365AWdk5QQIkGos1d5WUjwACCCDQiEBGWkTr129QemaW2rbrqJgNvDSyWNLOikbr1L5jV4UjEW3bsV3hEF83krQbm8AQQKDVCniep2hdncory5WX3045bdoqnmLnB+4NYm3y2ykai6usvFxuEK7VbjAahgACCCSxgOVAtLdkj/LbdpDnWQqE/EcSb21CawoBvykKoQwEklHADbBlZmYrIyNL1dXVQU49GeMkJgROS4CVETgDAm6AZfOOYkXCEWVk5qTeJ0CiMWVl5Srkh7SvtDw4yTkD7FSBAAIIIHCEgBv4r62uUVZ2rtLSMxRLtU+AxCR3buTJU3VVtWSDbuKCAAIIINACAnFV2ThVho1ZeZ4n7f/K3GZvCBUgkKACJEASdMPR7OYXiMWlUCQi3wbc3ENHknYAABAASURBVLu92KE0vzk1IIAAAo0JeJ6n2n2V8v2QwpGwdcfWQTe2YJLOc+cz4UiaDEBVNTVJGiVhIZBYArQ2RQWsQ45Go4qkpSkUCqfcgFPcNnsobHHbfrnOHDx7zBUBBBBAoAUEbH9UVxdV2PXJ8njDbgtsAqpMLAESIIm1vWhtCwjY8b3VGreJayMCzEIAAQTOjIAd5NuxvdWVmsMtnlcfd9w5mAJXBBBAAIGWEnDnBdYn27WlWtCy9VrgdmV31LJbgdoRaCEBqm0lAm5PFDRl/zlCcJ8/CCBwTAESIMek4QkEEEAAAQQQQKCVCDDS1Eo2xIFmcIsAAggggAACCCCAAAIIIJAIAiRAEmErteY20jYEEEAAAQQQQAABBBBAAAEEEEh+ASJEAAEEEEAgAQVIgCTgRqPJCCCAAAIIINCyAtSOAAIIIIAAAggggAACCCCAAAKtX+B0EyCtP0JaiAACCCCAAAIIIIAAAggggAACpyvA+ggggAACCCCAQMIJkABJuE1GgxFAAAEEWl6AFiCAAAIIIIAAAggggAACCCCAQPILEGGiC5AASfQtSPsRQAABBBBAAAEEEEAAgTMhQB0IIIAAAggggAACCCSYAAmQBNtgNBcBBFqHAK1AAAEEEEAAAQQQQAABBBBAAIHkFyBCBBBIbAESIIm9/Wg9AggggAACCCCAAAJnSoB6EEAAAQQQQAABBBBAAIGEEiABklCbi8a2HgFaggACCCCAAAIIIIAAAggggAACyS9AhAgggAACiSxAAiSRtx5tRwABBBBAAAEEzqQAdSGAAAIIIIAAAggggAACCCCQQAIkQE5xY7EaAggggAACCCCAAAIIIIAAAggkvwARIoAAAggggEDiCpAASdxtR8sRQAABBBA40wLUhwACCCCAAAIIIIAAAggggAACyS+QNBGSAEmaTUkgCCCAAAIIIIAAAggggAACTS9AiQgggAACCCCAAAKJKkACJFG3HO1GAAEEWkKAOhFAAAEEEEAAAQQQQAABBBBAIPkFiBCBJBEgAZIkG5IwEEAAAQQQQAABBBBAoHkEKBUBBBBAAAEEEEAAAQQSU4AESGJuN1qNQEsJUC8CCCCAAAIIIIAAAggggAACCCS/ABEigAACSSFAAiQpNiNBIIAAAggggAACCDSfACUjgAACCCCAAAIIIIAAAggkogAJkETcai3ZZupGAAEEEEAAAQQQQAABBBBAAIHkFyBCBBBAAAEEkkCABEgSbERCQAABBBBAAIHmFaB0BBBAAAEEEEAAAQQQQAABBBBIPIGTTYAkXoS0GAEEEEAAAQQQQAABBBBAAAEETlaA5RFAAAEEEEAAgYQXIAGS8JuQABBAAAEEml+AGhBAAAEEEEAAAQQQQAABBBBAIPkFiDDZBEiAJNsWJR4EEEAAAQQQQAABBBBAoCkEKAMBBBBAAAEEEEAAgQQXIAGS4BuQ5iOAwJkRoBYEEEAAAQQQQAABBBBAAAEEEEh+ASJEAIHkEiABklzbk2gQQAABBBBAAAEEEGgqAcpBAAEEEEAAAQQQQAABBBJagARIQm8+Gn/mBKgJAQQQQAABBBBAAAEEEEAAAQSSX4AIEUAAAQSSSYAESDJtTWJBAAEEEEAAAQSaUoCyEEAAAQQQQAABBBBAAAEEEEhgARIgJ7jxWAwBBBBAAAEEEEAAAQQQQAABBJJfgAgRQAABBBBAIHkESIAkz7YkEgQQQAABBJpagPIQQAABBBBAAAEEEEAAAQQQQCD5BZI2QhIgSbtpCQwBBBBAAAEEEEAAAQQQQODkBVgDAQQQQAABBBBAIFkESIAky5YkDgQQQKA5BCgTAQQQQAABBBBAAAEEEEAAAQSSX4AIEUhSARIgSbphCQsBBBBAAAEEEEAAAQROTYC1EEAAAQQQQAABBBBAIDkESIAkx3YkCgSaS4ByEUAAAQQQQAABBBBAAAEEEEAg+QWIEAEEEEhKARIgSblZCQoBBBBAAAEEEEDg1AVYEwEEEEAAAQQQQAABBBBAIBkESIAkw1ZszhgoGwEEEEAAAQQQQAABBBBAAAEEkl+ACBFAAAEEEEhCARIgSbhRCQkBBBJXIBqLJW7jaTkCSSRAKAgkm0BtNCr2Mcm2VYkHAQQQQAABBBBAAAEE3kzgzRIgb7Y+zyOAAAItLhCLxRWPx1u8HcdrQMzaZ9fGF7Gmu/b7vq+OHdoFyxxz2eDZ0/tTF43Jtef0Sml8bRdH48+0srlm3spaRHMQQKCJBDbtKVfR7vIzsl9wCYXauugZqetUeFyf7PaRbt0eXTopv02OXHvd41SfnE1ZVY2qa+qanMLtYmKxWKt9XRwI2BnE7BjqwGNuEZAEAgIIIIAAAgggkHQCJECSbpMSEAKpJeASBW3a5CqSltZqA/c9X3lt2igUarzLDYXD8kMhhcMRjRw1Rn379FZdNHrMeFzyImpJjGMucLwnPE89undV27w2B5MgbgCvzuqLvskULGMDOscu3pPnh+xpz6ZTu7rt6eJzt0eWELO662yg0bXjmFPwvBt0OnLtBo892w6WbGowp5G7zEIAgUQUKNpdpus//h7d+NkPqC7undAAtOsDS6tqVXuC/apbvrK6Vlv3VaoqFlIXSyxEIpFj1hW1cl3SobF+7VSMXR9ZZ/21G2R/s/VDobD21caVn5utr3z+E/rE/71f1bZ7cWW82brJ/Lwb+M9IT9fF55yl0cMHqaqmNgi33BIiJeVV2ldRrdJjTO45N7nng5WO+FO/XTzti4YUt/2Nq+uIRU7ooVtvb2Xjr8tKS9rsKK3SDnsNHmva7p6zZaprG0/wuHbWxDzVeuGDxwMn1DAWQgABBBBAAAEEkk6AgJJdwEaBkj1E4kMAgWQVcAM4fiiksydP1rAhQxTXqQ+8N5eRG7Dv2LFAU6dO1dAhgyyxcfhXXEVtYGxAvz6aPHGCfM9T6b596tO3X/BJEPfcke0KWby9evRQzx6F8k9yEN8NplgOQePOmqBePXuqygbw3LyCggJ17dJFnTt1OubUyZ7r2rmzCgo6NDrI5wYEe/Us1PnnTlWXzgVBnK7sGktIVNqAUrUNLrlljoyn4WO3fHp6RAP69VN+fl5QxoHn62ywr1evnurbr6/69XVTH7ttZLLnBw0aGKzvyjuw/oFb90bX0SOG66xxY1TnHtgTrl1u8Mu1s7aurtH4bDGuCCDQCgT2lFeraNlGm4ps2nTUpO2L9b6r3qnLL7tEW1fM1sblbtmGy7nHG1S0s9T2GQr6mW6dOujDV12hfr0Kg4HvhmG6/mFPWZW2lJSrqGh3UN+2aqlfn176wjVX6q8P3aXf33+nLjp3knbbwHnDdd19t5/Kb9tWnSxJEgr51r+4uac3paWlKzs3LygrfpyiqmujOnvCaN132/WWqPG0d2+Jpk6ZpLeeN0EupuOsmhBPOdsqSwSUVtaoxF4Xey1hUWH7tTrbrx7PxQXnkl05ubm67quf03uvfJt2rCmWS35MHjtCl5w7UedNHqepk8baNOao6Vybf/6U8bpo6oQgSeLKazhVVtdo6KD+evKhO3X1uy/XppKK4KvHtu2tUJHVU7R5j1xbXfsbrtfwfrD/8sP60sfeqyED+2nb3krb3nGbpJgd61xkiZtPf/Cd+syH3il3+2l323Cy5z579bv0lY+9T66t0f37uwN1uPJjnq+vf+YaPXDnd7Rp+VYrOx58GqZoxz4VrdipouJSSww1njw5UA63CCCQWgKu34pZf3LUZBl+168kq4aLzU3JGh9xIYAAAqkg4KdCkMSIAALJKeAG8IcMGmADQbkqLi5WaVmlKm3wo6KqVhU26O4m99gNhhxLwB3M1togfdQGTBou01T3a+pi6t27tyKRiHbs2Bm0y7XJDdIcmLZv36E2efkaOXKEFi1eHAxC9LMkgCwh0rAdUcteZGdna8iwYZbEGH/UQF3DZY91v8wGijIyMuSHQjpw8jJq5Eide+65mmyJpGNNU+y5s88+W2NGj1ZF9dEDInbeo3bt2lnioW2QyKmzhIWLuX+fXpowfqyGDR2s9m3zg8FGt+yx2uc+LdOjZ0+NHTNG7YIkSDRYtMwGf4YNH6Hx48dr4MCBGjRo8DGmQRoyeLDa2oCjiy9Yef8ft63du6E7dOyorKysIAFUXVsXtGvksKFBO/vatkpPS1O0mV4P+5vCDQIInIKA6zOvufItevxvv9KfHr9fj/7pZ0dNDz/2hHpaH9LLksS/feTP9vzPbTq03GN/uU9//ceDuu36T6u6Li6XpHV9zTXvf7e+962vql/PbnL9pGue63PzcrJ1+QUT9an3XaHbv/cF/e3JX2vGn63uB+/WtZ//pEr2luovf/unVqxer9yMiFvt4OT6nE17KvXlT39YD959mzKycqwPrO/TDi50EndcedW2T/nQe67QI7+8U0P6dj/uALXLkS+zdvUs7K7bbvyKPvPJ76t49269/Yq32GB/LNjXnET1rWZRt12Kisu0qbRafbp31KRRA3Xx2WN1wcRRGt6/h9LT07RxV1mQdDhWo93bJfZVVKlDu3xlZKTbYrUqXrdQN173ef3u/rv08ztvtun7NrnbI6a7btYv77lVd9z8Te3ZMN/WPfy6y9o1eGAf21+OUFmFJS7scXU0ro+86xLdfdf1uvXGz+vCyWO0eV+Vau344/C1Dz3abOtNOmuc7vnBTbrsnLHaZPtB9xrYtLNCH7vmvbr1O9fpI3b7sY+8Tx/7vyMmm/fxD79Pn/zIB3TReZNVWhM9bHtHbQAzEo5o3NiRwRsbpN3aUVatnt0761tf/LB+/otv62sff6/62v+HnaWVhxrFPQQQSGmBLOsvs7Iy7Dj6iMnmp6VFgn3q8fq1RMXLsP1KRrrbV3iJGgLtPgEBFkEAgeQWIAGS3NuX6BBIWgE3QN2loL162YB1bV2dsrMzNXH8SI0fM1wTx43QxPGjNGn8aE2eOC54p64bNDgSw83LyszQ2NEj1LNHd1XXHj5AcOTyJ/u4zpIAPbp3UecuXVRZUa78vDaaNG6kxo8ergluGjMieHeuO5FYtWqFOnbubHFk643587Vu/foj8x9BwqJtfl6wzI7t2xW1wfsTbZOL1U2x/THGLZkSc5NlI9z97du26cmn/62//v0p/e0fjUxPPq3H//6knn/hJWUfMcjn2uB5njIys2ywp1y7S/aqS8cOwadexowZp569emno0OGaet75GjlsiJ0cHZ1AOVBGuQ0WLV600Aaw0nXWhAm2TfYP0tlgjWdt3bu3RH9+5G96+t//PXr6V/28v1n716/fIPdua1fugcm9I9idnKVZgsMlzOrMYsiAfjrn3PM0yJImPaydY8efpXPOOUcFHdqd1kDlgTq5RQCBphOossH/9u3yNXRwP40aPlDDhw7QCJvcbTAN6S/X97fJzdW+fXs1dsSQYJnguf3LjRgywOYNVLcuBSq1PiAjLazpbyzXLx98WL1sP3B8XDqVAAAQAElEQVTXbTdq9/riYPB8e2mVzp08Tg/+4if62pc/o3decan69OqmoqIi3XPfg+p//lV65wev1S33/s4SIOuUFg4fHWxxddCfdLd9QY0lVuPB506OXuxE55TXxtSxY3v179dL2VmZcp9kONa6YcuAvL58ne795e80dcpEff/2z+u+B36nZctXqn1exrFWa9Xz3ac0Nu+r1Q2fuEpP/uoO/fHhX+kPv7lfD93/E/36F3fp0d/9So899DPddePntHnFPpVWVh8Vj9sXVtn+031yxO0H3b5acsvVBfvZteuL1L3bJBWOvFyFo684erL5nQZdoklX/J+6Dhh/VPmybd7Lkk6ePP3y6WkaPryXfnPPLbrt+9/Su97+Fn3kQ1fpV/f+WPd97yuKeSHb18SOKsPzPHXK8PTWj39T1TU1uv27N+jK88ZpZ1mVZPGH7bW2avU6+38wRSOnfEAjp37wqGn4Oe9X37Peqa/dcq/y0sPyPO9gPe5d3Dk2iFnQob3Wbyiy+XX61Pveqgfv+7E+98n/0+VvuVA3XPsFe3ynLp0yNvgElC3EFQEEUlTA9ZtpkTSdd/4FuuTStxw2XWqPL77kUl140cWaMmmC+vTsbglXBVOic7m43Sf0J06eoslnn638/Da2nzi6z070OGk/AgggkAoCJEBSYSsT4ykIsEprFnAHo24we9CQwcrJbSPfBnkGDBqi/gMHq29/Nw1Sn34DbRqgITbwPnDQYBtQz7ADcbfWocjcAEBmVpYN0PfROBv4HjtymCqPeJfkoaUPvxe0wQbkD5976JErOyM9Q8OGDlXEThjSLTkwcMiw+jYOGKS+buo/0B4P0ZhxZ6mmqlobi9YrHotqy7bt2r5jZ/BJikMlKogzLy9P4VBIW7dsVkYjiYiGyze8n2aD/tk5OcprmxsMgrjBk7Zt85Ru8+M2IBeLx+TZbSgcUsjKP2oy47DvKRY9OnnhLHwbWEnPyFBtbY1KK2o0YuRIuTqXL1+qGTOma8Eb81RlSaBBQ4epZ/duqj3Gu15DIV+bt27XsqVL7SSjrc47Z5ItGwtC8Twv8JEXU0iNTAfme3Fb3k120/Bq2yts8aWlp2uPJWmGD+mnwdae4uJdmjvnNc2cMUOrVy5Xrg2ejhgxUtmZmYrZOg2L4D4CCLScQNvsdN314J81ZPA4DRo0SCOGD7PB5WHBrbs/YsRw/eGxJ7SvtFRv+8Bn5B4H8225A7fDLAk7oH8/feSLt6ggMxz0s+2y0vTg4//Tg7//o8aMGq5HHrtTm3eUBwPT4bBvfa+nP/7lbxoy8b0aNXKE3n/VF3Xvw39TW69Ghd1y1KN9jtIi4WPCuD6ytrY26E88ecdc7oSesD4pZomUWhvAj1oS+1jrxCxpXGJ9cdeC9nr8kRf1zPPTlNcmR0/++UV99+6HlBXx5Xmn2ZZjVd5M813yo7BrJz35wO364uc+pX59e+uNNxZoqe0votGoXpw2UzNnzpTM6H3vvVJP/+unGmuJMve1aQea5LaF2ze5ZFefbp1t2/rKsr4+bPtjpQ21VeNyZbnl89plKpybrlDDKSdd4TYZ6tgxW6HaimB/6ZY9MLnyFQlZ0qu9lVOrulXzdNN1X9CAAf31p7/8VZ+/9kZ955YfatHipfrQ+96jr3/mam3ZVxXUe6CMA7cR21+ptlz3/PwBZVqy6ytf+JR6FuRJdpzilnGvKcna0j6szm2PnjrZvK7tImqT5tm2dmscmmL22ilol6dMi33nzp267J1X6pMfvUbl5eX6yc/u18c+d50e/M0flJmRpltuuk6ZuXmqqTt6/3+oRO4hgEAyC9QfVXt23pUb9JlxO1+pteRsne3bXF/kjpczMjI0YOAgjRozTr16Fgb7vMQyOUZrbV+ZFg4H5zWe5x9jIWYjgAACCLR2AXrw1r6FaB8CCBwlUG0DPz0Ku6t790JLBGzRKy/P0quvvGy3M/XKrOk2kD1NM156UXNee1WVlRWqsKmq2r270zusrJDvq8QGwhcuXKCKigoNGzlKZ08+S3E7uK1/R+hhix98UGuDAJ07d7YD4XTFbBDh4BP779jYS/C1JEMGD1T7DgU2mL9Ys1+xNs62NtrtK7NmatasGZo+7UUtXrxIbkC+fYf2mj5rjnYV7wkG0kL+4d2zG1SJ2GCI+y55N0Cxu3i3JUIOX2Z/9UfduN8h6d2rpy668EJdcdklwYBNYa9euvyyt6iwsLst7wWDL4WF3fT2y9+iKy6/TJfbbcPp7W+7XJMnTbBlG6/TJS7coFJtTbWGDepvyZlMvfbaa5q/cLHFtFvLVq7Wq7NfC+oZ0L+/aqP1p1JW4FHXsCVBVq1dpxUrlqmqqkq+b9vNUD3P2hmTQjlZiqSlm1tGo5PkqbGLq9ElfMKW4KmpqdXgwUNUvGuXXnhphtZt2GTtLNarc9/Q2rVr1L6gQN27dZWza6ws5iGQtAKtODD3P7udJS16DBulwpEXqNfQKcroNkKf+fINuuPu+3WXDRS/8+1vled5+vzHP6g7f/or3fWz+ukn9z6gH91zv6784CfUqd84FXZuczBS35bvZoPdP7jvMf3xiScVk6dITkbwvOt7XX+xadNmaW+R1G6ITW0Ur41pa3G5Nu4oVdH2fSraule1jSV2rWy5yUpzfZDdNNvVtdV9TVjR+t3atGKTPvCOS/TnB36su+69Vtd+7y59764HVTiok3p0yLUmOc1ma0qTF1xtfXbxPk933/7tYF/01L//p89+5Rt61zuu0EbbNqVlFbr3gUf03qs+oQ99+mu6+95faeTIYbr5219X5w5t5Vxco2rs+KFj5076158e1GMP3qXOdv+i86Zoyb8f1k9/8uXAJR6P6QMfvVwvPv4rrXrhL1r53J8PTc//SWtfelx/+uUdGjKgt1x5rtwDk+2qpI45ysvPtXZt1de/eZ369Omte3/5kCVtvqsZcxbqN4/9V1+/6Xbb7xTpwgvO09j+3S25ED1QxGG3he1y9Pizs/THP/9Vi5etCtqnzJDc1qt/WRWoOpSpSFau0rLb1E92PyOnjXy7rXVvFwgadVixqrN9cKeCdnasUqPNW7fp+mu/oN179uhL139fP/nl45q/ZKW+dcPPdOuP71UP98moGz6tbauKDy+ERwggkFIC8SDauMrKyzR3zhzNnD5NM2e4abrc/el27rWxqEjZOTnq13+AMtLTguN+t1p8fz/kbl3yvrHzJ5dEcc+5yS3n1jtycvPd5Oa7W7esm9x9N+9Yk3veLReNxoJzN/f4yGXdPDe5+Qfa4mJ2bV2yZLEW2/liWVmZPK/+XMgtuz+sIM6gfDsvdPNdGY1N7rlgOdeO/Su7Gze/seWZhwACCCDQdAL1vXfTlZc0JREIAgi0TgE32NC5Y4HGjBkj93VIL06boQ1Fm4IT+C1bt2vLtp3aun2n1m/erq5du1qSIKy1q9eozpIW9YMFh8flDoRXrV6rp20wZe3q1RowYKAuOO9cFbRvL3fwe/jSCuZlZGRq7NixOvfcqfJDkeCgt+FyldU1GjVssB38D9SmTRs1Z/5Cbdq8TZu31E/uEx5bt+7Qpm3FateuvWosabBy1RplZ0YUDPY3LGz//Vgsrrb5+Tao0lbFxbu0c/dehfwT68JDNuC/oWijZsyYqRdfmq5oNKrNGzfquedf0GYbOJLBuANv96mTV1+bEyQu5thtw2n27FctkbPMFnWnAvsbtf/GzclITw8c6mwAsHfv3lqwYIG2btuhjLSIbYNQcLvBtsmWjUVqV9BB3bt2snbE9pdw+I3necE6r89foLmvv2H3LU7PTZ7y2rbVVVe+TRdffJHOO+88nX9+/XSe3b/wgvN1ic0fOKC/6uzE4vBSZe2TcrKzg68T6WsDUnXmMG/ePEVCniWdQlZPSOmRkIrMqtoSL4U9ezVajrgggECLCWxatUff/NLH9K9Hf6Ghg/qpavNyXXbRufrCp/5P3bt00cpV6/Sv/z6vbl06y73Lv6cleXt076ZBA/vpA+95h86dNE7b91ZZX3Z4CCHfV7f2mfrUN+7Qh7/8fXXKDsst5AYm0q1/m3DWON343ev0na/8XzB9+0vX6FtfuDq47+bd9s1Pq3/vno30GfHgUyauDw86ITX9xQ2mbNpjyZjlxRoxsLe+f9OnNHvOP3XHzd9Sx4L22rF9l+pqq5WTHrKQvKZvQDOXGLX+PBpK118fukXDhg7Uxz5/vT73qe9p4fJ1UtYQuWR1ZVWlduzcqc79+qqyvFx3/eDXuvn2u9W7Zw/9+PvXqSbmBV9r5j6ps3PHTl396a/qi1//nnbY/ekvv6Z3XPNFffk79ysUDsttqz/+c7ZuvuNeXfftH+j67zScfqivffs2/eS+32jjlu1KC4cOi94dNxTm5yi/TZ5WrFmvSy66ULNenq37fvk3FQ4qVH52hnp0b6t5M5bK7Vd7FHbT1MnjtX1f1WHlHHjgeZ4KstP17Z/+Tp/9+u3aZ4ke5dn+1hYY0L+vFiz6i2Y/9Tv99bf36Inf3F0/2f2/PPQTzXzyYX37K59QddSzl17c1jh0db9J0sleG3v3lmrwwEEaOmiAPvzFb2vx6g3q0TVPbbLSrb0F+s0v7rTjl612XDRFg87qd8xEzaGSuYdA4grQ8hMTiNs5SXl5hYr37lOJ9SEldru7ZK+22r5mjiVGSiyZ2rFTJ+XmZFu/G5dv+9esrEwr3AvuF7TLt3OaNtYvKbi4c5AaO3/IyshQQbu2KmjfTmlpaUF/454LFtr/J8OWcW9mcsuHrb8uaF+/vPvdwZraoxPJrk925wSuPPdbhJ07tld+XhuFwxHVWEJ8f7HBjVsmIyM9qDcnK0sdrR2uTa4NO3bu0nbbx7hPu1i3bPt1X5mZGVZOKHjzQ8TKc78p5aawtauxN0TU2XmHszjQjsz9dYVtP+I+iejejBE0hD8IIIAAAs0i4DdLqRSKAAIININAVU2d3MD5hAlnKWSD+nPnvq42uVnBoLarLmzzwiHfDko9dS5oq3YdOgRf57BpyxZF7ODSLXPk5A5i0yJhGwSXnnluuorWr1NOTq7y8/PkDvCPXN4dRPfp3Us5ubmqKC9TRWXVwQEld4Ds2jiwX28NHT4i+PTJ8mXL1D4vV7G4F7QrHLQxZCcAntq3zZM7QdixbbuKS/Yp5Ps61qUuFlPbtvl2oB2W+9RCw+Vc0sG9u9XV33D+gfsuRvdJCpc42bJ5h9xyNdXV2mrJIvfJGN/zg3k7dpVo1ZoNWr22sWm91m/aqoqqWrnBoQNlB7c2QuhOPGLWxvz8tiorLdV6S0qlm2vw/P4/2Vlpcu/UjYTTbJtl2UlRTEdeXNvcJMUVtm2ZFgnVL5Ieljyp2E4+qiorbDCvVsuWLLJpSTAtXbxIO3fuULqdGNXV1cqtb3+OuqbbyYb7uH5umzbasnmj9paVH+bu+55KbV5lZaXa2DJRG3g7qpDknkF0CLRugVhN8NsXZ5QU3wAAEABJREFUXbt0kudZpyA/+KTYFutH3/fut+kD771SV7///ZYovVLvede7gumqK6/QV2+8w5Ijay1BEZWtqIYX9//cTdbtqKsNLndrmynflR23pew2Iz1N502dog+8791631XvCqZPf/Ijuu7aLwT33Tz3XO/ePVR1xICKK9PzPHcTTFZiE13jcp9MKbF91uZNlfrEuy/Rf/57v+67+wf6zCc+Ygn1dP3igYc04rJr9LPfP66ctHB9TMepvWhDiYqWLT/OtEbl1a5/PXYhrv92A06nOzWsobiiRu+/4jy5T2j++neP6ek/v2CD852ChPXYMb2UlZ1jiYxdKt5bplDIC/b33QZ21YNPPa+Fi5bYehN1wYThKrP9l+d5cgnuOW8s0ezFK1VXVxd8JeLy2S9Lu+fL7XPcvkw7X9c//vh3PfHIn/XXRx4/bHr84T/rn4//SyvmrQkGyhq21cWfk5WhTNsXZdr+pqBDO/3xb/9SQedse9m51+v+pTvmaMWqtcExSpfOnaR9NfufOHTjElt1NmDm2tM5O03dOuXK7aPaZKcHg4MLlyyzMlYrbPvJPz7+Dz3wmz/owd89qgceelgP//Fv6ta1U/B/o7iiSla5Gl6qbX+dk50td5xz/tRJ+tVvHlHRgiIVtMk6uJjnufa208rVa5WZmakhfXuo0o7DDi7AHQQQSFkBz/MU8n3rk+qnkO8H/WdVdU1w/hOJRJSeni533tSlc2dNnjxFnS0pMn78OJ091frzc86Ve5OCS0JU18U1btQInXPuVHvu3GA6d+pUjR4+1Pabtv+08wzXt8bla9y4sRo6ZIgG9u2tqbbM2VbO2VPPDd6UNrB/H1XVHNpHuf1QhiVSxljZwbK23JSp5+kcu5069Wz17VVo5yJx1ZctDR48SKNGjVbf3r10zrnn6uxzz9P4s85SliVDxo0dq7PGn2XnBrkWUzQ4JztrwgQVFhZqQL8+Ove8qQraYu2Zes7ZGtC3V1C29l9cQqRzxwKdY8+59rp2TLV2jBw6WH369NHESZOUn59v68T2r8ENAgggcMYEUqaiY4+2pQwBgSKAQCIIuAPoXj266ayzJtqBaI4WL14sN4jvDkbPs4PO9u3aqdoGntzBbm00pm7duirXEhlbNm1UtZ2we56n413cYFebNhma+/o8zX99jjZb0sT3D1/HDUbkWeKjR48eNgBfp1mz5ygjLXSoWKtj8MB+GjNufNC2BW/Mt+c8O9g9R+efM8kGELLkDvTdgXZVTVQD+/cNThxWrV6tyBF12YqHXaPRuAo6drJ6a7XNBvrCNsjjFnBtcgfeF513jtw7Ol3Zbv6Rk+d5dqJibQ3bpPrLgWVDNq9du/a65IJzdNH5Z9t0ji6+YKouPP8cXWS3F194rtx0qd2eN3WyOnXqcNgBetyK8y1ZEQ6FzDxHu3btsDk293A+i9XT3tKy4DY9Ld2WOfzq2hOx+aFIusLhNEXcrZ1AuW2ak5Np4zeeincXa/3atXLvlNq+Y5fcV2WtXb9BK9est5OSNtq3b69tu61WRyO7NzuBCofCNnCULsVjluxZZydr4cMbIRscs5OnaLTO6k+zKSLXriMW4iECCLSYgG99eq1qbeC6usYNGkcUtUHi9u3a6u9P/VtP/fOfNj152PTk0//RvT/4hnr26B4MXBzZ9LpwusoUVnk8oj3RiBRJs0RvLOgn0m0Ax71L/g+P/kU3336nbrvjbru9S9Omz7L+aI9uuvmOYN4PfnS3FtuAdGaard+wAivGc/279Tk2ktPwmUbvu/6mtLL6sD72yAVtuEa+H9KUKZP0j6ce1dK5j+uGr39Jo0eP0q7iYv3m94/oig9+Vjfe8HO18+vUISdDnndEh3xEoUUrivW7X96kRYtf1uvzXrJ94YuHTXPmvmCPn9HFUydqn7XviNUPPozZANWuyrg2ldTaVHNK047q+MHynEfVvjpdfskFFttu/f5PT6lT33ZBPPssoTFsYC91tEGlTZu3qLiyVv7+OEO+L20ts3iWyPc9DbNBpr37P2XheZ5yMtKUvX9b2UOrr9ImKc2SXYWF3fTIH/9q06/06J9+rT8/8Rs98qcH9NifHwzu//mJ3+mJvz+oZ557WKOHDT5swM21N8PKDdt+tW/vHlqzZq1mPz9fGemHvy5yM8LaZvsw99ptm99GVkhQ/4E/rpxQeqY1KFu14UzVRrIUTsu013pMndtmK8OSK+vXb9Rf//EvlZVVWDwRPXjfY/rtE//Rg7+4SxefP1lFGzfr14/+Qx2zIjpy69fF4rafDatzp4Lg9qZv3KDuA9odqL7BbY6Ki3dbfRnq1KGtyu3YpcGTSXaXcBBA4EQF7JA6OD52fZWb3LF6bV1Uadb/paVn2PlKnaqrq624ePAbRh0KCjRkyGD16NlLfiikDEuquuU925dNOmuMBg0dpoyMTOtvdmnXzp3KysnRkGHDNWb0yGDXGZfk6mjfvr16WcJghCUqMjIy7Jxoq0r27Fb79h00asxY9ezeTXXWDtcm3/M1esxoDRw0RGnp6SretVPbt25VbW2tunTtpuEjR6lTgTuncaVLbfLy1LVbN1tnjHKsft/3FbK2WqBqZ/W6KWLnJe6cLN32Fa7O/v37a/jwEUqz85eSkj1Wd526dOtubR+hzh07qM6OT1wSO9cSzuMsgeLqdUl41w7P8zRw8BANtoROx44drYw0uaS0hcoVAQQQQKAZBPxmKJMiEUAAgSYVcAfZsoPQEXaAGQqHteCNeVq2YqXcpxc2bSxSJBzReeedp1EjhtliIbl3Xvbq1Uel+/YpSC6ET6yr8+1A1B2sF23aYgfttfK8Q0MG7kBa8jTUBlHatm2nZcuWyv1uiDs4ll1cIsJ9ZNv9rkRVZaWmvTRN6zZsDJbZYsmUTl266sILL9CA/v1UXlmj7l0K1NNOArbZgfiW7TsV8o/dRle3b3G73x3ZZQfvLongefVti9ogRnZ2jroX9tSoYUNs0Kz+IN6adNQ17k4h7KTAPRE2s2FDBig/L09hq9udVLip0Nrkfrck7vnqZgfw2VZ21BJKMavHDZi4+3YG4oo4fLJq0+1EpLKqSlu3bbdtEjr8eXvkWlxryQVZ20M2OOR5bo49sf+6d2+FJVou0GWXXqy3vOUSud8d6dOzp23nWuVlZ8n3Q6osr9DaDZtUXlGuSRPOkjtxqrP2DbHEU1tL4rivMXOf4HDbcn+xB2/i8mx5T66dO3ftUll5pY5czvNkhjHJXnSe7ykSCR9cnzsIINBKBOz/p+sX3ST7f+2uNkvu6ze2bC+228OnLdt3adfuvcH/bc8trPpLLBZT0d5avfi33+j5P/1Sz/7pPs3+x4O69/ZvBr+hoZpYkNR1vyM1f+ES/eWp6Xrq+Vf057+8pG3Wb7tP1v3tj3/TP557WY8+9bwNaBdbX+7VF97gr2d1xu2xm+zmmFcXT1l1VG85f4oKu1jC2/q2xhZ2AyTu0wUfveb9ysvL12vzFumB3zyqqz/2eX3gE1/VN+/4taorK9RjcEdFXF/bWCFHzmufrk1btmv12iKtK9qs9Ru3HJzWWJ9rOXgNtcGrgg7t5RIPR67uHldU1+myCybrL/ffpv89crf+8/BPTnr636M/1ZO//KHK6ny57VNdG9XUiQPUpWsXLVu+Uis2bLfEdchVp8q91Ro8aKDatc3XWks0xKx+z/OC59yf9M6ZWrxstaqqqtWlU0dpT7WbHUxx2x9W1tZZVx9Xug1cffCjn9TEi65UdmZWMHAXt3LOmTJRE8aPDT7lMWXiWRo0sH9wv9YS5O5dxqVllaqzxNahGmWlSiE3YGbrd7c23/PAH9S2Vzt7BQTVHvwTsucrrF2e7X8zbSDQ9jwHn3Ovg40l1br/jhs1658Pa9aTv9WiF/6i73z909pWUqWulojIzspWRXm5/vyvl7Vx0yZdfPEFGjl5uGotxo98+qs6e9IEPfTwH7V65UalN7Yfs/8wnuepkyVA5s5faHXnyre22J0jriFLONYoEonYgGC26ups/3jEEjxEAIEUE/AkP+Qr5Ifk+77C4bAyLcHQoV1bjRo5Qu07dND2HdtUWlYm3/NlHa0lb6PqYIP8q1as0LPP/E8zpk3T2qJN6t+3l/r27RckPZ579llNmz5T021yz+/du1e9+/RV506dgvVlF7dfyMzK0t59e/XSSy9p5qzZwdf7LlzwRtBPDRk6VC7Z4c5X2rXLV2H3Qu3atUMvvfiips94WTNmvaz//PcZbdywXrlt8tS5S2d5nueaGOxzsi1R4ep47pln9MJzz2ru3Lly55uuXz4wWTOCmGKW3CiwmNavX6dnbPlp02boheef16aNG5Vn++YuXbuqpqZOtbYDHTlqhPLbttWKZcv0/AsvaPrMWXrBbrds3iS3D3DHB/SugSx/WkKAOhFIEQHbI6VIpISJAAIJK2DHpQp70hsLFmj2Ky9r2co1ioRCdjAc0+KlK/TMs89rpyUGhgwdpnPOmaLRdvDtvr5o3do12rVnnx2gn3hX53meQiHfDoZ18GLjBNpXXq3hwward+8+2rZti1ZYAiYrI+3gMiE7wN+7d58WzJ+vmTNnqsQO2tPTIqqprdFrr9fPq7LkgPvtkrMnjtfIUaMkW2f1qlXy3ZCJxadjXKrs4HnE4AHBCcbmzVss7jprX/0KEWvrjFfn2cH9Trl3IXXp3DEY5DuyKHci4AanunRpZ/GF1K2wUP369bNkQJrCNrCxY/s2Pfv0s3Jf/VSyp1jPPPWclblLO3Zs13PPTtNzL0wPDtq323Lbd7lBPv+wKtxgkptRXl4WmPteffvcvAOTS7Dktcmxk4y4ai0R4k4kDjznbnNzM/X6vHmaPXu2Fi1aJM9OqoITAhukzMnNDmJ2P9JaU1OtN95YoAI7IZpy1lgVduuiYcOHa6udRCxevtoGx8KuuKMm1yJXZ9wGrLZv36FII4mxuG3s9EhEfigkd2LjTnokt6a4IIBAKxVwAyyub/jcJz+sz3z88/r0x7902PTZT1yj237yKxso3mL936G+y/NsADgnor/89Wn96a9PBV8b1KljQfD949IuyQabO3XuZAnxGu0tLVeHDjlqm52ucIcs+dY/Kegb8tU+J0MdrP9y+w4debE+RbacS1q4rl7HuWzcWKK3XzJFP7r1Rl3+lgtUVhMN+ssjV3F9o+ubbrjpNp1/5ef0kau/pTt+8YjmL10d9Fs9CnKVFg4dudpxHxdabLf8/A9619u/pPe88/DpfVe+Lfgdi90le7V2vQ3sZEQaLavW+ursrAx17WwJ/u6d1aN7F/UoPInJlu9p63Xt0lG7LZnhKimrrlX/PoXKsAT75i1bJS8uOU/nWlqtMWNGa8fOXZr7xiLlZ0fU8OKS9ulp4WBWjftqxJAf3HfvOt62apuG9y2010NIF553tj71savVv1eh0tPTNH/BYl3z/iu1oahI8xctCe7Psf34vDcW2vKQp4IAABAASURBVP0v6Or3fVq/eOBhTZsxU9NeX6z0tMPrjcVcGyW3r5r538eVk5ke1NvwT7kldjoXtJN77ZbsLbWnDpXheZ665afr579+RNd+61b94K77LOlfacm4bHtZlqtzx3bKzs7Svn0lUvEePfzYE+pmyZbvf+uruvDisRbLh/TGgiW645d/svl5avziBa8tt89btWq1FM5vfDFVqV1+vqosWbOruEQZ6Sf3ujpGocxGAIEEFXBdb05OrqZMmaK3XPYWXfqWt+jiSy6xvudiXXDhherXr7/2luzRyuXLVVlVY31cfaCe51lyuUbTXpytvftKtWXrNttPhdWzZ0/5oZBeffU1bS3arvLKapVbf7Nu+TorY5nC4bC6d+9m5zYKdqGe9f/uzWqLFixUiZ13pUVCQR2zX10QfMKjgyVfOlii3vXC1VaOO59YGCxbamVEgzaVlpRb/75Rvu3H09LSbH2vvpH21/M8rVq5IviNJ7fP22t12OxGr57nBV/7O/3l11VTWyt7qN3Wn++w80R3zpNliepaSxq3z89T585dtHdvieYvXGznQDUKW8xuP/7a3HlBGY1WwEwEEEAAgSYV8Ju0NApDAIFEF2jV7Xdf/bR12w6lR0LBQaY70ExPC9tBZ7Venf2aXMKjY8dO6j9woNxA/co164JlTycoNzhQVVuns0YP05Chw1VWVqYVdlBfa4MpnnfogFl2t7auThstQeGWCe8ffPI8TxnWRtf2WTNnyb3TZ+DgwSoo6KiNReu15RifljjQZneiEY3G1advn6BuN3DfMLngeZ6yM8JaaMmhcCgs9z2yvh8KBjYOlOEGY7p27qiLzz9H559/njzPU4mdnLz++lzt3FmsjPR0xW3gSuFIMLbkyZP8eHBA3sk8ZQNR3bt1lPt+2l69etkJhDutOFD6/lub5dndqBlUVdfI89wjm9HgWmMDPu7EJBqN2mBK1VHLhEK+tm7bZtN2S74UW6InqrglK+qiMbXNy1fI97Vh8w7bpmFt2LhFa9esVmGv3po8eVLwlWPTZs1WZnq4QY1H3o1befGg3rKy8uD2qCUMPDMzXZG0tKCNcRvIaiSUI1fjMQIItKBAzPov9zUWr7w6V6/OecGmZw+bZr82V3/45R0a0K+33FdjHGiq53ly47k/vP9h/fx3j+veO29WiQ12uL5cithie9S9W1dVVlRq2fqtNljj27yTvMZlfY0N3FjfEg8G79XopWh3mc6ePEzf+vqXgv5s0ZLlSvM9W9c7ank3J2r94l5LVudkST0GtVePjm1sX5Bmgyqn0EarwZXZKTddhYPbqcfggoNTod2XOmhQ/z5yl9XrNyt9//7NPW445WWm6dG/P6Nxkz+kQYPepqFDbBp8EpMtP2jg5Ro5+ioVZnnB4FSQxEi3bWHbqrKySgbirrbfj6rvmL4aNmSgNm/erCefnKOcBm9KkF2iWys0aEAfS56ka+vWHVJ+WrD9O1mS62//uF/33fV9277dtKFoo2654x794cHHrc5QsK+Vesvz/GC/Y0UFg3Xdu3VT5/7ddM4l5+iH379BH3jfe1S7abt7+uDkHOO2rT3bdltcnfaMm2c3h11ri6vUxxIumZkZKt69W2pz6A0VbsGQxTtvwVI99cLLWrh4adCmuL3Opbog6e8GzrZu3SZ1ytcTT83SI4/+WWdPOstiusUSMmm6/4Hf2OshdLD9rsyGkzVPsoaVl1dY2eVSbkSNX7ZaEqub3JsjNm/bqWw7/mp8OeYigECqCHiep1AkosiByZIU7k1DpaX7tHrVCr36ymy53wIM23G9bFntv5SVlklezPZTIfn2XLYdb6enZyhux9qjRw7XW992kS676Lxgeus7L1UPlxyx9V3CxbdzgPoMiKfqqkpt3bVbaZGw3MXzPEUyQpYA2WXlhpTXJleedXJl5eVySWzXd3W0pMjQQQN0/tTJeueVl2nY8GEK+mpZR+gKscmz+7WWyKiqrLBzo0jQf/pWjj3V6NXzPJWWlSoc9oJlPc+z+yG5MqLROnmep7jtqzu0bxucV+yz44s6O08K+SF7ToFDye5SufrUshdqRwABBFJCwE+JKAkSAQSSQsC3g1A3HRlMyPdVXlmpJUuXq7q6KjhRX7hwsersINbzvCMXP6HH7qC4xhIfNXVxjRkxVCNGjlJNTY3emD/fkhY7ggPdxgryrY2ed3SdoVBIe/aVatnyVcFHrN330C5evES2eGPFHJxXa8mCAX17KDsnV7uLi7XHDp6Dk4CDS8gOoH3t2FWsbdu2qnOXrurUsYMlD2IHl4hZEiEvP195+W0tMbTdnouqZM9ubbSBm4yMdPmhUDDgJv/gKpI1rNgGZbKyszVqwgi5Hy90Ay5LlyyRG5hpsKQdxHvBwf7OHTtVXLzL2uM1fLr+vg0C1lTV2clMD1VXVWl3SYkZHr1cyPdtfV++1S+72DiSwnaCld+urUpLSxWz5Irk2TKelq9YFbQ7Ly9f27ZvV2VFtWJ2ouHWUSMXP2SvE0t8uO/drbI2+I1sJ/eVYu4j8znZOUEsB9rRSHHMQgCB1iJgXYl79+XCxcvkEgeNTe4HpysskeF5tvAR7e6Ym6GC3Ayba4Mm9rR1V3a/zqYSDbcB9n02wLF1yTrrs3ybd/LX+r7GSrXrkWtHbVC7aFOJzh45WPfc8R316N5Nd/3sAf3l2VeUmRY6cvGDj11Rvu9bX3hqbdIxLhb+4c8EHWqG2rdrZ/18nVa8UaRQ6Nh1ujYX9spR90FtVTio3UlP3d06/dvI87ygHZkRG9Tavc/6+hrbD2ZLlkh3++ftG/fpg++6NPgkxNP/fk7Kih/cb7gVnavyMjVo4AB5vqe169apTXa66sw7Pz9Pw4cPt33IapXYvmiBvW6e/+ef1G34QPlmun3nbinsXg+upPppqe27B/TvpYvPnaQ7b/+ODWal6+FH/qRI1471C+z/69avra3RgkVL9eKMV6RIv/3PHLpx7VfUV79+fYM4163boMw26YcW2H/PvcHD/X5Lmu0DPXk29he3Z+Lq06e3JU1KtGzVerXNjCicE9J3v3291q4v0sD+fVW0cZOe+MurKq+pU+Bgax15bZsR0aYt2zTjlTm23kbltzk8Xre8OwZS+gj17dMzcHpm7nK5N3S455gQQCA1BTxPKi8r07w5r2nmjGn7p+l2O10vvTRd02bOtnOSXQpZv9tQyPM87du3V/7+Nyq5fjDTzkFcEiVsSfWO7vyla3d1PjgVqn1BJ9XZeZBv/XI45FtxcesJZQmDKh35fgL3db4H9vHpaWmyDtPWjWlgvz56+xWX6eJLL9ao0WPsPKSX8vLaBc9bgcE1Hvy1PxZbrZ3r1dr5o2/ttTlveq2tqbVTJluxwZLBbtMV6mZH48FXcvkWgzuPjNs5WRDE/uW9iG/nLxVBMmb/LG4QQAABBJpJwO1Jmqloik1IARqNQAIKuJP0LgUdNPWcKUpLS5dLUmy3wfjjDdIcK8yYHbW68mRHp716dNclF52vYcNHyA2S/O+ZZ7W+aKMidqCuk7jErUx3AN+nVw9NmTIpGMif9fJsVbhBeDsgPlZRtpqdQPjqbYMdoVBIK1auVFokFBwkx2JxO7CPqtqSNFU2yFFtB+Br165V3AZ3Bg8arLLy6oPFhm3dtWvX6T///Z+e//c0ufb4nnX/dnDftm3boJw9JSWykbSD63hpYa23wZSYlTdm7Njg+2xffHGandQUy/fdEf3BRYMDf/cuq+dfeikY9MlIixx6cv+9GjuBGTVykHJz22jb1i3aWbzHyvH3P3ucG0Po3D5f7dq1t0EdG3izEye3jXr1LNR5551rJzBxLV++3AaE+uitb7lAXTp3tHOeeBDTkaX6Fu/6oiL927ajS5R53uFxOBfn3KOwZ5Ck2lS04aS39ZF18hgBBJpbIGr9ZFjukxuf/vg1+sTXfqRPXPfjw6ZPfuZ2/eLXj9Qnr0PH73fcmIV1Itboan3wY1+SGyz/9/9ekHKz5XkH+oxgKVvmRK62jq1nXbbs3sEVXD+2uaRCm3dW6mtf+IB+e/+P1atHoX58z/36xT0PqzA/U57XcI2DqwZ3XF/v+qxjLxEsdtp/6iyp3GtkP2VkZmrL1q1SXUXQ5x+rYNcez/OCZTzPC2LwvBO/df2053k6cMmyfdHcxatUXlGm4UMHW58f1sbl23XRpeP04Q+8R6/OeV0/uu0XKuzU5sAqwT5u87o9+tIn36lxY8foZRvk/9eMecq1ZEF6JGzJkPW68F0f0buu/qb27ttnSfawrRvS2WMGKz09XUuWrpA6Ztq8A9e2evDpadqyeZseuPdHem3OfH3wU1/Trx7/j7rkZR1YKLgN2+trz549uvozN+pL3/2JCvt1COY3/OO2+1Xvn6oJ48dp4eIleumVeWqbld5wkcbvu5ddYRcNGTRQ7k0U/31qnvaU1eq9b5mqGbNeU8cOHfTg7/+ogQP6afr03+jqy89TaU1cW/ZWyL3eGhaabQmQf/xnmq66+lr958WX1eaI+mP2gt1WUq07fvAZuTdC/PEvf5dKK+z/2vH//zSsg/sIIJAgAifZTJdY3buvVDssWbxr1x7t2r1H+0rLVVdXGyRJw3be0ViRbj3fq3/G3dTU1Sdpy8vLNX3aND377LN69rkG07PP6D//+a9effVVeW7HbPuGuK0ebuQ8wyW3s7Kygv6/prom+L2mnrZPnTBxYvAbG2vWrNXrc+fqpRdf0hN//4fmzX1dnm/9mTXErlZq/dXtV637q39win+9hgXaPsHFF7XzILd/8f1Q0MYDRcdrY8q0dntew5UOPMstAggggEBTCliv35TFURYCCCBw5gTcQWpFVY3cD42eNWGCcnJztWzpEq22wf6MRg6Oj9UyV45LUOwrq7IB74gG2eDB5MkTNWHSZBt4b2eJgHWa9fLLKi8tVfpJlOvqc4MO1bVRDbOBm7HjxgUHvbNnz7YERbnlG0JukUYnd5JQZQfwBe3bqm3b9tq5Y7vWryxSWWm1bDxK2Xaw3K1zZw22to4fO1JnT56gQYMHKRKJqFthoXoWdpaL6UDhtXVRxWNRKTvNZu0/yK6uVceOHRWzg/JiO3nxG/wmhmdnKNW1tdq+bWvwiRFXfzRad8w2e55nJz0RNZYcqrEkTcf27TTQEjPuXVXu91My0yPWjsavlvOwOmP2ZFzur3u3a8hOprbZ4FsvG/yZNGG8xo0bH3xF1cyZszR91mzNn/e62ua31fgJEzV50kQVdu+qWCNnMCHfV1Z6mjzPs/IPXd1roLSiWgP69VHnrl1toGuTNm3dYfGymzyklNz3iC5RBWrkPsnWrUtnPf/STL34t1/oxb/ed9j0wjMP6Ee3fFODB/aT60vkOpkjwq2fVRq8q9S3/k8apE995P3aZ4M8N9/0G3Xr0mCAXdZ/WB8SLObuH1HW4Q/jskWtSuvPrE9yffuWknJtWl6s/3v7+Xrs/u+YisGrAAAQAElEQVTrm1/7ovXDdbrlh3frO3c9pO6Dutk6VsfhBQWP4vY3av15xPp6129FrUyb1ejVxeSWcfuCmCWzG13oTWZW2f5reP8ewf5148YtkpdmU+NtUzNcwiFfazbvkktiDB7YX7+/91v69vc+pdu+83Ub1MrQ9+64T+17dTno5WJ1CZIr3j5Zn/3k/6msrEx//8c/g/1hyPeD5VzyqKJ0nwp7tQ0e10cT1ZgRgxUOR7R0+Up7TTXcR6UptrdU//zv88Hyr817Q+tWbVH3/OxGIw75viVk8lTYPkfeEUvss/1MzE/T56xtWZkZ+t8zz2v9zr3H3Ne4bVhj++K4Df5FbRt++l0XqlfPHpr58hwNm9Bbv7/7Rt30ja8oOztT3/r+D/XJj3xLd/zkPmXYfu7mm67XI/feqi988G3BsYt7LTRsTrYlQQq759s+sWGskjtu2bShRJ96/1t09fuv1Pw3FuiHt/7OjrXyGq7OfQQQSFEB16/5tmMLWf8cTNbn+b4nz/PeROTQ857nqayiSjU11XIJ9lo7Vygu3q2SkpJg2rWrWJGQp/59e6mgQ3vrlw4UHbe+P1N5uVmK7d//uX6y1hIJ7S0JHLVzmr2W2K6pqpU7f/B9X8uXLbN9yKtasXqN3G9Glu8rV6fOnWQ75kbbfKiVB+o89Vt3brV7T0kQZ35+vtLsPPJAXxy1E7pOndoGCZAja3DLuPjcbcPn3GPXR7uYG5vfcB73EUAAAQQOF/APfygeIoAAAq1ewB381dkAUEV1ncaOHKZJkycrLT1dC+bP16LFSxW2g3Cd4NFrtQ3ulNfE1NEOms8/d5Iuu+xSjRk7Tj169AzeYfna7Jc1+9U5wSBK+CQ++eHaWGMH81V2QH6OJSdGjBipaG2N5s6Zox07dykcOk73aycFrj39+/a2pMFAZefmWmIhoivf+za9//3v0tvf9lZdeNGFmjhlikZbW4cMG6GePXspLZKmnTt3qK6uTqNGjZSr+8DGtCKNxKG4yY75bTBF8tWhoEDuu2e37dgj39zc4JqbYmYbtROLNWvW2EF7jfoPGCjP9+1cwT17oNRj37r43YF9eWWN8vPyNGnSJLl3Zi1etFDFdiIQ8huP3x3U11q9vXsWKj09Q926dQ3i2bRpo7WzSuPGnxV8zde2LZv1wovT5D65kpkW0pr1RZo1a6Z2WMKmU+cu6tSpc/BVJ8duoRnY2YM7uXDbaW9ZtSaNH6XhI0dp3969WrJkqZ1YReV53vGK4DkEEGhBAff/V+quV6yP/sdT/9LWLVu0efMmbd50+LRl82atXbtWzz3/og3mLgo+CRC1weQDTa+zAZNNq3bri1/7tvUdBeratbMKR/ewPiCmB3/7iJQbP9g/ButYtxCORGwQJt0exoN+0fV5brIZR1xdn+nJDbpvXrxDO9Zs0fsvP1/PvfCQDSrfpHe943K5H0X97q0/1k8feVLd22fLP0a/43meXLuL9+xRelqaJk6coH1F81W0Ypfc12gVbdmros0lKlqzW0XLdmjj8iKbFmhLdVh51g/HGsTcsJHVNXXaXValPeWNTOv3qE+PrmrbNl+bzFbxCu2xZd3y7t27Dctpjvue56lLXoZ++9jfbTvP1Xvf805dbwmjXpYE+N0jf7ZBrcXKTI+o2NpUtGybtqws0U/v+5buv+cHamuDTT/9+a/04B//p865GQeb53me7VND8vbPqd9ueRo4oK/WrNugBas2KCPs9lFx1T+3XSqp0Q9v+amWWHLkc5+4RoOGFqqs8tAnLfcXdfDGqgjKd+u711dZVY1tk53Ba+v5x+7RhPFj9PCjf9GPfvoXS6Q0/LTJwSKCbb1jzU6dPXG8Cgu7q0/vXpbA87XI9k9/eOoF3XvHt3XpJRdq3hsLdd23btZj/56mbgM76tF/vqgPferrenHadA0ePFAXXnCuvFBYbv96qPT6e95+BPfaqLFjll2llZacW6Xrrv2Qvnfj1+W+UuYr3/qB2vXKC/4P1K/F3yQTIBwEzriA53nBVxXv2rHD+hZfI0YMU+W+muANUFFLDNTFPTsHGix3jpNnfbmb5xrp+tSMjMzgk3Clduzu+q19tu8aM3ygXAKkxPaPLuHglk238wjXt1VUVChm5xZu31pp5zcD+vdU7z59gv7d86wTdJNboRkm3/e0t7RMW+04JMfO50YOH6p9FbUqt31CpZ0jDhs+TNk5uYfV7GJ0yfjMzCxLyrtPKNY/7ean2bleZnqmzQ/Vz7S/nucp3WLNsPl2amNzuCKAAAIINCbgNzaTeQgggEBrFXAHf/J8depUoMvfcrFGjBptA+OVmjVzhpatXK2QHWh6nh3MnkAA5TZ4MXniWfroNR/QRRdfrN69+9panrbY4PorNpg+ffpMrSvaHAxG+f6Jd5euje7AtU+vnnrn5W9Rr959gk9SuE8rbN223RIVhw5mrcKjrlV2cD567BhNOfscdeveQ3U1NcrIylJWbht5fij4HnZ3gL9+3bog6TNz2ot68flnNX36NP33mRe03QYBO3TspEF9eqrOTiJcBW4ILuq+dzZ4bI/s2ndgT7nkxGpLcrjw6mrcgL+sfWkaNLivLrFBE/cJkRXLl6l9+/YaMXSIautiwQmD3uSSlpaugoIOcj/KeumllygUDmvJ4kVasWpNMPDU2OrOzfdDGjd6hPr0668NFl/bdu0tVeNp6dJl2ldWrkULF+jll2dp+suvWVtq5QZ0XIxui2/dURx89/D0l17UihUrFAkdf5uFrK7MzEz169tH737HZRpqiaSSPbs1x5JUJftK7bV0/PUbi4F5CCDQ/ALWfcnzPEtAZKjTwE76zRP/0we+fKuu/srtNv1AV3/56OlDX75N11z/Iz33yhvq3D5P2dlZ1rco6CP31Ejfv/Wz+tLnPq5nX5huSd86/eK2r+u+Xz+sW370sJQe1sY9FTaV21ShqA1erLek67w3lliwcW3abc/ZVGF9qM046pqZkabOnTtr7vw/aveepbr/7ts1cOAALVi0TDfc+H1d85nr9eQLrwZfe+XbPuyoAhrMyI34mj13gVauXqOvf+Wzenn2XD38yB2690c36K6bv6Kf2+1Dv/6+/vbUfXrl1ae0fsMqVa98SVe85QJrZ3mDkurvuuTHiCED9K5Lp+qKC6YcMU3Wuz9k+9mRI5SbkxPsG6784OV624VTguUH9uutGku415fUfH8j4ZC279qtr337dt343R/oVw89oq9947v62a8fU9cuuXL7l2uufIv+9MRPtXXrTNunf9CSNVv1ua9+U/f84WkVdmkTvF4atrCiujb4jQw3z+17LrR99dDBgzRn7usq37hFJaU1tq9TEPdV13xaf37iJ/rxPd/TrT+8WwUdC/Ttaz9r++Xs4GsoXRmNTa7cuOx1mpWtUWZ8933f0L//9GsNt33pfQ/8Tl/57s/VtVuOfHstH7m+269V1Emf/ML79JUvfkrz5i1UXps2cp+CufHWu7VpySb94Y9P6KvX36QPve8bev6FBVaEHb/sq7Lkv7Rq1WZ9/CNf1yc//zX97BcPqby8otF6bCW5gUGXIOlkcb39orP15L/+pO/fdL22bd+h2+/8mSWE1isnM80tyoQAAiks4Fnsnmd/3WT3T/hqy3ueJ7setorb362y84JtW7eoW/dCXfX+d2hA/35yCe5LLzwvOH8qsYRG0YYi+b7kqf7ibnv16au3vuUC9bZzramTx2vUmLHWl8XkPu1RUVmpjMyInc9tUSQS0bDhwzV65DBLJHfTxLPGatxZE+TeLOZKc19LFdrfMM+zkt3knmgw2dygbs/z5Hle/TN263neocf1cw/+tafsvifZNex7WrxkWfBbjgMGDtJV77pCUydP1DuveIu6W9zuk/hyl/3ZC7dfHjpsqN79nis1cuTwg/uZ0ooaXXjRBXr7O9+mAQP623lQNEiUuzconH/B+Xrb269QRnpE7tzIFceEAAJvJsDzqSbgp1rAxIsAAokr4E7S3btYp9hB47nnnqfc3FwbGF+i5198Sdt3Fis9Epbn2ZHmCYaYFgmpuHiXdmzfpiVLlmjWrFn65z//rf8995JWr9tggx8xG/BxZZ5ggbZYLBYLvlbKHYhOmDQpGJiZ+/pc/dvK3GuD6mEbyLHFjnsNW8+8euVKvf76HL3y8st66aWXLMHxgv797//qr/94Wo8/8aT+9d/nbHBrjpYsW64NNliza89eVVbXmIGvWbNfU9QGpbJzsoMBD3c8nRYOK79Nrg0WtZfn/tmZxKBBg2ygr0ZFRZs0cdxoXWSDX+kZGcpv106jRo8KBge3bduhxctXa50lSQba8pMmjldGerrZxNXYpa4uqn79+umCCy/QOVOnqmfv3jYgtUXPP/+CFtnBv50DyPO8o1Z1A0WRcJrOO3eqevXqrbVrVusZG4hctOANde/eXe47fCdZsiq/bVt1sGTM6JFDNWLYEBtIGhxMI4cP1fixozR54jj16dtXQ4cMVTiS1mg73YlBG7M4a+KEoJ3uq8kilrBZaMmVZ59/yQYo9yj8JsmTowJgBgIInCGBWJCcbGP92zeu/Zwe+unt+u1Pb9O/fv8T/esPd9dPj9jtkZN77jd36tf33GoJiFv1+U9co7KamPZGPf3jwR/rmg9eFSQ/rnrXV/Xtm++Q29dc/9XP6anH79Hv7vmO7rv5a7rnpi/p7m9/QXff/CV179pJG4qK9MBDtwTP//WBH+rO71+nijrvUL/j+rqCDLkf2a6yARnf8/XP/zyv795+l97xwc/o4gs+rJ89/KR8xVSQm9Fo33gkamZ6RHMXr9SXb7hZD/7uMdXU1mjk8EG6+MJz9LbLL9IF507WmFHD1MkS0Hv37tPs117Xbx/5i5YuWxnUcWR529fs1nuvvEJ33n6TfnzrjfrRYdO3dc8d39Vll1xg+8pivfPtb9VPf/Q9/fi2G3XX7d+xpMqF2ra19Mgim+VxZlpYlZVV+slv/6rrvnG3/v7sTKWFPbl9Sm3c17uuuFRjLXk+/eXZuu7bt2rS2z6up198VYVtM49yjcWlCSMHatKwvoqEI5I8ve/dV8iz7fPi9Jd1yw++oT/85JtyX6U4ZFB/fe9b1wYJs8VLl+vvT79iCac/275mvH7/89tVHg3J7ffVyKWsuk5XveNS/f7+H+uhX/xYV7/vSi1fsVKf+vI3dN1X7lS3gsxG9zUu+dGpoL3u/+GNQd3//Pcztn0/qBss+TNx/Gjdeeu39OijPwj2gcOGDLKkzOd06/c+o1u/+lGbPqY7rv+U7rrtK7rvgR/oIx+6Sh/+0Hs1YlAfS1ZFj2ql2/du2l6uH9/yTT364E9te39PwwcP0C8feliXf+jz+u3fn1W3Y3zV11GFMQMBBJJWwB25x+3MoLysTJUV5UG/58l703jdbrC2plZuvaqqqmD/fWAl354ss7JmzHhZq1auUFZ2ttwx+eQpU9ShQwcVrV+vV155srpUAgAAEABJREFURe5TjyHfD1bzPE/uNzWWLluqtu3aatLkSerXf4BK9+3Tq6/OtvO39davh+x8KGz7veVauWK5IpGIRowcqUkTJ9k5Ri+5T4U++c//aM/uYvl+yJIl6XIXt5+uKC8PkiOed3hsFRUVqrC2RqNRW8cLlnHtqLR9eyh0aFkXU22txVteFnxVrzuf8K3te619L02bZnGulGPr2q2bamtq5L4Wed++vYFn8CkXK8pV7X5PxXnVWVmeW0EK6q2xdaqrqhWN1gVzPZvvPmFaU1Otmurq4PjDzbPZXBFAAAEEjhCo35McMZOHCCCAQGsUcAeE7qDSHVy6rzmZPmO65i9YZAd8VYqcQGLhyJgi4bA2bNioGTNf1htWzsaNm+zAMarcrHSlRcLyvFM7hKw/KI1rzeqVVvZMuXc3ZaeFFAr5Rzah0cdhi2XNuvV24L5C6zcUafuOHdprB8fRuhplRULKz8tSXm6msjLSlJ4WCWIP+b4NBHlWR8gOuCs02xInq9esDQ6W3QBHfn6exowdp/PPP0+ysNz32tfW1WqlnXC0zctRFzsQz7WE0sYN6/XG/HmaPmOmXn5ltkr2lijT2v7G4iVmtV75+fmWWAjbKZAav5iZO0GoqqzQ6lUrNe2ll/SKJWTK7ETAtdXzrPLG11StHcxHImFLRi2SG2hqk52uteuL5BJIZRZ/VlaWCgo6qkvXburWrXv91L0weNdYl67d5b72qkOHArVt206ZlsipthMuzzu6PjenygbS6mqrtW/vHs2zBNWLL00L3p0V8uI2IBUSFwQQaK0CNZYEbauIDWhs27ZNOy2BvXOH3Z7IZMvu2L7dkt7bVbJnt+sKVb6rXO6d74/96XHd+KP71aV/vqa/tlBf+cYtesYSt66f7VnYTUOGDNTokcM1dswojR01MrgdZ/cHDRqgvr17qnu3Lkqz7LX7CqEDcq6v6d4uSz974BF98BNf1pUf+ZI+/s0f2iD+E9q0aZMKB3VUjw651uec2L7hQLl5mWlavnqtvnLLvXr/p67XO675gq74wGd0+fs+o7d98HN6x4e/qPd84lp96As36qPX3abP3nSX5ryxWJnpkQNFHLzt0r+9fvfYE/roZ7+uj3zu6/roUdN1uvqTX9UHP/5lfeSzX7Pnr7Pbr9uyX9Nfn/yPunRpc7Cs5r4Ttn1oj/Y56tG7ndrnZAb7PN/2fV60Wtfe9ENLKn1WH/3arfrtE/+xQfs0dcnPlue5rXCoZTHLfuysjun6a7+ke+74njp37qit9joqLSvXtBmz9IdHp+mtb7lYPbp31bx5C/TLX/9OH/v8DXrv52/U05Z06dotV7965O96/G9PqmuXzsrLypQVeaiCI+6V2qCXe6298MI0ffzz1+l9n/uWpr38ugoHdVDIP/Z2d/vtzIx0/fXvT+uLX71TXQd01fOvzNeXbvi+7VtXqWOHdho2dLAmTzpLU8+ZrHPPPUfnnztV5009R2dPnqiJZ43T6BHDg6/A6tC+nezgxl2PaJ3qfWJR7SkutkHBTXrAEh/v+9iXde0P7lesukI92uXocEFxQQCBFBTwPE9uMP7FF1/Sy5ZoLnOfKvPfvHcI+b42bd4s90aoZctWKOOI/VDI91Vrx+NzX5+vZ599TtMtSfDyjBm2/PN2/vCqinfvtn1k6DDxuJ2FzFu4VM8994JmTJserPOS3a5fv0EZdl7kFvY8a1s8ptfnvaEXX3xRL8+aqZkzZ9g6z2ve/DekWK1eemm6Xpszx86bqoN+buHCRZpm5RQX79GBczbP86yPj2v2q69aGa/Y+VipIqGQdhXv1vTp07Vo4ULb94ddlcEUCYe0act2vfDCS1pi507pdl7jeZ46dexgSZOo5r4+z9rzkp559llNnzlLK5atkx8KWUIjas/XyvM8uXPQVStX6b//+a+dC660x/XxZ2dENOvlVwKntWvXK2x1uX3g3n2lesW2yXPPP6+aWkuMWBlBY/jzpgIsgAACqSXgp1a4RIsAAoks4Hme3DtwZr/6ml5+5VXt3r1HYTv4dgd/pxpX3A6Oo5YIiIT94EDS8+yAWad+cW1xB8UzLIHw2pz5NsC+V27QxvNOrtyQ79sBb1gRO7gN24GxK9fzPMmuepOLW36zDejU1dUFS7rVSkvLtHlTkYo2rNPrc17V2nXr9cYbC7RmzTq53+SYP+91S9bM0qzZc4LvQHc/HOuqOlCvbycbCxYsDJIFpaXlwcBTUPgRf8Ihd6KzRc/bYM/8NxbZCUKxZMYh//i7G8/z5LbFy7Ne1spVa4MwPc9TyLZv8a7i4F3MM2bM0tw5r2m+JSzemP+6tX+eglu7P3/eXL0+d47mvPaqnQS8bMu/pgZvyFLDi+d5qq6psZOeeXrhpZlas3adKi1h49rueS7qhktzHwEEWpNAVmEn/ffZF3XPvb/Ul2/6sT766Zv1kS/eemLTl2y5L9xsyYibdMevHlN2xFfHDun62je+p2//9PfK8mJBn5trgwxbtm3XTXf/The94/P6+Je/rW999wf6/m136pYf/kQ3/+BOfe/WO4NPitzw7dv0peu+p//73PW69ns/Uff8dHneoX7Etz6surJSC5euULUlgjtnhtSjbXYwSON5h5Y7WeOs9DR1yYkoFK1RjZVbbknisn0lqijbp7pK66NtQCnDi6p9hq/ubdKVFq4fQDmynkg4pHUbNum1+Yu1YPGKRqdFS1dq8bJVWrhk5cHnX5u3WBs3bw28jizzTD8O+b5K7Hhgz+5itUv31TkvUwcGr45siyPP9uN6wQbE/vu/Z/WTn/5cT/ztn7rvwcf0k1/8VjkFIXtt3a/Pf/27evf/fUO3P/BHrTefdpY7yrHXhdtPhOJR3XX/I/rmd25VVUVpsI8/sh732L2OnrKkyRUfvV4f/9oPNfPVN5QTiinXElied+xt7+rYvnO3vveDe/SDnz2kbj1ygzo65GTYvnujPvutu3TlJ6/XN7/7Q/3wzp/pznvuszj2T/f8XD+6617d/qN79J1bfqSvffNmXXfT7VqyaoPS08KuWUdNhV3b6Ku3/kyXvO/L+s7Pfq8NGzerMDcteAf1UQszAwEEUlYgbucC5RUVwTGzO2Y/UYhoXVTlFeVyn1LwvKP7Pt/6cDsJUFlZqbZt366NW7Zo7173qYioQn7j5w9hK6bCjt232PnOth07grJD/uHLep6dW1iC15W1cdNmbd++Q24d2y0H5VZVVarS4onFYrbflqqrq4N2xuy85cjYKm0/Xmn1xW1ZWd1uHWdRZetYNYctHrM6XbzV1VXyPE9VtVGNGztWl156sZ1rRiyJUmZTqfaUlGrUmEHKzs6RK9sl4n1b3vM8i6cm8KitrTlYtud5qrJ2lJeXq7a29uB81xa3vpt/cCZ3EEAAAQSOEjh8L3HU08xAIFUEiDNRBDzPCw76Qr4XHLyqCS6eZ0eyTVDOgSJ8K6/SDlDTIiH5RxyMH1imuW9Dvh8cdLt6PM9TZVWVlq1YrTnzFga37uC82g7a3ffO1tTUaWfxbtVaUiDd2hwO+UGCw1ZzqweT53lyH80u3l1iMR3fy8UftuyDiz/kH2pHUNBx/rj1Su2g3iV9rLqDS/pWhivLtbm0vEK7S/Zae/do567d2rF/cu13iZySvfvkTiDcR8QblnGwsP13PM+zGGUDPCEbWArZfU9cEECg9Qu4QeBHnnpB19/+S8kG+Qt756uwS+6JTzbYW9i9jTpku0SFgkTE4hXrVJiXoYaD5i5h0KNtlgq75ajKBkjWFW3R4pXr9cbS1Vq4fK0NKK/XijUbtXbjFm3dsUt7rV+KKNZoX+L7njLTIkGywPOarq/xPC9oczgcCsp2faebwpY0d7GEfD9oj+d5Ot4lHPKVlR5R5klMbvmQ7x+v2DP6nIvXxe6b9fEq9jwvSHz98Nd/0Reuv0s33PyANm0vlvvqELf/aGdJhqeff0VuX+e2ffe8rCBx4PuHYnVeaSHp5deXyL0j93j1ZURCKmybocKOOcHvaIT8Q+Ucb71I2A9+98R9KtHFdmBZl8QoLMhRXkTauHWH5i1epVlzF2vaqwv14itv6MXZCzRj7iK9+sYyLVi+RqvWbdTuPXvteEDy1PjF8zwVZEWsjVmWnMuy/xNhed6xlm68DOYigEBqCPjWN3jeSfYPtvibreeKdP1syPcV8n071/Ab7Yc82T+3sE2uzJDvB8t7ntfoBvA8Lygr5PvBrVtH+y+e58nzvP2PFNxv+LwaXDzPC55vMOu4+1dXjud5weKWhtFuS9K3aZOnc6eerVEjhqpf756aOH6Uhg4dHrR/44YNlnypPFiH53lBez2vvgztv3ieZ/O9g8tp/8XzvKA94oIAAgggcEwB/5jP8AQCCCDQSgU8z2ulLTvULM9rXW30PC8YIMtIC8t9tNrzvPqDZ092q+Dg2/M8He/innYnJ8db5nSfcycMxyrD87zg4N61IeT7QZtD/uG37jnf9ywmT1wQQOAEBBJwkbZZ6erRsf5d8e5/+qlMDcN2g8qe50ppOLf+vud5liT1g37T9Z8ukZFhyYwM60vdeukR61P3JyBc31O/Fn9bs4Dneeqeb4P9hfnq0S1PLtnltl3Irz8tamOvr4htU8/zjhmGb8+5JNAxF2jwhOd5tk9qMOME74ZDfrDPO3Jxz2b41lbXbpe0ys5IU46bMu3WTXbftc29Vt3r05Xj1tFxLp7nWRu94yzBUwgggEDLCrh+132ywn3SwU+g7ioS8vXGwkVat26N2uTlafjwERo9ZqwGDR5ioHEtXbpES9zXg9lxhc3gigACCCDQTAL1R/rNVHgiFUtbEUAAAQQQQAABBBBAAAEEEEAg+QWIMHEEPM+T+yTFggULtGD+G3KDWJ7nJUQAnufJfd3ynDnz9MqsmVrwxny530l0tzNnzNCChYsVj0XleYkRT0Kg00gEEECgEQG372hkNrMQQAABBBBAIAUECBEBBBBAAAEEEEAAgVYuENeOHbu0fcdOa2fcpsS5ep6nWLROW7fv0PKVq7Vg8VKtWrNWe0r2yX2axfNIfiTO1qSlCCS8QMoGQAIkZTc9gSOAAAIIIIAAAggggAACqShAzAggkGgCvmUL3JRo7Xbt9Twv+Ppe9xWL7isMw6FQ8Hse4oIAAgggcEYE/DNSC5UggAACCLROAVqFAAIIIIAAAggggAACCCCAAALJL0CECKSoAAmQFN3whI0AAggggAACCCCAQKoKEDcCCCCAAAIIIIAAAgikhgAJkNTYzkSJwLEEmI8AAggggAACCCCAAAIIIIAAAskvQIQIIIBASgqQAEnJzU7QCCCAAAIIIIBAKgsQOwIIIIAAAggggAACCCCAQCoIkABJha18vBh5DgEEEEAAAQQQQAABBBBAAAEEkl+ACBFAAAEEEEhBARIgKbjRCRkBBBBAAIFUFyB+BBBAAAEEEEAAAQQQQAABBBBIfgESIMm/jYkQAQc1WVEAABAASURBVAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIGUEyABknKbnIARQAABBCQMEEAAAQQQQAABBBBAAAEEEEAg+QWIMNUFSICk+iuA+BFAAAEEEEAAAQQQQCA1BIgSAQQQQAABBBBAAIEUEyABkmIbnHARQKBegL8IIIAAAggggAACCCCAAAIIIJD8AkSIAAKpLUACJLW3P9EjgAACCCCAAAIIpI4AkSKAAAIIIIAAAggggAACKSVAAiSlNjfBHhLgHgIIIIAAAggggAACCCCAAAIIJL8AESKAAAIIpLIACZBU3vrEjgACCCCAAAKpJUC0CCCAAAIIIIAAAggggAACCKSQQMomQFJoGxMqAggggAACCCCAAAIIIIAAAikrQOAIIIAAAgggkLoCJEBSd9sTOQIIIIBA6gkQMQIIIIAAAggggAACCCCAAAIIJL8AEe4XIAGyH4IbBBBAAAEEEEAAAQQQQACBZBQgJgQQQAABBBBAAIFUFSABkqpbnrgRQCA1BYgaAQQQQAABBBBAAAEEEEAAAQSSX4AIEUAgECABEjDwBwEEEEAAAQQQQAABBJJVgLgQQAABBBBAAAEEEEAgNQVIgKTmdifq1BUgcgQQQAABBBBAAAEEEEAAAQQQSH4BIkQAAQQQMAESIIbAFQEEEEAAAQQQQCCZBYgNAQQQQAABBBBAAAEEEEAgFQVIgKTaVideBBBAAAEEEEAAAQQQQAABBBBIfgEiRAABBBBAAAGRAOFFgAACCCCAAAJJL0CACCCAAAIIIIAAAggggAACCCCQ/AJHRkgC5EgRHiOAAAIIIIAAAggggAACCCCQ+AJEgAACCCCAAAIIpLwACZCUfwkAgAACCKSCADEigAACCCCAAAIIIIAAAggggEDyCxAhAocLkAA53INHCCCAAAIIIIAAAggggEByCBAFAggggAACCCCAAAIpLkACJMVfAISPQKoIECcCCCCAAAIIIIAAAggggAACCCS/ABEigAACDQVIgDTU4D4CCCCAAAIIIIAAAskjQCQIIIAAAggggAACCCCAQEoLkABJ6c2fSsETKwIIIIAAAggggAACCCCAAAIIJL8AESKAAAIIIHBIgATIIQvuIYAAAggggAACySVANAgggAACCCCAAAIIIIAAAgiksEDKJEBSeBsTOgIIIIAAAggggAACCCCAAAIpI0CgCCCAAAIIIIDAAQESIAckuEUAAQQQQCD5BIgIAQQQQAABBBBAAAEEEEAAAQSSX4AIjyFAAuQYMMxGAAEEEEAAAQQQQAABBBBIRAHajAACCCCAAAIIIIBAvQAJkHoH/iKAAALJKUBUCCCAAAIIIIAAAggggAACCCCQ/AJEiAACjQqQAGmUhZkIHBDwDtzhFgEEEEAAgZYT8NgftRw+NSeiAG1GAAEEEEAAAQQQQAABBJwACRCnwIRAIwJurCkejykej8vzEva/SiORMQsBBBBIQIGQ9cNxWZ8cS8DGn36T47H6uEO+OZx+cZSAAAIIIHAqApaL9jwv2Be5cwTJZii1LkHctj82htQKnGgRSAwBWplKAtYRB31y6u2KUmkrE2sTCXAW3USQFJN8Ap7nqba6OpgikYg8j71K8m1lIkIAgUQQcAf2+QV5qovWqqamSl6KJQFcuNXVlYpHo8rOyrCBNxt5SoQN16JtpHIEEECg6QU8z1M4HFF1VaXqamtT7vzADR7U1VQH+6G0tIjYGzX9a4wSEUAAgRMR8OQpLRK28aqqoE+23dOJrMYyCKSsgJ+ykadK4MR5ygJ+KKTyilJVVlUoIzNTnuedclmsiAACCCBw6gLRaExdOhWorqZGFWVl8v3QqReWgGv6oZDKSvdaAqhO+Xl5wUlOAoZBkxFAAIGEFwj5vtLS04M+ubqyQqmYkK+oKLPtGFdmRib7I5NodVcahAACqSHgecrKzFJ5ean7iLzF7NnEFQEEjiVAAuRYMsxPeQHfD2vv7h2qrixXTk6OfNvBxHmbU8q/LgBAAIEzL1BRVaPC7t1VXVWlkuJtJ5QAOfOtbL4aQ6GwindsUrSuTh07WCIoGm2+yigZAQQQQKBRAfdpxJAlpLOzsoMESFnpbnleap1O+7Y/2leyW2HnkJ2lWIyTo0ZfLMxEAAEEmlPAut4663/z8vO1t6RYdleeRwKkOckpu/ULvFkLU+uI7c00eB6BBgK+76ukpCQ4wcnJyVVuTrbi8frvYG+wGHcRQAABBJpRIG6ZZ/cpvO6WANm1c5tKyyvk+udmrLLVFe37IZXsLVXpvt3q3LmTIuGI7Y/szKfVtZQGIYAAAskr4PZHbXJzlZ6eppLdu1RTU9caB5yadQP4oZC2bd0gxaNq1769aupIyDcrOIUjgAACjQjUxaLq2qmDcrKztGXTupTbFzVCwiwE3lSABMibErFAKgtEwr42Fa0JvluxY6eOcln2VPYgdgQSR4CWJotAbV1MQ/r3USQ9XWtXLrbB/9Q8dHHv6dq4YY2ysrLVqWMBCRBxQQABBM6sgPu0Q4f2HRStrdGWzesVSQuf2Qa0gto8z1d5aYl27tiirl27KRazXAj5+FawZWgCAgikkkBVTVTDhgxRaelebbMEiB+KpFL4x4iV2QgcXyA1RxGOb8KzCBwUCIfTtHHtMpWX71X37oVyO5qDT3IHAQQQQKBZBdy7bTPS09S9R6H27inW2jXLFY6kN2udrbXwNHPYtGG1DTztVedOneX7Pj8+21o3Fu1CoCUFqLtZBOLW48Y9Tx06dNDekl3aunG1Qik44OR5Lh3vqWj9KqWlRTR2xBBVVFU3izmFIoAAAggcLVBbF1Wv7p3VoWOBtloyvryiKjgvOHpJ5iCAQEMBEiANNbiPwBECng0w1dbVacWS+Soo6KDhg/upqrr2iKV42BoFaBMCCCS+QG00pj59eikvL1+rli+QbyF5nht8sTspdg2FwtqxbYs2rF2hdu3aqWNBgaL8FkiKvQoIFwEEWkqgzgac+vXupczMdK1YOt+a4cvzUnR/FE7TmpVLtW1LkYaNGKGO7dupjv2RvSa4IoBASwqkQt3uzWGRcFhDhg5VPBYN9kfpaWmpEDoxInDaAv5pl0ABCCS5gHu38fLF84NBpxEjRqqwWxc7yI8ledSEhwACCLSsgBtsKmjfVr1799HWzeu05I1XlJ6R0bKNauHa0zPStWDeTO3euVW9e/VWmp3wxNz3j7Rwu6i+VQnQGAQQaGKBWCyuLp07qV/fflq2cK6KVi9XKBxp4loSpzjP84LfQZn2v8dVXV2hsePGKiszU84pcaKgpQgggEDiCdTURjVk8CDl5bXRkgWvqXjHNtsfpd7XMSbelqPFrUHAbw2NoA0INL1A05XoeZ4iaWHbwbyqutoqjR47Vh3atZUbnGu6WigJAQQQQOCAgHsnaSSSpjFjxspT/bubYvG4PD+1D1t8P6TqygqtWDJPaRFfI4YNkx8Oy9kcsOMWAQQQQKDpBKKWZO5gyfihQ4apdO9uzXv5eYXTM+R5XtNVkoAluU8lVlfXBQkhNxA3fPhw2xdJ7t3JCRgOTU4KAYJAILkFqmpq1auwm/r276/tWzZq+aLXlGb7o+SOmugQaDqB1B5JaDpHSkpygXA4TcU7t2r+azOUbsmQsyZMVJ18VdtOiAP9JN/4hIcAAmdMwPWn7uA+LZKuiy++QG3z86zfna6tRWvk+uEz1pBWXFE4kqb1a5aayzR16dxZ40aNku/5h74OqxW3naYhgAACiSLg9kfua3Bzs7M1bNgIRWuqNPeVFxQP+fJ9P1HCaNZ2pmdmaMmC2Vq3eql69+6tMSOHa+/OUtsf8Un5ZoWncAQQSCkB9+m6fWWV6tGtqyZOmaK9u7dr7uwXVFcXY3+UUq8Egj1dgaQ9ejtdGNZH4EiBSFqGVi59Q9Of+4cNNkX19rdeqj69etigXFh10RjveDoSjMcIIIDACQq4gSb3qY943FP/vr110UUXKD0jTdOef1KrVixW2PrfEywqBRbzFElL19JF8/XK9P8pNydHZ40fr4KCgiD2WIz9UQDBHwQQQOAUBNz+KBaLKxKJqLBbN40bN06VZXv0/H+f0Mb1K5XG/uigquf58vywXn7x31rw+kz1G9hfb33HperQvl3waRD36RmdwQtVIYAAAskk4PZFtXVRZWVlavLEcZp89tkq3rFZTz/xe5WV7lUozFdfJdP2JpbmF/CbvwpqQCB5BDKysrRl4zpNe/Yfqiwv0ejRYzRx4gT16lmouJ0ElFfVWDIkSjIkeTY5kSCQaAIJ0143yBS15HGF9ZueH1KP7t00YcI4ua/RcP3rrBf+pfWrl9lBf5a4HCngmUumFs+frVdnPqPayjINHTxYQwYNtoGn9vJsf1RbV6cYyZAj4XiMAAIIHCUQ7I+sv6ytrVPYBpS6de2qUSNGakD//tq5ZYOmP/uk9uzaZol59kdH4vm+L/dJkNdfeUnzX5uunJxM25dP0NjRo9Q2P1/VtVFVVdfKJUPi8SPX5jECCCCAQEMB97W2tZb0cOdHLvExaEA/TZo0SYXdu6tozTLNfOFpRdIitq9K3d+haujF/UCAPyco4J/gciyGAAL7BdwnQYrtJGjG809p9cqFykiPaNy4s3TR+edp8vgxcl9JUhPzVLKjVCXb9jBhwGuA1wCvgSNfAztLVRNVMFg/YewonX/euZowaYra5edprfWrM55/Wps2rFZ6Rtb+npebowU888nUmhULNfPFp7Rx3XLzaxMk5sePHaP+ffqoTZs2istTeWW19pVXMmHAa4DXQBK/Bk6tj3ODTO5dtB07dNCwoYM1fuw4DbGEsmI1WrFormY896T27S1ROJJ+dDfMnEDAs6R7emamFr0+S7On/087thWpa7cuOmfqVF143jkaMWyw2uS20d6KGjseKrGJ8yPOEXkN8BrgNXD4a8D6xpJKua/87VXYXeedM1nnnnuuhlkyvraqVAusf3XH+xXlZbYMyY9g58MfBE5SwD/J5VkcAQRMwO2YqqoqNXfWs3rpf3/XvNdeVMiPa8DgITr3vPN09fuv0ie/8DF98kufYsLgzL4G8MY7EV4Dn/+YPvSB9+qiiy/SoKHDFLb+c9HrM/XSs3/XnJefV1VVhcKRNOttuR5PwPPc12FlqLx0n15+8V968Zm/a8n8VxTxPQ0aNFhTJk3SZZdcoivf/jZd9c53MGHAa4DXAK+BI14D73rbFbr4/As0zhIfvXr2Vm1VmWZP+49e+O9fNX/OS4rJUygcFpfjC3iep7SMLG3fWqSZLzypl2x/tMkl5tu306jRY3TZWy/TJz/6ITtG+6RNnB9xjshrgNcAr4HDXwPWN37qw7ryyndq8jlnq7BHD5WW7NRrM57RC/97QquWzbN9Ubr8UCP7o+N3zzyLAAL7Bfz9t9wggMBJCvh+KDjQLy/fG3wNyeOP/lJ/uP9mTX/2H1q64DW5r24pWrdSTBjwGuA1wGvg8NcDtjUMAAAQAElEQVSA6x+XLZyjWTZo/4df3iLXf77+6jSV7Nkl96kP17+KywkLuJOhtIxM7d65Va+9/IL+9PDP9Zff/kSv2CCec16/eqnti1YwrcOgKIkNiI3X96m8BtavWqJF81/WC/95Qr/52c36+58f0qrl81VVWa609Cz5PqfLJ7wzsgVD4YhC4XTt3L5J057/px5+4E79/bH7NGfWs1q15A1tWONep4cfE3CMhAevAV4DvAZWau2KxVo4d6aee/pPeui+2/XvJx8L9kfxmOS+hcTzPOtluSKAwKkK+Ke6IushgEC9gO+HlJGZpaysLCmUobWrl2jW9P/p2X8/of89/eczPVEf5rwGeA20+teA6x9nTfuvVi6bL/lpQf+ZaX1oiHc11e9YTumvJzfw5PZFbqqqrtbyRXM186X/sD+iT2j1fQLHSxwvttRr4Nn//FWzZz4fJIgjGRnB/qg+8RESl1MT8DxP7tPybl/kpn2lpVr8xmy99PzTeuZff6E/Yp/Ea6BpXwN4Jonn8//7u+a88qI2b1qnzMzM/fujTHkk4k9tZ8RaCBwhQALkCBAeInA6Ar7tnNLS6k+e3AE/U31iCAcceA3wGmjsNZCWninfD51Ot8u6xxCo/1RIKr3uiLWx/2PM43XBa+DEXgORtHTbH3FqfIxdymnNdm9uSM84se3A6xUnXgO8BlL5NeDeEOa+BtjzvNPqd1kZAQSOFuAo72iTxJ5D6xFAAAEEEEAAAQQQQAABBBBAIPkFiBABBBBAAAEE3lSABMibErEAAggggAACCLR2AdqHAAIIIIAAAggggAACCCCAAALJL3CyEZIAOVkxlkcAAQQQQAABBBBAAAEEEECg5QVoAQIIIIAAAggggMCbCJAAeRMgnkYAAQQQSAQB2ogAAggggAACCCCAAAIIIIAAAskvQIQInJwACZCT82JpBBBAAAEEEEAAAQQQQKB1CNAKBBBAAAEEEEAAAQQQOK4ACZDj8vAkAggkigDtRAABBBBAAAEEEEAAAQQQQACB5BcgQgQQQOBkBEiAnIwWyyKAAAIIIIAAAggg0HoEaAkCCCCAAAIIIIAAAggggMBxBEiAHAeHpxJJgLYigAACCCCAAAIIIIAAAggggEDyCxAhAggggAACJy5AAuTErVgSAQQQQAABBBBoXQK0BgEEEEAAAQQQQAABBBBAAAEEjimQNAmQY0bIEwgggAACCCCAAAIIIIAAAgggkDQCBIIAAggggAACCJyoAAmQE5ViOQQQQAABBFqfAC1CAAEEEEAAAQQQQAABBBBAAIHkFyDCUxQgAXKKcKyGAAIIIIAAAggggAACCCDQEgLUiQACCCCAAAIIIIDAiQmQADkxJ5ZCAAEEWqcArUIAAQQQQAABBBBAAAEEEEAAgeQXIEIEEDglARIgp8TGSggggAACCCCAAAIIINBSAtSLAAIIIIAAAggggAACCJyIAAmQE1FiGQRarwAtQwABBBBAAAEEEEAAAQQQQACB5BcgQgQQQACBUxAgAXIKaKyCAAIIIIAAAggg0JIC1I0AAggggAACCCCAAAIIIIDAmwuQAHlzo9a9BK1DAAEEEEAAAQQQQAABBBBAAIHkFyBCBBBAAAEEEDhpARIgJ03GCggggAACCCDQ0gLUjwACCCCAAAIIIIAAAggggAACyS9wuhGSADldQdZHAAEEEEAAAQQQQAABBBBAoPkFqAEBBBBAAAEEEEDgJAVIgJwkGIsjgAACCLQGAdqAAAIIIIAAAggggAACCCCAAALJL0CECJyeAAmQ0/NjbQQQQAABBBBAAAEEEEDgzAhQCwIIIIAAAggggAACCJyUAAmQk+JiYQQQaC0CtAMBBBBAAAEEEEAAAQQQQAABBJJfgAgRQACB0xEgAXI6eqyLAAIIIIAAAggggMCZE6AmBBBAAAEEEEAAAQQQQACBkxAgAXISWCzamgRoCwIIIIAAAggggAACCCCAAAIIJL8AESKAAAIIIHDqAiRATt2ONRFAAAEEEEAAgTMrQG0IIIAAAggggAACCCCAAAIIIHDCAgmbADnhCFkQAQQQQAABBBBAAAEEEEAAAQQSVoCGI4AAAggggAACpypAAuRU5VgPAQQQQACBMy9AjQgggAACCCCAAAIIIIAAAgggkPwCRNhEAiRAmgiSYhBAAAEEEEAAAQQQQAABBJpDgDIRQAABBBBAAAEEEDg1ARIgp+bGWggggEDLCFArAggggAACCCCAAAIIIIAAAggkvwARIoBAkwiQAGkSRgpBAAEEEEAAAQQQQACB5hKgXAQQQAABBBBAAAEEEEDgVARIgJyKGusg0HIC1IwAAggggAACCCCAAAIIIIAAAskvQIQIIIAAAk0gQAKkCRApAgEEEEAAAQQQQKA5BSgbAQQQQAABBBBAAAEEEEAAgZMXIAFy8mYtuwa1I4AAAggggAACCCCAAAIIIIBA8gsQIQIIIIAAAgictgAJkNMmpAAEEEAAAQQQaG4BykcAAQQQQAABBBBAAAEEEEAAgeQXaOoISYA0tSjlIYAAAggggAACCCCAAAIIIHD6ApSAAAIIIIAAAgggcJoCJEBOE5DVEUAAAQTOhAB1IIAAAggggAACCCCAAAIIIIBA8gsQIQJNK0ACpGk9KQ0BBBBAAAEEEEAAAQQQaBoBSkEAAQQQQAABBBBAAIHTEiABclp8rIwAAmdKgHoQQAABBBBAAAEEEEAAAQQQQCD5BYgQAQQQaEoBEiBNqUlZCCCAAAIIIIAAAgg0nQAlIYAAAggggAACCCCAAAIInIYACZDTwGPVMylAXQgggAACCCCAAAIIIIAAAgggkPwCRIgAAggggEDTCZAAaTpLSkIAAQQQQAABBJpWgNIQQAABBBBAAAEEEEAAAQQQQOCUBRImAXLKEbIiAggggAACCCCAAAIIIIAAAggkjAANRQABBBBAAAEEmkqABEhTSVIOAggggAACTS9AiQgggAACCCCAAAIIIIAAAgggkPwCRNhMAiRAmgmWYhFAAAEEEEAAAQQQQAABBE5FgHUQQAABBBBAAAEEEGgaARIgTeNIKQgggEDzCFAqAggggAACCCCAAAIIIIAAAggkvwARIoBAswiQAGkWVgpFAAEEEEAAAQQQQACBUxVgPQQQQAABBBBAAAEEEECgKQRIgDSFImUg0HwClIwAAggggAACCCCAAAIIIIAAAskvQIQIIIAAAs0gQAKkGVApEgEEEEAAAQQQQOB0BFgXAQQQQAABBBBAAAEEEEAAgdMXIAFy+obNWwKlI4AAAggggAACCCCAAAIIIIBA8gsQIQIIIIAAAgg0uQAJkCYnpUAEEEAAAQQQOF0B1kcAAQQQQAABBBBAAAEEEEAAgeQXaO4ISYA0tzDlI4AAAggggAACCCCAAAIIIPDmAiyBAAIIIIAAAggg0MQCJECaGJTiEEAAAQSaQoAyEEAAAQQQQAABBBBAAAEEEEAg+QWIEIHmFSAB0ry+lI4AAggggAACCCCAAAIInJgASyGAAAIIIIAAAggggECTCpAAaVJOCkMAgaYSoBwEEEAAAQQQQAABBBBAAAEEEEh+ASJEAAEEmlOABEhz6lI2AggggAACCCCAAAInLsCSCCCAAAIIIIAAAggggAACTShAAqQJMSmqKQUoCwEEEEAAAQQQQAABBBBAAAEEkl+ACBFAAAEEEGg+ARIgzWdLyQgggAACCCCAwMkJsDQCCCCAAAIIIIAAAggggAACCDSZQKtNgDRZhBSEAAIIIIAAAggggAACCCCAAAKtVoCGIYAAAggggAACzSVAAqS5ZCkXAQQQQACBkxdgDQQQQAABBBBAAAEEEEAAAQQQSH4BIjxDAiRAzhA01SCAAAIIIIAAAggggAACCDQmwDwEEEAAAQQQQAABBJpHgARI87hSKgIIIHBqAqyFAAIIIIAAAggggAACCCCAAALJL0CECCBwRgRIgJwRZipBAAEEEEAAAQQQQACBYwkwHwEEEEAAAQQQQAABBBBoDgESIM2hSpkInLoAayKAAAIIIIAAAggggAACCCCAQPILECECCCCAwBkQIAFyBpCpAgEEEEAAAQQQQOB4AjyHAAIIIIAAAggggAACCCCAQNMLkABpetPTK5G1EUAAAQQQQAABBBBAAAEEEEAg+QWIEAEEEEAAAQSaXYAESLMTUwECCCCAAAIIvJkAzyOAAAIIIIAAAggggAACCCCAQPILnOkISYCcaXHqQwABBBBAAAEEEEAAAQQQQEDCAAEEEEAAAQQQQKCZBUiANDMwxSOAAAIInIgAyyCAAAIIIIAAAggggAACCCCAQPILECECZ1aABMiZ9aY2BBBAAAEEEEAAAQQQQKBegL8IIIAAAggggAACCCDQrAIkQJqVl8IRQOBEBVgOAQQQQAABBBBAAAEEEEAAAQSSX4AIEUAAgTMpQALkTGpTFwIIIIAAAggggAAChwS4hwACCCCAAAIIIIAAAggg0IwCJECaEZeiT0aAZRFAAAEEEEAAAQQQQAABBBBAIPkFiBABBBBAAIEzJ0AC5MxZUxMCCCCAAAIIIHC4AI8QQAABBBBAAAEEEEAAAQQQQKDZBFpNAqTZIqRgBBBAAAEEEEAAAQQQQAABBBBoNQI0BAEEEEAAAQQQOFMCJEDOlDT1IIAAAgggcLQAcxBAAAEEEEAAAQQQQAABBBBAIPkFiLCFBEiAtBA81SKAAAIIIIAAAggggAACqSlA1AgggAACCCCAAAIInBkBEiBnxplaEEAAgcYFmIsAAggggAACCCCAAAIIIIAAAskvQIQIINAiAiRAWoSdShFAAAEEEEAAAQQQSF0BIkcAAQQQQAABBBBAAAEEzoQACZAzoUwdCBxbgGcQQAABBBBAAAEEEEAAAQQQQCD5BYgQAQQQQKAFBEiAtAA6VSKAAAIIIIAAAqktQPQIIIAAAggggAACCCCAAAIINL8ACZDmNz5+DTyLAAIIIIAAAggggAACCCCAAALJL0CECCCAAAIIIHDGBUiAnHFyKkQAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIPkFWjpCEiAtvQWoHwEEEEAAAQQQQAABBBBAIBUEiBEBBBBAAAEEEEDgDAuQADnD4FSHAAIIIOAEmBBAAAEEEEAAAQQQQAABBBBAIPkFiBCBlhUgAdKy/tSOAAIIIIAAAggggAACqSJAnAgggAACCCCAAAIIIHBGBUiAnFFuKkMAgQMC3CKAAAIIIIAAAggggAACCCCAQPILECECCCDQkgIkQFpSn7oRQAABBBBAAAEEUkmAWBFAAAEEEEAAAQQQQAABBM6gAAmQM4hNVQ0FuI8AAggggAACCCCAAAIIIIAAAskvQIQIIIAAAgi0nAAJkJazp2YEEEAAAQQQSDUB4kUAAQQQQAABBBBAAAEEEEAAgTMm0GIJkDMWIRUhgAACCCCAAAIIIIAAAggggECLCVAxAggggAACCCDQmjOIpQAAEABJREFUUgIkQFpKnnoRQAABBFJRgJgRQAABBBBAAAEEEEAAAQQQQCD5BYiwlQiQAGklG4JmIIAAAggggAACCCCAAALJKUBUCCCAAAIIIIAAAgi0jAAJkJZxp1YEEEhVAeJGAAEEEEAAAQQQQAABBBBAAIHkFyBCBBBoFQIkQFrFZqARCCCAAAIIIIAAAggkrwCRIYAAAggggAACCCCAAAItIUACpCXUqTOVBYgdAQQQQAABBBBAAAEEEEAAAQSSX4AIEUAAAQRagQAJkFawEWgCAggggAACCCCQ3AJEhwACCCCAAAIIIIAAAggggMCZFyABcqbNqQ8BBBBAAAEEEEAAAQQQQAABBJJfgAgRQAABBBBAoMUFSIC0+CagAQgggAACCCS/ABEigAACCCCAAAIIIIAAAggggEDyC7S2CEmAtLYtQnsQQAABBBBAAAEEEEAAAQSSQYAYEEAAAQQQQAABBFpYgARIC28AqkcAAQRSQ4AoEUAAAQQQQAABBBBAAAEEEEAg+QWIEIHWJUACpHVtD1qDAAIIIIAAAggggAACySJAHAgggAACCCCAAAIIINCiAiRAWpSfyhFIHQEiRQABBBBAAAEEEEAAAQQQQACB5BcgQgQQQKA1CZAAaU1bg7YggAACCCCAAAIIJJMAsSCAAAIIIIAAAggggAACCLSgAAmQFsRPraqJFgEEEEAAAQQQQAABBBBAAAEEkl+ACBFAAAEEEGg9AiRAWs+2oCUIIIAAAgggkGwCxIMAAggggAACCCCAAAIIIIAAAi0mcMYSIC0WIRUjgAACCCCAAAIIIIAAAggggMAZE6AiBBBAAAEEEECgtQiQAGktW4J2IIAAAggkowAxIYAAAggggAACCCCAAAIIIIBA8gsQYSsVIAHSSjcMzUIAAQQQQAABBBBAAAEEElOAViOAAAIIIIAAAggg0DoESIC0ju1AKxBAIFkFiAsBBBBAAAEEEEAAAQQQQAABBJJfgAgRQKBVCpAAaZWbhUYhgAACCCCAAAIIIJC4ArQcAQQQQAABBBBAAAEEEGgNAiRAWsNWoA3JLEBsCCCAAAIIIIAAAggggAACCCCQ/AJEiAACCCDQCgVIgLTCjUKTEEAAAQQQQACBxBag9QgggAACCCCAAAIIIIAAAgi0vAAJkObeBpSPAAIIIIAAAggggAACCCCAAALJL0CECCCAAAIIINDqBEiAtLpNQoMQQAABBBBIfAEiQAABBBBAAAEEEEAAAQQQQACB5Bdo7RGSAGntW4j2IYAAAggggAACCCCAAAIIJIIAbUQAAQQQQAABBBBoZQIkQFrZBqE5CCCAQHIIEAUCCCCAAAIIIIAAAggggAACCCS/ABEi0LoFSIC07u1D6xBAAAEEEEAAAQQQQCBRBGgnAggggAACCCCAAAIItCoBEiCtanPQGASSR4BIEEAAAQQQQAABBBBAAAEEEEAg+QWIEAEEEGjNAiRAWvPWoW0IIIAAAggggAACiSRAWxFAAAEEEEAAAQQQQAABBFqRAAmQVrQxkqspRIMAAggggAACCCCAAAIIIIAAAskvQIQIIIAAAgi0XgESIK1329AyBBBAAAEEEEg0AdqLAAIIIIAAAggggAACCCCAAAKtRqDZEiCtJkIaggACCCCAAAIIIIAAAggggAACzSZAwQgggAACCCCAQGsVIAHSWrcM7UIAAQQQSEQB2owAAggggAACCCCAAAIIIIAAAskvQIQJIkACJEE2FM1EAAEEEEAAAQQQQAABBFqnAK1CAAEEEEAAAQQQQKB1CpAAaZ3bhVYhgECiCtBuBBBAAAEEEEAAAQQQQAABBBBIfgEiRACBhBAgAZIQm4lGIoAAAggggAACCCDQegVoGQIIIIAAAggggAACCCDQGgVIgLTGrUKbElmAtiOAAAIIIIAAAggggAACCCCAQPILECECCCCAQAIIkABJgI1EExFAAAEEEEAAgdYtQOsQQAABBBBAAAEEEEAAAQQQaH0CJECaeptQHgIIIIAAAggggAACCCCAAAIIJL8AESKAAAIIIIBAqxcgAdLqNxENRAABBBBAoPUL0EIEEEAAAQQQQAABBBBAAAEEEEh+gUSLkARIom0x2osAAggggAACCCCAAAIIINAaBGgDAggggAACCCCAQCsXIAHSyjcQzUMAAQQSQ4BWIoAAAggggAACCCCAAAIIIIBA8gsQIQKJJUACJLG2F61FAAEEEEAAAQQQQACB1iJAOxBAAAEEEEAAAQQQQKBVC5AAadWbh8YhkDgCtBQBBBBAAAEEEEAAAQQQQAABBJJfgAgRQACBRBIgAZJIW4u2IoAAAggggAACCLQmAdqCAAIIIIAAAggggAACCCDQigVIgLTijZNYTaO1CCCAAAIIIIAAAggggAACCCCQ/AJEiAACCCCAQOIIkABJnG1FSxFAAAEEEECgtQnQHgQQQAABBBBAAAEEEEAAAQQQaLUCTZYAabUR0jAEEEAAAQQQQAABBBBAAAEEEGgyAQpCAAEEEEAAAQQSRYAESKJsKdqJAAIIINAaBWgTAggggAACCCCAAAIIIIAAAggkvwARJqgACZAE3XA0GwEEEEAAAQQQQAABBBBoGQFqRQABBBBAAAEEEEAgMQRIgCTGdqKVCCDQWgVoFwIIIIAAAggggAACCCCAAAIIJL8AESKAQEIKkABJyM1GoxFAAAEEEEAAAQQQaDkBakYAAQQQQAABBBBAAAEEEkGABEgibCXa2JoFaBsCCCCAAAIIIIAAAggggAACCCS/ABEigAACCCSgAAmQBNxoNBkBBBBAAAEEEGhZAWpHAAEEEEAAAQQQQAABBBBAoPULkAA53W3E+ggggAACCCCAAAIIIIAAAgggkPwCRIgAAggggAACCSdAAiThNhkNRgABBBBAoOUFaAECCCCAAAIIIIAAAggggAACCCS/QKJHSAIk0bcg7UcAAQQQQAABBBBAAAEEEDgTAtSBAAIIIIAAAgggkGACJEASbIPRXAQQQKB1CNAKBBBAAAEEEEAAAQQQQAABBBBIfgEiRCCxBUiAJPb2o/UIIIAAAggggAACCCBwpgSoBwEEEEAAAQQQQAABBBJKgARIQm0uGotA6xGgJQgggAACCCCAAAIIIIAAAgggkPwCRIgAAggksgAJkETeerQdAQQQQAABBBBA4EwKUBcCCCCAAAIIIIAAAggggEACCZAASaCN1bqaSmsQQAABBBBAAAEEEEAAAQQQQCD5BYgQAQQQQACBxBUgAZK4246WI4AAAggggMCZFqA+BBBAAAEEEEAAAQQQQAABBBBIGIFTToAkTIQ0FAEEEEAAAQQQQAABBBBAAAEETlmAFRFAAAEEEEAAgUQVIAGSqFuOdiOAAAIItIQAdSKAAAIIIIAAAggggAACCCCAQPILEGGSCJAASZINSRgIIIAAAggggAACCCCAQPMIUCoCCCCAAAIIIIAAAokpQAIkMbcbrUYAgZYSoF4EEEAAAQQQQAABBBBAAAEEEEh+ASJEAIGkECABkhSbkSAQQAABBBBAAAEEEGg+AUpGAAEEEEAAAQQQQAABBBJRgARIIm412tySAtSNAAIIIIAAAggggAACCCCAAALJL0CECCCAAAJJIEACJAk2IiEggAACCCCAAALNK0DpCCCAAAIIIIAAAggggAACCCSeAAmQk91mLI8AAggggAACCCCAAAIIIIAAAskvQIQIIIAAAgggkPACJEASfhMSAAIIIIAAAs0vQA0IIIAAAggggAACCCCAAAIIIJD8AskWIQmQZNuixIMAAggggAACCCCAAAIIINAUApSBAAIIIIAAAgggkOACJEASfAPSfAQQQODMCFALAggggAACCCCAAAIIIIAAAggkvwARIpBcAiRAkmt7Eg0CCCCAAAIIIIAAAgg0lQDlIIAAAggggAACCCCAQEILkABJ6M1H4xE4cwLUhAACCCCAAAIIIIAAAggggAACyS9AhAgggEAyCZAASaatSSwIIIAAAggggAACTSlAWQgggAACCCCAAAIIIIAAAgksQAIkgTfemW06tSGAAAIIIIAAAggggAACCCCAQPILECECCCCAAALJI0ACJHm2JZEggAACCCCAQFMLUB4CCCCAAAIIIIAAAggggAACCCSswAknQBI2QhqOAAIIIIAAAggggAACCCCAAAInLMCCCCCAAAIIIIBAsgiQAEmWLUkcCCCAAALNIUCZCCCAAAIIIIAAAggggAACCCCQ/AJEmKQCJECSdMMSFgIIIIAAAggggAACCCBwagKshQACCCCAAAIIIIBAcgiQAEmO7UgUCCDQXAKUiwACCCCAAAIIIIAAAggggAACyS9AhAggkJQCJECScrMSFAIIIIAAAggggAACpy7AmggggAACCCCAAAIIIIBAMgiQAEmGrUgMzSlA2QgggAACCCCAAAIIIIAAAgggkPwCRIgAAgggkIQCJECScKMSEgIIIIAAAgggcHoCrI0AAggggAACCCCAAAIIIIBA4guQAHmzbcjzCCCAAAIIIIAAAggggAACCCCQ/AJEiAACCCCAAAJJJ0ACJOk2KQEhgAACCCBw+gKUgAACCCCAAAIIIIAAAggggAACyS+Q7BGSAEn2LUx8CCCAAAIIIIAAAggggAACJyLAMggggAACCCCAAAJJJkACJMk2KOEggAACTSNAKQgggAACCCCAAAIIIIAAAgggkPwCRIhAcguQAEnu7Ut0CCCAAAIIIIAAAgggcKICLIcAAggggAACCCCAAAJJJUACJKk2J8Eg0HQClIQAAggggAACCCCAAAIIIIAAAskvQIQIIIBAMguQAEnmrUtsCCCAAAIIIIAAAicjwLIIIIAAAggggAACCCCAAAJJJEACJIk2ZtOGQmkIIIAAAggggAACCCCAAAIIIJD8AkSIAAIIIIBA8gqQAEnebUtkCCCAAAIIIHCyAiyPAAIIIIAAAggggAACCCCAAAJJI3DMBEjSREggCCCAAAIIIIAAAggggAACCCBwTAGeQAABBBBAAAEEklWABEiyblniQgABBBA4FQHWQQABBBBAAAEEEEAAAQQQQACB5BcgwhQR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AQkJECBAgACBTgkoQDq13cISIECAAIEXBHxEgAABAgQIECBAgAABAgQI5C/Q5YQKkC7vvuwECBAgQIAAAQIECBDoloC0BAgQIECAAAECHRJQgHRos0UlQIDA4QI+I0CAAAECBAgQIECAAAECBPIXkJBAdwUUIN3de8kJECBAgAABAgQIdE9AYgIECBAgQIAAAQIEOiOgAOnMVgtK4GgBrxAgQIAAAQIECBAgQIAAAQL5C0hIgACBrgooQLq683ITIECAAAECBLopIDUBAgQIECBAgAABAgQIdERAAdKRjV44plcJECBAgAABAgQIECBAgACB/AUkJECAAAEC3RRQgHRz36UmQIAAAQLdFZCcAAECBAgQIECAAAECBAgQyF8gJVSAJAR/CBAgQIAAAQIECBAgQIBAzgKyESBAgAABAgS6KKAA6eKuy0yAAIFuC0hPgAABAgQIECBAgAABAgQI5C8gIYFQgLgJCBAgQIAAAQIECBAgkL2AgAQIECBAgAABAgS6J6AA6d6eS0yAAAECBAgQIECAAAECBAgQIEAgfwEJCRDovIACpPO3AAACBAgQIECAAIEuCMhIgAABAgQIECBAgACBrgkoQLq24/KWAp4ECBAgQIAAAQIECBAgQIBA/gISEiBAgEDHBRQgHb8BxCdAgAABAgS6IiAnAQIECBAgQIAAAQIECBDolkA3C5Bu7bG0BAgQIECAAAECBAgQIECgmwJSEyBAgAABAp0WUIB0evuFJ0CAAIEuCchKgAABAgQIECBAgAABAgQI5C8g4QsCCpAXLHxEgAABAgQIECBAgAABAnkJSEOAAAECBAgQINBhAQVIhzdfdAIEuiYgLwECBAgQIECAAAECBAgQIJC/gIQECBwQUIAckPCeAAECBAgQIECAAIH8BCQiQIAAAQIECBAgQKCzAgqQzm694F0UkJkAAQIECBAgQIAAAQIECBDIX0BCAgQIENgnoADZ5+AtAQIECBAgQIBAngJSESBAgAABAgQIECBAgEBHBRQgndp4YQkQIECAAAECBAgQIECAAIH8BSQkQIAAAQIESgEFSKngSYAAAQIECOQrIBkBAgQIECBAgAABAgQIECCQv8ACCRUgC6B4iQABAgQIECBAgAABAgQItFnA2gkQIECAAAECBCIUIO4CAgQIEMhdQD4CBAgQIECAAAECBAgQIEAgfwEJCRwloAA5isQLBAgQIECAAAECBAgQaLuA9RMgQIAAAQIECBAgoABxDxAgkL+AhAQIECBAgAABAgQIECBAgED+AhISIEDgCAEFyBEgPiVAgAABAgQIECCQg4AMBAgQIECAAAECBAgQ6LqAAqTrd0A38ktJgAABAgQIECBAgAABAgQI5C8gIQECBAgQOExAAXIYh08IECBAgAABArkIyEGAAAECBAgQIECAAAECBLot0I0CpNt7LD0BAgQIECBAgAABAgQIEOiGgJQECBAgQIAAgUMEFCCHYPiQAAECBAjkJCALAQIECBAgQIAAAQIECBAgkL+AhIsLKEAWt3GEAAECBAgQIECAAAECBNolYLUECBAgQIAAAQIEDgooQA5S+IAAAQK5CchDgAABAgQIECBAgAABAgQI5C8gIQECiwkoQBaT8ToBAgQIECBAgAABAu0TsGICBAgQIECAAAECBAjsF1CA7IfwjkCOAjIRIECAAAECBAgQIECAAAEC+QtISIAAAQILCyhAFnbxKgECBAgQIECAQDsFrJoAAQIECBAgQIAAAQIECPQFFCB9hlzfyEWAAAECBAgQIECAAAECBAjkLyAhAQIECBAgsJCAAmQhFa8RIECAAAEC7RWwcgIECBAgQIAAAQIECBAgQCB/gQESKkAGQHIKAQIECBAgQIAAAQIECBCYZgFrI0CAAAECBAgQOFpAAXK0iVcIECBAoN0CVk+AAAECBAgQIECAAAECBAjkLyAhgWUFFCDLEjmBAAECBAgQIECAAAEC0y5gfQQIECBAgAABAgQIHCmgADlSxOcECLRfQAICBAgQIECAAAECBAgQIEAgfwEJCRAgsIyAAmQZIIcJECBAgAABAgQItEHAGgkQIECAAAECBAgQIEDgcAEFyOEePstDQAoCBAgQIECAAAECBAgQIEAgfwEJCRAgQIDAkgIKkCV5HCRAgAABAgQItEXAOgkQIECAAAECBAgQIECAAIFDBfIsQA5N6GMCBAgQIECAAAECBAgQIEAgTwGpCBAgQIAAAQJLCChAlsBxiAABAgQItEnAWgkQIECAAAECBAgQIECAAIH8BSQcXEABMriVMwkQIECAAAECBAgQIEBgugSshgABAgQIECBAgMCiAgqQRWkcIECAQNsErJcAAQIECBAgQIAAAQIECBDIX0BCAgQGFVCADCrlPAIECBAgQIAAAQIEpk/AiggQIECAAAECBAgQILCIgAJkERgvE2ijgDUTIECAAAECBAgQIECAAAEC+QtISIAAAQKDCShABnNyFgECBAgQIECAwHQKWBUBAgQIECBAgAABAgQIEFhQQAGyIEtbX7RuAgQIECBAgAABAgQIECBAIH8BCQkQIECAAIFBBBQggyg5hwABAgQIEJheASsjQIAAAQIECBAgQIAAAQIE8hcYIaECZAQ0lxAgQIAAAQIECBAgQIAAgUkKmJsAAQIECBAgQGB5AQXI8kbOIECAAIHpFrA6AgQIECBAgAABAgQIECBAIH8BCQkMLaAAGZrMBQQIECBAgAABAgQIEJi0gPkJECBAgAABAgQIEFhOQAGynJDjBAhMv4AVEiBAgAABAgQIECBAgAABAvkLSEiAAIEhBRQgQ4I5nQABAgQIECBAgMA0CFgDAQIECBAgQIAAAQIECCwtoABZ2sfRdghYJQECBAgQIECAAAECBAgQIJC/gIQECBAgQGAoAQXIUFxOJkCAAAECBAhMi4B1ECBAgAABAgQIECBAgAABAksJ5FGALJXQMQIECBAgQIAAAQIECBAgQCAPASkIECBAgAABAkMIKECGwHIqAQIECBCYJgFrIUCAAAECBAgQIECAAAECBPIXkHB0AQXI6HauJECAAAECBAgQIECAAIFmBcxGgAABAgQIECBAYGABBcjAVE4kQIDAtAlYDwECBAgQIECAAAECBAgQIJC/gIQECIwqoAAZVc51BAgQIECAAAECBAg0L2BGAgQIECBAgAABAgQIDCigABkQymkEplHAmggQIECAAAECBAgQIECAAIH8BSQkQIAAgdEEFCCjubmKAAECBAgQIEBgMgJmJUCAAAECBAgQIECAAAECAwkoQAZimtaTrIsAAQIECBAgQIAAAQIECBDIX0BCAgQIECBAYBQBBcgoaq4hQIAAAQIEJidgZgIECBAgQIAAAQIECBAgQCB/gQoSKkAqQDQEAQIECBAgQIAAAQIECBCoU8DYBAgQIECAAAECwwsoQIY3cwUBAgQITFbA7AQIECBAgAABAgQIECBAgED+AhISGFtAATI2oQEIECBAgAABAgQIECBQt4DxCRAgQIAAAQIECBAYVkABMqyY8wkQmLyAFRAgQIAAAQIECBAgQIAAAQL5C0hIgACBMQUUIGMCupwAAQIECBAgQIBAEwLmIECAAAECBAgQIECAAIHhBBQgw3k5ezoErIIAAQIECBAgQIAAAQIECBDIX0BCAgQIECAwloACZCw+FxMgQIAAAQIEmhIwDwECBAgQIECAAAECBAgQIDCMQDsLkGESOpcAAQIECBAgQIAAAQIECBBop4BVEyBAgAABAgTGEFCAjIHnUgIECBAg0KSAuQgQIECAAAECBAgQIECAAIH8BSSsTkABUp2lkQgQIECAAAECBAgQIECgWgGjESBAgAABAgQIEBhZQAEyMp0LCRAg0LSA+QgQIECAAAECBAgQIECAAIH8BSQkQKAqAQVIVZLGIUCAAAECBAgQIECgegEjEiBAgAABAgQIECBAYEQBBciIcC4jMAkBcxIgQIAAAQIECBAgQIAAAQL5C0hIgAABAtUIKECqcTQKAQIECBAgQIBAPQJGJUCAAAECBAgQIECAAAECIwkoQEZim9RF5iVAgAABAgQIECBAgAABAgTyF5CQAAECBAgQqEJAAVKFojEIECBAgACB+gSMTIAAAQIECBAgQIAAAQIECOQvUENCBUgNqIYkQIAAAQIECBAgQIAAAQLjCLiWAAECBAgQIEBgfAEFyPiGRiBAgACBegWMToAAAQIECBAgQIAAAQIECOQvICGBygUUIJWTGpAAAQIECBAgQIAAAQLjCrieAAECBAgQIECAAIFxBRQg4wq6ngCB+gXMQIAAAQIECBAgQIAAAQIECOQvICEBAgQqFlCAVAxqOAIECBAgQIAAAQJVCBiDAAECBAgQIECAAAECBMYTUICM5+fqZgTMQoAAAQIECBAgQIAAAQIECOQvICEBAgQIEKhUQAFSKafBCBAgQIAAAQJVCRiHAAECBAgQIECAAAECBAgQGEegHQXIOAldS4AAAQIECBAgQIAAAQIECLRDwCoJECBAgAABAhUKKEAqxDQUAQIECBCoUsBYBAgQIECAAAECBAgQIECAQP4CEtYnoACpz9bIBAgQIECAAAECBAgQIDCcgLMJECBAgAABAgQIVCagAKmM0kAECBCoWsB4BAgQIECAAAECBAgQIECAQP4CEhIgUJeAAqQuWeMSIECAAAECBAgQIDC8gCsIECBAgAABAgQIECBQkYACpCJIwxCoQ8CYBAgQIECAAAECBAgQIECAQP4CEhIgQIBAPQIKkHpcjUqAAAECBAgQIDCagKsIECBAgAABAgQIECBAgJBzFQAAAAU+SURBVEAlAgqQShjrGsS4BAgQIECAAAECBAgQIECAQP4CEhIgQIAAAQJ1CChA6lA1JgECBAgQIDC6gCsJECBAgAABAgQIECBAgACB/AUaSKgAaQDZFAQIECBAgAABAgQIECBAYCkBxwgQIECAAAECBKoXUIBUb2pEAgQIEBhPwNUECBAgQIAAAQIECBAgQIBA/gISEqhdQAFSO7EJCBAgQIAAAQIECBAgsJyA4wQIECBAgAABAgQIVC2gAKla1HgECIwvYAQCBAgQIECAAAECBAgQIEAgfwEJCRAgULOAAqRmYMMTIECAAAECBAgQGETAOQQIECBAgAABAgQIECBQrYACpFpPo1UjYBQCBAgQIECAAAECBAgQIEAgfwEJCRAgQIBArQIKkFp5DU6AAAECBAgQGFTAeQQIECBAgAABAgQIECBAgECVAtNZgFSZ0FgECBAgQIAAAQIECBAgQIDAdApYFQECBAgQIECgRgEFSI24hiZAgAABAsMIOJcAAQIECBAgQIAAAQIECBDIX0DC5gQUIM1Zm4kAAQIECBAgQIAAAQIEDhfwGQECBAgQIECAAIHaBBQgtdEamAABAsMKOJ8AAQIECBAgQIAAAQIECBDIX0BCAgSaElCANCVtHgIECBAgQIAAAQIEjhbwCgECBAgQIECAAAECBGoSUIDUBGtYAqMIuIYAAQIECBAgQIAAAQIECBDIX0BCAgQIEGhGQAHSjLNZCBAgQIAAAQIEFhbwKgECBAgQIECAAAECBAgQqEVAAVIL66iDuo4AAQIECBAgQIAAAQIECBDIX0BCAgQIECBAoAkBBUgTyuYgQIAAAQIEFhdwhAABAgQIECBAgAABAgQIEMhfYAIJFSATQDclAQIECBAgQIAAAQIECHRbQHoCBAgQIECAAIH6BRQg9RubgQABAgSWFnCUAAECBAgQIECAAAECBAgQyF9AQgKNCyhAGic3IQECBAgQIECAAAECBAgQIECAAAECBAgQIFC3gAKkbmHjEyCwvIAzCBAgQIAAAQIECBAgQIAAgfwFJCRAgEDDAgqQhsFNR4AAAQIECBAgQKAU8CRAgAABAgQIECBAgACBegUUIPX6Gn0wAWcRIECAAAECBAgQIECAAAEC+QtISIAAAQIEGhVQgDTKbTICBAgQIECAwAEB7wkQIECAAAECBAgQIECAAIE6BaajAKkzobEJECBAgAABAgQIECBAgACB6RCwCgIECBAgQIBAgwIKkAaxTUWAAAECBA4V8DEBAgQIECBAgAABAgQIECCQv4CEkxNQgEzO3swECBAgQIAAAQIECBDomoC8BAgQIECAAAECBBoTUIA0Rm0iAgQIHCngcwIECBAgQIAAAQIECBAgQCB/AQkJEJiUgAJkUvLmJUCAAAECBAgQINBFAZkJECBAgAABAgQIECDQkIACpCFo0xBYSMBrBAgQIECAAAECBAgQIECAQP4CEhIgQIDAZAQUIJNxNysBAgQIECBAoKsCchMgQIAAAQIECBAgQIAAgUYEFCCNMC82idcJECBAgAABAgQIECBAgACB/AUkJECAAAECBCYhoACZhLo5CRAgQIBAlwVkJ0CAAAECBAgQIECAAAECBPIXmIKECpAp2ARLIECAAAECBAgQIECAAIG8BaQjQIAAAQIECBBoXkAB0ry5GQkQINB1AfkJECBAgAABAgQIECBAgACB/AUkJDBxgV5RFF8tPBm4B9wD7gH3gHvAPeAecA+4B9wD7oEa74HC2O4v94B7wD3gHnAPuAfcA+4B90DD98D3AAAA//8sIF7lAAAABklEQVQDAKcS+JRSewEkAAAAAElFTkSuQmCC" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAAOcCAYAAAAWyH1UAAAQAElEQVR4AeydBYBdxd3Fzzx/6xL3hAQIEgKEYMH1Q4O2WHH34hRtkVLcKU6Lu0NxCO4QJCQQYiQhti7PvzmzuZuXZeObzcp53Xn33rmjv/m/m/I/d2Z8OTk5GQUxkA3IBmQDsgHZgGxANiAbkA3IBmQDsgHZQIe2Af23v/wfsgHZgGxANiAbkA10OhvwQR8REAEREAER6HQE1GEREAEREAEREAEREAEREAEREAEREIGOT0A97OwEJIB0dgtQ/0VABERABERABERABERABDoHAfVSBERABERABERABERABDoZAQkgnWzA1V0REIEGAvoWAREQAREQAREQAREQAREQAREQARHo+ATUQxEQgc5NQAJI5x5/9V4EREAEREAEREAERKDzEFBPRUAEREAEREAEREAEREAERKBTEZAA0qmGW51dQEBnIiACIiACIiACIiACIiACIiACIiACHZ+AeigCIiACItCZCUgA6cyjr76LgAiIgAiIgAh0LgLqrQiIgAiIgAiIgAiIgAiIgAiIgAh0IgKdVgDpRGOsroqACIiACIiACIiACIiACIiACIhApyWgjouACIiACIiACHReAhJAOu/Yq+ciIAIiIAKdj4B6LAIiIAIiIAIiIAIiIAIiIAIiIAIi0PEJqIfzCUgAmQ9CBxEQAREQAREQAREQAREQAREQgY5IQH0SAREQAREQAREQARHorAQkgHTWkVe/RUAEOicB9VoEREAEREAEREAEREAEREAEREAERKDjE1APRUAEHAEJIA6DvkRABERABERABERABERABDoqAfVLBERABERABERABERABESgcxKQANI5x1297rwE1HMREAEREAEREAEREAEREAEREAEREIGOT0A9FAEREAERsAQkgFgI+hMBERABERABERABEejIBNQ3ERABERABERABERABERABERCBzkhAAkhnG3X1VwREQAREQAREQAREQAREQAREQAREoOMTUA9FQAREQAREQAQgAURGIAIiIAIiIAIi0OEJqIMiIAIiIAIiIAIiIAIiIAIiIAIiIAIdn0DTHkoAaUpE1yIgAiIgAiIgAiIgAiIgAiIgAiLQ/gmoByIgAiIgAiIgAiLQ6QlIAOn0JiAAIiACItAZCKiPIiACIiACIiACIiACIiACIiACIiACHZ+AeigCCxOQALIwD12JgAiIgAiIgAiIgAiIgAiIQMcgoF6IgAiIgAiIgAiIgAi0GQKZTAapVAqJRALxeBz19fWoq6tzx1gs5uKSySTS6XSbaXNHaIgEkI4wiuqDCIjAEgkogQiIgAiIgAiIgAiIgAiIgAiIgAiIQMcnoB6KQFsiQNGjtrYWDBQ7KHRQAPGEDt6n4EFhhHGeMML0DIxrS/1pj22RANIeR01tFgEREAEREAEREAEREIElE1AKERABERABERABERABERCBViZA0YLiBQNFj5KSLth99z1w4QUX4pFHHsV7747Bd999j8mTpmDG9JmYOmU6xv/0Mz795DM8/9wLuPGGm3DEEUdjyOA13awQlsNA8YSCSSt3p91XJwGk3Q+hOrB0BJRKBERABERABERABERABERABERABESg4xNQD0VABERg1RCgOEGhgrM4Rm40En/96xl4+umn8eabr+Guu/6NvfbbDTHfLHz96+t448sH8NzHN+G1727GT7PvxtTKR/Hlzy9h6tzvsc6IPrj62kvw8ivP44033sANVhDZbbc93PJZFFS4dNaq6WH7rFUCSPscN7VaBERABERABERABJZMQClEQAREQAREQAREQAREQAREQARWOgEKHxQndthhRzz6yKO49757ccKJx2LQ6n3xwpv34Pwr/w9X3LQVHn3tFDwz5u947J1/4en3r8F7X12PHyffja/G34HHP7wEsei9KOx2F6rjZ2BO3Q3oP6QO++63PW668Rq8/tobOPfc89weIayPgstK71gHqKDTCCAdYKzUBREQAREQAREQAREQAREQAREQAREQgSUQ0G0REAEREAERaC0C3L+DYgTru/32O3DLLTdjk81GYNbcSXjqldtwxd074scpL6EuUYU0ipGX0xX50SLk50RQkJOPbkWroSC3O/LzuuGCw0fj0N12xdr910FRfgm695iCeXUX4NPxo/HL7JfQo38OjjvhSLz//gdYf/gGoODCZbFYt8KiCUgAWTQb3REBERABERCB9k5A7RcBERABERABERABERABERABERABEVgJBCh8cDmqnXbcCZ9//jl23XUn/PTz13jk2Zvx+scP4PeKccgJD0QgkAsTMgjmAv5oGr5QBqGID74AkDYJpNJ16NXTjzUGFyEaDMEggLraFH79IYWKsmLUplN4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QAREQAREQAREQAREQAREoOMTUA9FQAREoO0RCIfDbrbFjz98jxEjNsSb736IAUNHYoc/n4deQ3dCyvgRDkeQk5uPcCgKvz+AhNvvIwaTScHY/7k/K3IYXwDJWC1qK2Zj3m/jMW/mr26Whz9SCF8gHzB+xGrjKKuqR6TLYAxad3N8M/ZHnP+3v+HCCy5AIBAAxQ/o0ywBCSDNYlGkCIiACIiACIiACLRBAmqSCIiACIiACIiACIiACIiACIhAmyBgjGkUHjgL4+KL/46vxv6EDbbcC7scdhVKBo5CPG2QSKeQSMTBTdT9wQAC4ajVPlKI11cjnUggFY8jk8kgk06ivmYe/IEwwoU9EEv5UVefwJyKGPJ6roV+a43C7Mo47r7vfmy33XZ48oknEIlEXLltAkgbbUS7FUDaKE81SwREQAREQAREQAREQAREQAREQAREoAUJqCgREAEREAERaMsEOPuC4sYDD9yPvUbviWOPOwH/e/N99FxjM2x34CXotc6u6LH6loh0GYJkoBhxX64VRgLIWBkkXl+DyrJZKJs7G+WV9UjnDkS0+zAU9x+BYMla6Lr6VhgwbAd8/eMkXHzJP7D1VtvgrDPPhDHGiS8+n9z7S7INEVoSId0XAREQAREQgbZDQC0RAREQAREQAREQAREQAREQAREQARFoYwS8ZagohLz88ks45pijscUWW+Kc8y7AhGnzgIIBCHdfD/l9NkJ3K2oM3GB3rLnZn7H21odg+I5HY93tjsTqWx6KvhvujWivEYgFeuC3uTHcc9+DOPCgg7DnHnvg3/++A7W11W7prWg02sYItN3m+Npu09QyERABERABERABERABERABERABERABERABERABERABEWgfBDwhhAJFVVUl7rv3HhxsBYwNN9wQfz3jLPznkafwwqvv4JW3PsJr73yKN977Am99+C3e+ug7vD7mSzz53Gu4+vqbsccee2L33XbF3/9+KT54/323zBVnmjAYY9oHjDbSSgkgbWQg1AwREAERWCoCSvagCrsAABAASURBVCQCIiACIiACIiACIiACIiACIiACItDxCaiH7ZqAMQ1LVFGwCIfD4FJVb7/9Fm684XqcddaZOPKIw7Hffvtizz33wN57jcZBBx6Ak086EVdcfhkefeRhTJz4ixM9KKSwDAor7RrIKmy8BJBVCF9Vi4AIiIAIiIAIiIAIiIAILJmAUoiACIiACIiACIiACIhAeyXg9/sRiUTcnh0UMyhqLCrwvhcoehij2R4rOu4SQFaUoPKLQOsSUG0iIAIiIAIiIAIiIAIiIAIiIAIiIAIdn4B6KAIi0EEJGGNgTPOhg3Z5lXZLAsgqxa/KRUAEREAEREAEREAElkxAKURABERABERABERABERABERABERg2QlIAFl2Zqs2h2oXAREQAREQAREQAREQAREQAREQARHo+ATUQxEQAREQAREQgRUmIAFkhRGqABEQAREQAREQgZVNQOWLgAiIgAiIgAiIgAiIgAiIgAiIgAh0fAIt3UMJIC1NVOWJgAiIgAiIgAiIgAiIgAiIgAiIwIoTUAkiIAIiIAIiIAIiIAIrSEACyAoCVHYREAEREIHWIKA6REAEREAEREAEREAEREAEREAEREAEOj4B9VAEWpaABJCW5anSREAEREAEREAEREAEREAERKBlCKgUERABERABERABERABERCBFSIgAWSF8CmzCIhAaxFQPSIgAiIgAiIgAiIgAiIgAiIgAiIgAh2fgHooAiIgAi1JQAJIS9JUWSIgAiIgAiIgAiIgAiLQcgRUkgiIgAiIgAiIgAiIgAiIgAiIwAoQkACyAvCUtTUJqC4REAEREAEREAEREAEREAEREAEREIGOT0A9FAEREAEREIGWIyABpOVYqiQREAEREAEREAERaFkCKk0EREAEREAEREAEREAEREAEREAERGC5CbQbAWS5e6iMIiACIiACIiACIiACIiACIiACIiAC7YaAGioCIiACIiACIiACLUVAAkhLkVQ5IiACIiACItDyBFSiCIiACIiACIiACIiACIiACIiACIhAxyegHq4kAhJAVhJYFSsCIiACIiACIiACIiACIiACIrA8BJRHBERABERABERABERABFqGgASQluGoUkRABERg5RBQqSIgAiIgAiIgAiIgAiIgAiIgAiIgAh2fgHooAiKwUghIAFkpWFWoCIiACIiACIiACIiACIjA8hJQPhEQAREQAREQAREQAREQARFoCQISQFqCosoQgZVHQCWLgAiIgAiIgAiIgAiIgAiIgAiIgAh0fALqoQiIgAiIwEog4EunU1AQA9mAbEA2IBuQDcgGZAOygbZjAxoLjYVsQDYgG5ANyAZkA7IB2YBsQDYgG5ANrLgN+PILS6DQhhlofGSfsgHZgGxANiAbkA3IBmQDsgHZgGxANiAb6Pg2oDHWGMsGZAOyAdmAbKDFbcA3bOS2UBAD2YBsQDYgG5ANyAbakg2oLbJH2YBsQDYgG5ANyAZkA7IB2YBsQDYgG5ANdHwbWNlj7Ivm5EFBDGQDsgHZgGxANiAbkA3IBmQDsgHZgGxANrBKbUD/bS7/hGxANiAbkA3IBmQDsoEWtgFfedkcKIiBbEA2IBuQDbQtG9B4aDxkA7IB2YBsQDYgG5ANyAZkA7IB2YBsQDbQ8W1AY6wxXrk24Hv/taegIAayAdmAbEA2IBuQDcgGZAOyAdmAbGAV24D+20z/bSobkA3IBmQDsgHZgGxANiAbaFEb8OXk5EBBDGQDsoG2ZgNqj2xSNiAbkA3IBmQDsgHZgGxANiAbkA3IBmQDHd8GNMYaY9mAbGBl2oAP+oiACIiACIiACIiACIiACLQFAmqDCIiACIiACIiACIiACIiACIhACxKQANKCMFVUSxJQWSIgAiIgAiIgAiIgAiIgAiIgAiIgAh2fgHooAiIgAiIgAiuPgASQlcdWJYuACIiACIiACIjAshFQahEQAREQAREQAREQAREQAREQAREQgRYj0GYFkBbroQoSAREQAREQAREQAREQAREQAREQARFoswTUMBEQAREQAREQARFYWQQkgKwssipXBERABERABJadgHKIgAiIgAiIgAiIgAiIgAiIgAiIgAh0fALqYSsRkADSSqBVjQiIgAiIgAiIgAiIgAiIgAiIQHMEFCcCIiACIiACIiACIiACK4eABJCVw1WlioAIiMDyEVAuERABERABERABERABERABERABERCBjk9APRQBEWgVAhJAWgWzKhEBERABERABERABERABEVgUAcWLgAiIgAiIgAiIgAiIgAiIwMogIAFkZVBVmSKw/ASUUwREQAREQAREQAREQAREQAREQAREoOMTUA9FQAREQARagYAEkFaArCpEQAREQAREQAREQAQWR0D3REAEREAEREAEREAEREAEREAERKDlCUgAaXmmK1aicouACIiACIiACIiACIiACIiACIiACHR8AuqhCIiACIiACIjASicgAWSlI1YFIiACIiACIiACSyKg+yIgAiIgAiIgAiIgAiIgAiIgAiIgAh2fQGv3UAJIaxNXfSIgAiIgAiIgAiIgAiIgAiIgAiIAiIEIiIAIiIAIiIAIiMBKJiABZCUDVvEiIAIiIAJLQ0BpREAEREAEREAEREAEREAEREAEREAEOj4B9VAEWpeABJDW5a3aREAEREAEREAEREAEREAERKCBgL5FQAREQAREQAREQAREQARWKgEJICsVrwoXARFYWgJKJwIiIAIiIAIiIAIiIAIiIAIiIAIi0PEJqIciIAIi0JoEJIC0Jm3VJQIiIAIiIAIiIAIiIAILCOhMBERABERABERABERABERABERgJRKQALIS4aroZSGgtCIgAiIgAiIgAiIgAiIgAiIgAiIgAh2fgHooAiIgAiIgAq1HQAJI67FWTSIgAiIgAiIgAiKwMAFdiYAIiIAIiIAIiIAIiIAIiIAIiIAIrDQCbUYAWWk9VMEiIAIiIAIiIAIiIAIiIAIiIAIiIAJthoAaIgIiIAIiIAIiIAKtRUACSGuRVj0iIAIiIAIi8EcCihEBERABERABERABERABERABERABEej4BNTDVURAAsgqAq9qRUAEREAEREAEREAEREAERKBzElCvRUAEREAEREAEREAERKB1CEgAaR3OqkUEREAEmiegWBEQAREQAREQAREQAREQAREQAREQgY5PQD0UARFYJQQkgKwS7KpUBERABERABERABERABDovAfVcBERABERABERABERABERABFqDgASQ1qCsOkRg0QR0RwREQAREQAREQAREQAREQAREQAREoOMTUA9FQAREQARWAQEJIKsAuqoUAREQAREQAREQgc5NQL0XAREQAREQAREQAREQAREQAREQgZVPQALIyme8+Bp0VwREQAREQAREQAREQAREQAREQAREoOMTUA9FQAREQAREQARanYAEkFZHrgpFQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREoOMTWNU9lACyqkdA9YuACIiACIiACIiACIiACIiACHQGAuqjCIiACIiACIiACIhAKxOQANLKwFWdCIiACIgACSiIgAiIgAiIgAiIgAiIgAiIgAiIgAh0fALqoQisWgISQFYtf9UuAiIgAiIgAiIgAiIgAiLQWQionyIgAiIgAiIgAiIgAiIgAq1KQAJIq+JWZSIgAh4BHUVABERABERABERABERABERABERABDo+AfVQBERABFYlAQkgq5K+6hYBERABERABERABEehMBNRXERABERABERABERABERABERCBViQgAaQVYauqbAI6FwEREAEREAEREAEREAEREAEREAER6PgE1EMREAEREAERWHUEJICsOvaqWQREQAREQAREoLMRUH9FQAREQAREQAREQAREQAREQAREQARajcAqE0BarYeqSAREQAREQAREQAREQAREQAREQAREYJURUMUiIAIiIAIiIAIisKoISABZVeRVrwiIgAiIQGckoD6LgAiIgAiIgAiIgAiIgAiIgAiIgAh0fALqYRshIAGkjQyEmiECIiACIiACIiACIiACIiACHZOAeiUCIiACIiACIiACIiACq4aABJBVw121ioAIdFYC6rcIiIAIiIAIiIAIiIAIiIAIiIAIiEDHJ6AeioAItAkCEkDaxDCoESIgAiIgAiIgAiIgAiLQcQmoZyIgAiIgAiIgAiIgAiIgAiKwKghIAFkV1FVnZyagvouACIiACIiACIiACIiACIiACIiACHR8AuqhCIiACIhAGyAgAaQNDIKaIAIiIAIiIAIiIAIdm4B6JwIiIAIiIAIiIAIiIAIiIAIiIAKtT0ACSGszV30iIAIiIAIiIAIiIAIiIAIiIAIiIAIdn4B6KAIiIAIiIAIisMoJSABZ5UOgBoiACIiACIhAxyegHoqACIiACIiACIiACIiACIiACIiACHR8Am2thxJA2tqIqD0iIAIiIAIiIAIiIAIiIAIiIAIdgYD6IAIiIAIiIAIiIAIisIoJSABZxQOg6kVABESgcxBQL0VABERABERABERABERABERABERABDo+AfVQBNoWAQkgbWs81BoREAEREAEREAEREAEREIGOQkD9EAEREAEREAEREAEREAERWKUEJICsUvyqXAQ6DwH1VAREQAREQAREQAREQAREQAREQAREoOMTQMb2sTYN1CZtiNsQU6gVA4hBk98Bfxv8jdjfCn8z9mejv5VDQALIyuGqUkVABERABERABERABERABERABERABERABESg8xCgE7c+DVOXRHrNfMSPGID4JesgftkwBTGQDTS1gUvtb+O4Qfa3UgCf/c2AoiF/Q53nidFqPZUA0mqoO3tF6r8IiIAIiIAIiIAIiIAIiIAIiIAIiEDHJ6AedkoCKeu5rbPiR0EEtRcMReycNZDcpjuSaxQiObhAQQxkA01tgL+NUV0RO3sI6i5eC5n1CgH7G0KqUz5BVmqnJYCsVLwqXAREQAREQAREoFMTUOdFQAREQAREQAREQAREoKMToMPW70dqr56ouW4dZIYVIROxLke/ATJWGEkrQAwgBs38DnwGmaj97axdiPpThiC5dy8gZh8YaRv012IE7NOoxcpabEG6KQIiIAIiIAIiIAIiIAIiIAIiIAIi0PEJqIciIAKdiID16SKWQXr7Lohv3wOIWldj0kbav05EQV0VgeUnwN+K/c1kcv2I79gD6b27A/VWAWH88peqnFkE7FMp60qnIiACIiACIiACLUlAZYmACIiACIiACIiACIiACIhAxyWQsOJH9xDiI0uRKQnBbYDecXurnonA4gis2D3OEioKIr5ZF6SH5sIth7ViJSr3fAISQOaD0EEEREAEREAEREAEREAEREAERKAlCKgMERABERCBTkMgmQFGFCG9ep4VP+x5p+m4OioCK4GAFUHSfXOQ2bF7Q+H6STVwWMFvCSArCFDZRUAERGCxBHRTBERABERABERABER2CYQIAAAQAElEQVRABERABERABDosgQzi6xZZ8aPDdnDpO6aUItASBKzoEe8aRaZPGEjYi5Yos5OXIQGkkxuAui8CIiACIiACIiACIiACLU1A5YmACIiACIiACHQCAs43m0a6XxRId4L+qosi0BoEMhlkSkNAtyDAGVatUWcHr0MCSAcfYHVvlRNQA0RABERABERABERABERABERABERABDo+gU7aQ6uC5AZs3+3RfutPBESgBQhE/EBYbvsWIOmKEEmHQV8iIAIiIAIiIAIiIAItR0AliYAIiIAIiIAIiIAIiIAIiIAILDcBs9w5lbEJAQkgTYC0+OX8AjOZDOrr61FbW7vcIRaLIZVKgWXNL7bDHdi/5hgxvsN1tgU6lEwml9ueyJk2mUgkkE5rruqKDAf5kWfTQLYrUq7yioAIiIAIiIAIiIAIiIAItCMCaqoIiIAIiIAIiECbIyABpBWGhIKFMQa9e/fGaquthkGDBi116N+/P3r27ImCggInflAEqaurc05vOr9bofmtVgVFjpycnIUYkRdDXl6enPRNRoLjn5+fj8GDBy+1PdH2Bg4ciL59+6JLly6OKZ30FEI85z3ttUlVulwMAYofgUDgD+NAuy0qKgL5Lia7EzQ99ixrcWl1TwTaEwG1VQREQAREQAREQAREQAREQAREQAREoOMTaOs9lADSCiNE0YLO5muuuQZvv/023n333aUK77zzDt6x4b333sOYMWPc+WOPPYarrroKu+66K+LxuBNCWqELrVIFOe2000547rnnwD57nJ588kmMHj3azaBplYa0k0o4/kcddRReeumlhXh53Jo70p5ogzyS8Weffeby33nnnTj11FOd+ESBjeJKO8GwyptJ8WjIkCF48803G3/XZPu///3PMV2cAELhg7zXXXddbLXVVqAAKBFklQ+pGiACIiACIiACIiACy0tA+URABERABERABERABNoYAQkgrTAgfKOeTs1IJILc3NylDpz1UFhY6N7U79evH4YPH46dd94Zxx57LK677jrcdttt2HzzzTuUCBIMBp0TmH0nK+/IeNgPWdqD/uYTIBdyWtpAnpxNVFxc7GYW0XE/atQo/PnPf8Z5552H++67D0cffbQT1ySCzIe8lAeyZcgei3A43GxuPg8ofnAsLrjgAtx888046KCD4Pf70XG4N9t1RYqACIiACIiACIiACIiACIiACIiACHQoAuqMCLRtAhJAWnF86LxfnkBnKQOXiKJzlMdu3bphn332wV//+lcMHTq0w4ggHh/21zvnsRWHqd1VRT7LE8iYtkSb4iyFUCiEYcOG4aSTTsJxxx3nRBCmaXdAVlGDFzUGTZtD5pw1csghh+CRRx7B8ccfj3XWWQfRaBQ1NTVNk+taBERABERABESgPRFQW0VABERABERABERABERABNoUAQkgbWA4uH/AkoLP54MxprG1dEzz7f9NNtkEdKTyBuN4bM/BGOPegueb8AzsN4MxC/oOfZZIgMyWZFPka8wCrnTg0znP2UZ/+tOf3OwiOuqXWNkiEij6jwTImEu9XXnllbj44oux6aabuhlP/O3y3h9zKEYEREAEREAEREAEREAEREAEREAE2jYBtU4EREAE2jIBX1tuXGdoGx3Or7zyituH4eWXX0Z2YDz3EeBeDr/++iv4lr4xCzusudzOdttt5/Zu6AjO6vLycvz444/47rvvXPj+++8xbtw4zJ0715mDMQv67yL09QcCFD9+/vlnPP/88wvZk2dbr776Kl5//XV89dVXKCsrW0hYY2F0xHNWEfeZ4TWd8zwqrDgBsmUpFD44i4vX2UGsSUdBBERABNo1ATVeBERABERABERABESgXRHIAJmUDcn5Id3GW2/bm44D6ZgN9phZ0fba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" class="kg-image" alt="" loading="lazy"/></figure><p><strong>参考リンク：</strong></p><ul><li><a href="https://qiita.com/mkin/items/0a82c84df084496544c6">Serverless Framework の使い方を初心者にも分かりやすく説明する</a></li><li><a href="https://zenn.dev/snowcait/scraps/08f15f3e4b1afb">CloudFront + S3 で静的ページをホストするための Serverless Framework 設定</a></li><li><a href="https://www.qes.co.jp/media/aws/amazonbedrock/a605">Amazon BedrockでOpenAIのgpt-ossを試してみた！</a></li><li><a href="https://qiita.com/Yusuke_Pipipi/items/b44cb8442932019c52c9">【保存版】Python Notion 操作 （notion-sdk-py編）</a></li><li><a href="https://github.com/ramnes/notion-sdk-py/tree/main">notion-sdk-py</a></li><li><a href="https://developers.notion.com/docs/getting-started">Notion API</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Amazon Q Developerで簡単な
Webサービスを作ってみる]]></title><description><![CDATA[こんにちは、ryudaiです！

以前、2025 Japan AWS Jr. Champions
[https://aws.amazon.com/jp/blogs/psa/2025-japan-aws-jr-champions/] 
の活動の一環で、表題のような簡単なハンズオンを行いました。

その中身をブログに書き起こしたので、

 * あまりAI触ったことないよ
 * Amazon Q Developerはじめて触るよ
 * 自分でもWebサービス作れるのかな

な人は一緒にやっていきましょう！

今回は、簡単なTODOリストを作っていきます。

■事前準備
今回使うものはこちらです。

 * Visual Studio Code [https://code.visualstudio.com/] (VSCode):
   コードを書くエディターです。まずはこれをインストール！
 * Amazon Q Developer
   [https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.amazon-q]]></description><link>https://tech.anti-pattern.co.jp/amazon-q-developer-simple-web-service/</link><guid isPermaLink="false">Ghost__Post__6902f71671fa390001b3459d</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Thu, 30 Oct 2025 13:58:42 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、ryudaiです！</p><p>以前、<a href="https://aws.amazon.com/jp/blogs/psa/2025-japan-aws-jr-champions/">2025 Japan AWS Jr. Champions</a> の活動の一環で、表題のような簡単なハンズオンを行いました。</p><p>その中身をブログに書き起こしたので、</p><ul><li>あまりAI触ったことないよ</li><li>Amazon Q Developerはじめて触るよ</li><li>自分でもWebサービス作れるのかな</li></ul><p>な人は一緒にやっていきましょう！</p><p>今回は、簡単な<strong>TODOリスト</strong>を作っていきます。</p><h2 id="%E2%96%A0%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99">■事前準備</h2><p>今回使うものはこちらです。</p><ul><li><a href="https://code.visualstudio.com/">Visual Studio Code</a> (VSCode): コードを書くエディターです。まずはこれをインストール！</li><li><a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.amazon-q-vscode">Amazon Q Developer</a> (拡張機能): VSCodeの拡張機能としてインストールしていきます</li><li><a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">Live Server</a> (拡張機能): こちらもVSCodeの拡張機能です。HTMLをプレビューするために使います</li></ul><h2 id="%E2%96%A0%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F">■つくりかた</h2><p>Webサービスはざっくり、以下のような構成でできています。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.42.42.png" class="kg-image" alt="HTML、" loading="lazy" width="1920" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-14.42.42.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-14.42.42.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-14.42.42.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.42.42.png 1920w" sizes="(min-width: 720px) 720px"><figcaption>HTML、CSS、JavaScriptの比較</figcaption></img></figure><ul><li><strong>HTML</strong>: ページのコンテンツそのものを記述するもので、骨組みとなります</li><li><strong>CSS</strong>: HTMLの要素に対して、色や形、空白などを定義します</li><li><strong>JavaScript: </strong>いわゆる「プログラミング言語」で、HTMLに動きをつけることができる</li></ul><p>今回はHTML→CSS→JavaScriptの順に作っていきます。</p><p>といっても、作るのはAmazon Q Developerですが！</p><h2 id="%E2%96%A0amazon-q-developer%E3%82%92%E3%81%B2%E3%82%89%E3%81%8F">■Amazon Q Developerをひらく</h2><p>まずは適当なフォルダを作り、VSCodeを開きます。私は<strong>q-dev-todo</strong>というフォルダを作成しました。</p><p>VSCodeの左のタブに、「Amazon Q」のアイコンがあると思います。これをクリックして開くと以下のようになるかと思います。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.54.12.png" class="kg-image" alt="" loading="lazy" width="2000" height="1214" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-14.54.12.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-14.54.12.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-14.54.12.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-14.54.12.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Amazon Q Developerにログインを求められている</figcaption></img></figure><p>Amazon Q Developerを使うために、「Builder ID」でログインするか、<a href="https://dev.classmethod.jp/articles/amazon-q-developer-pro-member-account/">Proライセンスのサブスクリプション</a> を行ってください。</p><p>無事ログインできると以下のようにチャット画面が開けます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-14.57.18.png" class="kg-image" alt="" loading="lazy" width="2000" height="1208" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-14.57.18.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-14.57.18.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-14.57.18.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-14.57.18.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>VSCodeでAmazon Q Developerのチャット画面が開いている</figcaption></img></figure><h2 id="%E2%96%A0html%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B">■HTMLをつくる</h2><p>では、チャット画面で以下のように書いてみましょう。</p><blockquote>これから、HTML・CSS・JavaScriptでシンプルなTODOリストを作成していきます。まずは、HTMLを作成してください。</blockquote><p>私の画面ではこのように返ってきました。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.07.32.png" class="kg-image" alt="" loading="lazy" width="2000" height="1220" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-15.07.32.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-15.07.32.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-15.07.32.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-15.07.32.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Amazon Q DeveloperがHTMLを作成したと言っている</figcaption></img></figure><p>VSCodeの画面左上、「エクスプローラー」ボタンを開くと<strong>index.html</strong>が作成されていました<strong>。</strong>ここで、「index.html」を右クリックすると出てくる「Open with Live Server」を押してください。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.08.33.png" class="kg-image" alt="" loading="lazy" width="2000" height="1218" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-15.08.33.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-15.08.33.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-15.08.33.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-15.08.33.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Open with Live Serverを選択している様子</figcaption></img></figure><p>すると、自動的にブラウザで <a href="http://127.0.0.1:5500/index.html">http://127.0.0.1:5500/index.html</a> のリンクが開いたはずです。TODOリストと書いてありますが、まだ何も動作しません。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.17.39.png" class="kg-image" alt="" loading="lazy" width="1168" height="626" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-15.17.39.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-15.17.39.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.17.39.png 1168w" sizes="(min-width: 720px) 720px"><figcaption>動作しないTODOリストの画面</figcaption></img></figure><h2 id="%E2%96%A0css%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B">■CSSをつくる</h2><p>次に、見た目を整えていきます。チャットに以下を入力します。</p><blockquote>次にCSSで見た目を整えます。シンプルでスタイリッシュ、モダンな見た目にしてください。</blockquote><p>あえて抽象的な言い回しにしています。無事にCSSが作成されましたね。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.52.43.png" class="kg-image" alt="" loading="lazy" width="2000" height="1221" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-15.52.43.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-15.52.43.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-15.52.43.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-15.52.43.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>CSSファイルが作成されている様子</figcaption></img></figure><p>ではどのような画面になったでしょうか？先程の<a href="http://127.0.0.1:5500/index.html">http://127.0.0.1:5500/index.html</a> に戻って見てみましょう。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.53.56.png" class="kg-image" alt="" loading="lazy" width="1666" height="912" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-15.53.56.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-15.53.56.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-15.53.56.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-15.53.56.png 1666w" sizes="(min-width: 720px) 720px"><figcaption>TODOリストの見た目が整えられている</figcaption></img></figure><p>青~紫のグラデーションがついて、かっこよくなりましたね。</p><p>みなさんはどんな見た目になりましたか？</p><h2 id="%E2%96%A0javascript%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B">■JavaScriptをつくる</h2><p>ここまででは、まだTODOリストの「機能」ができていません。最後にJavaScriptを追加していきましょう。</p><blockquote>最後に、JavaScriptで機能をつけてください。</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-16.18.29.png" class="kg-image" alt="" loading="lazy" width="2000" height="1216" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-16.18.29.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-16.18.29.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-16.18.29.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-16.18.29.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>JavaScriptファイルが作成された様子</figcaption></img></figure><p>では、実際にブラウザで使っていきましょう！</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-16.19.36.png" class="kg-image" alt="" loading="lazy" width="1300" height="1032" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-16.19.36.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-16.19.36.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-16.19.36.png 1300w" sizes="(min-width: 720px) 720px"><figcaption>タスクが追加された様子</figcaption></img></figure><p>無事にタスクが追加されました！ついでに削除機能も作ってくれていますね。</p><h2 id="%E2%96%A0%E3%82%82%E3%81%97%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%89%EF%BC%9F">■もし動かなかったら？</h2><p>ブラウザで<strong>F12</strong>キーを押すと、「<strong>検証ツール</strong>」を開くことができます。</p><p>この検証ツールの「Console」で、以下のようにエラーを見ることができます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/10/----------2025-10-30-16.22.25.png" class="kg-image" alt="" loading="lazy" width="2000" height="1123" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/10/----------2025-10-30-16.22.25.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/10/----------2025-10-30-16.22.25.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/10/----------2025-10-30-16.22.25.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/10/----------2025-10-30-16.22.25.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>検証ツールのConsoleタブにエラーが出ている様子</figcaption></img></figure><p>このエラーをAmazon Q Developerのチャット画面に貼り付けて「修正してください」とお願いすればOKです。</p><h2 id="%E2%96%A0%E6%9C%80%E5%BE%8C%E3%81%AB">■最後に</h2><p>どうでしたでしょうか？初めての方も、意外と簡単だなーと思ったのではないでしょうか。</p><p>余力のある方は、チャットの続きで</p><ul><li>CSSを編集して見た目を自分好みに変えてみる</li><li>JavaScriptを編集して機能を追加する</li><li>WebサイトをAWSに公開する</li></ul><p>などを試してみてください！</p>]]></content:encoded></item><item><title><![CDATA[[Pre cap]AWS re:Invent 2025 に向けて：昨年のSaaSワークショップ振り返り]]></title><description><![CDATA[AWS re:Invent 2025の申し込みがそろそろ始まる頃かと思います。
そこで、昨年のSaaS関連ワークショップをいくつか紹介し、今年どのワークショップに参加するか検討する際の参考になれば幸いです。
昨年の内容を知ることで、最新のワークショップを見つけることができると思います。
※ワークショップはセッションのように公開されておらず、昨年参加できなかったワークショップはwebから見つけてきたものもあるので、一部間違いがあるかもしれません。ご了承ください。


--------------------------------------------------------------------------------

Workshop 一覧

--------------------------------------------------------------------------------

SAS301 - Solving the SaaS cost-per-tenant puzzle: An inside look
マルチテナントSaaS運営で多くの開発者が直面]]></description><link>https://tech.anti-pattern.co.jp/re-invent2024no/</link><guid isPermaLink="false">Ghost__Post__68b7a29871fa390001b33c94</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Fri, 10 Oct 2025 07:14:46 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>AWS re:Invent 2025の申し込みがそろそろ始まる頃かと思います。<br>
そこで、昨年のSaaS関連ワークショップをいくつか紹介し、今年どのワークショップに参加するか検討する際の参考になれば幸いです。<br>
昨年の内容を知ることで、最新のワークショップを見つけることができると思います。<br>
※ワークショップはセッションのように公開されておらず、昨年参加できなかったワークショップはwebから見つけてきたものもあるので、一部間違いがあるかもしれません。ご了承ください。</br></br></br></p>
<hr>
<h2 id="workshop-%E4%B8%80%E8%A6%A7">Workshop 一覧</h2>
<hr>
<h3 id="sas301solving-the-saas-cost-per-tenant-puzzle-an-inside-look">SAS301 - Solving the SaaS cost-per-tenant puzzle: An inside look</h3>
<p>マルチテナントSaaS運営で多くの開発者が直面する「テナント別コストの見えにくさ」についてのアプローチを紹介します。<br>
共有リソース環境ではインフラのタグ付けだけでは不十分で、アプリケーションが自ら利用状況を記録する「プールモデル」でどのように計測するかを知る必要があります。</br></p>
<p>まずはAPIログなどを活用した「粗粒度メトリクス」で大まかな傾向を把握し、必要に応じてLambda Extensionsなどを用いた「細粒度メトリクス」へ発展させることで、従量課金モデルにも対応できる手法を紹介しています。</p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/aws-saas-tenant-usage-and-cost-attribution">aws-saas-tenant-usage-and-cost-attribution</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.us-east-1.prod.workshops.aws/workshops/6743cde7-2471-46fc-863f-5830b98f3d36/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="sas304inside-the-saas-builder-toolkit-a-hands-on-deep-dive-repeat">SAS304 - Inside the SaaS Builder Toolkit: A hands-on deep dive [REPEAT]</h3>
<p>AWSが提供する「SaaS Builder Toolkit (SBT)」は、マルチテナント管理や請求処理などの複雑な定型作業を、再利用可能なコンポーネントとして標準化したツールキットです。SBTが提示する「コントロールプレーン」と「アプリケーションプレーン」の分離、EventBridgeによるイベント駆動の疎結合設計、ScriptJobによる自動プロビジョニング、そして請求・認証を抽象化するプラグインアーキテクチャを紹介しています。</p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/awslabs/sbt-aws">sbt-aws</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.workshops.aws/sbt-aws/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="sas402saas-survivor-building-a-rich-multi-tenant-operations-experience">SAS402 - SaaS survivor: Building a rich multi-tenant operations experience</h3>
<p>マルチテナントSaaSの運用・分析方法を紹介しています。<br>
テナントベースでメトリクスやログを管理する方法、うるさい隣人問題（noisy neighbor）を防ぎワークロードの公平性を確保する方法、<br>
「あるテナントが他のテナントのデータに絶対にアクセスできない」状態をコードで保証する手法などを解説します。<br>
さらに、アクセス防止だけでなくプロアクティブな監視・対策の実装方法も学びます。</br></br></br></p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/aws-saas-operations-workshop">aws-saas-operations-workshop</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.workshops.aws/saas-operations/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="sas403saas-microservices-deep-dive-multi-tenancy-meets-microservice">SAS403 - SaaS microservices deep dive: Multi-tenancy meets microservice</h3>
<p>開発者がセキュアでスケーラブルなSaaSアプリケーションプレーンを構築できるよう、テナント分離をコードではなくIAM層で強制する「サイドカーTVM」や、<br>
Istioによるインフラレベルのルーティング、JWTを用いた一貫したテナントコンテキスト伝播などを紹介しています。</br></p>
<p>「サイドカーTVM」は各マイクロサービスの隣で動作し、IAMポリシーによってテナントごとのアクセスを厳密に制御する仕組みです。<br>
さらに、Amazon Verified Permissionsによる認可ロジックの外部化や、テナント別メトリクス分析によるビジネスインサイトの獲得方法も紹介しています。<br>
全体として、アプリケーションからプラットフォーム層にオフロードできる機能設計の解説となっています。</br></br></p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/aws-saas-factory-saas-microservices-workshop">aws-saas-factory-saas-microservices-workshop</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.workshops.aws/saas-microservices/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="sas404automate-saas-provisioning-deployment-with-kubernetes-devops-tooling">SAS404 - Automate SaaS provisioning &amp; deployment with Kubernetes DevOps tooling</h3>
<p>「開発者主導のインフラ（Developer-Driven Infrastructure）」という思想を、GitOpsで実現する方法を紹介しています。<br>
単一のHelmチャートで全ティアを統一管理し、イベント駆動の自動ワークフローでゼロタッチなテナント運用を実現する方法やECRからのイメージ削除による自己修復ロールバックや、段階的に展開する「ウェーブデプロイメント」で安全性を高める手法も紹介しています。</br></p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/eks-saas-gitops/">eks-saas-gitops</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.workshops.aws/eks-saas-gitops/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="sas405saas-and-rag-maximizing-generative-ai-value-in-multi-tenant-solutions">SAS405 - SaaS and RAG: Maximizing generative AI value in multi-tenant solutions</h3>
<p>生成AIとRAG（Retrieval-Augmented Generation）を活用したPoC（概念実証）を、本番運用可能なマルチテナントSaaSへ発展させる際の課題を紹介しています。<br>
動的プロビジョニングによるテナント分離、ABAC（属性ベースアクセス制御）による防御的設計、トークンベースのスロットリングによる「うるさい隣人」問題の解消、<br>
そしてIAMロール命名を活用した正確なコスト按分など、実践的なアプローチを解説しています。</br></br></p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/aws-saas-genai-rag-workshop">aws-saas-genai-rag-workshop</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.us-east-1.prod.workshops.aws/workshops/224f4cc0-cefb-4e29-95fa-365ad5a7ef28/en-US">リンク</a></li>
</ul>
<hr>
<h3 id="arc402scaling-multi-tenant-saas-with-a-cell-based-architecture">ARC402 - Scaling multi-tenant SaaS with a cell-based architecture</h3>
<p>AWSが導入している「セルベースアーキテクチャ」を紹介しています。<br>
この設計は、ハイパーグロース期において高可用性と堅牢な運用を維持するための有効な基盤です。<br>
アプリケーションを独立した「セル」に分割し、障害を局所化・制御可能にすることで、従来のプール型モデルのスケーリング限界や影響範囲拡大を克服します。</br></br></p>
<p>セル管理システム、セルルーター、セルアプリケーションプレーンという3つの主要コンポーネントにより、プロビジョニング・ルーティング・運用を自動化。<br>
さらに、段階的デプロイ（staggered deployments）やリバランシングを活用して、安全かつ柔軟なスケーリングを実現します。</br></p>
<ul>
<li><strong>GitHub:</strong> <a href="https://github.com/aws-samples/aws-saas-cell-based-architecture">aws-saas-cell-based-architecture</a></li>
<li><strong>Workshop:</strong> <a href="https://catalog.us-east-1.prod.workshops.aws/workshops/44d6042c-1ff7-43c2-9343-cff46c43e165/en-US">リンク</a></li>
</ul>
<hr>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>全体としてマルチテナントSaaSの基礎からさまざまなアーキテクチャを紹介していました。また、生成AIなど最新のトレンドやセルベースアーキテクチャという新しいトピックもワークショップになっていて感動しました。<br>
今年もトレンドを反映したワークショップが出ると思いますので、ぜひ参加してみてください！</br></p>
<!--kg-card-end: markdown--></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[いまさら理解する「スタティックリンク」と「ダイナミックリンク」- Webアプリケーションエンジニアのための低レイヤー入門シリーズ その１]]></title><description><![CDATA[最近業務で、ひさびさにCコンパイラ使いました。納品されたモジュールが .so 
だったためです。みなさん、そんなときどうしますか？Golangでcgoとか使います？

ということで、昔はプログラマーとしては当たり前の情報でしたが、昨今はWebアプリケーションエンジニアは目にすることも少なくなった情報を、改めて書いておきたいと思います！

リンク？？？
みなさん、「リンク」って聞いたことありますか？いえ、HTMLの<a>
タグの話ではありません。もちろん、ゼルダの伝説でおなじみのあの方でもなければ、イナバウワーのステージでもありません。今回は、プログラムが実行ファイルになるまでの「リンク」という工程について、C言語を例にお話しします。文章だとしても。

なぜこの話が必要なのか
「リンクとかよく知らないけど、Go言語でgo buildしたら実行ファイルができる。それで十分じゃない？」

もうおっしゃるとおり！でも、たとえば：

 * Dockerイメージのサイズを小さくしたい
 * ライブラリの更新でアプリを再ビルドせずに済ませたい
 * 「shared library not found]]></description><link>https://tech.anti-pattern.co.jp/imasarali-jie-surusutateitukurinkutodainamitukurinkunituite/</link><guid isPermaLink="false">Ghost__Post__68e6211871fa390001b33fe8</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Thu, 09 Oct 2025 15:41:40 GMT</pubDate><content:encoded><![CDATA[<p>最近業務で、ひさびさにCコンパイラ使いました。納品されたモジュールが <code>.so</code> だったためです。みなさん、そんなときどうしますか？Golangでcgoとか使います？</p><p>ということで、昔はプログラマーとしては当たり前の情報でしたが、昨今はWebアプリケーションエンジニアは目にすることも少なくなった情報を、改めて書いておきたいと思います！</p><h2 id="%E3%83%AA%E3%83%B3%E3%82%AF%EF%BC%9F%EF%BC%9F%EF%BC%9F">リンク？？？</h2><p>みなさん、「リンク」って聞いたことありますか？いえ、HTMLの<code>&lt;a&gt;</code>タグの話ではありません。もちろん、ゼルダの伝説でおなじみのあの方でもなければ、イナバウワーのステージでもありません。今回は、プログラムが実行ファイルになるまでの「リンク」という工程について、C言語を例にお話しします。文章だとしても。</p><h2 id="%E3%81%AA%E3%81%9C%E3%81%93%E3%81%AE%E8%A9%B1%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B">なぜこの話が必要なのか</h2><p>「リンクとかよく知らないけど、Go言語で<code>go build</code>したら実行ファイルができる。それで十分じゃない？」</p><p>もうおっしゃるとおり！でも、たとえば：</p><ul><li>Dockerイメージのサイズを小さくしたい</li><li>ライブラリの更新でアプリを再ビルドせずに済ませたい</li><li>「shared library not found」的なエラーに遭遇してもう無理ってなった</li></ul><p>こんなとき、リンクの仕組みを知っていると解決の糸口が見えてきます。</p><hr><h2 id="%E3%81%BE%E3%81%9A%E3%81%AF%E5%85%A8%E4%BD%93%E5%83%8F%EF%BC%9A%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%BE%E3%81%A7">まずは全体像：プログラムができるまで</h2><p>C言語のプログラムが実行ファイルになるまでには、実は複数のステップがあります。</p><pre><code>hello.c (ソースコード)
    ↓ コンパイラによるコンパイル
hello.o (オブジェクトファイル)
    ↓ リンカによるリンク
hello (実行ファイル)</code></pre><p><strong>Go言語との違い</strong>：Goの場合、<code>go build</code>で一気に実行ファイルになります。内部的には似たようなプロセスを経ていますが、中間ファイル（.oファイル）は通常見えません。Goは開発者体験を重視して、こうした複雑さを隠してくれているんですね。たぶん！</p><hr><h2 id="%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%A8%E3%83%AA%E3%83%B3%E3%82%AB%EF%BC%9A%E5%BD%B9%E5%89%B2%E5%88%86%E6%8B%85">コンパイラとリンカ：役割分担</h2><h3 id="%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AE%E4%BB%95%E4%BA%8B">コンパイラの仕事</h3><p>コンパイラは、人間が読めるソースコード（.c）を、機械が理解できる機械語に翻訳します。</p><pre><code class="language-c">// hello.c
#include &lt;stdio.h&gt;

int main() {
    printf("Hello, Sofmap World!\n");
    return 0;
}</code></pre><p>これをコンパイルすると：</p><pre><code class="language-bash">$ gcc -c hello.c -o hello.o</code></pre><p><strong>できるもの：hello.o（オブジェクトファイル）</strong></p><p>このファイルは機械語になっていますが、<strong>まだ実行できません</strong>。なぜなら、<code>printf</code>という関数の本体がどこにあるかわからないからです。</p><pre><code>#include &lt;stdio.h&gt;</code></pre><p>で、どっかしらに <code>printf</code> という関数が、こういう引数でこういう戻り値でこういう型で、というのがわかります。そして、コンパイラはそれをもとに構文が合っているかがチェックできます。しかし、その呼び先の関数の実態がどこなのかはまだ謎です！</p><p><strong>Reactでの例え</strong>：Reactコンポーネントで<code>import { useState } from 'react'</code>と書いたけど、まだReactライブラリ本体とつながっていない状態、みたいなイメージです。</p><h3 id="%E3%83%AA%E3%83%B3%E3%82%AB%E3%81%AE%E4%BB%95%E4%BA%8B">リンカの仕事</h3><p>リンカは、複数のオブジェクトファイルやライブラリを結合して、実行可能なファイルを作ります。</p><pre><code class="language-bash">gcc hello.o -o hello</code></pre><p>このとき、リンカは「<code>printf</code>の本体はこのライブラリにあるよ」と教えてもらい、それらを全部つなぎ合わせます。</p><p>今回は１つの <code>.o</code> ファイルですが、複数の <code>.o</code> ファイルを結合することができます。また、 <code>printf</code> に関しては、いわゆる標準ライブラリ(たまに目にする <code>glibc</code> だと思ってください)に入っているので、Cコンパイラは明示しなくてもどこにリンクすれば良いのか知っているため、引数にそれっぽいものをつけなくても大丈夫です。逆に、標準じゃない系のものは明示する必要があります。</p><hr><h2 id="o%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B">.oファイルとは何か</h2><p><strong>.o（オブジェクトファイル）</strong> は、コンパイルされた機械語のかたまりです。</p><p><strong>特徴</strong>：</p><ul><li>まだ実行できない中間形式</li><li>複数の.cファイルをコンパイルすると、それぞれに対応する.oファイルができる</li><li>これらを後でリンカが組み合わせる</li></ul><p><strong>実例</strong>：</p><pre><code class="language-c">// math_utils.c
int add(int a, int b) {
    return a + b;
}</code></pre><pre><code class="language-c">// main.c
#include &lt;stdio.h&gt;
int add(int, int); // 関数の宣言

int main() {
    printf("2 + 3 = %d\n", add(2, 3));
    return 0;
}</code></pre><p>コンパイル：</p><pre><code class="language-bash">gcc -c math_utils.c -o math_utils.o
gcc -c main.c -o main.o</code></pre><p>この時点で、<code>main.o</code>には「<code>add</code>っていう関数を使いたい」という情報はあるけど、その実体はまだつながっていません。</p><p>リンク：</p><pre><code class="language-bash">gcc main.o math_utils.o -o myapp</code></pre><p>これで初めて実行ファイル<code>myapp</code>が完成します。</p><p><strong>Goとの比較</strong>：Goでも複数の.goファイルを書きますが、<code>go build</code>が自動的にすべてを処理してくれます。中間の.oファイルにあたるファイルは一時的なディレクトリに作られるため普段意識する必要はありません。</p><hr><h2 id="%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%A8%E3%81%AF">スタティックリンクとは</h2><p>スタティックリンク（静的リンク）は、<strong>リンク時にライブラリのコードをすべて実行ファイルに埋め込む</strong>方式です。</p><h3 id="%E4%BB%95%E7%B5%84%E3%81%BF">仕組み</h3><pre><code>main.o + libmymath.a (静的ライブラリ) 
    ↓ スタティックリンク
myapp (実行ファイル：全部入り)</code></pre><p><strong>.a ファイル</strong>：複数の.oファイルをまとめたアーカイブ。Windowsでは.libという拡張子になります。</p><h3 id="%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">メリット</h3><ol><li><strong>配布が簡単</strong>：実行ファイル1つで完結するので、他のファイルが不要</li><li><strong>依存関係の心配なし</strong>：ライブラリがシステムにインストールされてなくても動く</li></ol><p>つまり、Goと同じようにバイナリ１つで動くイメージ！</p><h3 id="%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">デメリット</h3><ol><li><strong>ファイルサイズが大きい</strong>：すべてのコードが含まれるため</li><li><strong>更新が大変</strong>：ライブラリにバグ修正があっても、アプリを再ビルドしないと反映されない</li><li><strong>メモリ効率が悪い</strong>：同じライブラリを使う複数のアプリが起動すると、それぞれがコードのコピーをメモリに持つ</li></ol><p><strong>Goとの比較</strong>：Goの<code>go build</code>は基本的にスタティックリンクです！だからGoの実行ファイルは大きめですが、1つのバイナリで完結するので、Dockerイメージに入れるときも<code>FROM scratch</code> (何にも入っていないコンテナから作る) が使えて便利なんです。</p><pre><code class="language-dockerfile">FROM scratch
COPY myapp /
CMD ["/myapp"]</code></pre><p>※Goでも、バージョンや環境によっては内部でダイナミックリンクすることもありますが、このブログではわかりやすくするために、スタティックリンクしているということにしています</p><hr><h2 id="%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%A8%E3%81%AF">ダイナミックリンクとは</h2><p>ダイナミックリンク（動的リンク）は、<strong>実行時にライブラリを読み込む</strong>方式です。</p><h3 id="%E4%BB%95%E7%B5%84%E3%81%BF-1">仕組み</h3><pre><code>main.o + libmymath.so への参照
    ↓ ダイナミックリンク
myapp (実行ファイル：参照情報のみ)

実行時に...
myapp → libmymath.so を探して読み込む</code></pre><p><strong>.so ファイル（Shared Object）</strong>：動的に読み込まれる共有ライブラリ。Windowsでは.dll、macOSでは.dylibという拡張子になります。</p><h3 id="%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88-1">メリット</h3><ol><li><strong>ファイルサイズが小さい</strong>：実行ファイルには参照情報だけ</li><li><strong>メモリ効率が良い</strong>：複数のアプリが同じライブラリを共有できる</li><li><strong>更新が容易</strong>：ライブラリだけ差し替えれば、すべてのアプリに反映される</li></ol><h3 id="%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88-1">デメリット</h3><ol><li><strong>配布が複雑</strong>：実行ファイルと一緒に.soファイルも配布が必要</li><li><strong>依存関係の管理</strong>：「ライブラリが見つからない」エラーが実行時に初めて起きてしまう</li><li><strong>バージョン地獄</strong>：ライブラリのバージョン違いで動かないこともあったりする</li></ol><p><strong>よく見るエラー</strong>：</p><pre><code>./myapp: error while loading shared libraries: libmymath.so: 
cannot open shared object file: No such file or directory</code></pre><p>これは「動的ライブラリが見つからないよ」というエラーです。</p><hr><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86">実際に試してみよう</h2><h3 id="%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E4%BE%8B">スタティックリンクの例</h3><pre><code class="language-bash"># 静的ライブラリを作る
gcc -c math_utils.c -o math_utils.o
ar rcs libmymath.a math_utils.o

# スタティックリンク
gcc main.c -L. -lmymath -static -o myapp_static

# ファイルサイズを確認
ls -lh myapp_static
# 例：800KB</code></pre><h3 id="%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E4%BE%8B">ダイナミックリンクの例</h3><pre><code class="language-bash"># 共有ライブラリを作る
gcc -fPIC -shared math_utils.c -o libmymath.so

# ダイナミックリンク
gcc main.c -L. -lmymath -o myapp_dynamic

# ファイルサイズを確認
ls -lh myapp_dynamic
# 例：16KB

# 依存関係を確認
ldd myapp_dynamic
# libmymath.so =&gt; ./libmymath.so</code></pre><p>サイズの違いに注目してください！</p><hr><h2 id="%E5%AE%9F%E5%8B%99%E3%81%A7%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%82%B7%E3%83%BC%E3%83%B3">実務でよくあるシーン</h2><h3 id="docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%99%E3%81%8E%E3%82%8B%E5%95%8F%E9%A1%8C">Dockerイメージが大きすぎる問題</h3><p>スタティックリンクされたGoアプリは大きいですが、動的ライブラリ不要なので<code>FROM scratch</code>が使えます。</p><p>一方、動的リンクされたアプリは小さいですが、必要なライブラリをすべてイメージに含める必要があります。</p><pre><code class="language-dockerfile"># よくある解決策：Alpine Linuxを使う
FROM alpine:latest
RUN apk add --no-cache libc6-compat
COPY myapp_dynamic /
CMD ["/myapp_dynamic"]</code></pre><h3 id="%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E5%AF%BE%E5%BF%9C">ライブラリの脆弱性対応</h3><p><strong>スタティックリンク</strong>：OpenSSLに脆弱性が見つかった場合、すべてのアプリを再ビルド・再デプロイ</p><p><strong>ダイナミックリンク</strong>：OpenSSLの.soファイルだけ更新すれば、すべてのアプリに反映（再起動は必要）</p><h3 id="%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%E3%81%AE%E9%96%A2%E4%BF%82">システムライブラリとの関係</h3><p>LinuxやmacOSには、標準Cライブラリ（libc/glibc）など、OSが提供する共有ライブラリがあります。多くのプログラムはこれらを動的にリンクして使います。</p><pre><code class="language-bash"># MacでNode.jsの依存関係を見る
otool -L $(which node)

# 複数の.dylibが並ぶはず</code></pre><hr><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>項目</th>
<th>スタティックリンク</th>
<th>ダイナミックリンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>ファイル拡張子</td>
<td>.a (.lib)</td>
<td>.so (.dll / .dylib)</td>
</tr>
<tr>
<td>実行ファイルサイズ</td>
<td>大きい</td>
<td>小さい</td>
</tr>
<tr>
<td>配布の簡単さ</td>
<td>○ 1ファイルで完結</td>
<td>△ ライブラリも配布</td>
</tr>
<tr>
<td>メモリ効率</td>
<td>△ 各アプリが個別にコピー</td>
<td>○ 複数アプリで共有</td>
</tr>
<tr>
<td>更新の容易さ</td>
<td>△ 再ビルドが必要</td>
<td>○ ライブラリだけ更新</td>
</tr>
<tr>
<td>Goでの対応</td>
<td>デフォルト</td>
<td>オプション</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h3 id="%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E9%81%B8%E3%81%B6%E3%81%B9%E3%81%8D%E3%81%8B">どちらを選ぶべきか</h3><p><strong>スタティックリンクが向いている場合</strong>：</p><ul><li>シンプルな配布を優先したい</li><li>Dockerコンテナでscratchベースとかで使う</li><li>セキュリティのために依存を最小化したい</li></ul><p><strong>ダイナミックリンクが向いている場合</strong>：</p><ul><li>複数のアプリで同じライブラリを使う</li><li>ライブラリの頻繁な更新が必要</li><li>メモリ使用量を抑えたい</li></ul><p>ものすごくざっくり言えば、プログラミングで共有の関数を作るか、自分しか使わない関数を作るか、のようなイメージです！（ちょっと違うけど）</p><hr><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>Web開発では意識しない「リンク」の世界を楽しんでいただけましたでしょうか？！</p><p>普段GoやReactで開発していると、こうした複雑なことを意識しないでも開発できます。でも、その裏側を知ることで、コンピュータの気持ちがわかるようになり、例えばDockerイメージの最適化や、ライブラリエラーのトラブルシューティングがぐっと楽になったりもします。</p><p>次に「shared library not found」的なエラーに出会ったら、「ああ、動的リンクで.soファイルが見つからないんだな」と余裕を持って対応できるはずです！</p><p>こんな感じで、昨今は学ばなくても特にプログラミングで困らないが、知ってると楽になる系のお話を書いていきたいと思います！最近は、生成AIでプログラム書いてもらったけどどうしても動かない場面、なんかにも有用かもしれません！</p><p>こちらからは以上です。</p></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[BtoB SaaS開発基礎講座をやってきました！]]></title><description><![CDATA[

以前、一般社団法人 日本CTO協会「新卒合同研修」にて、BtoB SaaS開発基礎講座をやってきましたので、ご紹介です。

日本CTO協会が新卒エンジニアを業界全体・企業横断で育てる試み「新卒エンジニア向けの合同研修」を5月29日から実施 ｜一般社団法人 日本CTO協会
「テクノロジーによる自己変革を、日本社会のあたりまえに」というミッションを掲げ、世界最高水準の技術者育成を図ることにより、日本経済の発展に資することを目的としています。
一般社団法人 日本CTO協会 [https://cto-a.org/news/20240529_release]

資料はこちらです！

https://speakerdeck.com/yaggy/btob-saaskai-fa-ji-chu-jiang-zuo

この講座の目的は、資料に記載のとおり

「SaaSって、こんなこと考えないといけないんだな〜〜〜」
っていうのをほんのりわかってもらって、本当の仕事の場面でこういうのが必要になった時に、
「あ、そういえばSaaSってそういうの必要だって言ってたな〜
チームでいろいろ試行錯誤してたわそうい]]></description><link>https://tech.anti-pattern.co.jp/btob-saaskai-fa-ji-chu-jiang-zuo-wo/</link><guid isPermaLink="false">Ghost__Post__66d5bab427e564000168115e</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Wed, 08 Oct 2025 09:27:00 GMT</pubDate><content:encoded><![CDATA[<p/><p>以前、一般社団法人 日本CTO協会「新卒合同研修」にて、BtoB SaaS開発基礎講座をやってきましたので、ご紹介です。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cto-a.org/news/20240529_release"><div class="kg-bookmark-content"><div class="kg-bookmark-title">日本CTO協会が新卒エンジニアを業界全体・企業横断で育てる試み「新卒エンジニア向けの合同研修」を5月29日から実施 ｜一般社団法人 日本CTO協会</div><div class="kg-bookmark-description">「テクノロジーによる自己変革を、日本社会のあたりまえに」というミッションを掲げ、世界最高水準の技術者育成を図ることにより、日本経済の発展に資することを目的としています。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://storage.googleapis.com/production-os-assets/assets/6a543e41-2452-4257-bb74-6280b2daa925"><span class="kg-bookmark-author">一般社団法人 日本CTO協会</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://storage.googleapis.com/production-os-assets/assets/26b1e60e-d18c-484b-9599-1701ef480475"/></div></a></figure><p/><p>資料はこちらです！</p><p><a href="https://speakerdeck.com/yaggy/btob-saaskai-fa-ji-chu-jiang-zuo">https://speakerdeck.com/yaggy/btob-saaskai-fa-ji-chu-jiang-zuo</a></p><p>この講座の目的は、資料に記載のとおり</p><p>「SaaSって、こんなこと考えないといけないんだな〜〜〜」<br>っていうのをほんのりわかってもらって、本当の仕事の場面でこういうのが必要になった時に、<br>「あ、そういえばSaaSってそういうの必要だって言ってたな〜<br>　チームでいろいろ試行錯誤してたわそういえば」<br>って思い出してもらえるようにする！</br></br></br></br></p><p>※そのため、厳密には間違ってるけどだいたい雰囲気をわかってもらう</p><p>となっております。</p><p>実際に、資料に沿ってやっていただくとわかるようになっていますので、ぜひやってみてください。研修ではチームで行いましたが、１人でも可能ですのでチームのところは読み飛ばしてやってみていただければと思います。</p><p>全体の流れとしては、</p><ul><li>SaaSってなんなの？</li><li>エンジニアとしてSaaS開発で気をつけないといけないポイントは？</li><li>まずは、特にテナント分離を考えないとですね</li><li>テナント分離モデルもいろいろあります</li><li>実際にSaaS開発もどきの体験をしましょう</li><li>ふつうのチャットアプリケーションをマルチテナント化してみましょう</li><li>そのためには、認証、テナントコンテキストというのを実装しましょう</li><li>自前で気軽にテナント実装したらセキュリティ的にやばいことになった・・・</li><li>自前SaaSにブルートフォース攻撃（総当たり攻撃）をしてみましょう</li><li>SQLインジェクション攻撃をしてみましょう</li><li>やばかった部分を改善してみましょう</li><li>まとめ</li><li>SaaSus Platformの宣伝</li></ul><p>という流れになっております。</p><p>超基礎的な内容ですが、意外とやったことないものも含まれているかもしれませんので、ぜひやってみてください〜！</p><p>こちらからは以上です。</p>]]></content:encoded></item><item><title><![CDATA[1,226種のSaaSをどうやって調べた？ API提供・公開状況レポートの舞台裏]]></title><description><![CDATA[

みなさんこんにちは！アンチパターンでSaaSus Platformのマーケティングも担当している野川です！

先日、私たちは「Horizontal SaaS
1,226種のAPI提供・公開状況」に関する調査レポートを公開しました。本レポートは、日本のSaaS業界におけるAPI提供・公開状況を分析したものです。今回のブログでは、そのレポートでは語りきれなかった「舞台裏」についてお伝えします。

※調査レポートはこちら：https://saasus.io/blog/horizontal-saas-api-report

実はこの調査、SaaSus Platformの新規機能「Smart API Gateway
機能」のリリースに合わせた記者発表会のために、限られた時間で進める必要がありました。私と、調査のイニシアチブを取ったもう一人のメンバーは、タイトなスケジュールの中、ロゴを一つひとつ画像検索し、マニュアルを作成し、時には深夜まで目を凝らして調査とレビューを繰り返しました。これは、まさに汗と涙の結晶です。

この記事を通じて、レポートの数字が持つ意味をより深く感じていただければ幸いで]]></description><link>https://tech.anti-pattern.co.jp/1-226zhong-nosaaswodouyatutediao-beta-apiti-gong-zhuang-kuang-repotonowu-tai-li/</link><guid isPermaLink="false">Ghost__Post__68ad691a71fa390001b33c3d</guid><dc:creator><![CDATA[Minami Nogawa]]></dc:creator><pubDate>Mon, 06 Oct 2025 07:57:17 GMT</pubDate><content:encoded><![CDATA[<p/><p>みなさんこんにちは！アンチパターンでSaaSus Platformのマーケティングも担当している野川です！</p><p>先日、私たちは「Horizontal SaaS 1,226種のAPI提供・公開状況」に関する調査レポートを公開しました。本レポートは、日本のSaaS業界におけるAPI提供・公開状況を分析したものです。今回のブログでは、そのレポートでは語りきれなかった「舞台裏」についてお伝えします。</p><p>※調査レポートはこちら：<a href="https://saasus.io/blog/horizontal-saas-api-report">https://saasus.io/blog/horizontal-saas-api-report</a></p><p>実はこの調査、SaaSus Platformの新規機能「Smart API Gateway 機能」のリリースに合わせた記者発表会のために、限られた時間で進める必要がありました。私と、調査のイニシアチブを取ったもう一人のメンバーは、タイトなスケジュールの中、ロゴを一つひとつ画像検索し、マニュアルを作成し、時には深夜まで目を凝らして調査とレビューを繰り返しました。これは、まさに汗と涙の結晶です。</p><p>この記事を通じて、レポートの数字が持つ意味をより深く感じていただければ幸いです。</p><hr><h4 id="1-%E8%AA%BF%E6%9F%BB%E3%81%AE%E5%85%A8%E8%B2%8C%EF%BC%9A%E5%9C%B0%E9%81%93%E3%81%AA%E4%BD%9C%E6%A5%AD%E3%81%AE%E5%A7%8B%E3%81%BE%E3%82%8A">1. 調査の全貌：地道な作業の始まり</h4><p>調査の対象は、SaaS比較サイト「BOXIL」を運営するスマートキャンプ株式会社が公開した「SaaS業界レポート2024」のSaaSカオスマップに掲載されている1,226のHorizontal SaaSです。調査は、私とメンバー、そして調査に協力してくれたチームメンバーで分担して進めました。誰がやっても同じ結果になるように、まず最初に取り掛かったのが「詳細な調査マニュアル」の作成でした。</p><p>ロゴを画像検索して製品URLを特定する。運営会社を調べて本社所在地から国内外を判断する。そして、「製品名 + API」といった検索キーワードを駆使し、APIの有無を確認する...。これらの手順を一つひとつ言語化し、調査メンバーが迷わないように細かく定義しました。</p><p>しかし、現実はマニュアル通りにはいきません。</p><p>例えば、似たようなロゴのサービスが検索に多数ヒットしたり、APIに関する情報がウェブサイトの非常に深い階層に埋もれていたり、そもそもサービスサイトが見つからなかったり。そんな想定外のケースに遭遇するたびに、マニュアルを更新し、判断基準を擦り合わせていきました。メンバーが調査した結果を私たちがレビューする作業も、慎重さが求められるものでした。</p><hr><h4 id="2-%E8%AA%BF%E6%9F%BB%E3%81%A7%E8%A6%8B%E3%81%88%E3%81%A6%E3%81%8D%E3%81%9F%E3%80%8C%E6%97%A5%E6%9C%AC%E3%81%AEsaas%E3%81%AE%E3%83%AA%E3%82%A2%E3%83%AB%E3%80%8D">2. 調査で見えてきた「日本のSaaSのリアル」</h4><p>こうして、膨大な時間をかけて集めたデータを分析する中で、レポートには書ききれなかった「日本のSaaSのリアル」が見えてきました。</p><p>今回の調査で特に印象的だったのは、APIの「発見性の低さ」でした。海外製品の多くは、APIドキュメントへのリンクをウェブサイトのヘッダーやフッター、または専用のデベロッパーページに明確に表示しています。しかし、国内製品では、APIを提供していても、ウェブサイトの深い階層に埋もれているケースが多々ありました。</p><p>これは、APIを積極的にアピールして外部サービスとの連携を促すというよりも、あくまで「付随的な機能」として捉えているようにも感じ、日本のSaaS企業特有の姿勢が垣間見えたように感じました。</p><p>なぜこのような姿勢が生まれるのでしょうか。その背景には、長らく個別カスタマイズを中心としたSIer（システムインテグレーター）が主導してきた日本のIT市場の特性が考えられます。SIerが顧客の要望に合わせてシステムを個別に構築・運用してきたため、サービスをAPIでオープンに連携させて利用するという「エコシステム型」の発想が、海外に比べて定着しにくかった側面があるのではないでしょうか。</p><hr><h4 id="3-%E3%81%BE%E3%81%A8%E3%82%81%EF%BC%9A%E8%AA%BF%E6%9F%BB%E3%82%92%E9%80%9A%E3%81%98%E3%81%A6%E4%BC%9D%E3%81%88%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">3. まとめ：調査を通じて伝えたいこと</h4><p>今回の調査は、日本のSaaS業界にAPIエコノミーの重要性を認識してもらうための一歩です。</p><p>今や、APIは単なる機能ではないと感じています。AIエージェントが台頭するこれからの時代、APIは企業の競争力を左右する重要な要素になると感じています。今回の調査で見えた「APIの価値に対する認識を深めること」が、日本のSaaSがグローバル市場で戦うためのカギとなるのではないでしょうか。</p><p>このブログが、皆さまの中で、API公開の価値について考えるきっかけを醸成できれば幸いです。</p></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[NotebookLMを使って関連法令を整理してみた]]></title><description><![CDATA[こんばんは。atomです。
普段、アンチパターンの法務として活動しているのですが、法律はいっぱいあって会社にどの法律が関係しているか？を管理するのはとても煩雑なので、話題のNotebookLMを使って、関連法令の整理をしてみました。（LM六法と命名しました）

NotebookLMとは？
NotebookLMは、アップロードした資料に基づいて対話ができる、AI搭載のノートブックです。PDFやテキストファイル、Googleドキュメントなどを「ソース」として読み込ませることで、その内容に関する質問に答えたり、要約を作成したり、アイデア出しを手伝ってくれたりします。

今回は、このNotebookLMの機能を活用し、法務業務の効率化を目指します。

やってみたこと：e-Gov法令検索から「社内法令チャットボット」を作る
具体的な手順は非常にシンプルです。

 1. 関連法令のPDFをダウンロードする

まずは、e-Gov法令検索（https://elaws.e-gov.go.jp/）から、自社の事業に深く関連する法令の条文をPDF形式でダウンロードします。

 1. NotebookLMにソ]]></description><link>https://tech.anti-pattern.co.jp/notebook-lmwoshi-tuteguan-lian-fa-ling-wozheng-li-sitemita/</link><guid isPermaLink="false">Ghost__Post__68a8026871fa390001b33c1e</guid><dc:creator><![CDATA[atom]]></dc:creator><pubDate>Thu, 28 Aug 2025 04:58:49 GMT</pubDate><content:encoded><![CDATA[<p>こんばんは。atomです。<br>普段、アンチパターンの法務として活動しているのですが、法律はいっぱいあって会社にどの法律が関係しているか？を管理するのはとても煩雑なので、話題のNotebookLMを使って、関連法令の整理をしてみました。（LM六法と命名しました）</br></p><h3 id="notebooklm%E3%81%A8%E3%81%AF%EF%BC%9F">NotebookLM<strong>とは？</strong></h3><p>NotebookLMは、アップロードした資料に基づいて対話ができる、AI搭載のノートブックです。PDFやテキストファイル、Googleドキュメントなどを「ソース」として読み込ませることで、その内容に関する質問に答えたり、要約を作成したり、アイデア出しを手伝ってくれたりします。</p><p>今回は、このNotebookLMの機能を活用し、法務業務の効率化を目指します。</p><h3 id="%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%93%E3%81%A8%EF%BC%9Ae-gov%E6%B3%95%E4%BB%A4%E6%A4%9C%E7%B4%A2%E3%81%8B%E3%82%89%E3%80%8C%E7%A4%BE%E5%86%85%E6%B3%95%E4%BB%A4%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%80%8D%E3%82%92%E4%BD%9C%E3%82%8B"><strong>やってみたこと：</strong>e-Gov<strong>法令検索から「社内法令チャットボット」を作る</strong></h3><p>具体的な手順は非常にシンプルです。</p><ol><li><strong>関連法令のPDFをダウンロードする</strong></li></ol><p>まずは、e-Gov法令検索（<a href="https://elaws.e-gov.go.jp/">https://elaws.e-gov.go.jp/</a>）から、自社の事業に深く関連する法令の条文をPDF形式でダウンロードします。</p><ol><li>NotebookLM<strong>にソースとしてアップロードする</strong></li></ol><p>次に、NotebookLMを開き、新しいノートブックを作成します。そこに、先ほどダウンロードした法令のPDFファイルをすべてアップロードします。これだけで準備は完了です。</p><p>これだけで、アップロードした法令の範囲内で、質問に答えてくれるチャットボットが完成しました。</p><h3 id="lm%E5%85%AD%E6%B3%95%E3%81%AE%E3%80%8C%E8%89%AF%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%80%8D"><strong>LM六法の「良いところ」</strong></h3><p>実際に使ってみて、特に便利だと感じた点は以下の2つです。</p><h4 id="1-%E4%BA%8B%E6%A1%88%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E9%96%A2%E9%80%A3%E3%81%97%E3%81%9D%E3%81%86%E3%81%AA%E6%B3%95%E4%BB%A4%E3%82%92%E7%9E%AC%E6%99%82%E3%81%AB%E3%83%94%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%86%E5%8F%82%E7%85%A7%E3%81%A7%E3%81%8D%E3%82%8B"><strong>1. 事案に対して関連しそうな法令を瞬時にピックアップ＆参照できる</strong></h4><p>例えば、新しい取引先との契約形態について検討している際に、「この業務委託契約は、偽装請負とみなされるリスクはありますか？」と質問を投げかけたとします。</p><p>するとNotebookLMは、アップロードした労働基準法や職業安定法などの条文の中から、偽装請負の判断基準に関連する箇所を瞬時に探し出し、<strong>参照元（どの法令の第何条か）を明記した上で</strong>回答を生成してくれます。</p><p>法務的な回答を用意する際に、該当する法令を提示するケースも割とありますが、従来であれば、それぞれの法令を一つひとつ確認し、該当箇所を探す必要がありましたが、このプロセスをAIが代行してくれるため、調査の初動にかかる時間を劇的に短縮できます。</p><h4 id="2-%E5%BE%93%E6%A5%AD%E5%93%A1%E3%81%B8%E3%81%AE%E8%AA%AC%E6%98%8E%E7%94%A8%E3%81%AB%E3%80%81%E5%B9%B3%E6%98%93%E3%81%AA%E6%96%87%E7%AB%A0%E3%81%B8%E3%81%AE%E7%BF%BB%E8%A8%B3%E3%82%84%E4%BE%8B%E7%A4%BA%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%82%92%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%9B%E3%82%8B"><strong>2. 従業員への説明用に、平易な文章への翻訳や例示のアイデアを引き出せる</strong></h4><p>法務部門の重要な役割の一つに、従業員への教育や啓発があります。しかし、法令の条文は難解な表現が多く、そのまま伝えてもなかなか理解してもらえません。</p><p>そこでNotebookLMに、わかりやすく解説するように指示を出します。例えば「民法における『悪意』と『善意』の用語の意味を小学生でもわかるように教えて」 といった指示を出すと、非常に分かりやすい言葉で説明文を生成してくれたり、具体的なシナリオを提示してくれたりします（画像は思ったよりも小学生扱いされてます）。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/08/----------2025-08-28-14.41.52.png" class="kg-image" alt="" loading="lazy" width="1376" height="1287" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/08/----------2025-08-28-14.41.52.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/08/----------2025-08-28-14.41.52.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/08/----------2025-08-28-14.41.52.png 1376w" sizes="(min-width: 720px) 720px"/></figure><p>これにより、社内向けの研修資料やマニュアルを作成する際の大きな助けとなりました。</p><h3 id="%E5%BE%AE%E5%A6%99%E3%81%AA%E3%81%A8%E3%81%93%E3%82%8D"><strong>微妙なところ</strong></h3><p>もちろん、良いことばかりではありません。現状の課題も見えてきました。</p><h4 id="1-%E7%B6%99%E7%B6%9A%E7%9A%84%E3%81%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E6%9B%B4%E6%96%B0%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%80%81%E5%8F%A4%E3%81%84%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E3%83%AA%E3%82%B9%E3%82%AF"><strong>1. 継続的なソースの更新が必要で、古い情報を参照するリスク</strong></h4><p>最大の懸念点は、<strong>情報の鮮度</strong>です。法令は頻繁に改正されます。一度PDFをアップロードしても、その後の法改正には対応できません。古い情報のまま参照し続けると、誤った判断を下すリスクがあります。</p><p>これを防ぐためには、法改正の情報をキャッチアップし、定期的に最新の条文PDFをダウンロードしてソースを更新するという、<strong>地道なメンテナンスが不可欠</strong>です。</p><h4 id="2-pdf%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8C%E9%9D%A2%E5%80%92"><strong>2. PDFのダウンロードが面倒</strong></h4><p>e-Gov法令検索から一つひとつPDFをダウンロードする作業は、正直なところ少し手間がかかります。NotebookLMがURLを指定するだけでそのページの内容をソースとして読み込んでくれれば理想的なのですが、e-Gov法令検索のサイト構造が複雑なためか、現状ではうまく機能しませんでした。</p><h3 id="%E4%BB%8A%E5%BE%8C%E3%81%AB%E6%9C%9F%E5%BE%85%EF%BC%9F">今後に期待？</h3><ul><li><strong>従業員にも公開し、簡易的なリーガルチェックツールとして活用</strong></li></ul><p>ソースの鮮度管理を徹底した上で、このNotebookLMを従業員に公開すれば、「法務部に確認する前の一次チェック」として活用できるかもしれません。これにより、現場のコンプライアンス意識向上と、法務部門の業務負荷軽減の両方が期待できます。</p><p>ただ、現状ではあくまでも既存の法令のみを対象としているので、新規事業には向かなそうではあるのと、ソースが条文なので質問の仕方によってはいまいちな感じもあり、現時点では「わかってる人向け」な雰囲気でした。</p><ul><li><strong>法令集と社内規定を組み合わせて、より社内の問い合わせに特化させる</strong></li></ul><p>従業員向けのボットとしてより効果を発揮させるには、法令と社内規定を一つのノートにまとめて運用する方法が良さそうでした。例えば、労働基準法や労働契約法といった法令集に加えて、自社の「就業規則」もソースとして読み込ませれば、「当社の規定では、このケースの残業は認められますか？」といった、より具体的で実践的な質問に答えられるようになります。</p><h4 id="%E3%81%9D%E3%81%AE%E4%BB%96%E6%B4%BB%E7%94%A8%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2"><strong>その他活用アイデア</strong></h4><ul><li><strong>法令の趣旨や概要を「音声出力」でインプット</strong></li></ul><p>NotebookLMには音声出力機能もあります。条文の「趣旨」は、その法令の根幹を理解する上で非常に重要です。概要や制定の背景などを要約させ、移動中や作業中に音声で「聴く」ことで、効率的なインプットが可能です。</p><ul><li><strong>「マインドマップ」で索引的に検索</strong></li></ul><p>「個人情報保護法に関連する概念をマインドマップで整理して」と指示すれば、全体像を視覚的に把握しやすくなります。複雑な法令の構造を理解する上で、強力な助けとなるでしょう。</p><p>ソースの数が多いとうまくいかないことが多いので、うまく分割して出すといい感じになります。僕は目次を作成してから目次でマインドマップを作ってました。気になるところをクリックするとそれに関する情報をくれるので、入力が少なくて楽です。</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeTU8k72XfSglpUBMJfJ3THCwSVlu-twE0TuG4CaJKDNvSMm0LS1lNS4wrFA7Ai0DO9k4yujJl6-wgrQ_RKuKft-y3eK0ttJ1Xbzr_Xvmu2qjLi6qDQl_dLO89-UP1sRP6Xui3k?key=W-mS8hp7Pb7grcpaSFoKIA" class="kg-image" alt="" loading="lazy"/></figure><h3 id="%E3%81%BE%E3%81%A8%E3%82%81"><strong>まとめ</strong></h3><p>NotebookLMを使った「LM六法」の構築は、<strong>情報の鮮度管理という課題はあるものの、法務関連業務を大幅に効率化し、その質を高める可能性を秘めている</strong>と感じました。特に、散在する情報の中から関連箇所を瞬時に探し出す能力や、難解な内容を分かりやすく翻訳する能力は、日々の業務において大きな武器となります。</p><p>現時点では法務担当者が個人的な業務効率化目的で使用するに止まりそうですが、いちいち法令を検索したりする手間をなくして、手元に社内の関連法令を持っておけるだけでもとても便利に感じました！</p>]]></content:encoded></item><item><title><![CDATA[VS Codeでファイル名と行数をコピーできる拡張機能を作成した]]></title><description><![CDATA[最近、GitHub Copilot や Roo Code など、AI を使ってコードを書くことが増えてきました。
プロンプトでなるべく具体的な指示をすることで精度が向上します。
例えば、自分は以下のように書くことが多いです。

「ファイルAのn行目の関数Bを(使用/修正/参考に)してください」

しかし、このプロンプト文を書くのが地味に面倒でした。自分は開発に Visual Studio Code (VS Code) を使用していますが、
ファイル名をコピペ→行数を入力→関数名等をコピペ
のように書いていました。

そこで、ファイル名と行数をまとめてコピーできる拡張機能を作成しました。

作成した拡張機能
 * VS Code Marketplace
   https://marketplace.visualstudio.com/items?itemName=yutakahashi114.copy-with-file-path
   
   
 * GitHub
   https://github.com/yutakahashi114/copy-with-file-path
   
 ]]></description><link>https://tech.anti-pattern.co.jp/vs-code-extension-copy-file-path/</link><guid isPermaLink="false">Ghost__Post__6860c74571fa390001b33b06</guid><category><![CDATA[VSCode]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 02 Jul 2025 04:27:36 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>最近、GitHub Copilot や Roo Code など、AI を使ってコードを書くことが増えてきました。<br>
プロンプトでなるべく具体的な指示をすることで精度が向上します。<br>
例えば、自分は以下のように書くことが多いです。</br></br></p>
<p>「ファイルAのn行目の関数Bを(使用/修正/参考に)してください」</p>
<p>しかし、このプロンプト文を書くのが地味に面倒でした。自分は開発に Visual Studio Code (VS Code) を使用していますが、<br>
ファイル名をコピペ→行数を入力→関数名等をコピペ<br>
のように書いていました。</br></br></p>
<p>そこで、ファイル名と行数をまとめてコピーできる拡張機能を作成しました。</p>
<h2 id="%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD">作成した拡張機能</h2>
<ul>
<li>
<p>VS Code Marketplace<br>
<a href="https://marketplace.visualstudio.com/items?itemName=yutakahashi114.copy-with-file-path">https://marketplace.visualstudio.com/items?itemName=yutakahashi114.copy-with-file-path</a></br></p>
</li>
<li>
<p>GitHub<br>
<a href="https://github.com/yutakahashi114/copy-with-file-path">https://github.com/yutakahashi114/copy-with-file-path</a></br></p>
</li>
</ul>
<p>実装は非常に単純で、以下のようにファイル名と行数を合わせてクリップボードにコピーしています。</p>
<pre><code class="language-ts">function getTextToCopy(relativePath: string, selection: vscode.Selection, selectedText: string): string {
    if (!selectedText) {
        // テキストが選択されていない場合：カーソル位置の行番号のみ
        const currentLine = selection.active.line + 1; // VSCodeの行番号は0ベースなので+1
        return `${relativePath} (line ${currentLine})`;
    }

    // テキストが選択されている場合：選択範囲の行番号を取得
    const startLine = selection.start.line + 1;
    const endLine = selection.end.line + 1;

    if (startLine === endLine) {
        // 単一行の場合
        return `${relativePath} (line ${startLine}) ${selectedText}`;
    }

    // 複数行の場合
    return `${relativePath} (lines ${startLine}-${endLine})
${selectedText}`;
}
</code></pre>
<h2 id="%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8">できること</h2>
<p><code>Cmd+Alt+C</code> (Mac) / <code>Ctrl+Alt+C</code> (Windows/Linux) で、以下のようにファイル名と行数をコピーできます。</p>
<ul>
<li>
<p>テキストを選択していない場合<br>
カーソル位置のファイル名と行数のみをコピー</br></p>
<pre><code>src/extension.ts (line 15)
</code></pre>
</li>
<li>
<p>テキストを選択している場合<br>
選択したテキストとともに、ファイル名と行数をコピー</br></p>
<pre><code>src/extension.ts (line 15) editor
</code></pre>
</li>
<li>
<p>複数行選択している場合<br>
範囲を含む行数情報をコピー</br></p>
<pre><code>src/extension.ts (lines 15-17)
const editor = vscode.window.activeTextEditor;
if (!editor) {
    return;
}
</code></pre>
</li>
</ul>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>この拡張機能を使用してから、プロンプトを書く手間が減りました。細かい指示を書くことを面倒に感じることが少なくなり、結果としてより正確に AI に指示を出すようになり、開発効率が向上しています。<br>
ぜひ一度お試しください。</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Laravel 11でのCORS設定: 環境分離とセキュリティを考慮した実装方法]]></title><description><![CDATA[

こんにちは、いわむらです。

はじめに
Laravel 11がリリースされ、CORS設定の方法に変更がありました。過去のバージョンではconfig/cors.php
ファイルがデフォルトで存在していましたが、Laravel 11では手動で作成する必要があります。

本記事では、Laravel 11における適切なCORS設定方法と、本番環境でも安全に運用できる環境分離の方法について解説します。

Laravel 11でのCORS設定の変更点
Laravel 11では、CORS設定ファイル（config/cors.php
）がデフォルトで含まれなくなりました。過去のバージョンでは、新しいLaravelプロジェクトを作成すると、CORS設定ファイルが最初から存在していました。

設定ファイルの作成
Laravel 11でCORS設定が必要な場合は、以下のコマンドで設定ファイルを作成する必要があります：

php artisan config:publish cors


この変更により、CORSが不要なプロジェクトでは余計なファイルが生成されず、必要な場合のみ明示的に設定を追加することに]]></description><link>https://tech.anti-pattern.co.jp/laravel-11denocorsshe-ding-huan-jing-fen-li-tosekiyuriteiwokao-lu-sitashi-zhuang-fang-fa/</link><guid isPermaLink="false">Ghost__Post__6839893a71fa390001b3389b</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Mon, 30 Jun 2025 06:53:00 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんにちは、いわむらです。</p><h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>Laravel 11がリリースされ、CORS設定の方法に変更がありました。過去のバージョンでは<code>config/cors.php</code>ファイルがデフォルトで存在していましたが、Laravel 11では手動で作成する必要があります。</p><p>本記事では、Laravel 11における適切なCORS設定方法と、本番環境でも安全に運用できる環境分離の方法について解説します。</p><h2 id="laravel-11%E3%81%A7%E3%81%AEcors%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9">Laravel 11でのCORS設定の変更点</h2><p>Laravel 11では、CORS設定ファイル（<code>config/cors.php</code>）がデフォルトで含まれなくなりました。過去のバージョンでは、新しいLaravelプロジェクトを作成すると、CORS設定ファイルが最初から存在していました。</p><h3 id="%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">設定ファイルの作成</h3><p>Laravel 11でCORS設定が必要な場合は、以下のコマンドで設定ファイルを作成する必要があります：</p><pre><code class="language-bash">php artisan config:publish cors
</code></pre><p>この変更により、CORSが不要なプロジェクトでは余計なファイルが生成されず、必要な場合のみ明示的に設定を追加することになります。</p><h2 id="laravel-11%E3%81%A7%E3%81%AE%E6%AD%A3%E3%81%97%E3%81%84cors%E8%A8%AD%E5%AE%9A">Laravel 11での正しいCORS設定</h2><h3 id="%E3%82%B9%E3%83%86%E3%83%83%E3%83%971-cors%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">ステップ1: CORS設定ファイルの作成</h3><p>Laravel 11では、以下のコマンドでCORS設定ファイルを作成できます：</p><pre><code class="language-bash">php artisan config:publish cors
</code></pre><p>このコマンドにより、<code>config/cors.php</code> ファイルが作成されます。</p><h3 id="%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A">ステップ2: 環境変数ベースの設定</h3><p>作成された設定ファイルを環境変数ベースに変更します：</p><pre><code class="language-php">&lt;?php
// config/cors.php

return [
    'paths' =&gt; ['api/*', 'sanctum/csrf-cookie'],

    'allowed_methods' =&gt; ['*'],

    // ❌ 危険な設定
    // 'allowed_origins' =&gt; ['*'],
    
    // ✅ 環境変数ベースの安全な設定
    'allowed_origins' =&gt; [
        env('FRONTEND_URL', 'http://localhost:3000'),
    ],

    'allowed_origins_patterns' =&gt; [],

    'allowed_headers' =&gt; ['*'],

    'exposed_headers' =&gt; [],

    'max_age' =&gt; 0,

    // ✅ 環境に応じて制御
    'supports_credentials' =&gt; env('CORS_SUPPORTS_CREDENTIALS', false),
];
</code></pre><h3 id="%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A">ステップ3: 環境変数の設定</h3><p><code>.env</code> ファイルに適切な環境変数を追加：</p><pre><code class="language-env"># CORS Configuration
FRONTEND_URL=http://localhost:3000
CORS_SUPPORTS_CREDENTIALS=false
</code></pre><h3 id="%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E8%A8%AD%E5%AE%9A%E7%A2%BA%E8%AA%8D">ステップ4: ミドルウェアの設定確認</h3><p>Laravel 11では <code>bootstrap/app.php</code> でミドルウェアが管理されています。CORSミドルウェアは自動的に適用されますが、必要に応じて追加設定も可能です：</p><pre><code class="language-php">&lt;?php
// bootstrap/app.php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    -&gt;withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    -&gt;withMiddleware(function (Middleware $middleware) {
        // Sanctumを使用している場合
        $middleware-&gt;api(prepend: [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        ]);
        
        // 必要に応じてCORSミドルウェアのエイリアス設定
        $middleware-&gt;alias([
            'cors' =&gt; \Illuminate\Http\Middleware\HandleCors::class,
        ]);
    })
    -&gt;withExceptions(function (Exceptions $exceptions) {
        //
    })-&gt;create();
</code></pre><h2 id="%E7%92%B0%E5%A2%83%E5%88%86%E9%9B%A2%E3%81%AE%E6%96%B9%E6%B3%95">環境分離の方法</h2><h3 id="%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83">開発環境</h3><pre><code class="language-env"># .env (開発環境)
FRONTEND_URL=http://localhost:3000
CORS_SUPPORTS_CREDENTIALS=false
</code></pre><h3 id="%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E7%92%B0%E5%A2%83">ステージング環境</h3><pre><code class="language-env"># .env (ステージング環境)
FRONTEND_URL=https://staging-app.example.com
CORS_SUPPORTS_CREDENTIALS=true
</code></pre><h3 id="%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83">本番環境</h3><pre><code class="language-env"># .env (本番環境)
FRONTEND_URL=https://app.example.com
CORS_SUPPORTS_CREDENTIALS=true
</code></pre><h3 id="%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88">複数のフロントエンドドメインがある場合</h3><p>管理画面など、複数のフロントエンドがある場合の設定例：</p><pre><code class="language-php">// config/cors.php
'allowed_origins' =&gt; [
    env('FRONTEND_URL'),
    env('ADMIN_FRONTEND_URL'),
    // 本番環境で複数のサブドメインを許可する場合
    'https://admin.example.com',
],
</code></pre><pre><code class="language-env"># .env
FRONTEND_URL=https://app.example.com
ADMIN_FRONTEND_URL=https://admin.example.com
</code></pre><h2 id="%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E4%B8%8A%E3%81%AE%E9%87%8D%E8%A6%81%E3%81%AA%E6%B3%A8%E6%84%8F%E7%82%B9">セキュリティ上の重要な注意点</h2><h3 id="1-%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%9B%9E%E9%81%BF">1. ワイルドカード設定の回避</h3><pre><code class="language-php">// ❌ 本番環境では絶対に使用しない
'allowed_origins' =&gt; ['*'],

// ✅ 明示的にドメインを指定
'allowed_origins' =&gt; [
    env('FRONTEND_URL'),
    // 必要に応じて追加のドメイン
    'https://admin.example.com',
],
</code></pre><h3 id="2-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E9%81%A9%E5%88%87%E3%81%AA%E7%AE%A1%E7%90%86">2. 認証情報の適切な管理</h3><pre><code class="language-php">// 認証が必要なAPIの場合
'supports_credentials' =&gt; env('CORS_SUPPORTS_CREDENTIALS', true),

// 公開APIの場合
'supports_credentials' =&gt; false,
</code></pre><p>認証情報を含むリクエスト（Cookie、Authorization ヘッダーなど）を扱う場合は、<code>supports_credentials</code> を <code>true</code> に設定し、<code>allowed_origins</code> にワイルドカード（<code>*</code>）は使用できません。</p><h3 id="3-%E3%83%91%E3%82%B9%E3%81%AE%E9%99%90%E5%AE%9A">3. パスの限定</h3><pre><code class="language-php">// 必要最小限のパスのみ許可
'paths' =&gt; [
    'api/*',           // APIルート
    'sanctum/csrf-cookie', // CSRF保護用（Sanctum使用時）
],
</code></pre><h2 id="%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E3%81%A8%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">動作確認とトラブルシューティング</h2><h3 id="%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">テスト用エンドポイントの作成</h3><p>設定が正しく動作しているか確認するため、テスト用APIエンドポイントを作成します：</p><pre><code class="language-php">&lt;?php
// routes/api.php

use Illuminate\Support\Facades\Route;

Route::get('/test-cors', function () {
    return response()-&gt;json([
        'message' =&gt; 'CORS is working!',
        'timestamp' =&gt; now(),
        'origin' =&gt; request()-&gt;header('Origin'),
    ]);
});
</code></pre><h3 id="%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E5%AF%BE%E5%87%A6%E6%B3%95">よくある問題と対処法</h3><p><strong>1. プリフライトリクエスト（OPTIONS）が失敗する</strong></p><pre><code class="language-javascript">// フロントエンドでのテスト例
fetch('http://your-api.com/api/test-cors', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer your-token'
    },
    body: JSON.stringify({ test: 'data' })
})
</code></pre><p>この場合、ブラウザは自動的にOPTIONSリクエストを送信します。<code>allowed_methods</code> に <code>['*']</code> または <code>['POST', 'OPTIONS']</code> が含まれていることを確認してください。</p><p><strong>2. 認証情報付きリクエストが失敗する</strong></p><pre><code class="language-javascript">// 認証情報を含むリクエスト
fetch('http://your-api.com/api/user', {
    method: 'GET',
    credentials: 'include', // これが重要
    headers: {
        'Authorization': 'Bearer your-token'
    }
})
</code></pre><p>この場合、<code>supports_credentials</code> が <code>true</code> に設定されており、<code>allowed_origins</code> にワイルドカードが使用されていないことを確認してください。</p><h3 id="%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A">デバッグ用の設定</h3><p>開発中にCORSの動作を詳しく確認したい場合：</p><pre><code class="language-php">// config/cors.php (開発環境でのデバッグ用)
return [
    'paths' =&gt; ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' =&gt; ['*'],
    'allowed_origins' =&gt; [
        env('FRONTEND_URL', 'http://localhost:3000'),
    ],
    'allowed_origins_patterns' =&gt; [],
    'allowed_headers' =&gt; ['*'],
    'exposed_headers' =&gt; ['X-Debug-Info'], // デバッグ情報用
    'max_age' =&gt; 0, // キャッシュ無効（開発時）
    'supports_credentials' =&gt; env('CORS_SUPPORTS_CREDENTIALS', false),
];
</code></pre><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>Laravel 11でのCORS設定は、フレームワーク標準の機能を使用することで以下のメリットを得られます：</p><p><strong>保守性の向上</strong></p><ul><li>設定ファイルの手動作成により、不要な設定を排除</li><li>環境変数による柔軟な設定管理</li></ul><p><strong>セキュリティの強化</strong></p><ul><li>明示的なドメイン指定によるセキュリティリスクの軽減</li><li>環境ごとの適切な認証情報管理</li></ul><p><strong>運用の安全性</strong></p><ul><li>環境分離による設定ミスの防止</li><li>本番環境での意図しないアクセス許可の回避</li></ul><p>特に本番環境では、ワイルドカードの使用を避け、必要最小限のドメインのみを許可することが重要です。開発段階から環境変数ベースの設定を心がけることで、安全で保守性の高いAPIを構築できます。</p><p>CORS設定は一度正しく設定すれば、基本的にメンテナンスの必要がない部分です。しかし、新しいフロントエンドドメインの追加や、認証方式の変更時には設定の見直しが必要になるため、この記事を参考に適切な設定を維持してください。</p><h2 id="%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</h2><ul><li><a href="https://laravel.com/docs/11.x/routing#cors">Laravel 11 Documentation - CORS</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">MDN Web Docs - CORS</a></li><li><a href="https://laravel.com/docs/11.x/sanctum">Laravel Sanctum Documentation</a></li></ul>]]></content:encoded></item><item><title><![CDATA[RooCodeとGitHub MCP ServerでPRレビュー対応を変えてみる]]></title><description><![CDATA[

こんにちは、いわむらです。

プルリクエスト（PR）のレビューコメントを確認・整理したい時、GitHub上でひとつひとつ確認するのは面倒だなぁと思い、最初はGitHub
CLIを使ったらコメントをローカルで確認できてまとめて参照できるんじゃないか？と思い試行錯誤していました。

でも、複雑なシェルスクリプトを書いたりjqコマンドを駆使したりと、なかなか複雑なのができあがっちゃいました...。そんな時にRooCodeとGitHubのMCP
Serverの組み合わせを試してみたら、簡単にレビューコメントの整理ができるようになったので、ブログにしてみました。

解決したかった課題
PRレビュー対応で困っていたのは以下のような点でした：

 1. レビューコメントの見落とし: GitHub上で複数のコメントを確認していると、対応漏れが発生しやすい
 2. 優先度の判断: どのコメントから対応すべきか判断に時間がかかる
 3. 進捗管理の難しさ: どこまで対応したか把握しにくい
 4. 作業時間の見積もり: 全体の作業量が見えにくい

これらの課題を解決するために、レビューコメントを自動で整]]></description><link>https://tech.anti-pattern.co.jp/github-clideprrebiyukomentowoxiao-lu-de-nichou-chu-surufang-fa/</link><guid isPermaLink="false">Ghost__Post__684abf1c71fa390001b33a88</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Tue, 17 Jun 2025 04:52:32 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんにちは、いわむらです。</p><p>プルリクエスト（PR）のレビューコメントを確認・整理したい時、GitHub上でひとつひとつ確認するのは面倒だなぁと思い、最初はGitHub CLIを使ったらコメントをローカルで確認できてまとめて参照できるんじゃないか？と思い試行錯誤していました。</p><p>でも、複雑なシェルスクリプトを書いたりjqコマンドを駆使したりと、なかなか複雑なのができあがっちゃいました...。そんな時にRooCodeとGitHubのMCP Serverの組み合わせを試してみたら、簡単にレビューコメントの整理ができるようになったので、ブログにしてみました。</p><h2 id="%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E8%AA%B2%E9%A1%8C">解決したかった課題</h2><p>PRレビュー対応で困っていたのは以下のような点でした：</p><ol><li><strong>レビューコメントの見落とし</strong>: GitHub上で複数のコメントを確認していると、対応漏れが発生しやすい</li><li><strong>優先度の判断</strong>: どのコメントから対応すべきか判断に時間がかかる</li><li><strong>進捗管理の難しさ</strong>: どこまで対応したか把握しにくい</li><li><strong>作業時間の見積もり</strong>: 全体の作業量が見えにくい</li></ol><p>これらの課題を解決するために、レビューコメントを自動で整理し、優先度付きのチェックリストを作成できる仕組みを探していました。</p><h2 id="%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95">セットアップ方法</h2><p>今回はRooCode 3.20のMarketplace機能を使用してGitHub MCPを追加しました。</p><h3 id="roocode-marketplace%E6%A9%9F%E8%83%BD%E3%81%AE%E5%88%A9%E7%94%A8">RooCode Marketplace機能の利用</h3><p>RooCode 3.20で導入されたMarketplace機能を使用すると、簡単にGitHub MCPを追加できます：</p><ol><li>RooCode 3.20以降を使用</li><li>MarketplaceからGitHub MCPを検索・追加</li><li>Personal Access Tokenを設定（repo権限が必要）</li><li>接続確認</li></ol><p>セットアップは非常にシンプルで、数分で完了しました。</p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E7%B5%90%E6%9E%9C">実際に試してみた結果</h2><h3 id="%E6%9C%80%E5%88%9D%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%EF%BC%9A%E7%B0%A1%E5%8D%98%E3%81%AA%E6%8C%87%E7%A4%BA">最初のアプローチ：簡単な指示</h3><p>セットアップ完了後、まずは以下のような簡単な指示を試してみました：</p><pre><code>"PRレビューコメントを確認して対応リストを作成して"
</code></pre><p><strong>結果</strong>: 一般的なPRレビュー対応のテンプレートやガイドラインが生成されました。これはこれで有用でしたが、具体的なPRのレビューコメントは取得されず、汎用的なチェックリストが作成されるに留まりました。</p><h3 id="%E6%94%B9%E5%96%84%E3%81%97%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%EF%BC%9A%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E6%8C%87%E7%A4%BA">改善したアプローチ：具体的な指示</h3><p>次に、より具体的な指示を試してみました：</p><pre><code>"todo-appの現在のブランチのPRを参照してレビューコメントを全て取得して修正のチェックリストを作成して"
</code></pre><p><strong>結果</strong>: 実際のPRのレビューコメントを取得・分析し、具体的な修正項目を含むチェックリストが生成されました。</p><h2 id="%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E6%88%90%E6%9E%9C">得られた成果</h2><h3 id="%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%87%A6%E7%90%86%E3%83%95%E3%83%AD%E3%83%BC">自動化された処理フロー</h3><p>具体的な指示を出すと、以下のような処理が自動で実行されました：</p><ol><li>現在のブランチを確認 → feature/todo-refactor</li><li>該当するPRを検索 → PR #123を発見</li><li>レビューコメントを取得 → 11件の個別コメント + 複数の総合レビュー</li><li>詳細なチェックリストを生成 → 6つの主要な修正項目を優先度別に分類</li></ol><p>これまでGitHub画面を行き来していた作業が、一瞬で完了しました。</p><h3 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A4%9C%E8%A8%BC%EF%BC%9Atodo-app%E3%81%A7%E3%81%AE%E7%B5%90%E6%9E%9C">実際の検証：todo-appでの結果</h3><p>ブログ執筆中に実際に以下の指示を試してみました：</p><pre><code>"todo-appの現在のブランチのPRを参照してレビューコメントを全て取得して修正のチェックリストを作成して"
</code></pre><p><strong>結果</strong>: PR #123のレビューコメント13件を分析し、以下のような実用的なチェックリストが生成されました：</p><p><strong>高優先度（即座に修正が必要）</strong></p><ul><li>src/components/TodoList.tsx: useEffectの依存配列が不完全でバグの原因となる可能性</li><li>src/api/todoApi.ts: API呼び出し時のエラーハンドリングが不十分</li></ul><p><strong>中優先度（改善推奨）</strong></p><ul><li>src/types/todo.ts: TypeScript型定義の厳密化（any型の使用を避ける）</li><li>src/utils/validation.ts: 複雑なロジックにコメントを追加</li><li>src/hooks/useTodos.ts: 状態管理のロジック改善</li><li>src/components/TodoItem.tsx: 変数名をより分かりやすく改善</li></ul><p>レビュアーの意図や背景も含めて分析され、単なるコメントの羅列ではなく、実際に作業しやすい形で整理されていました。</p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%84%9F%E3%81%98%E3%81%9F%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">実際に感じたメリット</h2><h3 id="%E5%8A%B9%E7%8E%87%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A">効率性の向上</h3><ul><li><strong>手動作業の削減</strong>: GitHub画面を行き来する必要がなくなった</li><li><strong>見落としの防止</strong>: 全てのコメントが確実に一覧化される</li><li><strong>優先度の明確化</strong>: 重要度に応じた対応順序が自動で判断される</li></ul><h3 id="%E4%BD%9C%E6%A5%AD%E3%81%AE%E8%B3%AA%E3%81%AE%E5%90%91%E4%B8%8A">作業の質の向上</h3><ul><li><strong>ファイルパスの明示</strong>: 該当箇所をすぐに特定できる</li><li><strong>進捗管理の簡素化</strong>: チェックボックスで対応状況を追跡</li><li><strong>作業量の把握</strong>: 全体の作業時間を事前に見積もれる</li></ul><h2 id="%E6%B4%BB%E7%94%A8%E3%81%AE%E3%82%B3%E3%83%84">活用のコツ</h2><h3 id="%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AA%E6%8C%87%E7%A4%BA%E3%81%AE%E5%87%BA%E3%81%97%E6%96%B9">効果的な指示の出し方</h3><p><strong>汎用的なガイドラインが欲しい場合</strong>:</p><pre><code>"PRレビューコメントを確認して対応リストを作成して"
</code></pre><p>新しいプロジェクトでのプロセス構築や、チーム内での標準化に有効です。</p><p><strong>具体的なPRの対応リストが欲しい場合</strong>:</p><pre><code>"[リポジトリ名]の現在のブランチのPRを参照してレビューコメントを全て取得して修正のチェックリストを作成して"
</code></pre><p>現在進行中のPRの対応や、緊急性の高い修正作業の整理に有効です。</p><h3 id="%E6%AE%B5%E9%9A%8E%E7%9A%84%E3%81%AA%E5%87%A6%E7%90%86%E3%81%AE%E6%B4%BB%E7%94%A8">段階的な処理の活用</h3><p>具体的な指示を出すと、処理の各段階が可視化されるため、何が行われているかを把握しやすくなります。これにより、問題が発生した場合の原因特定も容易になります。</p><h3 id="mcp%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%95%E3%82%92%E5%AE%9F%E6%84%9F%E3%81%97%E3%81%9F%E4%BD%93%E9%A8%93">MCPの便利さを実感した体験</h3><p>今回の検証を通じて、MCPの真の価値を実感することができました。</p><p>今までは「APIのドキュメントを読む→必要な設定→エンドポイント呼び出し→JSONパース→データ整理→優先度判断」という複数のステップが必要でしたが、MCPを使うことで「ほんのちょっとの指示」だけで全てが完了します。</p><p>技術的な複雑さを抽象化し、問題解決に集中しやすくなる感じがしました。</p><h2 id="%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</h2><ul><li><a href="https://roocode.com/">RooCode 公式サイト</a></li><li><a href="https://github.com/github/github-mcp-server">GitHub MCP Server（公式）</a></li><li><a href="https://modelcontextprotocol.io/">Model Context Protocol 公式ドキュメント</a></li></ul>]]></content:encoded></item><item><title><![CDATA[ネットワーク機器が恋しくて]]></title><description><![CDATA[最近はAWSばかり使っているので、オンプレミスのネットワーク構築はしなくなってしまったのですが、たまにネットワーク機器と戯れたくなることがあります。みなさんも同じだと思います。そんな方には、Cisco
Packet Tracerをおすすめします！

「ネットワーク構築と言ったらYAMAHAでしょ！」という方や、「電源をつけたときのファンの音が好きなんだ！」という方は、お楽しみいただけないのでこのブログは対象外です。すぐブラウザの閉じるボタンを押してください。

まだ閉じていない方は、こちらからCisco Packet Tracerをダウンロードしてください。
https://www.netacad.com/articles/news/download-cisco-packet-tracer
※ダウンロードにはログインが必要となるので、無料のアカウントを作成してください。

同じようなソフトウェアにGNS3もあります。こちらを利用するときは、IOS（iPhoneのOSじゃないですよ、Ciscoのネットワーク機器用のOSです）のイメージファイルが必要です。ググるとイメージファイルが転がって]]></description><link>https://tech.anti-pattern.co.jp/network-ga-koishikute/</link><guid isPermaLink="false">Ghost__Post__683f360f71fa390001b338a8</guid><category><![CDATA[Cisco]]></category><category><![CDATA[Cisco Packet Tracer]]></category><category><![CDATA[GNS3]]></category><category><![CDATA[ping]]></category><category><![CDATA[Simulation]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Tue, 03 Jun 2025 19:24:32 GMT</pubDate><content:encoded><![CDATA[<p>最近はAWSばかり使っているので、オンプレミスのネットワーク構築はしなくなってしまったのですが、たまにネットワーク機器と戯れたくなることがあります。みなさんも同じだと思います。そんな方には、Cisco Packet Tracerをおすすめします！</p><p>「ネットワーク構築と言ったらYAMAHAでしょ！」という方や、「電源をつけたときのファンの音が好きなんだ！」という方は、お楽しみいただけないのでこのブログは対象外です。すぐブラウザの閉じるボタンを押してください。</p><p>まだ閉じていない方は、こちらからCisco Packet Tracerをダウンロードしてください。<br><a href="https://www.netacad.com/articles/news/download-cisco-packet-tracer">https://www.netacad.com/articles/news/download-cisco-packet-tracer</a><br>※ダウンロードにはログインが必要となるので、無料のアカウントを作成してください。</br></br></p><p>同じようなソフトウェアにGNS3もあります。こちらを利用するときは、IOS（iPhoneのOSじゃないですよ、Ciscoのネットワーク機器用のOSです）のイメージファイルが必要です。ググるとイメージファイルが転がっているかもしれませんが、これ使ったら著作権的にあれです。みなさんの家にはCiscoの実機があるかもしれませんが、私は持ってなかったので、以前は実機を購入しました。でも、Cisco Packet Tracerならそんなことは気にする必要がありません！</p><p>ダウンロード出来たら早速起動してきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/image.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/image.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/image.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>画面はこんな感じです。<br>使い方は、真ん中の白いところが作業スペースです。左下にある機器のアイコンを作業スペースに置いていくと、ネットワークのシミュレーションが出来ます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.24.21-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.24.21-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.24.21-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.24.21-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.24.21-1.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>左下の使い方を見ていきます。<br>オレンジ色の所はこんな階層になってます。（一部省略してます）<br>Network Devices<br>　Routers<br>　Switches<br>　Hubs<br>End Devices<br>　End Devices<br>　Home<br>Components<br>　Boards<br>　Actuators<br>Connections<br>　Connections<br>などがあります。</br></br></br></br></br></br></br></br></br></br></br></br></br></br></p><p>それでは簡単なネットワークを作って、疎通させてみます。<br>L2スイッチ2台と、PC2台を置いて、pingで通信出来るね。をやります。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.28.09.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.28.09.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.28.09.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.28.09.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.28.09.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>みなさんが大好きなL2スイッチ。Cisco Catalyst 2960を2台置いてみました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.30.30.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.30.30.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.30.30.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.30.30.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.30.30.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>PCを2台置いてみました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.35.07.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.35.07.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.35.07.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.35.07.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.35.07.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>結線していきます。<br>Copper Straight-Throughを選択。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.36.17.png" class="kg-image" alt="" loading="lazy" width="1920" height="1055" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.36.17.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.36.17.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.36.17.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.36.17.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>線を選んだら、Cisco Catalyst 2960を選択します。<br>このCisco Catalyst 2960はポートが1+24+2個あるので、その中からFastEthernet1を選択していきます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.43.41.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.43.41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.43.41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.43.41.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.43.41.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>こんな結線をします。<br>Switch0 FastEthernet0/1 - Switch1 FastEthernet0/1<br>Switch0 FastEthernet0/2 - PC0 FastEthernet0<br>Switch1 FastEthernet0/2 - PC1 FastEthernet0<br>※結線してすぐはオレンジ色の△が出てますが、しばらくするとポートが使えるようになって、緑色の△になります。</br></br></br></br></p><p>PC0とPC1でpingの疎通確認をしたいので、PC0とPC1にIPv4アドレスを設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.46.58.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.46.58.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.46.58.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>PC0をクリックすると、設定画面がでてきます。<br>ConfigタブからIPアドレスを設定します。<br>こんな設定をします。同様にPC1も設定します。<br>PC0<br>　IPv4 Address:192.168.0.1<br>　Subnet Mask:255.255.255.0<br>PC1<br>　IPv4 Address:192.168.0.2<br>　Subnet Mask:255.255.255.0</br></br></br></br></br></br></br></br></p><p>では、コマンドプロンプトからpingしてみます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.50.40.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.50.40.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.50.40.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>PC0をクリックして、DesktopタブからCommand Promptを開きます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.53.46.png" class="kg-image" alt="" loading="lazy" width="812" height="820" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.53.46.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.53.46.png 812w" sizes="(min-width: 720px) 720px"/></figure><p>疎通出来てますね。<br>これだけだと面白くないので、パケットが届くところを見てみたいと思います。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.58.04.png" class="kg-image" alt="" loading="lazy" width="1920" height="1080" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/06/----------2025-06-04-3.58.04.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/06/----------2025-06-04-3.58.04.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/06/----------2025-06-04-3.58.04.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/----------2025-06-04-3.58.04.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>View - Simulation Mode（右下の方のSimulationボタンを押してもOKです） を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/06/a1.gif" class="kg-image" alt="" loading="lazy" width="360" height="240"/></figure><p>パケットがCisco Catalyst 2960 2台を経由して、通信先のPCに届いているのが見えますね。<br>画面右のシミュレーションウインドウで、パケットの中身を見ることも出来ます。</br></p><p>これでCiscoのネットワーク機器を弄り放題ですね！好きなだけお楽しみ下さい！！</p>]]></content:encoded></item><item><title><![CDATA[Maven War Plugin：warファイル生成のカスタマイズ]]></title><description><![CDATA[はじめに
こんにちは、Anti-Pattern Inc.の塚本です。

参画したプロジェクトで、Mavenアプリケーションでアーカイブを作成したくないご要望があったので、その際に調べたtipsを共有します。

SampleAppをmavenでpackageする場合
SampleAppというアプリケーションをmavenでpackageする場合、このようなディレクトリが生成されます。今回は、コンパイルだけして、SampleApp.warを作らない設定方法について説明します。

プロジェクトディレクトリ
 - target
   SampleApp
   SampleApp.war
   classes
   generated-sources
   maven-archiver
   maven-status


Maven の Package フェーズとは
Maven
のビルドライフサイクルには複数のフェーズがあります。このフェーズでは、コンパイルされたコードやリソースファイルをディストリビューション形式(JAR、WAR
など)にパッケージングします。

mvn package コマンド]]></description><link>https://tech.anti-pattern.co.jp/maven-pomhuairudewarhuairuwozuo-cheng-sinaifang-fa/</link><guid isPermaLink="false">Ghost__Post__67a2d7be27e5640001681de1</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Wed, 21 May 2025 09:44:01 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2>
<p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>参画したプロジェクトで、Mavenアプリケーションでアーカイブを作成したくないご要望があったので、その際に調べたtipsを共有します。</p>
<h2 id="sampleapp%E3%82%92maven%E3%81%A7package%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88">SampleAppをmavenでpackageする場合</h2>
<p>SampleAppというアプリケーションをmavenでpackageする場合、このようなディレクトリが生成されます。今回は、コンパイルだけして、SampleApp.warを作らない設定方法について説明します。</p>
<pre><code>プロジェクトディレクトリ
 - target
   SampleApp
   SampleApp.war
   classes
   generated-sources
   maven-archiver
   maven-status
</code></pre>
<h2 id="maven-%E3%81%AE-package-%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA%E3%81%A8%E3%81%AF">Maven の Package フェーズとは</h2>
<p>Maven のビルドライフサイクルには複数のフェーズがあります。このフェーズでは、コンパイルされたコードやリソースファイルをディストリビューション形式(JAR、WAR など)にパッケージングします。</p>
<p>mvn package コマンドを実行すると、以下のようなことが行われます:</p>
<ul>
<li>ソースコードのコンパイル</li>
<li>テストの実行</li>
<li>プロジェクト成果物(アーティファクト)のパッケージング</li>
</ul>
<p>pom.xmlのpackagingタグの設定によりますが、Web アプリケーションの場合、この成果物は通常 WARファイルとなります。</p>
<h2 id="maven-war-plugin-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">maven-war-plugin について</h2>
<p>maven-war-plugin は、Java Web アプリケーションを WAR ファイルにパッケージングするための Maven プラグインです。以下は、今回対応したpom.xmlのサンプルです。</p>
<pre><code class="language-xml">&lt;pluginManagement&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
            &lt;version&gt;2.1.1&lt;/version&gt;
            &lt;configuration&gt;
                &lt;failOnMissingWebXml&gt;false&lt;/failOnMissingWebXml&gt;
                &lt;webResources&gt;
                    &lt;resource&gt;
                        &lt;directory&gt;${project.basedir}/src/main/webapp&lt;/directory&gt;
                    &lt;/resource&gt;
                &lt;/webResources&gt;                    
            &lt;/configuration&gt;
        &lt;!-- コメントインするとwarファイルを作成しない
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;default-war&lt;/id&gt;
                    &lt;phase&gt;none&lt;/phase&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;war-exploded&lt;/id&gt;
                    &lt;phase&gt;package&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;exploded&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        --&gt;
        &lt;/plugin&gt;            
    &lt;/plugins&gt;
&lt;/pluginManagement&gt;
</code></pre>
<h3 id="configuration-%E8%A6%81%E7%B4%A0">configuration 要素</h3>
<ul>
<li><code>failOnMissingWebXml</code>: <code>false</code> に設定することで、<code>web.xml</code> ファイルが存在しなくてもビルドが失敗しないようにします。Servlet 3.0 以降では <code>web.xml</code> が必須ではなくなったため、この設定が便利です。</li>
<li><code>webResources</code>: WAR ファイルに含めるリソースを指定します。
<ul>
<li><code>resource</code>: リソースの場所を指定します。</li>
<li><code>directory</code>: リソースが格納されているディレクトリのパスを指定します。この例では <code>${project.basedir}/src/main/webapp</code> を指定しています。</li>
</ul>
</li>
</ul>
<h3 id="executions-%E8%A6%81%E7%B4%A0%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88%E9%83%A8%E5%88%86">executions 要素(コメントアウト部分)</h3>
<p>この部分はコメントアウトされていますが、コメントインすると以下の動作をします:</p>
<ul>
<li><code>default-war</code> 実行を無効化(<code>phase</code> を <code>none</code> に設定)
<ul>
<li>通常の WAR ファイル生成プロセスを無効にします</li>
</ul>
</li>
<li><code>war-exploded</code> 実行を有効化
<ul>
<li><code>package</code> フェーズで <code>exploded</code> ゴールを実行します</li>
<li><code>exploded</code> ゴールは展開された状態(ディレクトリ構造)の WAR を生成します</li>
<li>これにより、WAR ファイル(*.war)は作成されず、展開済みディレクトリのみが生成されます</li>
</ul>
</li>
</ul>
<h2 id="exploded-war-%E3%81%A8%E3%81%AF">exploded WAR とは</h2>
<p>展開された(exploded)WAR とは、圧縮された単一の WAR ファイルではなく、同じ内容がディレクトリ構造として展開された状態を指します。これには以下のようなメリットがあります:</p>
<ul>
<li>開発効率の向上: ファイルを変更した場合、WAR ファイル全体を再デプロイする必要がなく、変更したファイルだけを置き換えることができます</li>
<li>デバッグのしやすさ: 実行中のアプリケーションのファイルに直接アクセスできるため、問題の診断が容易になります</li>
<li>ホットデプロイの容易さ: 多くのアプリケーションサーバーでは、展開された状態のアプリケーションはホットデプロイ(再起動なしの更新)が容易です</li>
</ul>
<p>今回は生成AIを使って調べたのですが、以下のサイトも参考にさせていただきました:</p>
<blockquote>
<p><a href="https://stackoverflow.com/questions/352612/how-to-get-maven-to-run-warexploded-but-not-warwar">https://stackoverflow.com/questions/352612/how-to-get-maven-to-run-warexploded-but-not-warwar</a></p>
</blockquote>
<!--kg-card-end: markdown--><p/>]]></content:encoded></item><item><title><![CDATA[認定スクラムマスター研修を受講して]]></title><description><![CDATA[こんにちは。アンチパターンの安澤です。
アンチパターンではSaaSus Platform
の開発をアジャイルで進めていますが、最近「本当にアジャイルに開発できているのか？」という漠然としたモヤモヤを感じていました。

そんな中、株式会社アトラクタが実施する認定スクラムマスター研修を受講し、Certified ScrumMaster（CSM）資格
に無事合格しました。今回はその研修を通じて得た学びや気づきをまとめてみたいと思います。

認定スクラムマスター（CSM）とは
Certified ScrumMaster（CSM）は、スクラムの基本を体系的に学べる入門資格で、Scrum
Allianceが認定しています。スクラムマスターとして必要な知識とマインドセットを習得できます。

Scrum Allianceが提供するスクラムマスター向けの資格には、CSMのほかに上位資格として次の2つが用意されています：

 * Advanced Certified ScrumMaster（A-CSM）
 * Certified Scrum Professional - ScrumMaster（CSP-S]]></description><link>https://tech.anti-pattern.co.jp/ren-ding-sukuramumasutayan-xiu-woshou-ketemita/</link><guid isPermaLink="false">Ghost__Post__681ef6ff71fa390001b3366a</guid><dc:creator><![CDATA[Akira Yasuzawa]]></dc:creator><pubDate>Wed, 14 May 2025 02:03:29 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。アンチパターンの安澤です。<br>アンチパターンではSaaSus Platform の開発をアジャイルで進めていますが、最近「本当にアジャイルに開発できているのか？」という漠然としたモヤモヤを感じていました。</br></p><p>そんな中、株式会社アトラクタが実施する認定スクラムマスター研修を受講し、<strong>Certified ScrumMaster（CSM）資格</strong>に無事合格しました。今回はその研修を通じて得た学びや気づきをまとめてみたいと思います。</p><h2 id="%E8%AA%8D%E5%AE%9A%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%EF%BC%88csm%EF%BC%89%E3%81%A8%E3%81%AF">認定スクラムマスター（CSM）とは</h2><p>Certified ScrumMaster（CSM）は、<strong>スクラムの基本を体系的に学べる入門資格</strong>で、Scrum Allianceが認定しています。スクラムマスターとして必要な知識とマインドセットを習得できます。</p><p>Scrum Allianceが提供するスクラムマスター向けの資格には、CSMのほかに上位資格として次の2つが用意されています：</p><ul><li>Advanced Certified ScrumMaster（A-CSM）</li><li>Certified Scrum Professional - ScrumMaster（CSP-SM）</li></ul><p>上位資格の受験には、CSM取得後にそれぞれ12〜24ヶ月の実務経験が必要です。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.scrumalliance.org/get-certified/scrum-master-track"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Scrum Master Certifications | CSM, A-CSM, &amp; CSP-SM</div><div class="kg-bookmark-description">With our Scrum Master Track, you can become a skilled scrum master with a clear path to advancing your career through our CSM, A-CSM, &amp; CSP-SM courses.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.scrumalliance.org/favicon.ico"><span class="kg-bookmark-author">CSM, A-CSM, &amp; CSP-SM</span><span class="kg-bookmark-publisher">Certified ScrumMaster student</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.scrumalliance.org/images/default-source/widget-icons/how-to-choose-between-csm-and-cspo"/></div></a></figure><h2 id="%E7%A0%94%E4%BF%AE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">研修について</h2><p>今回受講したCSM研修は、<strong>全3日間・各日13:00〜18:30のオンライン形式</strong>で行われました。参加者は約25名で、6人前後のチームに分かれてのグループワークも多く、講義と実践がバランスよく構成されていました。</p><h3 id="1%E6%97%A5%E7%9B%AE%EF%BC%9A%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%A8%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%90%86%E8%A7%A3">1日目：アジャイルとスクラムの基本理解</h3><p>初日は、アジャイル開発の背景やスクラムのフレームワークについての座学が中心。グループワークもあり、参加者同士のアイスブレイクにもなりました。</p><h3 id="2%E6%97%A5%E7%9B%AE%EF%BC%9A%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%AF%E3%83%BC%E3%82%AF">2日目：スクラムの実践ワーク</h3><p>2日目は、実際にチームでスプリントを回す体験型ワーク。限られた時間の中で、計画からレビューまでを一通り体験することで、スクラムの流れを肌で感じることができました。</p><h3 id="3%E6%97%A5%E7%9B%AE%EF%BC%9A%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E5%BD%B9%E5%89%B2%E3%81%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AB%E3%82%B9">3日目：スクラムマスターの役割にフォーカス</h3><p>最終日はスクラムマスターに焦点を当てた講義。現場での立ち回り方や心構え、支援のスタンスなど、実務に役立つ知見が多く得られました。</p><h2 id="%E5%AD%A6%E3%82%93%E3%81%A0%E3%81%93%E3%81%A8">学んだこと</h2><p>今回の研修ではたくさんの気づきや学びがありましたが、私が特に大切だと感じたことを3つ選びました。</p><h3 id="%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%84%E3%81%86%E5%8D%98%E8%AA%9E">アジャイルという単語</h3><p>アジャイルソフトウェア開発宣言には、アジャイルのマインドセットとして<strong>4つの価値と12の原則</strong>が示されています。アジャイル開発とは、これらに基づいてチームやプロセスを継続的に改善しながら価値を提供し続けることです。</p><p>興味深かったのは、<strong>「アジャイル」は名詞ではなく形容詞である</strong>という考え方です。つまり、アジャイルかどうかを0か1のような「やっている／いない」で判断するのではなく、<strong>どれくらいアジャイルであるか、どの程度マインドセットに沿えているか</strong>が重要であり、そこによりアジャイルに近づくための改善の余地があります。</p><p>自分のチームがアジャイルであるかを一括りで判断するのではなく、「何が価値に沿っていて、何が改善の余地なのか」を丁寧に見つめ直す視点が大切だと気づきました。</p><hr><h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E5%A4%A7%E5%88%87%E3%81%95">スプリントレビューの大切さ</h3><p>研修中、チームに分かれて与えられた課題に対してスプリントを回す実践を行いました。短い時間の中で「インクリメントを作成し、スプリントレビューで発表する」という一連の流れを体験しました。</p><p>正直、短時間で作ったインクリメントは完成度が高いとは言えませんでしたが、<strong>スプリントレビューで得たフィードバックは非常に有益で、次に改善すべき点が明確になりました</strong>。</p><p>特に印象的だったのは、「完成度の高さ」よりも「<strong>レビューの場でどれだけ価値ある対話が生まれるか</strong>」の方が重要だということです。スクラムにおいてスプリントレビューは、単なる成果発表ではなく、<strong>チームとステークホルダーがプロダクトの方向性をすり合わせるための重要なイベント</strong>なのだと実感しました。</p><hr><h3 id="%E8%A6%B3%E5%AF%9F%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">観察すること</h3><p>スクラムマスターは、チームの中で教えたり、促したり、調整したりといった様々な役割を担います。研修の中で強調されていたのは、スクラムマスターがすぐに課題を解決しようとせず、<strong>まずはチームを「観察」することの大切さ</strong>です。</p><p>たとえば、チームが課題を抱えていそうなときでも、すぐに口を出すのではなく、「何が起きているのか」「メンバー同士の関係性はどうか」「チームとして気づけるタイミングはあるか」を見極め、<strong>必要なときに最小限の介入をする</strong>というスタンスが求められます。</p><p>このような「一歩引いて支援する姿勢」は、マネージャーともメンターとも違う、<strong>スクラムマスター独自の難しさとやりがい</strong>だと感じました。</p><h2 id="%E8%B3%87%E6%A0%BC%E5%8F%97%E9%A8%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">資格受験について</h2><p>研修終了後、Scrum Allianceからメールが届き、専用ダッシュボードから試験の受験ができました。</p><ul><li>受験は50問の選択式</li><li>合格ラインは74%以上（37問以上）</li><li>制限時間は60分</li><li>研修修了から90日以内であれば2回まで無料</li><li>3回目以降は1回25USDの受験料が必要</li></ul><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/05/Untitled2.png" class="kg-image" alt="" loading="lazy" width="1157" height="289" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/05/Untitled2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/05/Untitled2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/05/Untitled2.png 1157w" sizes="(min-width: 720px) 720px"/></figure><p>私は2問間違えてしまいましたが、無事に合格することができました。<br>アジャイルマニフェストとスクラムガイドを事前に読んでおけば、試験対策としては十分でした。</br></p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>3日間の研修を通じて、アジャイルやスクラムの考え方、スクラムマスターの役割などについて体系的に学ぶことができました。今後はこの学びを実務に生かし、<strong>チームがよりアジャイルに成長できるよう支援していきたい</strong>と思います。</p><p>ちなみに、グループワークで発表を担当した際に、つい「スクラム開発」と言ってしまいました。講師から「スクラムは名詞なので開発とは結びつけない方が良い」との指摘を受け、ちょっと恥ずかしい思いをしましたが、これも良い学びのひとつです。</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[モノレポのCIを高速化！GitHub Actionsで変更があったプロジェクトのみ実行する方法]]></title><description><![CDATA[こんにちは！いわむらです。

モノレポを採用しているプロジェクトで、「ちょっとした修正なのに、CIが全サービス分走って時間がかかるのもったいない」って思ったので変更があったやつだけ走るようにして節約できると良さそうと思い色々調べてみました。

今回は、dorny/paths-filter [https://github.com/dorny/paths-filter]
を使い、変更が加えられたサービスやパッケージに関連するジョブだけを実行することで、CI/CDのパイプラインを高速化・効率化する方法をご紹介します。

モノレポの課題
モノレポはコードの共有や依存関係の管理に優れていますが、プロジェクトが大きくなるにつれてCIの実行時間が長くなりがちかなと思います。例えば、複数のサービス（service-a,
service-b）と共通パッケージ（shared-ui）を持つモノレポを考えてみましょう。service-a
のフロントエンドコードを少し変更しただけでも、service-b や shared-ui
も含めたすべてのリント、テスト、ビルドが実行されると、貴重な時間とリソースが無駄にな]]></description><link>https://tech.anti-pattern.co.jp/monoreponociwogao-su-hua-github-actionsdebian-geng-gaatutapuroziekutodakeshi-xing-surufang-fa/</link><guid isPermaLink="false">Ghost__Post__67e427a071fa390001b33406</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Wed, 16 Apr 2025 01:54:35 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！いわむらです。</p><p>モノレポを採用しているプロジェクトで、「ちょっとした修正なのに、CIが全サービス分走って時間がかかるのもったいない」って思ったので変更があったやつだけ走るようにして節約できると良さそうと思い色々調べてみました。</p><p>今回は、<strong><a href="https://github.com/dorny/paths-filter">dorny/paths-filter</a></strong>を使い、変更が加えられたサービスやパッケージに関連するジョブだけを実行することで、CI/CDのパイプラインを高速化・効率化する方法をご紹介します。</p><p><strong>モノレポの課題</strong><br>モノレポはコードの共有や依存関係の管理に優れていますが、プロジェクトが大きくなるにつれてCIの実行時間が長くなりがちかなと思います。例えば、複数のサービス（service-a, service-b）と共通パッケージ（shared-ui）を持つモノレポを考えてみましょう。service-a のフロントエンドコードを少し変更しただけでも、service-b や shared-ui も含めたすべてのリント、テスト、ビルドが実行されると、貴重な時間とリソースが無駄になってしまいます。</br></p><p><strong>改善方法：変更差分に基づいたCI実行</strong><br>この問題を改善する鍵は、「変更があった箇所」だけに関連するCIを実行することで改善できそうだなと。具体的には、プルリクエストやプッシュで変更されたファイルを検知し、そのファイルが含まれるサービスやパッケージに対応するジョブのみをトリガーします。</br></p><p><strong>想定するディレクトリ構成</strong><br>今回は、以下のようなディレクトリ構成を例に説明します。各サービスのディレクトリ直下に、そのサービスのフロントエンドコードがあると想定します。（APIなどは共通化されているか、別リポジトリなどで管理されているイメージです）</br></p><pre><code>.
├── services/
│   ├── service-a/       &lt;-- サービスA (フロントエンド)
│   │   ├── package.json
│   │   └── src/
│   ├── service-b/       &lt;-- サービスB (フロントエンド)
│   │   ├── package.json
│   │   └── src/
│   └── service-c-backend/ &lt;-- サービスC (バックエンドのみなど)
│       └── ...
├── packages/
│   ├── shared-ui/       &lt;-- 共通UIコンポーネント
│   │   └── package.json
│   └── shared-utils/    &lt;-- 共通ユーティリティ
│       └── package.json
└── pnpm-workspace.yaml  &lt;-- pnpmを使う場合</code></pre><p><strong>GitHub Actions ワークフロー</strong><br>この構成で、変更があったフロントエンドサービスや共通パッケージに対してのみリントとビルドを実行するワークフローは以下のようになります。</br></p><pre><code class="language-yaml">name: CI

on:
  push:
    branches: [ main ]
  pull_request:

jobs:
  # 1. 変更検出ジョブ
  changes:
    name: Detect changes
    runs-on: ubuntu-latest
    outputs:
      # 変更があったサービス/パッケージ名のリストを出力 (例: ["services/service-a", "packages/shared-ui"])
      projects: ${{ steps.filter.outputs.changes || '[]' }}
      # いずれかのサービス/パッケージに変更があったか (true/false)
      # filtersで定義したキー名に合わせてOR条件を記述
      any_changed: ${{ steps.filter.outputs['services/service-a'] == 'true' || steps.filter.outputs['services/service-b'] == 'true' || steps.filter.outputs['packages/shared-ui'] == 'true' || steps.filter.outputs['packages/shared-utils'] == 'true' }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          # paths-filterが変更を正しく比較するために全履歴を取得
          fetch-depth: 0

      - name: Check for file changes using paths-filter
        uses: dorny/paths-filter@v3
        id: filter
        with:
          # 変更があったファイルリストをJSON形式で出力
          list-files: json
          # フィルターのキー名を、そのまま作業ディレクトリとして使えるようにパス形式にする
          filters: |
            services/service-a:      # サービスAのディレクトリ
              - 'services/service-a/**'
            services/service-b:      # サービスBのディレクトリ
              - 'services/service-b/**'
            packages/shared-ui:    # 共通UIパッケージ
              - 'packages/shared-ui/**'
            packages/shared-utils:   # 共通ユーティリティパッケージ
              - 'packages/shared-utils/**'

  # 2. Node.jsベースのチェックジョブ (フロントエンドや共通パッケージ用)
  node-checks:
    name: ${{ matrix.project }} - Checks
    needs: changes # changesジョブの完了を待つ
    # changesジョブの出力any_changedがtrueの場合のみ実行
    if: needs.changes.outputs.any_changed == 'true' &amp;&amp; (startsWith(matrix.project, 'services/') || startsWith(matrix.project, 'packages/')) # Node.js関連のプロジェクトのみ対象とする例
    runs-on: ubuntu-latest
    container:
      image: node:22-bullseye

    strategy:
      fail-fast: false # 1つが失敗しても他は続行
      matrix:
        # changesジョブの出力projects (変更があったサービス/パッケージ名のリスト) を元にジョブを並列実行
        project: ${{ fromJson(needs.changes.outputs.projects) }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # pnpmを使う場合
      - name: Setup pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 9
          run_install: false

      # pnpmキャッシュの設定
      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" &gt;&gt; $GITHUB_OUTPUT

      - name: Setup pnpm Cache
        uses: actions/cache@v4
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ matrix.project }}-${{ hashFiles(format('{0}/pnpm-lock.yaml', matrix.project)) }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-${{ matrix.project }}-

      # 依存関係のインストール
      - name: Install dependencies
        # matrix.projectがそのまま作業ディレクトリになる
        working-directory: ${{ matrix.project }}
        run: pnpm install --frozen-lockfile

      # リント実行
      - name: Run ESLint
        working-directory: ${{ matrix.project }}
        run: pnpm run lint

      # ビルド実行
      - name: Run Build
        working-directory: ${{ matrix.project }}
        run: pnpm run build</code></pre><p><strong>ワークフロー解説</strong><br>1. changes ジョブ:<br><code>actions/checkout@v4</code>:<br>コードをチェックアウト ( <code>workspace-depth: 0</code> で全履歴取得)。<br> <code>dorny/paths-filter@v3</code>:<br>・filters:で監視対象のディレクトリとフィルター名を定義。ここではフィルター名を作業ディレクトリパスと同じにしています ( <code>services/service-a</code>, <code>packages/shared-ui</code> など)。これが後々便利になります。<br>・変更があったフィルター名のリストと、各フィルターに変更があったかのフラグ ( <code>services/service-a</code>, <code>packages/shared-ui</code> など) を出力します。<br> <code>outputs:</code> :<br>後続ジョブで使えるように、変更リストと、いずれかに変更があったかを示す any_changed を出力します。any_changed の条件式は filters で定義したキー名に合わせて調整してください。</br></br></br></br></br></br></br></br></p><p><br>2. node-checks ジョブ:<br>・<code>needs</code> :changes: changes ジョブの完了を待ちます。<br>・ <code>if: needs.changes.outputs.any_changed == 'true' &amp;&amp; ...</code>:<br> <code>changes</code> ジョブで変更が検知され、かつ、Matrix で展開されるプロジェクト名 ( <code>matrix.project</code>) がNode.js関連（例: <code>services/</code> または <code>packages/</code> で始まる）の場合のみ実行します。これにより、例えばバックエンド専用のディレクトリが変更されても、このNode.js用ジョブは実行されません。<br>・<code>strategy.matrix.project: ${{ fromJson(needs.changes.outputs.projects) }}</code>:<br> <code>changes</code> ジョブからの変更リストを元に、変更があったサービス/パッケージごとにジョブを並列実行します。<br>・pnpm関連ステップ: pnpmのセットアップとキャッシュを行います。<br>・working-directory: ${{ matrix.project }}:<br>ここがポイントです。 filters でキー名をパスと同じにしたため、 <code>matrix.project</code>の値 ( <code>services/service-a</code> など) をそのまま <code>working-directory</code>に指定できます。これにより、各ジョブは正しいディレクトリで <code>pnpm install</code>, <code>lint</code>, <code>build</code> を実行します。</br></br></br></br></br></br></br></br></br></p><p><strong>まとめ</strong><br> <code><a href="https://github.com/dorny/paths-filter">dorny/paths-filter</a></code> を活用し、ディレクトリ構造に合わせてフィルターを設定することで、モノレポ内の変更があった箇所だけを対象にCIを実行できます。これにより、CIの実行時間を大幅に短縮し、開発プロセス全体の効率を向上させることが可能です。</br></p><p>今回の例はフロントエンドがメインでしたが、バックエンドや他の種類のパッケージが含まれる場合でも、同様の考え方でワークフローを拡張できると思います。ぜひ、あなたのモノレポプロジェクトにも導入してみてください！</p>]]></content:encoded></item><item><title><![CDATA[Roo Code(Roo Cline)を既存のアプリケーション開発で使う]]></title><description><![CDATA[

1月にAIエージェントが物凄く盛り上がりました。私も1月から複数のAIエージェントを試してきましたが、Roo
Codeが今一番使いやすいと感じています。実際にどのように使用しているのか紹介します。



Roo Codeとは

Roo Code（旧称：Roo Cline）は、Visual Studio
Code（VSCode）の拡張機能として提供されるAIエージェントです。オープンソースの自律型コーディングアシスタント「Cline」を基盤に開発され、コードの生成、編集、テスト、デバッグ、さらにはプロジェクト管理まで、開発の各段階を包括的にサポートします。



Settingsで広い権限を渡す

初期設定ではread-onlyでwriteに関しては承認が必要という状態ですが、これだと逐次的に進める必要があるので、広めの権限を渡します。git等で変更管理をしているはずなので大きな問題はないと思います。



API Providerは複数あると良い

先におすすめの組み合わせですが、providerはVS Code LM APIとOpenRouterを使うことをお勧めします。モデルは]]></description><link>https://tech.anti-pattern.co.jp/roo-clinewo/</link><guid isPermaLink="false">Ghost__Post__67a2d6b127e5640001681db8</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Wed, 02 Apr 2025 02:14:41 GMT</pubDate><content:encoded><![CDATA[<p/><p>1月にAIエージェントが物凄く盛り上がりました。私も1月から複数のAIエージェントを試してきましたが、Roo Codeが今一番使いやすいと感じています。実際にどのように使用しているのか紹介します。</p><p/><p>Roo Codeとは</p><p>Roo Code（旧称：Roo Cline）は、Visual Studio Code（VSCode）の拡張機能として提供されるAIエージェントです。オープンソースの自律型コーディングアシスタント「Cline」を基盤に開発され、コードの生成、編集、テスト、デバッグ、さらにはプロジェクト管理まで、開発の各段階を包括的にサポートします。</p><p/><p>Settingsで広い権限を渡す</p><p>初期設定ではread-onlyでwriteに関しては承認が必要という状態ですが、これだと逐次的に進める必要があるので、広めの権限を渡します。git等で変更管理をしているはずなので大きな問題はないと思います。</p><p/><p>API Providerは複数あると良い</p><p>先におすすめの組み合わせですが、providerはVS Code LM APIとOpenRouterを使うことをお勧めします。モデルはClaude 3.5 sonnetをお勧めします。</p><p/><p>理由ですが、OpenAIやClaudeのAPIを個人で直接払って使用しようとするとlimitの制限が厳しく、使い勝手が悪くなります。AnthropicはTier 2までOpenAI PlatformはTier 1まで試しましたが、不十分でした。</p><p>Anthropic</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.anthropic.com/en/api/rate-limits#requirements-to-advance-tier"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Rate limits - Anthropic</div><div class="kg-bookmark-description">To mitigate misuse and manage capacity on our API, we have implemented limits on how much an organization can use the Claude API.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://mintlify.s3-us-west-1.amazonaws.com/anthropic/_generated/favicon/apple-touch-icon.png?v&#x3D;3"><span class="kg-bookmark-author">Anthropic</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://mintlify.com/docs/api/og?division&#x3D;Documentation&amp;mode&#x3D;light&amp;title&#x3D;Rate+limits&amp;description&#x3D;To+mitigate+misuse+and+manage+capacity+on+our+API%2C+we+have+implemented+limits+on+how+much+an+organization+can+use+the+Claude+API.&amp;logoLight&#x3D;https%3A%2F%2Fmintlify.s3.us-west-1.amazonaws.com%2Fanthropic%2Flogo%2Flight.svg&amp;logoDark&#x3D;https%3A%2F%2Fmintlify.s3.us-west-1.amazonaws.com%2Fanthropic%2Flogo%2Fdark.svg&amp;primaryColor&#x3D;%230E0E0E&amp;lightColor&#x3D;%23D4A27F&amp;darkColor&#x3D;%230E0E0E"/></div></a></figure><!--kg-card-begin: html--><table style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: inherit; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; text-indent: 0px; border-collapse: collapse; width: 720.805px; table-layout: auto; text-align: start; margin-top: 0px; margin-bottom: 2em; font-size: 0.875rem; line-height: 1.25rem; display: block; overflow: auto; color: rgb(62, 62, 62); font-family: Tiempos, serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-200)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: rgb(var(--gray-700));"><tr style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><th style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em; padding-top: 0px;">Usage Tier</th><th style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline: 0.571429em; padding-bottom: 0.571429em; padding-top: 0px;">Credit Purchase</th><th style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline: 0.571429em; padding-bottom: 0.571429em; padding-top: 0px;">Wait After First Purchase</th><th style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px; padding-top: 0px;">Max Usage per Month</th></tr></thead><tbody style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-100)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em;">Tier 1</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">$5</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">0 days</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px;">$100</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-100)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em;">Tier 2</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">$40</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">7 days</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px;">$500</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-100)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em;">Tier 3</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">$200</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">7 days</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px;">$1,000</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-100)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em;">Tier 4</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">$400</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">14 days</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px;">$5,000</td></tr><tr style="box-sizing: border-box; border-width: 0px 0px 1px; border-style: solid; border-top-color: ; border-right-color: ; border-bottom-color: rgb(var(--gray-100)); border-left-color: ; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ;"><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0px 0.571429em; padding-bottom: 0.571429em;">Monthly Invoicing</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">N/A</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-inline: 0.571429em; padding-bottom: 0.571429em;">N/A</td><td style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(var(--gray-200)); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59,130,246,.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; vertical-align: baseline; padding-top: 0.571429em; padding-bottom: 0.571429em; padding-inline: 0.571429em 0px;">N/A</td></tr></tbody></table><!--kg-card-end: html--><p>OpenAI Platform</p><p><a href="https://platform.openai.com/docs/guides/rate-limits?context=tier-four&amp;tier=tier-two#usage-tiers">https://platform.openai.com/docs/guides/rate-limits?context=tier-four&amp;tier=tier-two#usage-tiers</a></p><!--kg-card-begin: html--><table style="box-sizing: border-box; scrollbar-width: thin; border-collapse: collapse; margin: 20px 0px 15px; width: 700px; color: rgb(217, 217, 227); font-family: &quot;OpenAI Sans&quot;, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: -0.16px; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(32, 33, 35); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: border-box; scrollbar-width: thin;"><tr style="box-sizing: border-box; scrollbar-width: thin;"><th style="box-sizing: border-box; scrollbar-width: thin; border: none; color: var(--gray-900); font-weight: var(--weight-medium); font-size: 11px; line-height: 16px; letter-spacing: var(--tracking-small-caps); text-transform: uppercase; text-align: left; vertical-align: bottom; padding: 0px 8px 8px 0px;">Tier</th><th style="box-sizing: border-box; scrollbar-width: thin; border: none; color: var(--gray-900); font-weight: var(--weight-medium); font-size: 11px; line-height: 16px; letter-spacing: var(--tracking-small-caps); text-transform: uppercase; text-align: left; vertical-align: bottom; padding: 0px 8px 8px;">Qualification</th><th style="box-sizing: border-box; scrollbar-width: thin; border: none; color: var(--gray-900); font-weight: var(--weight-medium); font-size: 11px; line-height: 16px; letter-spacing: var(--tracking-small-caps); text-transform: uppercase; text-align: left; vertical-align: bottom; padding: 0px 0px 8px 8px;">Usage limits</th></tr></thead><tbody style="box-sizing: border-box; scrollbar-width: thin;"><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Free</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">User must be in an<span>&nbsp;</span><a href="https://platform.openai.com/docs/supported-countries" style="box-sizing: border-box; scrollbar-width: thin; color: var(--primary); text-decoration: none; cursor: pointer;">allowed geography</a></td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$100 / month</td></tr><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Tier&nbsp;1</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">$5 paid</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$100 / month</td></tr><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Tier&nbsp;2</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">$50 paid and 7+ days since first successful payment</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$500 / month</td></tr><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Tier&nbsp;3</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">$100 paid and 7+ days since first successful payment</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$1,000 / month</td></tr><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Tier&nbsp;4</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">$250 paid and 14+ days since first successful payment</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$5,000 / month</td></tr><tr style="box-sizing: border-box; scrollbar-width: thin;"><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 8px 8px 0px; font-size: 14px; line-height: 20px;">Tier&nbsp;5</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px; font-size: 14px; line-height: 20px;">$1,000 paid and 30+ days since first successful payment</td><td style="box-sizing: border-box; scrollbar-width: thin; border-right: none; border-bottom: none; border-left: none; border-image: initial; border-top: 1px solid var(--gray-100); vertical-align: top; padding: 8px 0px 8px 8px; font-size: 14px; line-height: 20px;">$200,000 / month</td></tr></tbody></table><!--kg-card-end: html--><p>OpenRouterを使うことでAPI のtokenやrequestのlimitの制限をほとんど気にしなくて良くなります。（OpenRouterもPrivacyで学習に使用しないように選択ができます。）</p><p>（OpenRouterで）claude-3.5-sonnet:betaを使用していると料金は高くなります。</p><p>さらに1/17から<a href="https://github.com/RooVetGit/Roo-Code/pull/367">VS Code LM APIが使えるようになりました</a>。これでcopilot経由でのclaude-3.5-sonnetが一定量無料で使えるようになりました。</p><p/><p>余談ですが、Roo Codeでgpt 40を使っていた時、一定程度使っているとなぜか Claude 3.5 Sonnet への切り替えを推奨されました。理由は分かりませんが、Claude 3.5 Sonnetがモデルの方が多くの情報を処理できるみたいです。</p><blockquote>Roo Code uses complex prompts and iterative task execution that may be challenging for less capable models. For best results, it's recommended to use Claude 3.5 Sonnet for its advanced agentic coding capabilities.</blockquote><p/><p>2025/2/13追記</p><p>GitHub Copilot Agent Modeが使えるようになりました！</p><p>Roo Codeと同じくAIエージェントで高性能なモデルGPT 4o, o1, Claude 3.5 sonnetが無料で使えます！</p><p>ということで今一番使っています！</p><p>2025/3/19</p><p>すでにClaude 3.7 sonnet、Claude 3.7 sonnet Thinking、GPT 03-miniが使用できるようになっています！</p><p/><p>現在試行錯誤中なので、明日には使い方が変わっているかもしれませんが、一旦こんな風に使ってたというのを記載します。</p><p>インフラ開発</p><p>CDKをIaCとして採用しており、stack内のリソース作成などはコーディングの量がそこまで多くないので、AIエージェントの良さを感じづらくはあります。個人的にはcodeでプロンプトを投げるのではなく、askで参考コードを出してもらって良ければ追加くらいでも今のところ良いかなとも思います。<br>Lambda（typescript）を一から作成するのはとても簡単に感じました。また、Lambdaのpolicy作成もコードと合わせて行ってくれますし、テストも作ってくれて便利です。importするものを指定すると精度が上がりました。（何も指定せずに依頼するとjest.mockでテスト作られるので、aws-sdk-client-mockを利用したい場合は指定する必要があります。）コーディングルールをドキュメントにしてもらいつつ、開発していくのが有益だと思います。</br></p><p>バックエンド</p><p>GolangでAPIを作成しています。既存のOpenAPI定義があるので、定義にエンドポイントを追加していくことは難しくないです（自分で追加してもそこまでコード量は多くないので、好みかと思いますが、エージェントに作成してもらってレビューー&amp;修正という形で開発しています。）。OpenAPI定義に関わらず、ファイルが数千行と膨大なものになる場合はエージェントの実行時間とトークンの消費量が大きくなるので注意です。OpenAPI定義と要件から実装をお願いするといい感じで作成してくれます。明示的に”controller, model, service, infrastructureに追加して”や”既存のファイルのコーディング方法を確認して同じように追加して”、”この手順でテストして”など詳細を伝えることが大事です。</p><p>フロントエンド</p><p>まだ試せてないで楽しみです。</p>]]></content:encoded></item><item><title><![CDATA[SaaS開発で使うLaunchDarkly]]></title><description><![CDATA[ryudaiです、こんにちは！
皆さんはフィーチャーフラグ、使ってますか？

フィーチャーフラグ (Feature Flags) を簡単に説明すると、ある機能をコード変更なしでON/OFFできるような仕組みです。

今回、フィーチャーフラグのSaaSであるLaunchDarkly [https://launchdarkly.com/]
さんが、弊社向けにオフラインワークショップを開催してくださったので、そのレポートをお届けします！

■LaunchDarklyとは？ 〜弊社でのユースケースを添えて〜
弊社サービスであるSaaSus Platform [https://saasus.io/]では、2022年11月からLaunchDarklyを使っています。

主な活用タイミングは以下の2つです。

 1. 新機能のリリース
 2. β版機能のリリース

①新機能のリリース
フィーチャーフラグを活用すると、以下のようなフローで新機能をリリースできます。

 1. 新機能を「OFF」にしてデプロイ
 2. 任意のタイミングで新機能を「ON」にし、ユーザーが使えるようにする
 3. 仮にバグな]]></description><link>https://tech.anti-pattern.co.jp/saas-dev-with-launchdarkly/</link><guid isPermaLink="false">Ghost__Post__67cbc85c71fa390001b3328a</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Thu, 27 Mar 2025 11:01:05 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2025/03/ChatGPT-Image-2025-3-27--14_32_51.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/03/ChatGPT-Image-2025-3-27--14_32_51.png" alt="SaaS開発で使うLaunchDarkly"/><p>ryudaiです、こんにちは！<br>皆さんはフィーチャーフラグ、使ってますか？</br></p><p>フィーチャーフラグ (Feature Flags) を簡単に説明すると、<strong>ある機能をコード変更なしでON/OFFできる</strong>ような仕組みです。</p><p>今回、フィーチャーフラグのSaaSである<a href="https://launchdarkly.com/"><strong>LaunchDarkly</strong></a>さんが、弊社向けにオフラインワークショップを開催してくださったので、そのレポートをお届けします！</p><h2 id="%E2%96%A0launchdarkly%E3%81%A8%E3%81%AF%EF%BC%9F-%E3%80%9C%E5%BC%8A%E7%A4%BE%E3%81%A7%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E6%B7%BB%E3%81%88%E3%81%A6%E3%80%9C">■LaunchDarklyとは？ 〜弊社でのユースケースを添えて〜</h2><p>弊社サービスである<strong><a href="https://saasus.io/">SaaSus Platform</a></strong>では、2022年11月からLaunchDarklyを使っています。</p><p>主な活用タイミングは以下の2つです。</p><ol><li>新機能のリリース</li><li>β版機能のリリース</li></ol><h3 id="%E2%91%A0%E6%96%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9">①新機能のリリース</h3><p>フィーチャーフラグを活用すると、以下のようなフローで新機能をリリースできます。</p><ol><li>新機能を「OFF」にしてデプロイ</li><li>任意のタイミングで新機能を「ON」にし、ユーザーが使えるようにする</li><li>仮にバグなどが見つかった場合、新機能を「OFF」にする</li></ol><p>ON/OFFの切り替えは、LaunchDarklyのダッシュボードから簡単に行えます。</p><p>このようにすることで、<strong>新機能の開発からマージまでのサイクルを素早く回せ</strong>て、開発体験を向上させることができます。</p><h3 id="%E2%91%A1%CE%B2%E7%89%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9">②β版機能のリリース</h3><p>新機能の中でもβ版は、特定のユーザーのみに公開したい、という場合もありますね。LaunchDarklyでは、<strong>特定の属性を持つユーザーにのみ機能をON</strong>にできます。</p><p>実際にSaaSus Platformでは、β版機能の利用申請があった特定のテナントのみにご利用いただく場合があります。このとき、LaunchDarklyでは申請されたテナントの「テナントID」などの情報を保持し、そのテナントのみに機能をONにします。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/03/----------------3-1.png" class="kg-image" alt="SaaS開発で使うLaunchDarkly" loading="lazy" width="1536" height="1032" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/03/----------------3-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/03/----------------3-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2025/03/----------------3-1.png 1536w" sizes="(min-width: 720px) 720px"><figcaption>β版機能のリリース用フラグの概念図</figcaption></img></figure><h2 id="%E2%96%A0%E6%B0%97%E3%81%AB%E3%81%AA%E3%82%8B%E6%A9%9F%E8%83%BD%E3%83%BB%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9">■気になる機能・ユースケース</h2><p>ここではワークショップで教えていただいた内容を3つピックアップします。</p><h3 id="%E2%91%A0guarded-releases">①Guarded Releases</h3><p>弊社のユースケースでも新機能リリース時の活用について触れましたが、LaunchDarklyでは安全なリリースをサポートするのに特化した機能 <a href="https://launchdarkly.com/blog/launch-week-2024-introducing-guarded-releases/">Guarded Releases</a> があります。</p><p>Guarded Releasesを使うと、LaunchDarkly上で<strong>エラーレートやレイテンシーを監視</strong>し、しきい値を超えた場合には<strong>自動でロールバック</strong>することができます。</p><p>例えば、「エラーレートが1%を超えたら自動でフラグをOFFにする」といった設定が考えられますね。</p><h3 id="%E2%91%A1migration-flags">②Migration flags</h3><p>これまでは1つのフィーチャーフラグを利用し、機能のON/OFFを切り替えていました。<br><a href="https://launchdarkly.com/docs/home/flags/migration">Migration flags</a>は単純なON/OFFではなく、<strong>複数の段階を経るシステム移行を安全に管理</strong>できる機能です。</br></p><p>例えば、システムのDB移行が必要になった場合を考えます。<br>このとき、以下の4つの段階を経てDBの移行を完了する、というプランを立てたとします。</br></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/03/----------------2.png" class="kg-image" alt="SaaS開発で使うLaunchDarkly" loading="lazy" width="2000" height="711" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2025/03/----------------2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2025/03/----------------2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2025/03/----------------2.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2025/03/----------------2.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>DB移行の4段階の例</figcaption></img></figure><ol><li>旧DBのみで運用（すべての読み書きを旧DBで実施）</li><li>デュアルライティング（旧DBからRead、新旧両方にWrite）</li><li>デュアルライティング（新DBからRead、新旧両方にWrite）</li><li>新DBのみで運用（すべての読み書きを新DBで実施）</li></ol><p>このような移行をフィーチャーフラグで表現する場合、複数のフラグをまとめて管理する必要があり、必要な段階が増えるほど複雑さが増します。<br>Migration flagsでは、この複雑さを軽減してくれるのはもちろん、変更を反映するユーザーを絞ったり、エラー時のロールバックなども行ってくれます。</br></p><h3 id="%E2%91%A2%E3%83%95%E3%82%A3%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%95%E3%83%A9%E3%82%B0%E3%81%AE%E5%89%8A%E9%99%A4">③フィーチャーフラグの削除</h3><p>機能がONになり安定稼働すると、ソースコードにあるフィーチャーフラグが不要になります。<br>では、どのような運用であれば安全にフィーチャーフラグを削除できるでしょうか？</br></p><p>まず、LaunchDarklyには、<a href="https://launchdarkly.com/docs/home/observability/code-references">GitHubにあるコードを参照</a>し、フィーチャーフラグが存在する場所をWebコンソールに表示する機能があります。<br>この機能を活用してWebコンソールから確認しながら、不要になったフィーチャーフラグを四半期に1度全部消す、という運用が行われているプロジェクトもあるそうです。</br></p><p>その他に、<a href="https://launchdarkly.com/blog/declutter-your-flags-with-automated-flag-archival-/">不要になったフィーチャーフラグを自動で検知する</a>機能も存在するので、これらを組み合わせて定期的に削除していけそうですね。</p><h2 id="%E2%96%A0%E6%9C%80%E5%BE%8C%E3%81%AB">■最後に</h2><p>SaaS開発において、顧客への価値提供に繋がるビジネスロジック部分を重点的に開発し、その他は外部サービスに任せて<strong>自ら開発する部分は最小化しよう</strong>、という考え方があります。<br>これは開発を加速させるだけでなく、その後の運用・保守コストの削減にも繋がります。</br></p><p>弊社サービスである<a href="https://saasus.io/"><strong>SaaSus Platform</strong></a>もSaaS開発をサポートするSaaSであり、我々はこの思想に強く共感しています。</p><p><a href="https://launchdarkly.com/"><strong>LaunchDarkly</strong></a>はまさに、フィーチャーフラグの機能をまるっと提供し、SaaS提供者をサポートしてくれるSaaSです。みなさんもLaunchDarklyの肩に乗り、クイックにSaaSを開発する体制を整えていきませんか？</p>]]></content:encoded></item><item><title><![CDATA[チューリングの停止性問題とカントールの対角線論法]]></title><description><![CDATA[

こんにちはkoheです。今回は 数えられ(ない)る集合の話と無限ループが起きることを判定できるか？という話をしていきたいと思います。

みなさんは全ての数は数えられると思いますか？無限ループが起きるかどうかを判定できると思いますか？

カントールの対角線論法
カントールの対角線論法とは？
カントールの対角線論法は、「実数は自然数によって数え上げられない（不可算である）」ことを証明するための有名な方法です。

対角線論法
0以上1以下の実数を列挙してみる
「すべての実数をリストアップした」と主張する人がいたとしましょう。特に、0以上1以下のすべての実数を小数展開で書いたリストを考えます。たとえば、次のように並べたとします（実際は無限に続くと想定）

番号数字の小数展開1桁目2桁目3桁目4桁目5桁目6桁目7桁目8桁目9桁目...10.123456789…123456789…20.999999999…99999
9999…30.314159265…314159265…40.500000000…500000000…50.707106781…707106781…………………
………………ここ]]></description><link>https://tech.anti-pattern.co.jp/turing-halting-problem-cantor-diagonalization-argument/</link><guid isPermaLink="false">Ghost__Post__67b46e7227e5640001682030</guid><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 27 Feb 2025 10:10:29 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2025/02/DALL-E-2025-02-19-13.51.52-A-conceptual-illustration-of-Turing_s-diagonalization-argument.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2025/02/DALL-E-2025-02-19-13.51.52-A-conceptual-illustration-of-Turing_s-diagonalization-argument.png" alt="チューリングの停止性問題とカントールの対角線論法"/><p/><p>こんにちはkoheです。今回は 数えられ(ない)る集合の話と無限ループが起きることを判定できるか？という話をしていきたいと思います。</p><p>みなさんは全ての数は数えられると思いますか？無限ループが起きるかどうかを判定できると思いますか？</p><h1 id="%E3%82%AB%E3%83%B3%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E5%AF%BE%E8%A7%92%E7%B7%9A%E8%AB%96%E6%B3%95">カントールの対角線論法</h1><h2 id="%E3%82%AB%E3%83%B3%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E5%AF%BE%E8%A7%92%E7%B7%9A%E8%AB%96%E6%B3%95%E3%81%A8%E3%81%AF%EF%BC%9F">カントールの対角線論法とは？</h2><p>カントールの対角線論法は、「実数は自然数によって数え上げられない（不可算である）」ことを証明するための有名な方法です。</p><h2 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E8%AB%96%E6%B3%95">対角線論法</h2><h3 id="0%E4%BB%A5%E4%B8%8A1%E4%BB%A5%E4%B8%8B%E3%81%AE%E5%AE%9F%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">0以上1以下の実数を列挙してみる</h3><p>「すべての実数をリストアップした」と主張する人がいたとしましょう。特に、0以上1以下のすべての実数を小数展開で書いたリストを考えます。たとえば、次のように並べたとします（実際は無限に続くと想定）</p><!--kg-card-begin: html--><table data-start="44" data-end="870"><thead data-start="44" data-end="136"><tr data-start="44" data-end="136"><th data-start="44" data-end="49">番号</th><th data-start="49" data-end="75">数字の小数展開</th><th data-start="75" data-end="81">1桁目</th><th data-start="81" data-end="87">2桁目</th><th data-start="87" data-end="93">3桁目</th><th data-start="93" data-end="99">4桁目</th><th data-start="99" data-end="105">5桁目</th><th data-start="105" data-end="111">6桁目</th><th data-start="111" data-end="117">7桁目</th><th data-start="117" data-end="123">8桁目</th><th data-start="123" data-end="129">9桁目</th><th data-start="129" data-end="136">...</th></tr></thead><tbody data-start="242" data-end="870"><tr data-start="242" data-end="346"><td>1</td><td>0.123456789…</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>…</td></tr><tr data-start="347" data-end="451"><td>2</td><td>0.999999999…</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>…</td></tr><tr data-start="452" data-end="556"><td>3</td><td>0.314159265…</td><td>3</td><td>1</td><td>4</td><td>1</td><td>5</td><td>9</td><td>2</td><td>6</td><td>5</td><td>…</td></tr><tr data-start="557" data-end="661"><td>4</td><td>0.500000000…</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>…</td></tr><tr data-start="662" data-end="766"><td>5</td><td>0.707106781…</td><td>7</td><td>0</td><td>7</td><td>1</td><td>0</td><td>6</td><td>7</td><td>8</td><td>1</td><td>…</td></tr><tr data-start="767" data-end="870"><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td><td>…</td></tr></tbody></table><!--kg-card-end: html--><p>ここで、「このリストには0以上1以下のすべての実数が含まれている」と仮定してみます。</p><h3 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E4%B8%8A%E3%81%AE%E6%95%B0%E5%AD%97%E3%82%921%E3%81%A4%E3%81%9A%E3%81%A4%E8%A6%8B%E3%81%A6%E6%96%B0%E3%81%97%E3%81%84%E6%95%B0%E3%82%92%E4%BD%9C%E3%82%8B">対角線上の数字を1つずつ見て新しい数を作る</h3><ol><li>上の表を縦横に眺めて、1番目の小数の1桁目、2番目の小数の2桁目、3番目の小数の3桁目…というふうに<strong>対角線上の数字</strong>を取り出す。</li><li>取り出した数字を<strong>1桁ずつ変える（例: 0→1、1→2 など、一律に1を足して10なら0に戻す）</strong>。</li></ol><ul><li>1 -&gt; 2</li><li>9 -&gt; 0</li><li>4 -&gt; 5</li><li>0 -&gt; 1</li><li>0 -&gt; 1</li></ul><p><strong>対角線の数字を変えた</strong>結果、次のような数が得られるとします。</p><p>0.20511...</p><p/><p>この数は、元のリストの1番目の数とも2番目の数とも…n番目の数とも決して一致しません。なぜなら、1番目の数とは小数第1桁が異なり、2番目の数とは小数第2桁が異なり…という具合で、必ずどこかで違いが出るからです。</p><h3 id="%E7%9F%9B%E7%9B%BE%E3%81%AE%E7%99%BA%E7%94%9F">矛盾の発生</h3><p>「リストには0以上1以下の実数がすべて入っている」としたのに、<strong>リストには存在しない実数（</strong>0.20511...<strong>）<strong>を作れてしまいました。これは矛盾です。よって、0以上1以下の実数を自然数で完全に列挙することはできない、というわけです。</strong></strong><br><strong><strong>この方法が</strong>カントールの対角線論法</strong>です。</br></p><h3 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">ポイント</h3><ul><li><strong>可算集合</strong>：要素を「1番目、2番目、3番目…」と番号付け（自然数と一対一対応）ができる集合のこと。例：自然数の集合、整数の集合、有理数の集合など。</li><li><strong>不可算集合</strong>：上記のような「番号付け」で網羅できない集合。例：実数の集合。</li></ul><h1 id="%E5%81%9C%E6%AD%A2%E6%80%A7%E5%95%8F%E9%A1%8C%E3%81%A8%E3%81%AF%EF%BC%9F">停止性問題とは？</h1><p>停止性問題（Halting Problem）とは、</p><blockquote><strong>「任意のプログラム Pと入力 I が与えられたときに、P は有限時間で停止するか？」</strong></blockquote><blockquote>&gt;<a href="https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E5%8F%AF%E8%83%BD%E6%80%A7%E7%90%86%E8%AB%96">計算可能性理論</a>において<strong>停止性問題</strong>（ていしせいもんだい、<a href="https://ja.wikipedia.org/wiki/%E8%8B%B1%E8%AA%9E">英</a>: halting problem）または<strong>停止問題</strong>は、「どんな<a href="https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%82%B7%E3%83%B3">チューリングマシン</a><sup><a href="https://ja.wikipedia.org/wiki/%E5%81%9C%E6%AD%A2%E6%80%A7%E5%95%8F%E9%A1%8C#cite_note-1">[注 1]</a></sup>、あるいは<a href="https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%83%BC%E3%83%81%EF%BC%9D%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%86%E3%83%BC%E3%82%BC">同様な計算機構</a>についても、それが有限時間で停止するかを判定できる<a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0">アルゴリズム</a>」は可能か、という問題。</blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/%E5%81%9C%E6%AD%A2%E6%80%A7%E5%95%8F%E9%A1%8C"><div class="kg-bookmark-content"><div class="kg-bookmark-title">停止性問題 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png" alt="チューリングの停止性問題とカントールの対角線論法"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">ウィキメディアプロジェクトへの貢献者</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/50px-Question_book-4.svg.png" alt="チューリングの停止性問題とカントールの対角線論法"/></div></a></figure><p/><h1 id="%E5%85%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%A1%A8%E3%81%AB%E4%B8%A6%E3%81%B9%E3%82%8B%E2%80%95%E2%80%95%E4%BB%AE%E5%AE%9A%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B">全プログラムを表に並べる――仮定から始める</h1><p>プログラム（チューリングマシン）は理論的には有限文字列で表せるため、<strong>全プログラムを列挙</strong>できます。<br>たとえば M1,M2,M3,…と書くことができます。</br></p><p>これらのプログラムについて、「プログラムMi が入力 j で停止するかどうか」を次のような表で表してみましょう。</p><p>※無限ループするかどうかを判定する。</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center"/>
<th style="text-align:center">入力 1</th>
<th style="text-align:center">入力 2</th>
<th style="text-align:center">入力 3</th>
<th style="text-align:center">入力 4</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">プログラム M₁</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">プログラム M₂</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">プログラム M₃</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">プログラム M₄</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">?</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>ここで「?」は本来「停止／停止しない」を示すはずのマス目ですが、一旦は「未知」としておきます。</p><hr><h2 id="%E3%80%8C%E5%81%9C%E6%AD%A2%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%80%8D%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E4%BB%AE%E5%AE%9A">「停止を判定するプログラム」があると仮定</h2><p>「すべてのプログラムと入力の組み合わせについて、停止か否かを誤りなく判定できるプログラム（＝停止判定プログラム）がある」と仮定してみましょう。<br>もしそれが可能なら、この表の各マスを「停止(1)」または「停止しない(0)」で完璧に埋められるはずです。</br></p><p>図示イメージ（本当は無限大の表ですが、一部だけ）:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center"/>
<th style="text-align:center">入力 1</th>
<th style="text-align:center">入力 2</th>
<th style="text-align:center">入力 3</th>
<th style="text-align:center">入力 4</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><strong>M₁</strong></td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₂</strong></td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₃</strong></td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₄</strong></td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">1 or 0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><ul><li>ここで「1」と書いたら「その行のプログラムは、その列の入力を与えたら停止する」ことを意味し、「0」と書いたら「停止しない」ことを意味する、とします。</li></ul><hr><h1 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E8%AB%96%E6%B3%95-1">対角線論法</h1><h2 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E4%B8%8A%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%84%E3%81%8F">対角線上の要素を見ていく</h2><p>まずは下記のように、対角線上の位置（行と列の番号が同じところ）だけに注目します。</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center"/>
<th style="text-align:center">入力 1</th>
<th style="text-align:center">入力 2</th>
<th style="text-align:center">入力 3</th>
<th style="text-align:center">入力 4</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><strong>M₁</strong></td>
<td style="text-align:center"><strong>T[1,1]</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₂</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center"><strong>T[2,2]</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₃</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center"><strong>T[3,3]</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₄</strong></td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center">-</td>
<td style="text-align:center"><strong>T[4,4]</strong></td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>ここで T[i,i]は「プログラム Mi​ が入力 i で停止するかどうか」を表す値（1か0）です。</p><p/><!--kg-card-begin: markdown--><h2 id="%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9A%E7%BE%A9">新プログラムを定義</h2>
<p>この対角線上の情報を利用して、新たなプログラム <strong>D</strong> を次のように定義します。</p>
<p><strong>D</strong> は入力 <strong>n</strong> を受け取ると:</p>
<ol>
<li>
<p><strong>Mₙ</strong>（= 列挙表の <strong>n</strong> 番目のプログラム）を、入力 <strong>n</strong> でシミュレートする。</p>
</li>
<li>
<p>もし <strong>Mₙ(n)</strong> が <strong>停止する(=1)</strong> と判断したら、<strong>D</strong> は <strong>停止しない（無限ループ）</strong>。</p>
</li>
<li>
<p>もし <strong>Mₙ(n)</strong> が <strong>停止しない(=0)</strong> と判断したら、<em>D</em> は <strong>即座に停止</strong> する。</p>
</li>
</ol>
<hr>
<p>このように、<br>
<strong>「もし相手(= Mₙ)が止まるなら自分は止まらない。止まらないなら自分は止まる」</strong><br>
という風に、<strong>対角線要素を反転</strong>した振る舞いをプログラム <strong>D</strong> で実装します。</br></br></p>
<!--kg-card-end: markdown--><p>こうするとこのDは表の中に存在せず、全てのプログラムを列挙しているはずなのに矛盾が生じます。これは無限ループを判定できるという仮定がまちがっていたこととなり、無限ループがおきるかどうかの判定はできないということになります。</p><h2 id="%E5%85%B7%E4%BD%93%E4%BE%8B">具体例</h2><p/><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center">プログラム \ 入力</th>
<th style="text-align:center">入力 1</th>
<th style="text-align:center">入力 2</th>
<th style="text-align:center">入力 3</th>
<th style="text-align:center">入力 4</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><strong>M₁</strong></td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₂</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₃</strong></td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₄</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>...</strong></td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<hr>
<h3 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E4%B8%8A%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">対角線上の要素を確認する</h3>
<p>この表の <strong>対角線上の要素</strong>（M₁の入力1、M₂の入力2、M₃の入力3、M₄の入力4…）を抽出します。</p>
<table>
<thead>
<tr>
<th style="text-align:center">プログラム \ 入力</th>
<th style="text-align:center">入力 1</th>
<th style="text-align:center">入力 2</th>
<th style="text-align:center">入力 3</th>
<th style="text-align:center">入力 4</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><strong>M₁</strong></td>
<td style="text-align:center"><strong>1</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₂</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center"><strong>1</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₃</strong></td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center"><strong>1</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>M₄</strong></td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center"><strong>0</strong></td>
<td style="text-align:center">...</td>
</tr>
<tr>
<td style="text-align:center"><strong>...</strong></td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<p>対角線上の数字は次の通りです。</p>
<ul>
<li><strong>M₁(1)</strong> = 1</li>
<li><strong>M₂(2)</strong> = 1</li>
<li><strong>M₃(3)</strong> = 1</li>
<li><strong>M₄(4)</strong> = 0<br>
...</br></li>
</ul>
<hr>
<h3 id="%E5%AF%BE%E8%A7%92%E7%B7%9A%E4%B8%8A%E3%81%AE%E6%95%B0%E5%AD%97%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B">対角線上の数字を変える</h3>
<p>対角線の各数字を以下のように反転します。<br>
ルール:</br></p>
<ul>
<li><strong>1 -&gt; 0</strong>（停止 -&gt; 停止しない）</li>
<li><strong>0 -&gt; 1</strong>（停止しない -&gt; 停止）</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:center">対角線の元の値</th>
<th style="text-align:center">1</th>
<th style="text-align:center">1</th>
<th style="text-align:center">1</th>
<th style="text-align:center">0</th>
<th style="text-align:center">...</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">反転後の値</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">...</td>
</tr>
</tbody>
</table>
<hr>
<p>よってプログラムDは</p>
<ul>
<li><strong>D(1)</strong> = 0</li>
<li><strong>D(2)</strong> = 0</li>
<li><strong>D(3)</strong> = 0</li>
<li><strong>D(4)</strong> = 1</li>
<li>...</li>
</ul>
<p>となり、この表には存在しないことになる。</p>
<!--kg-card-end: markdown--><p>ぜひ皆さんもプログラムが無限ループをするかどうかを一般的に判定できるか迷ったらこのことを思い出してください。</p></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[InfoQの記事「100行以下のGoでコンテナを作る」をやってみた]]></title><description><![CDATA[InfoQの「Build Your Own Container Using Less than 100 Lines of
Go」という記事を読んで、コンテナが技術的にどのように成り立っているのか、大変面白く学ぶことができました。本ブログでは、その記事の内容を紹介していきます。

Build Your Own Container Using Less than 100 Lines of GoShipping containers and
software containers share a lot in common, but the analogy has limits. This
article explores this relationship further by demonstrating how it is possible
to build a simple container using less than 100 lines of Golang code. Topics
covered include namespaces, cgroups and laye…Inf]]></description><link>https://tech.anti-pattern.co.jp/info-qnoji-shi/</link><guid isPermaLink="false">Ghost__Post__679ce55227e5640001681cd3</guid><category><![CDATA[Go]]></category><category><![CDATA[docker]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Tue, 25 Feb 2025 09:39:51 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1605745341075-1b7460b99df8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGRvY2tlcnxlbnwwfHx8fDE3MzgzMzkxNzd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1605745341075-1b7460b99df8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGRvY2tlcnxlbnwwfHx8fDE3MzgzMzkxNzd8MA&ixlib=rb-4.0.3&q=80&w=2000" alt="InfoQの記事「100行以下のGoでコンテナを作る」をやってみた"/><p>InfoQの「Build Your Own Container Using Less than 100 Lines of Go」という記事を読んで、コンテナが技術的にどのように成り立っているのか、大変面白く学ぶことができました。本ブログでは、その記事の内容を紹介していきます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.infoq.com/articles/build-a-container-golang/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Build Your Own Container Using Less than 100 Lines of Go</div><div class="kg-bookmark-description">Shipping containers and software containers share a lot in common, but the analogy has limits. This article explores this relationship further by demonstrating how it is possible to build a simple container using less than 100 lines of Golang code. Topics covered include namespaces, cgroups and laye…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.infoq.com/statics_s2_20250129235939/apple-touch-icon.png" alt="InfoQの記事「100行以下のGoでコンテナを作る」をやってみた"><span class="kg-bookmark-author">InfoQ</span><span class="kg-bookmark-publisher">Julian Friedman</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.infoq.com/articles/build-a-container-golang/en/smallimage/logo1.jpg" alt="InfoQの記事「100行以下のGoでコンテナを作る」をやってみた"/></div></a></figure><h3 id="%E8%A8%98%E4%BA%8B%E3%81%AE%E6%A6%82%E8%A6%81">記事の概要</h3><p>InfoQの記事では、コンテナ技術の基盤となる仕組みを解説しながら、Go言語を用いてシンプルなコンテナを構築する方法を紹介しています。<br>コンテナは、以下の3つの主要技術を活用して構築されています。</br></p><p><strong>①Namespaces</strong><br>プロセスやネットワークを隔離することで、コンテナごとに独立した環境を作成します。</br></p><p>PID 名前空間 : あるプロセスがカーネルにプロセス一覧を要求するとまるで自身と子プロセスのみが存在しているように見せます</p><p>MNT（マウント）名前空間 : ディレクトリをマウントし、ホストを含む他の名前空間に影響を及ぼさないようにします。またpivot_rootシステムコールを使うと、ホストとは別のファイルシステムを持つことができ、これによって自分自身がUbuntu、BusyBox、Alpine などホストとは異なる環境で動作しているように見せることができます</p><p>USER（ユーザー）名前空間 : プロセスが認識するuid(ユーザーID)をホスト上の異なるuidにマッピングします。コンテナのuidを0だと認識させることで、自分がまるでroot権限を持っていると思い込ませつつ、ホストでは権限が無いのでセキュリティの観点からも強力な仕組みです。</p><p>そのほかにもNET（ネットワーク）名前空間、UTS（UNIX Time-sharing System）名前空間、IPC（Inter-Process Communication）名前空間の分離を行っています。</p><p><strong>②cgroups</strong><br>CPUやメモリなどのリソースを制限し、各コンテナが公平に（または設計次第では不公平に）リソースを使用できるように管理します。</br></p><p><strong>③Layered Filesystems</strong><br>Dockerでは<br>[ ベースOS ] <br>[ 依存ライブラリ ] <br>[ アプリケーション ] <br>のような層状のファイルシステムになっており、この仕組みのおかげで、ベースOSを毎回コピーする必要がなく、変更があった部分だけを管理しています。<br>そうすると、ダウンロードが早くなったり、起動が早くなるなどの利点があります。</br></br></br></br></br></br></p><h3 id="go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">Go言語でコンテナを作成する</h3><p>記事では、Go言語を用いて100行未満のコードでシンプルなコンテナを作成する方法を紹介しています。</p><!--kg-card-begin: markdown--><pre><code class="language-go">package main

import (
	&quot;fmt&quot;
	&quot;os&quot;
	&quot;os/exec&quot;
	&quot;syscall&quot;
)

func main() {
	switch os.Args[1] {
	case &quot;run&quot;:
		parent()
	case &quot;child&quot;:
		child()
	default:
		panic(&quot;wat should I do&quot;)
	}
}

func parent() {
	cmd := exec.Command(&quot;/proc/self/exe&quot;, append([]string{&quot;child&quot;}, os.Args[2:]...)...)
	cmd.SysProcAttr = &amp;syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
	}
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		fmt.Println(&quot;ERROR&quot;, err)
		os.Exit(1)
	}
}

func child() {
	must(syscall.Mount(&quot;rootfs&quot;, &quot;rootfs&quot;, &quot;&quot;, syscall.MS_BIND, &quot;&quot;))
	must(os.MkdirAll(&quot;rootfs/oldrootfs&quot;, 0700))
	must(syscall.PivotRoot(&quot;rootfs&quot;, &quot;rootfs/oldrootfs&quot;))
	must(os.Chdir(&quot;/&quot;))

	cmd := exec.Command(os.Args[2], os.Args[3:]...)
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		fmt.Println(&quot;ERROR&quot;, err)
		os.Exit(1)
	}
}

func must(err error) {
	if err != nil {
		panic(err)
	}
}
</code></pre>
<!--kg-card-end: markdown--><p>このコードは、Go言語の <code>exec.Command</code> を利用して、新しいプロセスを生成し、その中で隔離された環境を作成する仕組みを持っています。</p><p>実行時には <code>rootfs</code> ディレクトリを作成し、 <code>go run main.go run ls</code> のような形で引数を渡して実行します。</p><p>parent()内にある、"/proc/self/exe"というのがLinux特有のもので、Macでは動かすことができません。<br>"/proc/self/exe"には現在実行中のプロセスの実行ファイルがシンボリックリンクとして置かれる仕組みになっていて、実行中に自分自身を再実行しているイメージです。</br></p><h4 id="%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">コードのポイント</h4><p>①<code>parent()</code> 関数では、新しいプロセスを生成し、<code>syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS</code> のフラグを設定することで、新しい名前空間を作成。</p><p><code>syscall.CLONE_NEWUTS</code> → ホスト名 (hostname) を分離<br><code>syscall.CLONE_NEWPID</code> → プロセス ID (PID) を分離<br><code>syscall.CLONE_NEWNS</code> → マウント (ファイルシステム) を分離</br></br></p><p>②<code>child()</code> 関数では、<code>pivot_root</code> を用いてファイルシステムのルートを変更し、隔離された環境を構築。</p><p>このコードを実行すると、通常の環境とは異なる独立したコンテナ環境が起動します。</p><h3 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h3><p>はじめにMacでは上記の理由から起動できず、Docker for Macのubuntuイメージで実行していました</p><p>作成したコンテナ環境でls ( <code>go run main.go run ls</code>)を実行しようとしましたが、child関数にあるようにルートディレクトリを分離していて <code>/bin</code> ディレクトリなんかもありませんから、実行できず</p><p>ホストのlsファイルのシンボリックリンクをrootfsに設置して<code>go run main.go run ./ls</code> としても実行できず</p><p>PivotRootで旧ルートディレクトリ（ホストの/）がoldrootfsにマウントされているので、 <code>go run main.go run /oldrootfs/bin/ls</code> としても実行できず</p><p>goで <code>hello</code> と標準出力する実行ファイルを配置しても実行できずでして<br>まだ完全に動かせてはいないのですが、逆に本当にホストと分離された環境になってしまっているんだな…と感じ、とてもおもしろい経験でした！</br></p><p>本物のコンテナにするには、cgroupsなどなど他にも色々必要なようです。（記事内では「それらをすると100行を超えてしまうかもしれないね！」とジョークを飛ばされていました）</p><p>どうやって隔離された環境が作られているのか、魔法のように感じていたコンテナ技術も、システムコールや既存のOSの機能を組み上げて作られていると思うととても胸が熱くなるな〜と思いました！<br>ホスト名を分離するシステムコールがあるのとかも面白いですよね</br></p><p>また色々実験してみようと思います！<br>おしまい</br></p>]]></content:encoded></item><item><title><![CDATA[社会保険(健康保険・厚生年金保険)の加入要件について学ぼう！]]></title><description><![CDATA[こんにちは！
アンチパターン管理部の森口です。
今回は、社会保険(健康保険・厚生年金保険)の加入要件について学びたいと思います。

法律改正により、2016年10月から段階的に「短時間労働者に対する社会保険の適用の拡大」がされていますが、まずは適用拡大以前から加入義務がある人の要件を確認しましょう！

【社会保険の加入対象者】
■適用拡大前（1980年〜2016年9月末）
加入要件：1日または1週の所定労働時間および1月の所定労働日数が常時雇用者のおおむね4分の3以上
参考：適用事業所と被保険者｜日本年金機構
[https://www.nenkin.go.jp/service/kounen/tekiyo/jigyosho/20150518.html]

例えば、正社員が週40時間・月20日勤務する企業の場合、「週の所定労働時間が30時間以上かつ月の所定労働日数が15日以上」で加入義務が発生します。

■適用拡大後（2016年10月〜段階的に拡大）
対象企業（2016年10月〜）：従業員数501人以上の企業
対象企業（2022年10月〜）：従業員数101人以上の企業
対象企業（2024年]]></description><link>https://tech.anti-pattern.co.jp/social-insurance-participation-requirements/</link><guid isPermaLink="false">Ghost__Post__61dbc0653986b000013a797e</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 05 Feb 2025 10:08:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは！<br>
アンチパターン管理部の森口です。<br>
今回は、社会保険(健康保険・厚生年金保険)の加入要件について学びたいと思います。</br></br></p>
<p>法律改正により、2016年10月から段階的に「短時間労働者に対する社会保険の適用の拡大」がされていますが、まずは適用拡大以前から加入義務がある人の要件を確認しましょう！</p>
<h2 id="%E3%80%90%E7%A4%BE%E4%BC%9A%E4%BF%9D%E9%99%BA%E3%81%AE%E5%8A%A0%E5%85%A5%E5%AF%BE%E8%B1%A1%E8%80%85%E3%80%91">【社会保険の加入対象者】</h2>
<h4 id="%E2%96%A0%E9%81%A9%E7%94%A8%E6%8B%A1%E5%A4%A7%E5%89%8D%EF%BC%881980%E5%B9%B4%E3%80%9C2016%E5%B9%B49%E6%9C%88%E6%9C%AB%EF%BC%89">■適用拡大前（1980年〜2016年9月末）</h4>
<p>加入要件：1日または1週の所定労働時間および1月の所定労働日数が常時雇用者のおおむね4分の3以上<br>
参考：<a href="https://www.nenkin.go.jp/service/kounen/tekiyo/jigyosho/20150518.html">適用事業所と被保険者｜日本年金機構</a></br></p>
<p>例えば、正社員が週40時間・月20日勤務する企業の場合、「週の所定労働時間が30時間以上かつ月の所定労働日数が15日以上」で加入義務が発生します。</p>
<h4 id="%E2%96%A0%E9%81%A9%E7%94%A8%E6%8B%A1%E5%A4%A7%E5%BE%8C%EF%BC%882016%E5%B9%B410%E6%9C%88%E3%80%9C%E6%AE%B5%E9%9A%8E%E7%9A%84%E3%81%AB%E6%8B%A1%E5%A4%A7%EF%BC%89">■適用拡大後（2016年10月〜段階的に拡大）</h4>
<p>対象企業（2016年10月〜）：従業員数501人以上の企業<br>
対象企業（2022年10月〜）：従業員数101人以上の企業<br>
対象企業（2024年10月〜）：従業員数51人以上の企業 ←現在はここ！<br>
参考：<a href="https://www.nenkin.go.jp/service/kounen/tekiyo/jigyosho/tanjikan.html">短時間労働者に対する健康保険・厚生年金保険の適用の拡大｜日本年金機構</a></br></br></br></p>
<h6 id="%E5%AF%BE%E8%B1%A1%E4%BC%81%E6%A5%AD%E3%81%AE%E5%88%A4%E6%96%AD%E5%9F%BA%E6%BA%96%E3%81%A7%E3%81%82%E3%82%8B%E3%80%8C%E5%BE%93%E6%A5%AD%E5%93%A1%E6%95%B0%E3%80%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">対象企業の判断基準である「従業員数」について</h6>
<p>ここで言う従業員数とは、「フルタイムの従業員数」＋「週労働時間がフルタイムの3/4以上の従業員数」のことなので、従業員が51人以上いる企業でも、フルタイムやフルタイムの3/4以上の従業員が50人以下であれば対象企業になりません。<br>
ただし、従業員数には取締役等の役員も含めるそうなのでカウントする際はご注意を！<br>
参考：<a href="https://jinjibu.jp/qa/detl/109104/1/">社会保険適用拡大における取締役(役員)の取り扱いについて｜人事のQ&amp;A『日本の人事部』</a></br></br></p>
<ul>
<li>月ごとに従業員数をカウントして、直近12カ月のうち6カ月で基準を上回ると適用拡大の対象企業（特定適用事業所）になる</li>
<li>日本年金機構において、直近11カ月のうち5カ月50人を超えたことが確認できた場合は、対象の適用事業所に対して、「特定適用事業所に関する重要なお知らせ」が送付される<br>
参考：<a href="https://www.nenkin.go.jp/service/kounen/tekiyo/jigyosho/tokuteitekiyou.html">特定適用事業所該当・不該当の手続き｜日本年金機構</a></br></li>
</ul>
<h6 id="%E7%9F%AD%E6%99%82%E9%96%93%E5%8A%B4%E5%83%8D%E8%80%85%E3%81%AE%E5%8A%A0%E5%85%A5%E8%A6%81%E4%BB%B6">短時間労働者の加入要件</h6>
<p>対象企業の従業員で、以下4つの要件全てに該当する場合は社会保険の加入義務が発生します。</p>
<ul>
<li>加入要件1：週の所定労働時間が20時間以上</li>
<li>加入要件2：月額賃金が8.8万円以上</li>
<li>加入要件3：2カ月を超える雇用の見込みがある</li>
<li>加入要件4：学生ではない</li>
</ul>
<p>各要件を理解し、対象企業（特定適用事業所）に該当するのか、社会保険の加入義務が発生するのか、正しく判断しましょう！</p>
<p>以上です！</p>
<!--kg-card-end: markdown--><p/>]]></content:encoded></item><item><title><![CDATA[定額減税について学ぼう！]]></title><description><![CDATA[こんにちは！
アンチパターン管理部の森口です。
今回は、給与担当者として「定額減税」について学んだことをまとめてみました！

※こちらのブログは、給与所得者(勤務先から給与を受け取っている人)を対象に書いております。公的年金等の受給者や事業所得者の場合は、内容が異なると思いますのでご了承ください。

定額減税ってなに？
所得額に関係なく、納税額から一律に同じ額を差し引いて税負担を軽減する減税方法のことを「定額減税」といいます。（他に定率減税という方法もある）
「デフレ完全脱却のための総合経済対策
[https://www.kantei.go.jp/jp/headline/sougoukeizaitaisaku/index.html]
」の一環として、2024年6月から、所得税3万円・個人住民税1万円の計4万円が減税されます。

所得税の定額減税について
■対象者は？
 * 税区分が甲欄であること（扶養控除申告書を提出していること）
 * 国内居住者であること（日本国内に住所がある、または現在まで引き続き1年以上居所を有する個人）
 * 2024年6月1日に会社に在籍していること（休職者]]></description><link>https://tech.anti-pattern.co.jp/fixed-tax-reduction/</link><guid isPermaLink="false">Ghost__Post__6652d2ba27e5640001680679</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 05 Feb 2025 10:07:19 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは！<br>
アンチパターン管理部の森口です。<br>
今回は、給与担当者として「定額減税」について学んだことをまとめてみました！</br></br></p>
<p>※こちらのブログは、給与所得者(勤務先から給与を受け取っている人)を対象に書いております。公的年金等の受給者や事業所得者の場合は、内容が異なると思いますのでご了承ください。</p>
<h2 id="%E5%AE%9A%E9%A1%8D%E6%B8%9B%E7%A8%8E%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB%EF%BC%9F">定額減税ってなに？</h2>
<p>所得額に関係なく、納税額から一律に同じ額を差し引いて税負担を軽減する減税方法のことを「定額減税」といいます。（他に定率減税という方法もある）<br>
「<a href="https://www.kantei.go.jp/jp/headline/sougoukeizaitaisaku/index.html">デフレ完全脱却のための総合経済対策</a>」の一環として、2024年6月から、所得税3万円・個人住民税1万円の計4万円が減税されます。</br></p>
<h2 id="%E6%89%80%E5%BE%97%E7%A8%8E%E3%81%AE%E5%AE%9A%E9%A1%8D%E6%B8%9B%E7%A8%8E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">所得税の定額減税について</h2>
<h4 id="%E2%96%A0%E5%AF%BE%E8%B1%A1%E8%80%85%E3%81%AF%EF%BC%9F">■対象者は？</h4>
<ul>
<li>税区分が甲欄であること（扶養控除申告書を提出していること）</li>
<li>国内居住者であること（日本国内に住所がある、または現在まで引き続き1年以上居所を有する個人）</li>
<li>2024年6月1日に会社に在籍していること（休職者も含まれる）</li>
<li>2024年の本人の所得が1,805万円（給与収入のみの場合は2,000万円）以下であること
<ul>
<li>所得が1,805万円を超える見込みがある場合も、2024年6月以降の給与からは一旦控除される(控除する/しないは選べない)、年末調整や確定申告で最終的に精算される</li>
</ul>
</li>
</ul>
<h4 id="%E2%96%A0%E6%B8%9B%E7%A8%8E%E9%A1%8D%E3%81%AF%EF%BC%9F">■減税額は？</h4>
<p>対象者本人：3万円<br>
同一生計配偶者：3万円<br>
扶養親族：3万円/人<br>
※いずれも国内居住者に限る<br>
※<a href="https://www.keisan.nta.go.jp/r5yokuaru/cat2/cat22/cat22a/cid237.html">同一生計配偶者とは</a><br>
※<a href="https://www.keisan.nta.go.jp/r5yokuaru/ocat2/ocat22/cid911.html">扶養親族とは</a></br></br></br></br></br></p>
<h4 id="%E2%96%A0%E6%B8%9B%E7%A8%8E%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F">■減税方法は？</h4>
<p>2024年6月1日以降の最初の給与等の源泉徴収税額から順次控除し、控除しきれない場合は年末調整で控除されます。<br>
それでも控除しきれない場合は給付措置が行われる見込みです。</br></p>
<h2 id="%E5%80%8B%E4%BA%BA%E4%BD%8F%E6%B0%91%E7%A8%8E%E3%81%AE%E5%AE%9A%E9%A1%8D%E6%B8%9B%E7%A8%8E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">個人住民税の定額減税について</h2>
<h4 id="%E2%96%A0%E5%AF%BE%E8%B1%A1%E8%80%85%E3%81%AF%EF%BC%9F">■対象者は？</h4>
<ul>
<li>国内居住者であること（日本国内に住所がある、または現在まで引き続き1年以上居所を有する個人）</li>
<li>2024年度(2024年6月~2027年5月)の個人住民税が「非課税」や「均等割及び森林環境税のみ」ではないこと</li>
<li>2023年の本人の所得が1,805万円（給与収入のみの場合は2,000万円）以下であること
<ul>
<li>所得税の場合は今年(2024年)の所得を見るが、住民税は前年(2023年)の所得を見る</li>
</ul>
</li>
</ul>
<h4 id="%E2%96%A0%E6%B8%9B%E7%A8%8E%E9%A1%8D%E3%81%AF%EF%BC%9F">■減税額は？</h4>
<p>対象者本人：1万円<br>
控除対象配偶者：1万円<br>
控除対象配偶者以外の同一生計配偶者：1万円（2025年度に減税される）<br>
扶養親族：1万円/人<br>
※いずれも国内居住者に限る<br>
※<a href="https://www.keisan.nta.go.jp/r5yokuaru/cat2/cat22/cat22a/cid148.html#:~:text=%E6%8E%A7%E9%99%A4%E5%AF%BE%E8%B1%A1%E9%85%8D%E5%81%B6%E8%80%85%E3%81%A8%E3%81%AA%E3%82%8B%E4%BA%BA">控除対象配偶者とは</a><br>
※<a href="https://www.city.yao.osaka.jp/0000074353.html#link-1d">控除対象配偶者以外の同一生計配偶者とは</a></br></br></br></br></br></br></p>
<h4 id="%E2%96%A0%E6%B8%9B%E7%A8%8E%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F">■減税方法は？</h4>
<p>通常は6月〜翌年5月の12ヶ月間で徴収されますが、定額減税の対象者は、2024年6月の住民税が徴収されず(0円)、減税後の金額を2024年7月～2025年5月の11ヶ月間で徴収されます。</p>
<h2 id="%E5%BE%93%E6%A5%AD%E5%93%A1%E3%81%8C%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8">従業員が気をつけること</h2>
<ul>
<li>制度の概要と対象者について理解しておく</li>
<li>会社から定額減税に関する確認やお知らせが来たらチェックする</li>
<li>住民税決定通知書を確認する</li>
<li>6月以降の給与明細を確認する</li>
<li>年末調整後に源泉徴収票を確認する</li>
<li>定額減税で引ききれないと見込まれる場合、調整給付金（当初給付・不足額給付）に関する案内が市区町村から対象者に届くので、内容を確認して必要な手続きをする<br>
※<a href="https://www.cas.go.jp/jp/seisaku/benefit2023/FAQ/index.html#Q11">調整給付について</a></br></li>
</ul>
<p>以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[2025年のB to B SaaS業界の展望を予想してみる]]></title><description><![CDATA[
新年あけましておめでとうございます。
信田（しのだ）です。

2024年は、B to B SaaSに向き合う1年でしたが、年末年始に時間があったので、改めて今後の日本における、B to B
SaaS業界について考えてみました。


以前に、SaaSの時代はもう終わってしまったのか？
[https://tech.anti-pattern.co.jp/saasnoshi-dai-hamouzhong-watutesimatutanoka/#:~:text=%E3%81%A7%E3%81%AF%E3%80%81%E3%80%8CSaaS%E3%80%8D%E3%81%AF%E3%82%82%E3%81%86,%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82]

という記事を書きましたが、今回は、2024年を通して感じたことを元に、2025年のB to B SaaS業界の展望を個人的な希望も込めて
予想してみたいと思います。


2024年を通して感じたこととしては、これからまた]]></description><link>https://tech.anti-pattern.co.jp/ozheng-yue-ni/</link><guid isPermaLink="false">Ghost__Post__6778f38027e5640001681977</guid><category><![CDATA[SaaSus Platform]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[kenji.shinoda]]></dc:creator><pubDate>Tue, 14 Jan 2025 05:40:17 GMT</pubDate><content:encoded><![CDATA[<p><br>新年あけましておめでとうございます。<br>信田（しのだ）です。</br></br></p><p>2024年は、B to B SaaSに向き合う1年でしたが、年末年始に時間があったので、改めて今後の日本における、B to B SaaS業界について考えてみました。<br/></p><p>以前に、<a href="https://tech.anti-pattern.co.jp/saasnoshi-dai-hamouzhong-watutesimatutanoka/#:~:text=%E3%81%A7%E3%81%AF%E3%80%81%E3%80%8CSaaS%E3%80%8D%E3%81%AF%E3%82%82%E3%81%86,%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82">SaaSの時代はもう終わってしまったのか？</a></p><p>という記事を書きましたが、今回は、2024年を通して感じたことを元に、2025年のB to B SaaS業界の展望を<em><strong>個人的な希望も込めて</strong></em>予想してみたいと思います。<br/></p><p>2024年を通して感じたこととしては、これからまたSaaSの波が来るぞということでした。いやむしろ、これからくる波が本物の波なのではないか？とさえ感じています。<br/></p><p>まず、数字だけで見るとポジティブな数字はたくさん出てきます。</p><ol><li>国内SaaS市場は年平均成長率11.7% <br>(参考：<a href="https://enterprisezine.jp/news/detail/18613">スマートキャンプ『SaaS業界レポート 2023』を解説</a>)<br/></br></li><li>国内SaaS市場は現在から3.7倍以上になる可能性がある<br>(参考：<a href="https://onecapital.jp/perspectives/japan-saas-insights-2023">One Capital「Japan SaaS Insights 2023」</a>)<br/></br></li><li>日本のエンタープライズ市場は28.5兆円で前年比4.7%成長<br> (参考：<a href="https://japan.zdnet.com/article/35200563/">ガートナ「日本のエンタープライズIT支出、2023年は4.7％増」</a>)<br/></br></li><li>クラウド市場の成長率20%前後<br>(参考：<a href="https://www.publickey1.jp/blog/23/awsazure920231synergy_researchcanalys.html">Synergy Research Groupグローバルのクラウドインフラ市場シェア」</a>)</br></li></ol><p>これらを見るに、数字だけで見ると、SaaSの市場はまだまだこれから伸びるし、エンタープライズ市場の中でSaaSの割合が高まっていくであろうことを考えるとポテンシャルは非常に高く感じる。</p><p>さあ、では、なぜ、数字上は、どの数字を見ても伸びてそうに見えるのに、そしてアメリカではしっかり伸びているのに、国内において体感値として伸びていると感じづらいのか？</p><p>いくつかの要因があるのではないかと思う。</p><ol><li>新興SaaS企業を支えてきたベンチャーキャピタルの機運の低下</li><li>クラウドなど最新テクノロジーの活用の遅れ</li><li>日本特有のSIビジネス/カスタマイズ文化</li></ol><p>ただ、これらの要因については、少しずつ変化が見えてきているのではないかと感じていて、これらが変化していくことによって、一気に、B to B SaaSの波が進むのではないかと感じている。</p><ol><li>新興SaaS企業を支えてきたベンチャーキャピタルの機運の低下<br><br>＜起きている変化＞<br>こちらについては、確かに、過去SaaS企業の時価総額に軒並み高値がついていた時期とは様子が変わり、ベンチャーキャピタルの投資も慎重になってきている。また、AIという新しい領域への投資が盛り上がり、SaaS投資への機運が下がっている側面はあるものの、これまでと指標を変えながらではあるが、SaaS企業への投資は引き続き継続されている。<br>また、大きな変化として、新しいタイプのプレイヤー、またベンチャー投資ではない資本を活用したSaaSがこれから生まれ始めるのではないかという機運を感じる。例えば、SIerは事業モデルの転換としてSaaSに向き合うことを意思決定している企業は多いと感じる。また、日本の各産業を代表とするエンタープライズ企業が新規事業として、自分たちの蓄積してきた業務ナレッジをSaaSとして新規事業展開していく事例も増えてくるのではないかと考える。<br>つまり、これまでより、SaaSビジネスを立ち上げるプレイヤーの種類が増加していくことで、ここの課題は解決されていくのではないかと予想している。<br/></br></br></br></br></br></li><li>クラウドなど最新テクノロジーの活用の遅れ<br><br>＜起きている変化＞<br>SaaSビジネスがなぜ注目されたのか？の背景には、新しいテクノロジーを活用することによって、スケーラブルなソフトウェアビジネスのモデルが構築できるようになったこと。また、そのテクノロジーの活用によって、SaaSの顧客側に、「割り勘効果」をもたらすことができて、業務ソフトウェアの活用の民主化が圧倒的に進むポテンシャルがあるからではないかと考えている。<br>しかし、これまでは、日本においては、SaaSのストック型のビジネスモデルやSaaSの主要KPIなどに注目が集まり、最新テクノロジーをフックにした爆発的な業務ソフトウェアの民主化を起こしきれなかったのではないかと考えている。<br>しかし、2024年になって、クラウド領域におけるグローバルTOPのAWSが本格的に動き始めるのではないかという機運を感じる。<br><br>・AWS Japan がソフトウェア企業に提供する「AWS SaaS 支援プログラム」の提供を開始<br><a href="https://aws.amazon.com/jp/blogs/news/saasification/">https://aws.amazon.com/jp/blogs/news/saasification/</a><br>・国内初のSaaS技術専門書の発売<br><a href="https://www.oreilly.co.jp/books/9784814401017/">https://www.oreilly.co.jp/books/9784814401017/</a><br><br>また、APIファーストの機運も高まっており、我々アンチパターン社も、SaaS開発運用を支援する「SaaSus Platform」を提供している。<br><br>これらを背景に、2025年には、SaaS提供の技術的視点の注目度も上がり、盛り上がりを見せていくのではないかと予想している。<br/></br></br></br></br></br></br></br></br></br></br></br></br></br></br></li><li>日本特有のSIビジネス/カスタマイズ文化<br><br>＜起きている変化＞<br>国内のSIビジネスは足元堅調ではあるものの、エンジニア不足の問題を抱え、人月ビジネスの限界も見え始めているのではないかと感じる。また、事業会社もDXを求められており、これまで社内の業務システムにかけてきた、潤沢なIT予算を、新しい価値の提供など攻めの領域へのIT投資への転換が求められるようになっている。そんな時代背景を考えると、これまでのように潤沢なIT予算を活用して、1 社1社カスタマイズで自社の業務システムを作っていくことが現実的に難しくなってくることも予想される。<br>そんな事業会社の変化により、SIerも汎用化してサービス提供するべき領域を見極め、ストックビジネスを一定割合作っていき、逆に、攻めのIT投資要望に関しては、これまで通り、SIによる人月モデルで独自性の高いシステムづくりの支援をしていくなど、領域分けが進めていくべきではないかと考える。その結果、これまで進められなかったSaaS事業が進み始めるのではないかと予想している。</br></br></br></br></li></ol><p><br>では、具体的に、どんな領域で、SaaSが立ち上がっていくのかを予想してみる。</br></p><h3 id="%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%99%82%E4%BB%A3%E8%83%8C%E6%99%AF%E3%82%92%E3%81%A8%E3%82%89%E3%81%88%E3%81%9F%E6%96%B0%E9%A0%98%E5%9F%9F%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96">現在の時代背景をとらえた新領域のサービス化</h3><p><br>マイナンバー対応、CO2の排出量測定、人的資本開示、インボイス制度対応、社会的背景の変化によってこれまでなかった業務が新しく必要となってくる際に、サービス化していくことは、業務規模が大きくなりにくい、かつ他の業務システムとの連携の必要性が少ない場合も多く、SaaSとして導入するハードルが低くなりやすい。その結果、これまでも、この領域でのサービス化は多く例が見られるが今後も、この領域ではSaaSが生まれていく可能性が高い領域ではないかと想定できる。<br/></br></p><h3 id="%E7%8F%BE%E5%A0%B4dx%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96">現場DXのサービス化<br/></h3><p>これまでは、B to B領域においては、いわゆるデスクワーカー向けのSaaSが多かったが、モバイル端末の普及やIoT技術の発展などを背景に、現場業務「店舗業務」、「配送業務」、「工事業務」、「製造業務」、「倉庫業務」などDXが進むではないかと予想できる。また、これまでであれば、これらを社内システムとしてDXを進めるという文脈になりがちだったが、新たな収益基盤の確立やクラウドテクノロジーの発展などを考えると、1社向けではなく、複数事業者にサービス提供をするということが現実的に視野に入ってくるのではないかと考える。この領域では、これまで主流ではなかった、B to B領域における、モバイルアプリでのSaaSが増えてくるのではないかと予想している。<br/></p><h3 id="%E8%87%AA%E6%B2%BB%E4%BD%93%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96">自治体システムのサービス化<br/></h3><p>現在は、1,724ある自治体は、それぞれに自分たちの自治体に必要なシステムを、地場のソフトウェア事業者に依頼して作ることが多いようだ。しかしながら、少子化、人口減少を背景に、「消滅可能性自治体」などのキーワードが出てくるなど、自治体としても、人口規模に合わせた予算の縮小などは必須となってくる。もちろん、物理的な建物や施設の縮小などに目が向きがちだが、ソフトウェア予算の縮小も対象となってくるはずだ。そう考えると、これまでのように、同じような仕組みを各自治体のソフトウェア会社がそれぞれで作るのは現実的ではないし、非効率である。このような背景から、自治体においてもSaaSの機運は高まってくるのではないかと考える。</p><h3 id="%E4%BC%81%E6%A5%AD%E3%81%AE%E3%82%B3%E3%82%A2%E6%A5%AD%E5%8B%99%E3%82%92%E6%8B%85%E3%81%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96">企業のコア業務を担うシステムのサービス化<br/></h3><p>これまでも、エンタープライズ企業における、SaaSの活用は進んできたように思うが、使われている領域を考えると、1事業部の1サブシステムにおいてSaaSを活用する事例や、全社業務だとしても、人事領域など、他業務と切り離しやすい領域でのSaaS活用が進んできたように思う。しかしながら、今後も、さまざまな業務のシステムリプレイスのタイミングが定期的にくる中で、これからも繰り返しリプレイスを繰り返していくのかというのには疑問が残るところだ。</p><p>他の領域に比べるとハードルは高いが、この領域においても、SaaSを提供するプレイヤーが出てくるのではないかと考える。</p><p>また、コア業務におけるハードルの高さは、カスタマイズの多さや連携が必要なシステムの多さではないかと思う。ただ、SaaS提供事業者がSaaSに外部公開APIを備えることによって、ある程度、SaaS利用企業側での柔軟性を上げることができるのではないかと考えている。利用企業側が、外部公開APIが存在するSaaSを活用しながら、自社独自で必要な要件については、SaaSのAPIを活用し、これまで通り社内システムとして持つことである程度解決できるのではないかと考えている。</p><p>これらにより、この領域でも、SaaSが出てくることを個人的にはとても期待している。<br/></p><p>さて、今回のまとめとしては、エンタープライズIT市場は28.5兆円規模であり、これからもまだ成長することが予想される中、SaaS市場は、1.1兆円程度である。たったの4%である。ここに関しては、まだまだ伸びるべきであり、その鍵は、SaaSビジネスを推進するプレイヤーがどのように現れて、最新テクノロジーを活用して、多くの企業にメリットのあるようなビジネスを立ち上げられるかどうかにかかっている。<br/></p><p>我々も、今後出てくる、「SaaSビジネスを推進するプレイヤー」をしっかりと支えていけるような事業者であるために、しっかりと頑張っていきたいと考えている。よし、2025年も頑張ろう。</p>]]></content:encoded></item><item><title><![CDATA[GPTsを簿記3級のお勉強に使ってみたよ]]></title><description><![CDATA[おはようございます。atomです。
諸事情あり、簿記3級を年内に取る必要があったので、勉強の効率化をGPTsを使ってやってみました。

GPTsとは
そもそもGPTsとはなんぞやという話なので、本人（ChatGPT）に聞いてみました↓

> 「GPTs」は、特定の用途や目的に合わせてカスタマイズされたGPT（AIモデル）を作成・利用する仕組みのことを指します。この機能を使えば、一般的なAIモデル（汎用型）ではなく、特定の業務やシナリオに最適化されたAIを簡単に作成・活用できます。
つまりは、特定の目的に最適化されたオリジナルのGPTを作ることができます。（有料：Plus以上が必要）。汎用型を用いて、いちいちプロンプトのテンプレをコピペしたりするのはめんどいし、複数人が同じタスクを行う際にクオリティにばらつきが出るなどがGPTsを使えば手軽かつ質の安定につながるという感じです。

例えば、ChatGPTに「今日の天気は？」と聞くと、おそらく「晴れです」とか「何℃くらいです」とか答えてくれると思います。しかし、回答にばらつきがでます。日によっては湿度まで答えてくれたり、明日の天気まで答えて]]></description><link>https://tech.anti-pattern.co.jp/untitled-5/</link><guid isPermaLink="false">Ghost__Post__6765178027e56400016818e2</guid><dc:creator><![CDATA[atom]]></dc:creator><pubDate>Wed, 08 Jan 2025 03:06:33 GMT</pubDate><content:encoded><![CDATA[<p>おはようございます。atomです。<br>諸事情あり、簿記3級を年内に取る必要があったので、勉強の効率化をGPTsを使ってやってみました。</br></p><h2 id="gpts%E3%81%A8%E3%81%AF">GPTsとは</h2><p>そもそもGPTsとはなんぞやという話なので、本人（ChatGPT）に聞いてみました↓</p><blockquote>「GPTs」は、特定の用途や目的に合わせてカスタマイズされたGPT（AIモデル）を作成・利用する仕組みのことを指します。この機能を使えば、一般的なAIモデル（汎用型）ではなく、特定の業務やシナリオに最適化されたAIを簡単に作成・活用できます。</blockquote><p>つまりは、特定の目的に最適化されたオリジナルのGPTを作ることができます。（有料：Plus以上が必要）。汎用型を用いて、いちいちプロンプトのテンプレをコピペしたりするのはめんどいし、複数人が同じタスクを行う際にクオリティにばらつきが出るなどがGPTsを使えば手軽かつ質の安定につながるという感じです。</p><p>例えば、ChatGPTに「今日の天気は？」と聞くと、おそらく「晴れです」とか「何℃くらいです」とか答えてくれると思います。しかし、回答にばらつきがでます。日によっては湿度まで答えてくれたり、明日の天気まで答えてくれたりすることもあるけど、そうでない時もある、みたいな具合に。では、ほしい情報を一発で引き出せるようにプロンプトをテンプレ化しようとなると思います。</p><p>＜テンプレ例＞</p><p><em>今日の天気は？と聞かれたら以下を回答してください。<br>天気の場所は東京都渋谷区でお願いします。</br></em></p><p><em>・天気（朝昼夜）<br>・気温（朝昼夜）<br>・湿度<br>・花粉の情報<br>・紫外線の情報<br>・服装の目安</br></br></br></br></br></em></p><p><em>最後に参照したページのURLを記載してください。</em></p><p>これを毎日コピペして聞くことで、画一的な情報を引き出すことができます。<br>それをさらに簡略化するのがGPTsと言えます。</br></p><p>上記のテンプレをGPTsにあらかじめ設定しておくことで、簡単な指示で同様の情報を引き出すことができます。上記の例は比較的シンプルな内容なので、有料ならコピペしますけど？と思うかもですが、より複雑な場合（会話のラリーが必要だったり、分岐が発生する場合）にはGPTsが活躍します。</p><p>このGPTsを活用して、簿記3級の勉強アシスタントを作ったというのが、今回のお話し。</p><h2 id="%E4%BD%9C%E3%82%8A%E6%96%B9">作り方</h2><p>まず、手元にPDFの簿記3級のテキスト、問題集、模擬試験問題があったので、これを読み込ませます（GPTsにはPDFなどの資料をあらかじめ読み込ませておくことができます）。回答はブラウジングでもいけますが、信頼できそうな資料を読み込ませた方が質は安定するかと思います。ちなみに読み込めるファイルは20個までで、それぞれ512MBが上限らしいです。</p><p>あとは会話形式でやりたいことを投げれば設定を更新してくれます。<br>「問題集から問題出して」とか「教科書参照して質問に答えて」とかでOKです。会話せずに設定画面のテキストボックスに指示を直接書くでもOKです。</br></p><p>思い通りに動かない時は、GPTsの設定画面で今の機能を全部提示してなどGPTの設定を確認すると、不足や間違いが見つかることもあります。</p><p>指示が長すぎると対応できない場合もあるので、その場合はGPTを2つに分けるなどすると良いかと思います（今回の場合だと質問に答える用と問題出す用など）。よほど複雑でない限りは特に気にせずで良いかと思います。</p><h3 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A7%8B%E6%88%90">実際の構成</h3><p>今回は会話形式でざっくりやりたいことを投げて、GPTが以下のようにまとめてくれたものを採用してます。</p><hr><p>このGPTは、簿記3級の学習をサポートする専門アシスタントです。ユーザーがアップロードした「教科書」、「問題集」、「模擬試験」を基にして、簿記に関する質問や問題演習を提供します。</p><p>1. 資料の参照:</p><p>- ユーザーが「〜について教えて」と質問した場合、関連する資料のページを特定し、それを基に解説を提供します。<br>- 資料で解答が不足している場合、適宜ブラウジング機能を活用して補足情報を提供し、参照リンクを添えます。</br></p><p>2. 問題の作成と解説:</p><p>- ユーザーが「問題出して」または特定のトピックに関する問題を求めた場合、アップロードされた資料を参照して問題を作成します。<br>- 問題は必ず1問ずつ出題します。<br>- 難易度が指定されない場合は標準的な難易度で出題し、指示があれば難易度を調整します。<br>- 問題解答後、初心者でも理解できるように丁寧に解説を行い、必要に応じて参照ページやリンクを必ず明示します。</br></br></br></p><p>3. 質問の明確化:</p><p>- ユーザーの意図が明確でない場合、必要に応じて質問内容を確認します。</p><p>4. コミュニケーション:</p><p>- 優しい語り口で丁寧にサポートを行い、初学者が理解しやすいように工夫します。<br>- ユーザーから応援や励ましを求められた際には、積極的に応援し、不正解の場合には前向きな言葉で慰め、再挑戦を促します。<br/></br></p><p>5. 学習の分析:</p><p>- ユーザーの解答を分析し、苦手な箇所やミスの傾向を特定します。<br>- 得意分野を見つけ、効果的な学習戦略を提案します。<br>- 定期的に学習の進捗レポートを作成し、学習計画の調整を支援します。</br></br></p><hr><h3 id="%E3%81%93%E3%81%AEgpts%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8">このGPTsでできること</h3><p>・問題作成＆解説</p><p>難易度の調整や指定した大問対策の問題など、お願いしたらよしなに問題を出してくれます。</p><p>・質問への回答</p><p>「あれ、これってなんだっけ？」など気になることがあれば聞くと答えてくれます。いちいちテキストをペラペラする必要がないので、疑問解消が手っ取り早くできます。</p><p>・傾向の分析</p><p>過去の会話を参照して、自身の苦手や得意の傾向を教えてくれます。傾向に合わせて問題の出題などもしてくれます。<br/></p><p>・応援してくれる</p><p>GPTの性格なども設定できるので、優しく励ます感じでなど入れておけば、問題に不正解した時に励ましてくれます。</p><p>※模擬試験の作問と回答用紙の作成（PDF）などもできるっぽい（GPT曰く）ですが、試してみても作問自体はできるものの、PDF化は不具合で実際にはできませんでした。</p><h2 id="%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">良かったこと</h2><p>問題集などを繰り返しやると、なんとなく流れで回答を覚えてしまったりするのでランダムな出題ができるのと、難易度の調整ができるのは勉強に役立ちました。あと移動中でも勉強しやすいのでスマホで勉強や質問ができます。</p><h2 id="%E6%B3%A8%E6%84%8F%E7%82%B9">注意点</h2><p>GPTの解説には当然ながら間違いもあるので、何もわからない！みたいな状態で活用するのはお勧めできません。ある程度、勉強をした上で、GPTの間違いにも違和感を抱ける程度のレベルは必要になるかと思います。また、送信可能数（3時間あたり40）が決まっているので、上限があるというのも忘れずに。</p><h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2><p>従業員が定期的に受ける情報セキュリティの試験問題の作問や、特定の業務のマニュアルを読み込ませて、マニュアルを理解できているかのチェックテストなどにも活用できそうだなと思ったので、今後も良き活用方法がないか探って行こうと思います。</p><p>ちなみに試験は無事合格しました！🙌</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[システムコーチングが与えた効果]]></title><description><![CDATA[過去に高橋のブログでご紹介させていただいた「システムコーチング」の続編という形で、本ブログをお届けできらたと思います。

受講後に業務を高橋と野川の2人(以降は2人のことをシステムと呼びます)で遂行する中で、システムコーチングが与えた効果やさらなる関係性の変化についてお伝えします。

が、綴っていく前に、「システムコーチング受講」のおさらいから入らせていただきます。

システムコーチングの振り返り
まず、システムコーチングとは、「組織・チームの関係性の向上を促し成果に繋げるためのアプローチ方法」のことです。

こちらを踏まえ、私たちが受講した目的とその振り返りは、

 1. コーチングを肌で知る
    →半年間のセッションを通して達成
 2. お互いの関係性を深め、人事チームとして更なる一歩を踏み出していく
    →「対話から共話」への変化がみてとれたため達成 * 以前に増してお互いが能動的に相手に関わりに行くようになった
     * 「お互いの仕事スタイルはまだわからないけどきっと大丈夫」という安心感が醸成された
    
    

となります。

▼「システムコーチングを受]]></description><link>https://tech.anti-pattern.co.jp/systemcoaching-blog-2/</link><guid isPermaLink="false">Ghost__Post__66d695c327e5640001681186</guid><dc:creator><![CDATA[Minami Nogawa]]></dc:creator><pubDate>Tue, 01 Oct 2024 08:56:18 GMT</pubDate><content:encoded><![CDATA[<p>過去に高橋のブログでご紹介させていただいた「システムコーチング」の続編という形で、本ブログをお届けできらたと思います。</p><p>受講後に業務を高橋と野川の2人(以降は2人のことをシステムと呼びます)で遂行する中で、システムコーチングが与えた効果やさらなる関係性の変化についてお伝えします。</p><p>が、綴っていく前に、「システムコーチング受講」のおさらいから入らせていただきます。</p><h2 id="%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">システムコーチングの振り返り</h2><p>まず、システムコーチングとは、「組織・チームの関係性の向上を促し成果に繋げるためのアプローチ方法」のことです。</p><p>こちらを踏まえ、私たちが受講した目的とその振り返りは、</p><!--kg-card-begin: markdown--><ol>
<li>コーチングを肌で知る<br>
→半年間のセッションを通して達成</br></li>
<li>お互いの関係性を深め、人事チームとして更なる一歩を踏み出していく<br>
→「対話から共話」への変化がみてとれたため達成
<ul>
<li>以前に増してお互いが能動的に相手に関わりに行くようになった</li>
<li>「お互いの仕事スタイルはまだわからないけどきっと大丈夫」という安心感が醸成された</li>
</ul>
</br></li>
</ol>
<!--kg-card-end: markdown--><p>となります。</p><p>▼「システムコーチングを受講しました」ブログはこちら▼</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/systemcoaching-blog-1/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">システムコーチングを受講しました</div><div class="kg-bookmark-description">こんにちは。ブログ初執筆で緊張している高橋です。 今回はこの場をお借りして、アンチパターン社人事の高橋・野川が実際にシステムコーチングを受講した様子とその振り返りをお届けいたします。 そもそもシステムコーチングとは「システムコーチング」というワードを紐解く上で、「システム」と「コーチング」に分けて考えます。 * システムとは 2人以上の関係性で共通の目的やアイデンティティを持ち、かつ相互に依存し合った集団 例えば、PJチーム、コミュニティ、友人、家族などが挙げられます。 きっとみなさんも何らかのシステムの一部なのではないでしょうか。 一方で…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Hina Takahashi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><h2 id="%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%97%E3%81%91%E3%81%A6%E5%AE%9F%E6%96%BD%E3%81%97%E3%81%9F%E6%B4%BB%E5%8B%95">システムコーチングを受けて実施した活動</h2><p>システムコーチングを受け、感情や思想、体調のシェアなど、お互いを知りに行く活動の重要性を感じ、下記2つの取り組みを行いました。</p><ul><li>今日もがんばろうの会(デイリースクラム)</li><li>今週の振り返り会(Good and More / 今週を踏まえた次週のシステムのテーマ設定)</li></ul><p>これらをセットするという判断をしたこと自体、システムコーチングが与えた効果の一つだと感じています。</p><p>そして、この活動を通して、お互いの業務への関心とモニタリングしてもらえているという安心感が醸成されたり、新たな開示により相手の解像度が上がる時間になっています。また、お互いの心身の健康状態の変化にも気が付くようになり、これらは、大きな獲得物だと感じました。</p><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A5%AD%E5%8B%99">実際の業務</h2><p>上記2つの活動を踏まえ、4月から8月に主にシステムで実施した業務は下記となります。</p><!--kg-card-begin: markdown--><ul>
<li>展示会(マーケティング担当として出展計画〜当日の運営)
<ul>
<li>AWS Summit
<ul>
<li>全てペア作業で実施</li>
</ul>
</li>
<li>Developer eXperience Day
<ul>
<li>高橋がイニシアチブを取り、野川は相談役</li>
</ul>
</li>
</ul>
</li>
<li>合宿(人事担当として準備〜当日の運営)
<ul>
<li>役割分担して遂行</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><p>システムコーチングは、業務を遂行する中で、お互いの考え方を徐々に掴み、考える足並みが揃っていくことにつながった感じています。また、仕事のスタイルを身体(五感で感じる感覚)で実感できるようになっていきました。何度か二人で取り組んだことのある業務(合宿)に関しては、阿吽の呼吸で遂行できるようになっていたこともポジティブな大きな変化だと感じています。</p><h2 id="%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">振り返り</h2><p>システムコーチングにより、私たちの信頼関係は、質とスピードを担保しながら日々構築されていっているように感じています。</p><p>システムコーチングで実施した、お互いの中に入り込むという感覚や頻度は上がり、安心して頼れる、相談できる、という関係性が醸成されてました。そのため、コミュニケーションエラーもなく、業務の効率もそのアウトプットの質もあがっているように思います。</p><p>また、良好な関係性を構築することで、お互いのポテンシャルを発揮することにもつながると感じ、改めて日々の業務を遂行する上で、システムの信頼関係は重要だと思いました。</p>]]></content:encoded></item><item><title><![CDATA[入社してから半年を振り返って]]></title><description><![CDATA[こんにちは。アンチパターン社員の高橋です (ちなみにアンチパターン社には高橋が3人います) 。

普段はSaaSus Platform [https://saasus.io/]のマーケティング、人事、PRに携わらせていただいている新卒社員です。

入社してから早半年、あっという間でした。

入社式前日、ドキドキが止まらずに思わず友達に電話をかけたあの夜が、昨日のことのように蘇ります。

本記事では、そんな私の4月からの半年間に起きた変化、新卒として働いてみて得たものについて、シェアできたらなと思っております。

入社前の気持ち
私がアンチパターン社への入社を決めたのは、約2年前の2022年10月。

アンチパターン社が織りなす、「組織」「人」のカラーの虜になり、入社に至りました。

「仕事とは、家族や交友関係、趣味と同じように、自身を彩るものである」

そんな思いを強く持っていた私は、仕事に対してお金稼ぎの手段と割り切って向き合うことに抵抗があり、 "Work As Play"
を価値観として掲げるアンチパターン社に強く惹かれたのです。

これと言ってやりたいことはないが、誇れる私であ]]></description><link>https://tech.anti-pattern.co.jp/newgraduate-blog-1/</link><guid isPermaLink="false">Ghost__Post__66d6953e27e5640001681171</guid><dc:creator><![CDATA[Hina Takahashi]]></dc:creator><pubDate>Tue, 24 Sep 2024 02:47:15 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。アンチパターン社員の高橋です (ちなみにアンチパターン社には高橋が3人います) 。</p><p>普段は<a href="https://saasus.io/">SaaSus Platform</a>のマーケティング、人事、PRに携わらせていただいている新卒社員です。</p><p>入社してから早半年、あっという間でした。</p><p>入社式前日、ドキドキが止まらずに思わず友達に電話をかけたあの夜が、昨日のことのように蘇ります。</p><p>本記事では、そんな私の4月からの半年間に起きた変化、新卒として働いてみて得たものについて、シェアできたらなと思っております。</p><h2 id="%E5%85%A5%E7%A4%BE%E5%89%8D%E3%81%AE%E6%B0%97%E6%8C%81%E3%81%A1">入社前の気持ち</h2><p>私がアンチパターン社への入社を決めたのは、約2年前の2022年10月。</p><p>アンチパターン社が織りなす、「組織」「人」のカラーの虜になり、入社に至りました。</p><p>「仕事とは、家族や交友関係、趣味と同じように、自身を彩るものである」</p><p>そんな思いを強く持っていた私は、仕事に対してお金稼ぎの手段と割り切って向き合うことに抵抗があり、 "Work As Play" を価値観として掲げるアンチパターン社に強く惹かれたのです。</p><p>これと言ってやりたいことはないが、誇れる私であり続けたい、その場所として、この会社を選びました。</p><p>ここにいたら、私が私であり続けられる、そのためならなんでもやる、</p><p>そんな覚悟だったのかもしれません。</p><p/><h2 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E6%A5%AD%E5%8B%99">実際の業務</h2><p>上記のような意気込みで入社した私ですが、お恥ずかしながらSaaSの知識はほぼなく。マーケティングに携わると言っても、当初はマーケティングファネルの存在すら知りませんでした。</p><p>そんな中で、ボーリュームを持って向き合った業務が以下です。</p><!--kg-card-begin: markdown--><ul>
<li>
<p>展示会 (<a href="https://aws.amazon.com/jp/summits/japan-2024/">AWS Summit Japan 2024</a> / <a href="https://cto-a.org/dxd2024">Developer eXperience Day 2024</a>) の出展</p>
<ul>
<li>各イベントの出展目的の設定</li>
<li>投資対効果の策定</li>
<li>ブースでの活動のシミュレーション</li>
<li>当日稼働社員への説明会の実施</li>
<li>開期中オペレーション</li>
</ul>
</li>
<li>
<p>SaaSus Platform 顧客獲得活動計画目標の設定</p>
<ul>
<li>半期の活動方針の策定</li>
<li>各種活動の数値目標の設定</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><p>自社のプロダクトを売るために、自社のプロダクトを知る、業界を知る、といった初歩の初歩からスタートダッシュを切りました。</p><p>その後は抽象と具体をひたすら行ったり来たりする日々。</p><p>目的を策定するために、会社の方針を理解・納得しにいき、</p><p>会社の方針を理解するために、今までの顧客獲得活動の歴史を辿る。</p><p>ブースオペレーションのパターンを洗い出すために、出展目標を固く握りつつ、展示会ごとのカラーを鑑みて、活動の現実ラインを捉えにいく。</p><p/><p>自分でどれだけ想像し、仮説を持てるか</p><p/><p>仕事とは、その繰り返しだと思わされる半年間でした。</p><h2 id="%E6%84%9F%E3%81%98%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">感じていること</h2><h3 id="%E6%80%9D%E8%80%83%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E6%A5%BD%E3%81%97%E3%81%95">思考し続ける楽しさ</h3><p/><p>研修がなかった分、「今自分が何を何のために知りにいくべきか」を思考し続け、捉えにいく活動を重ねる毎日です。もちろん苦戦することもありますが、その旅路も含めて楽しんでいます。<br>こうして実践を繰り返すうちに、自分ができることを自認し始め、少しずつ「わかる」が増えてきています。それでも「わからない」ことは無限にあって、世界がどんどん広がっていく楽しさに心を躍らせる、そんな日々です。</br></p><h3 id="%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AA%E3%82%89%E3%81%A7%E3%81%AF%E3%81%AE%E5%85%85%E5%AE%9F%E6%84%9F">スタートアップならではの充実感</h3><p/><p>新卒という立場ながら、メインプロダクトの成長を間近で感じ、日々思考を深め、尊敬する先輩方や上司の方々にたくさん助けていただきながら働けるのは、スタートアップならではだと感じます。</p><p>たくさんの思いがけない壁にぶつかりながら、小さな達成感を重ねる毎日は、私の大きな誇りとなっています。</p><h3 id="%E5%A4%A7%E5%A5%BD%E3%81%8D%E3%81%AA%E4%BB%B2%E9%96%93%E3%81%A8%E5%83%8D%E3%81%91%E3%82%8B%E5%96%9C%E3%81%B3">大好きな仲間と働ける喜び</h3><p/><p>入社の決め手となったアンチパターン社のカラーは、想像する通り、いや、それ以上のものでした。</p><p>業務を進める中でどんな壁にぶち当たっても、仲間がいるから乗り越えられる、そんな心強さがあります。</p><p>「仕事も遊びのうち」「信頼」「平等」に基づいたコミュニケーションは仕事を進めやすくするだけでなく、アンチパターンのファミリー感を一層強めてくれている気がします。</p><p><br>気になった方はぜひ社員と話してみてください！<br>大きな自社愛を持って働く仲間たちとの時間はあまりに心地よく、幸せです。</br></br></p><p/><h2 id="%E4%BB%8A%E5%BE%8C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">今後について</h2><p>とはいえ、まだ入社して半年。</p><p>この先も長く続くアンチパターンライフ、後輩が入ってくる頃にはこんな状態になりたいと思っています。</p><h3 id="saasus-platform-%E3%81%AE%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%BB%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%81%AB%E3%80%81%E8%87%AA%E4%BF%A1%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E8%B2%A2%E7%8C%AE%E3%81%A7%E3%81%8D%E3%81%9F%E3%81%A8%E8%A8%80%E3%81%88%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%AB%E3%81%AA%E3%82%8B">SaaSus Platform のマーケ・セールスに、自信を持って貢献できたと言える状態になる</h3><p/><p>じゃあこれがどんな状態かという話なのですが、</p><p>「展示会を1人で自走できた」ときに初めてこの感覚を得られると思っています。</p><p>それだけ？と思う方もいらっしゃるかもしれませんが、</p><p>展示会成功のためには、SaaSus Platformのマーケ・セールスのロードマップを一気通貫で理解するのはもちろん (これがそもそも奥深い) 、来場者のプロフィールを想像し、私たちが自信を持ってご提供しているものにどうしたら関心を寄せていただけるか考え、想像し、トライし、また想像し...</p><p>数値では測れない部分も含めてたくさん想像しながら、数値として実績を残す。</p><p>その道筋をいかに綺麗に作れるか。</p><p/><p>今はたくさんの助言をいただきながらなんとか進めている展示会準備ですが、いつしか立派な「展ジニア」になれるよう、日々猛進していきたいと思います。</p><p/><h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2><p>改めて半年間を振り返り、アンチパターン社に入社して心の底から良かったと感じています。</p><p>この選択が私の中で最良の選択としてあり続けられるように、今後も精進していきますので、応援のほどよろしくお願いいたします。</p>]]></content:encoded></item><item><title><![CDATA[PostmanでSaaSus Platform APIを実行する]]></title><description><![CDATA[こんにちは、郡山です。
今回は 「SaaSの開発から運用まで」の支援を可能とするツール SaaSus Platform のAPI を Postmanで実行する方法をご紹介いたします。

SaaSus Platform についてはこちら
https://saasus.io/

Postman についてはこちら
https://www.postman.com/

SaaSus Platform API を呼び出すには Authorization ヘッダーに署名を設定する必要があります。署名は日時情報+API Key+
HTTPメソッド+host+port+path+Request Body 情報を SaaSus Platform で発行しているSecret Key で
HMAC-SHA256 を求めてそれを設定します。そのためPostmanのPre-Request Scriptを利用して署名を作成し Authorization
ヘッダーへ追加してリクエストを行う必要があります。

まず Postman へ環境設定を取り込みます。
以下環境変数をテキスト等で保存して環境インポートしてください]]></description><link>https://tech.anti-pattern.co.jp/postmandesaasus-platform-apiwoshi-xing-suru/</link><guid isPermaLink="false">Ghost__Post__6687786327e5640001680bdb</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 14 Aug 2024 02:06:24 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、郡山です。<br>今回は 「SaaSの開発から運用まで」の支援を可能とするツール SaaSus Platform のAPI を Postmanで実行する方法をご紹介いたします。</br></p><p>SaaSus Platform についてはこちら<br><a href="https://saasus.io/" rel="nofollow noopener">https://saasus.io/</a></br></p><p>Postman についてはこちら<br><a href="https://www.postman.com/">https://www.postman.com/</a></br></p><!--kg-card-begin: markdown--><p>SaaSus Platform API を呼び出すには Authorization ヘッダーに署名を設定する必要があります。署名は<code>日時情報</code>+<code>API Key</code>+<code>HTTPメソッド</code>+<code>host</code>+<code>port</code>+<code>path</code>+<code>Request Body</code> 情報を SaaSus Platform で発行しているSecret Key で HMAC-SHA256 を求めてそれを設定します。そのためPostmanのPre-Request Scriptを利用して署名を作成し Authorization ヘッダーへ追加してリクエストを行う必要があります。</p>
<!--kg-card-end: markdown--><p>まず Postman へ環境設定を取り込みます。<br>以下環境変数をテキスト等で保存して環境インポートしてください。</br></p><!--kg-card-begin: markdown--><details>
    <summary>環境変数</summary>
<pre><code class="language-json">{
	&quot;id&quot;: &quot;61c7ec1b-28c9-4221-969e-8bf307495aa5&quot;,
	&quot;name&quot;: &quot;SaaSus Platform Environments&quot;,
	&quot;values&quot;: [
		{
			&quot;key&quot;: &quot;SaaSID&quot;,
			&quot;value&quot;: &quot;&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;APIKey&quot;,
			&quot;value&quot;: &quot;&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;SecretKey&quot;,
			&quot;value&quot;: &quot;&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;SecretKey_Stripe&quot;,
			&quot;value&quot;: &quot;&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlAuth&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/auth&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlPricing&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/pricing&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlStripe&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/stripe&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlBilling&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/billing&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlIntegration&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/integration&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlAwsMarketplace&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/awsmarketplace&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlCommunication&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/communication&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlApiLogs&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/apilog&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlAnalysis&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/analysis&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlEventBridge&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/integration&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		},
		{
			&quot;key&quot;: &quot;UrlSmartAPIGateway&quot;,
			&quot;value&quot;: &quot;https://api.saasus.io/v1/apigateway&quot;,
			&quot;type&quot;: &quot;default&quot;,
			&quot;enabled&quot;: true
		}
	],
	&quot;_postman_variable_scope&quot;: &quot;environment&quot;,
	&quot;_postman_exported_at&quot;: &quot;2025-05-27T01:59:01.367Z&quot;,
	&quot;_postman_exported_using&quot;: &quot;Postman/11.47.1-250526-2336&quot;
} 
</code></pre>
</details><!--kg-card-end: markdown--><p>取り込むと以下の設定となるので SaaSus Platformの開発コンソール-&gt;基本設定-&gt;APIキー画面に設定されているSaaSID、APIKey、SecretKeyを初期値へそれぞれ設定して保存してください。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-4.png" class="kg-image" alt="" loading="lazy" width="1992" height="1186" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-4.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-4.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-4.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-4.png 1992w" sizes="(min-width: 720px) 720px"/></figure><p>続いてAPIを実行するためコレクションの設定を行なって行きます。</p><!--kg-card-begin: markdown--><p>SaaSus Platform Auth APIをインポートします<br>
Auth API:  <a href="https://docs.saasus.io/file/saasus_api/authapi.yml">https://docs.saasus.io/file/saasus_api/authapi.yml</a><br>
<span style="font-size: 0.8em">※ 他のAPIに関しては下表に記載</span></br></br></p>
<!--kg-card-end: markdown--><p>インポートするとコレクションが作成されますので、コレクションの設定を変更します。</p><p>認可タブで Auth Type を認証なしに設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-2.png" class="kg-image" alt="" loading="lazy" width="2000" height="1247" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-2.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2024/07/image-2.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>コレクションの Script-&gt;Pre-req へスクリプトを設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="1247" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2024/07/image-1.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>こちらが設定するスクリプトとなります。</p><!--kg-card-begin: markdown--><details>
    <summary>Pre-req</summary>
<pre><code class="language-javascript">// 「yyyymmddhhmm」形式の日付時刻文字列に変換する関数
function formatDateInYyyymmddhhmi() {
    const date = new Date();

    const yyyy = date.getUTCFullYear().toString();
    const mm = (&quot;00&quot; + (date.getUTCMonth() + 1)).slice(-2);
    const dd = (&quot;00&quot; + (date.getUTCDate())).slice(-2);
    const hh = (&quot;00&quot; + (date.getUTCHours())).slice(-2);
    const mi = (&quot;00&quot; + (date.getUTCMinutes())).slice(-2);

    return yyyy + mm + dd + hh + mi;
}

// ボディに含まれるバインドパラメータを値に変更する
function replaceBodyBindParameterToValue(body){

    // newmanで実行すると undefined になるので空文字列を設定
    if (body === undefined){
        return &quot;&quot;;
    }

    // NULLの場合そのまま
    if (!Object.keys(body).length){
        return body;
    };

    body = JSON.stringify(body.raw);
    body = pm.collectionVariables.replaceIn(body);
    body = pm.variables.replaceIn(body);
    return JSON.parse(body);
}

function getQueryString(queryString) {
    const queryStart = queryString.indexOf(&quot;?&quot;);
    if (queryStart === -1) return &quot;&quot;;
    return queryString.slice(queryStart);
}

// 署名を作成する
function makeSecretHash(){

    // 日時情報
    const yyyymmddhhmi = formatDateInYyyymmddhhmi();

    // パスに含まれるバインドパラメータを値に変更する
    var path = pm.collectionVariables.replaceIn(pm.request.url.getPath()) 
                + getQueryString(pm.request.url.toString());
    const body = replaceBodyBindParameterToValue(pm.request.body);

    // Pre-Request Scriptでは パスが取れない（暫定）
    var BaseUrl = &quot;&quot;
    if (pm.request.url.host[0] === &quot;{{UrlAuth}}&quot;){
        BaseUrl = (pm.environment.get(&quot;UrlAuth&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlBilling}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlBilling&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlPricing}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlPricing&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlStripe}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlStripe&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlCommunication}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlCommunication&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlAwsMarketplace}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlAwsMarketplace&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlApiLogs}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlApiLogs&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlAnalysis}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlAnalysis&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlEventBridge}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlEventBridge&quot;) + path).split(&quot;//&quot;);
    } else if (pm.request.url.host[0] === &quot;{{UrlSmartAPIGateway}}&quot;) {
        BaseUrl = (pm.environment.get(&quot;UrlSmartAPIGateway&quot;) + path).split(&quot;//&quot;);
    }
    
    // 日時情報+API Key+HTTPメソッド+URL(Host:Port/URI)+Request Body
    const message = yyyymmddhhmi + pm.environment.get(&quot;APIKey&quot;) + pm.request.method + BaseUrl[1] + body;
    const sha256 = CryptoJS.HmacSHA256(message, pm.environment.get(&quot;SecretKey&quot;));

    // console.log(message);
    return CryptoJS.enc.Hex.stringify(sha256);
}

const Sig = makeSecretHash();
pm.request.headers.add(`SAASUSSIGV1 Sig=${Sig}, SaaSID=${pm.environment.get(&quot;SaaSID&quot;)}, APIKey=${pm.environment.get(&quot;APIKey&quot;)}`, &quot;Authorization&quot;);
</code></pre>
</details>
<!--kg-card-end: markdown--><p>ここまでで共通の設定項目は終了です。</p><!--kg-card-begin: markdown--><p>続いては実行するAPIの設定になります。<br>
APIを取り込むと初期設定が <code>{{baseUrl}}</code>/basic-info となっているので <code>{{UrlAuth}}</code>/basic-info に変更します。<br>
<span style="font-size: 0.8em">※ 呼び出すAPIにより設定は異なります、他のAPIに関しては下表に記載</span></br></br></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-8.png" class="kg-image" alt="" loading="lazy" width="1992" height="1186" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-8.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-8.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-8.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-8.png 1992w" sizes="(min-width: 720px) 720px"/></figure><p>認可タブで Auth Type を「上位の認可設定を継承」を設定します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-6.png" class="kg-image" alt="" loading="lazy" width="1992" height="1186" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-6.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-6.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-6.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-6.png 1992w" sizes="(min-width: 720px) 720px"/></figure><p>上記設定後、送信ボタンを押下するとAPIが実行され結果が返ってくることが確認できます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-7.png" class="kg-image" alt="" loading="lazy" width="1992" height="1790" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-7.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-7.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-7.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-7.png 1992w" sizes="(min-width: 720px) 720px"/></figure><p>Postman を利用すると気軽にAPIを実行することができ動作検証が可能です。<br>また、環境定義の切り替えを行うだけで他の環境へ接続することができるので SaaSus Platform のテストで非常に役立っています。</br></p><!--kg-card-begin: markdown--><p>各APIのymlはこちらのURLを参照<br>
Auth API:<a href="https://docs.saasus.io/file/saasus_api/authapi.yml">https://docs.saasus.io/file/saasus_api/authapi.yml</a><br>
Pricing API:<a href="https://docs.saasus.io/file/saasus_api/pricingapi.yml">https://docs.saasus.io/file/saasus_api/pricingapi.yml</a><br>
Billing API:<a href="https://docs.saasus.io/file/saasus_api/billingapi.yml">https://docs.saasus.io/file/saasus_api/billingapi.yml</a><br>
Communication API:<a href="https://docs.saasus.io/file/saasus_api/communicationapi.yml">https://docs.saasus.io/file/saasus_api/communicationapi.yml</a><br>
ApiLog API:<a href="https://docs.saasus.io/file/saasus_api/apilogapi.yml">https://docs.saasus.io/file/saasus_api/apilogapi.yml</a><br>
Analysis API:<a href="https://docs.saasus.io/file/saasus_api/analysisapi.yml">https://docs.saasus.io/file/saasus_api/analysisapi.yml</a></br></br></br></br></br></br></p>
<p>API呼び出し時の<code>{{baseUrl}}</code>は以下に変更して実行<br>
Auth API　：<code>{{baseUrl}}</code>　→ <code>{{UrlAuth}}</code><br>
Pricing API　：<code>{{baseUrl}}</code>　→ <code>{{UrlPricing}}</code><br>
Billing API　：<code>{{baseUrl}}</code>　→ <code>{{UrlBilling}}</code><br>
Communication API　：<code>{{baseUrl}}</code>　→ <code>{{UrlCommunication}}</code><br>
ApiLog API　：<code>{{baseUrl}}</code>　→ <code>{{UrlApiLogs}}</code><br>
Analysis API　：<code>{{baseUrl}}</code>　→ <code>{{UrlAnalysis}}</code></br></br></br></br></br></br></p>
<!--kg-card-end: markdown--><p/>]]></content:encoded></item><item><title><![CDATA[Transit GatewayとSite-to-Site VPNで3拠点間通信]]></title><description><![CDATA[Transit Gatewayを検証する機会があったので、記録を残したいと思います。
構成はこんな感じです。

TGW1アカウント、TGW2アカウントがアプリケーションの動作を想定したアカウントになり、TGWDCアカウントがデータセンタを想定したアカウントになります。
データセンタとはインターネットVPNで接続し、TGW1,2アカウントと、データセンタでそれぞれ通信を行う必要があるという想定です。

なので今回の記事では、Transit
GatewayでTGW1アカウント、TGW2アカウントの2拠点間で通信させる所を実施して、次回の記事でSite-to-Site
VPNを組み合わせた3拠点間で通信させる設定を行っていきます。

Transit Gateway
まず、TGW1アカウントでTransit Gatewayを作成して、TGW1アカウントとTGW2アカウント間で通信できるようにしていきます。

TGW1アカウントの作業
VPC - Transit Gatewayを開いて、「Transit Gatewayを作成」を選択します。
特に設定項目がないので、そのまま「作成」を選択します。]]></description><link>https://tech.anti-pattern.co.jp/transit-gateway-site-to-site-vpn/</link><guid isPermaLink="false">Ghost__Post__6692c2a327e5640001680f0a</guid><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Mon, 29 Jul 2024 16:56:58 GMT</pubDate><content:encoded><![CDATA[<p>Transit Gatewayを検証する機会があったので、記録を残したいと思います。<br>構成はこんな感じです。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/VPN---------------.drawio.svg" class="kg-image" alt="" loading="lazy" width="1654" height="1169"/></figure><p>TGW1アカウント、TGW2アカウントがアプリケーションの動作を想定したアカウントになり、TGWDCアカウントがデータセンタを想定したアカウントになります。<br>データセンタとはインターネットVPNで接続し、TGW1,2アカウントと、データセンタでそれぞれ通信を行う必要があるという想定です。</br></p><p>なので今回の記事では、Transit GatewayでTGW1アカウント、TGW2アカウントの2拠点間で通信させる所を実施して、次回の記事でSite-to-Site VPNを組み合わせた3拠点間で通信させる設定を行っていきます。</p><h1 id="transit-gateway">Transit Gateway</h1><p>まず、TGW1アカウントでTransit Gatewayを作成して、TGW1アカウントとTGW2アカウント間で通信できるようにしていきます。</p><h3 id="tgw1%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD">TGW1アカウントの作業</h3><p>VPC - Transit Gatewayを開いて、「Transit Gatewayを作成」を選択します。<br>特に設定項目がないので、そのまま「作成」を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-10.png" class="kg-image" alt="" loading="lazy" width="1920" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-10.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-10.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-10.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-10.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>状態がAvailableになるのを待ちます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-11.png" class="kg-image" alt="" loading="lazy" width="1655" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-11.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-11.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>作成したTransit Gatewayを、TGW2アカウントに共有していきます。<br>Transit Gatewayにチェックを入れ、アクション - 「Transit Gatewayを共有」を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-13.png" class="kg-image" alt="" loading="lazy" width="1655" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-13.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-13.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-13.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-13.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>Transit Gatewayを共有画面が表示されるので、「Transit Gatewayを共有」を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-14.png" class="kg-image" alt="" loading="lazy" width="1920" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-14.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-14.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-14.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-14.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>Nameにわかりやすい名前を設定、リソース項目の種類で「トランジットゲートウェイ」を選択、 先ほど作成したTransit Gatewayにチェックを入れます。<br>選択されたリソース項目にリソースIDが表示されるので、チェックを入れて、「次へ」を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-15.png" class="kg-image" alt="" loading="lazy" width="1920" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-15.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-15.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-15.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-15.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>特に設定項目無いので、次へを選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-16.png" class="kg-image" alt="" loading="lazy" width="1920" height="991" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-16.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-16.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>AWSアカウントIDにTGW2アカウントのIDを設定して、「追加」を選択します。<br>選択されたプリンシパルに追加されるので、「次へ」を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-17.png" class="kg-image" alt="" loading="lazy" width="1920" height="1055" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-17.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-17.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-17.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-17.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>最後に内容を確認して、「リソース共有を作成」を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-18.png" class="kg-image" alt="" loading="lazy" width="1920" height="1781" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-18.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-18.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-18.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-18.png 1920w" sizes="(min-width: 720px) 720px"/></figure><h3 id="tgw2%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD">TGW2アカウントの作業</h3><p>Resource Access Manager - リソースの共有（自分と共有）を開くと、TGW1アカウントから共有されたリソースが表示されているので、選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-19.png" class="kg-image" alt="" loading="lazy" width="1920" height="934" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-19.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-19.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-19.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>「リソース共有を承認」を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-20.png" class="kg-image" alt="" loading="lazy" width="1920" height="934" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-20.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-20.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-20.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-20.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>状態がAvailableになるのを待ちます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-21.png" class="kg-image" alt="" loading="lazy" width="1655" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-21.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-21.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-21.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-21.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>これでTGW1アカウントとTGW2アカウントで、1つのTransit Gatewayが共有出来た状態になりました。</p><p>続いて、Transit GatewayとVPCを紐づけて行きます。</p><h3 id="tgw1%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-1">TGW1アカウントの作業</h3><p>TGW1アカウントで、VPC - Transit Gateway アタッチメント を開いて、「Transit Gateway アタッチメントを作成」を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-22.png" class="kg-image" alt="" loading="lazy" width="1655" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-22.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-22.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-22.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-22.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>Transit Gateway ID項目で、作成したTransit Gatewayを指定します。<br>VPC ID項目で、接続対象とするVPCを選択します、サブネットID項目が表示されるので、対象とするサブネットを選択します。（複数サブネットがあって、それぞれのサブネットに通信対象のリソースがある場合、選択に悩むと思いますが、ここで選択していないサブネットもTransit Gatewayを使って通信が可能です）</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-23.png" class="kg-image" alt="" loading="lazy" width="1920" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-23.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-23.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-23.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-23.png 1920w" sizes="(min-width: 720px) 720px"/></figure><h3 id="tgw2%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-1">TGW2アカウントの作業</h3><p>同様の設定をTGW2アカウントでも行っていきます。結果はこうなります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-24.png" class="kg-image" alt="" loading="lazy" width="1655" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-24.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-24.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-24.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-24.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>あとは、ルーティング設定をすればTGW1アカウントとTGW2アカウントで通信が可能になります。</p><h3 id="tgw1%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-2">TGW1アカウントの作業</h3><p>VPC − ルートテーブル から、検証用のEC2を配置するサブネットのルートテーブルのルート設定を変更します。<br>TGW2アカウントへのルートとして、10.2.1.0/24宛のルートを登録します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-26.png" class="kg-image" alt="" loading="lazy" width="1655" height="859" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-26.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-26.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-26.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-26.png 1655w" sizes="(min-width: 720px) 720px"/></figure><p>検証用にEC2を作成しておきます。上記で設定したルートテーブルを使うサブネットにEC2を配置し、セキュリティグループでICMPの通信を許可してください。</p><h3 id="tgw2%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-2">TGW2アカウントの作業</h3><p>同様の設定をTGW2アカウントでも行っていきます。結果はこうなります。EC2も同様に作成してください。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-27.png" class="kg-image" alt="" loading="lazy" width="1655" height="859" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/07/image-27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/07/image-27.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/07/image-27.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/07/image-27.png 1655w" sizes="(min-width: 720px) 720px"/></figure><h3 id="tgw1%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-3">TGW1アカウントの作業</h3><p>EC2インスタンスに接続し、pingで疎通してみます。下記のように応答が帰ってきます。</p><pre><code>sh-5.2$ ping 10.2.1.5
PING 10.2.1.5 (10.2.1.5) 56(84) bytes of data.
64 bytes from 10.2.1.5: icmp_seq=1 ttl=126 time=0.865 ms
64 bytes from 10.2.1.5: icmp_seq=2 ttl=126 time=0.722 ms
64 bytes from 10.2.1.5: icmp_seq=3 ttl=126 time=0.602 ms
64 bytes from 10.2.1.5: icmp_seq=4 ttl=126 time=0.756 ms
64 bytes from 10.2.1.5: icmp_seq=5 ttl=126 time=0.662 ms
^C
--- 10.2.1.5 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4014ms
rtt min/avg/max/mdev = 0.602/0.721/0.865/0.089 ms</code></pre><h3 id="tgw2%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%A5%AD-3">TGW2アカウントの作業</h3><p>同じく、EC2インスタンスに接続し、pingで疎通してみます。下記のように応答が帰ってきます。</p><pre><code>sh-5.2$ ping 10.1.1.6
PING 10.1.1.6 (10.1.1.6) 56(84) bytes of data.
64 bytes from 10.1.1.6: icmp_seq=1 ttl=126 time=0.909 ms
64 bytes from 10.1.1.6: icmp_seq=2 ttl=126 time=1.57 ms
64 bytes from 10.1.1.6: icmp_seq=3 ttl=126 time=0.777 ms
64 bytes from 10.1.1.6: icmp_seq=4 ttl=126 time=0.720 ms
64 bytes from 10.1.1.6: icmp_seq=5 ttl=126 time=0.777 ms
^C
--- 10.1.1.6 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4073ms
rtt min/avg/max/mdev = 0.720/0.950/1.570/0.315 ms</code></pre><p>これでTGW1アカウント、TGW2アカウントの2拠点間で通信させることが出来ました。今回は2つのVPCで設定しているので、VPCピアリングで設定したほうが楽かもですが、数が増えていくと管理コストに差が出てくると思います。</p><p>あと、費用面ですが、<br>　・AWS Transit Gateway のアタッチメントごとの料金 ：0.07USD/1時間<br>　・処理データ 1 GB あたりの料金 ：0.02USD<br>　（東京リージョン）<br>となります、費用お見積り時にご注意くださいませ。<br>料金は変わる可能性がありますので、最新の料金はこちらでご確認ください。<br><a href="https://aws.amazon.com/jp/transit-gateway/pricing/">https://aws.amazon.com/jp/transit-gateway/pricing/</a></br></br></br></br></br></br></p>]]></content:encoded></item><item><title><![CDATA[Biomeへの切り替えがもたらす効果]]></title><description><![CDATA[こんにちは、いわむらです

先月のAWS
Summitで、チームトポロジーに関するトークセッションを聞き、開発効率の向上がいかに重要かを再認識しました。そこで、リンターとフォーマッターをBiomeへ切り替えることを試してみることにしました。

Biomeについては公式から以下の文章を引用してみました：

> Biomeは JavaScript、TypeScript、JSX そして JSON のための高速なformatter
[https://github.com/biomejs/biome/tree/main/benchmark#formatting] であり、Prettier
と97%の互換性 [https://console.algora.io/challenges/prettier]を持ち、CIと開発者の時間を節約します。
特に、Huskyを利用してコミット時に自動的にチェックを行う設定をしている場合、Biomeに切り替えることでチェックのスピードが向上し、時間の短縮が期待できます。

この記事では、Biomeへの切り替えがどのように時間短縮に寄与するのか、具体的な導入手順と共に]]></description><link>https://tech.anti-pattern.co.jp/huomatuta/</link><guid isPermaLink="false">Ghost__Post__6689282e27e5640001680c01</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Sun, 07 Jul 2024 07:26:21 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>先月のAWS Summitで、チームトポロジーに関するトークセッションを聞き、開発効率の向上がいかに重要かを再認識しました。そこで、リンターとフォーマッターをBiomeへ切り替えることを試してみることにしました。</p><p>Biomeについては公式から以下の文章を引用してみました：</p><blockquote><strong>Biomeは <em>JavaScript</em>、<em>TypeScript</em>、<em>JSX</em> そして <em>JSON</em> のための<a href="https://github.com/biomejs/biome/tree/main/benchmark#formatting">高速なformatter</a></strong> であり、<a href="https://console.algora.io/challenges/prettier"><strong><em>Prettier</em> と97%の互換性</strong></a>を持ち、<strong>CIと開発者の時間を節約します</strong>。</blockquote><p>特に、Huskyを利用してコミット時に自動的にチェックを行う設定をしている場合、Biomeに切り替えることでチェックのスピードが向上し、時間の短縮が期待できます。</p><p>この記事では、Biomeへの切り替えがどのように時間短縮に寄与するのか、具体的な導入手順と共に紹介します。Biomeの利点を最大限に活かし、開発効率を高める方法をぜひご覧ください。</p><h3 id="%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86">導入手順</h3><p>ここでは、BiomeをNext.jsプロジェクトに導入する具体的な手順を紹介します。現在使用しているeslintやprettierからBiomeへの移行手順も併せて解説します。</p><h4 id="1-biome%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1. Biomeのインストール</h4><p>まずは、Biomeをプロジェクトにインストールします。以下のコマンドを使用してインストールしてください。</p><pre><code class="language-bash">yarn add --dev --exact @biomejs/biome</code></pre><p>他のパッケージマネージャーについての詳細は、<a href="https://biomejs.dev/ja/guides/getting-started/">公式ドキュメント</a>をご覧ください。</p><h4 id="2-biome%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90">2. Biomeの設定ファイル作成</h4><p>次に、<code>yarn biome init</code>コマンドを実行して、Biomeの設定ファイルを作成します。</p><p>これによりプロジェクトのルートディレクトリにbiome.jsonファイルが生成されます。生成された設定ファイルに以下の設定を追加してみました。</p><pre><code class="language-json">{
  "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
  "organizeImports": {
  	"enabled": true
    "ignore": ["node_modules"]
  },
  "linter": {
    "enabled": true,
    "rules": {
      "all": true,
      "suspicious": {
        "noExplicitAny": "off"
      },
      "style": {
        "useNamingConvention": "off",
        "noDefaultExport": "off",
        "useFilenamingConvention": "off",
        "useImportType": "off"
      },
      "nursery": {
        "noUndeclaredDependencies": "off"
      },
      "complexity": {
        "useSimplifiedLogicExpression": "off",
        "noExcessiveCognitiveComplexity": "off"
      }
    }
  },
  "formatter": {
    "enabled": true,
    "formatWithErrors": false,
    "ignore": [],
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 100
  },
  "json": {
    "parser": {
      "allowComments": true
    },
    "formatter": {
      "enabled": true,
      "indentStyle": "space",
      "indentWidth": 2,
      "lineWidth": 100
    }
  },
  "javascript": {
    "formatter": {
      "enabled": true,
      "quoteStyle": "single",
      "jsxQuoteStyle": "double",
      "trailingCommas": "all",
      "semicolons": "always",
      "arrowParentheses": "always",
      "indentStyle": "space",
      "indentWidth": 2,
      "lineWidth": 100,
      "quoteProperties": "asNeeded"
    }
  }
}</code></pre><h3 id="%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%8A%B9%E6%9E%9C">実際の効果</h3><p>まず、Biomeの導入によって最も顕著に感じられたのは、コードフォーマットのスピード向上です。従来使用していたPrettierと比較して、Biomeは大幅に高速なフォーマットを実現しました。手元での検証では、同じコードベースをフォーマットする際にPrettierでは約4秒かかっていたのが、Biomeでは約0.2秒で完了しました。これにより、開発者がコードフォーマットに費やす時間が大幅に削減されました。</p><p>現在のプロジェクトのコードベースは、まだ半年ほどのもので比較的小さいため、時間短縮の効果は限定的かもしれません。しかし、プロジェクトが成長し、コードベースが大きくなるにつれて、Biomeの高速フォーマットの恩恵はさらに顕著になるでしょう。</p><h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3><p>開発効率を高めるためのツール選定は重要だなと感じています。Biomeを導入してみてぜひその効果を実感してみてください。開発フローの最適化により、より多くの時間を実装やレビューに費やすことができるようになるでしょう</p>]]></content:encoded></item><item><title><![CDATA[既存の Laravel コンテナを AWS Lambda にデプロイ]]></title><description><![CDATA[■結論
 * Lambda Web Adapter [https://github.com/awslabs/aws-lambda-web-adapter]
   を使うと、Dockerfileに一行追加するだけで(ほぼ)動く

COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.3 /lambda-adapter /opt/extensions/lambda-adapter

■やりたかったこと
皆さんはLaravelアプリケーションをどのようにデプロイしていますか？

私はもともとLaravelアプリケーションをDockerコンテナ上で開発し、AWS Fargate
[https://aws.amazon.com/jp/fargate/]にデプロイしていました。

しかし、たまにしかアクセスしないアプリケーションでは、サーバーが常時起動しているFargateでは費用が気になってくるものです。

対してAWS Lambda [https://aws.amazon.com/jp/lambda/]
は、アクセスがあったときのみ]]></description><link>https://tech.anti-pattern.co.jp/ji-cun-no/</link><guid isPermaLink="false">Ghost__Post__6658bb3f27e5640001680793</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Mon, 03 Jun 2024 11:09:06 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E2%96%A0%E7%B5%90%E8%AB%96">■結論</h2><ul><li><a href="https://github.com/awslabs/aws-lambda-web-adapter">Lambda Web Adapter </a>を使うと、Dockerfileに一行追加するだけで(ほぼ)動く</li></ul><pre><code class="language-Dockerfile">COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.3 /lambda-adapter /opt/extensions/lambda-adapter</code></pre><h2 id="%E2%96%A0%E3%82%84%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">■やりたかったこと</h2><p>皆さんはLaravelアプリケーションをどのようにデプロイしていますか？</p><p>私はもともとLaravelアプリケーションをDockerコンテナ上で開発し、<a href="https://aws.amazon.com/jp/fargate/">AWS Fargate</a>にデプロイしていました。</p><p>しかし、たまにしかアクセスしないアプリケーションでは、サーバーが常時起動しているFargateでは費用が気になってくるものです。</p><p>対して<a href="https://aws.amazon.com/jp/lambda/">AWS Lambda</a>は、アクセスがあったときのみ起動してくれます。さらにLambdaはコンテナのデプロイに対応しています。</p><p>そこで、Fargateにデプロイしているコンテナをお手軽にLambdaへ引っ越しする方法を考えました。</p><h2 id="%E2%96%A0%E4%BB%8A%E5%9B%9E%E4%BD%BF%E3%81%86%E3%82%82%E3%81%AE">■今回使うもの</h2><p>Laravel(PHP)をLambdaにデプロイしようと検索すると、<a href="https://bref.sh/">bref</a>を使った記事がたくさんヒットします。</p><p>が、今回は使いません。希望としては既存のコンテナを脳死でLambdaにデプロイしたいです。</p><p>今回の要件にピッタリなのが<a href="https://github.com/awslabs/aws-lambda-web-adapter">Lambda Web Adapter </a>です。これを使えば、コンテナで動くHTTPサーバーは何でもLamdbaにデプロイできます。</p><h2 id="%E2%96%A0%E6%89%8B%E9%A0%86">■手順</h2><p>簡単にまとめると以下の3ステップでできます。</p><h3 id="%E2%91%A0-fargate-ecs-%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AAdockerfile%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B">① Fargate (ECS) で動くようなDockerfileを用意する</h3><p>今回は既にある想定です。サンプルは最後にあります。</p><h3 id="%E2%91%A1-lambda-web-adapter%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B-dockerfile%E3%81%AB%E8%A8%98%E8%BF%B0">② Lambda Web Adapterを導入する (Dockerfileに記述)</h3><pre><code class="language-Dockerfile">COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.3 /lambda-adapter /opt/extensions/lambda-adapter</code></pre><h3 id="%E2%91%A2-web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%928080%E7%95%AA%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B">③ Webサーバーを8080番ポートで立ち上げる</h3><pre><code class="language-sh">php artisan serve --host=0.0.0.0 --port=8080</code></pre><p>ここは、実際にはCMDで呼び出すシェルファイルに記述し、コンテナ起動時にWebサーバーを立ち上げるようにしています。</p><p>なお、環境変数 "PORT" を設定すれば他のポートでも可です。</p><p>※ 今回はLaravelのコンテナを単体で動かすので、NginxなどのWebサーバーとはここでお別れします。</p><h2 id="%E2%96%A0%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%BB%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88">■メリット・デメリット</h2><p>アプリケーションに手を加えることなくFargateからLambdaへの移行ができたのが最大のメリットです。</p><p>ただし、Laravelアプリケーションを一つのLambda関数に閉じ込めるので、パフォーマンスには懸念が残ります。</p><p>今回は比較的小規模なアプリケーションだったのですが、Lambdaのメモリを512MB程度まで上げることで、気にならない程度までパフォーマンスが向上しました。(なお、Lambda設定可能な最小値は128MBですが、レスポンスに2秒弱かかりました。)</p><p>Lambdaを使っている場合、コールドスタートも気になります。Laravelのアプリケーション全体を一つのLambda関数に閉じ込めているので、起動が遅くなるのと引き換えに、いずれかのパスにアクセスすれば以降はウォームスタートとなるのが特徴です。</p><p>また、今回はDBアクセスについて検証していませんが、RDBへの同時接続数は意識する必要があります。AWSのサービスでは、<a href="https://aws.amazon.com/jp/rds/proxy/">RDS Proxy</a>や<a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Concepts.Aurora_Fea_Regions_DB-eng.Feature.Data_API.html">RDS Data API</a>などが使えそうです。あるいは<a href="https://aws.amazon.com/jp/dynamodb/">DynamoDB</a>などのNoSQLへの移行も考えられますね。</p><h2 id="%E2%96%A0%E3%81%BE%E3%81%A8%E3%82%81">■まとめ</h2><p><a href="https://github.com/awslabs/aws-lambda-web-adapter">Lambda Web Adapter</a>使って、Laravelのコンテナを非常に簡単にLambdaへデプロイできました。</p><p>Lambdaに与えるメモリ次第では、パフォーマンス面でも問題なく動いてくれそうです。</p><h2 id="%E2%96%A0%E5%8F%82%E8%80%83">■参考</h2><ul><li><a href="https://aws.amazon.com/jp/builders-flash/202301/lambda-web-adapter/">Lambda Web Adapter でウェブアプリを (ほぼ) そのままサーバーレス化する</a></li></ul><h2 id="%E2%96%A0%E4%BB%8A%E5%9B%9E%E4%BD%BF%E3%81%A3%E3%81%9F%E8%B3%87%E6%9D%90">■今回使った資材</h2><h3 id="%E2%97%AF%E4%BF%AE%E6%AD%A3%E5%89%8D">◯修正前</h3><ul><li>Dockerfile</li></ul><pre><code class="language-Dockerfile">FROM php:8.1.17-fpm-alpine3.17
COPY ./docker/php/php.ini /usr/local/etc/php/

# 必要なパッケージをインストール
RUN apk add --no-cache \
  libzip-dev \
  zlib-dev \
  mariadb-client \
  unzip \
  curl \
  vim \
  &amp;&amp; docker-php-ext-install zip pdo_mysql sockets \
  &amp;&amp; curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer \
  &amp;&amp; composer self-update --2 \
  &amp;&amp; echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' &gt;&gt; ~/.bashrc

# PHPの設定ファイルをコピー
COPY ./docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini

# srcディレクトリをコピー
COPY ./src /work/web
RUN mv /work/web/.env.aws /work/web/.env

# Laravel環境準備のコマンド
RUN cd /work/web \
  &amp;&amp; composer install \
  &amp;&amp; chmod -R 777 ./storage

# 起動スクリプトコピー&amp;権限付与
COPY ./docker/php/startup.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/startup.sh
CMD ["startup.sh"]

# ワーキングディレクトリを設定
WORKDIR /work/web
</code></pre><ul><li>startup.sh</li></ul><pre><code class="language-sh">#!/bin/sh

cd /work/web
php artisan migrate
/usr/local/sbin/php-fpm</code></pre><hr><h3 id="%E2%97%AF%E4%BF%AE%E6%AD%A3%E5%BE%8C">◯修正後</h3><ul><li>Dockerfile</li></ul><pre><code class="language-Dockerfile">FROM php:8.1.17-fpm-alpine3.17
COPY ./docker/php/php.ini /usr/local/etc/php/

# 必要なパッケージをインストール
RUN apk add --no-cache \
  libzip-dev \
  zlib-dev \
  mariadb-client \
  unzip \
  curl \
  vim \
  &amp;&amp; docker-php-ext-install zip pdo_mysql sockets \
  &amp;&amp; curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer \
  &amp;&amp; composer self-update --2 \
  &amp;&amp; echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' &gt;&gt; ~/.bashrc

# PHPの設定ファイルをコピー
COPY ./docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini

# srcディレクトリをコピー
COPY ./src /work/web
RUN mv /work/web/.env.aws.lambda /work/web/.env

# Laravel環境準備のコマンド
RUN cd /work/web \
  &amp;&amp; composer install \
  &amp;&amp; chmod -R 777 ./storage

# 起動スクリプトコピー&amp;権限付与
COPY ./docker/php/startup-lambda.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/startup-lambda.sh

# Lambda Web Adapterのコピー
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.3 /lambda-adapter /opt/extensions/lambda-adapter

EXPOSE 8080

CMD ["startup-lambda.sh"]

# ワーキングディレクトリを設定
WORKDIR /work/web</code></pre><ul><li>startup-lambda.sh</li></ul><pre><code class="language-sh">#!/bin/sh

cd /work/web
php artisan migrate
php artisan serve --host=0.0.0.0 --port=8080</code></pre></hr>]]></content:encoded></item><item><title><![CDATA[Go 1.22でforループの変数メモリ再利用が変更されたので挙動を確認する]]></title><description><![CDATA[Go 1.22がリリースされ、多くの改良が加えられました。
forループ内での変数メモリ再利用に関しても、変更があったので挙動を確認します。

変更の詳細と実際のコード例
Go 1.22より前のバージョンでは、for文の各ループで変数のメモリが再利用されていました。Go
1.22ではこの挙動が変更され、各ループで新しいメモリが確保されるようになりました。

package main
import (
	"fmt"
)
func main() {
	var funcs []func()
	for i := 0; i < 3; i++ {
		funcs = append(funcs, func() { fmt.Println(i) })
	}
	for _, f := range funcs {
		f()
	}
}


https://go.dev/play/p/dpi0ze_iQ2k?v=goprev
Go 1.21はすべての関数が同じ変数 i を参照しているため、出力はすべて3になります

3
3
3


https://go.dev/play/p/dpi0ze_iQ2k
Go 1]]></description><link>https://tech.anti-pattern.co.jp/go1-22de/</link><guid isPermaLink="false">Ghost__Post__664dfb9a27e564000168058f</guid><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Mon, 27 May 2024 16:02:31 GMT</pubDate><content:encoded><![CDATA[<p>Go 1.22がリリースされ、多くの改良が加えられました。<br>forループ内での変数メモリ再利用に関しても、変更があったので挙動を確認します。</br></p><h3 id="%E5%A4%89%E6%9B%B4%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%A8%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E4%BE%8B">変更の詳細と実際のコード例</h3><p>Go 1.22より前のバージョンでは、for文の各ループで変数のメモリが再利用されていました。Go 1.22ではこの挙動が変更され、各ループで新しいメモリが確保されるようになりました。</p><!--kg-card-begin: markdown--><pre><code class="language-go:main.go">package main
import (
	&quot;fmt&quot;
)
func main() {
	var funcs []func()
	for i := 0; i &lt; 3; i++ {
		funcs = append(funcs, func() { fmt.Println(i) })
	}
	for _, f := range funcs {
		f()
	}
}
</code></pre>
<!--kg-card-end: markdown--><p><a href="https://go.dev/play/p/dpi0ze_iQ2k?v=goprev">https://go.dev/play/p/dpi0ze_iQ2k?v=goprev</a><br>Go 1.21はすべての関数が同じ変数 i を参照しているため、出力はすべて3になります</br></p><!--kg-card-begin: markdown--><pre><code>3
3
3
</code></pre>
<!--kg-card-end: markdown--><p><a href="https://go.dev/play/p/dpi0ze_iQ2k">https://go.dev/play/p/dpi0ze_iQ2k</a><br>Go 1.22 では各ループでiに新しいメモリが確保されるため、出力は以下のようになります</br></p><!--kg-card-begin: markdown--><pre><code>0
1
2
</code></pre>
<!--kg-card-end: markdown--><p>こちらのコードを1.21 と1.22でそれぞれベンチマークを取ってみます</p><!--kg-card-begin: markdown--><pre><code class="language-go:main_test.go">package main

import (
	&quot;testing&quot;
)

func BenchmarkForloop(b *testing.B) {
	for n := 0; n &lt; b.N; n++ {
		var funcs []func()

		for i := 0; i &lt; 1000; i++ {
			funcs = append(funcs, func() {
				i = i
			})
		}

		for _, f := range funcs {
			f()
		}
	}
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>▼Go1.21の場合</p>
<pre><code>$ go test -bench . -benchmem
goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkForloop-12    	   33302	     34164 ns/op	   41216 B/op	    1013 allocs/op
PASS
ok  	_/Users/ami/Documents/ami/go22	1.780s
</code></pre>
<p>▼Go1.22の場合</p>
<pre><code>$ go test -bench . -benchmem
goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkForloop-12    	   22713	     52746 ns/op	   41536 B/op	    2012 allocs/op
PASS
ok  	_/Users/ami/Documents/ami/go22	2.070s
</code></pre>
<!--kg-card-end: markdown--><p>allocs/op（メモリ割り当ての回数）が1000ループ文確かに増えていますね！</p><h3 id="%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</h3><p>Go 1.22ではより直感的な動きになるので、コードの可読性も向上しそうです。<br>バージョンアップを行う際は挙動が変わる可能性があるので注意が必要です。<br>Go 1.22では大量のループを行う際にメモリ使用量が激増する場合があるので、そちらも注意が必要です。</br></br></p>]]></content:encoded></item><item><title><![CDATA[AWSの12資格が対象とするサービスの広さと深さを知ろう！]]></title><description><![CDATA[ AWS資格 SAP-C02 SAA-C03 CLF-C02 DOP-C02 PAS-C01 SOA-C02 DVA-C02 ANS-C01 DAS-C01 
DBS-C01 MLS-C01 SCS-C02 バージョン 1.1 1.1 1.0 1.4 1.1 2.3 1.1 2.0 1.1 2.2 2.3 1.1 
サービス数 156 120 124 105 58 60 57 43 48 43 37 27]]></description><link>https://tech.anti-pattern.co.jp/aws-certified-services/</link><guid isPermaLink="false">Ghost__Post__65cc888627e564000167fdd3</guid><dc:creator><![CDATA[Takashi Uchida]]></dc:creator><pubDate>Mon, 01 Apr 2024 12:00:37 GMT</pubDate><content:encoded><![CDATA[<p/><p>今年1月からアンチパターンに入社しました。内田です。</p><p>今年も２０２４ Japan AWS All Certifications Engineersの申請締切が近くなり、XでAWS資格取得ポストラッシュです。そこでAWS資格を全て取得した方が『AWS何も分からん』や『AWS難しい』といったコメントを見て気になったので、AWSの各資格がどのAWSサービスを試験対象にしているのか調べてみました。</p><h2 id="%E7%9B%AE%E6%AC%A1">目次</h2><p>・概要<br>・試験対象サービス<br>・試験対象外サービス<br>・AWS試験に受かる＝試験範囲のAWSサービスの全てが理解できているということなのか<br>・まとめ<br><br/></br></br></br></br></br></p><h2 id="%E6%A6%82%E8%A6%81">概要</h2><p>AWSのプロダクトは全３２１種類（※１）あり、その内、約２１２〜２４０種類のサービスが試験対象となっている（対象外は約8１〜１０９種類）。もっとも多くのAWSサービスが試験対象となっているのはSolution Architect Professionalで157種類（※２）。</p><!--kg-card-begin: html--><html>
<head>
<style>
table {
  margin: auto;
  border-collapse: collapse;
  font-size: 14px;
}
th, td {
  padding: 8px;
  text-align: center;
}
th {
  background-color: #f2f2f2;
}
</style>
</head>
<body>
<table>
  <thead>
    <tr>
      <th>AWS資格</th>
      <th>SAP-C02</th>
      <th>SAA-C03</th>
      <th>CLF-C02</th>
      <th>DOP-C02</th>
      <th>PAS-C01</th>
      <th>SOA-C02</th>
      <th>DVA-C02</th>
      <th>ANS-C01</th>
      <th>DAS-C01</th>
      <th>DBS-C01</th>
      <th>MLS-C01</th>
      <th>SCS-C02</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>バージョン</td>
      <td>1.1</td>
      <td>1.1</td>
      <td>1.0</td>
      <td>1.4</td>
      <td>1.1</td>
      <td>2.3</td>
      <td>1.1</td>
      <td>2.0</td>
      <td>1.1</td>
      <td>2.2</td>
      <td>2.3</td>
      <td>1.1</td>
    </tr>
    <tr>
      <td>サービス数</td>
      <td>156</td>
      <td>120</td>
      <td>124</td>
      <td>105</td>
      <td>58</td>
      <td>60</td>
      <td>57</td>
      <td>43</td>
      <td>48</td>
      <td>43</td>
      <td>37</td>
      <td>27</td>
    </tr>
  </tbody>
</table>
</body>
</html><!--kg-card-end: html--><h2 id="%E8%A9%A6%E9%A8%93%E5%AF%BE%E8%B1%A1%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">試験対象サービス</h2><!--kg-card-begin: markdown--><p>ブログ用にフォーマットして見づらくなってしまったので、PDFのリンク置いておきます。<a href="https://docs.google.com/spreadsheets/d/e/2PACX-1vTTvD1qZ6nNrXg8lPaA5aHbNN_PqijAFnGFBV_rYY71FaD9upPYIibgPT0Ieq5HTXWmwKf9z3HObdHt/pub?gid=1423434935&amp;single=true&amp;output=pdf">PDFはこちら</a></p>
<p>※対象サービスのマップはPC上で見ることをお勧めします。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.26.50-1.png" class="kg-image" alt="" loading="lazy" width="1848" height="1324" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.26.50-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.26.50-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.26.50-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.26.50-1.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.27.17-1.png" class="kg-image" alt="" loading="lazy" width="1848" height="1324" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.27.17-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.27.17-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.27.17-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.27.17-1.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.39.17.png" class="kg-image" alt="" loading="lazy" width="1848" height="1290" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.39.17.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.39.17.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.39.17.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.39.17.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.27.59.png" class="kg-image" alt="" loading="lazy" width="1848" height="1324" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.27.59.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.27.59.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.27.59.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.27.59.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.28.11.png" class="kg-image" alt="" loading="lazy" width="1848" height="1324" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.28.11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.28.11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.28.11.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.28.11.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.28.34.png" class="kg-image" alt="" loading="lazy" width="1848" height="1144" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/----------2024-03-25-8.28.34.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/03/----------2024-03-25-8.28.34.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/03/----------2024-03-25-8.28.34.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/----------2024-03-25-8.28.34.png 1848w" sizes="(min-width: 1200px) 1200px"/></figure><h2 id="%E8%A9%A6%E9%A8%93%E5%AF%BE%E8%B1%A1%E5%A4%96%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">試験対象外サービス</h2><p/><!--kg-card-begin: markdown--><h3 id="iot">IoT</h3>
<ul>
<li><strong>AWS IoT FleetWise</strong> - 車両データをほぼリアルタイムで簡単に収集し、変換して、クラウドに転送</li>
<li><strong>AWS IoT TwinMaker</strong> - 実世界システムのデジタルツインを簡単に作成して業務を最適化</li>
<li><strong>AWS IoT EduKit</strong> - リファレンスハードウェアとステップバイステップのチュートリアルでシンプルなIoTアプリケーションの構築方法を習得</li>
<li><strong>AWS IoT ExpressLink</strong> <em>(プレビュー)</em> - セキュアなIoTデバイスを迅速かつ簡単に開発</li>
<li><strong>AWS IoT RoboRunner</strong> - ロボットのフリートがシームレスに連携するためのアプリケーションを構築</li>
<li><strong>AWS IoT Button</strong> - クラウドでプログラムできるダッシュボタン</li>
</ul>
<h3 id="%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E9%85%8D%E4%BF%A1">ネットワーキングとコンテンツ配信</h3>
<ul>
<li><strong>AWS Cloud WAN</strong> - グローバル広域ネットワークを簡単に構築、管理、およびモニタリング</li>
<li><strong>AWS Verified Access</strong> <em>(プレビュー)</em> - VPNなしで企業アプリケーションに安全にアクセス</li>
<li><strong>Amazon VPC Lattice</strong> <em>(プレビュー)</em> - サービス間の接続、安全性、監視を簡素化</li>
<li><strong>AWS Private 5G</strong> - プライベートセルラーネットワークを簡単にデプロイ、管理、およびスケーリング</li>
</ul>
<h3 id="%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92">機械学習</h3>
<ul>
<li><strong>AWS HealthScribe</strong> - 生成系AIを使用して臨床ノートをインサイトへと変換</li>
<li><strong>Amazon Bedrock</strong> - 基礎モデルで構築</li>
<li><strong>Amazon Augmented AI</strong> <em>(無料トライアル)</em> - ML予測のヒューマンレビューを簡単に実装</li>
<li><strong>Amazon Braket</strong> <em>(無料トライアル)</em> - 量子コンピューティングの研究を加速</li>
<li><strong>Amazon DevOps Guru</strong> <em>(無料トライアル)</em> - アプリケーションの可用性を向上させるML駆動のクラウドオペレーションサービス</li>
</ul>
<h3 id="%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">ビジネスアプリケーション</h3>
<ul>
<li><strong>Amazon Dash Cart</strong> - 消費者による効率的かつ簡単な買い物を可能にする</li>
<li><strong>Amazon Chime</strong> - フラストレーションフリーの会議、ビデオ電話、チャット</li>
<li><strong>Amazon Chime SDK</strong> - リアルタイムメッセージング、オーディオ、動画、および画面共有</li>
<li><strong>Amazon Honeycode</strong> - プログラミングなしでモバイルおよびウェブアプリケーションを構築</li>
</ul>
<h3 id="%E5%88%86%E6%9E%90">分析</h3>
<ul>
<li><strong>Amazon DataZone</strong> <em>(プレビュー)</em> - 組み込みのガバナンスで組織の枠を超えたデータ活用を実現</li>
<li><strong>AWS Clean Rooms</strong> <em>(プレビュー)</em> - 基礎となるデータを共有または公開することなく、データセットの照合、分析、コラボレーションを実現</li>
</ul>
<h3 id="%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%80%81%E3%82%A2%E3%82%A4%E3%83%87%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%80%81%E3%82%B3%E3%83%B3%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%82%B9">セキュリティ、アイデンティティ、コンプライアンス</h3>
<ul>
<li><strong>Amazon Security Lake</strong> <em>(プレビュー)</em> - 数クリックでセキュリティデータを自動で一元化</li>
<li><strong>Amazon Verified Permissions</strong> <em>(プレビュー版)</em> - アプリケーションの認可とアクセス権限をきめ細かく設定</li>
</ul>
<h3 id="%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9">サーバーレス</h3>
<ul>
<li><strong>AWS Application Composer</strong> <em>(プレビュー)</em> - サーバーレスアプリケーションを視覚的に設計し、迅速に構築する</li>
</ul>
<h3 id="%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8">ストレージ</h3>
<ul>
<li><strong>AWS Backup for Amazon S3 Support</strong> <em>(プレビュー)</em> - S3に保存されたアプリケーションデータのバックアップと復元を一元的に管理</li>
</ul>
<h3 id="%E7%AE%A1%E7%90%86%E3%81%A8%E3%82%AC%E3%83%90%E3%83%8A%E3%83%B3%E3%82%B9">管理とガバナンス</h3>
<ul>
<li><strong>AWS Chatbot</strong> - ChatOps for AWS</li>
<li><strong>AWS Console Mobile Application</strong> - 外出先でリソースにアクセス</li>
</ul>
<h3 id="%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E5%B7%A5%E5%AD%A6">ロボット工学</h3>
<ul>
<li><strong>AWS RoboMaker</strong> <em>(無料トライアル)</em> - ロボット工学アプリケーションの開発、テスト、およびデプロイ</li>
</ul>
<h3 id="%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">コンピューティング</h3>
<ul>
<li><strong>AWS SimSpace Weaver</strong> - AWSマネージドのインフラストラクチャで動的かつ大規模な空間シミュレーションを構築</li>
</ul>
<h3 id="%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC">ゲームテクノロジー</h3>
<ul>
<li><strong>Amazon GameLift</strong> - シンプルかつ高速でコスト効率性に優れた専用のゲームサーバーホスティング</li>
<li><strong>Amazon Lumberyard</strong> - AWSおよびTwitchと統合された、すべてのソースを利用できる無料のクロスプラットフォーム3Dゲームエンジン</li>
<li><strong>Open 3D Engine (O3DE)</strong> - O3DEでゲームと3Dシミュレーションを構築</li>
</ul>
<h3 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h3>
<ul>
<li><strong>AWS Supply Chain Sustainability</strong> <em>(近日公開)</em> - より安全かつ効率的な方法で、サプライヤーのネットワークから必要な持続可能性に関する文書とデータセットを入手する</li>
<li><strong>AWS Verified Access</strong> <em>(プレビュー)</em> - VPNなしで企業アプリケーションに安全にアクセス</li>
<li><strong>Amazon Bedrock</strong> - 基礎モデルで構築</li>
<li><strong>VMware Cloud on AWS</strong> - カスタムハードウェアを使用せずにハイブリッドクラウドを構築</li>
</ul>
<!--kg-card-end: markdown--><h2 id="aws%E8%A9%A6%E9%A8%93%E3%81%AB%E5%8F%97%E3%81%8B%E3%82%8B%EF%BC%9D%E8%A9%A6%E9%A8%93%E7%AF%84%E5%9B%B2%E3%81%AEaws%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%85%A8%E3%81%A6%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%AA%E3%81%AE%E3%81%8B">AWS試験に受かる＝試験範囲のAWSサービスの全てが理解できているということなのか</h2><p>もちろん、そんなことはなく、Black Beltやworkshop, handson等で理解できる範囲は大きく広がりますが、一つ一つのサービスは様々なユースケースに対応しており、使い切れないほどの機能があります。例えば以下の記事のようにSSMという一つのサービスでも20種類あり、全ての実運用で使ったことのある方は稀だと思います。</p><figure class="kg-card kg-embed-card"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftech.nri-net.com%2Fentry%2F20_types_of_ssm" title="SSMって20種類あんねん　〜Run Commandで定期バッチを起動する〜 - NRIネットコムBlog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"/></figure><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回はAWSのサービスとAWS認定資格について調べてみました。各資格の特徴を感じて頂ければ幸いです。また、AWS資格外のサービスも３分の１ほどあったりと意外と多く感じました。これからもAWSを通して新しい技術に出会えそうで楽しみです。</p><p/><h2 id="%E5%87%BA%E5%85%B8">出典</h2><p>※１　AWSの全サービス数は以下の一覧を元にしています。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/products/?aws-products-all.sort-by&#x3D;item.additionalFields.productNameLowercase&amp;aws-products-all.sort-order&#x3D;asc&amp;awsf.re%3AInvent&#x3D;*all&amp;awsf.Free%20Tier%20Type&#x3D;*all&amp;awsf.tech-category&#x3D;*all"><div class="kg-bookmark-content"><div class="kg-bookmark-title">AWS の製品・サービス一覧 | クラウドなら AWS</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/libra-css/images/site/touch-icon-ipad-144-smile.png"><span class="kg-bookmark-author">Amazon Web Services, Inc.</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_1200x630.png"/></div></a></figure><p>※２　各試験の対象サービスは試験ガイドを元にマッピングしています。（一部名寄せの関係で試験ガイドのサービス数と一致していない場合があります。）</p><p/><!--members-only--><p/><hr><p/></hr>]]></content:encoded></item><item><title><![CDATA[クラウドプラクティショナー合格体験記〜AWS業務未経験の非エンジニアが2週間ちょっとで合格した話〜]]></title><description><![CDATA[こんばんは、atomです。先日、といってもしばらく前になりますが、AWS Certified Cloud Practitioner
の試験を受験してきましたので、その所感についてお話ししたいと思います。

※本ブログは2023年6月受験時点での内容になります。

受験者について
・アンチパターンに入社して3年半くらい（当時）
仕事は法務、業務効率化、HarborSのマネージャー、コンテンツライティングなどエンジニアリングにはノータッチ

・エンジニアリングの知識なし
そもそもサーバーってなに？オブジェクト？インスタンス？とかそんなレベル

・AWSについてもほぼほぼ知らない
会社の事業的に関連するワードを耳にしたり目にしたりはするけど、各サービスの内容とかはわかってない。（EC2はECサイトの何かだと思ってたレベル）


勉強期間と時間
2023年5月にクラウドプラクティショナー受験のお達しを受けてから数日後、キリが良いので6月1日に試験勉強を開始しました。

実際に試験を受験したのが6月17日だったので対策期間は2週間強でした。17日で受かる！と判断したというより、再受験無料のバウチ]]></description><link>https://tech.anti-pattern.co.jp/untitled-3/</link><guid isPermaLink="false">Ghost__Post__65e7c4b427e564000167fe04</guid><dc:creator><![CDATA[atom]]></dc:creator><pubDate>Mon, 01 Apr 2024 08:22:01 GMT</pubDate><content:encoded><![CDATA[<p>こんばんは、atomです。先日、といってもしばらく前になりますが、<strong>AWS Certified Cloud Practitioner</strong>の試験を受験してきましたので、その所感についてお話ししたいと思います。</p><p>※本ブログは2023年6月受験時点での内容になります。</p><h2 id="%E5%8F%97%E9%A8%93%E8%80%85%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">受験者について</h2><p>・アンチパターンに入社して3年半くらい（当時）<br>仕事は法務、業務効率化、HarborSのマネージャー、コンテンツライティングなどエンジニアリングにはノータッチ</br></p><p>・エンジニアリングの知識なし<br>そもそもサーバーってなに？オブジェクト？インスタンス？とかそんなレベル</br></p><p>・AWSについてもほぼほぼ知らない<br>会社の事業的に関連するワードを耳にしたり目にしたりはするけど、各サービスの内容とかはわかってない。（EC2はECサイトの何かだと思ってたレベル）<br/></br></p><h2 id="%E5%8B%89%E5%BC%B7%E6%9C%9F%E9%96%93%E3%81%A8%E6%99%82%E9%96%93">勉強期間と時間</h2><p>2023年5月にクラウドプラクティショナー受験のお達しを受けてから数日後、キリが良いので6月1日に試験勉強を開始しました。</p><p>実際に試験を受験したのが6月17日だったので対策期間は2週間強でした。17日で受かる！と判断したというより、再受験無料のバウチャーがあったので落ちても大丈夫なので試しに受けてみようと受験した次第です。</p><p>合計の勉強時間は50時間くらいで、大体平日2〜3時間土日4〜5時間くらいでやってたと思います</p><h2 id="%E5%8B%89%E5%BC%B7%E3%81%AE%E9%80%B2%E3%82%81%E6%96%B9">勉強の進め方</h2><p>実際にどんな感じの流れで勉強を進めたのかをお話ししたいと思います。<br>あとで述べますが無駄が多い気がしたのでこれはあまり参考にならないかもしれません。</br></p><h3 id="%E2%91%A0%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%AA%AD%E3%82%80">①とりあえずテキストを読む</h3><p>まずは購入したテキストをとりあえず読んでみました。</p><p>テキストは『<a href="https://www.amazon.co.jp/gp/product/4797397403/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&amp;psc=1">AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー</a>』（著：山下光洋,海老原寛之）を使用しました。調べてみると他の受験者の方も上げているようにわかりやすくまとまっていて非常に読みやすいです。章ごとに練習問題もついているので、理解の確認ができます。</p><h3 id="%E2%91%A1%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B">②とりあえず問題を解いてみる</h3><p>テキストを読んでなんとなく理解した気になれたので、Udemyで問題集（『<a href="https://www.udemy.com/course/aws-4260/">【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）</a>』）を買ってやってみました。</p><p>とりあえずで基本編をやってみたところ、正解率は47％でした。</p><p>基本編は実際の試験より易しめだとレビューで見たので、ここで急激に危機感を抱き始めました。<br/></p><h3 id="%E2%91%A2aws%E3%81%AE%E5%8B%95%E7%94%BB%E3%82%92%E8%A6%8B%E3%82%8B">③AWSの動画を見る</h3><p>より理解を深めるためにはやはり本丸が出してる情報に触れるべきと考えて、テキストを読んだだけでは理解が浸透していない知識の再確認をと思って『<a href="https://explore.skillbuilder.aws/learn/course/external/view/elearning/1875/AWS-Cloud-Practitioner-Essentials-Japanese-Na-%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AE%9F%E5%86%99%E7%89%88">AWS Cloud Practitioner Essentials</a>』を見てみました。これがめちゃくちゃわかりやすくて、テキストではイメージしきれないところを補完できたような気がします。さすが公式。<br/></p><h3 id="%E2%91%A3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B%EF%BC%86%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E5%8B%95%E7%94%BB%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%8B">④問題を解いてみる＆いろんな動画を見てみる</h3><p>基本の「キ」は理解できた自信がついたので、改めて問題を解いていきます。前述のUdemyの模擬試験の基本編の残ってるもう一つを解いてみて、結果は正解率55％でした。自信に反して結果が悪く落ち込みましたが、前回よりも解説が理解できるようになっていたので少し安心しました。単純に記憶が追いついていないだけな感じがしたので、反復でどうにかなるんじゃないかと思い始めました。試しに応用編を2つくらい解いてみてボロボロという感じだったのでまずは基礎固めだなと感じました。</p><p>問題を解くのと並行して、『<a href="https://aws.amazon.com/jp/events/awsome-day/awsome-day-online/">AWSome Day Online Conference</a>』というのがちょうど配信期間だったのでそのアーカイブを見たり、『<a href="https://explore.skillbuilder.aws/learn/course/external/view/elearning/14993/exam-prep-aws-certified-cloud-practitioner-with-practice-material-amazon-japanese-ri-ben-yu-zi-mu-ban">Exam Prep: AWS Certified Cloud Practitioner (CLF-C01)</a>』やYouTubeで試験対策系の動画などを移動中に見ていました。</p><h3 id="%E2%91%A4%E3%82%82%E3%81%86%E4%B8%80%E5%9B%9E%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B">⑤もう一回テキスト読んでみる</h3><p>試験と動画に飽きたのでもう一回テキストを読んでみました。</p><p>『AWS Cloud Practitioner Essentials』は長いのでやめました。問題を解いたり動画を見ていたおかげで2回目は内容が比較的すんなりと入ってきました。</p><h3 id="%E2%91%A5%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82">⑥問題を解いてみる。いろんな問題を解いてみる。</h3><p>そこからはひたすら反復を意識しました。</p><p>同じ問題を解いていると慣れてしまうので、いろんなツールやサイトを活用して多様な問題を解きました。多様な問題に慣れておいたおかげで、本番の試験でも混乱せずに済んだような気がします。</p><p>Udemy以外でやってみたやつをあげるとこんな感じです。公式のものではないので誤りも散見するのである程度理解が深まって、見破れるくらいになってから触れることをお勧めします。</p><p>・『<a href="https://aws-exam.net/clf/">AWS認定試験 無料WEB問題集＆徹底解説</a>』（サイト）</p><p>・『<a href="https://apps.apple.com/jp/app/aws-cloud-practitioner%E5%AF%BE%E7%AD%96/id1626612527">AWS Cloud Practitioner対策</a>』（アプリ）</p><p>・『<a href="https://apps.apple.com/jp/app/aws%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E6%A8%A1%E6%93%AC%E8%A9%A6%E9%A8%93/id1509436492">AWS認定 クラウドプラクティショナー模擬試験</a>』（アプリ）</p><p>・ChatGPT</p><p>以下のプロンプトで4択問題と1問1答形式の問題を出してもらえます。難易度に関する要望にもしたがってくれるので使ってみると良いかと思います。ただし、回答の正確性についてはブレがあるので過信しすぎない方が良いと思います。<br/></p><p>『AWS認定クラウドプラクティショナーの試験の練習問題を出してください。</p><p>以下の手順で進めること。<br>・問題は1問ずつ出すこと<br>・問題は4択問題とすること。<br>・問題に対して私が回答するので、それを受けて正解不正解を回答し、解説を添えること<br>・私は解説について疑問があれば質問をしますのでそれに答えてください。<br>・私が「次の問題をお願いします」と言ったら次の問題を出してください。</br></br></br></br></br></p><p>それでは第1問目を出してください。』</p><h3 id="%E2%91%A5%E8%AA%BF%E3%81%B9%E3%81%AA%E3%81%8C%E3%82%89%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82">⑥調べながら問題を解いてみる。<br/></h3><p>ある程度解けるようになった感あったので、Udemyの問題を解きながら、絶対に自信があるもの以外を調べながら解いてみるということをやってみました。調べても無理な場合は解説じっくり読んだり、公式のドキュメントを参照しました。</p><h2 id="%E5%A4%9A%E5%88%86%E3%81%93%E3%81%A3%E3%81%A1%E3%81%AE%E6%96%B9%E3%81%8C%E8%89%AF%E3%81%95%E3%81%9D%E3%81%86%E3%81%AA%E5%8B%89%E5%BC%B7%E6%B3%95">多分こっちの方が良さそうな勉強法</h2><p>実際にやってみた上で無駄が多い気がしたので、お勧めするとしたらどんな感じかを考えてみました。</p><p>①AWSomedayの動画をみる（めちゃくちゃ初心者向けで優しい）<br>②『AWS Cloud Practitioner Essentials』をみる<br>③テキストを読む<br>④Udemyを最初から最後まで解く<br>⑤Udemy2周目は調べながら解く<br>⑥いろんな問題を解く<br>⑦④〜⑥を繰り返す</br></br></br></br></br></br></p><p>AWSの実務経験がなかったり、そもそもエンジニアですらないような人が最初に手をつけるなら『AWS Cloud Practitioner Essentials』からが良いです。クラウドやAWSについてイメージしやすい例えを用いて説明してくれるので、大枠を捉えるのにはもってこいです。いきなりテキストを読むと未知の情報を能動的に吸収しなきゃいけないので、結構疲れます。動画は受け身で観れるので楽です。</p><p>いくつか動画を観ましたが、『AWS Cloud Practitioner Essentials』以外の動画はそれほどお勧め度は高くありません。移動時間などで時間を無駄にしたくないとか、どうしても疲れていて問題を解いたり、テキストを読む気力がない時に見るくらいで良いかと思います。</p><p>『AWS Cloud Practitioner Essentials』とテキストで大枠を掴んだらあとはひたすら問題を解いて解説を読むで良いかと思います。Udemyの問題を解く場合は少しでもわからない選択肢がある場合には見直しマークをつけて、正解していても解説をしっかり読むようにしましょう。問題を解く際にはキーワードと答えを結びつけるのではなく、他の選択肢が違う理由を考えながら回答、それができない場合はしっかり見直しが大事だなと思います。</p><h2 id="%E8%A9%A6%E9%A8%93%E5%89%8D%E5%BE%8C%E3%81%AE%E6%89%80%E6%84%9F">試験前後の所感</h2><h3 id="%E5%8F%97%E3%81%91%E3%82%8B%E7%9B%B4%E5%89%8D%E3%81%AE%E7%8A%B6%E6%85%8B">受ける直前の状態</h3><p>正直なところ、難易度が全くわからなかったので、試験の直前の自信としては五分五分の状態でした。テキストや模擬試験の内容はある程度理解して解くことができるものの、サービスの細かいところを突かれたら、ちょっと危ないかもという感じでした。</p><h3 id="%E5%8F%97%E3%81%91%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3">受けてみた感想</h3><p>試験中の感覚としては全問解き終わった時点で多分受かる…！という感じで結果は810点でした。（1000点満点／700点合格）</p><p>難易度に関しては実際に受けてみないとレベル感はわからないので、とりあえず受けてみるのも大事だなと思いました。所感としてはUdemyの基本編と応用編の中間くらい。公式の模擬試験は一番簡単めな難易度に合わせている感じがするので、公式で満点取れても油断はできないと思います。</p><p>65問中200％合ってる！と確信を持てたのが大体30問ほど。他の自信度合いは以下の感じでした。</p><p>・多分合ってる（15問）<br>・2択で迷う（15問）<br>・考えても仕方ない（5問）</br></br></p><p>試験の中でこんなのみたことないぞ？って単語はほとんどなかったので、テキストや練習問題で学習すれば問題なく合格はできるかと思います。</p><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>今回の試験勉強を通して、普段業務では知ることのできないAWSのあれやこれやを知ることができたので、今後、社内のSlackの理解度が高まるのではと思っています。</p><p>AWSやクラウドに関する知識を学ぶにはちょうど良いと思うので、新入社員研修や普段エンジニアリングに携わらない社員の理解度を高める機会として活用するのも良いのではないでしょうか？</p>]]></content:encoded></item><item><title><![CDATA[SaaSus PlatformのJava版SDK作成]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

β版ですが、SaaSus PlatformのJava版SDKが公開されておりますので、ご紹介をしようと思います。
https://github.com/saasus-platform/saasus-sdk-java/

SaaSus PlatformのバックエンドはOpenAPIを利用してます。
また、マイクロサービス（モジュール）で設計されているのでその単位にYAMLファイルが存在します。

SDKは、その定義ファイルであるYAMLファイルからopenapi-generator-cliを使用して、自動生成します。
https://github.com/OpenAPITools/openapi-generator-cli

自動生成すると、モジュール単位にApiClientクラスが生成されます。
このApiClientは、OkHttpClient httpClientを内包していて、このhttpClientを利用してSaaSus
Platformへのリクエストを処理されます。

ただし、このままでは利用できません。
SaaS]]></description><link>https://tech.anti-pattern.co.jp/saasus-platformno/</link><guid isPermaLink="false">Ghost__Post__65f66d3727e564000168017a</guid><category><![CDATA[SaaSus Platform]]></category><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 01 Apr 2024 03:42:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>β版ですが、SaaSus PlatformのJava版SDKが公開されておりますので、ご紹介をしようと思います。<br>
<a href="https://github.com/saasus-platform/saasus-sdk-java/">https://github.com/saasus-platform/saasus-sdk-java/</a></br></p>
<p>SaaSus PlatformのバックエンドはOpenAPIを利用してます。<br>
また、マイクロサービス（モジュール）で設計されているのでその単位にYAMLファイルが存在します。</br></p>
<p>SDKは、その定義ファイルであるYAMLファイルからopenapi-generator-cliを使用して、自動生成します。<br>
<a href="https://github.com/OpenAPITools/openapi-generator-cli">https://github.com/OpenAPITools/openapi-generator-cli</a></br></p>
<p>自動生成すると、モジュール単位にApiClientクラスが生成されます。<br>
このApiClientは、OkHttpClient httpClientを内包していて、このhttpClientを利用してSaaSus Platformへのリクエストを処理されます。</br></p>
<p>ただし、このままでは利用できません。<br>
SaaSus Platformへリクエストを送信するためには、リクエストヘッダーに署名をつける必要があります。</br></p>
<p>自動生成されたApiClientクラスのコンストラクタに、リクエストヘッダに設定する処理がありますが、<br>
SaaSus Platformの署名はリクエストbody情報も使っているので、ApiClientクラスのインスタンス生成時には設定できません。</br></p>
<pre><code>    /**
     * Basic constructor for ApiClient
     */
    public ApiClient() {
        init();
        initHttpClient();

        // Setup authentications (key: authentication name, value: authentication).
        authentications.put(&quot;Bearer&quot;, new HttpBearerAuth(&quot;bearer&quot;));
        // Prevent the authentications from being modified.
        authentications = Collections.unmodifiableMap(authentications);
    }

</code></pre>
<h4 id="%E7%BD%B2%E5%90%8D%E3%81%AE%E8%A8%AD%E5%AE%9A">署名の設定</h4>
<p>そのために、リクエストを送信する直前で署名を設定する実装にしてます。</p>
<ul>
<li>ApiClientを継承したクラスを定義</li>
<li>ApiClientクラスのexecuteをOverrideしたメソッドを定義</li>
<li>ApiClientを継承したクラスでheaderに署名を設定</li>
<li>基底クラスApiClientのexecuteに処理を戻す</li>
</ul>
<p>Callでリクエスト情報を操作できるので、リクエスト情報を使用して署名を作ることができます。<br>
signature = Utils.withSaasusSigV1(call);<br>
署名の実装はこちら<br>
<a href="https://github.com/saasus-platform/saasus-sdk-java/blob/48eec9f6680b5b9dc854d7c7d629b7d59e03bbd2/src/main/java/saasus/sdk/modules/Utils.java#L17">https://github.com/saasus-platform/saasus-sdk-java/blob/48eec9f6680b5b9dc854d7c7d629b7d59e03bbd2/src/main/java/saasus/sdk/modules/Utils.java#L17</a></br></br></br></p>
<pre><code>package saasus.sdk.modules;

import saasus.sdk.auth.ApiClient;
import saasus.sdk.auth.ApiException;
import saasus.sdk.auth.ApiResponse;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;

import java.lang.reflect.Type;

public class AuthApiClient extends ApiClient {
    
    private String referer;

    @Override
    public &lt;T&gt; ApiResponse&lt;T&gt; execute(Call call, Type returnType) throws ApiException {        

        String signature = &quot;&quot;;
        try {
            signature = Utils.withSaasusSigV1(call);
        } catch (Exception e) {
            throw new ApiException(e);
        }

        OkHttpClient httpClient = getHttpClient();
        Request request = call.request();
        Request newRequest = request.newBuilder().header(&quot;Authorization&quot;, signature).header(&quot;Referer&quot;, this.getReferer()).build();
        Call newCall = httpClient.newCall(newRequest);
        return super.execute(newCall, returnType);
    }

    private String getReferer() {
        if (referer == null) {
            return &quot;&quot;;
        }
        return referer;
    }

    public void setReferer(String referer) {
        this.referer = referer;
    }
}
</code></pre>
<p>各モジュール単位にApiClientが自動生成されるので、それらを操作できるクラスを定義します。</p>
<pre><code>package saasus.sdk.modules;

public class Configuration {
    
    private static final AuthApiClient authApiClient = new AuthApiClient();
    private static final PricingApiClient pricingApiClient = new PricingApiClient();
    private static final ApiLogApiClient apiLogApiClient = new ApiLogApiClient();
    private static final AwsMarketplaceClient awsMarketplaceClient = new AwsMarketplaceClient();
    private static final BillingApiClient billingApiClient = new BillingApiClient();
    private static final CommunicationApiClient communicationApiClient = new CommunicationApiClient();
    private static final IntegrationApiClient integrationApiClient = new IntegrationApiClient();

    public Configuration() {
        String urlBase = System.getenv(&quot;SAASUS_API_URL_BASE&quot;);
        if (urlBase != null) {
            authApiClient.setBasePath(urlBase + &quot;/v1/auth&quot;);
            pricingApiClient.setBasePath(urlBase + &quot;/v1/pricing&quot;);
            apiLogApiClient.setBasePath(urlBase + &quot;/v1/apilog&quot;);
            awsMarketplaceClient.setBasePath(urlBase + &quot;/v1/awsmarketplace&quot;);
            billingApiClient.setBasePath(urlBase + &quot;/v1/billing&quot;);
            communicationApiClient.setBasePath(urlBase + &quot;/v1/communication&quot;);
            integrationApiClient.setBasePath(urlBase + &quot;/v1/integration&quot;);
        }
    }

    public AuthApiClient getAuthApiClient() {
        return authApiClient;
    }

    public PricingApiClient getPricingApiClient() {
        return pricingApiClient;
    }

    public ApiLogApiClient getApiLogApiClient() {
        return apiLogApiClient;
    }

    public AwsMarketplaceClient getAwsMarketplaceClient() {
        return awsMarketplaceClient;
    }

    public BillingApiClient getBillingApiClient() {
        return billingApiClient;
    }

    public CommunicationApiClient getCommunicationApiClient() {
        return communicationApiClient;
    }

    public IntegrationApiClient getIntegrationApiClient() {
        return integrationApiClient;
    }
}

</code></pre>
<h4 id="sdk%E4%BD%BF%E3%81%84%E6%96%B9">SDK使い方</h4>
<ul>
<li>Configurationクラスから利用するモジュールのApiClinetを取得</li>
<li>取得したApiClinetを使用して、実行するApiクラスを生成
<ul>
<li>ApiクラスはYAMLのtag単位に出力されます<br>
Apiリファレンスの各メニュー単位で確認できます<br>
<a href="https://docs.saasus.io/ja/docs/reference/auth-api">https://docs.saasus.io/ja/docs/reference/auth-api</a></br></br></li>
</ul>
</li>
<li>Apiの実行<br>
例えば、Auth APIの/userinfoを使用する場合はこのようになります。</br></li>
</ul>
<pre><code>    // AuthのApiClientを取得
    AuthApiClient apiClient = new Configuration().getAuthApiClient();

    // AuthのUserInfoApiをApiClientを使用して生成
    UserInfoApi userInfoApi = new UserInfoApi(apiClient);

    // tokenはrequestのAuthorizationからBearerを取得して設定
    userInfo = userInfoApi.getUserInfo(token);

</code></pre>
<p>実行可能なサンプルはこちらにあります。<br>
<a href="https://github.com/saasus-platform/implementation-sample-api-java">https://github.com/saasus-platform/implementation-sample-api-java</a></br></p>
<!--kg-card-end: markdown--><p/><p/><p/><p/><p/><h3/>]]></content:encoded></item><item><title><![CDATA[教育訓練給付制度〜制度を知ってお得にスキルアップを目指そう〜]]></title><description><![CDATA[





こんにちは！山田です。

アンチパターンの労務周りの業務を中心に担当しています。


出産を機にお金について興味を持ち、先日FP（ファイナンシャルプランナー）2級の資格を取得しました。

その中で学んだ「教育訓練給付制度」についてご紹介しようと思います。

エンジニアの方に馴染みがありそうな訓練も対象となっておりますので、お付き合いいただけたら嬉しいです！


＜参考資料＞

ハローワークインターネットサービス 教育訓練給付制度

https://www.hellowork.mhlw.go.jp/insurance/insurance_education.html

厚生労働省HP

https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/jinzaikaihatsu/kyouiku.html


※本記事は制度概要のご紹介ですので、実際に受給を検討される場合は必ず最新の公的資料をご確認の上、支給要件照会も実施の上ご判断ください。



目次


１．教育訓練給付制度とは？

２．教育訓練の種類

３．支給]]></description><link>https://tech.anti-pattern.co.jp/jiao-yu/</link><guid isPermaLink="false">Ghost__Post__65e16feb27e564000167fe00</guid><dc:creator><![CDATA[Yukiko Yamada]]></dc:creator><pubDate>Tue, 12 Mar 2024 08:13:33 GMT</pubDate><content:encoded><![CDATA[<p/><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/28708539_s.jpg" class="kg-image" alt="" loading="lazy" width="640" height="480" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/03/28708539_s.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/03/28708539_s.jpg 640w"/></figure><p><br><br/></br></p><p>こんにちは！山田です。</p><p>アンチパターンの労務周りの業務を中心に担当しています。<br/></p><p>出産を機にお金について興味を持ち、先日FP（ファイナンシャルプランナー）2級の資格を取得しました。</p><p>その中で学んだ「教育訓練給付制度」についてご紹介しようと思います。</p><p>エンジニアの方に馴染みがありそうな訓練も対象となっておりますので、お付き合いいただけたら嬉しいです！<br/></p><p>＜参考資料＞</p><p>ハローワークインターネットサービス 教育訓練給付制度</p><p><a href="https://www.hellowork.mhlw.go.jp/insurance/insurance_education.html">https://www.hellowork.mhlw.go.jp/insurance/insurance_education.html</a></p><p>厚生労働省HP</p><p><a href="https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/jinzaikaihatsu/kyouiku.html">https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/jinzaikaihatsu/kyouiku.html</a><br/></p><p>※本記事は制度概要のご紹介ですので、実際に受給を検討される場合は必ず最新の公的資料をご確認の上、支給要件照会も実施の上ご判断ください。<br><br/></br></p><p>目次<br/></p><p>１．教育訓練給付制度とは？</p><p>２．教育訓練の種類</p><p>３．支給対象者</p><p>４．申請方法</p><p>５．まとめ</p><p><br/></p><p><strong>１．教育訓練給付制度とは？</strong><br/></p><p>「教育訓練給付制度」をご存知でしょうか？</p><p>（私は、FPの勉強を始める前は知りませんでした・・・）<br/></p><p>教育訓練給付制度とは、「雇用保険」の給付制度です。</p><p>雇用保険の一般被保険者（在職者）や一般被保険者であった離職者（求職者）が、<strong><em>厚生労働大臣が指定する教育訓練講座を自己負担で受講して修了した時に、経費（入学金や受講料など）の一部が支給される制度</em></strong>です。<br/></p><p>「雇用保険」と聞くと離職者が対象というイメージを抱かれる方も多いかもしれませんが、教育訓練給付金は一定の条件を満たす<strong><em>「在職者」も受給することができるの</em></strong>です！</p><p>一般教育訓練給付金の受給までの流れは以下の通りです。</p><p><strong>〜一般教育訓練給付金受給までの流れ〜</strong></p><p><strong>STEP1 受講する教育訓練を決定する</strong></p><p><strong>STEP2 給付対象者であることを確認する（支給要件照会）</strong></p><p><strong>STEP3 教育訓練を受講し、修了する</strong></p><p><strong>STEP4 ハローワークに申請する</strong></p><p>現在お仕事をされている方も利用できるサービスですので、是非最後までチェックしてみてください。</p><p><strong>２．教育訓練の種類</strong></p><p>教育訓練給付の対象となる教育訓練の代表的な３パターンについてご紹介します。</p><p><strong>①一般教育訓練</strong></p><p><strong>＜対象となる教育訓練＞</strong></p><p>雇用の安定や就職の促進を進めるために必要な職業に関する教育訓練</p><p>（キャリアアップやスキル向上を目指すイメージ）</p><p>・ITパスポート</p><p>・CAD利用技術者試験</p><p>・Webクリエイター能力認定試験</p><p>・TOEIC、VERSANT、TOEFL iBT</p><p>・簿記検定試験（日商）</p><p>・VBAエキスパート</p><p>・中小企業診断士　　　など</p><p><strong>＜支給額＞</strong></p><p><strong><em>教育訓練経費の20%相当額（上限：10万円）</em></strong></p><p>※支給額が4,000円を超えないときには支給されません。</p><p/><p><strong>②特定一般教育訓練</strong></p><p><strong>＜対象となる教育訓練＞</strong></p><p>速やかな再就職・早期のキャリア形成のための教育訓練</p><p>（難易度が高い資格を取得して再就職しやすくするイメージ）</p><p>・ITSSレベル３以上(120時間未満)またはITSSレベル２以上の資格取得を目指す講座（基本情報技術者試験等）</p><p>・税理士</p><p>・社会保険労務士</p><p>・宅地建物取引士</p><p>・介護支援専門員</p><p>・大型自動車第二免許　などなど</p><p><strong>＜支給額＞</strong></p><p><strong><em>教育訓練経費の40%（上限20万円）</em></strong></p><p>※支給額が4,000円を超えないときには支給されません。</p><p><strong>③専門実践教育訓練</strong></p><p><strong>＜対象となる教育訓練＞</strong></p><p>中長期的なキャリア形成のための専門的・実践的な教育訓練</p><p>（学校などに通って長期的に訓練し、資格を取得するイメージ）</p><p>・看護師</p><p>・介護福祉士</p><p>・美容師</p><p>・保育士</p><p>・歯科衛生士 　など</p><p><strong>＜支給額＞</strong></p><p>・中長期の教育訓練のため、6ヶ月に1度申請</p><p><strong><em>・教育訓練経費の50％（上限額40万円/年（最大上限額：3年間で120万円））</em></strong></p><p>※支給額が4,000円を超えないときには支給されません。</p><p>※専門実践教育訓練受講修了後、受講した専門実践教育訓練が目標としている資格を取得し、かつ修了した日の翌日から1年以内に被保険者として雇用された場合には追加給付を受けられる場合があります。（すでに支給されている給付金と合わせて<strong><em>最大70%</em></strong>※上限額あり）<br/></p><p/><p>支給対象の訓練一覧は厚生労働省の検索システムで確認できます。</p><p><a href="https://www.kyufu.mhlw.go.jp/kensaku/">https://www.kyufu.mhlw.go.jp/kensaku/</a></p><p>様々な種類の訓練が対象になっているのですね！</p><p>是非ご自身の興味がある分野を検索してみていただければと思います。</p><p>スキルアップの為に勉強する場合、費用も高額になることが多いと思いますので、<em><strong>最大70%も給付金を支給してもらえる</strong></em>のはありがたいですよね・・・！<br/></p><p>ここからは支給対象者や申請方法などを、最も身近だと思われる「一般教育訓練給付」にフォーカスしてご説明していきたいと思います。<br/></p><p><strong>３．支給対象者</strong><br/></p><p>まずは支給対象となる方についてご説明します。</p><p>一般教育訓練給付を受けることができるのは、以下の要件を満たした方です。<br/></p><p>✅教育訓練講座を修了していること</p><p>　・・・途中で挫折してしまうと給付金を受け取れないのでご注意ください＞＜</p><p>✅教育訓練給付金を受給したことがある場合、前回の教育訓練給付金の支給から、今回の受講開始日までが3年以上経っていること</p><p>・・・支給回数の上限はありませんが、前回の支給から一定期間を空ける必要があります。<br/></p><p>✅（在職者の場合）</p><p>受講開始時点で、同一の事業主に雇用保険の被保険者として雇用された期間が3年以上（※）あること（転職していても、雇用された期間を通算できる場合があります。） ‌ ‌ ‌ ‌</p><p>※当分の間、初めて一般教育訓練給付金を受給しようとする場合は、同一の事業主に雇用保険の被保険者として雇用された期間が1年以上あれば受給可能です。 ‌ ‌<br/></p><p>✅（求職者の場合）</p><p>離職日の翌日以降、受講開始日までが1年以内であり、かつ、同一の事業主に雇用保険の被保険者として雇用された期間が3年以上（※)あること</p><p>※当分の間、初めて一般教育訓練給付金を受給しようとする場合は、同一の事業主に雇用保険の被保険者として雇用された期間が1年以上あれば受給可能です。<br/></p><p><strong><em>支給申請前に「支給要件照会」を！</em></strong></p><p>上記の他にも詳細な要件があるため、受講開始前に、教育訓練給付金制度の対象となるか、必ず確認をしましょう。（支給要件照会）</p><p>支給要件照会は、「教育訓練給付金支給要件照会票」に必要事項を記入し、運転免許証や住民票の写しなどの本人を確認できる書類とともに、ハローワークに提出（本人来所、代理人、郵送または電子申請）して行うことができます。</p><p>訓練修了後に支給対象外だった・・・となってしまっては悲しいので必ず事前に確認することをお勧めします！<br/></p><p><strong>４．申請方法</strong><br/></p><p>一般教育訓練給付金の支給申請は、教育訓練を受講し、修了した本人が、原則として本人の住所を管轄するハローワークに必要書類を提出することによって行います。</p><p>この申請は<strong><em>受講修了日の翌日から起算して1ヶ月以内にする必要がある</em></strong>ので、忘れずに実施しましょう。</p><p>申請が受理されると、1週間〜2週間で支給されるかどうかが決定され、支給対象であると認められれば、その後1週間前後で指定の口座に給付金が支給されます。</p><p>※専門実践教育訓練給付金や特定一般教育訓練給付金の申請については、訓練受講前にキャリアコンサルタントとの面談や、申請手続きも必要ですので注意しましょう。<br><br/></br></p><p><strong>５．まとめ</strong><br/></p><p>いかがでしたでしょうか？教育訓練給付制度について少しでも理解を深めていただければ幸いです。</p><p>今回ご紹介した教育訓練給付制度のように、認知度が低い為にあまり利用されていない行政サービスというのは実は色々あります。</p><p>「知らなかったから使えなかった」は勿体無いですよね。</p><p>今すぐには利用しなくても、頭の片隅に置いておくことで何かの時に思い出して活用いただければ嬉しいです！<br/></p><p>※本記事の内容は2024年3月10日時点のものです。その後の法改正などには対応しておりませんのでご注意ください。</p><p>※実際に支給を検討される場合は必ず公的資料を参照の上、必ず支給要件照会を実施の上ご判断下さい。</p>]]></content:encoded></item><item><title><![CDATA[GitHub Actions で外部の組織のプライベートリポジトリにPRを出す]]></title><description><![CDATA[はじめに
organization Aのプライベートリポジトリのコードに変更があった時、organization BのプライベートリポジトリにGitHub
ActionsでPRを出したい、というケースがありました。

同じ組織の別リポジトリへPRを出す方法は、調べるといくつか記事が出てきますが、別の組織の場合は設定を変える必要があります。

少しハマったので、記録として残しておきます。

やりたいこと
org-a の repo-a から org-b の repo-b にPRを出す。

方法
以下の記事を参考にしました。

GitHub Apps / GitHub Actionsを使って別のリポジトリにファイルをコピーするPRを作成するZennHirotaka Miyagi
[https://zenn.dev/mh4gf/articles/copy-file-to-another-repository]
この記事では同じ組織の別リポジトリへのPRの場合なので、別の組織の場合に変更する部分を説明します。

GitHub Apps
GitHub Apps は org-b の組織に作成、インス]]></description><link>https://tech.anti-pattern.co.jp/github-apps-org-pr/</link><guid isPermaLink="false">Ghost__Post__65c2cf3d27e564000167fcca</guid><category><![CDATA[GitHub Actions]]></category><category><![CDATA[GitHub Apps]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 14 Feb 2024 01:43:14 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>organization Aのプライベートリポジトリのコードに変更があった時、organization BのプライベートリポジトリにGitHub ActionsでPRを出したい、というケースがありました。</p><p>同じ組織の別リポジトリへPRを出す方法は、調べるといくつか記事が出てきますが、別の組織の場合は設定を変える必要があります。</p><p>少しハマったので、記録として残しておきます。</p><h2 id="%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">やりたいこと</h2><p><code>org-a</code> の <code>repo-a</code> から <code>org-b</code> の <code>repo-b</code> にPRを出す。</p><h2 id="%E6%96%B9%E6%B3%95">方法</h2><p>以下の記事を参考にしました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://zenn.dev/mh4gf/articles/copy-file-to-another-repository"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub Apps / GitHub Actionsを使って別のリポジトリにファイルをコピーするPRを作成する</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.zenn.studio/images/icon.png"><span class="kg-bookmark-author">Zenn</span><span class="kg-bookmark-publisher">Hirotaka Miyagi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/zenn/image/upload/s--6vwQ7sYp--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:GitHub%20Apps%20%2F%20GitHub%20Actions%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%88%A5%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8BPR%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Hirotaka%20Miyagi%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzU1OTAwOGYzMmYuanBlZw&#x3D;&#x3D;%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png"/></div></a></figure><p>この記事では同じ組織の別リポジトリへのPRの場合なので、別の組織の場合に変更する部分を説明します。</p><h3 id="github-apps">GitHub Apps</h3><p>GitHub Apps は <code>org-b</code> の組織に作成、インストールします。 <code>Repository access</code> を <code>Only select repositories</code> にする場合、 <code>repo-b</code> を指定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/02/----------2024-02-13-14.27.48.png" class="kg-image" alt="" loading="lazy" width="1946" height="1378" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/02/----------2024-02-13-14.27.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/02/----------2024-02-13-14.27.48.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2024/02/----------2024-02-13-14.27.48.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/02/----------2024-02-13-14.27.48.png 1946w" sizes="(min-width: 720px) 720px"/></figure><h3 id="github-actions">GitHub Actions</h3><p>上の記事と同様に <code><a href="https://github.com/tibdex/github-app-token">tibdex/github-app-token</a></code> を使う場合、パラメータとして <code>installation_retrieval_mode: "organization"</code> と <code>installation_retrieval_payload: "org-b"</code> を追加します。</p><p>全体としては以下のようになります。</p><pre><code class="language-yaml">name: Test

on:
  workflow_dispatch:

jobs:
  test:
    name: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Generate Token
        id: generate_token
        uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a
        with:
          app_id: ${{ secrets.CLIENT_APP_ID }}
          private_key: ${{ secrets.CLIENT_PRIVATE_KEY }}
          installation_retrieval_mode: "organization"
          installation_retrieval_payload: "org-b"

      - name: Code
        run: |
          git config --global user.email github-actions[bot]@users.noreply.github.com
          git config --global user.name github-actions[bot]

          CLONE_DIR=$(mktemp -d)
          git clone --depth=1 https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/repo-b.git ${CLONE_DIR}
          cd ${CLONE_DIR}
          git checkout -b feature/update

          ## コードの変更

          git add .
          if git status | grep -q "Changes to be committed"
          then
            git commit --message "update"
            git push -u origin feature/update
            gh pr create \
              --title "Update API Client for ${{ needs.setup.outputs.version }}" \
              --body "update" \
              --repo repo-b \
              --base main \
              --head feature/update
          else
            echo "No changes detected"
          fi
        env:
            GH_TOKEN: ${{ steps.generate_token.outputs.token }}
</code></pre><p>このActionsを <code>org-a</code> の <code>repo-a</code> で実行します。</p><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>別の組織のプライベートリポジトリにGitHub ActionsでPRを出す方法でした。あまりやる機会はないと思いますが、参考にしていただければと思います。</p>]]></content:encoded></item><item><title><![CDATA[StripeのローカルイベントリスナーをGoで用意する]]></title><description><![CDATA[

最近、StripeのWebhookの勉強をしている中で、ローカル環境にてイベントを受け取るリスナーを簡単に用意できる方法がStripeから提供されていることを知りました。一部日本語対応していないため備忘録も兼ねて、その手順を本記事にて共有していきたいと思います。

対応言語はRuby, Node, PHP, Python, Go, .NET,
Javaと複数用意されています。手順は言語によってほぼ変わらないので、今後カスタマイズする上で個人的に勉強したいGoを使った手順で進めていきます。

Set up and deploy a webhookLearn how to set up and deploy a webhook to listen
to
events from Stripe.Stripe Documentation
[https://stripe.com/docs/webhooks/quickstart]
--------------------------------------------------------------------------------

導]]></description><link>https://tech.anti-pattern.co.jp/stripeno/</link><guid isPermaLink="false">Ghost__Post__65b9183d27e564000167faba</guid><dc:creator><![CDATA[Yasuhiro Takahashi]]></dc:creator><pubDate>Wed, 07 Feb 2024 02:10:08 GMT</pubDate><content:encoded><![CDATA[<p/><p>最近、StripeのWebhookの勉強をしている中で、ローカル環境にてイベントを受け取るリスナーを簡単に用意できる方法がStripeから提供されていることを知りました。一部日本語対応していないため備忘録も兼ねて、その手順を本記事にて共有していきたいと思います。</p><p>対応言語はRuby, Node, PHP, Python, Go, .NET, Javaと複数用意されています。手順は言語によってほぼ変わらないので、今後カスタマイズする上で個人的に勉強したいGoを使った手順で進めていきます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://stripe.com/docs/webhooks/quickstart"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Set up and deploy a webhook</div><div class="kg-bookmark-description">Learn how to set up and deploy a webhook to listen to events from Stripe.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://b.stripecdn.com/docs-statics-srv/assets/e9b76763ac024da464fae86e9b69dcbf.png"><span class="kg-bookmark-author">Stripe Documentation</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://d37ugbyn3rpeym.cloudfront.net/docs/og-image/docs.webhooks.quickstart.ogimage.png"/></div></a></figure><hr><!--kg-card-begin: markdown--><h2 id="%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86">導入手順</h2>
<h3 id="1-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AA%E3%82%B9%E3%83%8A%E3%83%BC%E7%94%A8%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">1, イベントリスナー用アプリのダウンロード</h3>
<p><a href="https://stripe.com/docs/webhooks/quickstart">https://stripe.com/docs/webhooks/quickstart</a> のページにて、イベントリスナーのためのアプリが提供されているので「アプリ全体をダウンロード」ボタンを押下後、zipファイルがダウンロードされるので解凍してください。</p>
<blockquote>
<p>既にStripeへのログインを済ませていると、アプリ内にシークレットキーを設定されています。未ログインだと、適当な値になっているので自身で書き換えが必要です。</p>
</blockquote>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/----------2024-01-31-1.02.37.png" alt="----------2024-01-31-1.02.37" loading="lazy"/></p>
<h3 id="2-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E8%B5%B7%E5%8B%95">2, アプリの起動</h3>
<p>展開したフォルダへ移動し、パッケージをダウンロード、サーバーが起動することを確認します。</p>
<pre><code>% cd stripe-sample-code
% go mod download github.com/stripe/stripe-go/v76
% go run server.go
</code></pre>
<h3 id="3-stripe-cli%E3%81%A7%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E8%BB%A2%E9%80%81%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86">3, Stripe CLIでイベントを転送設定を行う</h3>
<p>テスト環境のイベントをローカルで用意したエンドポイントに送信されるようにするには、Stripe CLIを使う必要があります。以下のコマンドでダウンロードできます。<br>
macOS （他の方法は<a href="https://github.com/stripe/stripe-cli">こちら</a>）</br></p>
<pre><code>% brew install stripe/stripe-cli/stripe
</code></pre>
<p>CLIが使えるようになったら、次のコマンドを叩いて転送設定します。</p>
<pre><code>% stripe login
% stripe listen --forward-to localhost:4242/webhook --latest
</code></pre>
<h3 id="4-%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E3%82%A2%E3%83%97%E3%83%AA%E5%81%B4%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">4, エンドポイントシークレットをアプリ側に設定する</h3>
<p>手順3を実行すると以下のようなメッセージとともに<code>whsec_XXXXXXXXXXXXXXXXXX</code>という文字列が表示されるので、アプリ側へ設定します。</p>
<pre><code>% stripe listen --forward-to localhost:4242/webhook --latest


&gt; Ready! You are using Stripe API Version [2022-08-01]. Your webhook signing secret is whsec_XXXXXXXXXXXXXXXXXX (^C to quit)
</code></pre>
<p>アプリのServer.go内の設定を上書きします。</p>
<pre><code>// Server.go 45行目付近
endpointSecret := &quot;whsec_...&quot;
</code></pre>
<h3 id="%EF%BC%95%E3%80%81cli%E3%81%A7%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E7%99%BA%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">５、CLIでイベント発行してみる</h3>
<p>再度アプリを起動して、以下のコマンドを叩いて見てください。</p>
<pre><code>% stripe trigger payment_intent.succeeded
</code></pre>
<p>問題なく設定が完了していれば、イベントに応じたメッセージが表示されます！</p>
<pre><code>% go run server.go
2024/01/01 00:00:00 Listening on localhost:4242
Unhandled event type: charge.succeeded
2024/01/01 00:01:00 Successful payment for 2000.
Unhandled event type: payment_intent.created
</code></pre>
<!--kg-card-end: markdown--><hr><p>これでローカルイベントリスナーの設定は完了です。躓かなければ、10分もかからず用意できてしまうので是非試してみてください。</p><p>転送が有効になっている状態だとテストクロックによるシミュレーションのイベントも受け取ることができるので、今度はこれらを組み合わせてちょっとしたアプリを作ってみようかなと考えてます！</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[SAT solverとSudokuと]]></title><description><![CDATA[

SAT solverとは
ある論理式がsatisfiableかどうかを確認してくれるソフトウェアです。

つまり、trueとなる解があるかどうを判定し、ある場合はその1パターンを出力してくれます。

例えば、(x or y) and (x or not y)の場合はxがtrueの場合のみ全体がtrueとなることが分かると思います。よってこの論理式をSAT
solverに食わせるとsatisfiableと判定しくれます。

> a SAT solver is a computer program
[https://en.wikipedia.org/wiki/Computer_program] which aims to solve the 
Boolean
satisfiability problem
[https://en.wikipedia.org/wiki/Boolean_satisfiability_problem]. On input a
formula over Boolean [https://en.wikipedia.org/wiki/Boolean_data_typ]]></description><link>https://tech.anti-pattern.co.jp/sat-solvertosudoku/</link><guid isPermaLink="false">Ghost__Post__65b260be27e564000167f9c0</guid><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Tue, 06 Feb 2024 16:32:52 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2024/02/Selection_999-344-.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/02/Selection_999-344-.png" alt="SAT solverとSudokuと"/><p/><h1 id="sat-solver%E3%81%A8%E3%81%AF">SAT solverとは</h1><p>ある論理式がsatisfiableかどうかを確認してくれるソフトウェアです。</p><p>つまり、trueとなる解があるかどうを判定し、ある場合はその1パターンを出力してくれます。</p><p>例えば、(x or y) and (x or not y)の場合はxがtrueの場合のみ全体がtrueとなることが分かると思います。よってこの論理式をSAT solverに食わせるとsatisfiableと判定しくれます。</p><blockquote>a <strong>SAT solver</strong> is a <a href="https://en.wikipedia.org/wiki/Computer_program">computer program</a> which aims to solve the <a href="https://en.wikipedia.org/wiki/Boolean_satisfiability_problem">Boolean satisfiability problem</a>. On input a formula over <a href="https://en.wikipedia.org/wiki/Boolean_data_type">Boolean</a> variables, such as "(<em>x</em> or <em>y</em>) and (<em>x</em> or not <em>y</em>)", a SAT solver outputs whether the formula is <a href="https://en.wikipedia.org/wiki/Satisfiability">satisfiable</a>,</blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://en.wikipedia.org/wiki/SAT_solver"><div class="kg-bookmark-content"><div class="kg-bookmark-title">SAT solver - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://en.wikipedia.org/static/apple-touch/wikipedia.png" alt="SAT solverとSudokuと"><span class="kg-bookmark-author">Wikimedia Foundation, Inc.</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Cube_and_Conquer_example.svg/348px-Cube_and_Conquer_example.svg.png" alt="SAT solverとSudokuと"/></div></a></figure><p>ソフトウェアの種類は色々とあるのですが、今回はminisatを使用していこうと思います。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="http://minisat.se/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">MiniSat Page</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">by Niklas Eén, Niklas Sörensson</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://minisat.se/minisat-logo.png" alt="SAT solverとSudokuと"/></div></a></figure><p>Homebrewでもインストールできます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://formulae.brew.sh/formula/minisat"><div class="kg-bookmark-content"><div class="kg-bookmark-title">minisat</div><div class="kg-bookmark-description">Homebrew’s package index</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://formulae.brew.sh/assets/img/apple-touch-icon.png" alt="SAT solverとSudokuと"><span class="kg-bookmark-author">Homebrew Formulae</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://formulae.brew.sh/assets/img/homebrew-256x256.png" alt="SAT solverとSudokuと"/></div></a></figure><p/><h2 id="%E5%85%A5%E5%8A%9B">入力</h2><p>SAT solverを使用する際には下記のようなtxtを作成する必要があります。SAT solverに与える論理式はCNF (Conjuctive Nomal Form)という形式で書く必要があります。</p><p>CNFとは  (x1 ∨ x2) ∧ (¬x3 ∨ x4 ∨ ¬x5) ∧ ...　の形式で書かれたものを指します。 論理和で作られた論理式を論理積でつなぐ形式になります。</p><p>それを表したtxtが下記になります。</p><!--kg-card-begin: markdown--><pre><code>p cnf 3 2
1 3 0
-3 2 1 0
</code></pre>
<!--kg-card-end: markdown--><p> 1行目の <code>p cnf 3 2</code></p><p>の3は変数の数、 2はclauseの数を表します。</p><p/><!--kg-card-begin: markdown--><pre><code>1 3 0
-3 2 1 0
</code></pre>
<!--kg-card-end: markdown--><p>2,3行目はclauseを表します。</p><p>数値は変数を表し、マイナスがついているものはその否定を表現します。0はそのclauseの終了を表します。</p><p>そして、そのclauseどうしをAndでつなぎます。</p><p>よってこのtxtは</p><p>(x1 ∨ x3) ∧ (¬x3 ∨ x2 ∨ x1) の論理式を意味しています。</p><p>試しに、これを実行してみます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/Selection_969.png" class="kg-image" alt="SAT solverとSudokuと" loading="lazy" width="851" height="849" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/01/Selection_969.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/Selection_969.png 851w" sizes="(min-width: 720px) 720px"/></figure><p>となり、Satisfiableなことがわかります。</p><p>また、第2引数で指定した出力ファイルをみると実際の変数の割当がわかります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/Selection_970.png" class="kg-image" alt="SAT solverとSudokuと" loading="lazy" width="230" height="141"/></figure><p>上記は、下記の割当を表しています。</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th/>
<th/>
</tr>
</thead>
<tbody>
<tr>
<td>x1</td>
<td>true</td>
</tr>
<tr>
<td>x2</td>
<td>false</td>
</tr>
<tr>
<td>x3</td>
<td>false</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h1 id="sudoku">Sudoku</h1><p>次に数独のルールをCNF形式で表現し、実際の数独の回答が正しいのかどうかを判定するプログラムを作ってみます。</p><h3 id="%E3%83%AB%E3%83%BC%E3%83%AB">ルール</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/image.png" class="kg-image" alt="SAT solverとSudokuと" loading="lazy" width="1024" height="1024" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2024/01/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2024/01/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2024/01/image.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Wikipeiaより</figcaption></img></figure><h2/><blockquote>空いているマスに、1〜9のいずれかの数字を入れる。</blockquote><blockquote>縦・横の各列に、同じ数字が重複して入ってはいけない。</blockquote><blockquote>太線で囲まれた3×3のグループ（以降「ブロック」と呼ぶ）内に、同じ数字が重複して入ってはいけない。</blockquote><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC"><div class="kg-bookmark-content"><div class="kg-bookmark-title">数独 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png" alt="SAT solverとSudokuと"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/1200px-Sudoku-by-L2G-20050714.svg.png" alt="SAT solverとSudokuと"/></div></a></figure><h3 id="sudoku%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E5%AE%9F%E8%A3%85">Sudokuのルールの実装</h3><p>[i][j][k] でCellの情報を表現します。</p><ul><li>i: row</li><li>j: column</li><li>k: number</li></ul><p>例: 2行3列が6  = [2][3][6]</p><blockquote>空いているマスに、1〜9のいずれかの数字を入れる。</blockquote><p>[1][1][1] ∨ [1][1][2] ∨ ... ∨ [1][1][9] ∧ ...</p><p>∧... ∨ [9][9][9]</p><blockquote>縦・横の各列に、同じ数字が重複して入ってはいけない。</blockquote><p>横: (¬[1][1][1] ∨ ¬[1][2][1])  ∧  (¬[1][1][1] ∨ ¬[1][3][1]) ∧ ...</p><p>∧ (¬[9][8][9] ∨ ¬[9][9][9]) </p><p>※x1とx2が両方ともtrueにならないことを表すと¬(x1 ∧ x2) = (¬x1 ∨ ¬x2)なのでこれを使い、CNFで愚直に表現していきます。</p><blockquote>太線で囲まれた3×3のグループ（以降「ブロック」と呼ぶ）内に、同じ数字が重複して入ってはいけない。</blockquote><p>縦とブロックも横で表した方法を使い表現していきます。</p><p/><p>そして、どんな方法でも良いのですが、それぞれのCellと数値の組み合わせに変数を振って行きます。</p><p>例: [1][1][1] = x1, [1][1][2] = x2 ... </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/sudoku-minisat/blob/9-9-withboard/main.go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">sudoku-minisat/main.go at 9-9-withboard · kooooohe/sudoku-minisat</div><div class="kg-bookmark-description">Contribute to kooooohe/sudoku-minisat development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="SAT solverとSudokuと"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/e14632e05781b78e4f0e2a02b04643360c89e1bb25ecc89279ccf4b3d1afa9c0/kooooohe/sudoku-minisat" alt="SAT solverとSudokuと"/></div></a></figure><h2 id="%E5%AE%9F%E8%A1%8C">実行</h2><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/k1nG6-kG47mo1BxYnVgEwYCt0_ZZc9c2m4x2L7K-a7ON3TPIifjEBvnOdm-yi1hKS_1DI7lg6pWxdGTOLemwmyQHKhXjaw9kfeqZkFNmRG_ftFKrg6FX374b14QqEUNhysBopPlJ3md9ATdRqiasXh0" class="kg-image" alt="SAT solverとSudokuと" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/6FwoN2r3aK_UnsLlMOapJFSjNVmB-BP5xnS_cWMRYhEMC1vq8Mx9H5dQJFNq_PnIXDtE204l4HzG9JIBKJhsSUSkMosPyJOoi01U8oydGA5dgTGoGgloS957Vb1M3IM1jRdvfIBSf45wIjK6M54dcgw" class="kg-image" alt="SAT solverとSudokuと" loading="lazy"/></figure><p/><h1 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h1><p>このSAT solverを使うと例えば</p><ul><li>席替えで上下左右同じ人が現れないようにする</li><li>時間割りを被りなく作ること</li></ul><p>などなどを検証、作成することができます。応用範囲はとても広いので是非触ってみると面白いと思います。</p>]]></content:encoded></item><item><title><![CDATA[コーアクティブコーチング体験レポート]]></title><description><![CDATA[

こんにちは！アンチパターンの野川です。(初投稿です。)

全6回に渡りコーアクティブコーチングを受講させていただきましたので、その体験内容をお伝えさせていただきます！

まずは具体的な体験レポートの前に、「そもそもコーアクティブコーチングってなに？」という点に触れていければと思います。

コーアクティブコーチングとは
「コーアクティブ」というのは「協働的」という意味で、コーチとクライアントが対等な立場で「意図的な協働関係」を築き、何をするか(アクティブ)、どうありたいか(コー)の両方にアプローチするものです。常にオープンで本気で向き合い、互いに力を合わせるというその関係性に特徴があります。

コーアクティブコーチングの目的
ずばり、クライアントに「本質的な変化が起こること」です。本質的な変化とは、本当の自分の可能性や力を活かしてより自分らしく人生を味わえる状態を示しています。例えば、

 * クライアントが元々持っている可能性や力を再発見する
 * 目の前の課題だけでなくクライアントそのものに焦点を当てることで、クライアントの内面的な成長や意識の変容をもたらす
 * クライアントの]]></description><link>https://tech.anti-pattern.co.jp/pasonarukotingu/</link><guid isPermaLink="false">Ghost__Post__65814ed727e564000167f3be</guid><dc:creator><![CDATA[Minami Nogawa]]></dc:creator><pubDate>Thu, 28 Dec 2023 01:10:09 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんにちは！アンチパターンの野川です。(初投稿です。)</p><p>全6回に渡りコーアクティブコーチングを受講させていただきましたので、その体験内容をお伝えさせていただきます！</p><p>まずは具体的な体験レポートの前に、「そもそもコーアクティブコーチングってなに？」という点に触れていければと思います。</p><h3 id="%E3%82%B3%E3%83%BC%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF">コーアクティブコーチングとは</h3><p>「コーアクティブ」というのは「協働的」という意味で、コーチとクライアントが対等な立場で「意図的な協働関係」を築き、何をするか(アクティブ)、どうありたいか(コー)の両方にアプローチするものです。常にオープンで本気で向き合い、互いに力を合わせるというその関係性に特徴があります。</p><h3 id="%E3%82%B3%E3%83%BC%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%81%AE%E7%9B%AE%E7%9A%84">コーアクティブコーチングの目的</h3><p>ずばり、クライアントに「本質的な変化が起こること」です。本質的な変化とは、本当の自分の可能性や力を活かしてより自分らしく人生を味わえる状態を示しています。例えば、</p><!--kg-card-begin: markdown--><ul>
<li>クライアントが元々持っている可能性や力を再発見する</li>
<li>目の前の課題だけでなくクライアントそのものに焦点を当てることで、クライアントの内面的な成長や意識の変容をもたらす</li>
<li>クライアントの持つ制限的な思い込みに気づき、自らが選択する</li>
</ul>
<!--kg-card-end: markdown--><p>などが挙げられます。</p><h3 id="%E3%82%B3%E3%83%BC%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%81%A7%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">コーアクティブコーチングでやったこと</h3><p>前述した通り、「目の前の事柄ではなく、私自身に焦点を当てる」ことで本質的な変化を起こすことを目的とし、6回のコーアクティブコーチングを体験しました。</p><!--kg-card-begin: markdown--><ul>
<li>1回目：満足度レーダーチャート作成
<ul>
<li>主観的に自身が感じている満足度を10段階で評価。各項目ごとに満足度の理由についてコーチと会話しながら深ぼる。<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/271734236_392704629322295_1620629904456546659_n.png" alt="271734236_392704629322295_1620629904456546659_n" loading="lazy"/></br></li>
</ul>
</li>
<li>2回目：パーソナルビジョンについて考える
<ul>
<li>1回目でリクエストされた「フレームに沿った人生の目標を考えてくる」という宿題の内容を元にパーソナルビジョンについて会話と体での表現を交えながら考える。
<ul>
<li>フレーム： 「私は〇〇の◇◇です」
<ul>
<li>〇〇：人に与えたい影響（笑顔とワクワクetc..）</li>
<li>◇◇：メタファースなもの（ファイヤーダンサーetc..）</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>3回目：パーソナルビジョンについて深掘り
<ul>
<li>2回目までの内容とコーアクティブコーチング以外の時間で深ぼったパーソナルビジョンについて共有。</li>
<li>2回目でリクエストされた宿題の「直感的に引かれる、お酒/乗り物/生き物(3つともコーチからの提案)」についての深掘り。</li>
</ul>
</li>
<li>4回目：1回目〜3回目に出てきたキーワードを元にパーソナルビジョンについて改めて考える
<ul>
<li>ここまでの会話で出てきたキーワードを羅列し、改めて自分のより内側の部分に焦点を当てながらパーソナルビジョンについて深ぼる。</li>
<li>3回目でリクエストされた「ゆったりした時間帯に将来のありたい姿、人との付き合い方、向き合い方を絵で表現する」という宿題のアウトプット。</li>
</ul>
</li>
<li>5回目：パーソナルビジョンについてさらなる深掘り
<ul>
<li>4回目までを踏まえ改めて、「フレームに沿った人生の目標を考えてくる」という宿題を実施。そのアプトプットについて一緒に深ぼる。</li>
</ul>
</li>
<li>6回目：5回を通して起こった変化を振り返る
<ul>
<li>どのような本質的な変化が起こったかの総括。</li>
<li>1回目で実施した満足度レーダーチャートを改めて作成し、満足度がどのように変化したか見つめる。</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><h3 id="%E5%85%A8%E5%9B%9E%E3%82%92%E9%80%9A%E3%81%97%E3%81%A6%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">全回を通しての振り返り</h3><!--kg-card-begin: markdown--><ul>
<li>1回目と6回目の満足度レーダーチャートは6回目の方が全体的に満足度が高い結果になった。
<ul>
<li>今まで気がつけていなかった自分の可能性に気がつけたことで、各項目の満足度が上がった。</li>
</ul>
</li>
<li>日常では論理的に頭で考えることが多いが、体感覚・感情にもアクセスし自分の新しい可能性を発見することにつながった。
<ul>
<li>新しい可能性を発見することで、パーソナルビジョンの表現は変わっていったが、私の場合は一貫性があることに気がつけた。</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3><p>コーアクティブコーチングを通して、内面的な成長に加え、価値観や感情、視点にパラダイムシフトが起こったと感じています。日常で機会の少ない、体感覚や感情にアクセスしたことは特に刺激的で、これまで「無意識」だったことに向き合うこととなり、結果的により自分らしく生きていくための「新しい自分」を知ることにつながりました。</p><p>つまり、コーアクティブコーチングの目的であった、「本質的な変化」が起こったということです。そこには、「意図的な協働関係」は欠かせないと感じていて、コーチと私が毎回「本気でオープンに向き合う」ということを徹底したことにより得ることのできたものだと捉えています。</p><p>そして、このコーアクティブコーチングはコーチとクライアントの関係はフラットであることから、常にオープンで本音を言い合える関係になり、心理的安全性が創られると感じました。これはあらゆる人間関係においても応用していくことが可能だと感じています。</p><h3 id="%E8%BF%BD%E4%BC%B8">追伸</h3><p>たった6回、計6時間のコーチとの時間でしたが、終わった今はぽっかり穴が空いたような感覚があり、改めて良い協働関係を築けていたんだなと、気付かされました。そしてたった6時間で日常の満足度がアップしたので、多くの方に体験していただきたい気持ちになりました！とっても楽しい6時間でした！</p>]]></content:encoded></item><item><title><![CDATA[システムコーチングを受講しました]]></title><description><![CDATA[

こんにちは。ブログ初執筆で緊張している高橋です。

今回はこの場をお借りして、アンチパターン社人事の高橋・野川が実際にシステムコーチングを受講した様子とその振り返りをお届けいたします。

そもそもシステムコーチングとは
「システムコーチング」というワードを紐解く上で、「システム」と「コーチング」に分けて考えます。

 * システムとは
   
   2人以上の関係性で共通の目的やアイデンティティを持ち、かつ相互に依存し合った集団
   
   例えば、PJチーム、コミュニティ、友人、家族などが挙げられます。
   きっとみなさんも何らかのシステムの一部なのではないでしょうか。
   一方で、電車で一緒になった人、同じ講義を受けている人、はシステムではありません。システムになるには、「相互に依存している」、すなわちお互いに影響を及ぼし、受け合っている必要があるのです。
   
   参考：https://speakerdeck.com/kazuhideinano/aziyairukotingu-x-sisutemukotingu
   
   

 * コーチングとは
   
   ]]></description><link>https://tech.anti-pattern.co.jp/systemcoaching-blog-1/</link><guid isPermaLink="false">Ghost__Post__65850d6227e564000167f414</guid><dc:creator><![CDATA[Hina Takahashi]]></dc:creator><pubDate>Wed, 27 Dec 2023 12:15:48 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんにちは。ブログ初執筆で緊張している高橋です。</p><p>今回はこの場をお借りして、アンチパターン社人事の高橋・野川が実際にシステムコーチングを受講した様子とその振り返りをお届けいたします。</p><h2 id="%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%81%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF">そもそもシステムコーチングとは</h2><p>「システムコーチング」というワードを紐解く上で、「システム」と「コーチング」に分けて考えます。</p><!--kg-card-begin: markdown--><ul>
<li>
<p>システムとは</p>
<p><em>2人以上の関係性で共通の目的やアイデンティティを持ち、かつ相互に依存し合った集団</em></p>
<p>例えば、PJチーム、コミュニティ、友人、家族などが挙げられます。<br>
きっとみなさんも何らかのシステムの一部なのではないでしょうか。<br>
一方で、電車で一緒になった人、同じ講義を受けている人、はシステムではありません。システムになるには、「相互に依存している」、すなわちお互いに影響を及ぼし、受け合っている必要があるのです。</br></br></p>
<p>参考：<a href="https://speakerdeck.com/kazuhideinano/aziyairukotingu-x-sisutemukotingu">https://speakerdeck.com/kazuhideinano/aziyairukotingu-x-sisutemukotingu</a></p>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ul>
<li>
<p>コーチングとは</p>
<p><em>「現状」と目指す「結果」の間に生じるギャップの解消を目指し、導くこと</em></p>
<p>ここでポイントになるのが「導く」というワードです。</p>
<p>直接アドバイスをするティーチングとは異なり、課題や解決策が本人によって見出されることが特徴です。「変化を起こさない」という選択も解決策になりうる可能性があります。</p>
<p>参考：<a href="https://smartcompany.jp/column/teaching-coaching/">https://smartcompany.jp/column/teaching-coaching/</a></p>
</li>
</ul>
<!--kg-card-end: markdown--><p>上記を踏まえて…</p><!--kg-card-begin: markdown--><ul>
<li>システムコーチングとは<br>
<em>組織・チームの関係性の向上を促し成果に繋げるためのアプローチ方法</em></br></li>
</ul>
<!--kg-card-end: markdown--><h2 id="%E5%8F%97%E8%AC%9B%E7%9B%AE%E7%9A%84">受講目的</h2><p>今回の受講目的は以下の2点です。</p><!--kg-card-begin: markdown--><ol>
<li>コーチングを肌で知る<br>
クライアントとしてコーチングを受け、今後コーチングを学習していくかどうかの検討材料にするため</br></li>
<li>お互いの関係性を深め、人事チームとして更なる一歩を踏み出していく</li>
</ol>
<!--kg-card-end: markdown--><h2 id="%E4%BB%8A%E5%9B%9E%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">今回やったこと</h2><!--kg-card-begin: markdown--><ul>
<li>月1度のセッション×6回
<ul>
<li>1回目：二人で１つの生き物をつくる
<ul>
<li>自分をあらわす生き物をそれぞれつくりシェアしたのち、「今の私たちをあらわす生き物」を話し合いと描画を重ねてつくりました。<br>
それぞれがまだ見ぬ生き物に対して持つイメージを「まだ輪郭ははっきりしていなさそう」「直線はなさそう」など、抽象的な言葉で表現し、それを形作るという工程を繰り返しました。<br>
↓誕生した生き物（あえて名付けていません）↓<br>
　　 <img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/---.jpg" alt="---" loading="lazy"/></br></br></br></li>
</ul>
</li>
<li>2回目：二人で１つの国をつくる
<ul>
<li>まず、自分をあらわす国をそれぞれつくり、お互いの国へ訪れました。それぞれの国の入国方法や挨拶、伝統行事など想像を膨らませて体験した後、「二人の国」の建国に取り組みました。<br>
お互いが大事にしていることが想像を通して落とし込まれたこの国には、国民に出会ったら必ず挨拶する、月に1度の国を挙げてのご飯会に向けて日々働く、といったルールがあります。（訪れてみたい方はぜひお知らせください！笑）</br></li>
</ul>
</li>
<li>3回目：①感謝を伝え合う/②お互いの中に入り込む
<ul>
<li>①ではこれまでのお互いの行動に対する感謝を言葉で伝え合いました。過去2回のセッションを通して、それぞれが大事にしていることがなんとなくわかっている状態ではあったものの、それが実際にどのようにお互いに影響を与えているかをお互いの言葉で知る機会となりました。</li>
<li>②では真正面に向き合い、お互いの目を見ながら、それぞれの奥深い部分に入り込み、イメージを膨らませました。相手に対する想いを言葉ではなく情景で描くことで、普段のコミュニケーションとは違う角度から相手の理解を深めました。</li>
</ul>
</li>
<li>4回目：①それぞれお城を建ててお互いに散策/②言いづらいことを伝える
<ul>
<li>①では自分をお城に見立ててイメージしました。部屋の数はどのくらいあるのか、そこにはどのような人々が住んでいるのか、入室のルールはあるのか、などを思い描き、それをシェアし合いました。</li>
<li>②では、相手の行動が二人の関係性によって悪い方向に働くとしたらどのようなことがあるか？をそれぞれ伝え合いました。この時、言われる側は泡の中に包まれた状態をイメージし自身を守る、ということも併せて行いました。</li>
</ul>
</li>
<li>5回目：メタスキルがどのように二人のシステムに活かせるか身体で表現
<ul>
<li>二人の関係を築いていくために以下のメタスキルをどのように活かせそうか、というのをそれぞれ身体で表現しました。例えば、「本気」ではパンチをするイメージ、「協働」は二人三脚するイメージ、などです。
<ul>
<li>メタスキル一覧
<ul>
<li>思いやり/親密</li>
<li>本気(コミットメント)</li>
<li>好奇心/気付き</li>
<li>協働</li>
<li>尊重</li>
<li>遊び心</li>
<li>ディープデモクラシー(深層主義)</li>
<li>表現(私たちが独自に追加)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>6回目：①「私/あなた/第三者」それぞれの立場に立ってお互いの関係性を見つめる/②これまでの振り返り
<ul>
<li>①では、3つの知性、EQ/SI/RSIを育むために、「私/あなた/第三者」それぞれの立場に立ってお互いの関係性を見つめました。自分が相手に発した言動を相手はどう受け取るか、そしてその様子を客観的に捉えるとどうか、ということを想像しました。
<ul>
<li>EQ（感情的知性）：自身が感情を経験したり、表現したりする力</li>
<li>SI（社会的知性）：他者の感情を想像し、共感する力</li>
<li>RSI（関係性システムの知性）：自身と他者の感情を踏まえ、関係性そのものを第三者視点で読み取る力</li>
</ul>
</li>
<li>②ではお互いの関係性がスタートしてから第6回セッション時まで、どのような出来事があり、それが二人の関係性にどのような影響をもたらしたかを振り返りました。</li>
</ul>
</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><h2 id="%E5%90%84%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%BE%8C%E3%81%AE%E9%96%A2%E4%BF%82%E6%80%A7%E3%81%AE%E5%A4%89%E5%8C%96">各セッション後の関係性の変化</h2><p>システムコーチングを通じて得ることができた一番大きいものは、「言動として現れてこないお互いの感覚」だと思っています。</p><p>言語を通じて相手の感覚や思考を探るのが一般的なコミュニケーションですが、システムコーチングでは直感・想像を通してそれにダイレクトにアクセスするのです。すると、相手の言動と思考のむすびつきに対する納得度がおのずと深まります。これを相互に行ったことで、確実に「関係性が深まった」と言い切れる6ヶ月間となりました。</p><p>以下、各セッション後の関係性の具体的な変化です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/----------2023-12-26-14.25.34.png" class="kg-image" alt="" loading="lazy" width="790" height="398" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/12/----------2023-12-26-14.25.34.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/----------2023-12-26-14.25.34.png 790w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E5%8F%97%E8%AC%9B%E7%9B%AE%E7%9A%84%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">受講目的に対する振り返り</h2><!--kg-card-begin: markdown--><ol>
<li>コーチングを肌で知る<br>
<strong>→半年間のセッションを通して達成</strong></br></li>
<li>お互いの関係性を深め、人事チームとして更なる一歩を踏み出していく<br>
<strong>→「対話から共話」への変化がみてとれたため達成</strong>
<ul>
<li>以前に増してお互いが能動的に相手に関わりに行くようになった</li>
<li>「お互いの仕事スタイルはまだわからないけどきっと大丈夫」という安心感が醸成された</li>
</ul>
</br></li>
</ol>
<!--kg-card-end: markdown--><h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2><p>「お互いの感覚にアクセスする」という今までにない経験でしたが、個人的には直感を使って想像を膨らませるのが好きなので、コーチングというツールが自分にフィットする感覚を持ちました。</p><p>今後の関係性の変化も楽しみです♪</p>]]></content:encoded></item><item><title><![CDATA[SaaSの時代はもう終わってしまったのか？]]></title><description><![CDATA[こんにちは。信田(しのだ)です。


現在、「SaaSus Platform」のマーケティングやセールスや導入支援などを頑張っています。

SaaSus PlatformのGTMをやりながら、SaaSについて色々考えてみました。

 1. SaaSが注目される時代は終わったのか？
 2. SaaSを拡げていくために必要なこと
 3. アメリカではどのような状況なのか？

SaaSが注目される時代は終わったのか？

最近では、世の中は「Generative AI」一色になってきたなぁと思います。

どんなイベントに参加しても、議題が別の議題だったとしても、必ずと言ってもいいくらい話題にあがります。


インターネットが出てきてすぐの時に、今の世界観が想像できなかったように、すごいものが出てきたなと思いつつも、まだ、世界がどのように変化するのかをクリアにイメージはできていない状況です。


話をSaaSに戻しますが、「SaaS」もかつては、同じように、さまざまなところで注目され、多くのスタートアップが資金調達をして、マーケットの期待値もとても高かったと思います。

しかしながら、コロナ以降]]></description><link>https://tech.anti-pattern.co.jp/saasnoshi-dai-hamouzhong-watutesimatutanoka/</link><guid isPermaLink="false">Ghost__Post__65824a7c27e564000167f408</guid><category><![CDATA[SaaSus Platform]]></category><dc:creator><![CDATA[kenji.shinoda]]></dc:creator><pubDate>Wed, 20 Dec 2023 02:00:21 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。信田(しのだ)です。<br/></p><p>現在、「SaaSus Platform」のマーケティングやセールスや導入支援などを頑張っています。</p><p>SaaSus PlatformのGTMをやりながら、SaaSについて色々考えてみました。</p><ol><li>SaaSが注目される時代は終わったのか？</li><li>SaaSを拡げていくために必要なこと</li><li>アメリカではどのような状況なのか？</li></ol><p><strong>SaaSが注目される時代は終わったのか？</strong></p><p>最近では、世の中は「Generative AI」一色になってきたなぁと思います。</p><p>どんなイベントに参加しても、議題が別の議題だったとしても、必ずと言ってもいいくらい話題にあがります。<br/></p><p>インターネットが出てきてすぐの時に、今の世界観が想像できなかったように、すごいものが出てきたなと思いつつも、まだ、世界がどのように変化するのかをクリアにイメージはできていない状況です。<br/></p><p>話をSaaSに戻しますが、「SaaS」もかつては、同じように、さまざまなところで注目され、多くのスタートアップが資金調達をして、マーケットの期待値もとても高かったと思います。</p><p>しかしながら、コロナ以降、投資家界隈でも、考え方に変化があったように思います。</p><p>好調期には、PSRがバリュエーション算出の指標となるなど、どれだけ成長できる可能性が高いのか？が注目されていました。</p><p>しかし、最近では、PERなど、どれだけ利益を出せるプロダクトなのかが投資判断において重要になってきているように感じます。<br/></p><p>当然、当初から、将来的に利益を出すことも重要視されていたと思いますが、アーリーフェーズは成長への投資が優先されていたように思います。</p><p>では、なぜそのような変化が起きているのかを考えてみました。</p><ul><li>コロナで株式市場全体的に先が読めない状況になってきた</li><li>SaaS企業が投資に対して、爆発的な成長をなかなかできていない</li><li>日本特有のカスタマイズ文化</li></ul><p>マーケットは常に変化するもので、それに合わせた戦略がSaaSスタートアップ企業には必要かなと思います。</p><p>では、「SaaS」はもう過去のものになってしまったのでしょうか？答えはNoだと思います。<br/></p><p>実際に数値データを見てみても、日本のSaaS市場はまだまだ高い成長率を維持しています。<br/></p><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/3J-tNx_vyKHlITb6wyfjwYzP8VNthv8tSNgIAzX6tvpw7hZcTZrjTOPyW1vR9tQ7Ct6QZYF_f--FODXY2KtWqC5bC255DGc-5QZboVg6YPYrYTzrtIpqdzOT7anvxeqYLjmYALuLBI4KoWYCCitwsok" class="kg-image" alt="" loading="lazy"/></figure><p>&lt;参考&gt;「Japan SaaS Insights 2023」を公開 -混沌とする世界でSaaS市場の拡大は続く-</p><p><a href="https://onecapital.jp/perspectives/japan-saas-insights-2023">https://onecapital.jp/perspectives/japan-saas-insights-2023</a><br><br/></br></p><p>また、先日、アメリカのラスベガスまで、AWS re:Invent 2023に参加してきましたが、そこでも、SaaSのセッションは年々増えているように思います。<br/></p><p><strong>SaaSを拡げていくために必要なこと</strong></p><p>では、これから、僕らのようなSaaS企業はどのように成長をしていけばいいのか？どのように投資家に注目して貰えば良いのか？を考えてみました。</p><p>アメリカの、AWS re:Inventに参加して感じたこととして、彼らはSaaSはスケールするビジネスモデルであるというのが大前提になっているのではないかと感じました。</p><p>スケールを前提として、SaaSのアーキテクチャについてとても深く議論されているようです。<br/></p><p>日本でも、AWSの出現によって、エンタープライズシステムのクラウド化はどんどん進んでいます。</p><p>しかし、その次の段階として、エンタープライズシステムのSaaS化がどんどん進むべきなのかなと僕は考えています。<br/></p><p>その中で、やはり、「ソフトウェアのスケールさせることが得意という特性」を活かすことが大事なのかなぁと思いました。</p><p>日本では、長らく、企業の業務プロセスのシステム化を進めてきました。目的は、業務の効率化です。<br/></p><p>しかし、SaaS提供企業は、もちろんそのプロダクトを活用した業務の効率化ができることは大前提ですが、ソフトウェアのスケールメリットを活かして、たくさんの顧客に提供し、より多くの人がより手軽に使えるソフトウェアを提供していくべきなのかなと考えました。</p><p>つまり、SaaSは、これまでソフトウェアを各自で利用していた企業がサービス提供形式で利用できるだけではなく、AWSがコンピューティングリソースの民主化(より多くの人が恩恵を受けられる形)をしたように、SaaSもより業務ソフトウェアの民主化を起こす必要があるのかなと思います。</p><p>そのためには、SaaSもAWSを見習うのが一番良いのではないかと思います。<br/></p><p>AWSでは、</p><p>・請求の自動化</p><p>・契約の自動化</p><p>・APIの提供による顧客側でクラウド内操作可能な領域の提供</p><p>・あらゆる機能のサービス化(個別カスタマイズしない)</p><p>のような形で、顧客が拡大していくことを前提とした仕組みづくりがされています。<br/></p><p>彼らは、顧客が拡大し続けているにも関わらず、その運用に忙殺されずに、AWSのサービス価値を向上させ続けています。<br/></p><p><strong>アメリカではどのような状況なのか？</strong></p><p>日本では、SaaSのビジネスモデルについて語られるシーンは多いですが、テクノロジー視点で語られることはまだまだ少ないように思います。</p><p>AWS re:Invent 2023に参加しましたが、SaaSにおけるテクノロジー視点でのさまざまなセッションが準備されていました。<br/></p><p>面白いのは、SaaSのアーキテクチャのデザインパターンについて、よく語られている印象でした。</p><p>なぜデザインパターン化されるのかを考えてみると、特に、BtoBのSaaSにおいては、</p><p>・一つの契約の中でたくさんのユーザーに使われること</p><p>・たくさんの企業の使われる前提であること</p><p>・認証、請求、オンボーディングなどなど共通で課題となる部分が多いこと</p><p>・スケールしていく前提で考えられていること</p><p>etc<br/></p><p>みたいな部分があるのかなと思います。<br/></p><p>例えば、AWSは、どのSaaSにも必要なSaaSの周辺機能について、「SaaS Control Plane」という概念で常に語られています。<br/></p><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/GUYUGvP53BbY0oSsuO6QSoz6kdHteMDfBfeDnPQ2s3jHmRrmHNdYgO-vQij-Zb7fBpUgvmoxp_w63BMkApdzuT_w86uJPZSHbQo4XAHNOF70Wg05Fx7hQ-FYSUDzYAjMWXtuQjjWk_AcTGbZwQWXnS4" class="kg-image" alt="" loading="lazy"/></figure><p>&lt;抜粋&gt; AWS re: Invent 2022のセッション -SaaS architecture patterns: From concept to implementation-</p><p><a href="https://www.youtube.com/watch?v=xlAXldBt7I0">https://www.youtube.com/watch?v=xlAXldBt7I0</a><br/></p><p>このように、どのSaaSも共通して向き合うべき課題が豊富なことがわかります。<br/></p><p>また、提供されているセッションタイプの一つに、Chalk talk Sessionというものがありました。</p><p>最大、50-60名くらいの小規模に提供されるものですが、そこでは、オーガナイザーが議論のテーマを提供し、リスナーが積極的に、質問や意見を提示して、会場全体で議論するようなタイプのものでした。アメリカでは、多くのエンジニアが、このSaaSの共通のテーマに向き合い議論が活発に起きる印象でした。感覚値ですが、アメリカは日本よりも、何年も先にいってるような気分になりました。<br/></p><p>最後に、改めてですが、</p><p>日本でもBtoBのSaaSをもっともっと盛り上げていく必要があるかなと思っています。むしろここからがスタートなのかもしれません。エンタープライズITに占めるSaaSの割合がどんどん増えていくことが期待されます。</p><p>SaaSの活用が促進されることにより、日本のエンタープライズITの世界が効率化され、新しい価値の創造の部分にエンジニアはよりフォーカスしていけると良いなと思います。</p><p>我々も、SaaS提供企業として、日本のエンタープライズITの発展に寄与していけたらなと思います。</p>]]></content:encoded></item><item><title><![CDATA[SaaSにおけるフィーチャーフラグ活用とその考え方]]></title><description><![CDATA[こんにちは、小笹です。
SaaSus Platform(https://saasus.io/
)についてお客様とお話をさせていただきますと、「うちはお客様ごとにカスタマイズをしているのでSaaSにしていくのは難しい」というお声をいただくことがあります。

その際にプロダクトマネジメントのお話やフィーチャーフラグのお話をさせていただくのですが、その場その場でお話しする形になってしまうので、振り返りやすいコンテンツとして本ブログを執筆することにいたしました。

なお、本記事は「BtoB SaaSがカスタム開発の要望と向き合うには(
https://saasus.io/blog/how-btob-saas-can-stand-up-to-the-demands-of-custom-development
)」という拙作と合わせて参照いただくとより理解が進むかと思います。

Twelve Factor Appについて
まず、コードベースを一つに保つということについてです。
これはTwelve Factor Appというものでもその重要性が説かれています。
Twelve Factor
Appは、]]></description><link>https://tech.anti-pattern.co.jp/utilizing-feature-flags-in-saas-and-their-philosophy/</link><guid isPermaLink="false">Ghost__Post__656f41f227e564000167f37f</guid><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Sun, 10 Dec 2023 14:57:43 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/DALL-E-2023-12-06-01.24.43---An-OGP--Open-Graph-Protocol--image-for-a-blog-titled--Utilizing-Feature-Flags-in-SaaS-and-Their-Philosophy---sized-1200x630-pixels.-The-design-should-.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/12/DALL-E-2023-12-06-01.24.43---An-OGP--Open-Graph-Protocol--image-for-a-blog-titled--Utilizing-Feature-Flags-in-SaaS-and-Their-Philosophy---sized-1200x630-pixels.-The-design-should-.png" alt="SaaSにおけるフィーチャーフラグ活用とその考え方"/><p>こんにちは、小笹です。<br>
SaaSus Platform(<a href="https://saasus.io/">https://saasus.io/</a>)についてお客様とお話をさせていただきますと、「うちはお客様ごとにカスタマイズをしているのでSaaSにしていくのは難しい」というお声をいただくことがあります。</br></p>
<p>その際にプロダクトマネジメントのお話やフィーチャーフラグのお話をさせていただくのですが、その場その場でお話しする形になってしまうので、振り返りやすいコンテンツとして本ブログを執筆することにいたしました。</p>
<p>なお、本記事は「BtoB SaaSがカスタム開発の要望と向き合うには(<a href="https://saasus.io/blog/how-btob-saas-can-stand-up-to-the-demands-of-custom-development">https://saasus.io/blog/how-btob-saas-can-stand-up-to-the-demands-of-custom-development</a>)」という拙作と合わせて参照いただくとより理解が進むかと思います。</p>
<h2 id="twelve-factor-app%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Twelve Factor Appについて</h2>
<p>まず、コードベースを一つに保つということについてです。<br>
これはTwelve Factor Appというものでもその重要性が説かれています。<br>
Twelve Factor Appは、Herokuプラットフォーム上で開発・運用・スケールした何百何千ものアプリケーションから得られた知見をモダンなWebアプリケーション(SaaS)としてあるべき姿として、12のベストプラクティスにまとめた方法論として提唱されたものです。提唱されたのは2012年ですが、いまだに色々な場面で引用されるある種古典的な考え方になっています。</br></br></p>
<p>その1番最初に来るのが、コードベース「バージョン管理されている1つのコードベースと複数のデプロイ」です。</p>
<blockquote>
<p>もし複数のコードベースがある場合、それはアプリケーションではない – それは分散システムである。<br>
という表現がなされているくらいその重要性が説かれています。</br></p>
</blockquote>
<p>では、コードベースを一つに保つとして、顧客セグメントごとに機能を出し分けたい時にどうするか、その際に考えられるのがフィーチャーフラグの活用です。</p>
<h2 id="%E3%83%95%E3%82%A3%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%95%E3%83%A9%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">フィーチャーフラグについて</h2>
<p>まずはフィーチャーフラグについて理解を深めましょう。<br>
Pete HodgsonさんというThoughtWorksの方が書かれたFeature Toggles(<a href="https://martinfowler.com/articles/feature-toggles.html">https://martinfowler.com/articles/feature-toggles.html</a>)という記事が有名です。(最近はトグルでなく、フラグと表現することが多いようです。)<br>
こちらも2017年頃で少し古いものですが、古典的な価値を帯びています。</br></br></p>
<p>簡単にフィーチャーフラグを表現すると、「チームがコードを変更することなくシステムの振る舞いを変更することができるもの」です。これによりカナリアリリースやABテストなどをスムーズに実現することができるようになります。</p>
<p>詳細は翻訳記事(<a href="https://qiita.com/TsuyoshiUshio@github/items/51c6662cd45bded95389">https://qiita.com/TsuyoshiUshio@github/items/51c6662cd45bded95389</a>)もありますのでご参照いただくのが良いかと思いますが、フラグのカテゴリをご紹介します。</p>
<h3 id="%E3%83%95%E3%83%A9%E3%82%B0%E3%81%AE%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA">フラグのカテゴリ</h3>
<h4 id="%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%88%E3%82%B0%E3%83%AB%E3%82%BA">リリーストグルズ</h4>
<p>これらは新しい機能のリリースを管理するために使用されます。リリーストグルは、機能が完成してもすぐにはユーザーに公開せず、タイミングを選んで展開するのに役立ちます。</p>
<h4 id="%E5%AE%9F%E9%A8%93%E3%83%88%E3%82%B0%E3%83%AB%E3%82%BA">実験トグルズ</h4>
<p>これらはA/Bテストや実験的な機能のテストに用いられます。特定のユーザーグループに対して新しい機能を試験的に展開し、フィードバックやパフォーマンスデータを収集するために使用されます。</p>
<h4 id="ops-%E3%83%88%E3%82%B0%E3%83%AB">Ops トグル</h4>
<p>運用上の問題に対応するために使われるトグルです。例えば、システムのパフォーマンスが低下したときに特定の機能を無効にするなど、運用上の柔軟性を提供します。</p>
<h4 id="%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%88%E3%82%B0%E3%83%AB">パーミッショントグル</h4>
<p>機能のアクセス権を制御するために使用されます。これにより、特定のユーザーやユーザーグループにのみ特定の機能を提供することができます。</p>
<h3 id="%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">ユースケースについて</h3>
<p>こういったものによって様々なユースケースに対応することができます。<br>
フィーチャーフラグSaaSであるLaunchDarklyが様々なケースを紹介しています。<br>
<a href="https://github.com/launchdarkly/featureflags/blob/main/2%20-%20Uses.md">https://github.com/launchdarkly/featureflags/blob/main/2 - Uses.md</a></br></br></p>
<h3 id="%E5%AE%9F%E8%A3%85%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">実装のイメージについて</h3>
<p>また、実装のイメージを沸かせたい方は下記の記事を参照するのが良いでしょう。<br>
<a href="https://zenn.dev/ascend/articles/feature-flag">https://zenn.dev/ascend/articles/feature-flag</a><br>
<a href="https://logmi.jp/tech/articles/329505">https://logmi.jp/tech/articles/329505</a></br></br></p>
<h2 id="saas%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%B4%BB%E7%94%A8">SaaSにおける活用</h2>
<p>前提となる知識を得たとして、SaaSにおいてこれらをどのように活用すれば良いでしょうか？<br>
当然、4種類あるカテゴリは全て活用することができますが、特に活用するのはパーミッショントグルになるでしょう。</br></p>
<p>SaaSにおいてはティアという考え方があります。プレミアティアやスタンダードティアなど、顧客の層を指した表現になります。通常はプランと紐づいて収益構造を成しているものです。</p>
<p>ティアによって提供する価値を変えるために、ティアごとに提供機能が異なることは一般に起こり得るものかと思います。</p>
<p>もしくは、オプション機能なども考えられます。これはオプション契約テナントにのみ機能を提供するものです。これもイメージしやすいかと思います。</p>
<p>そして、特定顧客への提供です。所謂カスタマイズに近い部分ですが、ここは限界まで排除するように検討を進めていくことが重要です。顧客ごとにカスタマイズが必要なのであれば、その部分のみカスタマイズがある程度可能なコンポーネントを提供するような、顧客がカスタマイズできる機能を提供するよう努める必要があります。(イメージはKintoneなどのようなものでしょうが、開発するのはコストがかかります)</p>
<p>ティア、オプション、カスタマイズ、どれについても検討を進めるに当たっては、ビジネスプランとプロダクトマネジメントを一致させていくことが重要になります。</p>
<p>SaaSはビジネスとソフトウェアが絡み合ったビジネスモデルです。ビジネスのことを考慮せずにソフトウェアを複雑化することは避けねばなりませんし、逆も然りです。<br>
フィーチャーフラグを活用するとコードベースを一つに保ちながら、確かにプロダクトを柔軟に提供することができるようになりますが、乱用は避けねばなりませんし、無限に拡張することは現実的でありません。<br>
フィーチャーフラグに関してドキュメンテーションをしたり、適切な管理を実施しないと、むしろ運用を煩雑にしてしまうリスクを抱えることになります。</br></br></p>
<h3 id="%E6%A9%9F%E8%83%BD%E3%81%AE%E5%BB%83%E6%A3%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">機能の廃棄について</h3>
<p>そこで重要なのは機能を廃棄することです。</p>
<p>模範的な例として、Salesforceは定期的に機能を廃棄する方針を示しています。(<a href="https://help.salesforce.com/s/articleView?id=000387126&amp;type=1">https://help.salesforce.com/s/articleView?id=000387126&amp;type=1</a>)</p>
<blockquote>
<p>Salesforce は、製品の使用状況の分析を含む広範なプロセスを用い、お客様との直接的な対話はもちろん、IdeaExchange を通じて寄せられたお客様の声にも耳を傾けた上で、廃止する機能を決定しています。Salesforce の目標は、お客様に最大の価値をもたらす分野にリソースを投じることです。ゆえに、多くのリソースを消費する割に実現される価値が小さい機能や、ごく限られたお客様のみに価値が限定される機能などは廃止もやむを得ないという判断が下されることがあります。機能が廃止されれば、一部のお客様には一時的な混乱が及ぶことは承知しております。ただし、長期的に見れば、最も優先順位が高い分野にリソースを注力していくことが、お客様やパートナーコミュニティに最大の利益をもたらすことになると確信しています。</p>
</blockquote>
<p>素晴らしいですね。</p>
<p>これが実現可能なのは、機能ごとに利用状況やビジネスへの貢献度を可視化しているからでしょう。<br>
利用状況分析などは顧客価値を最大化する上で、非常に重要なアクションになります。</br></p>
<p>ここで注意が必要なことは、SaaSは単なる機能の提供ではなく色々な企業のワークロードを把握しているからこそ可能な「ベストプラクティスの提供」であるという点です。<br>
つまり、仮に利用率が低くても顧客への貢献度が高いのであれば、その機能を顧客に啓蒙していくなどのアクションが必要になってきます。</br></p>
<p>以上です。<br>
SaaSって奥が深くて楽しいですね！</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[re:invent 2022 振り返り]]></title><description><![CDATA[こんにちは。アンチパターンの岩村です。

2022年11月28から12月2日までのre:inventに参加した際の記録を残せていなかったので、いまさらですが記録として残したいと思います。

re:inventに行くにあたってあまり準備もできずに参加してしまったので本当に準備不足による反省がたくさんあったので書いていきます。

現地で印象強かったもの
兎にも角にも会場の広さや雰囲気も含めすべてのスケールが想像以上でした。

基調講演は最終日だけ参加したのですが、Dr. Werner
Vogelsさんが発表しているのを生で聞いて会場の盛り上がりを直接体験できたのはすごく印象に残っています

SessionやExpoの展示を見ても幅広い分野での製品に関わっているのを感じました。その中でもF1の世界でもAWSを利用することで今まで60時間かかっていたことを12時間まで削減できたなど元々AWSの事例として発表されていたことではありましたが、初めて知った事例などもあり自身の知識が拡張されてとても良い経験でした。

印象に残っているセッション
現地参加時の業務で大学生がメインとなり開発を進める際にチ]]></description><link>https://tech.anti-pattern.co.jp/re-invent-2022-zhen-rifan-ri/</link><guid isPermaLink="false">Ghost__Post__65462e6527e564000167f235</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Mon, 13 Nov 2023 07:11:43 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。アンチパターンの岩村です。</p><p>2022年11月28から12月2日までのre:inventに参加した際の記録を残せていなかったので、いまさらですが記録として残したいと思います。</p><p>re:inventに行くにあたってあまり準備もできずに参加してしまったので本当に準備不足による反省がたくさんあったので書いていきます。</p><h2 id="%E7%8F%BE%E5%9C%B0%E3%81%A7%E5%8D%B0%E8%B1%A1%E5%BC%B7%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">現地で印象強かったもの</h2><p>兎にも角にも会場の広さや雰囲気も含めすべてのスケールが想像以上でした。</p><p>基調講演は最終日だけ参加したのですが、Dr. Werner Vogelsさんが発表しているのを生で聞いて会場の盛り上がりを直接体験できたのはすごく印象に残っています</p><p>SessionやExpoの展示を見ても幅広い分野での製品に関わっているのを感じました。その中でもF1の世界でもAWSを利用することで今まで60時間かかっていたことを12時間まで削減できたなど元々AWSの事例として発表されていたことではありましたが、初めて知った事例などもあり自身の知識が拡張されてとても良い経験でした。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/11/IMG_7183.jpg" class="kg-image" alt="" loading="lazy" width="2000" height="2667" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/11/IMG_7183.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2023/11/IMG_7183.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2023/11/IMG_7183.jpg 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2023/11/IMG_7183.jpg 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E5%8D%B0%E8%B1%A1%E3%81%AB%E6%AE%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3">印象に残っているセッション</h2><p>現地参加時の業務で大学生がメインとなり開発を進める際にチーム組成がうまく行かないなどチームビルディング面で学ぶことが多かった Leading beyond line of sight: Amazon’s two-pizza teams とセッション内でTypeScriptを利用したCDKの実演があったHow to reuse patterns when developing infrastructure as codeが印象に残っています。</p><p>もし気になる場合は、YouTubeのリンクも添付するので視聴してみてください</p><h3 id="leading-beyond-line-of-sight-amazon%E2%80%99s-two-pizza-teams">Leading beyond line of sight: Amazon’s two-pizza teams</h3><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/gfFGGzGCS04?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="AWS re:Invent 2022 - Leading beyond line of sight: Amazon’s two-pizza teams (INO204)"/></figure><h3 id="how-to-reuse-patterns-when-developing-infrastructure-as-code">How to reuse patterns when developing infrastructure as code</h3><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/ndd9XwQZbyM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="AWS re:Invent 2022 - How to reuse patterns when developing infrastructure as code (DOP302)"/></figure><h2 id="%E3%81%93%E3%81%86%E3%81%97%E3%81%A6%E3%81%8A%E3%81%91%E3%81%B0%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D">こうしておけば良かったところ</h2><p>事前のキャッチアップ不足。全てここにつきると思いますが、事前勉強会へ参加できなかったり現地で参加したら何を1番に考えて行動するかなど事前の準備が本当に不足していました。</p><p>KeynoteやBreakout Sessionを毎日の予定に組み込んでいたのですが、現地参加するのであればChalk TalkやWorkshopに参加することが非常に大事なのかと考えています。帰国後に知ったのがワークライフバランスなどのWorkshopがあり普段の業務で接している大学生達に1番伝えられる部分だと思ったので後悔しています。</p><p>またセッションが公開されたときにすぐ予約した方がいいということを知らず、何もしないでいたら人気があるセッションは全て埋まっていました。</p><p>現地の会場で飛び入りで聞くこともできるのでAWS Eventsアプリなどを利用してリスト化しておくべきでした。。</p><p>英語が話せないのでWorkshopなどを組み込むことに臆したこともあるのですが、現地参加のメリットの対面でのメリットを考えれば会話できるように英会話の練習をしておけば自身で疑問に思ったり通常のセッションでも自分ならこう思うがどうかというやり取りが可能だったはずなので反省しています。</p><p>また現地についてから気付いたのですが、現地時間の夜に日本から現地参加されている方の部屋やお店で集まって議論している会もあり現地で共に参加している日本の方との交流も大事だなと思いました。</p><h2 id="%E4%BD%93%E5%8A%9B%E4%B8%8D%E8%B6%B3">体力不足</h2><p>次に大きな反省として普段から在宅でずっと家にいたのもあって体力が全くない状態でre:inventに参加したことです。</p><p>毎日1万歩から2万歩近く歩いて各セッション会場を往復して夜には現地参加の人との交流などを考えると普段全く出歩かない体力の状態から参加すると初日でダウンしてしまいます。</p><p>なんとか初日に現地参加の方達との交流は持てたのですが2日目以降はホテルに戻ったら外出できる体力が残っていませんでした。</p><h2 id="%E6%AC%A1%E5%9B%9E%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6">次回に向けて</h2><p>成長や経験のために参加させていただけてとても感謝しています。</p><p>会社に貢献できるようにより邁進していきます。</p><p>2023年のre:inventは現地参加ではないですが、SaaSの運用やセキュリティのセッションなどを見ようと思ってます。</p><p>以上2022年 AWS re:inventの参加報告を兼ねた振り返りでした</p>]]></content:encoded></item><item><title><![CDATA[CypressとPercyでVRTを導入したら真っ白でした]]></title><description><![CDATA[初めまして！アンチパターンの安澤です！

今年の4月に転職して、当ブログの記事は初投稿となります。普段はフロントエンドを中心に AWS 関連の作業まで広く対応しております。

この記事では本業とは別で携わっているシステムに Visual Regression Test (VRT)
を導入した話について、はまった点などを紹介させていただきます。

このシステムは、React + Express というよくある (?) 構成のWeb アプリケーションなのですが、全体的にテストが実装されていませんでした。

そのため、改修時にデグレ確認などが難しいという課題を抱えており、Cypress を使用した E2E テストの導入を進めていたので、合わせて UI
などの崩れを検出するために VRT の導入を行いました。

Cypress を使用した VRT の導入に関しては公式ページ
[https://docs.cypress.io/guides/tooling/visual-testing]
にもいくつかの方法が紹介されています。今回は、紹介されている中でも Percy という
SaaSを利用すること]]></description><link>https://tech.anti-pattern.co.jp/cypress/</link><guid isPermaLink="false">Ghost__Post__6534c51527e564000167ef51</guid><dc:creator><![CDATA[Akira Yasuzawa]]></dc:creator><pubDate>Wed, 01 Nov 2023 00:44:41 GMT</pubDate><content:encoded><![CDATA[<p>初めまして！アンチパターンの安澤です！</p><p>今年の4月に転職して、当ブログの記事は初投稿となります。普段はフロントエンドを中心に AWS 関連の作業まで広く対応しております。</p><p>この記事では本業とは別で携わっているシステムに Visual Regression Test (VRT) を導入した話について、はまった点などを紹介させていただきます。</p><p>このシステムは、React + Express というよくある (?) 構成のWeb アプリケーションなのですが、全体的にテストが実装されていませんでした。</p><p>そのため、改修時にデグレ確認などが難しいという課題を抱えており、Cypress を使用した E2E テストの導入を進めていたので、合わせて UI などの崩れを検出するために VRT の導入を行いました。</p><p>Cypress を使用した VRT の導入に関しては<a href="https://docs.cypress.io/guides/tooling/visual-testing">公式ページ</a>にもいくつかの方法が紹介されています。今回は、紹介されている中でも Percy という SaaSを利用することで簡単に導入できることがわかったのでこちらを採用しました。</p><h3 id="%E6%96%99%E9%87%91%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">料金プランについて</h3><p>料金プランについては、以下のページから確認できます。無料プランもあり、月5000枚までスクリーンショットをアップロードすることができます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://percy.io/pricing"><div class="kg-bookmark-content"><div class="kg-bookmark-title">All-in-one visual testing and review platform | Percy</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://percy.io/images/touch-icon.png"><span class="kg-bookmark-author">Percy</span></img></div></div></a></figure><p>Percy ではクロスブラウザをサポートしており、Chrome、Firefox、EdgeとSafariが選択できます。無料プランでは対象のブラウザを選択できないため、自動的に全てのブラウザでスクリーンショットが取得されます。ブラウザごとにスクリーンショット1枚のカウントになり、1回の取得で4枚とカウントされる点には注意が必要そうです（レスポンシブにも対応しており、2種類の画面サイズで取得すると４ブラウザ × ２画面サイズで8枚のカウントになります）。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/browser.png" class="kg-image" alt="" loading="lazy" width="1387" height="210" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/10/browser.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2023/10/browser.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/browser.png 1387w" sizes="(min-width: 720px) 720px"/></figure><h3 id="%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">やってみる</h3><p>実際の導入は、以下の記事などを参考にさせていただきました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://zenn.dev/tsucchiiinoko/articles/c202a498f4c3ef"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cypress × percyでビジュアルリグレッションテストに入門する</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.zenn.studio/images/icon.png"><span class="kg-bookmark-author">Zenn</span><span class="kg-bookmark-publisher">ツチノコ</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/zenn/image/upload/s--wiWs2XQ_--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Cypress%20%C3%97%20percy%E3%81%A7%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%AA%E3%82%B0%E3%83%AC%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%85%A5%E9%96%80%E3%81%99%E3%82%8B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%E3%83%84%E3%83%81%E3%83%8E%E3%82%B3%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzAyNDk2MGJlYzIuanBlZw&#x3D;&#x3D;%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png"/></div></a></figure><p>設定はとても簡単にできたので、いざ GitHub Actions 上で VRT を実行して、あとは Percy のコンソールを確認すれば画面のスクリーンショットが撮れているはずです！</p><p>実際に撮れていた画像は以下のような感じでした🥹</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/before.png" class="kg-image" alt="" loading="lazy" width="1529" height="925" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/10/before.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2023/10/before.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/before.png 1529w" sizes="(min-width: 720px) 720px"/></figure><p>画像も取得できていなければ、CSS も全く当たっていませんね...。</p><p>Cypress のスクリーンショットはきちんと撮れているのに何故でしょうか。</p><p>結論から言うと、<strong>ベーシック認証</strong>の影響でした（前提として、このテストは検証環境に実際にホスティングされているアプリケーションに対して実行しています）。Percy ではベーシック認証が設定されている場合、ユーザー名とパスワードを設定する必要があるようです。</p><blockquote>If the app or website you’re taking snapshots of is protected with authentication, you can configure Percy to pass the needed authentication headers. Without passing authentication to Percy, snapshots can be broken (since we won’t be able to save the needed assets to render the page).</blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.browserstack.com/docs/percy/advanced-snapshots/assets-with-authentication"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Capturing assets protected with authentication | BrowserStack Docs</div><div class="kg-bookmark-description">Capturing assets protected with authentication</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.browserstack.com/favicon.ico"><span class="kg-bookmark-author">BrowserStack Docs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.browserstack.com/docs/static/img/browserstack-rect.jpg"/></div></a></figure><p>今回の VRT は GitHub Actions 上で実施しており、ユーザー名とパスワードはGitHub Actions Secrets として保存したかったので、.percy.yml に設定するのではなく、以下のように Cypress のカスタムコマンドとして実装しました。</p><pre><code class="language-Typescript">Cypress.Commands.add('vrtScreenshot', (name: string) =&gt; {
  cy.percySnapshot(name, {
    discovery: {
      authorization: {
        username: Cypress.env('BASIC_AUTH_USERNAME'),
        password: Cypress.env('BASIC_AUTH_PASSWORD'),
      },
    },
  });
});</code></pre><p>ベーシック認証の設定を入れた上で再度実行します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/after.png" class="kg-image" alt="" loading="lazy" width="1518" height="932" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/10/after.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2023/10/after.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/10/after.png 1518w" sizes="(min-width: 720px) 720px"/></figure><p>はい！うまく撮れてました！ドキュメントを読むのは大切ですね...。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>今回は、Cypress と Percy を使用して VRT を導入した際にはまったところを紹介させていただきました。SaaS を使用すると色々なことが簡単に実装できますね！</p><p>今回は Percy を使用することにしたので、触れることはなかったのですがオープンソースのツールに reg-suit と言うものがあり、こちらを使用しても VRT が導入できそうなので機会があれば触れてみたいと思います。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/reg-viz/reg-suit"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - reg-viz/reg-suit: :recycle: Visual Regression Testing tool</div><div class="kg-bookmark-description">:recycle: Visual Regression Testing tool. Contribute to reg-viz/reg-suit development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">reg-viz</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ac4b7594af488ecf0c72efa1f2de7fe4494fd565f6375f906eae5b786a3cd8be/reg-viz/reg-suit"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[環境変数について改めて考える]]></title><description><![CDATA[

こんばんは！やがさきです。

今回は改めて環境変数について考えてみます。みなさん、環境変数使ってますよね？どんな場面で使ってますか？そりゃ、名前の通り環境ごとに変えないといけない値を入れてますよね。でも、それ、本当にそれは環境固有の情報ですか？なんでもかんでも環境変数にしちゃってませんか？１実行環境に環境変数が１００個超えちゃってたりしますか？そして、その環境変数ってどうやって管理してますか？また、パスワードやクレデンシャルなどのシークレット情報も環境変数で管理してますか？

このあたりを改めて考えてみたいと思います！

環境変数にすべき値
では、まずどんな値を環境変数にすべきかを改めて考えてみます。名前の通り、環境によって変わる値を環境変数にすべきなのは当然かと思うのですが、これをそのまま地でいくと、だいたいすごい数の環境変数になっちゃいます。そうすると、環境変数をメンテしたり設定したりするだけでひと仕事になりますし、どの環境変数をどうするとどんな挙動になるのかを理解するのが非常に困難になり、環境変数職人みたいな謎のスキルを持った人が爆誕したりします。これはかなりしんどい状況であ]]></description><link>https://tech.anti-pattern.co.jp/huan-jing-bian-shu-ni/</link><guid isPermaLink="false">Ghost__Post__631ee9e4a35ab30001cac3fa</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Tue, 31 Oct 2023 03:27:49 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんばんは！やがさきです。</p><p>今回は改めて環境変数について考えてみます。みなさん、環境変数使ってますよね？どんな場面で使ってますか？そりゃ、名前の通り環境ごとに変えないといけない値を入れてますよね。でも、それ、本当にそれは環境固有の情報ですか？なんでもかんでも環境変数にしちゃってませんか？１実行環境に環境変数が１００個超えちゃってたりしますか？そして、その環境変数ってどうやって管理してますか？また、パスワードやクレデンシャルなどのシークレット情報も環境変数で管理してますか？</p><p>このあたりを改めて考えてみたいと思います！</p><h2 id="%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E3%81%99%E3%81%B9%E3%81%8D%E5%80%A4">環境変数にすべき値</h2><p>では、まずどんな値を環境変数にすべきかを改めて考えてみます。名前の通り、環境によって変わる値を環境変数にすべきなのは当然かと思うのですが、これをそのまま地でいくと、だいたいすごい数の環境変数になっちゃいます。そうすると、環境変数をメンテしたり設定したりするだけでひと仕事になりますし、どの環境変数をどうするとどんな挙動になるのかを理解するのが非常に困難になり、環境変数職人みたいな謎のスキルを持った人が爆誕したりします。これはかなりしんどい状況でありつつ、あるあるなんじゃないかなと思います。では、どのような値を<strong>環境変数にしない</strong>ということが考えられるでしょうか？</p><p><strong>環境ごとに変わるかもしれないけど基本的にはまず変わらない値</strong></p><p>こういった物はコードに書いちゃって良いのではないか？と考えることもできます。</p><p>特に昨今では、Infrastructure as Code(IaC) や CI/CD が発達していることもあり、本番環境において環境変数などのパラメータ<strong>だけ</strong>を変更することは少なくなってきているかと思います。パラメータシートをもとに、手動でパラメータの設定をダブルチェックをしながらやったりするのは、ほんとやめましょう。それは危険なので、環境変数とともにデプロイ、もしくは再プロビジョニングをするという方向になってきているのではないでしょうか？そのため、”<strong>環境ごとに変わるけれども、基本的にはまず変わらない値” </strong>はコードに埋め込んでしまうほうが効率的なのではないか？と考えられるようになってきているかと思います。コードに書くと言っても、さすがに思いっきりインラインで書いちゃうと変更もつらすぎるので、定数にはすべきかと思います。</p><p>もし開発環境だけはテストやモックのために書き換えたい値がある場合は、<strong>適切なデフォルト値</strong>を設定するようにしておき、開発環境だけはその値を環境変数で上書きできるようにする、というのも良いのではないでしょうか？デフォルト値は設定されているが、それがダミーのような値や開発環境用の値というのはよくあるのではないでしょうか？我々は開発環境で動くアプリケーションを作っているのではなく、<strong>本番環境で適切に動くアプリケーション</strong>を作っているので、デフォルト値を本番環境で動作するように適切に設定するというのが良いのではないでしょうか？</p><h2 id="%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E5%80%A4%E3%81%AE%E7%AE%A1%E7%90%86%E6%96%B9%E6%B3%95">環境変数の値の管理方法</h2><p>上記の流れで環境変数を必要最小限にしたとしてもまだ環境変数はゼロにはできないケースが多いかと思います。では、環境変数の値はどのように管理するのが良いでしょうか？たとえば AWS の Amazon ECS を使うという場合を考えてみると</p><ul><li>コンテナの定義に環境変数を直接書く</li><li>コンテナの定義に環境変数をどのパラメータストア・シークレットマネージャから取ってくるかを書く</li><li>.env などの環境変数ファイルをコンテナに同梱してアプリケーションから読み込む</li><li>フィーチャーフラグなど外部に持たせる</li><li>そもそも環境変数を使わない</li></ul><p>などの方法があります。これらを IaC, CI/CD を使っているという前提をおいてもう少しブレークダウンしてみましょう。</p><p><strong>コンテナの定義に環境変数を直接書く</strong></p><p>ECSのタスク定義に直接環境変数名と値を書くパターンです。インフラのIaCでタスク定義ファイルを管理するという前提であれば、これはバージョン管理もされますし、良い選択かと思います。</p><p><strong>コンテナの定義に環境変数をどのパラメータストア・シークレットマネージャから取ってくるかを書く</strong></p><p>ECSのタスク定義に直接環境変数名とそれに対応する値をどこから取ってくるかを書くパターンです。これは、パラメータストアやシークレットマネージャの値をどのように管理するかによって有益かどうかが決まってくるかと思います。IaCやCI/CDを伴わずに直接CLIやコンソールからパラメータストアの値をいじるユースケースが強くある場合はこれを選ぶのもありかもしれません。しかし、パラメータストアの値を結局IaCで管理しているのであれば、ただの２度手間になっているかもしれません。新しい環境変数を反映させるためにコンテナを再起動する手間もかかります。場合によって「コンテナの定義に環境変数を直接書く」の方が効率もセキュリティも良い可能性があります。</p><p><strong>.env などの環境変数ファイルをコンテナに同梱してアプリケーションから読み込む</strong></p><p>これは、CI/CDなどでコンテナをビルドするタイミングで .env などのファイルを同梱してしまうパターンです。 .env もコードリポジトリ内で環境ごとに分けて管理しているのであれば、ビルド時に確実に同梱されますし、ローカル環境、開発環境、本番環境での環境変数の扱いをなるべく共通にするという意味でも有益かと思います。ローカル環境だと、 .env が正義！みたいな状況だけども、本番環境ではクラウドから渡される環境変数が正義！みたいなことがよくあるかと思います。せっかくコンテナを使っているのに、それこそ環境差異による不具合の原因になったりしませんか？ということで、この方法も有益な場面が多くあるかと思います。</p><p><strong>フィーチャーフラグなど外部に持たせる</strong></p><p>フィーチャーフラグ・フィーチャートグルと言われる外部のサービスに値を持たせるという選択肢もあります。AWS においては、 AWS AppConfig が提供されています。また、 LaunchDarkly のように SaaS として提供されている場合もあります。アプリケーションにこれらのフィーチャーフラグを使うようにライブラリを組み込むことによって、動的に外部パラメータを読んで使うことができます。読み込みのオーバーヘッドやキャッシュ機構なども考慮する必要が出てきますが、ライブラリがよしなにやってくれる可能性が高いので安心して使えます。別途外部のサービスを使うという部分が懸念になる場合もありますが、フィーチャーフラグは環境変数用と以外にも有益です</p><p>参考： <a href="https://martinfowler.com/articles/feature-toggles.html">https://martinfowler.com/articles/feature-toggles.html</a></p><p><strong>そもそも環境変数を使わない</strong></p><p>いままでは、いわゆるバッドプラクティス・アンチパターンと言われていた、「コードに環境情報を埋め込む」という方法も、IaCやCI/CDが出てきてからは状況が変わっているかと思います。CI/CD無しで動作が変わることを本番環境にするのはNGですので、<strong>本番環境の環境変数だけを変更する</strong>という場面は少なくなってきているかと思います。そのため、思い切って環境変数を使わずにコードで判断する、という方法ももはや悪くはないのではないでしょうか？</p><h2 id="%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E6%83%85%E5%A0%B1%E3%81%AE%E7%AE%A1%E7%90%86">シークレット情報の管理</h2><p>しかし、環境変数にはデーターベースへの接続情報など、秘匿にしないといけないものも含まれていたりします。これはさすがにアプリケーションと同じコードリポジトリで管理するのは危険な場面が多いはずです。そのため、</p><ul><li>結局シークレットマネージャなど秘匿情報格納専用のサービスを使い、手動で設定する</li><li>本番用に権限を絞った CI/CD リポジトリを用意してそちらに格納し、ビルド時に動的に環境変数に埋め込む</li><li>本番用に権限を絞った CI/CD リポジトリを用意してそちらに格納し、ビルド時に動的にコードを変更してコードに埋め込む</li><li>本番用の権限を絞った IaC リポジトリを用意してそちらに格納し、本番プロビジョニング時にパラメータストアやシークレットマネージャに格納する</li></ul><p>などの検討が環境変数と合わせて必要になります。セキュリティ的にどれが良いのかというのは組織のポリシーなどによって決まってくるかと思いますが、<strong>結局誰かがどこかで値の管理をしないといけない</strong>ので、丸見えの方法を取らない限りは、どこに保管するかよりも管理・運用方法の方が重要になってくるため、できるだけ人が関わらないプロセスを選ぶ方がセキュアになるかと思います。</p><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>いままでは、</p><p>環境で変わりそうな値は環境変数にしましょう！<br>環境変数はパラメータストアなどに入れてコードと分離して変更しやすくしましょう！<br>秘匿情報は完全に分離して保存しておきましょう！</br></br></p><p>というような事をなんとなく慣習に従って行っていたこともあるかと思いますが、そもそもビルド、デプロイ、リリースのプロセスが大きく変わっているため、ちゃんと新しい方法に沿って環境変数の管理も考えないとな〜っていうのを自戒も兼ねて記しておきます。</p><p>こちらからは以上です！</p><p/>]]></content:encoded></item><item><title><![CDATA[SaaSus PlatformとStripeを連携して請求書を作成する]]></title><description><![CDATA[

こんにちは、郡山です。
今回は 「SaaSの開発から運用まで」の支援を可能とするツール SaaSus Platform と Stripeを連携して請求処理を行い請求書を作成します。

SaaSus Platform についてはこちら
https://saasus.io/

Stripe に関してはこちら
https://stripe.com/jp

Stripe の コンソールの開発者ページ->APIキータブからシークレットキーを取得してSaaSus Platformへ設定します。

Stripeのシークレットキーは SaaSus Platform の SaaS 開発コンソール、 外部連携 > 請求 ページで設定して保存します。

請求元情報の入力

Stripeの設定画面より、請求書テンプレートを開きビジネス情報で設定します。

料金プランの作成、SaaSus Platform の SaaS 開発コンソールの料金プランページで設定します。

今回は「基本料金」を持つプランの設定を行います。
固定ユニット計測単位を作成します

> ユニットは料金のベースとなる最小の計測単位の設定と]]></description><link>https://tech.anti-pattern.co.jp/saasus-platformtostripewolian-xi-siteqing-qiu-shu-wozuo-cheng-suru/</link><guid isPermaLink="false">Ghost__Post__6513b05d27e564000167ef16</guid><category><![CDATA[SaaSus Platform]]></category><category><![CDATA[Stripe]]></category><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Tue, 03 Oct 2023 00:27:08 GMT</pubDate><content:encoded><![CDATA[<p/><p>こんにちは、郡山です。<br>今回は 「SaaSの開発から運用まで」の支援を可能とするツール SaaSus Platform と Stripeを連携して請求処理を行い請求書を作成します。</br></p><p>SaaSus Platform についてはこちら<br><a href="https://saasus.io/" rel="nofollow noopener">https://saasus.io/</a></br></p><p>Stripe に関してはこちら<br><a href="https://stripe.com/jp" rel="nofollow noopener">https://stripe.com/jp</a></br></p><p>Stripe の コンソールの開発者ページ-&gt;APIキータブからシークレットキーを取得してSaaSus Platformへ設定します。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*nP7oLE4WRC3XVh7p8hkAnA.png" class="kg-image" alt="" loading="lazy"/></figure><p>Stripeのシークレットキーは SaaSus Platform の SaaS 開発コンソール、 外部連携 &gt; 請求 ページで設定して保存します。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*WdibEIqu2DcigPjYTumKfw.png" class="kg-image" alt="" loading="lazy"/></figure><p>請求元情報の入力</p><p>Stripeの設定画面より、請求書テンプレートを開きビジネス情報で設定します。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*VjzAwqjmliJVvKzJ1-gsxA.png" class="kg-image" alt="" loading="lazy"/></figure><p>料金プランの作成、SaaSus Platform の SaaS 開発コンソールの料金プランページで設定します。</p><p>今回は「基本料金」を持つプランの設定を行います。<br>固定ユニット計測単位を作成します</br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*LXTWNeF5oE52XINAce9L6w.png" class="kg-image" alt="" loading="lazy"/></figure><blockquote>ユニットは料金のベースとなる最小の計測単位の設定となり、他には「使用量ユニット」はユーザ数課金などの１単位あたりごとに料金が発生する単位、「段階ユニット」は携帯電話の段階的パケット料金のように利用量の段階ごとに一定の料金の単位、「段階的使用量ユニット」はボリュームディスカウントのように利用量に応じて１単位あたりの料金が変化していく単位など作成できます。</blockquote><p>続いて機能メニューを設定します。<br>機能メニューは計測単位を複数まとめて、１つの機能として定義することができます。<br>先ほど作成した「基本料金ユニット」を設定して保存します。</br></br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*nSeUbnJna16RpC3bXAorpQ.png" class="kg-image" alt="" loading="lazy"/></figure><p>続いて料金プランを設定します。</p><p>料金プランは機能メニューを複数まとめて、１つの料金プランとして定義します。ここで定義した料金プランを各テナントへ設定することができます。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*ZrWuAQE9aM5v6hlzRgYvQQ.png" class="kg-image" alt="" loading="lazy"/></figure><p>ではこの状態で Stripe へどのような情報が連携されているか確認してみましょう。<br>Stripe の商品タブで確認が可能です。<br>先ほど設定した基本料金 ¥30,000円が連携されていることが確認できます。</br></br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*a3T0wxzvJoNE0LlV0Ru89Q.png" class="kg-image" alt="" loading="lazy"/></figure><p>税率設定</p><p>料金プランを設定する時に適用する税率を設定可能です。税率を設定しないと消費税が請求書に表示されません。<br>今回は消費税 10％ 外税を定義します。</br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*jXH-ESsV_vIMuEC_IeQb1w.png" class="kg-image" alt="" loading="lazy"/></figure><p>テナントの請求情報を設定します。</p><p>SaaS 運用コンソールにてテナント管理ページを開き対象テナントの編集ボタンクリックしてテナントの請求情報を入力します。<br>ここで入力した内容が請求書の請求先情報として表示されます。</br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*bGs08E-Ph7yAHk9JxjdO-w.png" class="kg-image" alt="" loading="lazy"/></figure><p>テナントへ料金プランを設定します。</p><p>SaaS 運用コンソールにて料金プラン設定ページを開き対象テナントのプラン設定ボタンクリックしてテナントに料金プランを設定します。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*nee23ZOK8Kz982Etgqy55g.png" class="kg-image" alt="" loading="lazy"/></figure><p>料金プランに先ほど作成した、料金プラン、税率を設定します。<br>反映日は今回即時とするので、デフォルトのまま保存します。</br></p><blockquote>反映日は当日にした場合、約5分後からプランを利用できるようになります。また、未来日を設定してスケジューリングすることも可能となっています。</blockquote><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*Eg9No0Jf7YAC0nB18oGTNw.png" class="kg-image" alt="" loading="lazy"/></figure><p>保存ボタンクリックでテナントに料金プランの設定がスケジューリングされました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*OIiCCOcmU2elObZJFycn-Q.png" class="kg-image" alt="" loading="lazy"/></figure><p>Stripe でも同様に サプスクリプションがスケジュール設定されています。<br>サブスクリプションとして登録することで、 Stripe の機能により自動的にインボイス(請求)が作成され請求書が作成され請求処理が行われます。</br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*n4cAfb2v99FYeljj2f9vvA.png" class="kg-image" alt="" loading="lazy"/></figure><p>Stripeに作成されたサブスクリプション<br>基本料金：¥30,000 、消費税 10％ 外税のサブスクリプションがスケジューリングされました。</br></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*UNCkWf6tMU0t9mNJa_oePw.png" class="kg-image" alt="" loading="lazy"/></figure><p>作成されたインボイス</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*WYEJzicUjWg9qcrGxrRWRA.png" class="kg-image" alt="" loading="lazy"/></figure><p>Stripeで発行した請求書</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*BpVbco_rew-rOA0v8_W9kg.png" class="kg-image" alt="" loading="lazy"/></figure><p>支払いページ</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*2rc-txIViScEvTxyjcte6w.png" class="kg-image" alt="" loading="lazy"/></figure><p><br/></p><p>インボイス制度に対応する請求書について<br>10 月よりインボイス制度が始まります、請求書にインボイス制度の登録番号を設定する必要があるので、Stripe での設定方法を確認してみました。</br></p><p>Stripeでは請求書テンプレートに税務情報の設定が可能となっており、設定 &gt; 請求書テンプレート で 会社法人等番号を JP TRN として設定することが可能となっていました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*SfrzDv2JaRE9YrsYWaBjVA.png" class="kg-image" alt="" loading="lazy"/></figure><p>設定すると請求書の以下に表示されました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*yqwb1vcEpl434GjoBGtx1w.png" class="kg-image" alt="" loading="lazy"/></figure>]]></content:encoded></item><item><title><![CDATA[draw.ioでレイヤーを使ったらAWS構成図が捗ったお話]]></title><description><![CDATA[AWSを使っている方なら、dwar.ioを使って構成図を書く機会が結構あると思います。構成図を書く時のイラッとをなくすレイヤーという機能を知ったのでご紹介したいと思います。え？今更知ったの？そんなの知ってるよ。と言われちゃうかもですが、ご紹介させてくださいませ。

その前に、構成図書く時にどう書いたら良いんだろう、、、となる時ありますよね。参考にしている良い記事あるのでご紹介させてください。今まで結構雰囲気で書いていたのですが、この記事を見てから綺麗にかけるようになりました。
AWSのアーキテクチャ図を描くときに意識していること [https://zenn.dev/k_i/articles/6d76e43aa3bd84]

それではレイヤーのお話に行きたいと思います。ECSコンテナを編集したい場合、まずレイヤーを使っていないときは、こうなりますよね。

邪魔なのをどかしてどかして、やっと編集できます。次回すぐ編集できるように最前面に移動することもあるかと思います。これレイヤーを使うとこんなこととはさよならです。

dwar.ioの画面で、表示 - レイヤー と選択してレイヤーウィンドウ]]></description><link>https://tech.anti-pattern.co.jp/drawio-de-layer/</link><guid isPermaLink="false">Ghost__Post__64fb7d4427e564000167edeb</guid><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Wed, 13 Sep 2023 07:56:42 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/----------2023-09-09-6.24.41.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/----------2023-09-09-6.24.41.png" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話"/><p>AWSを使っている方なら、dwar.ioを使って構成図を書く機会が結構あると思います。構成図を書く時のイラッとをなくすレイヤーという機能を知ったのでご紹介したいと思います。え？今更知ったの？そんなの知ってるよ。と言われちゃうかもですが、ご紹介させてくださいませ。</p><p>その前に、構成図書く時にどう書いたら良いんだろう、、、となる時ありますよね。参考にしている良い記事あるのでご紹介させてください。今まで結構雰囲気で書いていたのですが、この記事を見てから綺麗にかけるようになりました。<br><a href="https://zenn.dev/k_i/articles/6d76e43aa3bd84">AWSのアーキテクチャ図を描くときに意識していること</a></br></p><p>それではレイヤーのお話に行きたいと思います。ECSコンテナを編集したい場合、まずレイヤーを使っていないときは、こうなりますよね。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/Sep-09-2023-05-31-21.gif" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="1612" height="718"/></figure><p>邪魔なのをどかしてどかして、やっと編集できます。次回すぐ編集できるように最前面に移動することもあるかと思います。これレイヤーを使うとこんなこととはさよならです。</p><p>dwar.ioの画面で、表示 - レイヤー と選択してレイヤーウィンドウを出します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/image-2.png" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="638" height="260" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/09/image-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/image-2.png 638w"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/image-11.png" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="229" height="196"/></figure><p>レイヤーを使うと、画面に配置するアイコン達の階層を指定できます。私はレイヤーをこのように設定してます。上の階層から、<br>フロー<br>リソース<br>リソースグループ<br>AZ<br>サブネット<br>VPC<br>AWS<br>となります。画面ではこんな感じです。</br></br></br></br></br></br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/image-10.png" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="234" height="335"/></figure><p>＋ボタンを押してレイヤーをお好みで作ってください。ダブルクリックでレイヤーの名前変更も出来ます。</p><p>レイヤーをクリックすると選択状態になります。その状態でアイコンを配置すると、選択中のレイヤーに紐づいていきます。レイヤーの左側にある目のようなアイコンを押すとそのレイヤーを表示／非表示出来ます。<br>それでは、今は「名称未設定レイヤ」にアイコン達が紐づいているので、適切なレイヤーに紐づけていきます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/Sep-09-2023-05-59-12.gif" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="1612" height="718"/></figure><p>レイヤーの紐づけ変更は、レイヤーを選択した状態でアイコンを切り取り、貼り付けとすると変更していけます。全てのアイコンや線などをレイヤーに紐づけていって、最後に「名称未設定レイヤ」は紐づいているアイコンがなくなって不要になるので削除しちゃいます。</p><p>そうすると画面のアイコンはレイヤーの階層で配置されている状態になります。「AWS」レイヤーの上に、「VPC」レイヤー<br>「VPC」レイヤーの上に、「サブネット」レイヤー<br>という感じです。<br>アイコン達は「リソース」レイヤーに配置していて、上位のレイヤーとしているので、アイコンを選択できないからどかしてどかして、ということが発生しません。<br>この状態でECSコンテナを編集してみます。</br></br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/09/Sep-09-2023-06-08-07.gif" class="kg-image" alt="draw.ioでレイヤーを使ったらAWS構成図が捗ったお話" loading="lazy" width="1612" height="718"/></figure><p>編集できますね。選択できない！ということはなくなりました。<br>それでは、快適なdraw.ioをお楽しみください！</br></p><p>最後になりますが、私の会社ではAWSエンジニアのための副業 / 転職スカウトサービス engineed をご提供しております。<br>エンジニアの方：<a href="https://info.engineed.io/engineer/">engineed</a><br>企業の方：<a href="https://info.engineed.io/">engineed</a><br>プロフィールと実力診断でスキルを可視化することで、エンジニア・企業の双方によりよいマッチングをお届けしたいと考えてます。ご興味持っていただけましたら上記リンクからサービス内容をご確認いただけますと幸いです。それでは以上になります。</br></br></br></p>]]></content:encoded></item><item><title><![CDATA[クラウドでスマホアプリを作りたい📱⛅]]></title><description><![CDATA[■結論
 * クラウド上でスマホアプリは開発できる
 * 不安定さはハマりどころはいくつかあるものの、ちゃんと動く

■使ったもの
 * GitHub Codespaces
 * AWS Amplify
 * React Native

■背景
普段は WEB 開発を行っているメンバーで、スマホアプリ開発に挑戦してみようという話になりました。ただし、「クラウド上で」開発を行うという制約付きです。

■技術選定について
◯ GitHub Codespaces
GitHub Codespaces [https://docs.github.com/ja/codespaces/overview] を使うと、GitHub
が提供するサーバー上で開発環境を構築することができます。今回はこちらを起点にして環境を整えていきました。

特に、今回は VSCode 上で Codespaces を立ち上げて開発をしました。ポートフォワード先が localhost になるのでこちらが便利です。

◯ React Native
せっかく作るならクロスプラットフォームでいきたいよね、ということで Flutter ]]></description><link>https://tech.anti-pattern.co.jp/kuraudode/</link><guid isPermaLink="false">Ghost__Post__64f0251a27e564000167eb0c</guid><dc:creator><![CDATA[Ryudai Anada]]></dc:creator><pubDate>Thu, 31 Aug 2023 13:54:57 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E2%96%A0%E7%B5%90%E8%AB%96">■結論</h2><ul><li>クラウド上でスマホアプリは開発できる</li><li>不安定さはハマりどころはいくつかあるものの、ちゃんと動く</li></ul><h2 id="%E2%96%A0%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">■使ったもの</h2><ul><li>GitHub Codespaces</li><li>AWS Amplify</li><li>React Native</li></ul><h2 id="%E2%96%A0%E8%83%8C%E6%99%AF">■背景</h2><p>普段は WEB 開発を行っているメンバーで、スマホアプリ開発に挑戦してみようという話になりました。ただし、<strong>「クラウド上で」</strong>開発を行うという制約付きです。</p><h2 id="%E2%96%A0%E6%8A%80%E8%A1%93%E9%81%B8%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">■技術選定について</h2><h3 id="%E2%97%AF-github-codespaces">◯ GitHub Codespaces</h3><p><a href="https://docs.github.com/ja/codespaces/overview">GitHub Codespaces</a> を使うと、GitHub が提供するサーバー上で開発環境を構築することができます。今回はこちらを起点にして環境を整えていきました。</p><p>特に、今回は VSCode 上で Codespaces を立ち上げて開発をしました。<strong>ポートフォワード先が <code>localhost</code> になる</strong>のでこちらが便利です。</p><h3 id="%E2%97%AF-react-native">◯ React Native</h3><p>せっかく作るならクロスプラットフォームでいきたいよね、ということで <a href="https://flutter.dev/">Flutter</a> と <a href="https://reactnative.dev/">React Native</a> の2択でした。</p><p>React Native を選択した理由は、大きく分けて以下の2つです。</p><h4 id="%E2%91%A0-web-%E3%81%AE%E4%BA%BA%E9%96%93%E3%81%AB%E5%84%AA%E3%81%97%E3%81%84">① WEB の人間に優しい</h4><p>Flutter でやるなら Dart を学ばないといけません。一方の React Native なら、使い慣れている React と同じような気持ちで開発できます。</p><p>また、画面の構築の仕方も Flutter は少し敬遠するところがあります (Widget が苦手でした)。私は完全に HTML 脳なので、React Native の方が魅力的に感じました。</p><h4 id="%E2%91%A1-%E9%AD%94%E6%B3%95%E3%81%AEqr%E3%82%B3%E3%83%BC%E3%83%89">② 魔法の(?)QRコード</h4><p><a href="https://reactnative.dev/docs/0.71/environment-setup?guide=quickstart">Expo Go</a> というのを使うと、ターミナルに表示された <strong>QR コードをスマホで読み込むだけ</strong>で、アプリが勝手に立ち上がってきます。お手軽ですね。</p><p>リモートのサーバーから QR コードが送られてきてスキャンして、本当に動くのか…？と半信半疑でしたが、この方針でやってみることにしました。</p><h3 id="%E2%97%AF-aws-amplify">◯ AWS Amplify</h3><p>フロントで手一杯なので、バックエンドは丸投げしたいなぁという気持ちでいっぱいです。どこかに素敵なサービスがあったら…</p><p>ありました。<a href="https://docs.amplify.aws/">AWS Amplify</a> は React Native 用のパッケージを提供しており、こちらにあやかることにしました。ますますクラウドらしくなってきましたね！</p><h2 id="%E2%96%A0%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D">■良かったところ</h2><h3 id="%E2%97%AF-react-native-elements">◯ React Native Elements</h3><p><a href="https://reactnativeelements.com/">React Native Elements</a> は、Material UI のような UI コンポーネントを提供してくれます。</p><p>使えるコンポーネント数が多く使い勝手が良さげです。また、ドキュメントが充実しているため、WEB 上でコンポーネントの検索が簡単にできます。</p><h3 id="%E2%97%AF-react-navigation">◯ React Navigation</h3><p>ネイティブアプリでのページネーションは全くイメージがつかず不安でいっぱいでしたが、<a href="https://reactnavigation.org/">React Navigation</a> でサクッと実装できました。</p><h3 id="%E2%97%AF-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE-ios-%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%9F">◯ ローカルの iOS シミュレーターが使えた</h3><p>当初は実機で Expo Go の QR コードを読み込んで開発をしていましたが、PC とスマホを両方いじるのが面倒になってきました。</p><p>ふと、QR コードのそばにこんなリンクが置いてあるのを見つけました。</p><p><code>exp://mva9gtc.anonymous.19000.exp.direct</code></p><p>これをローカルの iOS シミュレータ (Xcode にくっついてるやつ) の検索窓に貼り付けると、ちゃんとシミュレータ上で画面が動いてくれました！</p><p><strong>リモートで開発したアプリをローカルのシミュレータで動かす</strong>、という不思議な構成で開発をすることができました。</p><h2 id="%E2%96%A0%E3%83%8F%E3%83%9E%E3%82%8A%E3%81%A9%E3%81%93%E3%82%8D">■ハマりどころ</h2><h3 id="%E2%97%AF-expo-starttunnel">◯ expo start --tunnel</h3><p>開発時は <code>expo start</code> というコマンドを実行するのですが、ローカル開発でない場合は <code>--tunnel</code><strong> </strong>というオプション付きで実行しないといけません。また、その際に必要なパッケージとして <code>@expo/ngrok</code> を入れる必要がありました。</p><p><code>package.json</code> の scripts 部分の例:</p><pre><code class="language-json">"scripts": {
    "start": "expo start --tunnel",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "lint": "eslint . --cache",
    "lint:fix": "eslint . --fix --cache"
}</code></pre><p>クラウドは便利ですが、<strong>どこで何が動いているか</strong>をキチンと把握しないとハマるということが分かりました。</p><h2 id="%E2%97%AF-amplify-%E3%81%AE%E3%83%A2%E3%83%83%E3%82%AF%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84">◯ Amplify のモックが使えない</h2><p>Amplify で GraphQL を導入し、モックサーバーを立てようと考えました。</p><p>ところが、モックサーバー自体は <code>http://172.16.5.4:20002</code> で動くのですが、Codespaces によって <code>http://localhost:20002</code> に<strong>ポートフォワード</strong>されてしまいます。</p><p><code>awsconfig</code> にはモックサーバーが <code>http://172.16.5.4:20002</code> にあると設定されるので、そこでずれが生じて接続できなくなってしまいます。</p><p>苦肉の策も編み出したのですが、結局はモックサーバーは使わずに開発を進めることにしました (きれいな解消方法があれば教えて頂きたいです)。</p><p>苦肉の策 (上書き):</p><pre><code class="language-javascript">awsconfig.aws_appsync_graphqlEndpoint = 'http://localhost:20002/graphql'
Amplify.configure(awsconfig)</code></pre><h2 id="%E2%97%AF-%E4%BD%95%E3%82%82%E3%81%97%E3%81%A6%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AB%E5%A3%8A%E3%82%8C%E3%81%9F">◯ 何もしてないのに壊れた</h2><p>何もしてないのに壊れます。正確には、開発環境が不安定で、さっきまで動いていたものが突然動かなくなったりします。</p><p>いくつか考えられる対応はあります。</p><ul><li>アプリを再起動する (npm start し直し)</li><li>Codespaces を再起動する (PC 再起動と一緒)</li><li>Codespaces を作り直す (PC 買い替え)</li></ul><p>クラウドだからこその不安定さは、クラウド流に解決したいところですね！ローカルでは PC 買い替えなんてなかなかできないですが、クラウドだと気軽に使い捨てできるのが推しポイントです。</p><h1 id="%E2%96%A0%E3%81%BE%E3%81%A8%E3%82%81">■まとめ</h1><ul><li>ツールが整備されており、クラウド上でも十分にスマホアプリ開発ができる</li><li>クラウドの短所はクラウドの長所でカバーできる</li></ul>]]></content:encoded></item><item><title><![CDATA[Cloud RunとLitestreamで最強コスパ運用]]></title><description><![CDATA[Cloud RunとLitestream、GCSを使用して、SQLiteを使用したGoアプリケーションを格安運用していこうと思います。

FirestoreなどのNoSQL DBを使っても安く運用できますが、RDB使いたいというときもあるということで。

作ったもの
GitHub - kooooohe/litestream-cloud-runContribute to
kooooohe/litestream-cloud-run development by creating an account on GitHub.
GitHubkooooohe [https://github.com/kooooohe/litestream-cloud-run]\]簡単な構成

Litestream
LitestreamLitestream is an open-source, real-time streaming replication tool
that lets you safely run SQLite applications on a single node.Litestream
[ht]]></description><link>https://tech.anti-pattern.co.jp/cloud-runtolitstreamdezui-qiang-kosupayun-yong/</link><guid isPermaLink="false">Ghost__Post__64d63ec827e564000167e9f5</guid><category><![CDATA[Cloud Run]]></category><category><![CDATA[Litestream]]></category><category><![CDATA[sqlite]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Fri, 18 Aug 2023 09:15:26 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Selection_999-214--1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Selection_999-214--1.png" alt="Cloud RunとLitestreamで最強コスパ運用"/><p>Cloud RunとLitestream、GCSを使用して、SQLiteを使用したGoアプリケーションを格安運用していこうと思います。</p><p>FirestoreなどのNoSQL DBを使っても安く運用できますが、RDB使いたいというときもあるということで。</p><h1 id="%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</h1><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://github.com/kooooohe/litestream-cloud-run"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/litestream-cloud-run</div><div class="kg-bookmark-description">Contribute to kooooohe/litestream-cloud-run development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Cloud RunとLitestreamで最強コスパ運用"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ce9225ffa9a6423c56af8aa6e4f88223a1e9ed37a4524fe5139d41516786d622/kooooohe/litestream-cloud-run" alt="Cloud RunとLitestreamで最強コスパ運用"/></div></a><figcaption>\]</figcaption></figure><p>簡単な構成</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Selection_999-214-.png" class="kg-image" alt="Cloud RunとLitestreamで最強コスパ運用" loading="lazy" width="620" height="566" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/08/Selection_999-214-.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Selection_999-214-.png 620w"/></figure><h1 id="litestream">Litestream</h1><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://litestream.io/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Litestream</div><div class="kg-bookmark-description">Litestream is an open-source, real-time streaming replication tool that lets you safely run SQLite applications on a single node.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://litestream.io/apple-touch-icon.png" alt="Cloud RunとLitestreamで最強コスパ運用"><span class="kg-bookmark-author">Litestream</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://litestream.io/images/twitter-image.png" alt="Cloud RunとLitestreamで最強コスパ運用"/></div></a></figure><blockquote>Litestream is a standalone disaster recovery tool for SQLite. It runs as a background process and safely replicates changes incrementally to another file or S3. Litestream only communicates with SQLite through the SQLite API so it will not corrupt your database.</blockquote><p>SQLiteのデータをBackupしたりRecoveryしたりを簡単にできるツールです。引用ではS3になっていますが、今回はGCSを使っていきます。</p><h1 id="%E4%B8%8B%E6%BA%96%E5%82%99">下準備</h1><p>Backup用のGCSのバケットを作成。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Selection_999-197-.png" class="kg-image" alt="Cloud RunとLitestreamで最強コスパ運用" loading="lazy" width="470" height="127"/></figure><p>一旦適当なimageを使い、Cloud Runを作成。この際に<strong>最大スケール数を1とする。 </strong></p><p>2つ以上のスケールには対応していないので注意。データが壊れたりします。個人開発や小さいサービス向きという感じはしますが、Cloud Runのスペックを上げていけば結構対応できそう。</p><p>※アクセスがないときはゼロスケールします</p><pre><code class="language-sh">gcloud run deploy litestream-cloud-run \
--image=us-east1-docker.pkg.dev/YOUR_PROJECT/cloud-run-source-deploy/TARGET_IMAGE_URL \
--allow-unauthenticated \
--memory=128Mi \
--max-instances=1 \
--set-env-vars='BACKUP_URL=gcs://YOUR_BUCKET_NAME' \
--region=us-central1 \
--project=YOUR_PROJECT</code></pre><p>注意: Cloud Runのストレージはメモリに展開されるため、DBのmaxサイズはそこに依存します。</p><h2 id="dockerfile">Dockerfile</h2><p>Goを使うので、いつもどおりAlpineを使ってMulti-stage build を使う</p><pre><code class="language-dockerfile">FROM golang:1.20 as builder
WORKDIR /app
COPY ./src /app
#RUN CGO_ENABLED=0 go build -o main .
RUN go build -ldflags '-s -w -extldflags "-static"' -tags osusergo,netgo,sqlite_omit_load_extension -o /app/main .

ADD https://github.com/benbjohnson/litestream/releases/download/v0.3.9/litestream-v0.3.9-linux-amd64-static.tar.gz litestream.tar.gz
RUN tar -xzf litestream.tar.gz -C ./

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/main /app/main
COPY --from=builder /app/litestream /usr/local/bin/litestream
COPY litestream.yml /etc/litestream.yml
COPY start.sh /app/start.sh
RUN chmod +x /app/start.sh
CMD ["/app/start.sh"]

EXPOSE 8080</code></pre><h2 id="litestreamyml">litestream.yml</h2><p>今回はDB 1台なので、それ用に準備。/etc配下においておくとLitestream実行時に自動的に読み込んでくれる。</p><pre><code class="language-yaml">dbs:
  - path: /app/db
    replicas:
      - url: ${BACKUP_URL}</code></pre><h2 id="cloudbuildyaml">cloudbuild.yaml</h2><p>DockerfileのBuildからArtifact Registryにpushすること、Cloud Runへのデプロイは自動化したいので、cloudbuildの設定yamlを準備する。なんだかんだ、試行錯誤してデプロイを繰り返すのでCloud Run使うときは最初に作っておくと便利。</p><pre><code class="language-yaml">steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/litestream-cloud-run', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/litestream-cloud-run']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['run', 'deploy', 'litestream-cloud-run', '--image', 'gcr.io/$PROJECT_ID/litestream-cloud-run', '--region', 'us-east1']
images:
- gcr.io/$PROJECT_ID/litestream-cloud-run</code></pre><p>下記コマンドで実行できます。Cloud Shellで実行すると非常に楽です。</p><p><code>gcloud beta run deploy --source .</code></p><h2 id="go">Go</h2><p>単純にSQLiteを使い、/addの際はデータをInsertし、/の際は格納してあるデータをjsonで表示するような処理を記載。litestreamを意識する必要がないのが良いですね。</p><pre><code class="language-golang">package main

import (
	"context"
	"database/sql"
	"errors"
	"flag"
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"encoding/json"

	_ "github.com/mattn/go-sqlite3"
)

func init() {
	rand.Seed(time.Now().UnixNano())
}

const letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func randString(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letter[rand.Intn(len(letter))]
	}
	return string(b)
}

func main() {
	fmt.Println("test")
	if err := run(); err != nil {
		log.Fatalf("%v", err)
	}
}

func UsersHandler(w http.ResponseWriter, r *http.Request) {
	us, err := readUsers()
	if err != nil {
		fmt.Println(err)
		return
	}
	j, err := json.Marshal(us)
	if err != nil {
		fmt.Printf("%v", err)
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(j)
}

func AddUserHandler(w http.ResponseWriter, r *http.Request) {
	tx, err := db.Begin()
	if err != nil {
		fmt.Printf("%v", err)
		return
	}
	_, err = db.Exec("INSERT INTO users(name) VALUES(?)", randString(16))
	if err != nil {
		fmt.Printf("%v", err)
		return
	}
	tx.Commit()

	us, err := readUsers()
	j, err := json.Marshal(us)
	if err != nil {
		fmt.Printf("%v", err)
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(j)
}

var db *sql.DB

type user struct {
	Id   int
	Name string
}

func run() error {
	ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM)
	defer stop()

	dataPath := flag.String("dp", "", "the path for data")

	flag.Parse()
	fmt.Println(*dataPath)
	if *dataPath == "" {
		flag.Usage()
		return errors.New("data path option error")
	}
	_, err := os.Stat(*dataPath)

	db, err = sql.Open("sqlite3", *dataPath)
	if err != nil {
		return err
	}
	defer db.Close()
	cSQLstmt := "CREATE TABLE IF NOT EXISTS users(id integer not null primary key, name text);"
	_, err = db.Exec(cSQLstmt)

	if err != nil {
		return err
	}

	http.HandleFunc("/add", AddUserHandler)
	http.HandleFunc("/", UsersHandler)
	go http.ListenAndServe(":8080", nil)
	&lt;-ctx.Done()
	return nil
}

func readUsers() ([]user, error) {
	rows, err := db.Query("SELECT id, name FROM users")
	if err != nil {
		fmt.Printf("%v", err)
		return nil, err
	}
	defer rows.Close()

	us := []user{}
	for rows.Next() {
		u := user{}
		err := rows.Scan(&amp;u.Id, &amp;u.Name)
		if err != nil {
			fmt.Printf("%v", err)
		}
		us = append(us, u)
	}
	return us, nil
}</code></pre><h2 id="startsh">start.sh</h2><p>Cloud Run起動時に、GCSからDBのデータを取得する。そして、定期的にBackupを実行するようにshellを準備</p><pre><code class="language-sh">#!/bin/sh
set -e

if [ ! -f /app/db ]; then
	litestream restore -if-replica-exists -o /app/db "${BACKUP_URL}"
fi

exec litestream replicate -exec "/app/main -dp /app/db"</code></pre><p/><h1 id="%E5%8B%95%E3%81%8D">動き</h1><p>Cloud Runはリクエストがないときにゼロスケールするので、その後サイドアクセスしてもデータ追加したデータが残っています。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/08/Peek-2023-08-15-23-48.gif" class="kg-image" alt="Cloud RunとLitestreamで最強コスパ運用" loading="lazy" width="1367" height="731"/></figure><p>これで超格安でサービスを運用できるので、とりあえずのサービスはこの構成で一旦作ってしまうのも良さげかなと思っています。</p>]]></content:encoded></item><item><title><![CDATA[Goのサーバーでcontext canceledをハンドリングする]]></title><description><![CDATA[はじめに
Goでecho [https://github.com/labstack/echo]を使って以下のようなサーバーを作っていました。

var db *sql.DB

func main() {
	e := echo.New()

	e.POST("/", func(c echo.Context) error {
		ctx := c.Request().Context()

		// 自身の管理するDBに保存する
		db.ExecContext(ctx, "INSERT INTO ...")

		// 別のサーバーで管理するDBに保存する
		req, err := http.NewRequestWithContext(
			ctx,
			http.MethodPost,
			"http://localhost:8081/",
			nil,
		)
		if err != nil {
			return err
		}
		res, err := http.DefaultClient.Do(req)
		...

		return c.NoContent(http]]></description><link>https://tech.anti-pattern.co.jp/go-context-canceled/</link><guid isPermaLink="false">Ghost__Post__647af85e27e564000167e7f6</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Mon, 19 Jun 2023 07:28:41 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h3><p>Goで<a href="https://github.com/labstack/echo">echo</a>を使って以下のようなサーバーを作っていました。</p><pre><code>var db *sql.DB

func main() {
	e := echo.New()

	e.POST("/", func(c echo.Context) error {
		ctx := c.Request().Context()

		// 自身の管理するDBに保存する
		db.ExecContext(ctx, "INSERT INTO ...")

		// 別のサーバーで管理するDBに保存する
		req, err := http.NewRequestWithContext(
			ctx,
			http.MethodPost,
			"http://localhost:8081/",
			nil,
		)
		if err != nil {
			return err
		}
		res, err := http.DefaultClient.Do(req)
		...

		return c.NoContent(http.StatusOK)
	})

	log.Fatal(e.Start(":8080"))
}
</code></pre><p>省略していますが、リクエストされたデータを自身の管理するDBに保存し、関連するデータを別のサーバーで管理するDBに保存するような処理です。</p><p>このとき、 自身の管理するDBへの保存が完了し、別のサーバーで管理するDBへの保存が完了する前にクライアントがリクエストを切断した場合、別のサーバーでの保存が失敗する可能性があります。その場合、2つのDBの間でデータの不整合が起きます。</p><pre><code>		// 別のサーバーで管理するDBに保存する
		req, err := http.NewRequestWithContext(
			ctx,
			http.MethodPost,
			"http://localhost:8081/",
			nil,
		)
		if err != nil {
			return err
		}
        
		// ここで失敗した場合、データの不整合が起きる
		res, err := http.DefaultClient.Do(req)
		...</code></pre><p>そのため、クライアントが切断した際に不整合が起きないような実装を入れました。</p><h3 id="%E5%8E%9F%E5%9B%A0">原因</h3><p>クライアントが通信を切断すると、 <code>ctx := c.Request().Context()</code> のcontextはキャンセルされ、 <code>ctx.Err()</code> は <code>context.Canceled</code> のエラーを返すようになります。</p><p>そのため、 例えばDBを操作するライブラリ内で <code>ctx.Done()</code> を適切にハンドリングしている場合、クライアントからの通信が切断された時点でDB操作をキャンセルし、エラーを返します。</p><p>この挙動は、DBに保存する処理のないGETリクエスト等の場合は有り難いものです。クライアント側が切断した時点でDBからデータを取得する必要がなくなるので、無駄な取得処理をキャンセルできます。また、DBに保存する処理のあるPOSTリクエスト等の場合でも、適切にトランザクションを貼っていれば問題にはなりません。</p><p>しかし、今回のケースではそれができず、途中で切断されると不整合が起きる可能性がありました。そのため、クライアントが通信を切断しても不整合が起きないような実装を入れました。</p><h3 id="%E4%BF%AE%E6%AD%A3%E6%96%B9%E6%B3%95">修正方法</h3><p>以下のようなミドルウェアを追加します。</p><pre><code>
	e := echo.New()
	e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			ctx := c.Request().Context()

			// タイムアウトを指定したContextを生成し、差し替える
			timeoutCtx, cancel := context.WithTimeout(
				context.Background(),
				time.Minute,
			)
			defer cancel()
			c.SetRequest(c.Request().WithContext(timeoutCtx))

			resultCh := make(chan error)
			// ハンドラーの処理を非同期で実行する
			go func() {
				resultCh &lt;- next(c)
			}()
			var err error
			select {
			case err = &lt;-resultCh:
			case &lt;-ctx.Done():
				// clientが通信を切断した場合、context canceledのエラーが発生する
				if err := ctx.Err(); err != nil {
					fmt.Printf("echo context done: %v\n", err)
				}
				err = &lt;-resultCh
			}
			return err
		}
	})</code></pre><p>新しいcontextを作成し、<code>c.Request()</code> が持っているcontextを差し替えることで、クライアントが切断してもcontext canceledが伝播されなくなります。念の為、タイムアウトを設定しています。</p><p>実際のハンドラーの処理 (<code>next</code> 関数) を非同期で実行し、結果をチャネル (<code>resultCh</code>) に格納します。</p><p> <code>select</code> で <code>resultCh</code> の結果を受信するケースと <code>ctx.Done()</code> チャネルからの通知を受信するケースを待機します。通常の処理フローでは、<code>resultCh</code> から受信します。しかし、クライアントが通信を切断した場合は<code>ctx.Done()</code>から受信します。その場合、ログにエラーメッセージを出力し、ハンドラーの処理が完了して<code>resultCh</code> から受信するまで待機します。</p><p>これでcontext canceledが起きても、即座にエラーにはならず、ハンドラーの処理は実行され続けます。</p><p>非同期で<code>next</code>を実行する箇所は <code>recover()</code> しておいた方が安全です。</p><pre><code>go func() {
	defer func() {
		if r := recover(); r != nil {
			resultCh &lt;- fmt.Errorf("%v", r)
		}
	}()
	resultCh &lt;- next(c)
}()</code></pre><h3 id="%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D">動作確認</h3><p>テストとして、ハンドラーを以下のように書き換えて試してみます。</p><pre><code>	e.POST("/", func(c echo.Context) error {
		ctx := c.Request().Context()

		time.Sleep(10 * time.Second)
		if err := ctx.Err(); err != nil {
			fmt.Printf("ctx error: %v\n", err)
			return err
		}
		fmt.Println("created")

		return c.NoContent(http.StatusOK)
	})</code></pre><p>10秒待ってからcontextのエラーを確認し、エラーであればその時点でreturnします。エラーでなければ、ログを出して200を返します。</p><p>この状態でサーバーを起動し、リクエストを投げて10秒以内に切断します。</p><pre><code>$ curl -XPOST http://localhost:8080
^C</code></pre><p>上で示したミドルウェアを追加しなかった場合、以下のようなログが出てエラーになります。contextの終了を検知し、それ以降の処理は実行されません。</p><pre><code>ctx error: context canceled</code></pre><p>ミドルウェアを追加した場合、以下のようなログが出ます。ミドルウェア内でcontextの終了を検知してログが出ていますが、ハンドラーの処理は実行されていることがわかります。</p><pre><code>echo context done: context canceled
created</code></pre><h3 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h3><p>不整合が起きる可能性を減らすことができました。今回はechoを使ったサーバーでしたが、他のライブラリでも同じような方法で対応できると思います。</p>]]></content:encoded></item><item><title><![CDATA[Goの関数内で引数の値を書き換えた時の影響]]></title><description><![CDATA[はじめに
関数の引数の値を書き換えた時、呼び出し元で渡した変数の値にも影響がある場合があります。どのような場合に影響があるのか​​、定期的に忘れるため書き残しておきました。

調査
以下の構造体で試してみます。

type TestStruct struct {
	Value        User
	Pointer      *User
	ValueSlice   ValueUsers
	PointerSlice PointerUsers
}

type User struct {
	ID int
}

type ValueUsers []User

type PointerUsers []*User


関数の引数に渡したとき、各フィールドのポイントインタがどうなるかを確認します。

package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/olekukonko/tablewriter"
)

func main() {
	a := TestStruct{
		Value: User{
			ID: 1,
		},
	]]></description><link>https://tech.anti-pattern.co.jp/go-func-arg/</link><guid isPermaLink="false">Ghost__Post__643bb50327e564000167e5d2</guid><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sat, 03 Jun 2023 08:22:12 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>関数の引数の値を書き換えた時、呼び出し元で渡した変数の値にも影響がある場合があります。どのような場合に影響があるのか​​、定期的に忘れるため書き残しておきました。</p><h2 id="%E8%AA%BF%E6%9F%BB">調査</h2><p>以下の構造体で試してみます。</p><pre><code>type TestStruct struct {
	Value        User
	Pointer      *User
	ValueSlice   ValueUsers
	PointerSlice PointerUsers
}

type User struct {
	ID int
}

type ValueUsers []User

type PointerUsers []*User
</code></pre><p>関数の引数に渡したとき、各フィールドのポイントインタがどうなるかを確認します。</p><pre><code>package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/olekukonko/tablewriter"
)

func main() {
	a := TestStruct{
		Value: User{
			ID: 1,
		},
		Pointer: &amp;User{
			ID: 2,
		},
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}

	table := tablewriter.NewWriter(os.Stdout)
	table.SetAutoFormatHeaders(false)
	table.SetHeader([]string{"", "&amp;a", "&amp;a.Value", "a.Pointer", "&amp;a.Pointer", "a.ValueSlice", "&amp;a.ValueSlice", "a.PointerSlice", "&amp;a.PointerSlice"})

	table.Append(strings.Split(fmt.Sprintf("main %p %p %p %p %p %p %p %p",
		&amp;a, &amp;a.Value, a.Pointer, &amp;a.Pointer, a.ValueSlice, &amp;a.ValueSlice, a.PointerSlice, &amp;a.PointerSlice), " "))

	ValueArg(a, table)
    
	PointerArg(&amp;a, table)
    
	table.Render()
}

func ValueArg(a TestStruct, table *tablewriter.Table) {
	table.Append(strings.Split(fmt.Sprintf("ValueArg %p %p %p %p %p %p %p %p",
		&amp;a, &amp;a.Value, a.Pointer, &amp;a.Pointer, a.ValueSlice, &amp;a.ValueSlice, a.PointerSlice, &amp;a.PointerSlice), " "))
}

func PointerArg(a *TestStruct, table *tablewriter.Table) {
	table.Append(strings.Split(fmt.Sprintf("PointerArg %p %p %p %p %p %p %p %p",
		a, &amp;a.Value, a.Pointer, &amp;a.Pointer, a.ValueSlice, &amp;a.ValueSlice, a.PointerSlice, &amp;a.PointerSlice), " "))
}</code></pre><p>結果は以下です。</p><pre><code>+------------+--------------+--------------+--------------+--------------+--------------+---------------+----------------+-----------------+
|            |      &amp;a      |   &amp;a.Value   |  a.Pointer   |  &amp;a.Pointer  | a.ValueSlice | &amp;a.ValueSlice | a.PointerSlice | &amp;a.PointerSlice |
+------------+--------------+--------------+--------------+--------------+--------------+---------------+----------------+-----------------+
| main       | 0xc0000aa240 | 0xc0000aa240 | 0xc0000ac1e0 | 0xc0000aa248 | 0xc0000ac1d0 | 0xc0000aa250  | 0xc000096220   | 0xc0000aa268    |
| ValueArg   | 0xc0000aa280 | 0xc0000aa280 | 0xc0000ac1e0 | 0xc0000aa288 | 0xc0000ac1d0 | 0xc0000aa290  | 0xc000096220   | 0xc0000aa2a8    |
| PointerArg | 0xc0000aa240 | 0xc0000aa240 | 0xc0000ac1e0 | 0xc0000aa248 | 0xc0000ac1d0 | 0xc0000aa250  | 0xc000096220   | 0xc0000aa268    |
+------------+--------------+--------------+--------------+--------------+--------------+---------------+----------------+-----------------+</code></pre><p>実体として渡した場合（`ValueArg`）、内部的には値をコピーします。そのため、構造体特有（`&amp;a`）や各フィールド（`&amp;Value`, `&amp;Pointer`, `&amp;ValueSlice`, `&amp;PointerSlice`内部的に参照をもつフィールド（`Pointer`, `ValueSlice`, `PointerSlice`）の場合、その参照先は同じアドレスを向きます。</p><p>ポインタとして渡した場合（`PointerArg`）、内部的には渡したポインタの値をコピーします。そのため、すべての項目が `main` での実行結果と同じになります。</p><p>関数の中引数の構造フィーノルを書き換えた時、元の値にどのような影響があるかを確認します。</p><h3 id="%E6%A7%8B%E9%80%A0%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">構造のフィールドの値を書き換える</h3><pre><code>func ValueArgUpdateStructField(a TestStruct) {
	a.Value.ID = a.Value.ID + 10
	a.Pointer.ID = a.Pointer.ID + 10
}

func PointerArgUpdateStructField(a *TestStruct) {
	a.Value.ID = a.Value.ID + 10
	a.Pointer.ID = a.Pointer.ID + 10
}
</code></pre><pre><code>
	a := TestStruct{
		Value: User{
			ID: 1,
		},
		Pointer: &amp;User{
			ID: 2,
		},
	}

	table := tablewriter.NewWriter(os.Stdout)
	table.SetAutoFormatHeaders(false)
	table.SetHeader([]string{"", "a.Value", "a.Pointer"})
	table.Append(strings.Split(fmt.Sprintf("main %#v %#v",
		a.Value, a.Pointer), " "))

	ValueArgUpdateStructField(a)
	table.Append(strings.Split(fmt.Sprintf("ValueArgUpdateStructField %#v %#v",
		a.Value, a.Pointer), " "))

	a = TestStruct{
		Value: User{
			ID: 1,
		},
		Pointer: &amp;User{
			ID: 2,
		},
	}
	PointerArgUpdateStructField(&amp;a)
	table.Append(strings.Split(fmt.Sprintf("PointerArgUpdateStructField %#v %#v",
		a.Value, a.Pointer), " "))
	table.Render()</code></pre><p>結果は以下です。</p><pre><code>+------------------+------------------+-------------------+
|                  |     a.Value      |     a.Pointer     |
+------------------+------------------+-------------------+
| main             | main.User{ID:1}  | &amp;main.User{ID:2}  |
| ValueArgUpdate   | main.User{ID:1}  | &amp;main.User{ID:12} |
| PointerArgUpdate | main.User{ID:11} | &amp;main.User{ID:12} |
+------------------+------------------+-------------------+</code></pre><p>実体を渡す場合、ポインタのフィールドは書き換えられますが実体のフィールドは書き換えられません。ポインタを渡す場合は両方とも書き換えられます。</p><h3 id="%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">スライスのフィールドの値を書き換える</h3><pre><code>func ValueArgUpdateSliceField(a TestStruct) {
	a.ValueSlice[0].ID = a.ValueSlice[0].ID + 10
	a.PointerSlice[0].ID = a.PointerSlice[0].ID + 10
}

func PointerArgUpdateSliceField(a *TestStruct) {
	a.ValueSlice[0].ID = a.ValueSlice[0].ID + 10
	a.PointerSlice[0].ID = a.PointerSlice[0].ID + 10
}
</code></pre><pre><code>	a := TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}

	table := tablewriter.NewWriter(os.Stdout)
	table.SetAutoFormatHeaders(false)
	table.SetHeader([]string{"", "a.ValueSlice[0]", "a.PointerSlice[0]"})
	table.Append(strings.Split(fmt.Sprintf("main %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))

	ValueArgUpdateSliceField(a)
	table.Append(strings.Split(fmt.Sprintf("ValueArgUpdateStructField %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))

	a = TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}
	PointerArgUpdateSliceField(&amp;a)
	table.Append(strings.Split(fmt.Sprintf("PointerArgUpdateStructField %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))
	table.Render()</code></pre><p>結果は以下です。</p><pre><code>+-----------------------------+------------------+-------------------+
|                             | a.ValueSlice[0]  | a.PointerSlice[0] |
+-----------------------------+------------------+-------------------+
| main                        | main.User{ID:3}  | &amp;main.User{ID:4}  |
| ValueArgUpdateStructField   | main.User{ID:13} | &amp;main.User{ID:14} |
| PointerArgUpdateStructField | main.User{ID:13} | &amp;main.User{ID:14} |
+-----------------------------+------------------+-------------------+</code></pre><p>実体でもポインタでも、呼び出し元の値が書き換えられます。実体で渡しても書き換えられるのは、スライス（`a.ValueSlice` や `a.PointerSlice`）が参照している配列の値を書き換えているからです。</p><h3 id="%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">スライスのフィールドに追加する</h3><pre><code>func ValueArgUpdateSliceAppend(a TestStruct) {
	a.ValueSlice = append(a.ValueSlice, User{ID: 5})
	a.PointerSlice = append(a.PointerSlice, &amp;User{ID: 5})
}

func PointerArgUpdateSliceAppend(a *TestStruct) {
	a.ValueSlice = append(a.ValueSlice, User{ID: 5})
	a.PointerSlice = append(a.PointerSlice, &amp;User{ID: 5})
}
</code></pre><pre><code>	a = TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}

	table = tablewriter.NewWriter(os.Stdout)
	table.SetAutoFormatHeaders(false)
	table.SetHeader([]string{"", "len(a.ValueSlice)", "len(a.PointerSlice)"})
	table.Append(strings.Split(fmt.Sprintf("main %#v %#v",
		len(a.ValueSlice), len(a.PointerSlice)), " "))

	ValueArgUpdateSliceAppend(a)
	table.Append(strings.Split(fmt.Sprintf("ValueArgUpdateStructAppend %#v %#v",
		len(a.ValueSlice), len(a.PointerSlice)), " "))

	a = TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}
	PointerArgUpdateSliceAppend(&amp;a)
	table.Append(strings.Split(fmt.Sprintf("PointerArgUpdateStructAppend %#v %#v",
		len(a.ValueSlice), len(a.PointerSlice)), " "))
	table.Render()</code></pre><p>結果は以下です。</p><pre><code>+------------------------------+-------------------+---------------------+
|                              | len(a.ValueSlice) | len(a.PointerSlice) |
+------------------------------+-------------------+---------------------+
| main                         |                 1 |                   1 |
| ValueArgUpdateStructAppend   |                 1 |                   1 |
| PointerArgUpdateStructAppend |                 2 |                   2 |
+------------------------------+-------------------+---------------------+</code></pre><p>実体を渡す場合は呼び出し元に影響はありませんが、ポインタを渡す場合は呼び出し元にも反映されます。</p><p>実体を渡す場合に関して細かい話をすると、スライスは内部的には配列への参照、長さ、容量を持っていて、`a.ValueSlice` が参照している配列の要素は更新されていますが、 `a.ValueSlice` が内部的に持っている長さの値が更新されていないので呼び出し元からは参照できないことが、という状態です。ます。</p><pre><code>	ValueArgUpdateSliceAppend(a)
	table.Append(strings.Split(fmt.Sprintf("ValueArgUpdateStructAppend %#v %#v",
		len(a.ValueSlice), len(a.PointerSlice)), " "))
	fmt.Println(a.ValueSlice[0:2]) // 追加
	// main.ValueUsers{main.User{ID:3}, main.User{ID:5}}
    </code></pre><h3 id="%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%8B%E3%82%89%E5%80%A4%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%A6%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">スライスのフィールドから値を取り出して書き換える</h3><pre><code>func ValueArgUpdateSliceValue(a TestStruct) {
	v := a.ValueSlice[0]
	v.ID = v.ID + 10
	p := a.PointerSlice[0]
	p.ID = p.ID + 10
}

func PointerArgUpdateSliceValue(a *TestStruct) {
	v := a.ValueSlice[0]
	v.ID = v.ID + 10
	p := a.PointerSlice[0]
	p.ID = p.ID + 10
}
</code></pre><pre><code>	a = TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}

	table = tablewriter.NewWriter(os.Stdout)
	table.SetAutoFormatHeaders(false)
	table.SetHeader([]string{"", "a.ValueSlice[0]", "a.PointerSlice[0]"})
	table.Append(strings.Split(fmt.Sprintf("main %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))

	ValueArgUpdateSliceValue(a)
	table.Append(strings.Split(fmt.Sprintf("ValueArgUpdateSliceValue %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))

	a = TestStruct{
		ValueSlice:   append(make(ValueUsers, 0, 2), User{ID: 3}),
		PointerSlice: append(make(PointerUsers, 0, 2), &amp;User{ID: 4}),
	}
	PointerArgUpdateSliceValue(&amp;a)
	table.Append(strings.Split(fmt.Sprintf("PointerArgUpdateSliceValue %#v %#v",
		a.ValueSlice[0], a.PointerSlice[0]), " "))
	table.Render()
</code></pre><p>結果は以下です。</p><pre><code>+----------------------------+-----------------+-------------------+
|                            | a.ValueSlice[0] | a.PointerSlice[0] |
+----------------------------+-----------------+-------------------+
| main                       | main.User{ID:3} | &amp;main.User{ID:4}  |
| ValueArgUpdateSliceValue   | main.User{ID:3} | &amp;main.User{ID:14} |
| PointerArgUpdateSliceValue | main.User{ID:3} | &amp;main.User{ID:14} |
+----------------------------+-----------------+-------------------+</code></pre><p>vやpに代入したタイミングでその値がコピーされるため、要素が実体の場合は元のスライスには影響がなく、ポインタの場合は元のスライスにも反映されます。</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>いろいろ書きましたが、結論としては以下のことを覚えていれば理解できると思います。</p><ul><li>関数の引数に渡すと値がコピーされる</li><li>構造体の実体を渡すと実体がコピーされるので、各フィールドがコピーされる</li><li>構造体のポインタを渡すとポインタの値がコピーされるので、同じポインタを指す</li><li>スライスは「配列への参照、長さ、容量をもつ構造体」と考えれば、構造体のコピーと同じ結果になる</li></ul><p>ちなみにメソッドは「レシーバーを引数に持つ関数」と同じなので同じ考え方ができます。</p>]]></content:encoded></item><item><title><![CDATA[自称日本一GitHub Projectsを使っているのでどう使っているか紹介する]]></title><description><![CDATA[こんにちは。

自称日本一GitHub Projectsを活用している CEO兼VPoEの小笹です。
本稿では、株式会社アンチパターンにおいて、実際にどのようにGitHub Projectsを使っているのかについて共有させていただきます。

■目次

 * 何故GitHub Projectsなのか
 * ISSUEラベル
 * イテレーション
 * Workflows
 * ビュー
 * Task lists(親子ISSUE)
 * マイルストーン
 * ISSUEテンプレート
 * Insights
 * 今後やれるといいなと思っていること

何故GitHub Projectsなのか
 * ソースコードの管理と同じプラットフォームでネイティブに連携していること
 * 複雑な要求に応えようとすると管理も複雑になるが、機能がシンプルなため思考の制限がかかってちょうど良かったから
 * 定期的にアップデートがあって今後も期待できる

上記理由からGitHub Projectsをどこよりも活用してみるぞ！という意気込みで頑張りました。

ISSUEラベル
まずは基本となるラベルの設計です。
]]></description><link>https://tech.anti-pattern.co.jp/i-call-myself-the-best-github-projects-user-in-japan-so-ill-show-you-how-i-use-it/</link><guid isPermaLink="false">Ghost__Post__6421771b27e564000167e50d</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Agile]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Wed, 29 Mar 2023 18:07:45 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/----------2023-03-27-20.18.38.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/----------2023-03-27-20.18.38.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する"/><p>こんにちは。</p>
<p><mark>自称日本一GitHub Projectsを活用している</mark> CEO兼VPoEの小笹です。<br>
本稿では、株式会社アンチパターンにおいて、実際にどのようにGitHub Projectsを使っているのかについて共有させていただきます。</br></p>
<p>■目次</p>
<ul>
<li>何故GitHub Projectsなのか</li>
<li>ISSUEラベル</li>
<li>イテレーション</li>
<li>Workflows</li>
<li>ビュー</li>
<li>Task lists(親子ISSUE)</li>
<li>マイルストーン</li>
<li>ISSUEテンプレート</li>
<li>Insights</li>
<li>今後やれるといいなと思っていること</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E4%BD%95%E6%95%85github-projects%E3%81%AA%E3%81%AE%E3%81%8B">何故GitHub Projectsなのか</h2>
<ul>
<li>ソースコードの管理と同じプラットフォームでネイティブに連携していること</li>
<li>複雑な要求に応えようとすると管理も複雑になるが、機能がシンプルなため思考の制限がかかってちょうど良かったから</li>
<li>定期的にアップデートがあって今後も期待できる</li>
</ul>
<p>上記理由からGitHub Projectsをどこよりも活用してみるぞ！という意気込みで頑張りました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="issue%E3%83%A9%E3%83%99%E3%83%AB">ISSUEラベル</h2>
<p>まずは基本となるラベルの設計です。</p>
<h3 id="%E9%96%8B%E7%99%BA%E5%AF%BE%E8%B1%A1%E3%83%A9%E3%83%99%E3%83%AB">開発対象ラベル</h3>
<p>フロントはモノレポになっていたりするので、 <em>どの画面</em> かをラベルにしています。<br>
APIは外部公開用と <em>外部向け</em> を使って作られた <em>内部向け</em> のAPIがあります。<br>
加えて、<em>OpenAPI定義</em> をするタスクもラベルで判断できるように設定しておきます。</br></br></p>
<h3 id="%E3%82%B5%E3%82%A4%E3%82%BA%E3%83%A9%E3%83%99%E3%83%AB">サイズラベル</h3>
<p>ISSUEは作る際にある程度のざっくり感でサイズを付与します。<br>
これは <em>S/M/L</em> とあり、それぞれ1/4/8ポイントとして集計する際に利用します。<br>
またサイズをつけるにあたり、S/Mサイズになるように意識してもらうようにしています。<br>
※ポイントの集計よりこの分割への暗黙的な圧力のほうが効果的な気もしています。</br></br></br></p>
<h3 id="%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3%E3%83%A9%E3%83%99%E3%83%AB">アサインラベル</h3>
<p>非同期で働きやすくするために対応するメンバーが決まっているものは担当をアサインしますが、そうでないISSUEには <em>anyoneラベル</em> を付与していつ誰がとっても良いようにしています。</p>
<h3 id="%E8%B3%87%E7%94%A3%E8%A8%88%E4%B8%8A%E5%88%A4%E6%96%AD%E3%83%A9%E3%83%99%E3%83%AB">資産計上判断ラベル</h3>
<p>SaaSはソフトウェアを通じて収益を得ているという構造があるため、無形資産として計上する必要があります。<br>
そのISSUEが <em>保守対応</em> なのか <em>新規機能開発</em> なのか判断しラベルを付与するようにしています。<br>
<a href="http://kato-cpafirm.com/audit/files/No12-RD20141128.pdf">http://kato-cpafirm.com/audit/files/No12-RD20141128.pdf</a></br></br></p>
<h3 id="issue%E7%A8%AE%E5%88%A5%E3%83%A9%E3%83%99%E3%83%AB">ISSUE種別ラベル</h3>
<p><em>親ISSUE</em> で <em>子ISSUE</em> があるものか <em>独立したものか</em> 、 <em>バグ</em> かを判別するためのラベルです。<br>
これは主にあらゆるビューでフィルタする際に活用するものです。</br></p>
<p>このようなイメージです。<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-01.jpg" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></br></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">イテレーション</h2>
<p>1週間で区切っています。</p>
<p>当社の場合、副業のメンバーも多く、時間的に固定のコミットができないケースが多いため、Scrumではなく、カンバンに近い運用をしてアジャイル開発を実現しています。</p>
<p>1週間ごとにCloseしたISSUEに対してイテレーションを付与しています。つまり完全に実績ベースで活用している形になっています。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="workflows">Workflows</h2>
<p>Auto-archive itemsをアクティブにしています。<br>
60日以上前にCloseされたISSUEはアーカイブされていきます。</br></p>
<p>アーカイブされるとビューやInsightsからも見えなくなるのですが、<br>
それくらい前のものであれば特に影響ないなと思っています。</br></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E3%83%93%E3%83%A5%E3%83%BC">ビュー</h2>
<h3 id="%E3%82%AB%E3%83%B3%E3%83%90%E3%83%B3%E3%83%93%E3%83%A5%E3%83%BC">カンバンビュー</h3>
<p>作業の流れを見る際に使います。</p>
<h3 id="%E3%83%AA%E3%82%B9%E3%83%88%E3%83%93%E3%83%A5%E3%83%BC">リストビュー</h3>
<p>任意の項目に値を入れたり、親ISSUEに紐づいた子ISSUEの状況を可視化しています。<br>
このリストビューにおいてPoint列を追加しています。<br>
これはISSUEの総量を定量的に可視化するために使っています。<br>
サイズラベルをもとにそれぞれ1/4/8ポイントとして集計する際に利用します。</br></br></br></p>
<h3 id="%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9E%E3%83%83%E3%83%97">ロードマップ</h3>
<p>本来的にはリリースターゲットなどの日付を入力し、将来に目を向けその進捗を追うのに活用するかと思うのですが、<br>
当社では実績の管理に応用しています。<br>
「ISSUEがCloseしたイテレーションの日付」から「リリースされた日付」をマイルストーンで可視化することで、<br>
Closeされてからリリースされるまでの期間を可視化することができます。<br>
この辺はDORAメトリクスなどを取っていけば、見る必要もなくなるかもなと思っていますが、今はまだ計測し始めていないので簡易的に見ている状況です。</br></br></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-02.jpg" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="task-lists%E8%A6%AA%E5%AD%90issue">Task lists(親子ISSUE)</h2>
<p><a href="https://docs.github.com/ja/get-started/writing-on-github/working-with-advanced-formatting/about-task-lists">https://docs.github.com/ja/get-started/writing-on-github/working-with-advanced-formatting/about-task-lists</a></p>
<p>これを活用することで親子ISSUEをトラッキングすることができます。<br>
親は子ISSUEが紐づいて閲覧でき、子は親がどのISSUEか閲覧できます。<br>
これはビューでも可視化できるのでとっても強力な機能になっています。</br></br></p>
<p>ISSUEの詳細はこちらです。<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-06.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></br></p>
<p>カンバンビューだとこういった形で見ることができます。<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-01.jpg" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></br></p>
<p>リストビューだとこういった形で見ることができます。<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-07.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></br></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E3%83%9E%E3%82%A4%E3%83%AB%E3%82%B9%E3%83%88%E3%83%BC%E3%83%B3">マイルストーン</h2>
<p>リリースの目標を管理しています。<br>
目標バージョンごとに付与していきます。<br>
これをリストビューで可視化することで、マイルストーンごとにどれくらいのポイントがかかるか分かります。<br>
イテレーションごとのポイントの総計が分かっていますので、凡そのリリース時期を把握できます。</br></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-05.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="issue%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88">ISSUEテンプレート</h2>
<p>今までご紹介したようなラベルなどをフルに活用するためには、<br>
ISSUEに十分な情報を記載されメンバーレベルでラベルの判断がつけられることが望ましいです。<br>
なので、ISSUEのテンプレートを作成しました。ざっくり下記のようなイメージです。</br></br></p>
<ul>
<li>機能開発
<ul>
<li>親ISSUE(parent / independent)
<ul>
<li>ユーザーストーリー
<ul>
<li>誰として</li>
<li>何をしたい</li>
<li>理由</li>
</ul>
</li>
<li>期待される事業効果
<ul>
<li>保守</li>
<li>新規開発
<ul>
<li>期待される収益</li>
</ul>
</li>
</ul>
</li>
<li>受け入れ条件</li>
<li>実装する上で考慮しておいて欲しいこと</li>
<li>ラベルを付与したか</li>
<li>子ISSUE</li>
<li>関連ISSUE</li>
<li>関連リンク(Figma / Miro / Slackスレッド / Google Drive)</li>
</ul>
</li>
<li>子ISSUE
<ul>
<li>何をするのか</li>
<li>何故か</li>
<li>受け入れ条件</li>
<li>実装する上で考慮しておいて欲しいこと</li>
<li>ラベルを付与したか</li>
<li>SizeについてなるべくS or Mに細分化するように注意文を追記</li>
<li>親ISSUE</li>
<li>関連ISSUE</li>
<li>関連リンク(Figma / Miro / Slackスレッド / Google Drive)</li>
</ul>
</li>
</ul>
</li>
<li>バグ
<ul>
<li>何が起きたか</li>
<li>どこで起きたか
<ul>
<li>アカウント</li>
<li>ユーザー</li>
<li>テナント</li>
</ul>
</li>
<li>どの画面 or API/SDK</li>
<li>どうやって起きたか</li>
<li>エラーログやキャプチャなど証跡
<ul>
<li>ない場合には正確な発生時間</li>
</ul>
</li>
<li>何が問題でどうなることを期待していたか</li>
<li>環境情報</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="insights">Insights</h2>
<h3 id="burn-up-cfd">Burn up / CFD</h3>
<p>作成されているISSUEとCloseしているISSUEの傾斜を大体把握できます。　　<br>
作成されているISSUEの方が進みすぎると、ISSUEの作りすぎ、待ちの無駄になります。　　<br>
Closeしていくほうが進んでしまうとプロダクトマネジメントでボトルネックになり、開発者の時間的待ちの無駄が発生します。</br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-03.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy"/></p>
<h3 id="%E3%83%99%E3%83%AD%E3%82%B7%E3%83%86%E3%82%A3%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96">ベロシティの可視化</h3>
<p>イテレーションごとのポイント総計を集計し可視化しています。　　<br>
ベロシティは未来の予想に使うもので評価などに使うものではないですし、細かいレベルで追っていく必要はないと考えています。　　<br>
上がったり下がったりの理由は振り返って何が原因かはディスカッションします。　　<br>
例えば、レビュー待ちの滞留が多い、Lサイズが大きすぎた問題、リリース前でみんなでテストしていたなどがあったりします。</br></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/03/github-projects2023-04.png" alt="自称日本一GitHub Projectsを使っているのでどう使っているか紹介する" loading="lazy">!</img></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E4%BB%8A%E5%BE%8C%E3%82%84%E3%82%8C%E3%82%8B%E3%81%A8%E3%81%84%E3%81%84%E3%81%AA%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">今後やれるといいなと思っていること</h2>
<p>DORAメトリクスを計測したり、レビューが滞留していたらレビュアーにメンションするなどができるといいかなと思ってます。<br>
何にせよ開発者体験を向上できるようにしていきたいと思っています。</br></p>
<p>調べているのはこういったSaaSです。<br>
<a href="https://www.usehaystack.io/">https://www.usehaystack.io/</a><br>
<a href="https://linearb.io/">https://linearb.io/</a></br></br></p>
<h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2>
<p>GitHub Projects最高！！<br>
ミナサンもGitHub Projects最高と叫びなさい！！</br></p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GASの日付処理 SummerTimeで涙]]></title><description><![CDATA[Googleフォームで申し込みフォームを作っているのですが、直前に申し込みがあると対応慌ててしまうので、2日後以降に申し込みが出来るようにしています。

GASを日次で起動して、プルダウンの日付を更新する処理を実行してます、処理は以下の感じです。

function myFunction() {
  const form = FormApp.getActiveForm();
  var items = form.getItems(FormApp.ItemType.LIST);

  items.forEach(function (item) {
    if (item.getTitle() == '日付のプルダウン') {
      var listItemQuestion = item.asListItem();
      var choices = [];
      let date = new Date();
      date.setDate(date.getDate() + 2);
      for (i = 0; i < 30; i++) {
        c]]></description><link>https://tech.anti-pattern.co.jp/gas-de-summertime/</link><guid isPermaLink="false">Ghost__Post__63e673d727e564000167e3bd</guid><category><![CDATA[GAS]]></category><category><![CDATA[date]]></category><category><![CDATA[summertime]]></category><category><![CDATA[newyork]]></category><category><![CDATA[tokyo]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Fri, 10 Feb 2023 17:22:49 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image-3-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image-3-1.png" alt="GASの日付処理 SummerTimeで涙"/><p>Googleフォームで申し込みフォームを作っているのですが、直前に申し込みがあると対応慌ててしまうので、2日後以降に申し込みが出来るようにしています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image-3.png" class="kg-image" alt="GASの日付処理 SummerTimeで涙" loading="lazy" width="833" height="602" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/02/image-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image-3.png 833w" sizes="(min-width: 720px) 720px"/></figure><p>GASを日次で起動して、プルダウンの日付を更新する処理を実行してます、処理は以下の感じです。</p><pre><code>function myFunction() {
  const form = FormApp.getActiveForm();
  var items = form.getItems(FormApp.ItemType.LIST);

  items.forEach(function (item) {
    if (item.getTitle() == '日付のプルダウン') {
      var listItemQuestion = item.asListItem();
      var choices = [];
      let date = new Date();
      date.setDate(date.getDate() + 2);
      for (i = 0; i &lt; 30; i++) {
        choices.push(listItemQuestion.createChoice(Utilities.formatDate(date, 'JST', 'yyyy/MM/dd')));
        date.setDate(date.getDate() + 1);
      }
      // プルダウンの選択肢を上書きする
      listItemQuestion.setChoices(choices);
    }
  });
}
</code></pre><p>2日後以降の日付で、プルダウンの内容を更新するような処理をしています。</p><p>しばらく問題なく動いていたのですが、ある日エラーになり実行ログを見てみるとこんなエラーになっていました</p><pre><code>Exception: Questions cannot have duplicate choice values.</code></pre><p>なんだかコード見てもエラー箇所わからないので、date変数をconsole.log()で見てみました。以下が結果です</p><pre><code>1:59:24	情報	Sun Feb 12 2023 11:59:24 GMT-0500 (Eastern Standard Time)
1:59:24	情報	Mon Feb 13 2023 11:59:24 GMT-0500 (Eastern Standard Time)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1:59:24	情報	Fri Mar 10 2023 11:59:24 GMT-0500 (Eastern Standard Time)
1:59:24	情報	Sat Mar 11 2023 11:59:24 GMT-0500 (Eastern Standard Time)
1:59:24	情報	Sun Mar 12 2023 11:59:24 GMT-0400 (Eastern Daylight Time)
1:59:24	情報	Mon Mar 13 2023 11:59:24 GMT-0400 (Eastern Daylight Time)</code></pre><p>なんだか、<br>GMT-0500 (Eastern Standard Time) → GMT-0400 (Eastern Daylight Time)<br>に変わってますね。。。</br></br></p><p>Utilities.formatDate(date, 'JST', 'yyyy/MM/dd')で日本時間に変換しているので、これの結果も確認してみます。（時分まで出すようにしてみました）</p><pre><code>2:03:29	情報	2023/02/13 02:03
2:03:29	情報	2023/02/14 02:03

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2:03:29	情報	2023/03/11 02:03
2:03:29	情報	2023/03/12 02:03
2:03:29	情報	2023/03/13 01:03
2:03:29	情報	2023/03/14 01:03</code></pre><p>1時間ずれてますね、このテストは2時に実行していますが、<br>実際の処理は日付が変わった0時台に実行していたので、1日前の日付となってduplicateとなっていたようです。<br>調べてみると3月からSummerTimeが始まるということで、日本だとSummerTimeないので（ですよね？）、全然意識してませんでした。</br></br></p><p>そもそもタイムゾーンを日本にしていないのが良くないということで、タイムゾーンを修正しました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image.png" class="kg-image" alt="GASの日付処理 SummerTimeで涙" loading="lazy" width="853" height="490" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/02/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/02/image.png 853w" sizes="(min-width: 720px) 720px"/></figure><p>設定画面にタイムゾーンがあるので、<br>(GMT-05:00) アメリカ東部時間 – ニューヨーク<br>から<br>(GMT+09:00) 日本標準時 – 東京<br>に変更します。これでOKです<br>念の為実行結果見てみますね</br></br></br></br></br></p><pre><code>2:16:31	情報	2023/02/13 02:16
2:16:31	情報	2023/02/14 02:16

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2:16:31	情報	2023/03/11 02:16
2:16:31	情報	2023/03/12 02:16
2:16:31	情報	2023/03/13 02:16
2:16:31	情報	2023/03/14 02:16</code></pre><p>良さそうです<br>ということで今回学んだのは、ニューヨークは3月から夏。ということです<br>こちらからは以上です</br></br></p>]]></content:encoded></item><item><title><![CDATA[tRPCをDenoで試す]]></title><description><![CDATA[巷で噂になっているtRPCを触ってみたいと思い、せっかくなんでDenoで動かしてみました。

普段はOpenaAPIを使用している。そこからClient,Sever両方にコードを生成し、ClientからはSever側で実行される同じ名前の関数を実行してリクエストを飛ばしているため、RPCっぽい挙動になっている。

※ ClientはReactで動かそうと思いましたが、それはまた次回。

RPCとは
> >Remote Procedure Call is a software communication protocol that one program can
use to request a service from a program located in another computer on a network
without having to understand the network's details. RPC is used to call other
processes on the remote systems like a local system. A pr]]></description><link>https://tech.anti-pattern.co.jp/trpcwodeno/</link><guid isPermaLink="false">Ghost__Post__63cd396e27e564000167e325</guid><category><![CDATA[tRPC]]></category><category><![CDATA[deno]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 25 Jan 2023 05:41:11 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/68747470733a2f2f6173736574732e747270632e696f2f7777772f747270632d726561646d652d6461726b2e706e67.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/68747470733a2f2f6173736574732e747270632e696f2f7777772f747270632d726561646d652d6461726b2e706e67.png" alt="tRPCをDenoで試す"/><p>巷で噂になっているtRPCを触ってみたいと思い、せっかくなんでDenoで動かしてみました。</p><p>普段はOpenaAPIを使用している。そこからClient,Sever両方にコードを生成し、ClientからはSever側で実行される同じ名前の関数を実行してリクエストを飛ばしているため、RPCっぽい挙動になっている。</p><p>※ ClientはReactで動かそうと思いましたが、それはまた次回。</p><h2 id="rpc%E3%81%A8%E3%81%AF">RPCとは</h2><blockquote>&gt;Remote Procedure Call is a software communication protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network's details. RPC is used to call other processes on the remote systems like a local system. A procedure call is also sometimes known as a <em>function call</em> or a <em>subroutine call</em>.</blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.techtarget.com/searchapparchitecture/definition/Remote-Procedure-Call-RPC"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What Is Remote Procedure Call (RPC)? Definition from SearchAppArchitecture</div><div class="kg-bookmark-description">Read the definition for Remote Procedure Call (RPC), a client-server communication protocol where clients call remote systems as if they were local.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.techtarget.com/apple-touch-icon-144x144.png" alt="tRPCをDenoで試す"><span class="kg-bookmark-author">TechTarget</span><span class="kg-bookmark-publisher">Linda Rosencrance</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.ttgtmedia.com/ITKE/images/logos/TTlogo-379x201.png" alt="tRPCをDenoで試す"/></div></a></figure><p>ということでnetworkの詳細を知らなくてもプログラムを呼べるようにできる。</p><p>要はnetworkを抽象化し、通常のプログラムの関数呼び出しのように使えるようになる。</p><h2 id="trpc">tRPC</h2><p>それのTypeScrpit版がtRPCというわけである。</p><p>gRPCでは.protoを定義し、そこからコードを生成するが、tRPCはServer側を書けばそれをそのまま生成無しでClient側でも使えるところがメリットだったりする。</p><p>詳細は下記。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://trpc.io/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">tRPC - Move Fast and Break Nothing.End-to-end typesafe APIs made easy. | tRPC</div><div class="kg-bookmark-description">End-to-end typesafe APIs made easy. Automatic typesafety &amp; autocompletion inferred from your API-paths, their input data, &amp; outputs 🧙‍♂️</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://trpc.io/img/favicon.ico" alt="tRPCをDenoで試す"><span class="kg-bookmark-author">tRPC</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://og-image.trpc.io/api/landing?cache-buster&#x3D;21" alt="tRPCをDenoで試す"/></div></a></figure><h2 id="deno%E3%81%A8%E3%81%AF">Denoとは</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://deno.land/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Deno — A modern runtime for JavaScript and TypeScript</div><div class="kg-bookmark-description">Deno is a simple, modern runtime for JavaScript and TypeScript that uses V8 and is built in Rust.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://deno.land/favicon.ico" alt="tRPCをDenoで試す"><span class="kg-bookmark-author">Deno</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://deno.land/og-image.png" alt="tRPCをDenoで試す"/></div></a></figure><p/><h1 id="%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">プログラム</h1><p>全体のコードはこちら</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/trpc-deno/blob/main/server.ts"><div class="kg-bookmark-content"><div class="kg-bookmark-title">trpc-deno/server.ts at main · kooooohe/trpc-deno</div><div class="kg-bookmark-description">Contribute to kooooohe/trpc-deno development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="tRPCをDenoで試す"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/793f37aac30195f88419534170884f89e5523b216d0cf5b4280d2751a22bda0a/kooooohe/trpc-deno" alt="tRPCをDenoで試す"/></div></a></figure><h2 id="server">Server</h2><pre><code class="language-javascript">import * as trpc from "https://esm.sh/@trpc/server@10.9.0";
import { z } from "https://deno.land/x/zod@v3.20.2/mod.ts";

const t = trpc.initTRPC.create();

const router = t.router;
const publicProcedure = t.procedure;

interface Something {
  id: number;
  name: string;
}

const appRouter = router({
  helloWorld: publicProcedure.query((req) =&gt; {
    return "Hello World";
  }),
  createSomething: publicProcedure.input(z.object({ name: z.string() }))
    .mutation((req) =&gt; {
      const s = Math.random();
      const sm: Something = { id: s, name: req.input.name };
      return sm;
    }),
});

export type AppRouter = typeof appRouter;

import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { fetchRequestHandler } from "npm:@trpc/server/adapters/fetch";

function handler(request: any) {
  return fetchRequestHandler({
    endpoint: "/trpc",
    req: request,
    // @ts-ignore
    router: appRouter,
    createContext: () =&gt; ({}),
  });
}

serve(handler, { port: 5005 });</code></pre><h2 id="client">Client</h2><pre><code class="language-javascript">import { AppRouter } from "./server.ts";
import {
  createTRPCProxyClient,
  httpLink,
} from "https://esm.sh/@trpc/client@10.9.0";

const client = createTRPCProxyClient&lt;AppRouter&gt;({
  links: [
    httpLink({
      url: "http://localhost:5005/trpc",
    }),
  ],
});

try {
  {
    const query = await client.helloWorld.query();
    console.log(JSON.stringify(query));
  }
  {
    const query = await client.createSomething.mutate({ name: "kohe" });
    console.log(JSON.stringify(query));
  }
} catch (e) {
  console.error(e);
}</code></pre><p>serverを起動</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Selection_999-014-.png" class="kg-image" alt="tRPCをDenoで試す" loading="lazy" width="1121" height="55" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/01/Selection_999-014-.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2023/01/Selection_999-014-.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Selection_999-014-.png 1121w"/></figure><p>実際にClient側から呼んでみる。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Selection_999-015-.png" class="kg-image" alt="tRPCをDenoで試す" loading="lazy" width="599" height="112"/></figure><p>それぞれのendpointを定義せずとも通信が関数のみで完結するのは楽で良いなと思いました。パスをどうするかも割と悩んだりするので。</p><p/><p>ちゃんとClient側から関数補完が出て素敵ですね。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Screenshot-from-2023-01-22-23-59-15.png" class="kg-image" alt="tRPCをDenoで試す" loading="lazy" width="772" height="162" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2023/01/Screenshot-from-2023-01-22-23-59-15.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Screenshot-from-2023-01-22-23-59-15.png 772w" sizes="(min-width: 720px) 720px"/></figure><p/><p>	</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2023/01/Peek-2023-01-23-00-02.gif" class="kg-image" alt="tRPCをDenoで試す" loading="lazy" width="1367" height="731"/></figure><h2 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h2><p>T3 Stackというものもあり、流行りを感じますね。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/t3-oss/create-t3-app"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - t3-oss/create-t3-app: The best way to start a full-stack, typesafe Next.js app</div><div class="kg-bookmark-description">The best way to start a full-stack, typesafe Next.js app - GitHub - t3-oss/create-t3-app: The best way to start a full-stack, typesafe Next.js app</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="tRPCをDenoで試す"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">t3-oss</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/495836457/ddcdf559-6c50-4cf8-be67-7898ac865d70" alt="tRPCをDenoで試す"/></div></a></figure><p/>]]></content:encoded></item><item><title><![CDATA[Goで外部通信の中身を確認する]]></title><description><![CDATA[使用しているライブラリの外部通信の中身（リクエストのヘッダやレスポンスのステータス等）をデバッグのために出力したくなったのでまとめました。

方法
以下のように外部のサーバーにリクエストするようなコードがあったとします。

package main

import (
	"context"
	"fmt"
	"net/http"
)

func main() {
	if err := run(); err != nil {
		panic(err)
	}
}

var c = &http.Client{}

func run() error {
	ctx := context.Background()
	req, err := http.NewRequestWithContext(
		ctx,
		http.MethodGet,
		"http://localhost:8080",
		nil,
	)
	if err != nil {
		return err
	}
	res, err := c.Do(req)
	if err != nil {
		return err
	}
	fmt]]></description><link>https://tech.anti-pattern.co.jp/go-http/</link><guid isPermaLink="false">Ghost__Post__63b2363aa35ab30001cac870</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Thu, 19 Jan 2023 23:01:30 GMT</pubDate><content:encoded><![CDATA[<p>使用しているライブラリの外部通信の中身（リクエストのヘッダやレスポンスのステータス等）をデバッグのために出力したくなったのでまとめました。</p><h3 id="%E6%96%B9%E6%B3%95">方法</h3><p>以下のように外部のサーバーにリクエストするようなコードがあったとします。</p><pre><code>package main

import (
	"context"
	"fmt"
	"net/http"
)

func main() {
	if err := run(); err != nil {
		panic(err)
	}
}

var c = &amp;http.Client{}

func run() error {
	ctx := context.Background()
	req, err := http.NewRequestWithContext(
		ctx,
		http.MethodGet,
		"http://localhost:8080",
		nil,
	)
	if err != nil {
		return err
	}
	res, err := c.Do(req)
	if err != nil {
		return err
	}
	fmt.Println(res.Status)
	return nil
}</code></pre><p>この時、外部との通信の中身を確認したい場合、以下のようなコードを追加すると出力できます。</p><pre><code>func init() {
	http.DefaultTransport = &amp;myRoundTripper{
		RoundTripper: http.DefaultTransport,
	}
}

type myRoundTripper struct {
	http.RoundTripper
}

func (r *myRoundTripper) RoundTrip(req *http.Request) (
	*http.Response, error) {
	fmt.Println("req.Header:", req.Header)

	res, err := r.RoundTripper.RoundTrip(req)

	fmt.Println("res.Status:", res.Status)
	return res, err
}
</code></pre><pre><code>$ go run main.go
req.Header: map[]
res.Status: 200 OK</code></pre><p>コードのどこでも良いので、 <code>init()</code> で <code>http.DefaultTransport</code> を上書きすればOKです。</p><h3 id="%E8%A7%A3%E8%AA%AC">解説</h3><p><code>http.Client</code> はリクエストを送信する時、内部で <code>Client.Transport</code> を使用しますが、設定されていなければ <code>http.DefaultTransport</code> を使うよになっています。</p><p><a href="https://cs.opensource.google/go/go/+/master:src/net/http/client.go;l=170">https://cs.opensource.google/go/go/+/master:src/net/http/client.go;l=170</a></p><pre><code>func (c *Client) send(req *Request, deadline time.Time) (
	resp *Response, didTimeout func() bool, err error) {
	...
	resp, didTimeout, err = send(req, c.transport(), deadline)
	...
}

...

func (c *Client) transport() RoundTripper {
	if c.Transport != nil {
		return c.Transport
	}
	return DefaultTransport
}</code></pre><p>この <code>RoundTripper</code> は以下の定義のinterfaceです。</p><p><a href="https://cs.opensource.google/go/go/+/master:src/net/http/client.go;l=117">https://cs.opensource.google/go/go/+/master:src/net/http/client.go;l=117</a></p><pre><code>type RoundTripper interface {
	RoundTrip(*Request) (*Response, error)
}</code></pre><p>そのため、このinterfaceを満たす構造体を定義し、<code>http.DefaultTransport</code> を上書きすると、通信の前後に任意の処理を挟むことができます。</p><pre><code>func init() {
	http.DefaultTransport = &amp;myRoundTripper{
		RoundTripper: http.DefaultTransport,
	}
}

type myRoundTripper struct {
	http.RoundTripper
}

func (r *myRoundTripper) RoundTrip(req *http.Request) (
	*http.Response, error) {

	// reqを出力

	// 実際の通信は元々の http.DefaultTransport に任せる
	res, err := r.RoundTripper.RoundTrip(req)

	// resを出力

	return res, err
}
</code></pre><p>この処理は <code>http.DefaultTransport</code> を使う全ての通信に適用されます。例えば、 <code><a href="https://github.com/aws/aws-sdk-go">github.com/aws/aws-sdk-go</a></code> は<a href="https://github.com/aws/aws-sdk-go/blob/e2d6cb448883e4f4fcc5246650f89bde349041ec/aws/defaults/defaults.go#L59">デフォルトで </a><code><a href="https://github.com/aws/aws-sdk-go/blob/e2d6cb448883e4f4fcc5246650f89bde349041ec/aws/defaults/defaults.go#L59">http.DefaultClient</a></code><a href="https://github.com/aws/aws-sdk-go/blob/e2d6cb448883e4f4fcc5246650f89bde349041ec/aws/defaults/defaults.go#L59"> を使う</a>ので、以下のコードで通信を出力できます。</p><pre><code>package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"
)

func init() {
	http.DefaultTransport = &amp;myRoundTripper{
		RoundTripper: http.DefaultTransport,
	}
}

type myRoundTripper struct {
	http.RoundTripper
}

func (r *myRoundTripper) RoundTrip(req *http.Request) (
	*http.Response, error) {
	fmt.Println("req.URL:", req.URL.String())
	if req.Body != nil {
		reqBody, _ := io.ReadAll(req.Body)
		req.Body.Close()
		req.Body = io.NopCloser(bytes.NewBuffer(reqBody))
		fmt.Println("req.Body:", string(reqBody))
	}

	res, err := r.RoundTripper.RoundTrip(req)

	fmt.Println("res.Status:", res.Status)
	if res.Body != nil {
		resBody, _ := io.ReadAll(res.Body)
		res.Body.Close()
		res.Body = io.NopCloser(bytes.NewBuffer(resBody))
		fmt.Println("res.Body:", string(resBody))
	}
	return res, err
}

func main() {
	if err := run(); err != nil {
		panic(err)
	}
}

func run() error {
	sess := session.Must(session.NewSession(&amp;aws.Config{
		Region: aws.String("ap-northeast-1"),
	}))
	client := dynamodb.New(sess)
	res, err := client.ListTables(&amp;dynamodb.ListTablesInput{})
	if err != nil {
		return err
	}
	fmt.Println(res)

	return nil
}
</code></pre><pre><code>$ go run main.go
req.URL: https://dynamodb.ap-northeast-1.amazonaws.com/
req.Body: {}
res.Status: 200 OK
res.Body: {"TableNames":...}</code></pre><p>ちなみに <code><a href="https://github.com/aws/aws-sdk-go-v2">github.com/aws/aws-sdk-go-v2</a></code> は <a href="https://github.com/aws/aws-sdk-go-v2/blob/06ce35b2b871e70352861a04a903e1045c923f66/aws/transport/http/client.go#L177"><code>*http.Transport</code> を自前で生成している</a>ので、同じようにしてもログは出ません。</p><pre><code>func run() error {
	ctx := context.Background()
	cfg, err := config.LoadDefaultConfig(
		ctx,
		config.WithRegion("ap-northeast-1"),
	)
	if err != nil {
		return err
	}
	client := v2dynamodb.NewFromConfig(cfg)
	res, err := client.ListTables(ctx, &amp;v2dynamodb.ListTablesInput{})
	if err != nil {
		return err
	}
	fmt.Println(res)

	return nil
}</code></pre><p>使用する <code>http.Client</code> を指定するとログが出るようになります。</p><pre><code>func run() error {
	ctx := context.Background()
	cfg, err := config.LoadDefaultConfig(
		ctx,
		config.WithRegion("ap-northeast-1"),
		// http.DefaultClient を設定
		config.WithHTTPClient(http.DefaultClient),
	)
	...</code></pre><pre><code>$ go run main.go
req.URL: https://dynamodb.ap-northeast-1.amazonaws.com/
req.Body: {}
res.Status: 200 OK
res.Body: {"TableNames":...}</code></pre><p>大抵のライブラリはこのようにクライアントを設定する方法があると思うので、同じように出力できます。</p>]]></content:encoded></item><item><title><![CDATA[Goで構造体をcomparableとして使う場合の注意点]]></title><description><![CDATA[Go1.18から導入された型パラメータ comparable は、 == や != で比較可能な型のみを受け入れます。

mapのキーにジェネリックな型を指定するような関数でよく使うと思います。

func ToMap[T comparable](ss []T) map[T]struct{} {
	m := make(map[T]struct{}, len(ss))
	for _, s := range ss {
		m[s] = struct{}{}
	}
	return m
}

int や string などの組み込み型はもちろん、構造体も comparable を満たします。

type User struct {
	ID   int
	Name string
}


func main() {
	us := []User{
		{
			ID:   1,
			Name: "1",
		},
		{
			ID:   2,
			Name: "2",
		},
	}
	m := ToMap(us)
	_, ok := m[User{ID: 1, Name: "1"}]
	fm]]></description><link>https://tech.anti-pattern.co.jp/go-comparable/</link><guid isPermaLink="false">Ghost__Post__6345677ea35ab30001cac68d</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Mon, 02 Jan 2023 01:39:00 GMT</pubDate><content:encoded><![CDATA[<p>Go1.18から導入された型パラメータ <code>comparable</code> は、 <code>==</code> や <code>!=</code> で比較可能な型のみを受け入れます。</p><p>mapのキーにジェネリックな型を指定するような関数でよく使うと思います。</p><pre><code>func ToMap[T comparable](ss []T) map[T]struct{} {
	m := make(map[T]struct{}, len(ss))
	for _, s := range ss {
		m[s] = struct{}{}
	}
	return m
}</code></pre><p><code>int</code> や <code>string</code> などの組み込み型はもちろん、構造体も <code>comparable</code> を満たします。</p><pre><code>type User struct {
	ID   int
	Name string
}


func main() {
	us := []User{
		{
			ID:   1,
			Name: "1",
		},
		{
			ID:   2,
			Name: "2",
		},
	}
	m := ToMap(us)
	_, ok := m[User{ID: 1, Name: "1"}]
	fmt.Println(ok) // true
}
</code></pre><p>ただし、構造体を使う場合、実体とポインタの判定の違いを理解しておかないとバグを生む可能性があります。</p><pre><code>func main() {
	{
		us := []User{
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
		}
		m := ToMap(us)
        
		_, ok := m[User{ID: 1, Name: "1"}]
		fmt.Println(ok) // true
        
		fmt.Println(us[0] == User{ID: 1, Name: "1"}) // true
	}
	{
		us := []*User{
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
		}
		m := ToMap(us)
        
		_, ok := m[&amp;User{ID: 1, Name: "1"}]
		fmt.Println(ok) // false
        
		fmt.Println(us[0] == &amp;User{ID: 1, Name: "1"}) // false
        
		_, ok = m[us[0]]
		fmt.Println(ok) // true
	}
}
</code></pre><p>構造体の実体はフィールドが全て一致しているかどうかで判定され、ポインタはアドレスが一致しているかどうかで判定されます。</p><p>そのため、以下のように、スライスの要素から重複を削除して返す関数を作った場合、ポインタを要素に持つスライスを渡すと期待通りの結果にならなくなります。</p><pre><code>func ToUnique[T comparable](ss []T) []T {
	m := make(map[T]struct{}, len(ss))
	unique := make([]T, 0, len(ss))
	for _, s := range ss {
		if _, ok := m[s]; !ok {
			unique = append(unique, s)
			m[s] = struct{}{}
		}
	}
	return unique
}

func main() {
	{
		us := []User{
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
		}
		fmt.Println(ToUnique(us)) // [{1 1} {2 2}]
	}
	{
		us := []*User{
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
			{
				ID:   1,
				Name: "1",
			},
			{
				ID:   2,
				Name: "2",
			},
		}
		fmt.Println(ToUnique(us)) // [0xc000010078 0xc000010090 0xc0000100a8 0xc0000100c0]
	}
}
</code></pre><p>構造体を <code>==</code> で比較したりmapのキーにしたりする機会が殆どないので忘れてました。</p>]]></content:encoded></item><item><title><![CDATA[社会保険料の「定時決定」について学ぼう！]]></title><description><![CDATA[9月といえば、社会保険料の「定時決定」の時期ですね！
多くの企業では社会保険料を翌月控除しているので、9月分の社会保険料は10月の給与から控除されますが、10月の給与明細は確認しましたか？
給与明細をよく見てる人も気にしてない人も、今日は「定時決定」について学んでいきましょう〜！

定時決定とは
毎年1回、7月1日時点で使用される全被保険者に対して行われる「標準報酬月額」の見直しイベントのこと。
定時決定（算定基礎届）｜日本年金機構
[https://www.nenkin.go.jp/service/kounen/hokenryo/hoshu/20121017.html]

・標準報酬月額とは？
社会保険料(健康保険・厚生年金保険)を計算するための基準となる金額のことです。
入社時など、社会保険に加入した際(資格取得時)に標準報酬月額が決まり、その後は年に一度の「定時決定」で見直しがされます。
※固定的賃金に大幅な変動があった場合は「定時決定」を待たず、「随時改定」により標準報酬月額を見直しします

・定時決定ではどうやって見直して、反映をしているの？
①4月、5月、6月の3カ月間（支]]></description><link>https://tech.anti-pattern.co.jp/calculation-of-standard-remuneration/</link><guid isPermaLink="false">Ghost__Post__6146f00c3986b000013a637a</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Mon, 14 Nov 2022 09:14:39 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>9月といえば、社会保険料の「定時決定」の時期ですね！<br>
多くの企業では社会保険料を翌月控除しているので、9月分の社会保険料は10月の給与から控除されますが、10月の給与明細は確認しましたか？<br>
給与明細をよく見てる人も気にしてない人も、今日は「定時決定」について学んでいきましょう〜！</br></br></p>
<h2 id="%E5%AE%9A%E6%99%82%E6%B1%BA%E5%AE%9A%E3%81%A8%E3%81%AF">定時決定とは</h2>
<p>毎年1回、7月1日時点で使用される全被保険者に対して行われる「標準報酬月額」の見直しイベントのこと。<br>
<a href="https://www.nenkin.go.jp/service/kounen/hokenryo/hoshu/20121017.html">定時決定（算定基礎届）｜日本年金機構</a></br></p>
<h4 id="%E3%83%BB%E6%A8%99%E6%BA%96%E5%A0%B1%E9%85%AC%E6%9C%88%E9%A1%8D%E3%81%A8%E3%81%AF%EF%BC%9F">・標準報酬月額とは？</h4>
<p>社会保険料(健康保険・厚生年金保険)を計算するための基準となる金額のことです。<br>
入社時など、社会保険に加入した際(資格取得時)に標準報酬月額が決まり、その後は年に一度の「定時決定」で見直しがされます。<br>
※固定的賃金に大幅な変動があった場合は「定時決定」を待たず、「随時改定」により標準報酬月額を見直しします</br></br></p>
<h4 id="%E3%83%BB%E5%AE%9A%E6%99%82%E6%B1%BA%E5%AE%9A%E3%81%A7%E3%81%AF%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E8%A6%8B%E7%9B%B4%E3%81%97%E3%81%A6%E3%80%81%E5%8F%8D%E6%98%A0%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%EF%BC%9F">・定時決定ではどうやって見直して、反映をしているの？</h4>
<p>①4月、5月、6月の3カ月間（支払基礎日数17日以上の月）に受けた報酬の総額を月数で割って報酬月額を出す<br>
②事業主は「算定基礎届」に記入して、7月10日までに日本年金機構へ提出する<br>
③日本年金機構で処理が完了すると「健康保険・厚生年金保険被保険者標準報酬決定通知書」が事業主に届く<br>
④決定通知書をもとに、対象従業員の標準報酬月額が9月社保から変更になるよう、事業主が給与計算ソフトの設定を変更する</br></br></br></p>
<h4 id="%E3%83%BB%E5%AE%9A%E6%99%82%E6%B1%BA%E5%AE%9A%E3%81%A7%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%9F%E3%82%89%E3%80%81%E3%81%84%E3%81%A4%E3%81%8B%E3%82%89%E9%81%A9%E7%94%A8%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AE%EF%BC%9F">・定時決定で決まったら、いつから適用になるの？</h4>
<p>決定した標準報酬月額は、その年の9月(10月納付分)から翌年8月(9月納付分)まで適用されます。</p>
<h2 id="%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AB%E3%82%82%E3%80%81%E7%A4%BE%E4%BC%9A%E4%BF%9D%E9%99%BA%E6%96%99%E3%81%AE%E5%A4%89%E6%9B%B4%E6%99%82%E6%9C%9F%E3%81%AF%E3%81%82%E3%82%8B%E3%81%AE%EF%BC%9F">その他にも、社会保険料の変更時期はあるの？</h2>
<p>年に一度の「定時決定」以外にも「随時改定」で標準報酬月額が変わったり、「保険料率」自体が変更されたり、「介護保険料」の徴収が始まったり...<br>
給与明細を見ていると、社会保険料の控除額が変わっている事に気付くことがあると思います。</br></p>
<h4 id="%E3%83%BB%E9%9A%8F%E6%99%82%E6%94%B9%E5%AE%9A">・随時改定</h4>
<p>昇給や降給などで固定的賃金に大幅な変動があった場合は「随時改定」により標準報酬月額の見直しを行います。<br>
昇給・降給があったら必ず標準報酬月額が変更になるわけではなく、一定条件を満たした場合に「随時改定」の対象になります。<br>
<a href="https://www.nenkin.go.jp/service/kounen/hokenryo/hoshu/20150515-02.html">随時改定（月額変更届）｜日本年金機構</a></br></br></p>
<h4 id="%E3%83%BB%E4%BF%9D%E9%99%BA%E6%96%99%E7%8E%87%E3%81%AE%E5%A4%89%E6%9B%B4">・保険料率の変更</h4>
<p>健康保険・介護保険の保険料率は毎年3月(4月納付分)に改定されます。<br>
厚生年金の保険料率は平成29年9月を最後に引上げが終了し18.3％で固定されていますが、令和2年9月には等級区分の改定が行われ、上限が変更になりました。<br>
<a href="https://www.nenkin.go.jp/oshirase/taisetu/2020/202009/20200901.html">厚生年金保険における標準報酬月額の上限の改定｜日本年金機構</a></br></br></p>
<h4 id="%E3%83%BB%E4%BB%8B%E8%AD%B7%E4%BF%9D%E9%99%BA%E6%96%99%E3%81%AE%E5%BE%B4%E5%8F%8E">・介護保険料の徴収</h4>
<p>40歳から64歳までの健康保険の加入者は、健康保険料に介護保険料を上乗せして納めます。<br>
厳密には、40歳の誕生日の前日が属する月から介護保険料の徴収が開始され、65歳の誕生日の前日が属する月から徴収がされなくなります。<br>
※65歳以降は介護保険の第2号被保険者から第1号被保険者に変わるため、お住まいの市区町村より介護保険料が徴収されることとなります。</br></br></p>
<p>以上、少しでもお役に立てれば幸いです！</p>
<!--kg-card-end: markdown--><p/><h1/>]]></content:encoded></item><item><title><![CDATA[Stable DiffusionをDockerで動かす on CPU]]></title><description><![CDATA[Stable Diffusion
今何かと話題なStable Diffusionをローカルで動かしてみたい。

商用利用も可能とのことで、広告素材にも使えたら熱いと思い試してみる。

※GPUを使って動かそうとすると少し準備が大変そうだったので、また次回

GitHub - CompVis/stable-diffusionContribute to CompVis/stable-diffusion
development by creating an account on GitHub.GitHubCompVis
[https://github.com/CompVis/stable-diffusion]作ったもの
GitHub - kooooohe/stable-diffusionContribute to kooooohe/stable-diffusion
development by creating an account on GitHub.GitHubkooooohe
[https://github.com/kooooohe/stable-diffusion]環境
Ubuntu]]></description><link>https://tech.anti-pattern.co.jp/stable-diffusionwodockerdedong-kasu-with-cpu/</link><guid isPermaLink="false">Ghost__Post__6315bcefa35ab30001cac2e2</guid><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 07 Sep 2022 07:17:13 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test-3.png" medium="image"/><content:encoded><![CDATA[<h1 id="stable-diffusion">Stable Diffusion</h1><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test-3.png" alt="Stable DiffusionをDockerで動かす on CPU"/><p>今何かと話題なStable Diffusionをローカルで動かしてみたい。</p><p>商用利用も可能とのことで、広告素材にも使えたら熱いと思い試してみる。</p><p>※GPUを使って動かそうとすると少し準備が大変そうだったので、また次回</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/CompVis/stable-diffusion"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - CompVis/stable-diffusion</div><div class="kg-bookmark-description">Contribute to CompVis/stable-diffusion development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Stable DiffusionをDockerで動かす on CPU"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">CompVis</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/3d9ba20bf2675cd4d9b1937557adfef78cd7bf29609a12f6054629c5e7363e4a/CompVis/stable-diffusion" alt="Stable DiffusionをDockerで動かす on CPU"/></div></a></figure><h2 id="%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/stable-diffusion"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/stable-diffusion</div><div class="kg-bookmark-description">Contribute to kooooohe/stable-diffusion development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Stable DiffusionをDockerで動かす on CPU"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ee2a1e83cdc8bfc0a4f5dc099bc7f3b420633f7ff23e874f02b722f293dcb9ee/kooooohe/stable-diffusion" alt="Stable DiffusionをDockerで動かす on CPU"/></div></a></figure><h1 id="%E7%92%B0%E5%A2%83">環境</h1><pre><code>Ubuntu 20.04.5 LTS
AMD® Ryzen 7 pro 5850u with radeon graphics × 16 
AMD® Renoir
memory: 48GB</code></pre><p/><h1 id="docker-compose%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99">docker composeで動かす</h1><p/><pre><code class="language-yaml">services:
  stable-diffusion:
    build: .
    volumes:
      - ./app:/app
      - .cache/huggingface:/root/.cache/huggingface
    working_dir: /app
    tty: true</code></pre><pre><code class="language-Dockerfile">FROM pytorch/pytorch:latest

RUN pip3 install --upgrade diffusers transformers scipy</code></pre><p/><p>初回実行時に</p><p><code>git clone <a href="https://github.com/kooooohe/stable-diffusion">https://github.com/kooooohe/stable-diffusion</a> app</code></p><p>として、volume先にcloneしておく。</p><p><code>docker compose up</code></p><p><code>docker compose stable-diffusion exec bash</code></p><p>でコンテナに入り、下記プログラムを実行する。</p><pre><code class="language-python">import torch
from diffusers import StableDiffusionPipeline
from torch import autocast
 
MODEL_ID = "CompVis/stable-diffusion-v1-4"
DEVICE = "cpu"
YOUR_TOKEN = "YOUR TOKEN"
 
pipe = StableDiffusionPipeline.from_pretrained(MODEL_ID,  use_auth_token=YOUR_TOKEN)
pipe.to(DEVICE)

prompt = "A digital Illustration of Cloud"
 
image = pipe(prompt, guidance_scale=7.5)["sample"][0]
image.save("test.png")</code></pre><p>※公式のGitHubのsampleプログラムを実行するとGPUを使おうとしてエラーを吐いたので、とりあえず今の環境（CPU)でも動くように改変しています。</p><p>※tokenは予め公式の情報をみて取得しておいてください。</p><h2 id="%E7%B5%90%E6%9E%9C">結果</h2><p>実行時間: 約14分</p><pre><code>ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
51it [10:59, 12.94s/it]
root@f3ef6ab788c6:/app# python3 sample.py 
ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
51it [11:12, 13.19s/it]
root@f3ef6ab788c6:/app# python3 sample.py 
ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
51it [14:05, 16.57s/it]
root@f3ef6ab788c6:/app# python3 sapmle.py 
ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
51it [12:13, 14.39s/it]</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test3.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test4.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test5.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test6.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/09/test-2.png" class="kg-image" alt="Stable DiffusionをDockerで動かす on CPU" loading="lazy" width="512" height="512"/></figure><h1 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h1><p>機械でできた雲を出力しようとしましたが、なかなか難しかったです。</p><p>グーグル検索をして目的の情報を探すスキルのように、AIに期待する画像を出力させる文言選択のスキルが必要だなと感じました。</p>]]></content:encoded></item><item><title><![CDATA[Goのキャッシュ実装をジェネリクスで共通化する]]></title><description><![CDATA[はじめに
GoでRedisを使ったキャッシュを実装する際、同じような処理を何度も書くことになりそうだったので共通化しました。

実装
Redisへリクエストする処理をinterfaceで定義しておきます。

type Client interface {
	Get(context.Context, string) ([]byte, bool, error)
	Set(context.Context, string, []byte, time.Duration) error
}


このinterfaceを満たすclientを実装します。Redisへの接続には github.com/go-redis/redis
[https://pkg.go.dev/github.com/go-redis/redis/v8@v8.11.5] を使いました。

type client struct {
	c *redis.Client
}

func NewClient(addr, pass string) cache.Client {
	c := redis.NewClient(
		&redis.Op]]></description><link>https://tech.anti-pattern.co.jp/go-cache-gen/</link><guid isPermaLink="false">Ghost__Post__6304cea6a35ab30001cac0e7</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Fri, 02 Sep 2022 01:11:21 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>GoでRedisを使ったキャッシュを実装する際、同じような処理を何度も書くことになりそうだったので共通化しました。</p><h2 id="%E5%AE%9F%E8%A3%85">実装</h2><p>Redisへリクエストする処理をinterfaceで定義しておきます。</p><pre><code class="language-Go">type Client interface {
	Get(context.Context, string) ([]byte, bool, error)
	Set(context.Context, string, []byte, time.Duration) error
}
</code></pre><p>このinterfaceを満たすclientを実装します。Redisへの接続には <a href="https://pkg.go.dev/github.com/go-redis/redis/v8@v8.11.5"><code>github.com/go-redis/redis</code></a> を使いました。</p><pre><code class="language-Go">type client struct {
	c *redis.Client
}

func NewClient(addr, pass string) cache.Client {
	c := redis.NewClient(
		&amp;redis.Options{
			Addr:         addr,
			Password:     pass,
			PoolSize:     20,
			MinIdleConns: 10,
			MaxConnAge:   2 * time.Minute,
		},
	)
	return &amp;client{
		c: c,
	}
}

func (c *client) Get(
	ctx context.Context,
	key string,
) ([]byte, bool, error) {
	bytes, err := c.c.Get(ctx, key).Bytes()
	// キャッシュが存在しない場合
	if err == redis.Nil {
		return nil, false, nil
	}
	if err != nil {
		return nil, false, fmt.Errorf("failed to get from redis: %w", err)
	}
	return bytes, true, nil
}

func (c *client) Set(
	ctx context.Context,
	key string,
	bytes []byte,
	expiration time.Duration,
) error {
	err := c.c.Set(ctx, key, bytes, expiration).Err()
	if err != nil {
		return fmt.Errorf("failed to set to redis: %w", err)
	}
	return nil
}
</code></pre><p>このinterfaceを使って「キャッシュがあればそれを返し、なければDBから取得し、キャッシュに保存しつつ返す」という処理を実装します。</p><pre><code class="language-Go">type Cache[T any] struct {
	client     Client
	expiration time.Duration
	sfg        *singleflight.Group
}

func NewCache[T any](client Client, expiration time.Duration) *Cache[T] {
	return &amp;Cache[T]{
		client:     client,
		expiration: expiration,
		sfg:        &amp;singleflight.Group{},
	}
}

func (c *Cache[T]) GetOrSet(
	ctx context.Context,
	key string,
	callback func(context.Context) (T, error),
) (T, error) {
	// singleflightでリクエストをまとめる
	a, err, _ := c.sfg.Do(key, func() (any, error) {
		// キャッシュから取得
		bytes, exist, err := c.client.Get(ctx, key)
		if err != nil {
			log.Println(err)
		}
		if exist {
			return bytes, nil
		}
		// キャッシュがなければcallbackを実行
		t, err := callback(ctx)
		if err != nil {
			return nil, err
		}
		bytes, err = json.Marshal(t)
		if err != nil {
			return nil, err
		}
		// キャッシュに保存
		err = c.client.Set(ctx, key, bytes, c.expiration)
		if err != nil {
			log.Println(err)
		}
		return bytes, nil
	})
	var t T
	if err != nil {
		return t, err
	}
	bytes, ok := a.([]byte)
	if !ok {
		// 実装上、起きることはないはず
		return t, fmt.Errorf("failed to get from cache: invalid type %T", a)
	}
	err = json.Unmarshal(bytes, &amp;t)
	if err != nil {
		return t, err
	}
	return t, nil
}</code></pre><p>キャッシュ対象の型をジェネリクスで置いています。callbackにはDBから取得する処理を渡す想定です。<a href="https://tech.gunosy.io/entry/go-multi-layered-cache-tips#f-9022270a">こちらの記事</a>を参考に、キャッシュが切れたタイミングでDBに大量のリクエストが飛ばないように<a href="https://pkg.go.dev/golang.org/x/sync@v0.0.0-20210220032951-036812b2e83c/singleflight#Group.Do">singleflight</a>を使っています。</p><p>例として、UserオブジェクトをID指定で取得するような処理にキャッシュを適用してみます。</p><pre><code class="language-Go">type userRepository struct {
	db    *sql.DB
	cache *cache.Cache[*user.User]
}

func NewUserRepository(
	db *sql.DB,
	cacheClient cache.Client,
) user.Repository {
	return &amp;userRepository{
		db: db,
		cache: cache.NewCache[*user.User](
			cacheClient,
			time.Minute,
		),
	}
}

func (r *userRepository) GetByID(
	ctx context.Context,
	id int,
) (*user.User, error) {
	return r.cache.GetOrSet(ctx, makeUserKey(id),
		func(ctx context.Context) (*user.User, error) {
			var u *user.User
			// r.dbを使ってDBから取得する
			return u, nil
		},
	)
}

func makeUserKey(id int) string {
	return fmt.Sprintf("user:id:%d", id)
}
</code></pre><p><code>Cache[T　any]</code> は基本的にどんな型に対しても使えるので、他にキャッシュしたいデータが増えても同じように使い回すことができます。</p><h2 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h2><p>既存の実装を大きく変更することなくキャッシュ実装を共通化できました。今回、キャッシュの削除や複数取得などは実装していませんが、同じような方法で実装できると思うので、そちらも追加するつもりです。</p>]]></content:encoded></item><item><title><![CDATA[【Go】os.OpenFileのフラグについて]]></title><description><![CDATA[Photo by Markus Spiske
[https://unsplash.com/@markusspiske?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
※go version go1.19 darwin/amd64

ファイルを作成するGoの関数os.OpenFileは、3つの引数を取ります。
https://pkg.go.dev/os#OpenFile

func OpenFile(name string, flag int, perm FileMode) (*File, error)


第2引数のflag intは以下のような値を入れられます

os.OpenFile("filename.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)


この縦棒でつない]]></description><link>https://tech.anti-pattern.co.jp/go_openfile/</link><guid isPermaLink="false">Ghost__Post__62f12916a35ab30001cabfa3</guid><category><![CDATA[Go]]></category><category><![CDATA[golang]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Mon, 15 Aug 2022 02:44:18 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="【Go】os.OpenFileのフラグについて" loading="lazy" width="5760" height="3840" srcset="https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@markusspiske?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Markus Spiske</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGJ5dGV8ZW58MHx8fHwxNjYwNTMxMDYy&ixlib=rb-1.2.1&q=80&w=2000" alt="【Go】os.OpenFileのフラグについて"/><p>※go version go1.19 darwin/amd64</p><p>ファイルを作成するGoの関数os.OpenFileは、3つの引数を取ります。<br><a href="https://pkg.go.dev/os#OpenFile">https://pkg.go.dev/os#OpenFile</a></br></p><!--kg-card-begin: markdown--><pre><code>func OpenFile(name string, flag int, perm FileMode) (*File, error)
</code></pre>
<!--kg-card-end: markdown--><p>第2引数のflag intは以下のような値を入れられます</p><!--kg-card-begin: markdown--><pre><code>os.OpenFile(&quot;filename.txt&quot;, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
</code></pre>
<!--kg-card-end: markdown--><p>この縦棒でつないでいるやつなんなんだろうと思い、調べてみました。</p><p>第2引数に入れられる値は以下のようなintの数値が定義されていました。</p><!--kg-card-begin: markdown--><pre><code>const (
  O_RDONLY int = syscall.O_RDONLY // open the file read-only.
  O_WRONLY int = syscall.O_WRONLY // open the file write-only.
  O_RDWR   int = syscall.O_RDWR   // open the file read-write.
  O_APPEND int = syscall.O_APPEND // append data to the file when writing.
  O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
  O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.
  O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
  O_TRUNC  int = syscall.O_TRUNC  // truncate regular writable file when opened.
)
</code></pre>
<!--kg-card-end: markdown--><p>私の環境ではこのような値の数値でした</p><!--kg-card-begin: markdown--><pre><code>O_RDONLY int = 0
O_WRONLY int = 1
O_RDWR   int = 2
O_APPEND int = 8
O_CREATE int = 512
O_EXCL   int = 2048
O_SYNC   int = 128
O_TRUNC  int = 1024
</code></pre>
<!--kg-card-end: markdown--><p>「|」はORビット演算子らしく、intの値をORビット演算しているということでした！</p><p>各値を2進数で表すとこんな感じで、被り無く1がフラグのようになっているのがわかります（本来は64ビットなので、64桁になるように左に0が続く）</p><!--kg-card-begin: markdown--><pre><code>O_RDONLY int = 000000000000 // 0
O_WRONLY int = 000000000001 // 1
O_RDWR   int = 000000000010 // 2
O_APPEND int = 000000001000 // 8
O_CREATE int = 001000000000 // 512
O_EXCL   int = 100000000000 // 2048
O_SYNC   int = 000010000000 // 128
O_TRUNC  int = 010000000000 // 1024
</code></pre>
<!--kg-card-end: markdown--><p>すべての値をORビット演算子でつなぐと、「111010001011」こんな風な値になり、3723になるはず</p><!--kg-card-begin: markdown--><pre><code>package main

import (
	&quot;fmt&quot;
	&quot;os&quot;
)

func main() {
	// すべてのフラグをORビット演算子でつなぐ
	result := os.O_RDONLY | os.O_WRONLY | os.O_RDWR | os.O_APPEND | os.O_CREATE | os.O_EXCL | os.O_SYNC | os.O_TRUNC
	fmt.Println(result)

}
</code></pre>
<p>▼実行結果</p>
<pre><code>$ go run main.go 
3723
</code></pre>
<!--kg-card-end: markdown--><p>playground:<a href="https://go.dev/play/p/D-p3-coCyNt">https://go.dev/play/p/D-p3-coCyNt</a><br>なる！</br></p><p>OpenFile関数も、フラグを「|」ではなくて「+」でつなげば動くんじゃないかな？</p><!--kg-card-begin: markdown--><pre><code>package main

import (
	&quot;io&quot;
	&quot;os&quot;
	&quot;strings&quot;
)

func main() {

	// 読み取り・書き込み、ファイルが存在しない場合は新規作成するのflagを足したものを引数に渡す
	file, err := os.OpenFile(&quot;test.txt&quot;, os.O_RDWR+os.O_CREATE, 0666)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	io.Copy(file, strings.NewReader(&quot;テスト書き込み&quot;))

	// 読み込み位置を先頭に戻す
	file.Seek(0, 0)

	// ファイルの内容を標準出力に表示
	io.Copy(os.Stdout, file)
}

</code></pre>
<p>▼実行結果</p>
<pre><code>$ go run main.go 
テスト書き込み
</code></pre>
<!--kg-card-end: markdown--><p>playground:<a href="https://go.dev/play/p/0jO4FaRNX1K">https://go.dev/play/p/0jO4FaRNX1K</a><br>できてる！</br></p><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>ふと気になったORビット演算子ですが、調べていくとGoのintの桁が環境によって桁数が違うことや、それがPCの64bit版・32bit版のことで、それがレジスタのことを表していて、bitをフラグとして扱ってシステムコールに渡して、OSからCPUに指示を出して…と、なんとなーく覚えたり忘れたりしていた知識がつながったのがとても楽しい経験でした、おわり！</p>]]></content:encoded></item><item><title><![CDATA[都税事務所に納税証明書を取りに行ってみた]]></title><description><![CDATA[法人事業税と法人都民税の納税証明書を取得する為に、都税事務所に行った時に調べた事、行ってみて分かった事をまとめました！



納税証明書の取得方法は？
電子申請（郵送で受け取り）
【メリット】
・都税事務所に出向く必要がない
・発行手数料と証明書郵送料は「Pay-easy（ペイジー）」で支払える
【デメリット】
・東京共同電子申請・届出サービス [https://www.shinsei.elg-front.jp/tokyo2/navi/index.html]に登録が必要
・窓口申請よりは証明書の受け取りまでに時間がかかる（郵送申請よりは早い）
・郵送で受け取りのため郵送料がかかる
【どんな人に向いてる？】
電子申請は、窓口には行けないけど早めに書類が欲しい人に向いてそう

郵送申請
【メリット】
・都税事務所に出向く必要がない
【デメリット】
・証明書の受け取りまでに時間がかかる（申請受付から証明書の発送までに1週間～10日程度）
・往復の郵送料がかかる
・発行手数料は「定額小為替(ていがくこがわせ)」で支払う必要がある
【どんな人に向いてる？】
郵送申請は、窓口にも行けないし電子申請]]></description><link>https://tech.anti-pattern.co.jp/tozeizimusyo-nouzeisyoumeisyo/</link><guid isPermaLink="false">Ghost__Post__62821420a35ab30001cab7f5</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 03 Aug 2022 04:54:18 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>法人事業税と法人都民税の納税証明書を取得する為に、都税事務所に行った時に調べた事、行ってみて分かった事をまとめました！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/08/building_business_jimusyo.png" alt="building_business_jimusyo" loading="lazy"/></p>
<h2 id="%E7%B4%8D%E7%A8%8E%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F">納税証明書の取得方法は？</h2>
<h4 id="%E9%9B%BB%E5%AD%90%E7%94%B3%E8%AB%8B%EF%BC%88%E9%83%B5%E9%80%81%E3%81%A7%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%EF%BC%89">電子申請（郵送で受け取り）</h4>
<p>【メリット】<br>
・都税事務所に出向く必要がない<br>
・発行手数料と証明書郵送料は「Pay-easy（ペイジー）」で支払える<br>
【デメリット】<br>
・<a href="https://www.shinsei.elg-front.jp/tokyo2/navi/index.html">東京共同電子申請・届出サービス</a>に登録が必要<br>
・窓口申請よりは証明書の受け取りまでに時間がかかる（郵送申請よりは早い）<br>
・郵送で受け取りのため郵送料がかかる<br>
【どんな人に向いてる？】<br>
電子申請は、窓口には行けないけど早めに書類が欲しい人に向いてそう</br></br></br></br></br></br></br></br></p>
<h4 id="%E9%83%B5%E9%80%81%E7%94%B3%E8%AB%8B">郵送申請</h4>
<p>【メリット】<br>
・都税事務所に出向く必要がない<br>
【デメリット】<br>
・証明書の受け取りまでに時間がかかる（申請受付から証明書の発送までに1週間～10日程度）<br>
・往復の郵送料がかかる<br>
・発行手数料は「定額小為替(ていがくこがわせ)」で支払う必要がある<br>
【どんな人に向いてる？】<br>
郵送申請は、窓口にも行けないし電子申請の為のサービス登録などもしたくない人に向いてそう</br></br></br></br></br></br></br></p>
<h4 id="%E9%83%BD%E7%A8%8E%E4%BA%8B%E5%8B%99%E6%89%80%E3%81%AE%E7%AA%93%E5%8F%A3%E3%81%A7%E7%94%B3%E8%AB%8B">都税事務所の窓口で申請</h4>
<p>【メリット】<br>
・申請後すぐに証明書が受け取れる<br>
・発行手数料を現金で支払える<br>
・都内のすべての都税事務所、都税支所、支庁の窓口で申請できる<br>
【デメリット】<br>
・都税事務所の窓口開設時間内に出向く必要がある(時間と交通費がかかる)<br>
・混雑している日だと待ち時間が長くなる可能性がある<br>
【どんな人に向いてる？】<br>
窓口申請は、早く書類が欲しい人で窓口開設時間内に行ける人に向いてそう</br></br></br></br></br></br></br></br></p>
<h2 id="%E7%B4%8D%E7%A8%8E%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%80%81%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AF%EF%BC%9F">納税証明書を取得できる人、準備するものは？</h2>
<h4 id="%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA">取得できる人</h4>
<p>法人の代表者、または法人の従業員が取得可能</p>
<h4 id="%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE">準備するもの</h4>
<p>【代表者が申請する場合】①納税証明申請書、②本人確認書類の2点が必要<br>
【従業員が申請する場合】上記2点に追加で③法人名と従業員の姓名が明記された従業員証が必要<br>
※①納税証明申請書には、代表者印の押印が必要<br>
※③法人名と従業員の姓名が明記された従業員証には、所属する法人名、従業員の姓名の記載が必要（2点記載があれば従業員証の代わりに健康保険証でも受付可能）</br></br></br></p>
<h4 id="%E6%89%8B%E6%95%B0%E6%96%99">手数料</h4>
<p>1税目につき400円<br>
※法人事業税と法人都民税は2税目と数える為、手数料は800円となる<br>
※電子申請をしても特に手数料割引はない</br></br></p>
<p>▼詳しくはこちらのサイトをご確認ください<br>
<a href="https://www.tax.metro.tokyo.lg.jp/scene/index01.html#n0">証明書が必要なとき | 東京都主税局</a><br>
「①納税証明申請書」もこちらのサイトからダウンロード出来ます</br></br></p>
<p><strong>今回は港都税事務所の窓口に行って申請しました！</strong></p>
<p>私が訪れた時(2022年3月中旬の16時頃)はとても空いており、滞在時間は5分程度だったと思います。<br>
①窓口に必要書類を提出<br>
②法人事業税と法人都民税の納税証明書を2枚に分けるか？1枚にまとめるか聞かれる（どちらを選んでも手数料は変わらない）<br>
③自販機で800円分の券を購入するように言われ、言われた通りに購入して窓口の方へお渡し<br>
④法人事業税と法人都民税の納税証明書2枚を受け取り、終了！</br></br></br></br></p>
<p>待ち時間が心配な方は、事前に「<a href="https://lists.neconome.com/taxtokyometro/">都税事務所窓口の混雑状況</a>」や「<a href="https://app.powerbi.com/view?r=eyJrIjoiMDdkMzUwYTAtMjM1NC00ZmJiLTlmNzctNGQ2N2RmNGU4YmU3IiwidCI6ImQwMzAyZmNjLTNlODEtNDljMy04MjM1LWQzMTFhMzY4NGNmYyJ9">都税事務所来所者数見える化ダッシュボード</a>」をチェックしておくと良いと思います！</p>
<p>以上、参考になれば幸いです！</p>
<!--kg-card-end: markdown--><p/><p/><p/>]]></content:encoded></item><item><title><![CDATA[Goのcontextのkeyについて]]></title><description><![CDATA[はじめに
Goの標準パッケージの context.Context は context.WithValue 関数を使って任意の値を格納することができます。

context.WithValue には以下のようなコメントが書かれています。

// WithValue returns a copy of parent in which the value associated with key is
// val.
//
// Use context Values only for request-scoped data that transits processes and
// APIs, not for passing optional parameters to functions.
//
// The provided key must be comparable and should not be of type
// string or any other built-in type to avoid collisions between
// packages using c]]></description><link>https://tech.anti-pattern.co.jp/go-ctx-key/</link><guid isPermaLink="false">Ghost__Post__62c38a5ba35ab30001cabca2</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Mon, 11 Jul 2022 08:57:57 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2><p>Goの標準パッケージの <code>context.Context</code> は <code>context.WithValue</code> 関数を使って任意の値を格納することができます。</p><p><code>context.WithValue</code> には以下のようなコメントが書かれています。</p><pre><code>// WithValue returns a copy of parent in which the value associated with key is
// val.
//
// Use context Values only for request-scoped data that transits processes and
// APIs, not for passing optional parameters to functions.
//
// The provided key must be comparable and should not be of type
// string or any other built-in type to avoid collisions between
// packages using context. Users of WithValue should define their own
// types for keys. To avoid allocating when assigning to an
// interface{}, context keys often have concrete type
// struct{}. Alternatively, exported context key variables' static
// type should be a pointer or interface.</code></pre><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/golang/go/blob/ceda93ed673294f0ce5eb3a723d563091bff0a39/src/context/context.go#L510-L523"><div class="kg-bookmark-content"><div class="kg-bookmark-title">go/context.go at ceda93ed673294f0ce5eb3a723d563091bff0a39 · golang/go</div><div class="kg-bookmark-description">The Go programming language. Contribute to golang/go development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">golang</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/acb1edf4bd9bb69f9bfd105065442408d89f60a79067e74c790e52b7628d6435/golang/go"/></div></a></figure><p>組み込み型よりも <code>struct{}</code> のように自分で定義した型を使ったほうが良い、というようなことが書いてあります。</p><p>この記述を勘違いして以下のようにキーを定義したところ、期待通りの値が取れたり取れなかったりするバグができてしまいました。</p><pre><code>var hogeKey = struct{}{}

func SetHoge(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, &amp;hogeKey, i)
}

func GetHoge(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(&amp;hogeKey).(int)
	return i, ok
}</code></pre><p>どのように定義すると同じキーとみなされるのか、調査しました。</p><h2 id="%E8%AA%BF%E6%9F%BB">調査</h2><p>以下の5パターンのキーを用意し、setterとgetterを作ります。</p><ol><li>空の構造体struct{}の実体として定義する</li><li>空の構造体struct{}の実体として定義し、ポインタで使う</li><li>空の構造体struct{}のポインタとして定義する</li><li>空の構造体struct{}を型定義する</li><li>空の構造体struct{}を型定義し、実体として定義する</li></ol><pre><code>package a

import "context"

// 1. 空の構造体struct{}の実体として定義する
var emptyStruct = struct{}{}

func SetStruct(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, emptyStruct, i)
}

func GetStruct(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(emptyStruct).(int)
	return i, ok
}

// 2. 空の構造体struct{}の実体として定義し、ポインタで使う
var emptyStructAsPointer = struct{}{}

func SetStructAsPointer(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, &amp;emptyStructAsPointer, i)
}

func GetStructAsPointer(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(&amp;emptyStructAsPointer).(int)
	return i, ok
}

// 3. 空の構造体struct{}のポインタとして定義する
var emptyStructPointer = &amp;struct{}{}

func SetStructPointer(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, emptyStructPointer, i)
}

func GetStructPointer(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(emptyStructPointer).(int)
	return i, ok
}

// 4. 空の構造体struct{}を型定義する
type emptyStructType struct{}

func SetStructType(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, emptyStructType{}, i)
}

func GetStructType(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(emptyStructType{}).(int)
	return i, ok
}

// 5. 空の構造体struct{}を型定義し、実体として定義する
var emptyStructTypeValue = emptyStructType{}

func SetStructTypeValue(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, emptyStructTypeValue, i)
}

func GetStructTypeValue(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(emptyStructTypeValue).(int)
	return i, ok
}</code></pre><p>これと全く同じキーや関数の定義を2つのpackageで用意します。</p><pre><code>.
├── a
│   └── a.go
├── b
│   └── b.go
└── main.go</code></pre><p>a.goとb.goはpackage名以外は全く同じです。 </p><p>各キーでcontextに値をセットし、取得してみます。</p><pre><code>package main

import (
	"context"
	"fmt"

	"ctxkey/a"
	"ctxkey/b"
)

func main() {
	for i, set := range []func(ctx context.Context, i int) context.Context{
		a.SetStruct,
		a.SetStructAsPointer,
		a.SetStructPointer,
		a.SetStructType,
		a.SetStructTypeValue,
	} {
		ctx := set(context.Background(), 1)
		for j, get := range []func(ctx context.Context) (int, bool){
			a.GetStruct,
			a.GetStructAsPointer,
			a.GetStructPointer,
			a.GetStructType,
			a.GetStructTypeValue,
			b.GetStruct,
			b.GetStructAsPointer,
			b.GetStructPointer,
			b.GetStructType,
			b.GetStructTypeValue,
		} {
			res, ok := get(ctx)
			fmt.Printf("set: %v get: %v result: %v %v\n", i, j, res, ok)
		}
	}
}
</code></pre><p>これを実行すると以下のようになります。</p><pre><code>set: 0 get: 0 result: 1 true
set: 0 get: 1 result: 0 false
set: 0 get: 2 result: 0 false
set: 0 get: 3 result: 0 false
set: 0 get: 4 result: 0 false
set: 0 get: 5 result: 1 true
set: 0 get: 6 result: 0 false
set: 0 get: 7 result: 0 false
set: 0 get: 8 result: 0 false
set: 0 get: 9 result: 0 false
set: 1 get: 0 result: 0 false
set: 1 get: 1 result: 1 true
set: 1 get: 2 result: 1 true
set: 1 get: 3 result: 0 false
set: 1 get: 4 result: 0 false
set: 1 get: 5 result: 0 false
set: 1 get: 6 result: 1 true
set: 1 get: 7 result: 1 true
set: 1 get: 8 result: 0 false
set: 1 get: 9 result: 0 false
set: 2 get: 0 result: 0 false
set: 2 get: 1 result: 1 true
set: 2 get: 2 result: 1 true
set: 2 get: 3 result: 0 false
set: 2 get: 4 result: 0 false
set: 2 get: 5 result: 0 false
set: 2 get: 6 result: 1 true
set: 2 get: 7 result: 1 true
set: 2 get: 8 result: 0 false
set: 2 get: 9 result: 0 false
set: 3 get: 0 result: 0 false
set: 3 get: 1 result: 0 false
set: 3 get: 2 result: 0 false
set: 3 get: 3 result: 1 true
set: 3 get: 4 result: 1 true
set: 3 get: 5 result: 0 false
set: 3 get: 6 result: 0 false
set: 3 get: 7 result: 0 false
set: 3 get: 8 result: 0 false
set: 3 get: 9 result: 0 false
set: 4 get: 0 result: 0 false
set: 4 get: 1 result: 0 false
set: 4 get: 2 result: 0 false
set: 4 get: 3 result: 1 true
set: 4 get: 4 result: 1 true
set: 4 get: 5 result: 0 false
set: 4 get: 6 result: 0 false
set: 4 get: 7 result: 0 false
set: 4 get: 8 result: 0 false
set: 4 get: 9 result: 0 false</code></pre><p>表にしました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/----------2022-07-05-19.30.48.png" class="kg-image" alt="" loading="lazy" width="2000" height="299" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/----------2022-07-05-19.30.48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/----------2022-07-05-19.30.48.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/----------2022-07-05-19.30.48.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/----------2022-07-05-19.30.48.png 2312w" sizes="(min-width: 720px) 720px"/></figure><p>○をつけた箇所は、値を取得できた組み合わせです。</p><p><code>struct</code> ,<code>structAspointer</code> ,<code>structPointer</code> から分かるように、<code>struct{}{}</code> をそのまま使うと、別のpackageであっても同じキーとみなされ、値が取れてしまいます。つまり、複数のpackageで<code>struct{}{}</code> をキーに値をセットすると、後からセットした値で上書きされます。</p><pre><code>	ctx := context.Background()
	ctx = a.SetStruct(ctx, 1)
	ctx = b.SetStruct(ctx, 2)
	fmt.Println(a.GetStruct(ctx)) // 2 true
	fmt.Println(b.GetStruct(ctx)) // 2 true</code></pre><p>また、<code>structType</code> と <code>structTypeValue</code> から分かるように、同じ型の場合、実体としては別でも同じキーとして扱われてしまいます。そのため、キーごとに別々の型で定義する必要があります。</p><p>contextのキーについて調べてみると以下の記事を見つけました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/behiron/items/aec3e1a848f789153d86"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GoのcontextのValueのkeyの型を再考する - Qiita</div><div class="kg-bookmark-description">はじめに GoのContextパッケージではctx &#x3D; WithValue(ctx, key ,value)でcontextに紐付けた値をctx.Value(key)で取得します。 このときkeyとしては他のコードとの衝突をさ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">behiron</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9R28lRTMlODElQUVjb250ZXh0JUUzJTgxJUFFVmFsdWUlRTMlODElQUVrZXklRTMlODElQUUlRTUlOUUlOEIlRTMlODIlOTIlRTUlODYlOEQlRTglODAlODMlRTMlODElOTklRTMlODIlOEImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWIzNzJlMTY1MGVhZmVkMzQwMTdjZmYxZTEwM2Y0NmFk&amp;mark-x&#x3D;142&amp;mark-y&#x3D;112&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwYmVoaXJvbiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MDI1NjRmZjBjNWM2YjdlNDdmZjQwODk3OTQ1ZDMyY2I&amp;blend-x&#x3D;142&amp;blend-y&#x3D;491&amp;blend-mode&#x3D;normal&amp;s&#x3D;5796627fd9f5eb0ac190022d369c8407"/></div></a></figure><p>どのような条件で同じキーとみなされるか、詳しく書かれており、非常に参考になりました。</p><h2 id="%E7%B5%90%E8%AB%96">結論</h2><p>contextのキーを定義する場合、キーごとに別々の型で定義する必要があります。</p><pre><code>type hogeKey struct{}

func SetHoge(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, hogeKey{}, i)
}

func GetHoge(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(hogeKey{}).(int)
	return i, ok
}

type fugaKey struct{}

func SetFuga(ctx context.Context, i int) context.Context {
	return context.WithValue(ctx, fugaKey{}, i)
}

func GetFuga(ctx context.Context) (int, bool) {
	i, ok := ctx.Value(fugaKey{}).(int)
	return i, ok
}</code></pre><p>ちなみに、同じ型で複数のキーを作りたい場合は</p><pre><code>type ctxKey struct{ string }</code></pre><p>のようにstringを含めるように定義し、キーごとに別の文字列をセットすれば、別のpackageで同じ文字列をセットしていても、別のキーとして扱われます。</p><pre><code>// package a

type ctxKey struct{ string }

var hogeKey = ctxKey{ "hoge" }
var fugaKey = ctxKey{ "fuga" }

// package b

type ctxKey struct{ string }

var hogeKey = ctxKey{ "hoge" }

// a.hogeKey, a.fugaKey, b.hogeKey はそれぞれ別のキーとして扱われる</code></pre>]]></content:encoded></item><item><title><![CDATA[Codespacesを使ってブラウザで開発をしよう]]></title><description><![CDATA[

Codespacesとは
クラウド上で、開発ができる機能。

VSCodeやブラウザを使って開発が可能。

ブラウザで開発可能なので、自身のPCのスペックに関係なく(タブレットでも）スムーズに開発ができます。(PWA化もされているので、Vimのプラグインなどを入れても、ブラウザのショートカットキーとかぶらず、快適に開発ができます）

CodespacesYour instant dev environmentGitHub
[https://github.co.jp/features/codespaces]※2022/07/03時点でβ版の機能です。

このように、開発環境のスペックをそのつど選ぶことができます。

重い処理をする際に気軽にスペックを上げることができるのは非常に魅力的。



料金はこちら

Codespaces の支払いについて - GitHub Docs
価格を見て、OrganizationでのCodespacesの支払いの管理方法を確認してください。GitHub Docs
[https://docs.github.com/ja/billing/managing-]]></description><link>https://tech.anti-pattern.co.jp/github-codespaces/</link><guid isPermaLink="false">Ghost__Post__62bea74ca35ab30001cabae7</guid><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 06 Jul 2022 09:29:22 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-11-12-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-11-12-2.png" alt="Codespacesを使ってブラウザで開発をしよう"/><p/><h1 id="codespaces%E3%81%A8%E3%81%AF">Codespacesとは</h1><p>クラウド上で、開発ができる機能。</p><p>VSCodeやブラウザを使って開発が可能。</p><p>ブラウザで開発可能なので、自身のPCのスペックに関係なく(タブレットでも）スムーズに開発ができます。(PWA化もされているので、Vimのプラグインなどを入れても、ブラウザのショートカットキーとかぶらず、快適に開発ができます）</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.co.jp/features/codespaces"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Codespaces</div><div class="kg-bookmark-description">Your instant dev environment</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">GitHub</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/site/social-cards/codespaces.png" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><p>※2022/07/03時点でβ版の機能です。</p><p>このように、開発環境のスペックをそのつど選ぶことができます。</p><p>重い処理をする際に気軽にスペックを上げることができるのは非常に魅力的。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_174.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="1033" height="771" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Selection_174.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/Selection_174.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_174.png 1033w" sizes="(min-width: 720px) 720px"/></figure><p/><p>料金はこちら</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_175.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="761" height="350" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Selection_175.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_175.png 761w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-codespaces"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Codespaces の支払いについて - GitHub Docs</div><div class="kg-bookmark-description">価格を見て、OrganizationでのCodespacesの支払いの管理方法を確認してください。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.github.com/assets/cb-803/images/site/favicon.svg" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">GitHub Docs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/open_graph/github-logo.png" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><h1 id="submodule%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E7%92%B0%E5%A2%83%E3%81%A7%E3%82%82%E4%BD%BF%E7%94%A8%E5%8F%AF%E8%83%BD">Submoduleを使っている環境でも使用可能</h1><p>Submodules を使っている環境をCodespacesを使い開発できるようにする</p><!--kg-card-begin: markdown--><ul>
<li>dev-env
<ul>
<li>front</li>
<li>api</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><p>のようなリポジトリを3つ使っているケースを想定。</p><p>普段はDocker Composeを使って開発をしているので、今回もDocker Composeを使い複数コンテナを立ち上げローカルでの開発と同じように開発することを目指します。※ということで、 docker on dockerみたいな環境を準備する必要がありそうで。</p><p>API環境とFrontの開発環境では、設定する環境や必要なVSCodeの拡張機能も違ったりします。</p><p>そんなときは、下記のようにして複数の環境用の設定ファイルを準備することができます。</p><p><code>.devcontainer/SUBDIRECTORY/devcontainer.json</code></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.github.com/ja/codespaces/setting-up-your-project-for-codespaces/introduction-to-dev-containers"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Introduction to dev containers - GitHub Docs</div><div class="kg-bookmark-description">When you work in a codespace, the environment you are working in is created using a development container, or dev container, hosted on a virtual machine.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.github.com/assets/cb-803/images/site/favicon.svg" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">GitHub Docs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/open_graph/github-logo.png" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><p>今回はFront用の環境のみを準備することとします。将来複数の環境を作ることを見越して</p><p><code>dev-env/.devcontainer/front/devcontainer.json</code></p><p>を準備。このようにすることによって、下記のimgのように、Codespacesを作成する際に、環境情報を選べるようになります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_172.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="964" height="751" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Selection_172.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Selection_172.png 964w" sizes="(min-width: 720px) 720px"/></figure><h1 id="devcontainerjson">devcontainer.json</h1><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://code.visualstudio.com/docs/remote/devcontainerjson-reference"><div class="kg-bookmark-content"><div class="kg-bookmark-title">devcontainer.json reference</div><div class="kg-bookmark-description">devcontainer.json reference</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://code.visualstudio.com/favicon.ico" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">Microsoft</span><span class="kg-bookmark-publisher">Microsoft</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://code.visualstudio.com/opengraphimg/opengraph-docs.png" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><p>devcontainer.jsonに環境情報を定義していきます。</p><!--kg-card-begin: markdown--><pre><code class="language-json">{    
	&quot;image&quot;: &quot;ubuntu:latest&quot;,
        &quot;name&quot;: &quot;dev-container-front2&quot;,     
	&quot;features&quot;: {    
		&quot;docker-in-docker&quot;: {
			&quot;version&quot;: &quot;latest&quot;,
			&quot;moby&quot;: true,
			&quot;dockerDashComposeVersion&quot;: &quot;v2&quot;
		},
		&quot;github-cli&quot;: &quot;latest&quot;,
		&quot;fish&quot;: &quot;latest&quot;
	},    
	&quot;extensions&quot;: [    
		&quot;rvest.vs-code-prettier-eslint&quot;,    
		&quot;dbaeumer.vscode-eslint&quot;,    
		&quot;allanoricil.nuxt-vscode-extension&quot;,    
		&quot;willjleong.nuxt-typescript-snippets&quot;,    
		&quot;rvest.vs-code-prettier-eslint&quot;,    
		&quot;octref.vetur&quot;    
	],    
	&quot;settings&quot;: {    
	},
	&quot;postCreateCommand&quot;: &quot;bash ./.devcontainer/init.bash&quot;
	// &quot;settings&quot;: {
	// 	&quot;terminal.integrated.shell.linux&quot;: &quot;/bin/fish&quot;
	// }
}
</code></pre>
<!--kg-card-end: markdown--><p>image: 開発を行うコンテナのimageを指定。今回はubuntuの最新versionを指定。</p><p>※もちろんDockerfileを使用することもできるので、より複雑な環境を作りたい場合はDockerfileを指定。</p><p>features: 予め用意してくれている便利機能たち。ここに定義しておくと、開発環境に自動的に追加してくれる。今回はなんとdocker-in-dockerというかなり便利な道具があったので採用。これによりubuntuコンテナ上にDockerを自動的にinstallしてくれる。(もちろんDocker Composeも)</p><p>fishやgithub-cliなどもあるので、必要にあわせて入れておくと良いだろう。</p><p>extentions:　開発に必要な拡張機能をここに書いておくと環境立ち上げ時に自動的にinstallされたものが立ち上がる。拡張機能やその設定も差異なくシェアできるのは大変心強い。</p><p>postCreateCommand:開発環境が出来上がったときに一度だけ実行されるコマンドである。今回はsubmoduleの取得コマンドをここで実行する。</p><p>その他のcommand実行タイミングがわかるライフサイクルの詳細はこちら。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://code.visualstudio.com/docs/remote/devcontainerjson-reference"><div class="kg-bookmark-content"><div class="kg-bookmark-title">devcontainer.json reference</div><div class="kg-bookmark-description">devcontainer.json reference</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://code.visualstudio.com/favicon.ico" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">Microsoft</span><span class="kg-bookmark-publisher">Microsoft</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://code.visualstudio.com/opengraphimg/opengraph-docs.png" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><p/><p>その他、使える機能一覧(features)はこちら。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/microsoft/vscode-dev-containers/tree/main/script-library/docs"><div class="kg-bookmark-content"><div class="kg-bookmark-title">vscode-dev-containers/script-library/docs at main · microsoft/vscode-dev-containers</div><div class="kg-bookmark-description">A repository of development container definitions for the VS Code Remote - Containers extension and GitHub Codespaces - vscode-dev-containers/script-library/docs at main · microsoft/vscode-dev-cont...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">microsoft</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/56cc2dd5d4972211a49cd9ca8dd2bb99d7a69eaadfa037d3397a0c4194dac868/microsoft/vscode-dev-containers" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure><p/><p>その他にもDocker Composeを生かす設定などありますので、公式ドキュメントを読んでおくと良いと思います。</p><h2 id="initbash">init.bash</h2><!--kg-card-begin: markdown--><pre><code class="language-bash">#!/bin/bash

set -eu
cd $(dirname $0)

cd ../
sed -i -e 's#git@github.com:#https://github.com/#g' .gitmodules
sed -i -e 's#git@github.com:#https://github.com/#g' .git/config
git submodule update --init --recursive
echo &quot;&quot; &gt; front/.env


</code></pre>
<!--kg-card-end: markdown--><p>SSHでのcloneだとCodespaces上ではうまく動かないため、https経由でのsubmoduleの取得に変更してから、取得します。</p><p>また、compose.ymlファイルで.envをmountしているとErrorが起きるので一旦空の.envファイルをここで作成しています。</p><h1 id="%E5%AE%9F%E8%A1%8C">実行!!</h1><p>ブラウザ上でVSCodeが動きました！</p><p>拡張機能も期待通りにinstall済み。</p><p>Docker ComposeやNode.js コンテナ上でのyarn devも問題なく動きました。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-11-12-1.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="1920" height="1080" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Screenshot-from-2022-07-01-13-11-12-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/Screenshot-from-2022-07-01-13-11-12-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/Screenshot-from-2022-07-01-13-11-12-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-11-12-1.png 1920w" sizes="(min-width: 1200px) 1200px"/></figure><p>またPWAとしてDLすると、通常のVSCodeと何ら遜色なく開発が行えました。</p><p>※通常のVSCodeと見分けが付きやすいように色を変えています。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-10-59.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="1920" height="1080" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Screenshot-from-2022-07-01-13-10-59.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/Screenshot-from-2022-07-01-13-10-59.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/Screenshot-from-2022-07-01-13-10-59.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-10-59.png 1920w" sizes="(min-width: 1200px) 1200px"/></figure><p>そして、localhostにアクセスする必要な場合は、自動的にlocalhostを使用するコンテナを立ち上げると、確認用のURLが発行されます！なんて便利。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-10-35-1.png" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="1920" height="1080" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/Screenshot-from-2022-07-01-13-10-35-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/Screenshot-from-2022-07-01-13-10-35-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/Screenshot-from-2022-07-01-13-10-35-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Screenshot-from-2022-07-01-13-10-35-1.png 1920w" sizes="(min-width: 1200px) 1200px"/></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/Peek-2022-07-01-13-13.gif" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="1909" height="982"/></figure><p/><h1 id="%E4%BD%99%E8%AB%87">余談</h1><h2 id="%E3%83%80%E3%83%96%E3%83%AC%E3%83%83%E3%83%88">ダブレット</h2><p>タブレットでも開発できました。</p><p>ただ、キーボードのレイアウト設定がめちゃくちゃめんどくさそう。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/PXL_20220701_150357310--1-.jpg" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="2000" height="1506" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/PXL_20220701_150357310--1-.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/PXL_20220701_150357310--1-.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/PXL_20220701_150357310--1-.jpg 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/07/PXL_20220701_150357310--1-.jpg 2400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/07/PXL_20220701_154602311--1-.jpg" class="kg-image" alt="Codespacesを使ってブラウザで開発をしよう" loading="lazy" width="2000" height="1506" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/07/PXL_20220701_154602311--1-.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/07/PXL_20220701_154602311--1-.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/07/PXL_20220701_154602311--1-.jpg 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/07/PXL_20220701_154602311--1-.jpg 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>今回、Zennのスクラップ機能を使ってメモをしならが調査等していましたが、とても便利でした。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://zenn.dev/kooooohe/scraps/e92405080e4d39"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Codespaces | GitHub</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://zenn.dev/images/icon.png" alt="Codespacesを使ってブラウザで開発をしよう"><span class="kg-bookmark-author">Zenn</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://lh3.googleusercontent.com/a-/AOh14GjQNXZfPnro37GyjS4kDkTR-pfv7fjJZVluO4UKhA&#x3D;s250-c" alt="Codespacesを使ってブラウザで開発をしよう"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Browsersyncを非Docker環境とDocker環境の両方で使いたい]]></title><description><![CDATA[お世話になっております。矢ヶ崎です。

最近、とあるシステムのヘルプをするにあたって、既存の React プロジェクトの開発環境を Docker 化させたときに、 Browsersync
がうまく動かずハマったので、ここに記しておきます。

もともと、 Docker を使わずに開発していたのもあり、 Docker を使わないでの開発環境も引き続き必要という状況だったため、 Browsersync
側にはなんの変更も加えずに動くようにするのに苦労しました。

SPAベースでできているため、 nginx の裏にはフロントエンドとバックエンドの両方を配置し、パスベースで振り分けるようにしております。

Browser 
=> nginx 
=> /api/ 
=> port 3000 Backend
=> / 
=> port 2000 Frontend

ただ、これだけだといい感じに Browsersync が動きません。既存のBrowsersyncの設定(抜粋)はこんな感じです。

      new BrowserSyncPlugin(
        {
          http]]></description><link>https://tech.anti-pattern.co.jp/browsersync/</link><guid isPermaLink="false">Ghost__Post__62abf179a35ab30001cab9b8</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Tue, 28 Jun 2022 09:59:14 GMT</pubDate><content:encoded><![CDATA[<p>お世話になっております。矢ヶ崎です。</p><p>最近、とあるシステムのヘルプをするにあたって、既存の React プロジェクトの開発環境を Docker 化させたときに、 Browsersync がうまく動かずハマったので、ここに記しておきます。</p><p>もともと、 Docker を使わずに開発していたのもあり、 Docker を使わないでの開発環境も引き続き必要という状況だったため、 Browsersync 側にはなんの変更も加えずに動くようにするのに苦労しました。</p><p>SPAベースでできているため、 nginx の裏にはフロントエンドとバックエンドの両方を配置し、パスベースで振り分けるようにしております。</p><p>Browser <br>  =&gt; nginx <br>    =&gt; /api/ <br>        =&gt; port 3000 Backend<br>    =&gt; / <br>        =&gt; port 2000 Frontend</br></br></br></br></br></p><p>ただ、これだけだといい感じに Browsersync が動きません。既存のBrowsersyncの設定(抜粋)はこんな感じです。</p><!--kg-card-begin: markdown--><pre><code>      new BrowserSyncPlugin(
        {
          https: options.tls,
          host: 'localhost',
          port,
          proxy: {
            target: `http${options.tls ? 's' : ''}://localhost:9060`,
            proxyOptions: {
              changeOrigin: false
            }
          },
</code></pre>
<!--kg-card-end: markdown--><p>こうなると、ブラウザは localhost:9060 に Browsersync 的な接続しに行こうとします。そして、当然つながりません。もちろんここを変えるというのもあるのですが、今回はここは変更できません。なので、 nginx 側でいい感じにルーティングします。</p><p>まずは、 Port 9060 を listen するようにします。</p><!--kg-card-begin: markdown--><pre><code>    image: nginx:latest
    ports:
      - 80:80
      - 9060:9060
</code></pre>
<!--kg-card-end: markdown--><p>そして、Port 9060 に来た通信を Websocket ベースで Frontend の Port 2000 に飛ばしてあげます。</p><!--kg-card-begin: markdown--><pre><code>map $http_upgrade $connection_upgrade { 
    default upgrade;
    ''      close;
} 

server {
    listen 9060;
    server_name localhost;

    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade;

    location / {
        proxy_pass http://docker-fe:2000;
    }
}
</code></pre>
<!--kg-card-end: markdown--><p>こんな感じで、既存の環境も動作させつつ、Dockerでも快適に開発ができるようになりました！</p><p>よかった〜</p>]]></content:encoded></item><item><title><![CDATA[SaaS.tech #2 で LT させていただいたお話]]></title><description><![CDATA[こんにちは！矢ヶ崎です！

2022/04/20 に、「SaaSにおけるマルチテナント設計の悩みと勘所 | SaaS.tech #2 」
[https://saas-tech.connpass.com/event/243204/]
というイベントにてLTをさせていただきました！このイベントは、SaaSのTech領域に特化したイベントになっていて、いままでありそうでなかったイベントだと思います。ここ数年はSaaSとクラウドのことばっかりをやってきたので、個人的に激アツです！日本でもSaaSビジネス系のお話は、書籍もイベントもそこそこある感じがしますが、Techのものはほぼ皆無だと思いますので、とっても貴重なイベントだと思っています！

ここに登壇させていただいてとても嬉しかったのでブログにしてみました。

このときのテーマは「マルチテナント」ということでしたので、「マルチテナントにおけるデータ分離（仮）」のお話をさせていただきました。もちろん、ぼくじゃない登壇者のみなさまのお話も、全てとても参考になるものだったのでぜひ見ていただくことをオススメします！

ぼくの登壇資料はこちらです！
h]]></description><link>https://tech.anti-pattern.co.jp/test1/</link><guid isPermaLink="false">Ghost__Post__62554b90a35ab30001cab44c</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Wed, 01 Jun 2022 10:09:56 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！矢ヶ崎です！</p><p>2022/04/20 に、<a href="https://saas-tech.connpass.com/event/243204/">「SaaSにおけるマルチテナント設計の悩みと勘所 | SaaS.tech #2 」</a>というイベントにてLTをさせていただきました！このイベントは、SaaSのTech領域に特化したイベントになっていて、いままでありそうでなかったイベントだと思います。ここ数年はSaaSとクラウドのことばっかりをやってきたので、個人的に激アツです！日本でもSaaSビジネス系のお話は、書籍もイベントもそこそこある感じがしますが、Techのものはほぼ皆無だと思いますので、とっても貴重なイベントだと思っています！</p><p>ここに登壇させていただいてとても嬉しかったのでブログにしてみました。</p><p>このときのテーマは「マルチテナント」ということでしたので、「マルチテナントにおけるデータ分離（仮）」のお話をさせていただきました。もちろん、ぼくじゃない登壇者のみなさまのお話も、全てとても参考になるものだったのでぜひ見ていただくことをオススメします！</p><p>ぼくの登壇資料はこちらです！<a href="https://speakerdeck.com/yaggy/marutitenantoniokerutenantozeng-jia-shi-falsedetabesufen-li-falseti-yan-tan-li-jia">https://speakerdeck.com/yaggy/marutitenantoniokerutenantozeng-jia-shi-falsedetabesufen-li-falseti-yan-tan-li-jia</a></p><p>内容はざっくり言うと、SaaSを作って運用していて、マルチテナントでDBのスキーマ単位にデータを分離していて、パフォーマンスの問題が出てきたのでその解決として、スキーマによるテナント分離ではなく、行によるテナント分離へ変更したお話です。</p><p>動画を公開していただいておりますので、細かい内容はこちらをご覧ください！</p><p><a href="https://www.youtube.com/watch?v=L9Ek9g_oU9c">https://www.youtube.com/watch?v=L9Ek9g_oU9c</a></p><p>今回はLTで登壇させていただいたので、時間の都合で割愛させていただた部分があります。せっかくなのでここでもうちょっと細かく書いておきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-56.png" class="kg-image" alt="" loading="lazy" width="750" height="508" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-56.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-56.png 750w" sizes="(min-width: 720px) 720px"/></figure><p>このパーティションプルーニングの部分になります。</p><p>「パーティションプルーニング」は、”一致する可能性のないパーティションにはそもそも無駄にアクセスしないようにする”というイメージの機能です。大規模にパーティショニングされているときに特に有効になります。</p><p>当たり前といえば当たり前なのですが、このパーティションをプルーニング（刈り込み・絞り込み）するためには、SQL文のWHERE句でパーティションを特定できるような条件（partition_id = get_partition_id()など）が必要になってきます。基本的にこれはパーティションプルーニングを使いたい全てのSQLに必要となってきます。大変です・・・</p><p>今回はすでに行レベルセキュリティ(RLS)を使っているというお話をしました。ということは、USINGやWITH CHECKで指定しているRLSのポリシーを、ユーザから実行されたクエリに対して自動的に追加条件として付けているということになります。これをうまく利用して、今回はパーティションプルーニングに必要なパーティションの特定条件を、RLSのポリシーに記述して、パーティションプルーニングを自動的に有効にしました。</p><p>具体的には、例えば tenant_id(テナントを特定するID)でRLSをかけている場合でそのIDことにパーティショニングしている場合には、tenant_idからパーティションを特定する関数とパーティションIDを一致させる条件をRLSのポリシーに追記します。</p><p>例：</p><!--kg-card-begin: markdown--><p>CREATE POLICY public_t1_users ON t1<br>
FOR ALL<br>
USING (tenant_id = current_tenant_id() AND partition_id = get_partition_id(current_tenant_id()))<br>
WITH CHECK (tenant_id = current_tenant_id() AND partition_id = get_partition_id(current_tenant_id()));<br>
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;</br></br></br></br></p>
<!--kg-card-end: markdown--><p>こうすることにより、SQLを発行するユーザはRLSやパーティションを意識することなく、いつもどおりのイメージで実装することができます。</p><p>(インデックスの問題などがありますが、またそれは別の機会に)</p><p>ということで、今後はSaaSのテクニカルな内容に特化してポストしていきたいと思います！ひとつよろしくお願いいたします！</p><p>こちらからは以上です。</p>]]></content:encoded></item><item><title><![CDATA[Goでsliceの一部を抽出する時の注意点]]></title><description><![CDATA[sliceの構造
Goのsliceは 配列へのポインタ 長さ 容量 を持った構造体として定義されています。

go/slice.go at go1.18 · golang/goThe Go programming language. Contribute to
golang/go development by creating an account on GitHub.GitHubgolang
[https://github.com/golang/go/blob/go1.18/src/runtime/slice.go#L15-L19]type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

sliceの構造については以下の記事が分かりやすかったです。

実装して理解するスライス #golang - Qiitaはじめに この記事はGoアドベントカレンダーの1日目の記事です。 スライスの実態
runtimeのコードをみるとGoのスライスは以下のように定義されています。 type slice struct { arr]]></description><link>https://tech.anti-pattern.co.jp/gono/</link><guid isPermaLink="false">Ghost__Post__6236d97e80440a0001c073df</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 11 May 2022 01:47:34 GMT</pubDate><content:encoded><![CDATA[<h3 id="slice%E3%81%AE%E6%A7%8B%E9%80%A0">sliceの構造</h3><p>Goのsliceは <code>配列へのポインタ</code> <code>長さ</code> <code>容量</code> を持った構造体として定義されています。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/golang/go/blob/go1.18/src/runtime/slice.go#L15-L19"><div class="kg-bookmark-content"><div class="kg-bookmark-title">go/slice.go at go1.18 · golang/go</div><div class="kg-bookmark-description">The Go programming language. Contribute to golang/go development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">golang</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/640338d231efc92a09e661500232073568664757c8b6bb44186519a71034a063/golang/go"/></div></a></figure><pre><code>type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}</code></pre><p>sliceの構造については以下の記事が分かりやすかったです。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/tenntenn/items/5229bce80ddb688a708a"><div class="kg-bookmark-content"><div class="kg-bookmark-title">実装して理解するスライス #golang - Qiita</div><div class="kg-bookmark-description">はじめに この記事はGoアドベントカレンダーの1日目の記事です。 スライスの実態 runtimeのコードをみるとGoのスライスは以下のように定義されています。 type slice struct { array ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">tenntenn</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9JUU1JUFFJTlGJUU4JUEzJTg1JUUzJTgxJTk3JUUzJTgxJUE2JUU3JTkwJTg2JUU4JUE3JUEzJUUzJTgxJTk5JUUzJTgyJThCJUUzJTgyJUI5JUUzJTgzJUE5JUUzJTgyJUE0JUUzJTgyJUI5JTIwJTIzZ29sYW5nJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1lMzFlNGNjMzI5MGMxYmNkNWI5MjI4NGU2M2EyZDhlNA&amp;mark-x&#x3D;142&amp;mark-y&#x3D;112&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwdGVubnRlbm4mdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPThhZWFhZmJmNDY0YmRiYmMyZDI0OGQ3ZDY2ZjkwOTM5&amp;blend-x&#x3D;142&amp;blend-y&#x3D;491&amp;blend-mode&#x3D;normal&amp;s&#x3D;05b6fa035e4438ec4f5c5986abd2674a"/></div></a></figure><p>この構造をきちんと理解していなくてバグを踏んだので、その時調べたことをまとめました。</p><h3 id="slice%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E6%8A%BD%E5%87%BA">sliceの要素を抽出  </h3><p>sliceの要素の一部を抜き出したい時は以下のように書きます。</p><pre><code>	base := []int{1, 2, 3, 4}
	newSlice := base[1:2]</code></pre><p>この時の注意点として、元のsliceと新しく生成したsliceは同じ配列へのポインタを持っています。</p><p>例えば以下のようにsliceの一部を取り出し、別のsliceを作り、その中身を出力してみます。</p><pre><code>package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func main() {
	base := []int{1, 2, 3, 4}
	from1to2 := base[1:2]
	to2 := base[:2]
	from1 := base[1:]
	from2 := base[2:]
	all := base[:]
	empty := base[:0]
	appended := []int{}
	appended = append(appended, base...)

	printSliceHeader("base    ", base)
	printSliceHeader("from1to2", from1to2)
	printSliceHeader("to2     ", to2)
	printSliceHeader("from1   ", from1)
	printSliceHeader("from2   ", from2)
	printSliceHeader("all     ", all)
	printSliceHeader("empty   ", empty)
	printSliceHeader("appended", appended)
}

func printSliceHeader(n string, ss []int) {
	ptr := unsafe.Pointer(&amp;ss)
	s := (*reflect.SliceHeader)(ptr)
	fmt.Printf("%s : %#v\n", n, s)
}
</code></pre><p>実行すると以下のようになります。</p><pre><code>base     : &amp;reflect.SliceHeader{Data:0xc000134000, Len:4, Cap:4}
from1to2 : &amp;reflect.SliceHeader{Data:0xc000134008, Len:1, Cap:3}
to2      : &amp;reflect.SliceHeader{Data:0xc000134000, Len:2, Cap:4}
from1    : &amp;reflect.SliceHeader{Data:0xc000134008, Len:3, Cap:3}
from2    : &amp;reflect.SliceHeader{Data:0xc000134010, Len:2, Cap:2}
all      : &amp;reflect.SliceHeader{Data:0xc000134000, Len:4, Cap:4}
empty    : &amp;reflect.SliceHeader{Data:0xc000134000, Len:0, Cap:4}
appended : &amp;reflect.SliceHeader{Data:0xc000134020, Len:4, Cap:4}</code></pre><p>base, all, empty と from1to2, from1 はそれぞれ同じポインタを指しています。</p><p>要するに、最初にbaseを生成した時に配列aが作られ、all, empty は配列aの0番目を指し、from1to2, from1 は配列aの1番目を指し、from2 は配列aの2番目を指している、ということです。</p><p>appendedは別のsliceとして生成したので、全く別の配列を指しています。</p><p>そのため、一つのsliceの要素を変更すると全てのsliceに影響があります。</p><pre><code>	base[1] = 9

	fmt.Println("base     :", base)
	fmt.Println("from1to2 :", from1to2)
	fmt.Println("to2      :", to2)
	fmt.Println("from1    :", from1)
	fmt.Println("from2    :", from2)
	fmt.Println("all      :", all)
	fmt.Println("empty    :", empty)
	fmt.Println("appended :", appended)</code></pre><pre><code>base     : [1 9 3 4]
from1to2 : [9]
to2      : [1 9]
from1    : [9 3 4]
from2    : [3 4]
all      : [1 9 3 4]
empty    : []
appended : [1 2 3 4]</code></pre><p>意図せずsliceの値が変わってしまう可能性があるので気をつけたほうがよさそうです。</p><h3 id="slice%E3%81%AE%E4%B8%80%E9%83%A8%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%9F%E6%99%82%E3%81%AB%E3%81%A7%E3%81%8D%E3%82%8Bslice">sliceの一部を抽出した時にできるslice</h3><p>これまでの結果から、sliceを抽出した場合、長さは指定した添え字分の長さになっていそうです。</p><p>容量については、以下のように長さと容量の違うsliceを抽出してみると、</p><pre><code>	base := make([]int, 0, 4)
	base = append(base, 1, 2, 3)
	from1to2 := base[1:2]

	printSliceHeader("base    ", base)
	printSliceHeader("from1to2", from1to2)</code></pre><p>以下のようになります。</p><pre><code>base     : &amp;reflect.SliceHeader{Data:0xc00012a000, Len:3, Cap:4}
from1to2 : &amp;reflect.SliceHeader{Data:0xc00012a008, Len:1, Cap:3}</code></pre><p>容量は元のsliceから開始地点の添え字分を引いたものになってそうです。</p><p>以上より、長さ<code>len</code> 容量<code>cap</code> 配列へのポインタ<code>ptr</code> のsliceに対して<code>slice[from:to]</code> を実行すると、長さ<code>to-from</code> 容量<code>cap-from</code> 配列へのポインタ<code>ptr+from</code> のsliceができるようです。</p><p>より詳しいことは以下に書いてあります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://go.dev/ref/spec#Slice_expressions"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Go Programming Language Specification - The Go Programming Language</div><div class="kg-bookmark-description">Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Google logo</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://go.dev/images/go-logo-white.svg"/></div></a></figure><h3 id="append%E3%81%97%E3%81%A6%E9%85%8D%E5%88%97%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88">appendして配列を更新した場合</h3><p>sliceのcapを超えてappendするとsliceの指す配列自体が生成し直されるので、他のsliceに影響しなくなります。</p><pre><code>	printSliceHeader("base    ", base)
	base = append(base, 5)
	base[1] = 9

	printSliceHeader("base    ", base)
	printSliceHeader("from1to2", from1to2)
	printSliceHeader("to2     ", to2)
	printSliceHeader("from1   ", from1)
	printSliceHeader("from2   ", from2)
	printSliceHeader("all     ", all)
	printSliceHeader("empty   ", empty)
	printSliceHeader("appended", appended)
	fmt.Println("base     :", base)
	fmt.Println("from1to2 :", from1to2)
	fmt.Println("to2      :", to2)
	fmt.Println("from1    :", from1)
	fmt.Println("from2    :", from2)
	fmt.Println("all      :", all)
	fmt.Println("empty    :", empty)
	fmt.Println("appended :", appended)</code></pre><pre><code>base     : &amp;reflect.SliceHeader{Data:0xc0000ba000, Len:4, Cap:4}
base     : &amp;reflect.SliceHeader{Data:0xc0000c2040, Len:5, Cap:8}
from1to2 : &amp;reflect.SliceHeader{Data:0xc0000ba008, Len:1, Cap:3}
to2      : &amp;reflect.SliceHeader{Data:0xc0000ba000, Len:2, Cap:4}
from1    : &amp;reflect.SliceHeader{Data:0xc0000ba008, Len:3, Cap:3}
from2    : &amp;reflect.SliceHeader{Data:0xc0000ba010, Len:2, Cap:2}
all      : &amp;reflect.SliceHeader{Data:0xc0000ba000, Len:4, Cap:4}
empty    : &amp;reflect.SliceHeader{Data:0xc0000ba000, Len:0, Cap:4}
appended : &amp;reflect.SliceHeader{Data:0xc0000ba020, Len:4, Cap:4}
base     : [1 9 3 4 5]
from1to2 : [2]
to2      : [1 2]
from1    : [2 3 4]
from2    : [3 4]
all      : [1 2 3 4]
empty    : []
appended : [1 2 3 4]</code></pre>]]></content:encoded></item><item><title><![CDATA[Visual Studio Code de GitHub]]></title><description><![CDATA[今までGitHubはCLIで使っていて、まずはコマンドを覚えましょう！ってお話をしてたのですが、Visual Studio
Codeからぽちぽちやってみたら思った以上に便利だったので、CLIあまり使わなくなっちゃいました。
Gitわかりません、コマンドわかりませんというのもあれですので、Visual Studio
Codeでしか使えないという状態は良くないと思ってます。便利機能のご紹介という前提で読んでいただければ幸いです。

現在のブランチを確認
左下の赤枠部分に書いてあります


--------------------------------------------------------------------------------

ブランチをチェックアウト
左下の赤枠部分をクリック、上の赤枠部分にブランチが表示されます
表示されているブランチを選択するか、テキストボックスに対象のブランチを入力すると検索できます

リモートのブランチが表示されないんですけど！という場合は、
フェッチしてから確認すると表示されると思います


------------------------]]></description><link>https://tech.anti-pattern.co.jp/vs-kodowobian-li-nishi-imasiyou/</link><guid isPermaLink="false">Ghost__Post__6278f3c3a35ab30001cab6a0</guid><category><![CDATA[visual studio code]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[posse]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Mon, 09 May 2022 12:21:24 GMT</pubDate><content:encoded><![CDATA[<p>今までGitHubはCLIで使っていて、まずはコマンドを覚えましょう！ってお話をしてたのですが、Visual Studio Codeからぽちぽちやってみたら思った以上に便利だったので、CLIあまり使わなくなっちゃいました。<br>Gitわかりません、コマンドわかりませんというのもあれですので、Visual Studio Codeでしか使えないという状態は良くないと思ってます。便利機能のご紹介という前提で読んでいただければ幸いです。</br></p><p>現在のブランチを確認<br>左下の赤枠部分に書いてあります</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.38.42-1.png" class="kg-image" alt="" loading="lazy" width="1988" height="1123" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.38.42-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.38.42-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.38.42-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.38.42-1.png 1988w" sizes="(min-width: 720px) 720px"/></figure><hr><p>ブランチをチェックアウト<br>左下の赤枠部分をクリック、上の赤枠部分にブランチが表示されます<br>表示されているブランチを選択するか、テキストボックスに対象のブランチを入力すると検索できます</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.46.32.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.46.32.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.46.32.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.46.32.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.46.32.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>リモートのブランチが表示されないんですけど！という場合は、<br>フェッチしてから確認すると表示されると思います</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.50.24.png" class="kg-image" alt="" loading="lazy" width="1919" height="1055" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.50.24.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.50.24.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.50.24.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.50.24.png 1919w" sizes="(min-width: 720px) 720px"/></figure><hr><p>修正内容確認<br>左側が修正前、右が修正後です</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.53.31.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.53.31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.53.31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.53.31.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.53.31.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>このファイル修正した覚えがない。という場合は変更の破棄も出来ます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.56.04.png" class="kg-image" alt="" loading="lazy" width="1988" height="1123" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.56.04.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.56.04.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.56.04.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.56.04.png 1988w" sizes="(min-width: 720px) 720px"/></figure><hr><p>変更のコミット＆プッシュ<br>修正内容を確認して問題なかったらコミット＆プッシュします<br>赤枠部分にコミットメッセージを入力して、command + ENTER を押すとコミットされます</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.58.54.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-20.58.54.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-20.58.54.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-20.58.54.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-20.58.54.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>変更の同期を押すとプッシュされます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.00.13.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-21.00.13.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-21.00.13.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-21.00.13.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.00.13.png 2032w" sizes="(min-width: 720px) 720px"/></figure><hr><p>作業用ブランチ作成<br>左下の赤枠部分にベースとするブランチが表示されていることを確認して、クリックする<br>上の赤枠部分に作成するブランチ名を入力してENTERを押すと、新しい分岐の作成がされます</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.03.52.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-21.03.52.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-21.03.52.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-21.03.52.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.03.52.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>ローカルにブランチが作成されたことが確認できます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.07.11.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-21.07.11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-21.07.11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-21.07.11.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.07.11.png 2032w" sizes="(min-width: 720px) 720px"/></figure><p>テキストボックスにコミットメッセージを入力して、ブランチの発行を押すとリモートにブランチを作成出来ます<br>変更内容のプッシュ時にブランチ発行を併せて実施することも出来ます</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.08.21.png" class="kg-image" alt="" loading="lazy" width="2000" height="1149" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-21.08.21.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-21.08.21.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-21.08.21.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.08.21.png 2032w" sizes="(min-width: 720px) 720px"/></figure><hr><p>ローカルブランチを最新化する<br>developブランチのように他の人の修正が入るブランチで、最新を取得したいときはプルして下さい<br>左下の赤枠部分で最新化するブランチが選択されていることを確認してから、プルしてください</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.13.47.png" class="kg-image" alt="" loading="lazy" width="1920" height="1054" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2022-05-09-21.13.47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2022-05-09-21.13.47.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2022-05-09-21.13.47.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-09-21.13.47.png 1920w" sizes="(min-width: 720px) 720px"/></figure><p>基本的な操作は以上の手順でカバーできると思います。<br>ぽちぽち操作に興味ある人は是非使ってみて下さい。<br>念の為ですが、Gitについて理解しなくても使えるようになる！というものでは無いので、理解出来ていないなと思う人は本やネットの記事を読んで、理解してから使ってくださいませ。</br></br></p></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[Caddy 2を触ってみる]]></title><description><![CDATA[Caddyとは
Caddy 2 - The Ultimate Server with Automatic HTTPSCaddy is a powerful,
enterprise-ready, open source web server with automatic HTTPS written in GoThe
Ultimate Server with Automatic HTTPSCaddy Web Server [https://caddyserver.com/]
HTTPSを簡単に自動的に使えるようにしてくれる唯一のweb server (2022/05/03)

証明書を自動更新してくれる機能があり、defaultではLet's Encryptを使用。

A(AAAA)レコードを設定したあとに、Caddyfileに下記を書いておけば、あとはよろしくやってくれるというすぐれもの。

※ちなみにGo製

example.com

respond "Hello, kohe!"



Amazon EC2 (Amazon Linux2) ＆ Let's Encrypt
で試してみた
]]></description><link>https://tech.anti-pattern.co.jp/caddy/</link><guid isPermaLink="false">Ghost__Post__6270eb43a35ab30001cab59f</guid><category><![CDATA[caddy]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 05 May 2022 06:23:56 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_088-1.png" medium="image"/><content:encoded><![CDATA[<h2 id="caddy%E3%81%A8%E3%81%AF">Caddyとは</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://caddyserver.com/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Caddy 2 - The Ultimate Server with Automatic HTTPS</div><div class="kg-bookmark-description">Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://caddyserver.com/resources/images/favicon.png" alt="Caddy 2を触ってみる"><span class="kg-bookmark-author">The Ultimate Server with Automatic HTTPS</span><span class="kg-bookmark-publisher">Caddy Web Server</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://caddyserver.com/resources/images/caddy-open-graph.jpg" alt="Caddy 2を触ってみる"/></div></a></figure><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_088-1.png" alt="Caddy 2を触ってみる"/><p>HTTPSを簡単に自動的に使えるようにしてくれる唯一のweb server (2022/05/03)</p><p>証明書を自動更新してくれる機能があり、defaultではLet's Encryptを使用。</p><p>A(AAAA)レコードを設定したあとに、Caddyfileに下記を書いておけば、あとはよろしくやってくれるというすぐれもの。</p><p>※ちなみにGo製</p><pre><code>example.com

respond "Hello, kohe!"</code></pre><p/><h2 id="amazon-ec2-amazon-linux2-%EF%BC%86-lets-encrypt">Amazon EC2 (Amazon Linux2) ＆ Let's Encrypt</h2><p>で試してみた</p><p>今回はblog.0x0-dev.co.uxというドメインを使って試してみる。</p><p>Aレコードを設定後、Caddyをinstall</p><p>公式の通りyumでcaddyを入れようとしたがうまく入らなかったため、</p><pre><code>curl -sS https://webinstall.dev/caddy | bash</code></pre><p>を実行後、Caddyfileを作成	</p><p>Caddyfile</p><pre><code>blog.0x0-dev.co.uk

respond "Hello, kohe!"</code></pre><p/><p>同一ディレクトリで</p><p><code>sudo ~/.local/bin/caddy run</code>　を実行。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_089.png" class="kg-image" alt="Caddy 2を触ってみる" loading="lazy" width="1917" height="762" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_089.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/Selection_089.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/Selection_089.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_089.png 1917w" sizes="(min-width: 720px) 720px"/></figure><p>なんてお手軽にHTTPSが使えるんだろうか。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_088.png" class="kg-image" alt="Caddy 2を触ってみる" loading="lazy" width="494" height="252"/></figure><h1 id="docker-compose">Docker compose</h1><p>いろいろ調べて見るとCaddyをdocker compose で動かしているものが少なかったので、ミニマムで動かしてみたいと思う。</p><p>今回は "Hello World!!"と書かれたindex.htmlファイルをcaddyで表示させる。</p><p>compose.yml</p><pre><code class="language-yaml">services:
  caddy:
    image: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "2019:2019"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - $PWD/site:/srv
      - $PWD/caddy_data:/data
      - $PWD/caddy_config:/config</code></pre><p/><p>Caddyfile</p><pre><code>{
	debug
	auto_https off
}
:80 {
	root * /srv
	file_server
}
</code></pre><p>※httpsの管理が簡単にできることがcaddyの良さだが、今回はlocalのdockerでとりあえず動かすようにしたので、offにしている。</p><p>これだけの設定であとは　docker compose upをしcurlを叩く動いていることが確認できる。</p><p/><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_863.png" class="kg-image" alt="Caddy 2を触ってみる" loading="lazy" width="513" height="83"/></figure><p>今回作ったものはこちら</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/caddy-simple"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/caddy-simple</div><div class="kg-bookmark-description">Contribute to kooooohe/caddy-simple development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Caddy 2を触ってみる"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/62b087b309f6da9f043ddc846249f7933c26a7e72ac25fc7bfae90ed3ca72ecb/kooooohe/caddy-simple" alt="Caddy 2を触ってみる"/></div></a></figure><p/>]]></content:encoded></item><item><title><![CDATA[TypeScript: Array.prototype.mapでundefinedを取り除いた配列を作成する]]></title><description><![CDATA[こんにちは、いわむらです

今回はTypeScriptを使ってundefinedが含まれない配列を作成する方法をご紹介しようと思います

今回はtypescript v4.6.2で動作検証を進めるのでもし上手く動かない場合はバージョンを確認していただきたいです

u
ndefinedが含まれない配列を作成したいにいたった理由なんですが、あるオブジェクトの特定プロパティのみの配列をループ処理を使って作成したい時に上手くいかずはまってました

サンプルのためにあるオブジェクトを名前プロパティが任意のユーザー型とします

type User = {
    /**
     * 
     * @type {number}
     * @memberof User
     */
    id: number;
    /**
     * 
     * @type {string}
     * @memberof User
     */
    name?: string;
}

ユーザーのリストを作成して名前を抽出した配列を作ろうと思います

まずはユーザーリストを作ります

c]]></description><link>https://tech.anti-pattern.co.jp/undefinedwo/</link><guid isPermaLink="false">Ghost__Post__6251406ca35ab30001cab41e</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Sun, 24 Apr 2022 12:30:48 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回はTypeScriptを使ってundefinedが含まれない配列を作成する方法をご紹介しようと思います</p><p>今回はtypescript v4.6.2で動作検証を進めるのでもし上手く動かない場合はバージョンを確認していただきたいです</p><p>undefinedが含まれない配列を作成したいにいたった理由なんですが、あるオブジェクトの特定プロパティのみの配列をループ処理を使って作成したい時に上手くいかずはまってました</p><p>サンプルのためにあるオブジェクトを名前プロパティが任意のユーザー型とします</p><pre><code class="language-typescript">type User = {
    /**
     * 
     * @type {number}
     * @memberof User
     */
    id: number;
    /**
     * 
     * @type {string}
     * @memberof User
     */
    name?: string;
}</code></pre><p>ユーザーのリストを作成して名前を抽出した配列を作ろうと思います</p><p>まずはユーザーリストを作ります</p><pre><code class="language-typescript">const user1: User = {
    id: 1,
    name: 'test1',
} as User

const user2: User = {
    id: 2,
    name: 'test2',
}

const user3: User = {
    id: 3,
    name: 'test3',
}

const userList = [user1, user2, user3];</code></pre><p>名前のみを抽出するメソッドを作成しようとしてArray.prototype.mapを使ってみるとundefinedが含まれるかもしれないからとエラーになります</p><pre><code>const getUserNames = (users: User[]): string[] =&gt; {
    return users.map((u: User) =&gt; u.name)
}
// Type '(string | undefined)[]' is not assignable to type 'string[]'</code></pre><p>そこでArray.prototype.filterでundefinedを取り除いてみます</p><p>Array.prototype.filterを利用したら上手くいくかと思ったのですがまた同じエラーでコンパイルが通りませんでした</p><pre><code class="language-typescript">const userNames = (userss: User[]): string[] =&gt; {
    return userss
            .map((u: User) =&gt; u.name)
            .filter(
                (name: string | undefined) =&gt; name !== undefined
            )
}</code></pre><p>Array.prototype.filterの戻り値をユーザ定義型ガードでstringだとすることで解消します</p><p>nameにundefinedが含まれているのでundefinedを除いた型であると記述します</p><pre><code class="language-typescript">const getUserNames = (users: User[]): string[] =&gt; {
    return users
            .map((u: User) =&gt; u.name)
            .filter(
                (name): name is Exclude&lt;typeof name, undefined&gt; =&gt; {
                    return name !== undefined
                }
            )
}</code></pre><p>これでコンパイルエラーがない状態で名前のみをもつ配列が作成できました</p><p>今回は文字列のみを対象としましたがidが任意プロパティであっても同じようにすることでnumber[]を返却するメソッドを作成できます</p><p>今回は以上になります。最後まで読んでいただきありがとうございました。</p>]]></content:encoded></item><item><title><![CDATA[MySQLでテーブルのカラムのNULLと空文字を同等に扱いたい場合の書き方]]></title><description><![CDATA[NULL許可しているカラムに空文字列が設定されており、
作成したSQLがうまく動いてなかったのでゴニョゴニョやってたけど、
ちょっと調べてみたらいい感じのやつ見つけたので忘れないよう残しておきます。

IFNULL(引数１,引数２) と NULLIF（引数１,引数２） という関数がありました。

IFNULLについては、引数１がNULLだった場合、引数２の内容を返す仕様となっています。

SELECT
 IFNULL('hoge', 'hoge hoge') hoge,
 IFNULL('', 'hoge hoge') 空文字列, 
 IFNULL(NULL, 'hoge hoge')　NULL;


実行すると以下結果となります。

+------+--------------+-----------+
| hoge | 空文字列      | 　NULL    |
+------+--------------+-----------+
| hoge |              | hoge hoge |
+------+--------------+-----------+


]]></description><link>https://tech.anti-pattern.co.jp/mysql_ifnull_nullif/</link><guid isPermaLink="false">Ghost__Post__6230746d80440a0001c07190</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 06 Apr 2022 10:04:26 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>NULL許可しているカラムに空文字列が設定されており、<br>
作成したSQLがうまく動いてなかったのでゴニョゴニョやってたけど、<br>
ちょっと調べてみたらいい感じのやつ見つけたので忘れないよう残しておきます。</br></br></p>
<p>IFNULL(引数１,引数２) と NULLIF（引数１,引数２） という関数がありました。</p>
<p>IFNULLについては、引数１がNULLだった場合、引数２の内容を返す仕様となっています。</p>
<pre><code>SELECT
 IFNULL('hoge', 'hoge hoge') hoge,
 IFNULL('', 'hoge hoge') 空文字列, 
 IFNULL(NULL, 'hoge hoge')　NULL;
</code></pre>
<p>実行すると以下結果となります。</p>
<pre><code>+------+--------------+-----------+
| hoge | 空文字列      | 　NULL    |
+------+--------------+-----------+
| hoge |              | hoge hoge |
+------+--------------+-----------+
</code></pre>
<p>NULLIFの場合、引数１と引数２が一致した場合、NULLが帰ってきます。</p>
<pre><code>select
 NULLIF('hoge', '')　hoge,
 NULLIF('hoge', 'hoge') hogehoge,
 NULLIF('hoge', NULL) hogeN,
 NULLIF('', NULL) N;
</code></pre>
<p>を実行すると以下結果となります。</p>
<pre><code>+---------+----------+----------+------+
| 　hoge  | hogehoge | hogeN    | N    |
+---------+----------+----------+------+
| hoge    | NULL     | hoge     |      |
+---------+----------+----------+------+
</code></pre>
<p>ということで、 <code>NULLIF(対象のカラム,'') IS NULL</code> と書くことで空文字列、NULLのレコードを抽出できるようになります。</p>
<!--kg-card-end: markdown--><p/><p/><p/><p/>]]></content:encoded></item><item><title><![CDATA[Amazon QuickSightと仲良くなるためのTips]]></title><description><![CDATA[こんにちは。小笹です。
最近は、Amazon QuickSightを使って事業の分析を行って経営に活かそうと頑張っています。

QuickSightとはAmazon Web Servicesが提供しているビジネスインテリジェンスツールです。詳しくは公式サイトをご覧くださいませ。
https://aws.amazon.com/jp/quicksight/

結論
Amazon QuickSightと仲良くなるにはデータセットの「計算フィールド」を上手く使うのが大事。

やりたいこと
AWSエンジニア特化型のマッチングプラットフォーム「engineed」では弊社独自の実技試験を提供させていただいています。その実技試験結果をもとに利用企業はユーザーに対してスカウトを送ることができるので、よりその人に合った良い機会をエンジニアに届けられると思っています。

その中で受験済みのユーザーと未受験のユーザーで、どういう差異が生まれているのかを分析したい気持ちになりました。(ex.スカウトの受信率など。)

なのでAmazon QuickSightでも受験しているかどうかのフラグを見たい気持ちになりま]]></description><link>https://tech.anti-pattern.co.jp/quicks/</link><guid isPermaLink="false">Ghost__Post__61a4c7ce3986b000013a7244</guid><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Wed, 06 Apr 2022 00:47:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは。小笹です。<br>
最近は、Amazon QuickSightを使って事業の分析を行って経営に活かそうと頑張っています。</br></p>
<p>QuickSightとはAmazon Web Servicesが提供しているビジネスインテリジェンスツールです。詳しくは公式サイトをご覧くださいませ。<br>
<a href="https://aws.amazon.com/jp/quicksight/">https://aws.amazon.com/jp/quicksight/</a></br></p>
<h2 id="%E7%B5%90%E8%AB%96">結論</h2>
<p>Amazon QuickSightと仲良くなるにはデータセットの「計算フィールド」を上手く使うのが大事。</p>
<h3 id="%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">やりたいこと</h3>
<p>AWSエンジニア特化型のマッチングプラットフォーム「engineed」では弊社独自の実技試験を提供させていただいています。その実技試験結果をもとに利用企業はユーザーに対してスカウトを送ることができるので、よりその人に合った良い機会をエンジニアに届けられると思っています。</p>
<p>その中で受験済みのユーザーと未受験のユーザーで、どういう差異が生まれているのかを分析したい気持ちになりました。(ex.スカウトの受信率など。)</p>
<p>なのでAmazon QuickSightでも受験しているかどうかのフラグを見たい気持ちになりました。</p>
<p>が、ユーザーのテーブルにはそのフラグは持っていませんでした。実技試験の結果が格納されるテーブルが存在しており、そことユーザーのテーブルがIDをもとに、リレーションが設定されているような構造でした。</p>
<p>プログラムを描く脳みそでこれを書き下すと、　　<br>
「ユーザーのテーブルと実技試験結果のテーブルを結合して、一つでも試験結果があれば受験済み、なければ未受験。」　　<br>
となるかと思います。</br></br></p>
<p>では、Amazon QuickSightで同じことを実現しようとするとどうするのが良いか、その時に使うが「計算フィールド」です。</p>
<h3 id="%E8%A8%88%E7%AE%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%A8%E3%81%AF">計算フィールドとは</h3>
<p>これは、任意の値に対して任意の関数を実行し、その結果をあたかも一つのレコードとして扱うことができる機能です。</p>
<p><a href="https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/working-with-calculated-fields.html">https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/working-with-calculated-fields.html</a></p>
<p>今回でいえば、「一つでも試験結果があれば受験済み、なければ未受験。」のところを「計算フィールド」で表現することができます。</p>
<p>管理画面からデータセットにアクセスし、 「計算フィールドを追加」ボタンで追加画面に遷移できます。</p>
<p>当然、データの持ち方にも依りますが、<code>isExamee</code>などの名前で計算フィールドの名前を設定し、</p>
<pre><code>isNotNull({試験結果})
</code></pre>
<p>のような内容で保存をします。</p>
<p>すると、ユーザーテーブルには実際には存在していない<code>isExamee</code>というカラムを扱うことができるようになります。</p>
<p>これにより分析が効率的に行えるようになります。</p>
<p><code>isNotNull</code>以外にも多くの関数が用意されているので、データをどう持っているかを意識しながら、なるべくプロダクトのデータ構造をいじらないで分析ができると、軽量なソフトウェアを保てるのではないかなと思ってます。</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GraphQL と Laravel で JWT を使おうとしたらハマったお話]]></title><description><![CDATA[何時間もハマったので共有したくてメモしました。あとから考えると、CORSを全然理解できていなかったのがハマった原因でした。
理解している自信ないけどまあ開発できてるし、、、みたいなものはちゃんと勉強しておかないですね。

利用言語とオリジンはこんな感じです
フロント
利用言語：Vue（Nuxt）、GraphQL
オリジン：https://xxx.posse-ap.com/
バックエンド
利用言語：PHP（Laravel）
オリジン：https://api.xxx.posse-ap.com/
フロントとバックエンドのオリジンが異なるので、CORSを意識した実装が必要になりますね

JWTのトークン取得からローカルストレージへの保存は問題なく実装できて、
ブラウザのローカルストレージに保管してあるJWTを、ヘッダーに詰めてバックエンドにリクエスト投げるところで問題が出ました。
実装は以下のようにしました

  const authMiddleware = new ApolloLink((operation, forward) => {
    // add the authorizatio]]></description><link>https://tech.anti-pattern.co.jp/graphqltolaraveldejwt/</link><guid isPermaLink="false">Ghost__Post__62319b6880440a0001c072d7</guid><category><![CDATA[GraphQL]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[JWT]]></category><category><![CDATA[CORS]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Wed, 16 Mar 2022 09:23:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/03/----------2022-03-16-18.25.39.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/03/----------2022-03-16-18.25.39.png" alt="GraphQL と Laravel で JWT を使おうとしたらハマったお話"/><p>何時間もハマったので共有したくてメモしました。あとから考えると、CORSを全然理解できていなかったのがハマった原因でした。<br>理解している自信ないけどまあ開発できてるし、、、みたいなものはちゃんと勉強しておかないですね。</br></p><p>利用言語とオリジンはこんな感じです<br>フロント<br>　利用言語：Vue（Nuxt）、GraphQL<br>　オリジン：https://xxx.posse-ap.com/<br>バックエンド<br>　利用言語：PHP（Laravel）<br>　オリジン：https://api.xxx.posse-ap.com/<br>フロントとバックエンドのオリジンが異なるので、CORSを意識した実装が必要になりますね</br></br></br></br></br></br></br></p><p>JWTのトークン取得からローカルストレージへの保存は問題なく実装できて、<br>ブラウザのローカルストレージに保管してあるJWTを、ヘッダーに詰めてバックエンドにリクエスト投げるところで問題が出ました。<br>実装は以下のようにしました</br></br></p><figure class="kg-card kg-code-card"><pre><code>  const authMiddleware = new ApolloLink((operation, forward) =&gt; {
    // add the authorization to the headers
    operation.setContext({
      headers: {
        authorization: 'Bearer ' + localStorage.getItem('token'),
      },
    })

    return forward(operation)
  })

  return {
    link: ApolloLink.from([cleanTypeName, authMiddleware, httpLink]),
    cache: new InMemoryCache(),
    defaultHttpLink: false,
  }
</code></pre><figcaption>apollo.config.js</figcaption></figure><p>これでGraphQLのapolloを使ってバックエンドに通信するときに、勝手にヘッダーにトークンがつくはず！簡単！！<br>早速通信してみます</br></p><p>通信ができていないようで画面が表示されません、ChromeのデベロッパーツールでNetworkタブを確認します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-33.png" class="kg-image" alt="GraphQL と Laravel で JWT を使おうとしたらハマったお話" loading="lazy" width="989" height="523" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-33.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-33.png 989w" sizes="(min-width: 720px) 720px"/></figure><p>思いっきり CORS error って出ているので確認していきます。ヘッダーにトークンつける前はもちろんちゃんと動いていました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-34.png" class="kg-image" alt="GraphQL と Laravel で JWT を使おうとしたらハマったお話" loading="lazy" width="791" height="440" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-34.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-34.png 791w" sizes="(min-width: 720px) 720px"/></figure><p>ヘッダーに origin とかの記載もないしなんだかすごく少ないです。<br>apolloの設定ファイルをいじったせいで、必要なヘッダー情報まで消えちゃったと思ったのですが、これが間違いでした。</br></p><p>ここからapollo.config.jsの書き方を変えて色々試しました。setContextすると他のヘッダーが消えちゃうのかな、、、でも検索して出てくるサンプルはみんな同じように書いてるんだけど。。。と調べてましたが、手詰まりになりました。<br>一旦諦めて、試しにaxiosでヘッダーにトークンつけて通信させてみると、同じ事象が発生しました。これでバックエンドが怪しくなりました。</br></p><p>とはいえ、対象の通信がサーバに行く前にヘッダー消えてるんですよね。なのでこの通信とは別に通信していたりするのかもと思い、preflight を確認してみました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-35.png" class="kg-image" alt="GraphQL と Laravel で JWT を使おうとしたらハマったお話" loading="lazy" width="789" height="425" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-35.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-35.png 789w" sizes="(min-width: 720px) 720px"/></figure><p>内容はこんな感じです。<br>ヘッダーにトークンをつける前後で比較してみると、修正後だけ <strong>access-control-request-headers </strong>にauthrizationがついていました。<br>Laravelでこれをチェックしていたりするのかと思って調べてみると、チェックしてました。こちらです。</br></br></p><figure class="kg-card kg-code-card"><pre><code>class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request)
            -&gt;header('Access-Control-Allow-Origin', '*')
            -&gt;header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            -&gt;header('Access-Control-Allow-Headers', 'Content-Type');
    }
}
</code></pre><figcaption>Cors.php</figcaption></figure><p>Access-Control-Allow-Headers で Content-Type だけ許可するようになっているので、ここに authorization を追加したら無事通信できました！</p><p>いやーはまりました。CORSについてしっかり勉強しろ！！って言われている気持ちになりました。</p>]]></content:encoded></item><item><title><![CDATA[guregu/dynamoのOneとOneWithContextの違い]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

Amazon DynamoDBを使った開発を最近しております。

O/Rマッパーにguregu/dynamoを使っているのですが、初めてなので非常に困惑してます！

そして、"One"と"OneWithContext"の違いについて調べた時のメモです
いまいちすっきりしませんしたが、メモとして残しておこうと思います！

それぞれのサンプルです。違いはcontextを渡すかどうか

 * One

func (s *sampleRepository) Get(ctx context.Context) (*domain.User, error) {
	var result domain.User
	if err := s.conn.Table("user").Get("id", 1).One(&result); err != nil {
		return nil, handleError(err)
	}
	return &result, nil
}


 * OneWithContext

func (s *sampleRepo]]></description><link>https://tech.anti-pattern.co.jp/gureguno/</link><guid isPermaLink="false">Ghost__Post__62135b4480440a0001c06fc3</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Thu, 03 Mar 2022 15:24:19 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>Amazon DynamoDBを使った開発を最近しております。</p>
<p>O/Rマッパーにguregu/dynamoを使っているのですが、初めてなので非常に困惑してます！</p>
<p>そして、&quot;One&quot;と&quot;OneWithContext&quot;の違いについて調べた時のメモです<br>
いまいちすっきりしませんしたが、メモとして残しておこうと思います！</br></p>
<p>それぞれのサンプルです。違いはcontextを渡すかどうか</p>
<ul>
<li>One</li>
</ul>
<pre><code>func (s *sampleRepository) Get(ctx context.Context) (*domain.User, error) {
	var result domain.User
	if err := s.conn.Table(&quot;user&quot;).Get(&quot;id&quot;, 1).One(&amp;result); err != nil {
		return nil, handleError(err)
	}
	return &amp;result, nil
}
</code></pre>
<ul>
<li>OneWithContext</li>
</ul>
<pre><code>func (s *sampleRepository) Get(ctx context.Context) (*domain.User, error) {
	var result domain.User
	if err := s.conn.Table(&quot;user&quot;).Get(&quot;id&quot;, 1).OneWithContext(ctx, &amp;result); err != nil {
		return nil, handleError(err)
	}
	return &amp;result, nil
}
</code></pre>
<p>そして、One、OneWithContextの実装<br>
retryとGetItemWithContextの引数にContextを指定しています<br>
<a href="http://">https://github.com/guregu/dynamo/blob/v1.13.0/query.go<br>
</br></a></br></br></p>
<pre><code>// One executes this query and retrieves a single result,
// unmarshaling the result to out.
func (q *Query) One(out interface{}) error {
	ctx, cancel := defaultContext()
	defer cancel()
	return q.OneWithContext(ctx, out)
}

func (q *Query) OneWithContext(ctx aws.Context, out interface{}) error {
	if q.err != nil {
		return q.err
	}

	// Can we use the GetItem API?
	if q.canGetItem() {
		req := q.getItemInput()

		var res *dynamodb.GetItemOutput
		err := retry(ctx, func() error {
			var err error
			res, err = q.table.db.client.GetItemWithContext(ctx, req)
			if err != nil {
				return err
			}
			if res.Item == nil {
				return ErrNotFound
			}
			return nil
		})
		if err != nil {
			return err
		}

// 抜粋
</code></pre>
<p>Oneの場合、空のコンテキストを使うのか。OneWithContextを呼ぶので処理は一緒っぽい</p>
<pre><code>func defaultContext() (aws.Context, context.CancelFunc) {
	if RetryTimeout == 0 {
		return aws.BackgroundContext(), (func() {})
	}
	return context.WithDeadline(aws.BackgroundContext(), time.Now().Add(RetryTimeout))
}
</code></pre>
<p>違いはリトライ設定が必要かどうか？</p>
<pre><code>func retry(ctx aws.Context, f func() error) error {
	var err error
	var next time.Duration
	b := backoff.WithContext(backoff.NewExponentialBackOff(), ctx)
	for {
		if err = f(); err == nil {
			return nil
		}

		if !canRetry(err) {
			return err
		}

		if next = b.NextBackOff(); next == backoff.Stop {
			return err
		}

		if err = aws.SleepWithContext(ctx, next); err != nil {
			return err
		}
	}
}
</code></pre>
<p>コードだけ見てもよく分かリませんでした。<br>
今後、実装する時に使ってみて、動作の違いを確認しようと思います。</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Visual Studio Codeのおすすめ拡張機能]]></title><description><![CDATA[おすすめの拡張機能教えて！と言われることがあるので、まとめてみました。基本こちらの拡張機能をインストールしてみてください！別の拡張機能使っててソッチのほうがいいんだけど。。。という場合は是非教えて下さい！


--------------------------------------------------------------------------------

Code Spell Checker

英単語のスペルチェックをしてくれて、おかしいところに波線引いてくれます
const firstVallue = 25;　のようにValueのスペルを間違うなんてことがなくなります
残念ながら日本語はチェックしてくれないようです


--------------------------------------------------------------------------------

Docker

コンテナの起動・停止や、イメージ、ボリュームなどを管理出来ます
コマンドラインでdocker-compose.ymlの場所に移動して、docker-compose up
など]]></description><link>https://tech.anti-pattern.co.jp/visual-studio-codeno/</link><guid isPermaLink="false">Ghost__Post__6202cbfd80440a0001c06e7c</guid><category><![CDATA[visual studio code]]></category><category><![CDATA[plugin]]></category><category><![CDATA[posse]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Tue, 08 Feb 2022 21:18:30 GMT</pubDate><content:encoded><![CDATA[<p>おすすめの拡張機能教えて！と言われることがあるので、まとめてみました。基本こちらの拡張機能をインストールしてみてください！別の拡張機能使っててソッチのほうがいいんだけど。。。という場合は是非教えて下さい！</p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-1.png" class="kg-image" alt="" loading="lazy" width="314" height="73"/></figure><p>Code Spell Checker</p><p>英単語のスペルチェックをしてくれて、おかしいところに波線引いてくれます<br>const firstVallue = 25;　のようにValueのスペルを間違うなんてことがなくなります<br>残念ながら日本語はチェックしてくれないようです</br></br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-2.png" class="kg-image" alt="" loading="lazy" width="422" height="73"/></figure><p>Docker</p><p>コンテナの起動・停止や、イメージ、ボリュームなどを管理出来ます<br>コマンドラインでdocker-compose.ymlの場所に移動して、docker-compose up<br>など打つ必要がなくなります<br>docker ps ってなんですか？と言われるのが怖いので、初めはコマンドを使ってもらえると嬉しいです</br></br></br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-3.png" class="kg-image" alt="" loading="lazy" width="292" height="68"/></figure><p>ERD Editor</p><p>ER図を簡単に書くことが出来ます。もちろんリレーションなども表現出来ます<br>情報はjson形式で出力されるので、このファイルもGit管理しちゃいましょう</br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-4.png" class="kg-image" alt="" loading="lazy" width="386" height="69"/></figure><p>Git Graph</p><p>Gitツリーを見やすくしてくれます<br>分岐元のブランチしている、途中で取り込んだブランチ、マージ先のブランチなど見ていくとGitの理解が進むかもしれません</br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-5.png" class="kg-image" alt="" loading="lazy" width="384" height="68"/></figure><p>Live Share</p><p>Visual Studio Codeの画面を他の人に共有できます<br>コード書くのが自信ない人は、書くのが得意な人（Jobber）に見てもらうのオススメです。いっぱい指摘されてイライラすると思いますが、ぐんぐんかけるようになるかもしれません</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-6.png" class="kg-image" alt="" loading="lazy" width="279" height="68"/></figure><p>Local History</p><p>何も考えずに git checkout . と打ったら、一生懸命書いたコードがなくなって悲しくなったことありませんか？<br>この拡張機能を入れれば大丈夫、変更を勝手に覚えててくれます（保存先は .history）<br>Gitにプッシュするときは .gitignore で除外するのを忘れずに</br></br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-7.png" class="kg-image" alt="" loading="lazy" width="383" height="68"/></figure><p>MySQL</p><p>書いたコードが上手く動かない。でもデータベースのデータを確認するのはめんどくさい。という方にはこちら<br>画面をぽちぽちやるだけで、表形式でデータを確認したり、自由に編集することが出来ます<br>PostgreSQLとか他のデータベースにも接続できます。便利</br></br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-8.png" class="kg-image" alt="" loading="lazy" width="391" height="65"/></figure><p>PHP Intelephense</p><p>PHPのコードをきれいに整形してくれるフォーマッタです<br>インデントも揃ってないようなコードは見ずらいので、今すぐきれいに整形して開発速度アップしましょう<br>command + shift + p を押してから、ドキュメントのフォーマットを選択してください</br></br></p><hr><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-9.png" class="kg-image" alt="" loading="lazy" width="295" height="72"/></figure><p>Prettier</p><p>一つ上のと同じでフォーマッタですが、HTML、CSS、JavaScriptなどをきれいに整形してくれます<br>ファイル保存時に自動的に整形するという設定もあるので、これを設定してさらなる開発速度アップを目指しましょう<br>command + , を押してから、Format on Save の設定項目を検索してチェックを入れてください</br></br></p><hr><p>使ってない拡張機能あったでしょうか<br>是非これらの拡張機能を使って、快適な開発をお楽しみいただければと思います</br></p></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[ユーザー体験をより良くするためにGoogle Chrome DevToolsで通信を制限して検証する]]></title><description><![CDATA[こんにちは、いわむらです
今回はGoogle ChromeのDevToolsで通信を制限することができるの知って最近よく使うようになったのでそちらをご紹介できればなと思います


最初に4G通信とwifiを利用した通信にどれぐらいの差があるかを知らなかったので本題のご紹介前に載せておきます


上り 下り レイテンシ wifi 270Mbps 280Mbps 15ms 4G 20Mbps 41Mbps 1000ms netflix提供の回線の速度テスト
[https://fast.com/ja/] できるサイト使って、自宅のwifiと、スマホで帯域を測ってみました
実際にGoogle
ChromeのDevToolsを使ってnetworkタブのthrottleを変更することで数値としてどれぐらい差が出て表示されるか計測してみようと思います


今回は弊社のコーポレートサイト [https://anti-pattern.co.jp/]を利用して確認します

特に何も絞ることなく表示すると約600msで表示されました(disable cacheはチェックしました)

では4Gを想定した状態で]]></description><link>https://tech.anti-pattern.co.jp/yuzati-yan-woyoriliang-kusurutamenigoogle-chrome-devtoolsdetong-xin-wang-nadowozhi-xian-sitejian-zheng-suru/</link><guid isPermaLink="false">Ghost__Post__61dbb6393986b000013a7923</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Sat, 29 Jan 2022 07:13:23 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです<br>今回はGoogle ChromeのDevToolsで通信を制限することができるの知って最近よく使うようになったのでそちらをご紹介できればなと思います</br></p><p><br>最初に4G通信とwifiを利用した通信にどれぐらいの差があるかを知らなかったので本題のご紹介前に載せておきます<br/></br></p><!--kg-card-begin: html-->    <table>
      <thead>
        <tr>
          <th width="10"/>
          <th width="45">上り</th>
          <th width="45">下り</th>
            <th width="45">レイテンシ</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>wifi</td>
          <td>270Mbps</td>
          <td>280Mbps</td>
          <td>15ms</td>
        </tr>
        <tr>
          <td>4G</td>
          <td>20Mbps</td>
          <td>41Mbps</td>
          <td>1000ms</td>
        </tr>
      </tbody>
    </table><!--kg-card-end: html--><p><a href="https://fast.com/ja/" rel="noopener noreferrer">netflix提供の回線の速度テスト</a> できるサイト使って、自宅のwifiと、スマホで帯域を測ってみました<br>実際にGoogle ChromeのDevToolsを使ってnetworkタブのthrottleを変更することで数値としてどれぐらい差が出て表示されるか計測してみようと思います<br/></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-10.png" class="kg-image" alt="" loading="lazy" width="1000" height="667" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-10.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-10.png 1000w" sizes="(min-width: 720px) 720px"/></figure><p>今回は弊社の<a href="https://anti-pattern.co.jp/">コーポレートサイト</a>を利用して確認します</p><p>特に何も絞ることなく表示すると約600msで表示されました(disable cacheはチェックしました)</p><p>では4Gを想定した状態でnetworkタブにthrottleを追加します</p><p>特にthrottleを追加していないとNo throttlingの選択状態になっている箇所があると思うのでこちらに確認したい状態の設定を追加して選択しましょう</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-11.png" class="kg-image" alt="" loading="lazy" width="766" height="113" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-11.png 766w" sizes="(min-width: 720px) 720px"/></figure><p>選択肢を開くとaddの項目があるので自身の追加したい項目を追加します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-12.png" class="kg-image" alt="" loading="lazy" width="1000" height="290" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-12.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-12.png 1000w" sizes="(min-width: 720px) 720px"/></figure><p>追加した後に元のnetworkタブに戻ることで選択することができます</p><p>選択してどれぐらいかかるか試してみると約1200msでした</p><p>600msの差で表示されることがわかりました</p><p>通信を絞るだけではなくCPUの性能も絞ることでより近いパフォーマンス図れそうだったのでPerformanceタブの方で計測する方法も記事にしたいなと思います。</p><p>ちなみにthrottleという単語の意味が最初わからず辞書を引いたら<strong>絞り弁</strong> とか <strong>絞める </strong>っていうのを知ってより理解しやすかったので知らない英単語はふわっと使うより一度調べてみるのも大事だなと思いました</p>]]></content:encoded></item><item><title><![CDATA[Fetch API を使って画像データなどを取得してダウンロードする]]></title><description><![CDATA[こんにちは、いわむらです

もうすぐIEのサポートを終了するということもあり色々と利用できるものが増えるなと思っています

その中でも使う頻度が増えそうなFetchを利用して画像データを取得しそれをダウンロードする処理をこの間試しに書いたのでそれを今回書こうかなと思います

今回利用するFetchについてはMDNに詳細が書いてあるのでそちらを確認してもらえればと思います

Fetch の使用 - Web API | MDNFetch API は、リクエストやレスポンスといった HTTP
のパイプラインを操作する要素にアクセスするための JavaScript インターフェイスです。グローバルの fetch()
メソッドも提供しており、簡単で論理的な方法で、非同期にネットワーク越しでリソースを取得することができます。MDN Web Docs
[https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch]
自分の方で作った処理がこんな感じになります

// TypeScript

const sampleUrl = ]]></description><link>https://tech.anti-pattern.co.jp/fetch-api-woshi-tutehua-xiang-detanadowoqu-de-sitedaunrodosuru/</link><guid isPermaLink="false">Ghost__Post__61dc21443986b000013a7aec</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Sat, 29 Jan 2022 06:27:01 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>もうすぐIEのサポートを終了するということもあり色々と利用できるものが増えるなと思っています</p><p>その中でも使う頻度が増えそうなFetchを利用して画像データを取得しそれをダウンロードする処理をこの間試しに書いたのでそれを今回書こうかなと思います</p><p>今回利用するFetchについてはMDNに詳細が書いてあるのでそちらを確認してもらえればと思います</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Fetch の使用 - Web API | MDN</div><div class="kg-bookmark-description">Fetch API は、リクエストやレスポンスといった HTTP のパイプラインを操作する要素にアクセスするための JavaScript インターフェイスです。グローバルの fetch() メソッドも提供しており、簡単で論理的な方法で、非同期にネットワーク越しでリソースを取得することができます。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.mozilla.org/favicon-48x48.cbbd161b.png"><span class="kg-bookmark-author">MDN Web Docs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png"/></div></a></figure><p>自分の方で作った処理がこんな感じになります</p><pre><code class="language-TypeScript">// TypeScript

const sampleUrl = `https://source.unsplash.com/EZpGDYWBAYA`

const downloadFile = async (url: string): Promise&lt;void&gt; =&gt; {
  try {
    const response = await fetch(url)
    const blob = await response.blob()
    const downloadTag = document.createElement('a')
    downloadTag.href = URL.createObjectURL(blob)
    downloadTag.download = `sample.png`
    downloadTag.click()
  } catch (error: AnyForError) {
    console.error(error.message)
  }
}

downloadFile(sampleUrl)</code></pre><p>sampleUrlはダウンロード先が必要だったので<a href="https://unsplash.com/">unsplash.com</a>を利用しています</p><p>処理の流れとしてはfetchで特にGETなどのリクエストを指定しないとデフォルトでGETリクエストになるため特に指定はせずfetchの引数にurlだけ渡しています</p><p>レスポンスが返ってきたら返ってきた内容をblob型にしています</p><p>ダウンロードするためにまずaタグを作成します</p><p>そしてブラウザ内にあるblobのメモリ位置をURLにしてそれをダウンロードのhrefにしています</p><p>ダウンロードするときにはファイル名を指定したいので<a href="https://developer.mozilla.org/ja/docs/Web/API/HTMLAnchorElement/download">download属性</a>を指定します。今回はサンプルなのでsample.pngとしておきます</p><p>あとは作成したaタグを擬似的にクリックさせればブラウザでダウンロードが開始されるという感じの流れになっています</p><p>axiosとかを入れなくても比較的簡単に書けるのでパッケージを削りたい場合などにはどんどん使っていきたいなと思います</p><p>今回は以上です！読んでいただきありがとうございました！</p>]]></content:encoded></item><item><title><![CDATA[Goのinterfaceのnilについて]]></title><description><![CDATA[

interfaceのnilチェックをしているのにメソッド呼び出し時にpanicが起きることがあり、その時に調べたことのメモです。

該当コードを簡略化して書くと以下のような感じです。

package main

import "fmt"

type Message interface {
	Str() string
}

var _ Message = &Text{}

type Text struct {
	text string
}

func (t *Text) Str() string {
	return t.text
}

func NewText(str string) *Text {
	if str == "" {
		return nil
	}
	return &Text{
		text: str,
	}
}


NewText() は引数が空文字の場合にnilを返します。

これに対して、以下のような Print() 関数を用意して実行すると、

func Print(m Message) {
	if m != nil {
		fmt.Println(m.Str]]></description><link>https://tech.anti-pattern.co.jp/go-interface/</link><guid isPermaLink="false">Ghost__Post__61ee845b3986b000013a7bf9</guid><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 26 Jan 2022 22:56:01 GMT</pubDate><content:encoded><![CDATA[<p/><p>interfaceのnilチェックをしているのにメソッド呼び出し時にpanicが起きることがあり、その時に調べたことのメモです。</p><p>該当コードを簡略化して書くと以下のような感じです。</p><pre><code>package main

import "fmt"

type Message interface {
	Str() string
}

var _ Message = &amp;Text{}

type Text struct {
	text string
}

func (t *Text) Str() string {
	return t.text
}

func NewText(str string) *Text {
	if str == "" {
		return nil
	}
	return &amp;Text{
		text: str,
	}
}
</code></pre><p><code>NewText()</code> は引数が空文字の場合にnilを返します。</p><p>これに対して、以下のような <code>Print()</code> 関数を用意して実行すると、</p><pre><code>func Print(m Message) {
	if m != nil {
		fmt.Println(m.Str())
	} else {
		fmt.Println("nil Message")
	}
}

func main() {
	Print(NewText("hello"))
	Print(NewText(""))
}
</code></pre><p>これはpanicになります。</p><pre><code>$ go run main.go 
hello
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x47e260]

goroutine 1 [running]:
main.(*Text).Str(0x4b1960)
        /app/main.go:16
main.Print({0x4b1940, 0x0})
        /app/main.go:30 +0x2e
main.main()
        /app/main.go:40 +0x54
exit status 2</code></pre><p><code>m.Str()</code> の前で <code>m</code> 自体を出力すると <code>&lt;nil&gt;</code> が表示されます。</p><pre><code>func Print(m Message) {
	if m != nil {
		fmt.Println(m)          // 追加
		fmt.Println(m.Str())
	} else {
		fmt.Println("nil Message")
	}
}
</code></pre><pre><code>$ go run main.go 
&amp;{hello}
hello
&lt;nil&gt;
panic: runtime error: invalid memory address or nil pointer dereference
...
</code></pre><p>調べてみると以下の記事を見つけました。</p><figure class="kg-card kg-embed-card"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftutuz-tech.hatenablog.com%2Fentry%2F2019%2F10%2F22%2F162231" title="インターフェース値のnilを扱うということ - 技術メモ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"/></figure><p>interfaceはtypeとvalueをという2つの要素を持っていて、両方nilの場合に <code>interface == nil</code> がtrueとみなされるようです。</p><p>自分のコードでは <code>NewText()</code> の返り値で <code>*Text</code> を指定しているので、関数でnilを返してもtypeは <code>*Text</code> になっていて <code>m != nil</code> がtrueになりメソッドが呼ばれていた、ということでした。</p><pre><code>func NewText(str string) *Text {
	if str == "" {
		return nil
	}
	return &amp;text{
		text: str,
	}
}</code></pre><p> <code>NewText()</code> の返り値を <code>Message</code> interfaceにすると期待通りの動きをします。</p><pre><code>func NewText(str string) Message {
	if str == "" {
		return nil
	}
	return &amp;text{
		text: str,
	}
}
</code></pre><pre><code>$ go run main.go 
hello
nil Message
</code></pre><p/><p>普段から雰囲気でコードを書いているとこういう時にハマるので気をつけようと思いました。</p>]]></content:encoded></item><item><title><![CDATA[koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話]]></title><description><![CDATA[いつの間にか、Secret ManagerとCloud Runの連携がPublic Previewではなくなっていたので、触ってみた。

Secret Manager | Google CloudSecurely store API keys, passwords, certificates,
and other sensitive data with Google Cloud’s Secret Manager.Google Cloud
[https://cloud.google.com/secret-manager]せっかくなので前からちょいと気になっていた ko を使ってbuild,pushをしていこうと思う。



ko を使用して Go アプリケーションを Cloud Run に迅速にデプロイ | Google Cloud Blog※この投稿は米国時間 2021 年 2
月 17 日に、Google Cloud blog
に投稿されたものの抄訳です。開発者がコンテナを使用して作業することが多くなるに従い、ソースコードからアプリケーションがデプロイされるまでの時間を短縮することの]]></description><link>https://tech.anti-pattern.co.jp/kodegcrniimagewopushsi-secrete-manager-woshi-tutele-nicloud-runnibian-shu-zhan-kai-sitahua/</link><guid isPermaLink="false">Ghost__Post__61d2e3213986b000013a7866</guid><category><![CDATA[Cloud Run]]></category><category><![CDATA[kohe]]></category><category><![CDATA[Secret Manager]]></category><category><![CDATA[Artifact Registry]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 06 Jan 2022 04:39:58 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_859.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_859.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/><p>いつの間にか、Secret ManagerとCloud Runの連携がPublic Previewではなくなっていたので、触ってみた。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/secret-manager"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Secret Manager | Google Cloud</div><div class="kg-bookmark-description">Securely store API keys, passwords, certificates, and other sensitive data with Google Cloud’s Secret Manager.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v84e6f6a61298bbae5bb110c196e834c7f21fe3fb34e722925433ddb936d280c9/cloud/images/favicons/onecloud/super_cloud.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"><span class="kg-bookmark-author">Google Cloud</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/></div></a></figure><p>せっかくなので前からちょいと気になっていた <code>ko</code> を使ってbuild,pushをしていこうと思う。</p><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/blog/ja/products/containers-kubernetes/ship-your-go-applications-faster-cloud-run-ko"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ko を使用して Go アプリケーションを Cloud Run に迅速にデプロイ | Google Cloud Blog</div><div class="kg-bookmark-description">※この投稿は米国時間 2021 年 2 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。開発者がコンテナを使用して作業することが多くなるに従い、ソースコードからアプリケーションがデプロイされるまでの時間を短縮することの重要性が増しています。コンテナ イメージのビルドをより迅速か</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cloud.google.com/blog/static/assets/apple-icon.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"><span class="kg-bookmark-author">Google Cloud Blog</span><span class="kg-bookmark-publisher">Google Cloud Japan Team</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://storage.googleapis.com/gweb-cloudblog-publish/images/GCP_Containers_Kubernetes.max-2200x2200.jpg" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/google/ko"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - google/ko: Build and deploy Go applications on Kubernetes</div><div class="kg-bookmark-description">Build and deploy Go applications on Kubernetes. Contribute to google/ko development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">google</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/7a1c3d7476e9ad77104e91f4b3300ffee462179fe9aff05e4585a6fa8820f889/google/ko" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/></div></a></figure><p>またGCRにpushしようとしたところ、GCRはすでに古く <code>Artifact Registry</code></p><p>となるものが出ていたので、こちらも触ってみる。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr?hl&#x3D;ja&amp;_ga&#x3D;2.89322835.-959758453.1631669782"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Container Registry からの移行 | Artifact Registry のドキュメント | Google Cloud</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v84e6f6a61298bbae5bb110c196e834c7f21fe3fb34e722925433ddb936d280c9/cloud/images/favicons/onecloud/super_cloud.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"><span class="kg-bookmark-author">Google Cloud</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png?hl&#x3D;ja" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/></div></a></figure><blockquote>&gt;コンテナ イメージ、Java パッケージ、Node.js モジュールなど、複数のアーティファクト形式。</blockquote><p>個人的に気になった主な違いは、コンテナイメージ以外のpkg類を保存できるようになっているのと、リージョン単位でもリポジトリを使えるようになっていること。</p><h2 id="%E4%BD%99%E8%AB%87">余談</h2><p>ドキュメントを読んでいて知ったのだが、`mirror.gcr.io` というものがあり、Docker Hubで頻繁にアクセスされる公開イメージはキャッシュされているらしい。これをうまく使えば、Dockerのpull 制限をうまく回避できそうで今後使っていこうと思った。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/container-registry/docs/pulling-cached-images?hl&#x3D;ja"><div class="kg-bookmark-content"><div class="kg-bookmark-title">キャッシュに保存された Docker Hub イメージの pull | Container Registry のドキュメント | Google Cloud</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v84e6f6a61298bbae5bb110c196e834c7f21fe3fb34e722925433ddb936d280c9/cloud/images/favicons/onecloud/super_cloud.png" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"><span class="kg-bookmark-author">Google Cloud</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png?hl&#x3D;ja" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話"/></div></a></figure><h1 id="%E5%AE%9F%E9%9A%9B%E3%81%AB%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F">実際に動かしていく</h1><p>今回はCloud Shellで全ての作業をしていく。</p><p>実際に動かすコードは下記になり、Secretの情報を画面に表示してみる。</p><h3 id="go">Go</h3><pre><code class="language-go">package main

import (
        "fmt"
        "log"
        "net/http"
        "os"
)

func main() {
        log.Print("starting server...")
        http.HandleFunc("/", handler)

        port := os.Getenv("PORT")
        if port == "" {
                port = "8080"
                log.Printf("defaulting to port %s", port)
        }

        log.Printf("listening on port %s", port)
        if err := http.ListenAndServe(":"+port, nil); err != nil {
                log.Fatal(err)
        }
}

func handler(w http.ResponseWriter, r *http.Request) {
        name := os.Getenv("TEST")
 
        fmt.Fprintf(w, "Hello %s!\n", name)
}</code></pre><h3 id="artifact-registry">Artifact Registry</h3><p>今回はkoという名前のリポジトリを、リージョンで作成。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_764.png" class="kg-image" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話" loading="lazy" width="687" height="310" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_764.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_764.png 687w"/></figure><h2 id="ko">ko</h2><p>いつもならここでDockerfileを準備してbuildし、Registryにpushするのだが、今回はkoを使う。そのため、Dockerfileの準備はしない。</p><pre><code>// koのinstall
go install github.com/google/ko@latest

// 対象のリポジトリ
export KO_DOCKER_REPO=us-east1-docker.pkg.dev/${YOUR_PROJECT_ID}/ko

// artifactのpermissionを得る
gcloud auth configure-docker us-east1-docker.pkg.dev
</code></pre><p>build &amp; push</p><p> <code>ko publish ./</code></p><p>そうすると、Artifact Registryにimageがpushされているのがわかる。</p><h2 id="secret-manager">Secret Manager</h2><p>これはメチャクチャ簡単で、今回は <code>AIUEO</code> という値を保存するSecretを作成。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_763.png" class="kg-image" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話" loading="lazy" width="1416" height="859" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_763.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/Selection_763.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_763.png 1416w" sizes="(min-width: 720px) 720px"/></figure><h2 id="cloud-run">Cloud Run</h2><p>あとはCloud Runで先程作成したimageとSecretを選択し、環境変数へと展開する。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_761.png" class="kg-image" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話" loading="lazy" width="594" height="670"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_760.png" class="kg-image" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話" loading="lazy" width="640" height="972" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_760.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_760.png 640w"/></figure><p/><h2 id="%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9">アクセス</h2><p>あとは、発行されるURLにアクセスすると、Secretが読み込まれて表示されているのが分かる。</p><p/><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_762.png" class="kg-image" alt="koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話" loading="lazy" width="964" height="117" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_762.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_762.png 964w" sizes="(min-width: 720px) 720px"/></figure>]]></content:encoded></item><item><title><![CDATA[AWS CDK と AWS App Runner でお手軽に個人サービスのバックエンド API を運用しているお話]]></title><description><![CDATA[いや〜。年の瀬ですね！今年って１１月ってありました？っていうくらい一気に年末ですね。

ということで、 これは CDK Advent Calendar 2021
[https://qiita.com/advent-calendar/2021/aws-cdk] の 20 日目の記事になります！

re:Invent 前にですが、AWS App Runner がアプリケーションの構築とデプロイのための AWS CDK のサポートを開始
[https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-app-runner-aws-cdk-build-deploy-applications/] 
ということで、 CDK から App Runner が簡単に扱えるようになりました。ちょうど個人的にちょっとしたツールを作っており、 API
サーバ側をどのようにしようかな？と考えていたところでした。

ECS 使うのもいいんだけど、個人サービスなのに結構費用かかっちゃうし、ちょっとオーバースペックだよな〜。EKS はもっとだし〜。とか、 Lamb]]></description><link>https://tech.anti-pattern.co.jp/cdk-apprunner/</link><guid isPermaLink="false">Ghost__Post__61a761f43986b000013a742d</guid><category><![CDATA[AWS]]></category><category><![CDATA[App Runner]]></category><category><![CDATA[CDK]]></category><category><![CDATA[DynamoDB]]></category><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Sun, 19 Dec 2021 15:49:14 GMT</pubDate><content:encoded><![CDATA[<p>いや〜。年の瀬ですね！今年って１１月ってありました？っていうくらい一気に年末ですね。</p><p>ということで、 これは <a href="https://qiita.com/advent-calendar/2021/aws-cdk">CDK Advent Calendar 2021</a> の 20 日目の記事になります！</p><p>re:Invent 前にですが、<a href="https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-app-runner-aws-cdk-build-deploy-applications/">AWS App Runner がアプリケーションの構築とデプロイのための AWS CDK のサポートを開始</a> ということで、 CDK から App Runner が簡単に扱えるようになりました。ちょうど個人的にちょっとしたツールを作っており、 API サーバ側をどのようにしようかな？と考えていたところでした。</p><p>ECS 使うのもいいんだけど、個人サービスなのに結構費用かかっちゃうし、ちょっとオーバースペックだよな〜。EKS はもっとだし〜。とか、 Lambda で構成するのは良いけど、ちょっとクセが強い(そうでもない)から、ふつーにコンテナで作ったものデプロイするのがめんどくさいな〜。とか、 GCP の Cloud Run がちょうどいいんだけど、 DynamoDB 使いたいから GCP から DynamoDB 使うのもめんどくさいな〜。とかとか考えていた矢先だったので、これは App Runner を使うべきでしょ！っていうことで、 CDK + App Runner で作ることにしてみました。</p><p>そんなサービスとは、 <a href="https://chrome.google.com/webstore/detail/reviewppe/dpmkohbklalcbjlpkpodimlbdpfgplbk">Reviewppe</a>  という Chrome 拡張機能です。<br>(サービスの内容は、ページの最後に置いておきます)</br></p><p>そんなわけで、このツールのバックエンド API を CDK + App Runner で作っております。まだ自分のまわりの人以外ほぼ使っていないツールだとしても！</p><h2 id="%E3%81%A9%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F">どんな感じで作っているのか？</h2><p>全体としてはざっくり、App Runner と ECR そして DynamoDB をベースに作成しています。もちろん、 S3 や CloudWatch などの基本的な部分は利用していますが、 VPC も利用しないとてもシンプルなアーキテクチャです。</p><p>主要な部分だけでいうと、</p><pre><code>// Container Repository
const ecr = new ECRStack(app, `${pjPrefix}-ECR`, {
  repositoryName: "reviewppe-api",
  alarmTopic: monitorAlarm.alarmTopic,
  env: getProcEnv(),
});

// DynamoDB
const dynamo = new DynamoDBStack(app, `${pjPrefix}-DynamoDB`, {
  env: getProcEnv(),
});

// App Runner
const apprunner = new AppRunnerStack(app, `${pjPrefix}-AppRunner`, {
  ecrRepository: ecr.repository,
  env: getProcEnv(),
});
</code></pre><p>このような形でスタックを分けています。 alarmTopic は前もって準備しておきます。 getProcEnv() はアカウントとリージョンを表すものを返す仕組みです。</p><p>ECR の部分は、</p><pre><code>import * as cdk from "@aws-cdk/core";
import * as ecr from "@aws-cdk/aws-ecr";
import * as eventtarget from "@aws-cdk/aws-events-targets";
import * as sns from "@aws-cdk/aws-sns";

export interface ECRStackProps extends cdk.StackProps {
  repositoryName: string;
  alarmTopic: sns.Topic;
}

export class ECRStack extends cdk.Stack {
  public readonly repository: ecr.Repository;

  constructor(scope: cdk.Construct, id: string, props: ECRStackProps) {
    super(scope, id, props);

    // Create a repository
    this.repository = new ecr.Repository(this, props.repositoryName, {
      imageScanOnPush: true,
    });
    const target = new eventtarget.SnsTopic(props.alarmTopic);

    this.repository.onImageScanCompleted("ImageScanComplete").addTarget(target);
  }
}
</code></pre><p>このような感じで単純にリポジトリを作成しているだけです。リポジトリ名は動的に作成すると後に面倒なので、固定で作成しています。</p><p>DynamoDB を準備する部分は、</p><pre><code>import * as cdk from "@aws-cdk/core";
import * as dynamodb from "@aws-cdk/aws-dynamodb";

export class DynamoDBStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const reviewstable = new dynamodb.Table(this, "Reviews", {
      tableName: "Reviews",
      partitionKey: {
        name: "Reviewer",
        type: dynamodb.AttributeType.STRING,
      },
      sortKey: {
        name: "Datetime",
        type: dynamodb.AttributeType.NUMBER,
      },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      timeToLiveAttribute: "ttl",
    });

    reviewstable.addGlobalSecondaryIndex({
      indexName: "gsi-reviewee",
      partitionKey: {
        name: "Reviewee",
        type: dynamodb.AttributeType.STRING,
      },
      sortKey: {
        name: "Datetime",
        type: dynamodb.AttributeType.NUMBER,
      },
    });

    const その他テーブル = new dynamodb.Table(this, "etc...", {
      同じ感じ
    });
  }
}
</code></pre><p>こんな感じにしています。なるべく個人のインフラ費用をかけないために、全テーブルに TTL を設定しています。 CDK (IaC) の時点でテーブル構造まで定義するべきかどうかは悩んだポイントです。インフラorアーキテクチャ側の責務として考えるのか、アプリケーション側の責務として考えるのかで CDK で実装するのではなく、アプリケーションの初期化時や、デプロイ時に DB Migration で項目定義するなども考えましたが、やはり個人サービスですし、さらに DynamoDB なのでインフラ・アプリの境界を考えてしまうとうまくいかない (アクセスパターンにより項目や設定も決めるべき) ので、今回は境界を考えずに CDK の中で項目まで定義することにしました。</p><p>このあたりまでは、まあふつー、っていう感じかと思います。</p><p>今回新たに CDK に対応した App Runner の部分ですが、</p><!--kg-card-begin: markdown--><pre><code>import * as cdk from &quot;@aws-cdk/core&quot;;
import * as ecr from &quot;@aws-cdk/aws-ecr&quot;;
import * as iam from &quot;@aws-cdk/aws-iam&quot;;
import * as apprunner from &quot;@aws-cdk/aws-apprunner&quot;;

export interface AppRunnerStackProps extends cdk.StackProps {
  ecrRepository: ecr.Repository;
}

export class AppRunnerStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: AppRunnerStackProps) {
    super(scope, id, props);

    // Roles
    const instanceRole = new iam.Role(this, &quot;AppRunnerInstanceRole&quot;, {
      assumedBy: new iam.ServicePrincipal(&quot;tasks.apprunner.amazonaws.com&quot;),
      // あといい感じに実行時のポリシーを設定
    });

    const accessRole = new iam.Role(this, &quot;AppRunnerAccessRole&quot;, {
      assumedBy: new iam.ServicePrincipal(&quot;build.apprunner.amazonaws.com&quot;),
      // ここもいい感じにビルド時のポリシーを設定
    });

    new apprunner.Service(this, &quot;Service&quot;, {
      source: apprunner.Source.fromEcr({
        imageConfiguration: { port: 8080 },
        repository: props.ecrRepository,
        tag: &quot;latest&quot;,
      }),
      instanceRole: instanceRole,
      accessRole: accessRole,
    });
  }
}
</code></pre>
<!--kg-card-end: markdown--><p>このようにシンプルに作っています。直前で作成した ECR と結びつけを行って、適切な権限を持ったロールを結びつけているだけです。 Auto Scaling や Health Check などなどは CDK の L2 Construct にお任せです！いまのところ変更は必要なさそうです。<br>(当たり前ですが、ちゃんと動作するコンテナを ECR に置くまでは App Runner は動作しません)</br></p><p>今回、 API は Go で実装しているため Managed Runtime は使いません。 ローカルでビルドしたコンテナを ECR にプッシュし、手動でデプロイを行います。個人で作っているサービスのため、 CI/CD (特にCD) はオーバースペックなので用意していません。特に App Runner を使うと git commit / push と同じ感じでコンテナイメージのビルドとプッシュを行うだけなのでお手軽です。(逆に複雑なことは出来ないとも言います)。さらに、App Runner を使うと、<strong>コンテナベースのアプリケーションでも VPC も ELB も意識することがないのでとても快適</strong>です！個人でのサービス開発にはとても向いていると思います。</p><p>ちなみに Dockerfile はこのようなふつーの感じのマルチステージビルドです</p><pre><code class="language-Dockerfile">FROM golang:buster as gobuilder
WORKDIR /app
COPY . /app
RUN go mod tidy
RUN go build -ldflags="-w -s" -o /go/bin/app
RUN go generate
RUN go get github.com/cosmtrek/air
CMD ["air"]

FROM gcr.io/distroless/base
COPY --from=gobuilder /go/bin/app /
COPY .env /
COPY static /static
CMD ["/app"]
</code></pre><p>このような<strong>シンプルな CDK の構成 ＋ いつもと同じ作り方のコンテナアプリケーションで、簡単にプロダクションレディーの Web アプリケーション(API)が作成できてしまいました</strong>！もちろん、複数コンテナ(サイドカーとか)を使うような場合はこのような感じには行きませんが、ちょっとしたサービスを作るにはピッタリの組み合わせだなと思いました！<br>使うサービスやフレームワークまた技術の選定は、事業の規模やステージに応じて選定するべきですよね。そして、ステージが進んでいくに連れてアーキテクチャも変更を繰り返していくべきかと思います。今回の CDK + App Runner は、簡単さ、シンプルさ、スピード感、ふつーさ、かつ本番に耐えられる非機能要件もある程度備えており、事業の序盤にはとても適している組み合わせだなと思いました！</br></p><p>こんな感じでステージング環境と本番環境を同じ感じにサクッと CDK で作れました。とてもシンプルで便利だったのでおすすめです！</p><h2 id="%E4%BB%8A%E5%9B%9E%E4%BD%9C%E3%81%A3%E3%81%9F%E5%80%8B%E4%BA%BA%E7%9A%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-reviewppe-%E3%81%A8%E3%81%AF%EF%BC%9F">今回作った個人的サービス <a href="https://chrome.google.com/webstore/detail/reviewppe/dpmkohbklalcbjlpkpodimlbdpfgplbk">Reviewppe</a> とは？</h2><p>公開されている Web ページに対してコメントやレビューをし、作成者(の Twitter ユーザ)に対してその内容を送ることができるサービスです！</p><p>動作イメージは下の動画の感じになります</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/pnmHXEgw-28?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""/></figure><p><br>Web ページを製作中に、仲間からレビューを頼まれたとき、みなさんはどのようにレビューをしていますか？<br>・Google Document に画面キャプチャーを貼って、コメントを書く？ <br>・Slack などで、直接思ったことをつらつらと送る？ <br>・GitHub などで、直接プルリクエストを送る？ <br>お互いに、GitHub などをバリバリ使える Web エンジニアであれば、それを直接使うのが一番効率がよいかもしれません。しかし、Web サービスの作成はエンジニアだけでは完結できないことが多々あるかと思います。また、いま Web 製作の勉強中の人も一緒に作業していることもあるかと思います。そんなときに、 Web ページを直接レビューして、その結果を簡単に確認できると便利だと思い、この拡張機能は生まれました。<br>もしそのような用途がある方はぜひ使ってみて下さい！</br></br></br></br></br></br></p><p>こちらからは以上です。</p>]]></content:encoded></item><item><title><![CDATA[PostgreSQLのインデックス名などの長さ！]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

PostgreSQLのインデックス名など識別子の長さについて調べたメモです。

usersテーブルに長いインデックス名を作成します。

CREATE UNIQUE INDEX unique_index_looooooooooooooooooooooooooooooooooong__users_name_email_key
  ON users (name, email) 
  WHERE deleted_at IS NULL;


成功しますが、”識別子が切り捨てられます”とメッセージがでます。

test_db=> CREATE UNIQUE INDEX unique_index_looooooooooooooooooooooooooooooooooong__users_name_email_key
test_db->   ON users (name, email) 
test_db->   WHERE deleted_at IS NULL;
NOTICE:  identifier "unique_index_loooo]]></description><link>https://tech.anti-pattern.co.jp/postgresql-max-index-name/</link><guid isPermaLink="false">Ghost__Post__61b020543986b000013a74fd</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Wed, 15 Dec 2021 07:47:50 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>PostgreSQLのインデックス名など識別子の長さについて調べたメモです。</p>
<p>usersテーブルに長いインデックス名を作成します。</p>
<pre><code>CREATE UNIQUE INDEX unique_index_looooooooooooooooooooooooooooooooooong__users_name_email_key
  ON users (name, email) 
  WHERE deleted_at IS NULL;
</code></pre>
<p>成功しますが、”識別子が切り捨てられます”とメッセージがでます。</p>
<pre><code>test_db=&gt; CREATE UNIQUE INDEX unique_index_looooooooooooooooooooooooooooooooooong__users_name_email_key
test_db-&gt;   ON users (name, email) 
test_db-&gt;   WHERE deleted_at IS NULL;
NOTICE:  identifier &quot;unique_index_looooooooooooooooooooooooooooooooooong__users_name_email_key&quot; will be truncated to &quot;unique_index_looooooooooooooooooooooooooooooooooong__users_name&quot;
CREATE INDEX
</code></pre>
<p>統計情報コレクタ（pg_stat_user_indexes）で、今作成したインデックスを確認してみると、切り捨てられたインデックス名で作成されてます。</p>
<pre><code>  test_db=&gt; select * from pg_stat_user_indexes where indexrelname = 'unique_index_looooooooooooooooooooooooooooooooooong__users_name';
  -[ RECORD 1 ]-+--------------------------------------------------------
  relid         | 16528
  indexrelid    | 4934005
  schemaname    | engineed
  relname       | users
  indexrelname  | unique_index_looooooooooooooooooooooooooooooooooong__users_name
  idx_scan      | 0
  idx_tup_read  | 0
  idx_tup_fetch | 0
</code></pre>
<p>indexrelnameのtypeがnameとなっているのが分かります</p>
<pre><code>  test_db=&gt; \d+ pg_stat_user_indexes
                       View &quot;pg_catalog.pg_stat_user_indexes&quot;
      Column     |  Type  | Collation | Nullable | Default | Storage | Description 
  ---------------+--------+-----------+----------+---------+---------+---
   relid         | oid    |           |          |         | plain   | 
   indexrelid    | oid    |           |          |         | plain   | 
   schemaname    | name   |           |          |         | plain   | 
   relname       | name   |           |          |         | plain   | 
   indexrelname  | name   |           |          |         | plain   | 
   idx_scan      | bigint |           |          |         | plain   | 
   idx_tup_read  | bigint |           |          |         | plain   | 
   idx_tup_fetch | bigint |           |          |         | plain   | 
-抜粋- 
</code></pre>
<p>pg_typeカタログでデータ型の情報がわかるので、nameを確認すると、typlenが64になってます。</p>
<blockquote>
<p><a href="https://www.postgresql.jp/document/12/html/catalog-pg-type.html">https://www.postgresql.jp/document/12/html/catalog-pg-type.html</a></p>
</blockquote>
<pre><code>  test_db=&gt; select * from pg_type where typname = 'name';
  -[ RECORD 1 ]--+---------
  typname        | name
  typnamespace   | 11
  typowner       | 10
  typlen         | 64
  typbyval       | f
  typtype        | b
-抜粋-
</code></pre>
<p>PostgreSQLマニュアル &quot;4.1.1. 識別子とキーワード&quot;</p>
<pre><code>システムはNAMEDATALEN-1バイトより長い識別子を使いません。 より長い名前をコマンドで書くことはできますが、短く切られてしまいます。 デフォルトではNAMEDATALENは64なので、識別子は最長で63バイトです。 この制限が問題になる場合は、src/include/pg_config_manual.h内のNAMEDATALEN定数の値を変更して増やすことができます。
</code></pre>
<blockquote>
<p><a href="https://www.postgresql.jp/document/12/html/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">https://www.postgresql.jp/document/12/html/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS</a></p>
</blockquote>
<p>PostgreSQLマニュアル &quot;19.15. 設定済みのオプション&quot;</p>
<pre><code>max_identifier_length (integer)
最長の識別子の長さを報告します。 サーバ構築時のNAMEDATALENの値より一つ少なく設定されます。 デフォルトのNAMEDATALENの値は64ですので、デフォルトのmax_identifier_lengthは63バイトで、マルチバイト符号化方式を使用している場合、63文字以下になることがあります。
</code></pre>
<blockquote>
<p><a href="https://www.postgresql.jp/document/12/html/runtime-config-preset.html">https://www.postgresql.jp/document/12/html/runtime-config-preset.html</a></p>
</blockquote>
<p>NAMEDATALEN定数を変えてリコンパイルすると、pg_typeのnameレコードのtyplenが変更できそうです。</p>
<p>事の発端は、外部参照キー名称をこのように付けてました。（正確にはツールで自動生成してました）<br>
&quot;FK&quot; ＋ &quot;＿&quot; ＋ 外部参照するテーブル名 ＋ &quot;＿&quot; ＋ &quot;TO&quot; ＋ &quot;＿&quot; ＋ 自テーブル名<br>
インデックス名はこんな感じです。<br>
テーブル名 ＋ &quot;＿&quot; ＋ カラム名 ＋ &quot;＿&quot; ＋ &quot;key&quot;</br></br></br></p>
<p>設計中のテーブル名が長いため、設定したインデックス名、外部参照キー名が切り捨てられていることに気づき・・・。</p>
<p>nameという型を知ったので、勉強になった点はよかった！！</p>
<p>でも長いテーブル名はどうしようかな・・・見直そうかな。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Amazon Cognito でメールアドレス変更する際の注意点]]></title><description><![CDATA[Amazon Cognito のメールアドレス変更には以下のような問題があります。

Cognitoでメールアドレス編集するとログインできなくなる問題Zennハトすけ
[https://zenn.dev/dove/articles/78ecf08b51ee0c]> *
新しいメールアドレスを申請して、メールで検証をする前にその新しいメールでログインできてしまう
* 逆に検証が成功していないのに古いメールアドレスでログインできない
* つまり間違ったメールアドレスをリクエストするとその時点で詰む(ユーザーロックというらしい)
これを回避する方法は上の記事やissue [https://github.com/aws-amplify/amplify-js/issues/987]
にいくつか書かれています。

以下では、個人的にベターと思う方法を書きました。

今回Golangのサーバーで実装していますが、同じロジックでlambdaでの実装もできると思います。

基本的な方針は以下を参考にしました。

Change email with AWS Cognito and Amplify - Jo]]></description><link>https://tech.anti-pattern.co.jp/cognito-de/</link><guid isPermaLink="false">Ghost__Post__61a36b013986b000013a7161</guid><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 01 Dec 2021 10:15:22 GMT</pubDate><content:encoded><![CDATA[<p>Amazon Cognito のメールアドレス変更には以下のような問題があります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://zenn.dev/dove/articles/78ecf08b51ee0c"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cognitoでメールアドレス編集するとログインできなくなる問題</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://zenn.dev/images/icon.png"><span class="kg-bookmark-author">Zenn</span><span class="kg-bookmark-publisher">ハトすけ</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://res.cloudinary.com/zenn/image/upload/s--Zy3PDCqw--/co_rgb:222%2Cg_south_west%2Cl_text:notosansjp-medium.otf_37_bold:%E3%83%8F%E3%83%88%E3%81%99%E3%81%91%2Cx_203%2Cy_98/c_fit%2Cco_rgb:222%2Cg_north_west%2Cl_text:notosansjp-medium.otf_70_bold:Cognito%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E3%81%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%E5%95%8F%E9%A1%8C%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9yZXMuY2xvdWRpbmFyeS5jb20vemVubi9pbWFnZS9mZXRjaC9zLS1EQXJSUnA2VC0tL2NfbGltaXQlMkNmX2F1dG8lMkNmbF9wcm9ncmVzc2l2ZSUyQ3FfYXV0byUyQ3dfNzAvaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzVkMjNlN2Q4MzMuanBlZw&#x3D;&#x3D;%2Cr_max%2Cw_90%2Cx_87%2Cy_72/v1627274783/default/og-base_z4sxah.png"/></div></a></figure><blockquote>* 新しいメールアドレスを申請して、メールで検証をする前にその新しいメールでログインできてしまう<br>* 逆に検証が成功していないのに古いメールアドレスでログインできない<br>* つまり間違ったメールアドレスをリクエストするとその時点で詰む(ユーザーロックというらしい)</br></br></blockquote><p>これを回避する方法は上の記事や<a href="https://github.com/aws-amplify/amplify-js/issues/987">issue</a>にいくつか書かれています。</p><p>以下では、個人的にベターと思う方法を書きました。</p><p>今回Golangのサーバーで実装していますが、同じロジックでlambdaでの実装もできると思います。</p><p>基本的な方針は以下を参考にしました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://jordizle.com/lab/010be7e1-a34a-4a3c-821e-36f70f3290dc/change-email-with-aws-cognito-and-amplify/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Change email with AWS Cognito and Amplify - Jordizle</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://jordizle.com/static/img/icons/android-icon-192x192.png"><span class="kg-bookmark-author">Jordizle</span><span class="kg-bookmark-publisher">Jordan Leigh</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://jordizle.com/static/img/logo.jpg"/></div></a></figure><h3 id="%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%9B%B4%E4%BE%9D%E9%A0%BC">メールアドレス変更依頼</h3><p>リクエストを受け取る部分等は省いて、Cognitoにリクエストする部分だけ書きます。</p><pre><code>var client *cognitoidentityprovider.CognitoIdentityProvider
var userPoolID string

func RequestEmailUpdate(
	currentEmail string,
	requestedEmail string,
	accessToken string,
) error {
	// ユーザーに検証コードを送信するためにUpdateUserAttributesを呼ぶ
	updateInput := &amp;cognitoidentityprovider.UpdateUserAttributesInput{
		AccessToken: aws.String(accessToken),
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String(requestedEmail),
			},
		},
	}
	_, err := client.UpdateUserAttributes(updateInput)
	if err != nil {
		return err
	}
	// 検証コードを確認する前に"email"が更新されてしまうので、AdminUpdateUserAttributesで戻す
	// 更新予定のemailを"custom:requested_email"にセットしておく
	adminUpdateInput := &amp;cognitoidentityprovider.AdminUpdateUserAttributesInput{
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String(currentEmail),
			},
			{
				Name:  aws.String("email_verified"),
				Value: aws.String("true"),
			},
			{
				Name:  aws.String("custom:requested_email"),
				Value: aws.String(requestedEmail),
			},
		},
		UserPoolId: aws.String(userPoolID),
		Username:   aws.String(requestedEmail),
	}
	_, err = client.AdminUpdateUserAttributes(adminUpdateInput)
	if err != nil {
		return err
	}
	return nil
}</code></pre><h3 id="%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%9B%B4%E7%A2%BA%E8%AA%8D">メールアドレス変更確認</h3><pre><code>func ConfirmEmailUpdate(
	currentEmail string,
	accessToken string,
	code string,
) error {
	// "custom:requested_email"を取得
	usr, err := client.AdminGetUser(&amp;cognitoidentityprovider.AdminGetUserInput{
		UserPoolId: aws.String(userPoolID),
		Username:   aws.String(currentEmail),
	})
	if err != nil {
		return err
	}
	var requestedEmail string
	for _, attr := range usr.UserAttributes {
		if aws.StringValue(attr.Name) == "custom:requested_email" {
			requestedEmail = aws.StringValue(attr.Value)
			break
		}
	}
	// 検証コードを確認する
	verifyInput := &amp;cognitoidentityprovider.VerifyUserAttributeInput{
		AccessToken:   aws.String(accessToken),
		AttributeName: aws.String(emailAttribute),
		Code:          aws.String(code),
	}
	_, err = client.VerifyUserAttribute(verifyInput)
	if err != nil {
		return err
	}
	// 検証コードが確認できたので"email"を更新する
	// 使い終わった"custom:requested_email"を削除する
	adminUpdateInput := &amp;cognitoidentityprovider.AdminUpdateUserAttributesInput{
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String(requestedEmail),
			},
			{
				Name:  aws.String("email_verified"),
				Value: aws.String("true"),
			},
			{
				Name:  aws.String("custom:requested_email"),
				Value: aws.String(""),
			},
		},
		UserPoolId: aws.String(userPoolID),
		Username:   aws.String(currentEmail),
	}
	_, err = client.AdminUpdateUserAttributes(adminUpdateInput)
	if err != nil {
		return err
	}
	return nil
}
</code></pre><p/><p>Cognitoのカスタム属性に <code>"custom:requested_email"</code>を追加し、読み取り専用にしておきます。</p><!--kg-card-begin: markdown--><p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2021-11-28-21.10.59.png" alt="----------2021-11-28-21.10.59" loading="lazy"/></p>
<!--kg-card-end: markdown--><p>変更予定のメールアドレスに来たコードを検証するまでは、 <code>"custom:requested_email"</code>に値が追加されただけでそれ以外の情報は一切変わりません。そのため、コードを検証するまでは変更前のメールアドレスでログインできます。</p><p>この流れだと「検証コードが送られるメールアドレス」と「検証後に更新されるメールアドレス」が必ず一致するので、これが一番ベターかなと思います。</p><p>一時的にしか使わない値をclaimに保存するのは少しモヤっとしますが、ワークアラウンドなので仕方ないと思うことにします。</p><p>※2022/05/11追記</p><p>cognitoの仕様変更？で <code>VerifyUserAttribute</code> が成功した時にメールアドレスが変更予定の値に変更されるようになったようです。<code>requested_email</code> に保存する必要がなくなりましたが、検証する前に変更される挙動自体は変わっていないので、以下のようにしました。</p><pre><code>var client *cognitoidentityprovider.CognitoIdentityProvider
var userPoolID string

func RequestEmailUpdate(
	currentEmail string,
	requestedEmail string,
	accessToken string,
) error {
	// ユーザーに検証コードを送信するためにUpdateUserAttributesを呼ぶ
	updateInput := &amp;cognitoidentityprovider.UpdateUserAttributesInput{
		AccessToken: aws.String(accessToken),
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String(requestedEmail),
			},
		},
	}
	_, err := client.UpdateUserAttributes(updateInput)
	if err != nil {
		return err
	}
	// 検証コードを確認する前に"email"が更新されてしまうので、AdminUpdateUserAttributesで戻す
	adminUpdateInput := &amp;cognitoidentityprovider.AdminUpdateUserAttributesInput{
		UserAttributes: []*cognitoidentityprovider.AttributeType{
			{
				Name:  aws.String("email"),
				Value: aws.String(currentEmail),
			},
			{
				Name:  aws.String("email_verified"),
				Value: aws.String("true"),
			},
		},
		UserPoolId: aws.String(userPoolID),
		Username:   aws.String(requestedEmail),
	}
	_, err = client.AdminUpdateUserAttributes(adminUpdateInput)
	if err != nil {
		return err
	}
	return nil
}</code></pre><pre><code>func ConfirmEmailUpdate(
	currentEmail string,
	accessToken string,
	code string,
) error {
	// 検証コードを確認する
	verifyInput := &amp;cognitoidentityprovider.VerifyUserAttributeInput{
		AccessToken:   aws.String(accessToken),
		AttributeName: aws.String(emailAttribute),
		Code:          aws.String(code),
	}
	_, err = client.VerifyUserAttribute(verifyInput)
	if err != nil {
		return err
	}
	return nil
}
</code></pre>]]></content:encoded></item><item><title><![CDATA[pecoでdocker exec を快適にする]]></title><description><![CDATA[Dockerを使って開発していると、docker execすることが結構あると思いますが、地味に面倒なのでpecoを使って簡単に出来るようにしてみました。

pecoを使う前はこんな感じでdocker exec していると思います。

pecoを使うとこんな感じになります。

1文字打つだけでコンテナに入れます、早くて楽で良いですよね。

それでは設定していきたいと思います。
まずpecoをインストールします。
※今回はbrewを前提にしてますので、brewが使えない場合は別途brewをインストールしてください。（windowsの人はbrewないので手順変わります、ごめんなさい）

brew install peco

これだけでpecoが使えるようになります。pecoは別のコマンドの結果を受け取って選択できるようにしてくれる、そして選択した結果だけを返してくれるコマンドになります。

pecoが使えるようになったので、次のステップに行きます。
docker exec する際にコンテナIDが必要になるので、docker ps の結果からpecoで選択した行のコンテナIDを取得する。をや]]></description><link>https://tech.anti-pattern.co.jp/peco-de-docker-exec/</link><guid isPermaLink="false">Ghost__Post__61a7116c3986b000013a72ce</guid><category><![CDATA[docker]]></category><category><![CDATA[exec]]></category><category><![CDATA[peco]]></category><category><![CDATA[alias]]></category><category><![CDATA[awk]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Wed, 01 Dec 2021 07:13:01 GMT</pubDate><content:encoded><![CDATA[<p>Dockerを使って開発していると、docker execすることが結構あると思いますが、地味に面倒なのでpecoを使って簡単に出来るようにしてみました。</p><p>pecoを使う前はこんな感じでdocker exec していると思います。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Apr-12-2022-18-54-15-1.gif" class="kg-image" alt="" loading="lazy" width="786" height="640"/></figure><p>pecoを使うとこんな感じになります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Apr-12-2022-18-55-27.gif" class="kg-image" alt="" loading="lazy" width="786" height="640"/></figure><p>1文字打つだけでコンテナに入れます、早くて楽で良いですよね。</p><p>それでは設定していきたいと思います。<br>まずpecoをインストールします。<br>※今回はbrewを前提にしてますので、brewが使えない場合は別途brewをインストールしてください。（windowsの人はbrewないので手順変わります、ごめんなさい）</br></br></p><pre><code>brew install peco</code></pre><p>これだけでpecoが使えるようになります。pecoは別のコマンドの結果を受け取って選択できるようにしてくれる、そして選択した結果だけを返してくれるコマンドになります。</p><p>pecoが使えるようになったので、次のステップに行きます。<br>docker exec する際にコンテナIDが必要になるので、docker ps の結果からpecoで選択した行のコンテナIDを取得する。をやりたいと思います。</br></p><p>まず「docker ps の結果からpecoで選択した行」までのところは以下のコードになります。docker ps の結果を |（パイプ）でpecoに渡して上げればOKです</p><pre><code>$ docker ps | peco
dce26af62758   sample-ph3-quizy_app   "docker-php-entrypoi…"   3 days ago   Up 15 minutes   9000/tcp                            sample-ph3-quizy_app_1
</code></pre><p>こうすると選択した行だけの情報が取得できるようになります。<br>次は「docker ps の結果からpecoで選択した行のコンテナIDを取得する」までやります。<br>docker psの結果はコンテナIDの他に、イメージ コマンド などの情報も一緒に取得しちゃうので、コンテナIDだけ抜き出すという処理を書きます。<br>awkというコマンドを使って、スペース区切りの文字列の1つ目を取得。とすることでコンテナIDが取得で聞きます。コードは以下のようになります。</br></br></br></p><pre><code>$ docker ps | peco | awk "{print \$1}"
dce26af62758
</code></pre><p>欲しい情報が取れたので、あとはdocker exec に上手いこと渡して上げれば行けます。<br>docker exec コマンドを書いて、コンテナIDが入って欲しい所に先程のコマンドを入れてみます。コンテナIDを取得する所が先に動いてほしいので$()で囲って上げればOKです。コードは以下のようになります</br></p><pre><code>$ docker exec -it $(docker ps | peco | awk "{print \$1}") bash
root@dce26af62758:/work/backend# </code></pre><p>これで対象のコンテナを選択するだけで入れるようになりました。<br>毎回この長いコマンド打つのが面倒なので、alias（windowsの人は手順変わります、ごめんなさい）を設定します。</br></p><p>先程作った長いコマンドを、dというコマンドで登録して、d と打つだけでコンテナに入れるようにします。</p><pre><code>$ alias d='docker exec -it $(docker ps |peco|awk "{print \$1}") bash'
$ d
root@dce26af62758:/work/backend# exit
$ d
root@d5aeefadd2b9:/#</code></pre><p>これでdコマンドでコンテナに入れるようになりました。<br>ですが、ターミナルを新しく起動するとdコマンドが使えなくなっちゃいます。<br>これだと毎回aliasコマンドを実行しないといけないので、これも設定していきます。<br>設定としては、ターミナル起動時に自動的にaliasコマンドが実行されるようにします。</br></br></br></p><p>bash、zshなどシェルによって設定対象のファイルが変わってくるので、自分が使っているシェルの種類を確認します</p><pre><code>$ echo $SHELL
/bin/bash    # bashの場合
/bin/zsh     # zshの場合</code></pre><p>これで自分が使っているシェルの種類がわかるので、シェルに合わせた設定ファイルを修正します。（ファイルが存在しない場合もありますが、vi で新規作成しちゃって大丈夫です）</p><pre><code># bashの場合
vi ~/.bashrc

# zshの場合
vi ~/.zshrc</code></pre><p>上記ファイルにaliasコマンドを書きます。</p><pre><code>alias d='docker exec -it $(docker ps |peco|awk "{print \$1}") bash'
</code></pre><p>これでターミナル新しく起動しても、dコマンドが利用できるようになっているはずです！快適なDockerライフをどうぞ！！</p><p>_φ(･_･<br>その他Docker関係で、aliasに登録しておくと良さそうなコマンド書いておきます</br></p><pre><code>alias d='docker exec -it $(docker ps | peco | awk "{print \$1}") bash'
alias ds='docker stop $(docker ps | peco | awk "{print \$1}")'
alias dl='docker log $(docker ps | peco | awk "{print \$1}")'
alias dp='docker ps'
alias dr='docker run $1'
alias dcu='docker-compose up -d'
alias dcb='docker-compose build'
alias dcbn='docker-compose build --no-cache'
alias dcl='docker-compose logs'

# docker-compose downとは違う、動いてるコンテナをとりあえず全部止める
alias dcd='docker stop $(docker ps -q)'

# bashが使えないコンテナの場合はこちらのコマンドを使う
alias dsh='docker exec -it $(docker ps | peco | awk "{print \$1}") sh'</code></pre>]]></content:encoded></item><item><title><![CDATA[UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う]]></title><description><![CDATA[

動機
10年前から使っているデスクトップPCがある。いろいろガタが来ていたがBTOなので、OSの変更(windows7→Ubuntu20.04)、電源の交換(750w)、メモリの増設16GB→32GBによりパッチを当てて使っていたが、ついにPCの起動はまだしもcd
がめちゃくちゃ遅いことがきにってきたので、HDD から SSDへのcloneを行うことにした。

※おそらくfish shellでのgit情報の読み込みの兼ね合い

0からセットアップするのがめんどくさいためcloneを選択

移行前の起動時間は約127秒。遅い…

注意:
2TB HDD → 512GB SSDですが、実際にHDDに入っているデータが200GB程度とSSDの容量よりも少ないので今回の方法でいけます。

準備するもの
 * USB 16GB以上 (UbuntuのLive USB用）

Amazon | バッファロー【国内メーカー】 USBメモリ 32GB USB3.2(Gen1)/3.1(Gen 1)/3.0/2.0 充実サポート
RUF3-K32GA-BK/N【Amazon.co.jp限定】 | バッフ]]></description><link>https://tech.anti-pattern.co.jp/ubuntu-hdd2tbkarassd52/</link><guid isPermaLink="false">Ghost__Post__61878ece3986b000013a6ef6</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[SSD]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 10 Nov 2021 10:03:11 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_051.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_051.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/><p/><h2 id="%E5%8B%95%E6%A9%9F">動機</h2><p>10年前から使っているデスクトップPCがある。いろいろガタが来ていたがBTOなので、OSの変更(windows7→Ubuntu20.04)、電源の交換(750w)、メモリの増設16GB→32GBによりパッチを当てて使っていたが、ついにPCの起動はまだしもcd がめちゃくちゃ遅いことがきにってきたので、HDD から SSDへのcloneを行うことにした。</p><p>※おそらくfish shellでのgit情報の読み込みの兼ね合い</p><p>0からセットアップするのがめんどくさいためcloneを選択</p><p>移行前の起動時間は約127秒。遅い…</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/PXL_20211016_083344485.jpg" class="kg-image" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う" loading="lazy" width="2000" height="1500" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/PXL_20211016_083344485.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/PXL_20211016_083344485.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/PXL_20211016_083344485.jpg 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/04/PXL_20211016_083344485.jpg 2400w" sizes="(min-width: 720px) 720px"/></figure><h3 id="%E6%B3%A8%E6%84%8F">注意:</h3><p>2TB HDD → 512GB SSDですが、実際にHDDに入っているデータが200GB程度とSSDの容量よりも少ないので今回の方法でいけます。</p><h2 id="%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE">準備するもの</h2><ul><li>USB 16GB以上 (UbuntuのLive USB用）</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/gp/product/B00TMYO5LK/ref&#x3D;ppx_yo_dt_b_search_asin_title?ie&#x3D;UTF8&amp;psc&#x3D;1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon | バッファロー【国内メーカー】 USBメモリ 32GB USB3.2(Gen1)/3.1(Gen 1)/3.0/2.0 充実サポート RUF3-K32GA-BK/N【Amazon.co.jp限定】 | バッファロー | USBメモリ・フラッシュドライブ 通販</div><div class="kg-bookmark-description">バッファロー【国内メーカー】 USBメモリ 32GB USB3.2(Gen1)/3.1(Gen 1)/3.0/2.0 充実サポート RUF3-K32GA-BK/N【Amazon.co.jp限定】がUSBメモリ・フラッシュドライブストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料（一部除く）。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">USBメモリ・フラッシュドライブ 通販</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:355-2923208-0617050:RBM9TT57G0C1VZZK4SAW$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DRBM9TT57G0C1VZZK4SAW%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure><ul><li>SSD 512GB</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/gp/product/B08SVN8MVP/ref&#x3D;ppx_yo_dt_b_asin_title_o06_s00?ie&#x3D;UTF8&amp;psc&#x3D;1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon | Samsung 870 EVO 500GB SATA 2.5インチ 内蔵 SSD MZ-77E500B/EC 国内正規保証品 | 日本サムスン | パソコン・周辺機器 通販</div><div class="kg-bookmark-description">Samsung 870 EVO 500GB SATA 2.5インチ 内蔵 SSD MZ-77E500B/EC 国内正規保証品がパソコン・周辺機器ストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料（一部除く）。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">パソコン・周辺機器 通販</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:357-1661805-4176233:PTG9FVD63QP8E8A47DAM$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DPTG9FVD63QP8E8A47DAM%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure><ul><li>SSD,HDDをUSB接続できるようにするやつ</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/gp/product/B00H8OUQKA/ref&#x3D;ppx_yo_dt_b_asin_title_o06_s00?ie&#x3D;UTF8&amp;th&#x3D;1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon | センチュリー MOBILE BOX USB3.0接続 SATA6G CMB25U3RD6G マゼンタ/ブラック | センチュリー | パソコン・周辺機器 通販</div><div class="kg-bookmark-description">センチュリー MOBILE BOX USB3.0接続 SATA6G CMB25U3RD6G マゼンタ/ブラックがパソコン・周辺機器ストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料（一部除く）。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">パソコン・周辺機器 通販</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:357-9019658-4026646:DKKC816QD22JPRSAPWG2$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DDKKC816QD22JPRSAPWG2%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure><p>※事前にclone元のHDD等はバッグアップをとっておく</p><p/><h2 id="live-usb">Live USB</h2><p>今回はUbuntuを使ってUbuntuのLive USBを作成する</p><p>その時点の最新のLTSのUbuntuのImageを落としてきて、</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#1-overview"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Create a bootable USB stick on Ubuntu | Ubuntu</div><div class="kg-bookmark-description">Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://assets.ubuntu.com/v1/17b68252-apple-touch-icon-180x180-precomposed-ubuntu.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"><span class="kg-bookmark-author">Ubuntu</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://assets.ubuntu.com/v1/ebdfffbf-Aubergine_suru_background.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure><p>Bootable USBで作成する</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_049.png" class="kg-image" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う" loading="lazy" width="806" height="485" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/Selection_049.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_049.png 806w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AEclone">データのclone</h2><p>電源をきって対象のSSD USB変換ケースにいれてPCにさしたら、Live USBからUbuntuを起動し、お試し起動をする</p><p>※間違って、既存のHDDに上書きinstallをしないように注意</p><p>起動後、</p><p>Ubuntu SoftwareでGPartedをinstall</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_050.png" class="kg-image" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う" loading="lazy" width="1029" height="811" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/Selection_050.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/Selection_050.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_050.png 1029w" sizes="(min-width: 720px) 720px"/></figure><p/><p>細かい作業方法を下記をみていただきたいが、今回は2TB→512GBとなるめ、一回コピー元のパーティションサイズを512GB未満に縮小する必要がある。</p><p>また、clone後HDDは1パーティションストレージとして使い。</p><p>なので、手順的には</p><ul><li>HDDの対象パーティションを512GB未満に縮小＆分割</li><li>HDD→SDDとデータをclone</li><li>HDDのパーティションを2TBのパーティション1つとする</li></ul><p>ということになる。</p><p>GPatedは上記の操作を手順として記録してくれて、間違いないか確認後一気通貫に実行してくれるので便利である。</p><p>ちなみに今回この作業は約7hかかった。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://yulistic.gitlab.io/2018/03/replace-hdd-or-ssd-without-the-re-installation-of-ubuntu/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Replace HDD or SSD without the re-installation of Ubuntu · Yulistic.com</div><div class="kg-bookmark-description">Introduce a root partition migration to different storage (HDD or SSD) with Live USB.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://yulistic.gitlab.io/android-icon-192x192.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"><span class="kg-bookmark-author">Yulistic.com</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://yulistic.gitlab.io/img/2018-03-04/select_original_device.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure><p>SSDのデバイス名を確認後、それに合わせて下記コマンドを実行</p><pre><code>sudo mount /dev/sdc1 /mnt
sudo grub-install --root-directory=/mnt /dev/sdc
sudo umount /mnt
</code></pre><p>また、HDDのデバイスのUUIDを変更する</p><pre><code>sudo tune2fs /dev/sdc1 -U random
</code></pre><h2 id="%E8%B5%B7%E5%8B%95%E7%A2%BA%E8%AA%8D">起動確認</h2><p>Live USB,HDDを外し、SSD connected USBのみにし起動を確認。問題なく起動することを確認したら最後の準備にうつる。</p><p>もう一回Live USBを起動し、HDDを初期化する。</p><p>※今回の場合はHDDとSSDを直接両方指して起動すると、HDDが優先してきどうしてしまい、設定を変えても何故かSSD優先起動にならなかったのこの手順をふんでます。</p><p>SSDをPCに設置</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/cxpjfs.jpg" class="kg-image" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う" loading="lazy" width="1024" height="768" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/cxpjfs.jpg 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/cxpjfs.jpg 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/cxpjfs.jpg 1024w" sizes="(min-width: 720px) 720px"/></figure><p>あとは通常通り起動して動くことを確認できればOK。</p><p>HDDもストレージとして使えている。<br/></p><h2 id="%E7%B5%90%E6%9E%9C">結果</h2><p>移行後の速度は37秒と3~4倍にもなった。</p><p>操作も大分早くなり、かなり快適になった。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_048.png" class="kg-image" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う" loading="lazy" width="1797" height="962" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/Selection_048.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/Selection_048.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/Selection_048.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_048.png 1797w" sizes="(min-width: 720px) 720px"/></figure><p>参考</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://yulistic.gitlab.io/2018/03/replace-hdd-or-ssd-without-the-re-installation-of-ubuntu/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Replace HDD or SSD without the re-installation of Ubuntu · Yulistic.com</div><div class="kg-bookmark-description">Introduce a root partition migration to different storage (HDD or SSD) with Live USB.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://yulistic.gitlab.io/android-icon-192x192.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"><span class="kg-bookmark-author">Yulistic.com</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://yulistic.gitlab.io/img/2018-03-04/select_original_device.png" alt="UbuntuのHDD 2TBからSSD 512GBへのLarger HDD to Smaller SSD換装を行う"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[GitHub の Review のコメントが取得できたのでスプレッドシートに出力する]]></title><description><![CDATA[こおりやまです

前回、こちらで
GitHubのReviewコメントを抽出するクエリーを作成したので、そのクエリーを利用してスプレッドシートにレビュー、コメント情報を出力してみました。

GitHub GraphQL API を利用してReview のコメントを抽出してみたこおりやまです 以前、こちらのブログでPull requests
のコメント取得しましたが、Reviewコメントが取得できていなくクエリを再検討しました。 GitHub GraphQL API を利用してPull
requests のコメントを抽出してみたこおりやまです 以前、こちらのブログでGitHubGraphQL
APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests
のコメント取得が必要になりGoogleAppsScript（GAS）から呼び出しスプレッドシートに出力してみました。 GitHub GraphQL API
をさわってみ…Anti-Pattern Inc. Engineering BlogHiroki Kooriyama
[https://tech.anti]]></description><link>https://tech.anti-pattern.co.jp/https-ghost-tech-anti-pattern-co-jp-github-graphql-api-woli-yong-sitepull-requests-nokomentowochou-chu-sitemita-2/</link><guid isPermaLink="false">Ghost__Post__6178de723986b000013a6dae</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Mon, 08 Nov 2021 08:45:10 GMT</pubDate><content:encoded><![CDATA[<p>こおりやまです</p><p>前回、こちらで GitHubのReviewコメントを抽出するクエリーを作成したので、そのクエリーを利用してスプレッドシートにレビュー、コメント情報を出力してみました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/github-graphql-api-woli-yong-sitepull-requests-nokomentowochou-chu-sitemita-2/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub GraphQL API を利用してReview のコメントを抽出してみた</div><div class="kg-bookmark-description">こおりやまです 以前、こちらのブログでPull requests のコメント取得しましたが、Reviewコメントが取得できていなくクエリを再検討しました。 GitHub GraphQL API を利用してPull requests のコメントを抽出してみたこおりやまです 以前、こちらのブログでGitHubGraphQL APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests のコメント取得が必要になりGoogleAppsScript（GAS）から呼び出しスプレッドシートに出力してみました。 GitHub GraphQL API をさわってみ…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Hiroki Kooriyama</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><p>コードはこんな感じ。細かい部分は過去のブログにて確認お願いします。</p><pre><code>/***********************************************
 * 設定情報
 ***********************************************/
var ACCESS_TOKEN = "トークン情報";
var ENDPOINT = "https://api.github.com/graphql";
var REPOSITORY_NAME = "リポジトリ名";
var REPOSITORY_OWNER = "オーナー情報";
var LABELS = "ラベル";

/***********************************************
 * GitHubからPRの一覧取得
***********************************************/
function getGitHubPullRequestList(endCursor) {

  // 次ページの検索情報
  var pageCursor = "";
  if(endCursor != ""){
    // 次ページを検索させるための情報
    pageCursor = ",after: \"" + endCursor + "\""
  }


  // 作成日降順、ラベルを特定
//          pullRequests(first: 50' + pageCursor + ', labels: "' + LABELS + '", orderBy: {field: CREATED_AT, direction: DESC}) {\
  var query = '\
    {\
      repository(name: "' + REPOSITORY_NAME + '", owner: "' + REPOSITORY_OWNER + '") {\
          pullRequests(first: 50' + pageCursor + ', labels: "' + LABELS + '", orderBy: {field: CREATED_AT, direction: DESC}) {\
          edges {\
            node {\
              url\
              title\
              createdAt\
              updatedAt\
              number\
              author {\
                login\
              }\
            }\
          }\
          pageInfo {\
            hasNextPage\
            endCursor\
          }\
        }\
      }\
    }';
  
 
  var options = {
    'method' : 'post',
    'contentType' : 'application/json',
    'headers' : {
      'Authorization' : 'Bearer ' +  ACCESS_TOKEN
     },
    'payload' : JSON.stringify({query:query})
  };

  // fetch 情報を取得
  var response = UrlFetchApp.fetch(ENDPOINT, options); 

  // Json形式で返却
  return JSON.parse(response.getContentText());;
}


/***********************************************
 * GitHubからPRの一覧取得
***********************************************/
function getGitHubPullRequest(number) {

  // 対象の１PR情報取得
  var query = '\
    {\
      repository(name: "' + REPOSITORY_NAME + '", owner: "' + REPOSITORY_OWNER + '") {\
        pullRequest(number: ' + number + ') {\
          url\
          title\
          closed\
          createdAt\
          author {\
            login\
          }\
          reviews(first: 25) {\
            edges {\
              node {\
                state\
                bodyText\
                author {\
                  login\
                }\
                comments(first: 25) {\
                  edges {\
                    node {\
                      bodyText\
                      author {\
                        login\
                      }\
                      originalCommit {\
                        abbreviatedOid\
                        authoredDate\
                      }\
                    }\
                  }\
                }\
              }\
            }\
          }\
          comments(last: 25) {\
            nodes {\
              bodyText\
            }\
          }\
        }\
      }\
    }';
 
  var options = {
    'method' : 'post',
    'contentType' : 'application/json',
    'headers' : {
      'Authorization' : 'Bearer ' +  ACCESS_TOKEN
     },
    'payload' : JSON.stringify({query:query})
  };

  // fetch 情報を取得
  var response = UrlFetchApp.fetch(ENDPOINT, options); 

  // Json形式で返却
  return JSON.parse(response.getContentText());;
}



/***********************************************
 * main
 * GitHubからPRの一覧取得
***********************************************/
function main(){
  Logger.log("開始");
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');  
  var iRow = 2;
  var nextPageCursor = "";

  do{
    var allDocuments = getGitHubPullRequestList(nextPageCursor);
    var edges = allDocuments.data.repository.pullRequests.edges;  
    var changeRow = 0;
    var values = sheet.getRange("A:A").getValues();

    edges.forEach(function(edge){
      // Logger.log(edge);
      
      // 該当情報が存在する？
      iRow = findValueRowNo(values, edge.node.number);
      if (iRow&lt;1){
        // 存在しないので新規行作成
        iRow = sheet.getLastRow()+1;
        Logger.log("New:" + edge.node.number + ' Row:' + iRow);
      }
      sheet.getRange(iRow, 1, 1, 6).setValues([[edge.node.number,
                                                 edge.node.title,
                                                 edge.node.url,
                                                 edge.node.author.login,
                                                 edge.node.createdAt,
                                                 edge.node.updatedAt]]);


      var pullRequest = getGitHubPullRequest(edge.node.number);
      var pullRequestReviewEdges = pullRequest.data.repository.pullRequest.reviews.edges;
      
      // sheet.getRange(iRow, 6).setValue(JSON.stringify(pullRequestReviewEdges));
      //前回の抽出結果とコメント数が異なる場合
      if (sheet.getRange(iRow, 1).getValue() == "" ||
          sheet.getRange(iRow, 7).getValue() != pullRequestReviewEdges.length){
        changeRow++;

        //レビュー出力
        var iCol = 8;
        var reviewNo = 1;
        var reviewTitle = "";
        // レビュー数
        sheet.getRange(iRow, 7).setValue(pullRequestReviewEdges.length);
        pullRequestReviewEdges.forEach(function(v){
            if(v.node.bodyText!=""){
              reviewTitle = '[review' + reviewNo + ']\n';
              sheet.getRange(iRow, iCol).setValue(reviewTitle+'@'+v.node.author.login + '\n' + v.node.bodyText.replace(/\s+(\r?\n)+/g,"\n"));
              iCol++;
            }else{
              reviewTitle = '[review' + reviewNo + ']\n';
            }
            // コメント部分出力
            v.node.comments.edges.forEach(function(c){
              sheet.getRange(iRow, iCol).setValue(reviewTitle + '[comment]\n'+'@'+c.node.author.login + '\n' + c.node.bodyText.replace(/\s+(\r?\n)+/g,"\n"));
              iCol++;
            });
            reviewNo++;
        });
      }
    });

     // 次ページがあるか、最終行のカーソル情報を取得
    nextPageCursor = allDocuments.data.repository.pullRequests.pageInfo.endCursor;
    var hasNextPage = allDocuments.data.repository.pullRequests.pageInfo.hasNextPage;
    Logger.log("新規/更新:" + (changeRow) + ' endCursor:' + nextPageCursor + ' hasNextPage:' + hasNextPage);
    // hasNextPage=false;

  // 次ページがなくなるまでループ
  }while(hasNextPage == true)
  
  Logger.log("終了");
}
// APIだと遅いので検索する
function findValueRowNo(values, value) {
  for (var i in values) {    
    if (values[i][0] == value) {
      return parseInt(i)+1;
    }
  }
  return -1;
}

</code></pre><p>処理とては、対象のPRの一覧を取得し、IDを利用して詳細情報を参照してレビュー、コメント情報をスプレッドシートへ出力しています。</p><p>結果は以下のレイアウトとし、コメント内容にレビュー、コメント情報を追記していくこととします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2021-10-27-14.25.17-1.png" class="kg-image" alt="" loading="lazy" width="2000" height="87" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2021-10-27-14.25.17-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2021-10-27-14.25.17-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2021-10-27-14.25.17-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/----------2021-10-27-14.25.17-1.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>実行結果はこんな感じ、もう少し情報を追加したいかと思いますが、とりあえず欲しい情報は抽出できたのでよしとします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2021-10-27-14.27.41.png" class="kg-image" alt="" loading="lazy" width="2000" height="682" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/----------2021-10-27-14.27.41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/----------2021-10-27-14.27.41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/----------2021-10-27-14.27.41.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/----------2021-10-27-14.27.41.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>ただ、スプレッドシートに出力するため、API呼び出し回数が多くなり速度面がきになりますが、別途時間ある時に改善してみようかと思います。</p><p>ではでは</p>]]></content:encoded></item><item><title><![CDATA[GORM を使って監査ログを出す！]]></title><description><![CDATA[こんにちは！矢ヶ崎です！

さて、今日は監査ログのお話です。

Web アプリケーションのバックエンドを作成していると、センシティブな情報を持っているときには、アプリケーションからも監査ログを出す必要がでてきたりしますよね。

そんなとき、Go言語 ( Golang ) で 実装していた場合にはどうすればよいのか？GORM と各種 Web Framework (今回はecho) の
Middleware を使ってやってみました！

今回の監査ログの目的
・いつ
・誰が
・どんなデータに
・何をしたか
を追えるようにする。つまり機密情報アクセスのトレーサビリティを確保するということだとします。

そして、今回は個人情報は全て RDB に入っているという設定で、 SQL のレベルでの全ログを取得し、その SQL
操作をアプリケーションのどのユーザが行ったか？（ DB のユーザではなく、アプリケーションのユーザ）を記録していきたいと思います。

DB 側やインフラ側での監査ログでは、アプリケーションのどのユーザが利用したのかを記録するのはなかなか難しいです。 DB
自体のユーザを出力すること]]></description><link>https://tech.anti-pattern.co.jp/gorm/</link><guid isPermaLink="false">Ghost__Post__616d945d3986b000013a6d89</guid><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Sun, 31 Oct 2021 16:01:09 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！矢ヶ崎です！</p><p>さて、今日は監査ログのお話です。</p><p>Web アプリケーションのバックエンドを作成していると、センシティブな情報を持っているときには、アプリケーションからも監査ログを出す必要がでてきたりしますよね。</p><p>そんなとき、Go言語 ( Golang ) で 実装していた場合にはどうすればよいのか？GORM と各種 Web Framework (今回はecho) の Middleware を使ってやってみました！</p><p>今回の監査ログの目的<br>・いつ<br>・誰が<br>・どんなデータに<br>・何をしたか<br>を追えるようにする。つまり機密情報アクセスのトレーサビリティを確保するということだとします。</br></br></br></br></br></p><p>そして、今回は個人情報は全て RDB に入っているという設定で、 SQL のレベルでの全ログを取得し、その SQL 操作をアプリケーションのどのユーザが行ったか？（ DB のユーザではなく、アプリケーションのユーザ）を記録していきたいと思います。</p><p>DB 側やインフラ側での監査ログでは、アプリケーションのどのユーザが利用したのかを記録するのはなかなか難しいです。 DB 自体のユーザを出力することはできますが、アプリケーションユーザを出すには DB のユーザとアプリケーションユーザを１対１で作成する必要があります。これはマルチテナントで提供する SaaS などの実装ではなかなか現実的ではありません。テナント単位での DB ユーザは作成できたとしても、そのテナント内でのユーザ単位まで作成するのは、規模にもよりますがなかなか厳しいかと思います。</p><p>では、早速ですが実装サンプルに行きたいと思います。</p><p>全体的なサンプルコードはこちらです！<br><a href="https://github.com/yaggytter/auditlog-sample-gorm-echo">https://github.com/yaggytter/auditlog-sample-gorm-echo</a></br></p><p>まず、バックエンドでは何かしらの認可（認証もある場合もあるかと思います）の処理が入るはずです。その認可の時点でアプリケーションのユーザを記録していきます。</p><p>echo などではこの認可(や認証)の部分は、Middleware で実装する場合が多いかと思います。ここで、アプリケーションのユーザを一意に識別するユーザ名や UUID などが取得されていると思うので、それをコンテキストに覚えておきます。</p><!--kg-card-begin: markdown--><p>main.go</p>
<pre><code>		ctx := context.WithValue(c.Request().Context(), &quot;UserName&quot;, username)
		r := c.Request().WithContext(ctx)
		c.SetRequest(r)

		return next(c)
</code></pre>
<!--kg-card-end: markdown--><p>このコンテキストを利用し、 GORM のカスタムロガーを書き実装します。</p><!--kg-card-begin: markdown--><p>auditlog/auditlog.go</p>
<pre><code>	pri := fmt.Sprintf(logPrefix, ctx.Value(&quot;UserName&quot;).(string))
</code></pre>
<!--kg-card-end: markdown--><p>GORM の Open のときに、このカスタムロガーを使うように指定します。</p><!--kg-card-begin: markdown--><p>main.go</p>
<pre><code>	db, err = gorm.Open(mysql.Open(dsn), &amp;gorm.Config{
		Logger: auditlog.Default.LogMode(logger.Info), // for Audit logs
	})
</code></pre>
<!--kg-card-end: markdown--><p>そして、コンテキスト付きで GORM を利用するようにします。</p><!--kg-card-begin: markdown--><p>main.go</p>
<pre><code>	ctxdb := db.WithContext(c.Request().Context())
</code></pre>
<!--kg-card-end: markdown--><p>これで GORM を経由したすべての SQL が、そのデータを利用したアプリケーションユーザ情報とともに出力できます。</p><!--kg-card-begin: markdown--><pre><code>2021/11/09 05:08:08 [AUDIT] user='ee04243e-a635-4bbd-9788-e2d5483efa96' /app/infrastructure/postgres/user.go:416 [4.140ms] [rows:6] SELECT * FROM &quot;skills&quot; WHERE &quot;skills&quot;.&quot;user_id&quot; = 182 AND &quot;skills&quot;.&quot;deleted_at&quot; IS NULL
</code></pre>
<!--kg-card-end: markdown--><p>こんな感じでトレーサビリティを確保できますね！</p><p>もちろん、クラウドなどのインフラ側でのログも合わせて取得するのが大事ですね。 DB 側の監査ログやアクセスログなども合わせて利用するのが良いと思います。そして場合によっては、分散トレーシングなども合わせて利用するために、トレースIDのようなものもログに出力しておくとさらにトレーサビリティがあがりますね。監査ログのついでにオブザーバビリティの観点も考慮しておくといいですね！</p><p>こちらからは以上です。</p>]]></content:encoded></item><item><title><![CDATA[GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話]]></title><description><![CDATA[こんにちは、小笹です。スクラムマスターとして日々より良い開発者体験を追求しております。その中でGitHubの新機能を触ってみたのでブログにしてみました。

触ってみた感想
もう少し機能が拡充したら積極的にこちらへ載せ替えたいです。

具体的にはWorkflowの設定が細かくできるようになって自動化できそうになったら移行します。

projects(beta)について
Issueをトラッキングできるシート機能で、パブリックベータ版として一部機能が利用できるようになっています。

Organizationの下にあるProjectsページで新しいprojects(beta)を作りましょう。



ISSUEのインポート機能が現状はないのでISSUE側からポチポチ紐付けていきます。

ISSUEを紐づけるとスプレッドシートが展開されます。

デフォルトで

 * Title
 * Assignees
 * Status

が表示されます。

ここでいうStatusはこのprojects(beta)で扱うデータになります。
デフォルトで

 * Todo
 * In Progress
 * Do]]></description><link>https://tech.anti-pattern.co.jp/the-story-of-how-i-was-happy-to-see-the-idea-of-the-product-when-i-touched-the-projects-of-github/</link><guid isPermaLink="false">Ghost__Post__616d065b3986b000013a6ce3</guid><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Wed, 20 Oct 2021 05:25:21 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/10/github-new-project-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/10/github-new-project-1-1.png" alt="GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話"/><p>こんにちは、小笹です。スクラムマスターとして日々より良い開発者体験を追求しております。その中でGitHubの新機能を触ってみたのでブログにしてみました。</p>
<h1 id="%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3">触ってみた感想</h1>
<p>もう少し機能が拡充したら積極的にこちらへ載せ替えたいです。</p>
<p>具体的にはWorkflowの設定が細かくできるようになって自動化できそうになったら移行します。</p>
<h1 id="projectsbeta%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">projects(beta)について</h1>
<p>Issueをトラッキングできるシート機能で、パブリックベータ版として一部機能が利用できるようになっています。</p>
<p>Organizationの下にあるProjectsページで新しいprojects(beta)を作りましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-12-19.58.51.png" alt="GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話" loading="lazy"/></p>
<p>ISSUEのインポート機能が現状はないのでISSUE側からポチポチ紐付けていきます。</p>
<p>ISSUEを紐づけるとスプレッドシートが展開されます。</p>
<p>デフォルトで</p>
<ul>
<li>Title</li>
<li>Assignees</li>
<li>Status</li>
</ul>
<p>が表示されます。</p>
<p>ここでいうStatusはこのprojects(beta)で扱うデータになります。<br>
デフォルトで</br></p>
<ul>
<li>Todo</li>
<li>In Progress</li>
<li>Done</li>
</ul>
<p>が設定されています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-12-19.59.45.png" alt="GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話" loading="lazy"/></p>
<p>表示の形式はTable以外にBoardがあり、また、Viewはいくつでも作れるので用途に合わせて使い分けましょう。</p>
<p><strong>今回のprojects(beta)の目玉は、ISSUEに新たなカラムを設定して管理できることでしょう。</strong></p>
<p>これにより今まで管理できなかった属性情報を、GitHub内で扱うことができます。</p>
<p>例えば、僕たちのプロジェクトでもチケットのサイズをラベルで管理しています。ラベルには複数の属性情報(テストの状況/サイズ/etc)が入り混じっており、これ以上属性情報を足したりなどは難しいかなと思ってました。</p>
<p>それをカバーできるようになるわけです！</p>
<p>カラムの+ボタンを押して、New fieldを押します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-12-20.00.19.png" alt="GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話" loading="lazy"/></p>
<p>様々なデータ型で定義することができます！これは嬉しい！</p>
<p>例えば数字型のカラムを追加して、想定ポイントを記載するなどができるようになります。計算機能は現状ないですが、要望は出されていましたので、もしかしたら実装されるかもしれません。</p>
<p>実装されたらスプリント後ごとのベロシティをGitHubを見るだけで可視化できるようになります。</p>
<p>徐々に機能が増えていくようなので定期的にチェックしていこうと思います！！</p>
<h2 id="%E6%80%9D%E6%83%B3%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%9F">思想が見えた</h2>
<p>カラムにはIterationという型があります。</p>
<p>ここでは1~2週間など区切りを設定できます。</p>
<p>しかしながら、ISSUEに設定できるのは3Iteration先までなのです！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-12-20.00.41.png" alt="GitHubのprojects(beta)を触ってみたらプロダクトの思想が見えて嬉しくなった話" loading="lazy"/></p>
<p><strong>未来のことは分からないので決めすぎないという考え方をプロダクトを通して伝える姿勢が素晴らしい！！(たぶん)</strong></p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GORMのCreate V2]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

弊社では自社サービスの開発でGORMを使用しています。

V2の機能で関連するレコードも一度に登録できるようなので、試してみました。

例えば、この様なデータ構造です。ユーザはスキル情報を持っています

type userDTO struct {
 gorm.Model
 Name   string
 Email  *string
 Skills skillDTOs `gorm:"foreignKey:UserID"`
}

type skillDTO struct {
 gorm.Model
 UserID uint64
 Name   string
}


ユーザ情報、スキル情報を設定してCreateを実行します

user := userDTO{
 Name:   "testUser",
 Email:  func() *string { s := "test@test.com"; return &s }(),
 Skills: []skillDTO{
  {Name: "skill1"}, {Name: "skill]]></description><link>https://tech.anti-pattern.co.jp/gormtopostgresqlnotimezone-2/</link><guid isPermaLink="false">Ghost__Post__615a514f3986b000013a6a41</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 04 Oct 2021 03:38:18 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/10/29791364_1246754985456610_5906763196705800192_n.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/10/29791364_1246754985456610_5906763196705800192_n.jpg" alt="GORMのCreate V2"/><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>弊社では自社サービスの開発でGORMを使用しています。</p>
<p>V2の機能で関連するレコードも一度に登録できるようなので、試してみました。</p>
<p>例えば、この様なデータ構造です。ユーザはスキル情報を持っています</p>
<pre><code class="language-go:dto">type userDTO struct {
 gorm.Model
 Name   string
 Email  *string
 Skills skillDTOs `gorm:&quot;foreignKey:UserID&quot;`
}

type skillDTO struct {
 gorm.Model
 UserID uint64
 Name   string
}
</code></pre>
<p>ユーザ情報、スキル情報を設定してCreateを実行します</p>
<pre><code class="language-go:dto">user := userDTO{
 Name:   &quot;testUser&quot;,
 Email:  func() *string { s := &quot;test@test.com&quot;; return &amp;s }(),
 Skills: []skillDTO{
  {Name: &quot;skill1&quot;}, {Name: &quot;skill2&quot;}, {Name: &quot;skill3&quot;},
 },
}
r.db.Conn(ctx).Create(&amp;user)
</code></pre>
<p>実行されたSQLログ</p>
<pre><code>[rows:1] 
INSERT INTO &quot;users&quot;(&quot;created_at&quot;,&quot;updated_at&quot;,&quot;deleted_at&quot;,&quot;name&quot;,&quot;email&quot;)VALUES
('2021-10-04 01:18:54.177','2021-10-04 01:18:54.177',NULL,'testUser','test@test.com') RETURNING &quot;id&quot;

[rows:3] 
INSERT INTO &quot;skills&quot;(&quot;created_at&quot;,&quot;updated_at&quot;,&quot;deleted_at&quot;,&quot;user_id&quot;,&quot;name&quot;)VALUES
('2021-10-04 01:18:54.46','2021-10-04 01:18:54.46',NULL,919,'skill1'),
('2021-10-04 01:18:54.46','2021-10-04 01:18:54.46',NULL,919,'skill2'),
('2021-10-04 01:18:54.46','2021-10-04 01:18:54.46',NULL,919,'skill3')
ON CONFLICT(&quot;id&quot;) DO UPDATE SET &quot;user_id&quot; = &quot;excluded&quot;.&quot;user_id&quot; RETURNING &quot;id&quot;
</code></pre>
<p>usersテーブル、skillsテーブルへのINSERT文が発行されてます。<br>
また、usersに登録したレコードのid:919が、skillsのuser_idに指定されているのが分かります</br></p>
<p>ON CONFLICT(&quot;id&quot;) DO UPDATE SET についてはこちらを</p>
<blockquote>
<p><a href="https://www.postgresql.org/docs/11/sql-insert.html">https://www.postgresql.org/docs/11/sql-insert.html</a></p>
</blockquote>
<p>ユーザ情報、スキル情報を取得する時に、Preloadを使っているのでその逆といった感じでしょうか</p>
<pre><code>var find userDTO
result := r.db.Conn(ctx).Preload(&quot;Skills&quot;).Where(&quot;id = ?&quot;, 919).Find(&amp;find)
</code></pre>
<p>実行されたSQLログ</p>
<pre><code>[rows:1] 
SELECT * FROM &quot;users&quot; WHERE id = 719 AND &quot;users&quot;.&quot;deleted_at&quot; IS NULL

[rows:3] 
SELECT * FROM &quot;skills&quot; WHERE &quot;skills&quot;.&quot;user_id&quot; = 719 AND  &quot;skills&quot;.&quot;deleted_at&quot; IS NULL
</code></pre>
<p>使い所によっては、実装がスッキリしそうです。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[OpenAPIのサーバーでインテグレーションテストを書く]]></title><description><![CDATA[

自社のサービスではOpenAPIを使ってサーバーを書いています。

https://swagger.io/specification/

ほぼ全てのエンドポイントに影響のあるリファクタリングをした時に、動作確認が辛すぎたのでインテグレーションテストを書くことにしました。

できたものは以下になります。

integration-test/integration_test at main · yutakahashi114/integration-test
Contribute to yutakahashi114/integration-test development by creating an
account
on GitHub.GitHubyutakahashi114
[https://github.com/yutakahashi114/integration-test/tree/main/integration_test]
以下、簡単に説明を書いていきます。

サンプルアプリケーション
以下のschemaを元にサーバーを実装します。ユーザーの一覧取得、ID指定の取得、登録、更]]></description><link>https://tech.anti-pattern.co.jp/openapi-integrationtest/</link><guid isPermaLink="false">Ghost__Post__615859273986b000013a68ba</guid><category><![CDATA[OpenAPI]]></category><category><![CDATA[Go]]></category><category><![CDATA[golang]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sat, 02 Oct 2021 13:07:02 GMT</pubDate><content:encoded><![CDATA[<p/><p>自社のサービスではOpenAPIを使ってサーバーを書いています。</p><p><a href="https://swagger.io/specification/">https://swagger.io/specification/</a></p><p>ほぼ全てのエンドポイントに影響のあるリファクタリングをした時に、動作確認が辛すぎたのでインテグレーションテストを書くことにしました。</p><p>できたものは以下になります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yutakahashi114/integration-test/tree/main/integration_test"><div class="kg-bookmark-content"><div class="kg-bookmark-title">integration-test/integration_test at main · yutakahashi114/integration-test</div><div class="kg-bookmark-description">Contribute to yutakahashi114/integration-test development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yutakahashi114</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b58944db377fbb86d493a2df0a127d01417a17391d41bdda9f65f73d82076085/yutakahashi114/integration-test"/></div></a></figure><p>以下、簡単に説明を書いていきます。</p><h2 id="%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">サンプルアプリケーション</h2><p>以下のschemaを元にサーバーを実装します。ユーザーの一覧取得、ID指定の取得、登録、更新、削除の5つのエンドポイントがあります。</p><pre><code class="language-yaml">openapi: 3.0.0
info:
  description: "schema"
  version: "1.0.0"
  title: "integration test"
  contact:
    name: "integration test"
servers:
  - url: "http://localhost:80"
    description: local
tags:
  - name: "user"
    description: ユーザー
security:
  - Bearer: []
paths:
  /user:
    get:
      tags:
        - user
      operationId: FindUsers
      summary: 全ユーザー取得
      description: 全ユーザー取得
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                title: Users
                type: array
                items: { $ref: "#/components/schemas/User" }
        500:
          description: Internal Server Error
    post:
      tags:
        - user
      operationId: CreateUser
      summary: ユーザー作成
      description: ユーザー作成
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/User"
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ID"
        500:
          description: Internal Server Error
  /user/{id}:
    get:
      tags:
        - user
      operationId: GetUserByID
      summary: 指定したIDのユーザー取得
      description: 指定したIDのユーザー取得
      parameters:
        - in: path
          name: id
          schema:
            type: integer
            format: int64
          required: true
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"
        500:
          description: Internal Server Error
    put:
      tags:
        - user
      operationId: UpdateUser
      summary: 指定したIDのユーザー更新
      description: 指定したIDのユーザー更新
      parameters:
        - in: path
          name: id
          schema:
            type: integer
            format: int64
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/User"
      responses:
        200:
          description: OK
        500:
          description: Internal Server Error
    delete:
      tags:
        - user
      operationId: DeleteUser
      summary: 指定したIDのユーザー削除
      description: 指定したIDのユーザー削除
      parameters:
        - in: path
          name: id
          schema:
            type: integer
            format: int64
          required: true
      responses:
        200:
          description: OK
        500:
          description: Internal Server Error

components:
  schemas:
    ID:
      title: ID
      type: object
      properties:
        id:
          type: integer
          format: int64
      required:
        - id
    User:
      title: User
      type: object
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        name:
          type: string
        email:
          type: string
        created_at:
          type: string
          format: date-time
          readOnly: true
      required:
        - id
        - name
        - email
        - created_at
</code></pre><p>サーバーの実装は以下になります。サンプルなのでだいぶ雑です。</p><pre><code class="language-Golang">package main

import (
	"encoding/json"
	"fmt"
	"integration/openapi"
	"log"
	"net/http"
	"os"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
	"github.com/go-chi/render"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

func main() {
	db, err := connectDB()
	if err != nil {
		log.Fatalln(err)
		return
	}
	mux := chi.NewRouter()

	mux.Use(middleware.Logger)

	openapi.HandlerFromMux(Controller{db}, mux)

	port := os.Getenv("PORT")
	if port == "" {
		port = "80"
	}
	http.ListenAndServe(":"+port, mux)
}

type User struct {
	gorm.Model
	Email string `db:"email"`
	Name  string `db:"name"`
}

type Controller struct {
	*gorm.DB
}

func (c Controller) FindUsers(w http.ResponseWriter, r *http.Request) {
	users := []User{}
	err := c.DB.Order("id ASC").Find(&amp;users).Error
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	us := make([]openapi.User, len(users))
	for i, user := range users {
		us[i] = openapi.User{
			Id:        int64(user.ID),
			Name:      user.Name,
			Email:     user.Email,
			CreatedAt: user.CreatedAt,
		}
	}
	render.JSON(w, r, us)
}

func (c Controller) GetUserByID(w http.ResponseWriter, r *http.Request, id int64) {
	user := User{}
	err := c.DB.Where("id = ?", id).First(&amp;user).Error
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	render.JSON(w, r, openapi.User{
		Id:        int64(user.ID),
		Name:      user.Name,
		Email:     user.Email,
		CreatedAt: user.CreatedAt,
	})
}

func (c Controller) CreateUser(w http.ResponseWriter, r *http.Request) {
	u := openapi.User{}
	decoder := json.NewDecoder(r.Body)
	err := decoder.Decode(&amp;u)
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	defer r.Body.Close()

	user := &amp;User{
		Name:  u.Name,
		Email: u.Email,
	}
	err = c.DB.Create(&amp;user).Error
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	render.JSON(w, r, openapi.ID{Id: int64(user.ID)})
}

func (c Controller) UpdateUser(w http.ResponseWriter, r *http.Request, id int64) {
	u := openapi.User{}
	decoder := json.NewDecoder(r.Body)
	err := decoder.Decode(&amp;u)
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	defer r.Body.Close()

	user := &amp;User{
		Name:  u.Name,
		Email: u.Email,
	}
	err = c.DB.Where("id = ?", id).Updates(&amp;user).Error
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	w.WriteHeader(http.StatusOK)
}

func (c Controller) DeleteUser(w http.ResponseWriter, r *http.Request, id int64) {
	err := c.DB.Where("id = ?", id).Delete(&amp;User{}).Error
	if err != nil {
		log.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	w.WriteHeader(http.StatusOK)
}

func connectDB() (*gorm.DB, error) {
	dsn := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=disable",
		os.Getenv("POSTGRES_USER"),
		os.Getenv("POSTGRES_PASSWORD"),
		os.Getenv("POSTGRES_DB_NAME"),
		os.Getenv("POSTGRES_HOST"),
		os.Getenv("POSTGRES_PORT"),
	)
	return gorm.Open(postgres.Open(dsn), &amp;gorm.Config{})
}
</code></pre><p>DBは以下のテーブルのみになります。</p><pre><code>CREATE TABLE users
(
  id         bigserial  NOT NULL,
  name       varchar    NOT NULL,
  email      varchar    NOT NULL,
  created_at timestamp  NOT NULL DEFAULT now(),
  updated_at timestamp  NOT NULL DEFAULT now(),
  deleted_at timestamp,
  PRIMARY KEY (id)
);</code></pre><h2 id="%E6%BA%96%E5%82%99">準備</h2><p>通常の開発用のDBとは別にDBを用意する必要があるので、initで作っておきます。</p><pre><code>version: "3.7"
services:
  ...
  
  db:
    image: postgres:11.9
    environment:
      POSTGRES_PASSWORD: develop
      POSTGRES_USER: develop
      POSTGRES_DB: app
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
      - ./postgres/data:/var/lib/postgresql/data</code></pre><pre><code>create database test;</code></pre><p>OpenAPIのからクライアントのコードを生成する必要があるので、Makefileに以下を定義します。</p><pre><code>openapigen_i:
	docker-compose exec app oapi-codegen -generate types,client -package openapi -o integration_test/openapi/openapi_gen.go openapi/openapi.yaml
    </code></pre><p>サーバーのコードを以下で生成しているので、クライアントも同じように生成します。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/deepmap/oapi-codegen"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - deepmap/oapi-codegen: Generate Go client and server boilerplate from OpenAPI 3 specifications</div><div class="kg-bookmark-description">Generate Go client and server boilerplate from OpenAPI 3 specifications - GitHub - deepmap/oapi-codegen: Generate Go client and server boilerplate from OpenAPI 3 specifications</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">deepmap</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/a83dee77b8a39aefae5f40535b34886467bc61f022e1b713d4aa197aff09020a/deepmap/oapi-codegen"/></div></a></figure><h2 id="%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F">テストを書く</h2><p>テストコードは別のmoduleとして置いています。アプリのmoduleにまとめても問題ないと思いますが、アプリの外からの振る舞いをテストするのが目的なので何となく分けました。</p><!--kg-card-begin: markdown--><p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.35.40.png" alt="----------2022-05-11-10.35.40" loading="lazy"/></p>
<!--kg-card-end: markdown--><p>setupとしてmain_test.goに以下を書いておきます。ここでテストサーバーを起動します。テストコード内で起動するのが結構面倒だったので、テストコード内ではなく<code>go test</code>の前に起動するようにしても良いかもしれません。テストケース内でデータを作ることがあるため、DBのクライアントを用意しています。</p><pre><code class="language-Golang">var db *gorm.DB
var dsn string

func TestMain(m *testing.M) {
	// ポートやDBの接続先を変えてサーバーを起動する
	os.Chdir("/app")
	cmd := exec.Command("go", "run", "main.go")
	cmd.Env = append(os.Environ(), "PORT=81", "POSTGRES_DB_NAME="+os.Getenv("POSTGRES_TEST_DB_NAME"))
	stdout, _ := cmd.StdoutPipe()
	fatalIf(cmd.Start())
	go func() {
		// 必要ならサーバーのログを出力
		scanner := bufio.NewScanner(stdout)
		for scanner.Scan() {
			line := scanner.Text()
			fmt.Println(line)
		}
	}()
	os.Chdir("/app/integration_test")

	// DBに接続
	connectDB()

	// サーバーの起動が完了するまで待機
	// ヘルスチェックのエンドポイントがあればそれを叩いた方が良い
	time.Sleep(5 * time.Second)

	fmt.Println("============ test start ============")

	// テスト実行
	exitVal := m.Run()

	// サーバーを終了する
	cmd.Process.Kill()
	cmd.Wait()

	os.Exit(exitVal)
}

func connectDB() {
	dsn = fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=disable",
		os.Getenv("POSTGRES_USER"),
		os.Getenv("POSTGRES_PASSWORD"),
		os.Getenv("POSTGRES_TEST_DB_NAME"),
		os.Getenv("POSTGRES_HOST"),
		os.Getenv("POSTGRES_PORT"),
	)
	var err error
	db, err = gorm.Open(postgres.Open(dsn), &amp;gorm.Config{})
	fatalIf(err)
}

func fatalIf(err error) {
	if err != nil {
		log.Fatalln(err)
	}
}
</code></pre><p>テストケースは以下のように書きます。レスポンスの型を自動生成できるので、通常のテストと同じように書くことができます。テストの前にDBをリセットし、OpenAPIのクライアントを生成しています。ここではテストケースごとに必要なデータを生成するようにしていますが、全ケース共通の初期データを用意しておいた方が楽な場合もあると思います。また、更新系の判定はDBのデータを参照しても良いかもしれません。</p><pre><code class="language-Golang">func Test_User(t *testing.T) {
	resetDB()
	client := newClient()
	ctx := context.Background()
	// データ作成
	{
		err := db.Table("users").Create(
			[]map[string]interface{}{
				{"name": "name1", "email": "email1"},
			},
		).Error
		assert.NoError(t, err)
	}
	// ユーザー作成
	{
		res, err := client.CreateUserWithResponse(ctx, openapi.CreateUserJSONRequestBody{Name: "name2", Email: "email2"})
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		assertEqual(t, &amp;openapi.ID{Id: 2}, res.JSON200)
	}
	// ユーザー作成
	{
		res, err := client.CreateUserWithResponse(ctx, openapi.CreateUserJSONRequestBody{Name: "name3", Email: "email3"})
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		assertEqual(t, &amp;openapi.ID{Id: 3}, res.JSON200)
	}
	// ユーザー一覧取得
	{
		res, err := client.FindUsersWithResponse(ctx)
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		want := &amp;[]openapi.User{
			{Id: 1, Name: "name1", Email: "email1"},
			{Id: 2, Name: "name2", Email: "email2"},
			{Id: 3, Name: "name3", Email: "email3"},
		}
		assertEqual(t, want, res.JSON200, cmpopts.IgnoreFields(openapi.User{}, "CreatedAt"))
	}
	// ユーザー取得
	{
		res, err := client.GetUserByIDWithResponse(ctx, 1)
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		want := &amp;openapi.User{Id: 1, Name: "name1", Email: "email1"}
		assertEqual(t, want, res.JSON200, cmpopts.IgnoreFields(openapi.User{}, "CreatedAt"))
	}
	// ユーザー更新
	{
		res, err := client.UpdateUserWithResponse(ctx, 1, openapi.UpdateUserJSONRequestBody{Name: "name1_update", Email: "email1_update"})
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
	}
	// ユーザー取得
	{
		res, err := client.GetUserByIDWithResponse(ctx, 1)
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		want := &amp;openapi.User{Id: 1, Name: "name1_update", Email: "email1_update"}
		assertEqual(t, want, res.JSON200, cmpopts.IgnoreFields(openapi.User{}, "CreatedAt"))
	}
	// ユーザー削除
	{
		res, err := client.DeleteUserWithResponse(ctx, 2)
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
	}
	// ユーザー一覧取得
	{
		res, err := client.FindUsersWithResponse(ctx)
		assert.NoError(t, err)
		assertStatusCode(t, 200, res)
		want := &amp;[]openapi.User{
			{Id: 1, Name: "name1_update", Email: "email1_update"},
			{Id: 3, Name: "name3", Email: "email3"},
		}
		assertEqual(t, want, res.JSON200, cmpopts.IgnoreFields(openapi.User{}, "CreatedAt"))
	}
}

func newClient() *openapi.ClientWithResponses {
	// 認証が必要であればトークンをセットする
	token := ""
	c, err := openapi.NewClientWithResponses("http://localhost:81", openapi.WithRequestEditorFn(
		func(ctx context.Context, req *http.Request) error {
			req.Header.Add("Authorization", "Bearer "+token)
			return nil
		},
	))
	fatalIf(err)
	return c
}

func assertStatusCode(t *testing.T, expect int, actual interface{ StatusCode() int }) bool {
	if expect != actual.StatusCode() {
		assert.Fail(t, "assertStatusCode mismatch", fmt.Sprintf("status code got: %d, want:%d", actual.StatusCode(), expect))
		return false
	}
	return true
}

func assertEqual(t *testing.T, expect, actual interface{}, opts ...cmp.Option) bool {
	if diff := cmp.Diff(actual, expect, opts...); diff != "" {
		assert.Fail(t, "assertEqual mismatch", fmt.Sprintf("differs: (-got +want)\n%s", diff))
		return false
	}
	return true
}
</code></pre><p>DBのリセット部分です。テスト実行前に生成しておいたリセット用のSQLをpsqlコマンドで実行してます。SQLを生成せず、マイグレーションのdownとupでリセットしても良いかもしれません。</p><pre><code class="language-Golang">func resetDB() {
	// 原因は不明だがテーブルの作成に失敗することがあるので、最大5回リトライする
	for i := 0; i &lt; 5; i++ {
		out, err := exec.Command("psql", dsn, "-f", "./reset.sql").Output()
		fatalIf(err)
		// 成功したときは4行以上出力される
		if len(strings.Split(string(out), "\n")) &gt;= 4 {
			return
		}
		fmt.Println("retry reset db")
		time.Sleep(1 * time.Second)
	}
	log.Fatalln("failed to reset db")
}</code></pre><p>テスト実行前にリセット用のSQLを生成する部分は以下です。</p><pre><code>TEST_DB_CONFIG=user=develop dbname=test sslmode=disable password=develop
TRUNCATE_DB_SQL=drop schema public cascade; create schema public;
RESET_SQL_FILE=./integration_test/reset.sql
test_i:
# テーブル全削除のSQL
	echo "${TRUNCATE_DB_SQL}" &gt; ${RESET_SQL_FILE}
# テーブル全削除
	docker-compose exec db psql "${TEST_DB_CONFIG}" -c "${TRUNCATE_DB_SQL}"
# マイグレーション実行
	make test_db_up
# テーブル全削除のSQLにマイグレーション実行後の状態に戻すSQLを追記
	docker-compose exec db pg_dump "${TEST_DB_CONFIG}" &gt;&gt; ${RESET_SQL_FILE}
# テスト実行
	docker-compose exec app sh -c 'cd ./integration_test &amp;&amp; go test -parallel=1 ./...'</code></pre><p><code>make test_i</code>を実行すると以下のようになります。</p><pre><code>/integration-test$ make test_i
echo "drop schema public cascade; create schema public;" &gt; ./integration_test/reset.sql
docker-compose exec db psql "user=develop dbname=test sslmode=disable password=develop" -c "drop schema public cascade; create schema public;"
NOTICE:  drop cascades to 2 other objects
DETAIL:  drop cascades to table goose_db_version
drop cascades to table users
CREATE SCHEMA
make test_db_up
docker-compose exec app sh -c 'cd /app/migrations &amp;&amp; goose postgres "user=develop dbname=test sslmode=disable password=develop host=db" up'
2021/10/02 13:55:56 OK    00001_init.sql
2021/10/02 13:55:56 goose: no migrations to run. current version: 1
docker-compose exec db pg_dump "user=develop dbname=test sslmode=disable password=develop" &gt;&gt; ./integration_test/reset.sql
docker-compose exec app sh -c 'cd ./integration_test &amp;&amp; go test -parallel=1 ./...'
ok      integration-test        5.241s
?       integration-test/openapi        [no test files]</code></pre><p>エラーがあった場合は以下のように出ます。</p><pre><code>/integration-test$ make test_i
echo "drop schema public cascade; create schema public;" &gt; ./integration_test/reset.sql
docker-compose exec db psql "user=develop dbname=test sslmode=disable password=develop" -c "drop schema public cascade; create schema public;"
NOTICE:  drop cascades to 2 other objects
DETAIL:  drop cascades to table goose_db_version
drop cascades to table users
CREATE SCHEMA
make test_db_up
docker-compose exec app sh -c 'cd /app/migrations &amp;&amp; goose postgres "user=develop dbname=test sslmode=disable password=develop host=db" up'
2021/10/02 13:57:57 OK    00001_init.sql
2021/10/02 13:57:57 goose: no migrations to run. current version: 1
docker-compose exec db pg_dump "user=develop dbname=test sslmode=disable password=develop" &gt;&gt; ./integration_test/reset.sql
docker-compose exec app sh -c 'cd ./integration_test &amp;&amp; go test -parallel=1 ./...'
============ test start ============
2021/10/02 13:58:05 "POST http://localhost:81/user HTTP/1.1" from 127.0.0.1:48510 - 200 9B in 5.2031ms
2021/10/02 13:58:05 "POST http://localhost:81/user HTTP/1.1" from 127.0.0.1:48510 - 200 9B in 1.6208ms
2021/10/02 13:58:05 "GET http://localhost:81/user HTTP/1.1" from 127.0.0.1:48510 - 200 254B in 1.8247ms
2021/10/02 13:58:05 "GET http://localhost:81/user/1 HTTP/1.1" from 127.0.0.1:48510 - 200 84B in 838.7µs
2021/10/02 13:58:05 "PUT http://localhost:81/user/1 HTTP/1.1" from 127.0.0.1:48510 - 200 0B in 2.0287ms
2021/10/02 13:58:05 "GET http://localhost:81/user/1 HTTP/1.1" from 127.0.0.1:48510 - 200 98B in 549.1µs
2021/10/02 13:58:05 "DELETE http://localhost:81/user/2 HTTP/1.1" from 127.0.0.1:48510 - 200 0B in 1.9092ms
2021/10/02 13:58:05 "GET http://localhost:81/user HTTP/1.1" from 127.0.0.1:48510 - 200 184B in 501.1µs
--- FAIL: Test_User (0.22s)
    main_test.go:112: 
                Error Trace:    main_test.go:112
                                                        user_test.go:89
                Error:          assertEqual mismatch
                Test:           Test_User
                Messages:       differs: (-got +want)
                                  &amp;[]openapi.User{
                                        {Email: "email1_update", Id: 1, Name: "name1_update"},
                                        {
                                                ... // 1 ignored field
                                -               Email: "email3",
                                +               Email: "email3_fail",
                                                Id:    3,
                                                Name:  "name3",
                                        },
                                  }
FAIL
FAIL    integration-test        5.279s
?       integration-test/openapi        [no test files]
FAIL
make: *** [test_i] Error 1</code></pre><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>インテグレーションテストを書いたことで、リファクタリングや依存パッケージの更新を心置きなくできるようになりました。書くのは大変でしたが、非常に安心感があって良いです。</p>]]></content:encoded></item><item><title><![CDATA[Shopifyのローカル開発環境を準備する（Mac）]]></title><description><![CDATA[Photo by Mike Petrucci
[https://unsplash.com/@mikepetrucci?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
ローカル開発環境を準備することが何回かあったため手順をまとめます
2021年6月に発表されたShopifyCLIではなく、ThemeKitでの手順です。
online Store2.0を使用している場合はShopifyCLIを使用してください。
ThemeKit 1.3.0 darwin/amd64

Shopify接続するためのAPIキー・パスワードを生成する
アプリ管理
↓
プライベートアプリを管理する
↓
新しいプライベートアプリを作成する

必要事項を入力して権限を付与する
非アクティブなAdmin API権限を表示する
↓
テーマテンプレートとアセ]]></description><link>https://tech.anti-pattern.co.jp/shopify_local_dev_env/</link><guid isPermaLink="false">Ghost__Post__6144bfa43986b000013a627c</guid><category><![CDATA[Shopify]]></category><category><![CDATA[Shopify Theme]]></category><category><![CDATA[ThemeKit]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Tue, 28 Sep 2021 14:32:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjMyODMwNTc0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjUyMDk0MDAz&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="Shopifyのローカル開発環境を準備する（Mac）" loading="lazy" width="2304" height="1536" srcset="https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjUyMDk0MDAz&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjUyMDk0MDAz&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjUyMDk0MDAz&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjUyMDk0MDAz&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2304 2304w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@mikepetrucci?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Mike Petrucci</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1472851294608-062f824d29cc?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHNob3B8ZW58MHx8fHwxNjMyODMwNTc0&ixlib=rb-1.2.1&q=80&w=2000" alt="Shopifyのローカル開発環境を準備する（Mac）"/><p>ローカル開発環境を準備することが何回かあったため手順をまとめます<br>2021年6月に発表されたShopifyCLIではなく、ThemeKitでの手順です。<br>online Store2.0を使用している場合はShopifyCLIを使用してください。<br>ThemeKit 1.3.0 darwin/amd64</br></br></br></p><h2 id="shopify%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEapi%E3%82%AD%E3%83%BC%E3%83%BB%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B">Shopify接続するためのAPIキー・パスワードを生成する</h2><p>アプリ管理<br>↓<br>プライベートアプリを管理する<br>↓<br>新しいプライベートアプリを作成する</br></br></br></br></p><p>必要事項を入力して権限を付与する<br>非アクティブなAdmin API権限を表示する<br>↓<br>テーマテンプレートとアセットを表示または管理する<br>「読み取りおよび書き込み」を選択<br>保存する<br>↓<br>アプリを作成する</br></br></br></br></br></br></br></p><p>これでAPIキー、パスワードが生成されます</p><h2 id="themekit%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">ThemeKitをインストールする</h2><p><code>$ brew tap shopify/shopify</code><br><code>$ brew install themekit</code><br>brew tapでshopifyが公開しているリポジトリをインストールできるようにする</br></br></p><h2 id="%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B">テーマをダウンロードする</h2><p>すでにShopifyアカウント内に存在するテーマをダウンロードする。<br>既存のテーマにアクセスするためにはテーマIDを取得する必要がある。</br></p><p>オンラインストア<br>↓<br>アクション<br>↓<br>コードを編集</br></br></br></br></p><p>上記操作でエディタが開かれる。そのページのURL末尾の数字がテーマID<br>https://your-shop-name.myshopify.com/admin/themes/00000000000<br>↑00000000000の部分</br></br></p><p>テーマをダウンロードするためのディレクトリに移動し、テーマをダウンロードする。以下コマンドでconfig.ymlが生成される。</p><p> <code>$ theme get --password={api password} --store=your-shop-name.myshopify.com --themeid=00000000000</code><br>↑{api password}には最初のプライベートアプリ作成で入手した「パスワード」を入れる</br></p><p>以上で開発を開始することもできるが、以下で環境を整える</p><h2 id="%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E4%B8%8A%E3%81%A7%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8B">リモート上で開発環境を作る</h2><p>オンラインストア<br>↓<br>現在のテーマ アクション<br>↓<br>複製<br>developなどの名前に変更する</br></br></br></br></br></p><h2 id="env">.env</h2><!--kg-card-begin: markdown--><pre><code>STORE_NAME = &quot;your-shop-name.myshopify.com&quot;
STORE_PASSWORD = &quot;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&quot;
THEME_ID = &quot;11111111111&quot;

PROD_THEME_ID = &quot;0000000000&quot;
</code></pre>
<!--kg-card-end: markdown--><h2 id="configyml">config.yml</h2><!--kg-card-begin: markdown--><pre><code>development:
  store: ${STORE_NAME}
  password: ${STORE_PASSWORD}
  theme_id: ${THEME_ID}
  ignore_files:
  - config/settings_data.json
  - .env

production:
  store: ${STORE_NAME}
  password: ${STORE_PASSWORD}
  theme_id: ${PROD_THEME_ID}
  ignore_files:
  - config/settings_data.json
  - .env
</code></pre>
<!--kg-card-end: markdown--><p>theme deploy時に設定の上書きを防止するために、ignore_filesにconfig/setting_data.jsonを追記しておくとよい</p><h2 id="gitignore">.gitignore</h2><p>.envを除外しておく</p><h2 id="packagejson">package.json</h2><p>デプロイとダウンロードのコマンドをスクリプト化しておく</p><!--kg-card-begin: markdown--><pre><code>{
  &quot;scripts&quot;: {
    &quot;deploy:develop&quot; : &quot;theme deploy --vars .env --env=development&quot;,
    &quot;deploy:prod&quot; : &quot;theme deploy --vars .env --env=production&quot;,
    &quot;theme_download&quot; : &quot;theme download --vars .env --env=production&quot;
  }
}
</code></pre>
<!--kg-card-end: markdown--><p>すでに公開されている本番環境へのdeploy時は、--allow-live オプションをつけろというエラーが出るが、本番環境へ誤ってデプロイしてしまうのを防止するためスクリプトには含めずに都度記載することにする。</p><p/>]]></content:encoded></item><item><title><![CDATA[AWS Proton を使って快適に開発をしたいのです！]]></title><description><![CDATA[いつもお世話になっております。株式会社アンチパターンの矢ヶ崎です。

さて、今回は AWS Proton
について書いてみたいと思います。まだ日本語の情報も少なく、あまり有名になっていない気がするサービスですが、日本のエンジニアリングの状況にとってもマッチしている気がしていますので、活用が進むといいな〜と思っております。

開発と運用・アプリとインフラの各チームの関係性
よく DevOps
という言葉を聞く場面があるかと思います。雑に言うと、開発(Dev)・運用(Ops)の垣根をなくそうぜ！人的にも組織的にもカルチャー的にもツールやプラクティス的にも！そうするとアジリティが上がるからいろいろいいぜ！みたいな感じです。しかし、さらにアプリとインフラという分けも出てくるので実際の事象は複雑です。

AWS Well-Architected フレームワークでは、運用上の優秀性の柱の組織の領域において、運用モデル 2 x 2
の表現として以下のような４つの運用モデルを示してくれています。
https://docs.aws.amazon.com/ja_jp/wellarchitected/lat]]></description><link>https://tech.anti-pattern.co.jp/letsuse-awsproton/</link><guid isPermaLink="false">Ghost__Post__61400b713986b000013a5fe8</guid><category><![CDATA[AWS]]></category><category><![CDATA[Proton]]></category><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Sun, 26 Sep 2021 16:24:11 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-13-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-13-1.png" alt="AWS Proton を使って快適に開発をしたいのです！"/><p>いつもお世話になっております。株式会社アンチパターンの矢ヶ崎です。</p><p>さて、今回は AWS Proton について書いてみたいと思います。まだ日本語の情報も少なく、あまり有名になっていない気がするサービスですが、日本のエンジニアリングの状況にとってもマッチしている気がしていますので、活用が進むといいな〜と思っております。</p><h2 id="%E9%96%8B%E7%99%BA%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%BB%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%90%84%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E9%96%A2%E4%BF%82%E6%80%A7">開発と運用・アプリとインフラの各チームの関係性</h2><p>よく DevOps という言葉を聞く場面があるかと思います。雑に言うと、開発(Dev)・運用(Ops)の垣根をなくそうぜ！人的にも組織的にもカルチャー的にもツールやプラクティス的にも！そうするとアジリティが上がるからいろいろいいぜ！みたいな感じです。しかし、さらにアプリとインフラという分けも出てくるので実際の事象は複雑です。</p><p>AWS Well-Architected フレームワークでは、運用上の優秀性の柱の組織の領域において、運用モデル 2 x 2 の表現として以下のような４つの運用モデルを示してくれています。<br><a href="https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/operational-excellence-pillar/operating-model-2-by-2-representations.html">https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/operational-excellence-pillar/operating-model-2-by-2-representations.html</a></br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1280" height="720" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>完全に分離された運用モデル</figcaption></img></figure><p>これは、大きな企業や大きなプロジェクトではよくある分け方だと思います。</p><p>アプリを作る人、運用する人、インフラを作る人、運用する人、みたいに分かれています。また各チームごとに目的が異なっているので、チーム間で責任の押し付け合いが発生することもしばしばあります。システムを作る目的は、利用者の生産性向上やユーザ体験の向上などで共通しているのに、各チームの目的にブレイクダウンすると責任の押し付け合いになってしまうのは悲しいですし不毛ですよね。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-1-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="515" height="500"><figcaption>分離されたアプリケーションのエンジニアリングと運用 (AEO) および一元化されたガバナンスを備えたインフラストラクチャのエンジニアリングと運用 (IEO)</figcaption></img></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-2-4.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="511" height="503"><figcaption>分離された AEO および一元化されたガバナンスとサービスプロバイダを備えた IEO</figcaption></img></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-3-2.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="516" height="495"><figcaption>分離された AEO と一元化されていないガバナンスを備えた IEO</figcaption></img></figure><p>２つ目以降のモデルでは、いわゆる”you build it you run it”つまり作った人が運用するモデルになっています。これはDevOpsにおいても重要なポイントの一つで、実際に運用している人が直面している問題、お客様が持っている課題をストレートに実装に活かせます。アプリケーションの分野においてはそれはとても良いかもしれませんが、ここにプラットフォームやインフラストラクチャの話が入ってくるとまたやっかいです。</p><p>４つ目のモデルになってくると、アプリケーションエンジニアが大半の部分を担当することになります。昨今のシステム開発・サービス開発においては、アプリケーションのアーキテクチャはインフラのアーキテクチャと深い関係があるので、これを同じ人が行うことでより最適な全体アーキテクチャが構築できるのは理想的です。しかし、本番のシステム運用においてはアプリケーションには直接関係がない、インフラ・プラットフォームとしてのセキュリティや、さらにシステムをまたいでのガバナンスコントロール、マネージメントなどが必要になってきます。これはとても重要なポイントですが、アプリケーションエンジニアがそこまで考えるのか？というとなかなか難しく、また、そもそもやりたくないよ！ということも多々あるかと思います。</p><h2 id="%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83%E3%81%AE%E5%AE%9F%E9%9A%9B">本番環境の実際</h2><p>例えば、インフラストラクチャも含めたアプリケーションエンジニアが思い描くAWSインフラの設計としては</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-6-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1694" height="892" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-6-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-6-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-6-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-6-1.png 1694w" sizes="(min-width: 720px) 720px"/></figure><p>このような感じかもしれません。アプリケーション寄りの方にとってのインフラとはこのようなイメージで、おれ超いい感じにインフラも設計できたぜ！っていう感じかと思います。たしかに、サービス、アプリケーションの可用性、性能、拡張性などを考えると、いい感じですよね。</p><p><br>しかし、本番運用を行っていく上では実際には、</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-7-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1328" height="922" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-7-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-7-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-7-1.png 1328w" sizes="(min-width: 720px) 720px"/></figure><p>このように考えることが大幅に増えます。<br>本番環境においては、機能・性能・可用性など以外にも、運用・セキュリティ・ガバナンス・マネージメントなど他にも多くのことを考えてインフラを構築する必要が出てきます。</br></p><p>では、アプリケーションエンジニアリングチームがやりたいこと「サービスにおけるシステム全体のアーキテクチャ設計と開発、運用」に集中し、「サービス内やサービスを超えたセキュリティ、ガバナンスコントロールやマネージメント」をプラットフォームエンジニアリングチームに任せるという分担を行うにはどうすればよいでしょうか？</p><p>具体的にAWSにおいては、 AWS Organizations や AWS Control Tower を使ってアカウントの払い出し、ランディングゾーンなどを活用し、 Service control policies や CloudFormation StackSets を使ってガバナンスコントロールやマネージメントを行っていくことになるかと思います。しかし、 AWS Organizations を使えない環境、複数ベンダーのアカウントの環境、各アカウント個別の環境と環境のバージョンコントロール、バージョンアップのタイミングなどを考えると、なかなか頭が痛くなってきます。</p><h2 id="%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%97%E3%81%9F-aws-proton">まってました AWS Proton!</h2><p>そこで！ AWS Proton の出番ですたぶん。 AWS Proton は、「コンテナおよびサーバーレスデプロイメント向けの管理の自動化」と説明がついているので、コンテナ・サーバレス文脈のサービスかな？と見えますが、どっちかというとコンテナ・サーバレスに限らずに「マネージメントとガバナンス」寄りのサービスかと思います。実際、分類的にも「マネージメントとガバナンス」になっています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-4-2.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="667" height="296" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-4-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-4-2.png 667w"/></figure><p>AWS Proton を使うにあたっては、２種類の登場人物が出てきます。管理者(Administrators)と開発者(Developers)です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-5-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1600" height="730" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-5-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-5-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-5-1.png 1600w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/proton/latest/adminguide/Welcome.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What is AWS Proton? - AWS Proton</div><div class="kg-bookmark-description">As an administrator, you create a library of versioned infrastructure-as-code templates to provide standardized infrastructure and deployment tooling for serverless and container-based applications. Then, you or developers on your team, in turn, can select from the available templates to automate th…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico" alt="AWS Proton を使って快適に開発をしたいのです！"><span class="kg-bookmark-author">AWS Proton</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.aws.amazon.com/proton/latest/adminguide/images/service-diagram_1.png" alt="AWS Proton を使って快適に開発をしたいのです！"/></div></a></figure><p>正確には上記公式ドキュメントを読んでいただければと思いますが、ざっくりの流れでいうと</p><p>・管理者が環境テンプレート（ネットワーク、セキュリティ、マネジメントやガバナンスが入っている）を作成する<br>・環境テンプレートを、実際のAWSアカウントの各環境に適用する<br>・管理者がサービステンプレート（インスタンスやオートスケーリング、CI/CDなど実際のプロダクトやサービスに必要な構成が入っている）を作成する<br>・管理者もしくは開発者が、サービステンプレートを各環境に適用する<br>・開発者はアプリケーションのコードを書く<br>・開発者はコードリポジトリにプッシュし、CI/CDパイプラインがデプロイする<br>・サービスが動き出す</br></br></br></br></br></br></p><p>という感じです。</p><p>この「環境」というものの単位をどう考えるのかがまた一つのポイントになってきます。VPC単位で環境を考える、アカウント単位で環境を考えるなどによっても構成のしかたが変わってきます。<br>昨今のAWSのマルチアカウントベストプラクティスを考えると、例えば開発環境・ステージング環境・本番環境などの分割、またサービスによる環境の分割においても、AWSアカウントを分割する方法が良さそうです。実際にAWSの各種サービスもマルチアカウントを前提にしているサービスが多くなってきている印象です。そのため、ここではAWS Protonを利用するにあたっても、「環境」=「AWSアカウント」という単位で考えてみることにしたいと思います。</br></p><p>マルチアカウントでAWS Proton利用する場合は、</p><p>・環境アカウント（各サービスが動くアカウント）から、管理アカウント（AWS Protonのテンプレートやそのバージョンが管理されているアカウント）に環境利用の申請をする<br>・管理アカウントが許可する<br>・管理アカウントから環境アカウントへ、環境テンプレートやサービステンプレートが展開できるようになる<br>・管理者で環境やサービスをコントロールしてあげる<br>・開発側はアプリケーションに集中する</br></br></br></br></p><p>という感じになります。</p><h2 id="%E3%83%AC%E3%83%83%E3%83%84%E3%83%89%E3%82%A5%E3%83%BC%E3%82%A4%E3%83%83%E3%83%88%EF%BC%81">レッツドゥーイット！</h2><p>では、実際にやってみましょう！</p><p>Fargate ベースでのサンプルを使って実際に AWS Proton を操作してみるサンプルは、<a href="https://github.com/aws-samples/aws-proton-sample-templates/tree/main/loadbalanced-fargate-svc">こちらのGitHubの公式サンプル</a>にそってやっていただくのがわかりやすいかと思います！このサンプルもマルチアカウントに対応しており、サービス展開時に、環境アカウント側のAWSアカウントIDを入力する部分(pipeline: environment_account_ids)にアカウントIDを入れれば、クロスアカウントでのECRからのデプロイを行うCI/CDパイプラインが作成されます。おおよそのイメージとしては、下図のような感じのインフラができちゃいます！<br/></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-10-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1748" height="960" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-10-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-10-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-10-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-10-1.png 1748w" sizes="(min-width: 720px) 720px"/></figure><p>そのうち、「環境」として作成されるものは、</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-11-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="990" height="972" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-11-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-11-1.png 990w" sizes="(min-width: 720px) 720px"/></figure><p>こんな感じで、この「環境」に対応した「サービス」として作成されるものは、</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-12-1.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1758" height="970" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-12-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-12-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-12-1.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-12-1.png 1758w" sizes="(min-width: 720px) 720px"/></figure><p>この丸の部分になります。</p><p>こうなると何がよいかというと、「環境」の部分は完全にプラットフォーム・インフラチームが管理することができ、「サービス」の部分は、プラットフォーム・インフラチームもしくはアプリケーションチームと相談してテンプレート化してバージョン管理をする、さらにその上で動作する部分はCI/CDパイプラインを通して完全にアプリケーションチームが管理することができます。<br>つまり、アプリケーションチームの立場からすると、「アプリケーションの関係するところに集中して、まわりのよくわからない部分はやらなくてもいいのね！最高！」って感じになることもできそうです。これは熱いですね。効率やアジリティのためにある程度はインフラも意識して開発する必要がありますが、直接関係ないところや管理はおまかせできちゃうなんて最高です。</br></p><h2 id="%E3%81%9D%E3%82%93%E3%81%AA%E3%80%81%E3%83%A2%E3%83%80%E3%83%B3%E3%81%A3%E3%81%A6%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%A6%E3%82%82%E3%83%BB%E3%83%BB%E3%83%BB">そんな、モダンって言われても・・・</h2><p>ただ、結局はコンテナとかサーバレスとかにしないとだめなんじゃないのか・・・EC2でJavaベースで作ってるから、このような状況は結局作れない、、、結局 2x2 の運用モデルになっちゃうのか・・・</p><p>と思いきや、AWS Proton のテンプレートは基本的に CloudFormation ベースでできているので、EC2/Javaベースでも当然できます。コンテナほどスムーズにはいかないですが、できます。</p><p>ということで、サンプルを作ってみました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yaggytter/sample-template-aws-proton"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yaggytter/sample-template-aws-proton</div><div class="kg-bookmark-description">Contribute to yaggytter/sample-template-aws-proton development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="AWS Proton を使って快適に開発をしたいのです！"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yaggytter</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/aee3ec7917f8266381326eb8eed7354b08ae80848f9bec343a05ad751ab3e838/yaggytter/sample-template-aws-proton" alt="AWS Proton を使って快適に開発をしたいのです！"/></div></a></figure><p>これはテンプレートのサンプルで、その上で動く簡易的な Spring Boot アプリケーションは、</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yaggytter/simpleapp-springboot-java"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yaggytter/simpleapp-springboot-java</div><div class="kg-bookmark-description">Contribute to yaggytter/simpleapp-springboot-java development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="AWS Proton を使って快適に開発をしたいのです！"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yaggytter</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/3a296fffbde7096b47a655577947a830132afe91db63ecb142ad5e3df5964567/yaggytter/simpleapp-springboot-java" alt="AWS Proton を使って快適に開発をしたいのです！"/></div></a></figure><p>こちらです。</p><p>これを使ってみると、おおよそこんな感じの構成が実現できます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-32.png" class="kg-image" alt="AWS Proton を使って快適に開発をしたいのです！" loading="lazy" width="1774" height="984" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-32.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-32.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-32.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-32.png 1774w" sizes="(min-width: 720px) 720px"/></figure><p>EC2 ベースでの CI/CD のやり方はいろいろあるかと思いますが、今回の構成では、 AMI を作成する専用のインスタンスを用意しておき、Code Repository(GitHubなど)の更新のタイミングでCodePipelineが動き、CodeBuildで mvn clean package をして成果物を AMI作成用 インスタンスにコピーし、 AMI を再作成、そしてオートスケーリンググループを更新しています。(EC2 Image Builder を使うのも良いかもしれません)<br/></p><h2 id="%E4%BB%8A%E5%BE%8C%E3%81%AE-aws-proton-%E3%81%B8%E3%81%AE%E6%9C%9F%E5%BE%85">今後の AWS Proton への期待</h2><p>AWS Proton 、ほんと素晴らしくて、ぼくたちの開発・運用スタイルをがらっと変えてくれる期待が高いのですが、まだちょっとアレなので、現時点でこういう機能があるともっと現実的に使いやすいな〜と思うものとしては</p><p>・テンプレートにCDKが使いたい（できればTerraformも）<br>・開発側アカウント(環境アカウント)から、サービステンプレートを自分で選んで適用できるようになりたい<br>・サンプルの環境テンプレートやサービステンプレートが充実してるといいな<br>・謎の内部エラーが出たときにデバッグできない<br>・公式ドキュメントがわかりづらい、そして間違っている・・・(フィードバック送ります)</br></br></br></br></p><p>このあたりができると、各組織のCCoEのみなさんもハッピーになれるんじゃないかな、デベロッパーもいろいろ考えなくて良くてハッピーになれるんじゃないかな、なんて思ってたりします。</p><p>ということで、 AWS Proton を使ってハッピーデベロッパーライフを過ごしていきましょ〜（希望）</p><p>こちらからは以上です。</p><p/><p>謝辞：AMI 更新の部分は、 株式会社シーズの原口さんにご教示いただきました。ありがとうございます！</p>]]></content:encoded></item><item><title><![CDATA[ついにCloud Run に always-on CPUが登場したぞ！！]]></title><description><![CDATA[※まだプレビュー版です(2021/09/18)

Cloud Run gets always-on CPU allocation | Google Cloud BlogNew always-on CPU
allocation for Cloud Run opens the doors to running workloads that use
background processes.Google Cloud BlogSteren Giannini Senior Product Manager
[https://cloud.google.com/blog/products/serverless/cloud-run-gets-always-on-cpu-allocation]
今まではRequestがきてからResponseを返すまでCPUの割当がされていました。しかしそれでは下記のSlackのような3秒以内レスポンスを返す必要があるケースにて困ることが多々有りました。基本的にこのようなAPIはレスポンスを先に返してしまい、あとで別途非同期で処理を実行するという形で対応していましたが、そ]]></description><link>https://tech.anti-pattern.co.jp/cloud-run/</link><guid isPermaLink="false">Ghost__Post__6145a2d93986b000013a628b</guid><category><![CDATA[GCP]]></category><category><![CDATA[Cloud Run]]></category><category><![CDATA[Go]]></category><category><![CDATA[always-on CPU]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Mon, 20 Sep 2021 01:33:42 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_631-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_631-1.png" alt="ついにCloud Run に always-on CPUが登場したぞ！！"/><p>※まだプレビュー版です(2021/09/18)</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/blog/products/serverless/cloud-run-gets-always-on-cpu-allocation"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cloud Run gets always-on CPU allocation | Google Cloud Blog</div><div class="kg-bookmark-description">New always-on CPU allocation for Cloud Run opens the doors to running workloads that use background processes.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cloud.google.com/blog/static/assets/apple-icon.png" alt="ついにCloud Run に always-on CPUが登場したぞ！！"><span class="kg-bookmark-author">Google Cloud Blog</span><span class="kg-bookmark-publisher">Steren Giannini Senior Product Manager</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Cloud_Run.max-2200x2200.jpg" alt="ついにCloud Run に always-on CPUが登場したぞ！！"/></div></a></figure><p>今まではRequestがきてからResponseを返すまでCPUの割当がされていました。しかしそれでは下記のSlackのような3秒以内レスポンスを返す必要があるケースにて困ることが多々有りました。基本的にこのようなAPIはレスポンスを先に返してしまい、あとで別途非同期で処理を実行するという形で対応していましたが、それが簡単にCloud Runではできませんでした。</p><blockquote>An instance will never stay idle for more than 15 minutes after processing a request</blockquote><p>それがリクエスト後最大15分間CPUが割り当てられるようになります。</p><blockquote>When you opt in to "CPU always allocated", you are billed for the entire lifetime of container instances</blockquote><p>また課金形態もinstance単位に変わりますが、</p><blockquote>CPU is priced 25% lower and memory 20% lower</blockquote><p>CPUが25%、メモリーが20%通常のものよりも安くなります。すごい！<br/></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://api.slack.com/interactivity/slash-commands#responding_to_commands"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Enabling interactivity with Slash Commands | Slack</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a.slack-edge.com/80588/marketing/img/meta/favicon-32.png" alt="ついにCloud Run に always-on CPUが登場したぞ！！"><span class="kg-bookmark-author">Slack</span><span class="kg-bookmark-publisher">Slack</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://a.slack-edge.com/19ec7/img/api/interactivity/slash_commands.svg" alt="ついにCloud Run に always-on CPUが登場したぞ！！"/></div></a></figure><blockquote>This confirmation <em>must be</em> received by Slack within 3000 milliseconds of the original request being sent, otherwise a <code>Timeout was reached</code> will be displayed to the user. If you couldn't <a href="https://api.slack.com/docs/verifying-requests-from-slack">verify the request payload</a>, your app should return an error instead and ignore the request.</blockquote><h2 id="%E3%81%8A%E8%A9%A6%E3%81%97">お試し</h2><p>今回試したコードはこちらにあります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/cloud-run-always/blob/main/main.go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">cloud-run-always/main.go at main · kooooohe/cloud-run-always</div><div class="kg-bookmark-description">Contribute to kooooohe/cloud-run-always development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="ついにCloud Run に always-on CPUが登場したぞ！！"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/58087019512398a67664387b3330e8c52fac15c858252e62ce1ebd327d4d9f00/kooooohe/cloud-run-always" alt="ついにCloud Run に always-on CPUが登場したぞ！！"/></div></a></figure><p>Pub/Subを使用して、いろいろ試してみたいと思います。</p><h3 id="%E4%B8%8B%E6%BA%96%E5%82%99">下準備</h3><h3 id="cloud-build">Cloud Build</h3><p>とりあえず、Cloud Buildのyamlファイルを作っておいて楽をします。</p><!--kg-card-begin: markdown--><pre><code class="language-yaml">  1 steps:
  2 - name: gcr.io/cloud-builders/docker
  3   args: [&quot;build&quot;, &quot;-t&quot;, &quot;gcr.io/$PROJECT_ID/cloud-run-sample&quot;, &quot;.&quot;]
  4 images:
  5 - gcr.io/$PROJECT_ID/cloud-run-sample

</code></pre>
<!--kg-card-end: markdown--><p>Cloud Shellから下記コマンドでデプロイ</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_626.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="557" height="44"/></figure><h3 id="pubsub">Pub/Sub</h3><p>2つTOPICを作っておきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_622.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="506" height="121"/></figure><h3 id="cloud-run">Cloud Run</h3><p/><p>通常Ver</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_623.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="570" height="531"/></figure><p>always-on CPU</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_624.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="597" height="528"/></figure><p>Cloud Runを作成する際に、「CPUを常に割り当てる」にチェックを入れるだけなのでとても簡単。ただしこのモードを選んだ際には、メモリの512MiBよりも下には設定できなかったので今回は512を設定。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_625.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="644" height="172" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_625.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_625.png 644w"/></figure><p/><p>Cloud RunへRequest → Responseをすぐ返すGoroutinesでPub/Subにデータを投入と言った感じ。</p><p>最初は１秒ごとにMessageを作成し、検証していきます。</p><!--kg-card-begin: markdown--><pre><code>package main

import (
	&quot;context&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;os&quot;
	&quot;time&quot;

	&quot;cloud.google.com/go/pubsub&quot;
	&quot;net/http&quot;
)

func main() {

	http.HandleFunc(&quot;/&quot;, func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, &quot;Hello world&quot;)
	})
	http.HandleFunc(&quot;/start&quot;, handler)

	port := os.Getenv(&quot;PORT&quot;)
	if port == &quot;&quot; {
		port = &quot;8080&quot;
		log.Printf(&quot;defaulting to port %s&quot;, port)
	}

	log.Printf(&quot;listening on port %s&quot;, port)
	if err := http.ListenAndServe(&quot;:&quot;+port, nil); err != nil {
		log.Fatal(err)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	ctx := context.Background()
	projectID := os.Getenv(&quot;PROJECT_ID&quot;)
	topicID := os.Getenv(&quot;TOPIC_ID&quot;)

	go func() {
		client, err := pubsub.NewClient(ctx, projectID)
		if err != nil {
			log.Fatalf(&quot;Faild to create client %v&quot;, err)
		}

		defer client.Close()
		for i := 0; i &lt; 1000; i++ {

			topic := client.Topic(topicID)
			res := topic.Publish(ctx, &amp;pubsub.Message{
				Data: []byte(&quot;hello world&quot;),
			})
			fmt.Printf(&quot;%v\n&quot;, topic)
			fmt.Printf(&quot;%v\n&quot;, res)
			msgID, err := res.Get(ctx)
			if err != nil {
				log.Fatal(err)
			}
			fmt.Println(msgID)
			time.Sleep(time.Second * 1)
		}
	}()

	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, &quot;Start!&quot;)
}

</code></pre>
<!--kg-card-end: markdown--><p/><p/><p>通常の</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_619.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="748" height="256" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_619.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_619.png 748w" sizes="(min-width: 720px) 720px"/></figure><p>always-on CPU</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_618.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="762" height="223" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_618.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_618.png 762w" sizes="(min-width: 720px) 720px"/></figure><ul><li>通常: 800</li><li>always-on CPU: 1000</li></ul><p>となりました。</p><p>両方共15分程度起動しています。通常モードの方もレスポンスが返ったあとに全くCPUが割り当てられなって落ちるわけではなく、最低限のものが割り当てられているようですね。</p><p>1秒スリープを入れるのでは200程度の差で大きくはないので、、、</p><h2 id="sleep%E3%82%92%E5%A4%96%E3%81%97%E3%80%8110%E4%B8%87%E4%BB%B6%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%97%E3%81%B8"><br>Sleepを外し、10万件のループへ</br></h2><!--kg-card-begin: markdown--><pre><code class="language-go">  func handler(w http.ResponseWriter, r *http.Request) {    
        ctx := context.Background()    
          projectID := os.Getenv(&quot;PROJECT_ID&quot;)    
          topicID := os.Getenv(&quot;TOPIC_ID&quot;)    
      
          go func() {    
                  client, err := pubsub.NewClient(ctx, projectID)    
                  if err != nil {    
                          log.Fatalf(&quot;Faild to create client %v&quot;, err)    
                  }    
      
                  defer client.Close()    
                  for i := 0; i &lt; 100000; i++ {    
                          res := topic.Publish(ctx, &amp;pubsub.Message{    
                                  Data: []byte(&quot;hello world&quot;),    
                          })    
                          fmt.Printf(&quot;%v\n&quot;, topic)    
                          fmt.Printf(&quot;%v\n&quot;, res)    
                          msgID, err := res.Get(ctx)    
                          if err != nil {    
                                  log.Fatal(err)    
                          }    
                          fmt.Println(msgID)        
                  }    
          }()    
      
          w.WriteHeader(http.StatusOK)    
          fmt.Fprintf(w, &quot;Start!&quot;)    
  }  
</code></pre>
<!--kg-card-end: markdown--><p/><h3 id="%E3%80%90%E7%B5%90%E6%9E%9C%E3%80%91pubsub%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E6%95%B0">【結果】Pub/Subのメッセージ数</h3><p>通常</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_630.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="733" height="235" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_630.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_630.png 733w" sizes="(min-width: 720px) 720px"/></figure><p>always-on CPU</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_631.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="770" height="213" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_631.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_631.png 770w" sizes="(min-width: 720px) 720px"/></figure><p/><h3/><ul><li>通常: 2700</li><li>always-on CPU: 37000</li></ul><p>となりました。</p><p>Goroutines での多重起動をさせたらもっと結果は変わるかもしれません。</p><p>これによってCloud Runでかなりのサービスを稼働させることができるじゃないでしょうか？</p><p>もし15分以上起動させたい場合はmin-instanceを設定すると良さそうです。</p><blockquote>Combined with <a href="https://cloud.google.com/blog/products/serverless/cloud-run-adds-min-instances-feature-for-latency-sensitive-apps">Cloud Run minimum instances</a>, you can even keep a certain number of container instances up and running with full access to CPU resources.</blockquote><p>Cloud Runが出たときの衝撃は今でも忘れられず、どんどん進化しているのでワクワクしますね。</p><p/><h2 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h2><p>always-on CPUもRequestが飛んでいない時は使は0にスケールしてくれますね。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_633.png" class="kg-image" alt="ついにCloud Run に always-on CPUが登場したぞ！！" loading="lazy" width="627" height="196" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_633.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_633.png 627w"/></figure>]]></content:encoded></item><item><title><![CDATA[gomockでスライスのMatcherを作る]]></title><description><![CDATA[gomockでスライスを順不同で一致させるためにMatcherを自作しました。

※追記
v1.6.0 から InAnyOrder というMatcherが用意されているので、不要になりました。

gomock package - github.com/golang/mock/gomock - pkg.go.devGo
[https://pkg.go.dev/github.com/golang/mock/gomock#InAnyOrder]gomock
GolangでUTを書く際に使います。

GitHub - golang/mock: GoMock is a mocking framework for the Go programming
language.GoMock is a mocking framework for the Go programming language. -
GitHub
- golang/mock: GoMock is a mocking framework for the Go programming language.
GitHubgolang [htt]]></description><link>https://tech.anti-pattern.co.jp/gomock/</link><guid isPermaLink="false">Ghost__Post__611a536c3986b000013a576e</guid><category><![CDATA[Go]]></category><category><![CDATA[golang]]></category><category><![CDATA[gomock]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Thu, 02 Sep 2021 11:10:24 GMT</pubDate><content:encoded><![CDATA[<p>gomockでスライスを順不同で一致させるために<code>Matcher</code>を自作しました。</p><p>※追記<br>v1.6.0 から <code>InAnyOrder</code> というMatcherが用意されているので、不要になりました。</br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://pkg.go.dev/github.com/golang/mock/gomock#InAnyOrder"><div class="kg-bookmark-content"><div class="kg-bookmark-title">gomock package - github.com/golang/mock/gomock - pkg.go.dev</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://pkg.go.dev/static/shared/icon/favicon.ico"><span class="kg-bookmark-author">Go</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://pkg.go.dev/static/shared/icon/code_gm_grey_24dp.svg"/></div></a></figure><h2 id="gomock">gomock</h2><p>GolangでUTを書く際に使います。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/golang/mock"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - golang/mock: GoMock is a mocking framework for the Go programming language.</div><div class="kg-bookmark-description">GoMock is a mocking framework for the Go programming language. - GitHub - golang/mock: GoMock is a mocking framework for the Go programming language.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">golang</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f4376254169c192a8a7524924052ca416393740b3b92872e58f54a42c9e29193/golang/mock"/></div></a></figure><p>interfaceの定義からモックを自動生成できるので、比較的簡単にUTが書けます。</p><p>例えば以下のようなメソッドがあった時、</p><pre><code>func (u *userUsecase) GetByIDs() (Users, error) {
	idMap := map[int64]struct{}{
		1: {},
		2: {},
	}

	ids := make([]int64, 0, len(idMap))
	for id := range idMap {
		ids = append(ids, id)
	}

	us, err := u.userRepository.GetByIDs(ids)
	if err != nil {
		return nil, err
	}
	return us, nil
}
</code></pre><p><code>userRepository</code>がinterfaceで定義されていれば、gomockでモック化してテストできます。</p><p>しかし、<code>idMap</code>はmapなので<code>ids</code>の順番が保証されません。</p><p>よって、以下のようなテストを書くと、ランダムでテストが失敗するようになります。</p><pre><code>func Test_GetByIDs(t *testing.T) {
	...
	ctrl := gomock.NewController(t)
	repository := mock.NewMockIRepository(ctrl)
	repository.EXPECT().
		GetByIDs([]int64{1, 2}).
		Return([]*user.User{ ... }, nil).
		Times(1)
	...
}</code></pre><p>普通にスライスを渡すと、順番も一致していなければエラーになります。</p><h2 id="%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E7%94%A8%E3%81%AEmatcher%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B">スライス用のMatcherを定義する</h2><p>gomockでは任意の<code>Matcher</code>を定義することができます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/golang/mock/blob/master/gomock/matchers.go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">mock/matchers.go at master · golang/mock</div><div class="kg-bookmark-description">GoMock is a mocking framework for the Go programming language. - mock/matchers.go at master · golang/mock</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">golang</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f4376254169c192a8a7524924052ca416393740b3b92872e58f54a42c9e29193/golang/mock"/></div></a></figure><pre><code>// A Matcher is a representation of a class of values.
// It is used to represent the valid or expected arguments to a mocked method.
type Matcher interface {
	// Matches returns whether x is a match.
	Matches(x interface{}) bool

	// String describes what the matcher matches.
	String() string
}</code></pre><p><code>Matcher</code>をモック関数の引数に渡すと、内部で<code>Matches</code>メソッドを呼び、<code>true</code>が返ってきたら一致、とみなすようになっています。</p><p>この2つのメソッドを実装します。</p><pre><code class="language-Go">type sliceMatcher struct {
	slice interface{}
}

func (m sliceMatcher) Matches(x interface{}) bool {
	xValue := reflect.ValueOf(x)
	mValue := reflect.ValueOf(m.slice)
	// 引数がスライスか確認
	if xValue.Kind() != reflect.Slice {
		return false
	}
	// 期待値がスライスか確認
	if mValue.Kind() != reflect.Slice {
		return false
	}
	// スライスの長さが一致しているか確認
	if xValue.Len() != mValue.Len() {
		return false
	}
	mUsedIndex := make(map[int]struct{}, mValue.Len())
	for i := 0; i &lt; xValue.Len(); i++ {
		x := xValue.Index(i)
		match := false
		for j := 0; j &lt; mValue.Len(); j++ {
			if _, ok := mUsedIndex[j]; ok {
				continue
			}
			m := mValue.Index(j)
			// 一致しているものがあるか確認
			if reflect.DeepEqual(x.Interface(), m.Interface()) {
				match = true
				mUsedIndex[j] = struct{}{}
				break
			}
		}
		if !match {
			return false
		}
	}
	return true
}

func (m sliceMatcher) String() string {
	return fmt.Sprintf("is equal to %v", m.slice)
}

var _ gomock.Matcher = sliceMatcher{}
</code></pre><p>フィールドを<code>interface{}</code>で定義しているので、任意の型のスライスをマッチさせることができます。</p><p><code>reflect</code> パッケージを使い、順不同で一致しているか確認しています。2重ループなのでパフォーマンスは悪いですが、そんなに大きいスライスを扱うことはないと思うので良しとしています。</p><p>多分もう少し綺麗に書けると思いますが、テストで使うだけなのでだいぶ妥協してます。</p><p>以下のように使います。</p><pre><code>func Test_GetByIDs(t *testing.T) {
	...
	ctrl := gomock.NewController(t)
	repository := mock.NewMockIRepository(ctrl)
	repository.EXPECT().
		GetByIDs(sliceMatcher{[]int64{1, 2}}).
		Return([]*user.User{ ... }, nil).
		Times(1)
	...
}</code></pre><p><code>GetByIDs</code>に来る値が<code>[]int64{1, 2}</code>または<code>[]int64{2, 1}</code>の場合に一致します。</p><p/><p>mapを使った処理でも簡単にテストが書けるようになりました。</p>]]></content:encoded></item><item><title><![CDATA[Slackのサイドバーをカスタマイズして使いやすく！]]></title><description><![CDATA[Slackの参加チャンネルが増えてきて、サイドバーがごちゃごちゃしてるのが嫌！もっと見やすくしたい！と思ったので、カスタムセクションや環境設定をいじってサイドバーを整理してみました。

整理する前
一番よく使うチャンネルは「スター付き」配下に、それ以外のチャンネルは「チャンネル」配下に、アルファベット順でただ並べている状態。

参加チャンネルが多くサイドバーが長い為、未読メッセージの確認をする時によくスクロールしてました...

整理した後
①頻繁に投稿するチャンネルを「スター付き」配下に移動し、よく覗くチャンネルのみ「チャンネル」配下に入れるよう変更
（それ以外のチャンネルはカスタムセクションへ=>②）

②それ以外のチャンネル(=たまに覗けば良いチャンネル)は、ほぼミュートにして、部門や内容毎に「カスタムセクション」を作成、チャンネルの並べ替え設定で最近のアクティビティが上位に来るように設定

普段はカスタムセクションを閉じておけば邪魔にならないし、たまにカスタムセクション内を覗く時も、最近投稿があったチャンネルが上位に表示されるようになったので、上の方の動きのあるチャンネルだけチ]]></description><link>https://tech.anti-pattern.co.jp/slack-customize/</link><guid isPermaLink="false">Ghost__Post__60fedf533986b000013a3d61</guid><category><![CDATA[Slack]]></category><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 01 Sep 2021 10:14:09 GMT</pubDate><content:encoded><![CDATA[<p>Slackの参加チャンネルが増えてきて、サイドバーがごちゃごちゃしてるのが嫌！もっと見やすくしたい！と思ったので、カスタムセクションや環境設定をいじってサイドバーを整理してみました。</p><h2 id="%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E5%89%8D">整理する前</h2><p>一番よく使うチャンネルは「スター付き」配下に、それ以外のチャンネルは「チャンネル」配下に、アルファベット順でただ並べている状態。</p><p>参加チャンネルが多くサイドバーが長い為、未読メッセージの確認をする時によくスクロールしてました...</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1.Slack---------_----------.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1.Slack---------_----------.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1.Slack---------_----------.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/1.Slack---------_----------.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/1.Slack---------_----------.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E6%95%B4%E7%90%86%E3%81%97%E3%81%9F%E5%BE%8C">整理した後</h2><p>①頻繁に投稿するチャンネルを「スター付き」配下に移動し、よく覗くチャンネルのみ「チャンネル」配下に入れるよう変更<br>（それ以外のチャンネルはカスタムセクションへ=&gt;②）</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/2.Slack---------_---.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/2.Slack---------_---.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/2.Slack---------_---.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/2.Slack---------_---.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/2.Slack---------_---.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>②それ以外のチャンネル(=たまに覗けば良いチャンネル)は、ほぼミュートにして、部門や内容毎に「カスタムセクション」を作成、チャンネルの並べ替え設定で最近のアクティビティが上位に来るように設定</p><p>普段はカスタムセクションを閉じておけば邪魔にならないし、たまにカスタムセクション内を覗く時も、最近投稿があったチャンネルが上位に表示されるようになったので、上の方の動きのあるチャンネルだけチェックすればOKになりました！</p><p>また、主要なチャンネルをサイドバー上部に集めたので、スクロールする回数も減りました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/3.Slack---------_---.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/3.Slack---------_---.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/3.Slack---------_---.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/3.Slack---------_---.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/3.Slack---------_---.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>③環境設定でサイドバーに常に表示する項目を編集、デフォルトでチェックされていた「すべてのDM」と「Slackコネクト」を外して、「全未読」を追加</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/4.Slack----_-------.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/4.Slack----_-------.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/4.Slack----_-------.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/4.Slack----_-------.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/4.Slack----_-------.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>「全未読」を追加した事により、わざわざ各チャンネルを開かなくても未読メッセージの確認ができるようになりました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/5.Slack---_---.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/5.Slack---_---.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/5.Slack---_---.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/5.Slack---_---.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/5.Slack---_---.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>誤って既読を押しちゃった場合でも「全未読」の画面から他の画面に遷移する前なら「元に戻す」を押して未読を復活できる点や、ミュートにしてるチャンネルの未読メッセージは「全未読」に表示されない所など、便利だなと思いました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/6.Slack---_----.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/6.Slack---_----.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/6.Slack---_----.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/6.Slack---_----.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/6.Slack---_----.png 2400w" sizes="(min-width: 720px) 720px"/></figure><p>④環境設定のテーマで、ワークスペースのカラーを変更<br>今までデフォルトカラーを使ってましたが、自分で色を選んだ方が愛着が湧いて良い感じでした！（「オーバージーン」から「ノクターン」に変更）</br></p><p>Slack側が用意したカラーだけでも21種類あるので十分選べますが、気に入るものがない場合は、カスタムテーマの作成から自分だけのオリジナルカラーを作ることが出来ます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/7.Slack---_----.png" class="kg-image" alt="" loading="lazy" width="2000" height="1250" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/7.Slack---_----.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/7.Slack---_----.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/7.Slack---_----.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w2400/2022/05/7.Slack---_----.png 2400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%82%84%E3%82%8A%E6%96%B9">やり方</h2><p>▼カスタムセクションの作成<br><a href="https://slack.com/intl/ja-jp/help/articles/360043207674-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B5%E3%82%A4%E3%83%89%E3%83%90%E3%83%BC%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B">https://slack.com/intl/ja-jp/help/articles/360043207674-カスタムセクションを使用してサイドバーを整理する</a></br></p><p>▼サイドバー上部に表示する項目の変更<br><a href="https://slack.com/intl/ja-jp/help/articles/212596808-%E3%82%B5%E3%82%A4%E3%83%89%E3%83%90%E3%83%BC%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B">https://slack.com/intl/ja-jp/help/articles/212596808-サイドバーの環境設定を変更する</a></br></p><p>▼ワークスペースのテーマカラーの変更<br><a href="https://slack.com/intl/ja-jp/help/articles/205166337-Slack-%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B">https://slack.com/intl/ja-jp/help/articles/205166337-Slack-のテーマを変更する</a></br></p><p>是非、色々とカスタマイズしてみてください！<br>それでは楽しいSlackライフを！</br></p>]]></content:encoded></item><item><title><![CDATA[gulp-sitemapを使ってsitemap生成を自動化する]]></title><description><![CDATA[やりたいこと
ページが追加される度にsitemap.xmlをいちいち手入れするのは面倒なので自動化したい。

対象サイトの状況
パーツを共通化したかったのでPug+Scssを使っています。
それをgulpを使ってビルドするようになっています。

元から使っているパッケージ(一部)
gulp
gulp-pug

やったこと
gulp-sitemapの導入
ちょうど良さそうなパッケージがあったので利用することにしました。

gulp-sitemapGenerate a search engine friendly sitemap.xml using a Gulp streamnpm
[https://www.npmjs.com/package/gulp-sitemap]使い方は見ていただいた通りです。

シンプルな機能なので、基本的には困らないと思いますが、コツはhtmlファイルがビルドされてから動作するようにすることです。そうでないと実行のタイミング次第では抜け漏れが出てしまいます。

今回対象の環境では、アウトプット先を一回空にして、その後各種ファイルをビルドするような処理の流れにして]]></description><link>https://tech.anti-pattern.co.jp/use-gulp-sitemap-to-automate-sitemap-generation/</link><guid isPermaLink="false">Ghost__Post__612a1bdb3986b000013a5bb0</guid><category><![CDATA[gulp]]></category><category><![CDATA[Pug]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 31 Aug 2021 05:38:12 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/og-image.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">やりたいこと</h1>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/og-image.jpg" alt="gulp-sitemapを使ってsitemap生成を自動化する"/><p>ページが追加される度にsitemap.xmlをいちいち手入れするのは面倒なので自動化したい。</p>
<h2 id="%E5%AF%BE%E8%B1%A1%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E7%8A%B6%E6%B3%81">対象サイトの状況</h2>
<p>パーツを共通化したかったのでPug+Scssを使っています。<br>
それをgulpを使ってビルドするようになっています。</br></p>
<h2 id="%E5%85%83%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E4%B8%80%E9%83%A8">元から使っているパッケージ(一部)</h2>
<p>gulp<br>
gulp-pug</br></p>
<h1 id="%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">やったこと</h1>
<h2 id="gulp-sitemap%E3%81%AE%E5%B0%8E%E5%85%A5">gulp-sitemapの導入</h2>
<p>ちょうど良さそうなパッケージがあったので利用することにしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.npmjs.com/package/gulp-sitemap"><div class="kg-bookmark-content"><div class="kg-bookmark-title">gulp-sitemap</div><div class="kg-bookmark-description">Generate a search engine friendly sitemap.xml using a Gulp stream</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.npmjs.com/1996fcfdf7ca81ea795f67f093d7f449.png" alt="gulp-sitemapを使ってsitemap生成を自動化する"><span class="kg-bookmark-author">npm</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" alt="gulp-sitemapを使ってsitemap生成を自動化する"/></div></a></figure><!--kg-card-begin: markdown--><p>使い方は見ていただいた通りです。</p>
<p>シンプルな機能なので、基本的には困らないと思いますが、コツはhtmlファイルがビルドされてから動作するようにすることです。そうでないと実行のタイミング次第では抜け漏れが出てしまいます。</p>
<p>今回対象の環境では、アウトプット先を一回空にして、その後各種ファイルをビルドするような処理の流れにしていたので、それの末尾にsitemapをビルドする処理を加えました。</p>
<pre><code>exports.default = series(
	cleanDocs,
	parallel(
		buildScripts,
		buildStyles,
		buildHtmls,
		buildSVGs,
		copyFiles
	),
	buildSitemap
);
</code></pre>
<p>これにより各種コンテンツが出揃ってからsitemapが生成できます。</p>
<p>楽ちんですね！</p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GitHub GraphQL API を利用してReview のコメントを抽出してみた]]></title><description><![CDATA[

こおりやまです

以前、こちらのブログでPull requests のコメント取得しましたが、Reviewコメントが取得できていなくクエリを再検討しました。

GitHub GraphQL API を利用してPull requests のコメントを抽出してみたこおりやまです 以前、こちらのブログでGitHub
GraphQL APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests のコメント取得が必要になりGoogle
Apps
Script（GAS）から呼び出しスプレッドシートに出力してみました。 GitHub GraphQL API をさわってみた まずは GraphQL API
Explorer を利用して必要な情報が取得できるようQuery を検討します。 実行するクエリを作成したら、スクリプトを書いていきます。
書いたコードはこんな感じ （設定情報は環境に合わせて設定して下さい） /*…Anti-Pattern Inc. Engineering BlogHiroki
Kooriyama
[https://ghost.tech.ant]]></description><link>https://tech.anti-pattern.co.jp/github-graphql-api-woli-yong-sitepull-requests-nokomentowochou-chu-sitemita-2/</link><guid isPermaLink="false">Ghost__Post__6112617a3986b000013a5643</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 25 Aug 2021 09:46:26 GMT</pubDate><content:encoded><![CDATA[<p/><p>こおりやまです</p><p>以前、こちらのブログでPull requests のコメント取得しましたが、Reviewコメントが取得できていなくクエリを再検討しました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ghost.tech.anti-pattern.co.jp/github-graphql-api-woli-yong-sitepull-requests-nokomentowochou-chu-sitemita/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub GraphQL API を利用してPull requests のコメントを抽出してみた</div><div class="kg-bookmark-description">こおりやまです 以前、こちらのブログでGitHub GraphQL APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests のコメント取得が必要になりGoogle Apps Script（GAS）から呼び出しスプレッドシートに出力してみました。 GitHub GraphQL API をさわってみた まずは GraphQL API Explorer を利用して必要な情報が取得できるようQuery を検討します。 実行するクエリを作成したら、スクリプトを書いていきます。 書いたコードはこんな感じ （設定情報は環境に合わせて設定して下さい） /*…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ghost.tech.anti-pattern.co.jp/favicon.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Hiroki Kooriyama</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><p>前回と同様にGitHub's GraphQL Explorer を利用して Query を検討していきます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.github.com/ja/graphql/overview/explorer"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Explorer - GitHub Docs</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.github.com/assets/images/site/favicon.svg"><span class="kg-bookmark-author">GitHub Docs</span></img></div></div></a></figure><p>まず、Pull requests のIDを指定してExplorer で必要なクエリを実行して確認していきます。<br>検討した結果がこちら。</br></p><pre><code>{
  repository(owner: "XXXXXXXXXX", name: "XXXXXXXX") {
    pullRequest(number: 00000) {
      url
      title
      closed
      createdAt
      author {
        login
      }
      reviews(first: 25) {
        edges {
          node {
            state
            bodyText
            comments(first: 25) {
              edges {
                node {
                  bodyText
                  author {
                    login
                  }
                  originalCommit {
                    abbreviatedOid
                    authoredDate
                  }
                }
              }
            }
          }
        }
      }
      comments(last: 25) {
        nodes {
          bodyText
        }
      }
    }
  }
}</code></pre><p><code>owner</code> , <code>name</code> は環境に合わせて実行してください。<br><code>number</code> は存在するIDを設定してください。</br></p><p><code>reviews</code>・・・レビュー結果を取得<br><code>comments</code>・・・コメントの記載内容を取得</br></p><p>コメントはスレッド形式で記載されますが、Queryの結果は時系列に出力されるため、 <code>abbreviatedOid</code> 、 <code>authoredDate</code> を利用してスレッドのグループ化と表示順を決めるために取得するようにしています。</p><p>取得結果は長くなるので省略します GitHub's GraphQL Explorer で実行してみてください。</p><p>この結果から大体必要な情報は取得できることはわかったので、あとは <code>number</code>を切り替えながら実行すれば全体を取得できますね！！</p><p>ということで次回はGASを利用して上記結果をスプレッドに出力していくこととなります。</p><p>ではでは </p><p/>]]></content:encoded></item><item><title><![CDATA[AWS Transfer Familyで簡単FTPサーバ]]></title><description><![CDATA[FTP？？？と言われてしまいそうですが、とある案件でシステム間連携をする際にどうしてもFTPで接続したいんです。という要望を頂きまして構築した時のメモです。
DirectConnectで接続した先の環境からのFTP接続なので、通信経路のセキュリティ的な意味ではまあいっか？と。。。こちらで用意したFTPサーバに、システム間連携先のお客様サーバから接続してくるという構成です。

SFTP（もしくはFTPS）に変更してもそんなに工数かからないと思うのですが。SFTPにしちゃえばいいのに。。。というお話はしつつAWS Transfer
Familyを使って構築していきます。

サーバを作成を押してインスタンスを作成します。

要件でFTPとなっているので、FTPにチェックを入れて次へ

IDプロバイダー（FTPする際のユーザ管理）で、管理は楽にしたいのでサービスマネージドを選ぼうとすると、FTPSとFTPでは選べないと言われます。
早速イライラしながら、DirectoryServiceなんて使ってないので、カスタムを選択します。

カスタムプロバイダー（API GatewayのURL）を聞かれ]]></description><link>https://tech.anti-pattern.co.jp/s3dejian-dan-ftpsaba/</link><guid isPermaLink="false">Ghost__Post__610b0f593986b000013a5175</guid><category><![CDATA[AWS]]></category><category><![CDATA[transfer family]]></category><category><![CDATA[ftp]]></category><category><![CDATA[S3]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Sun, 22 Aug 2021 04:09:42 GMT</pubDate><content:encoded><![CDATA[<p>FTP？？？と言われてしまいそうですが、とある案件でシステム間連携をする際にどうしてもFTPで接続したいんです。という要望を頂きまして構築した時のメモです。<br>DirectConnectで接続した先の環境からのFTP接続なので、通信経路のセキュリティ的な意味ではまあいっか？と。。。こちらで用意したFTPサーバに、システム間連携先のお客様サーバから接続してくるという構成です。</br></p><p>SFTP（もしくはFTPS）に変更してもそんなに工数かからないと思うのですが。SFTPにしちゃえばいいのに。。。というお話はしつつAWS Transfer Familyを使って構築していきます。</p><p>サーバを作成を押してインスタンスを作成します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-16.png" class="kg-image" alt="" loading="lazy" width="2000" height="1263" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-16.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-16.png 2300w" sizes="(min-width: 720px) 720px"/></figure><p>要件でFTPとなっているので、FTPにチェックを入れて次へ</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-17.png" class="kg-image" alt="" loading="lazy" width="2000" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-17.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-17.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-17.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-17.png 2242w" sizes="(min-width: 720px) 720px"/></figure><p>IDプロバイダー（FTPする際のユーザ管理）で、管理は楽にしたいのでサービスマネージドを選ぼうとすると、FTPSとFTPでは選べないと言われます。<br>早速イライラしながら、DirectoryServiceなんて使ってないので、カスタムを選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-18.png" class="kg-image" alt="" loading="lazy" width="1600" height="811" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-18.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-18.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-18.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>カスタムプロバイダー（API GatewayのURL）を聞かれるので、ここで一旦終了。<br>API Gatewayを先に作ります。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-19.png" class="kg-image" alt="" loading="lazy" width="1600" height="911" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-19.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-19.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>公式の「カスタムIDプロバイダーの操作」手順を参考に進めていきます</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/custom-identity-provider-users.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">カスタム ID プロバイダーの操作 - AWS Transfer Family</div><div class="kg-bookmark-description">カスタム ID プロバイダーの使用について説明します。カスタム ID プロバイダーは API Gateway を使用します。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">AWS Transfer Family</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/images/apig-config-method.png"/></div></a><figcaption>https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/custom-identity-provider-users.html</figcaption></figure><p><strong><strong>Transfer Family カスタム認証に API Gateway メソッドを使用するには</strong></strong><br>のところにテンプレートがあるので、基本的なスタックテンプレートを使ってみます。</br></p><p>AWS CloudFormation コンソール(<a href="https://console.aws.amazon.com/cloudformation">https://console.aws.amazon.com/cloudformation</a>) を開いて、スタックの作成をポチっとします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-20.png" class="kg-image" alt="" loading="lazy" width="1600" height="825" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-20.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-20.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-20.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>テンプレートのURL（「カスタム ID プロバイダーを使用した認証」に書いてあります）を設定して、次へ</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-21.png" class="kg-image" alt="" loading="lazy" width="1600" height="873" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-21.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-21.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-21.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>CreateServerをfalseにして、その他の設定値は変更せず進めていきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-22.png" class="kg-image" alt="" loading="lazy" width="1600" height="890" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-22.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-22.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-22.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>作成完了したらOKです。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-23.png" class="kg-image" alt="" loading="lazy" width="1622" height="288" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-23.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-23.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-23.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-23.png 1622w" sizes="(min-width: 720px) 720px"/></figure><p>作成されたリソースを確認します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-24.png" class="kg-image" alt="" loading="lazy" width="1905" height="545" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-24.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-24.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-24.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-24.png 1905w" sizes="(min-width: 720px) 720px"/></figure><p>Lambdaの認証サンプルで以下のコードが設定されています。</p><pre><code>'use strict';

// GetUserConfig Lambda

exports.handler = (event, context, callback) =&gt; {
  console.log("Username:", event.username, "ServerId: ", event.serverId);

  var response;
  // Check if the username presented for authentication is correct. This doesn't check the value of the serverId, only that it is provided.
  if (event.password == '' &amp;&amp; ( event.protocol == 'FTP' || event.protocol == 'FTPS')) {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  } else if (event.serverId !== "" &amp;&amp; event.username == 'myuser') {
    response = {
      Role: 'arn:aws:iam::000000000000:role/MyUserS3AccessRole', // The user will be authenticated if and only if the Role field is not blank
      Policy: '', // Optional JSON blob to further restrict this user's permissions
      HomeDirectory: '/' // Not required, defaults to '/'
    };

    // Check if password is provided
    if (event.password == "") {
      // If no password provided, return the user's SSH public key
      response['PublicKeys'] = [ "ssh-rsa myrsapubkey" ];
    // Check if password is correct
    } else if (event.password !== 'MySuperSecretPassword') {
      // Return HTTP status 200 but with no role in the response to indicate authentication failure
      response = {};
    }
  } else {
    // Return HTTP status 200 but with no role in the response to indicate authentication failure
    response = {};
  }
  callback(null, response);
};
</code></pre><p>これでログインできそうですね。<br>　ユーザ名：myuser<br>　パスワード：MySuperSecretPassword<br>S3や専用のロール作ってから認証部分を更新したいと思います。</br></br></br></p><p>API Gatewayの準備ができたので、再度Transfer Familyを作成していきます。<br>カスタムプロバイダーにAPI Gateway URLを設定する必要があるので、確認しておきます。<br>URLの呼び出し：<br><a href="https://a7mbwowjjd.execute-api.ap-northeast-1.amazonaws.com/prod">https://a7mbwowjjd.execute-api.ap-northeast-1.amazonaws.com/prod</a><br>の部分をメモしておきます。</br></br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-25.png" class="kg-image" alt="" loading="lazy" width="1908" height="314" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-25.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-25.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-25.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-25.png 1908w" sizes="(min-width: 720px) 720px"/></figure><p>TransferFamilyの作成は、カスタムプロバイダーは先程メモしたもの、ロールはCloudFormationで作成されたTransferIdentityProviderRoleを設定します。以降の設定項目のVPC、AZ、セキュリティグループは環境にあったものを設定していきます。<br>途中でドメイン（TransferFamilyのデータアクセス先）はS3を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-26.png" class="kg-image" alt="" loading="lazy" width="1121" height="637" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-26.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-26.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-26.png 1121w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-27.png" class="kg-image" alt="" loading="lazy" width="1600" height="259" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-27.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-27.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>作成できたら接続テストを実施します。作成したTransfer Familyを開いて、画面右上のアクション - テスト を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-28.png" class="kg-image" alt="" loading="lazy" width="1544" height="351" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-28.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-28.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-28.png 1544w" sizes="(min-width: 720px) 720px"/></figure><p>接続情報を入力しテストを実施します。<br>　ユーザ名：myuser<br>　パスワード：MySuperSecretPassword<br>　送信元IP：8.8.8.8（どこのIPでもOKです）<br>StatusCodeが200で返ってくればOKです。</br></br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-29.png" class="kg-image" alt="" loading="lazy" width="841" height="584" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-29.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-29.png 841w" sizes="(min-width: 720px) 720px"/></figure><p>次は任意の名前でS3バケットを作成し、テスト用のファイルをアップロードしておきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-30.png" class="kg-image" alt="" loading="lazy" width="1793" height="466" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-30.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-30.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-30.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-30.png 1793w" sizes="(min-width: 720px) 720px"/></figure><p>次にFTPログイン時に使用するロールを作成していきます。<br>権限はS3FullAccessにしていますが、本番運用では対象バケットを絞るなど適切な権限にしてください。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-31.png" class="kg-image" alt="" loading="lazy" width="1600" height="786" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-31.png 1600w" sizes="(min-width: 720px) 720px"/></figure><p>Lambdaの認証を変更します。</p><pre><code>    response = {
      Role: 'arn:aws:iam::925722219028:role/transferfamily', // The user will be authenticated if and only if the Role field is not blank
      Policy: '', // Optional JSON blob to further restrict this user's permissions
      HomeDirectory: '/tf-test-20210822/' // Not required, defaults to '/'
    };
</code></pre><p> これで準備出来たので動作確認していきます。</p><pre><code>[root@ip-10-0-0-29 ~]# ftp
ftp&gt; open 10.0.2.105
Connected to 10.0.2.105 (10.0.2.105).
220 Service ready for new user.
Name (10.0.2.105:root): myuser
331 User name okay, need password for myuser.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp&gt; ls
227 Entering Passive Mode (10,0,2,105,32,5)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -       206292 Aug 22 02:28 image.png
226 Closing data connection.
ftp&gt; bin
200 Command TYPE okay.
ftp&gt; get image.png
local: image.png remote: image.png
227 Entering Passive Mode (10,0,2,105,32,3)
150 File status okay; about to open data connection.
226 Transfer complete.
206292 bytes received in 0.769 secs (268.14 Kbytes/sec)</code></pre><p>無事接続とファイル一覧表示、ファイルの取得が出来ました。今後サーバの保守がなくなるのはとても良いと思います。<br>あと、SFTPで構成すれば認証部分の実装も必要ないので、もっと簡単に構築できますね。</br></p>]]></content:encoded></item><item><title><![CDATA[Nuxt.js2.10+TypeScript環境構成をやってみた]]></title><description><![CDATA[初めまして、あやんです！
Nuxt.js2.10+TypeScriptで自社開発をやっていくのでローカルの開発環境を作ってみました！

参考：
https://typescript.nuxtjs.org/guide/
https://nuxtjs.org/guide
https://www.npmjs.com/package/vue-property-decorator

新しいNuxtプロジェクトを作成しましょう
 * ターミナルで yarn create nuxt-app <projectName>
 * 選択肢を選ぶ時にスペース押すと複数を選択することができるので、下記のように設定

作成が終わったらプロジェクトのフォルダーに移動し、yarn devでローカルにデプロイをしてみましょう。

初回設定のデフォルト画面これからTypeScriptの設定を紹介していきます!

1. プロジェクトにTypeScriptのパッケージを追加

yarn add --dev @nuxt/typescript-build

2. プロジェクトの設定

 * nuxt.config.jsのbuil]]></description><link>https://tech.anti-pattern.co.jp/nuxt-js2-10-typescripthuan-jing-gou-cheng-woyatutemita/</link><guid isPermaLink="false">Ghost__Post__611dd7b83986b000013a5a4b</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 04:03:37 GMT</pubDate><content:encoded><![CDATA[<p>初めまして、あやんです！<br>Nuxt.js2.10+TypeScriptで自社開発をやっていくのでローカルの開発環境を作ってみました！</br></p><p>参考：<br><a href="https://typescript.nuxtjs.org/guide/" rel="noopener">https://typescript.nuxtjs.org/guide/</a><br><a href="https://nuxtjs.org/guide" rel="noopener">https://nuxtjs.org/guide</a><br><a href="https://www.npmjs.com/package/vue-property-decorator" rel="noopener">https://www.npmjs.com/package/vue-property-decorator</a></br></br></br></p><h3 id="%E6%96%B0%E3%81%97%E3%81%84nuxt%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86">新しいNuxtプロジェクトを作成しましょう</h3><ul><li>ターミナルで <code>yarn create nuxt-app &lt;projectName&gt;</code></li><li>選択肢を選ぶ時にスペース押すと複数を選択することができるので、下記のように設定</li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*SAuIiJF1fnkM-ruRAeVxqQ.png" class="kg-image" alt="" loading="lazy"/></figure><p>作成が終わったらプロジェクトのフォルダーに移動し、yarn devでローカルにデプロイをしてみましょう。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*QiUwqI5G8f8eTNH5h7ZvZQ.png" class="kg-image" alt="" loading="lazy"><figcaption>初回設定のデフォルト画面</figcaption></img></figure><p>これからTypeScriptの設定を紹介していきます!</p><p><strong>1. プロジェクトにTypeScriptのパッケージを追加</strong></p><p><code>yarn add --dev @nuxt/typescript-build</code></p><p><strong>2. プロジェクトの設定</strong></p><ul><li>nuxt.config.jsのbuildModulesに <code>'@nuxt/typescript-build'</code>を追記</li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*xU-R5mmx84MT8fW7OH9qsw.png" class="kg-image" alt="" loading="lazy"/></figure><ul><li>TypeScriptもコンフィグファイルが必要なので <code>tsconfig.json</code>を作成</li></ul><!--kg-card-begin: markdown--><pre><code>{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;ES5&quot;,
    &quot;experimentalDecorators&quot;: true,
    &quot;module&quot;: &quot;esnext&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;lib&quot;: [
      &quot;esnext&quot;,
      &quot;esnext.asynciterable&quot;,
      &quot;dom&quot;
    ],
    &quot;esModuleInterop&quot;: true,
    &quot;allowJs&quot;: true,
    &quot;sourceMap&quot;: true,
    &quot;strict&quot;: true,
    &quot;noEmit&quot;: true,
    &quot;baseUrl&quot;: &quot;.&quot;,
    &quot;paths&quot;: {
      &quot;~/*&quot;: [
        &quot;./*&quot;
      ],
      &quot;@/*&quot;: [
        &quot;./*&quot;
      ]
    },
    &quot;types&quot;: [
      &quot;@types/node&quot;,
      &quot;@nuxt/types&quot;
    ]
  },
  &quot;exclude&quot;: [
    &quot;node_modules&quot;
  ]
}</code></pre>
<!--kg-card-end: markdown--><p>＊デコレーターを使うため, <code>"target":"ES5","experimentalDecorators": true</code>の修正が入っています</p><p><strong>3. Runtimeの設定</strong></p><p>NuxtのRuntime TypeScriptラッパーをインストール</p><p><code>yarn add @nuxt/typescript-runtime</code></p><p>そして、package.jsonのscriptsを下記のように修正</p><!--kg-card-begin: markdown--><pre><code>&quot;scripts&quot;: {
  &quot;dev&quot;: &quot;nuxt-ts&quot;,
  &quot;build&quot;: &quot;nuxt-ts build&quot;,
  &quot;generate&quot;: &quot;nuxt-ts generate&quot;,
  &quot;start&quot;: &quot;nuxt-ts start&quot;,
  &quot;lint&quot;: &quot;eslint --ext .js,.vue --ignore-path .gitignore .&quot;,
  &quot;test&quot;: &quot;jest&quot;
},</code></pre>
<!--kg-card-end: markdown--><h3 id="typescript%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7eslint%E3%82%92%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A"><strong>TypeScriptのファイルでESLintを使うための設定</strong></h3><ol><li><strong>NuxtのTypeScriptのESLintパッケージをインストール</strong></li></ol><pre><code>yarn add -D @nuxtjs/eslint-config-typescript</code></pre><p><strong>2. ESLintのコンフィグファイル .</strong><code><strong>eslintrc.js</strong></code><strong>を修正</strong></p><ul><li>@nuxtjs/eslint-config-typescript をextendsに追記</li><li>parserOptionsでparserをbabel-eslintを使っている場合:<br> 1. parserOptionsから削除<br> 2. Dependenciesから削除するため、<br> <code>yarn remove babel-eslint</code></br></br></br></li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*BKwrRC2ej7VE0eWJyqzvvw.png" class="kg-image" alt="" loading="lazy"/></figure><p><strong>3. TypeScriptでESLintを使うためpackage.jsonのlint項目を修正</strong></p><pre><code>"lint": "eslint --ext .ts,.js,.vue ."</code></pre><h3 id="%E6%9C%80%E5%BE%8C%E3%81%AB%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86"><strong>最後にデコレーターをインストールしましょう</strong></h3><ol><li><strong>インストールコマンドを実行</strong></li></ol><pre><code>yarn add vue-property-decorator</code></pre><p>2. <strong>ESLintのコンフィグファイル .</strong><code><strong>eslintrc.js</strong></code><strong>を修正</strong></p><p>書いてない場合parserOptionsの中に 下記を追加</p><p>ecmaFeatures: { legacyDecorators: true }</p><p><strong>3. tsconfig.jsonファイルの確認</strong></p><p>compilerOptionsの中<code>"experimentalDecorators": true,</code></p><p>が入っていない場合追記</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*A6POH5ZLxV8UKPx4zyMx6A.png" class="kg-image" alt="" loading="lazy"><figcaption>修正したtsconfig.jsonファイル</figcaption></img></figure><p>それで設定が完成です！</p><p>試してみたら….</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*cyASfcUe9qNaEIdp5usfAw.png" class="kg-image" alt="" loading="lazy"><figcaption>Typescriptが使われているVueファイル</figcaption></img></figure><p>…表示できました！</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*e7jQ4NB6i-RipvkcuFQlPw.png" class="kg-image" alt="" loading="lazy"><figcaption>表示された画面</figcaption></img></figure><p>最初の設定でちょっと手間がかかりますが、TypeScriptでクラスを使うのが非常に便利なのでぜひ試してみてください！</p><p>次回はFirebaseとの連携を紹介したいと思います！</p>]]></content:encoded></item><item><title><![CDATA[Nuxt.js 2.13 + Firebase]]></title><description><![CDATA[
--------------------------------------------------------------------------------

今回 nuxt バージョン 2.13 のプロジェクトに Firestore と Firebase Hosting の設定をご紹介していきたいと思います！

プロジェクトの初期設定で Typescript を選択できるようになったので、より楽になりました！


--------------------------------------------------------------------------------

Nuxt.js 2.13+Typescript のプロジェクト初期設定
新しい Nuxt プロジェクトを作成しましょう！

InstallationNuxt.js is really easy to get started with. A simple project only
needs the nuxt dependency. To get started quickly…nuxtjs.org
[htt]]></description><link>https://tech.anti-pattern.co.jp/nuxt-js-2-13-firebase/</link><guid isPermaLink="false">Ghost__Post__611dd6a03986b000013a5a22</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 04:00:56 GMT</pubDate><content:encoded><![CDATA[<hr><p>今回 nuxt バージョン 2.13 のプロジェクトに Firestore と Firebase Hosting の設定をご紹介していきたいと思います！</p><p>プロジェクトの初期設定で Typescript を選択できるようになったので、より楽になりました！</p><hr><h4 id="nuxtjs-213typescript-%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A">Nuxt.js 2.13+Typescript のプロジェクト初期設定</h4><p>新しい Nuxt プロジェクトを作成しましょう！</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://nuxtjs.org/guide/installation"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Installation</div><div class="kg-bookmark-description">Nuxt.js is really easy to get started with. A simple project only needs the nuxt dependency. To get started quickly…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">nuxtjs.org</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*EIrxy77JdwEenXYz&quot;"/></div></a></figure><p>ターミナルで <code>yarn create nuxt-app &lt;projectName&gt;</code></p><p>選択する時にスペース押すと複数を選択することができるので、下記のように設定しました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*_tIYi2ZiF5MQO5JoAIefAA.png" class="kg-image" alt="" loading="lazy"/></figure><p>eslint を.ts ファイルをみるように設定したいので、package.json の lint コマンドに.ts ファイルも定義しておきました。</p><p>“lint:js”: “eslint — ext .ts,.js,.vue — ignore-path .gitignore .”,</p><p>コンソールにログを出すため eslint.rs にルール定義が必要です</p><!--kg-card-begin: markdown--><pre><code>&quot;rules&quot;: {
  &quot;no-console&quot;: &quot;off&quot;,
  &quot;no-restricted-syntax&quot;: [
    &quot;error&quot;,
    {
      &quot;selector&quot;: &quot;CallExpression[callee.object.name='console'
        [callee.property.name!=/^(log|warn|error|info|trace)$/]&quot;,
      &quot;message&quot;: &quot;Unexpected property on console object was called&quot;
    }
  ]
}</code></pre>
<!--kg-card-end: markdown--><p>このままだとTypescriptがインストールされていますが、プロパティーデコレーターをインストールすることによるコードが読みやくなります。</p><p>vue-property-decoratorは vue-class-component に 依存しているので両方をインストールする必要があります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kaorun343/vue-property-decorator"><div class="kg-bookmark-content"><div class="kg-bookmark-title">kaorun343/vue-property-decorator</div><div class="kg-bookmark-description">This library fully depends on vue-class-component, so please read its README before using this library. MIT License npm…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">github.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*0bsPumQ_Qgh_gdgb&quot;"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/vuejs/vue-class-component"><div class="kg-bookmark-content"><div class="kg-bookmark-title">vuejs/vue-class-component</div><div class="kg-bookmark-description">ECMAScript / TypeScript decorator for class-style Vue components. See https://class-component.vuejs.org Contribute to…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">github.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*zBiCMfOPuwX3NdS4&quot;"/></div></a></figure><p><code>yarn add vue-propery-decorator vue-class-component</code></p><p>NuxtJsのプロジェクト設定はここまでです！</p><p>念の為、Nuxtのプロジェクトがコンパイルできるのを確認してみましょう！<code>yarn dev</code>を実行するとローカルのブラウザーでNuxtのウェルカムページが見えるはずです。</p><hr><h4 id="%E6%AC%A1%E3%81%AFfirebase-%E3%81%AE-hosting-%E3%81%A8-firestore-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%8D%E3%81%BE%E3%81%99%EF%BC%81">次はFirebase の Hosting と Firestore を設定していきます！</h4><p>今回 既存のFirebaseプロジェクトを使いますが、新規プロジェクトの場合.envの値をFirebase initの後入れても大丈夫です。</p><p>まず必要なパッケージをインストールしましょう</p><p>Firebase プロジェクトのコンフィグ情報を管理するため.env ファイルを使っていくので、Dotenv のパッケージをインストールしておきました</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.npmjs.com/package/dotenv"><div class="kg-bookmark-content"><div class="kg-bookmark-title">dotenv</div><div class="kg-bookmark-description">Dotenv is a zero-dependency module that loads environment variables from a&amp;nbsp;.env file into process.env&amp;nbsp;. Storing…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">www.npmjs.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*72ww2deg1JNYyLdR&quot;"/></div></a></figure><p>yarn add -D @nuxtjs/dotenv</p><p>そして nuxt.config.js で Dotenv を BuildModules に設定しました</p><!--kg-card-begin: markdown--><pre><code>buildModules: [
  '@nuxtjs/eslint-module',
  '@nuxtjs/vuetify',
  '@nuxt/typescript-build',
  '@nuxtjs/dotenv', ←追記
],</code></pre>
<!--kg-card-end: markdown--><p>.env ファイルにFirebaseプロジェクトの情報を書いておきましょう</p><p>Firebaseコンソールのプロジェクト設定にFirebaseSDKSnippet の Config 値を入れておきました。.envファイルで管理することにより今後環境を切り替え時にやりやすくなります。</p><!--kg-card-begin: markdown--><pre><code>FIREBASE_API_KEY= &quot;&lt;firebaseConfig.apiKey&gt;&quot;
FIREBASE_AUTH_DOMAIN=&quot;&lt;firebaseConfig.authDomain&gt;&quot;
FIREBASE_DATABASE_URL=&quot;&lt;firebaseConfig.databaseURL&gt;&quot;
FIREBASE_PROJECT_ID=&quot;&lt;firebaseConfig.projectId&gt;&quot;
FIREBASE_STORAGE_BUCKET=&quot;&lt;firebaseConfig.storageBucket&gt;&quot;
FIREBASE_MESSAGING_SENDER_ID=&quot;&lt;firebaseConfig.messagingSenderId&gt;&quot;
FIREBASE_APP_ID=&quot;&lt;firebaseConfig.appId&gt;&quot;</code></pre>
<!--kg-card-end: markdown--><p>次Firebase と FirebaseCLI をインストールしましょう</p><!--kg-card-begin: markdown--><pre><code>yarn add firebase
yarn add -D firebase-tools</code></pre>
<!--kg-card-end: markdown--><p>初回 FirebaseCLI を使うため、認証が必要なのでターミナルで firebase login を実行しプロジェクトの対象アカウントにログインをしておきました。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/cli?hl&#x3D;ja"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Firebase CLI リファレンス</div><div class="kg-bookmark-description">AnalyticsUserPropertyAllowAdPersonalizationSignals</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">firebase.google.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*hk4NlwMBRkZYq8w0&quot;"/></div></a></figure><p>ターミナルでNuxtプロジェクトのダイレクトリーの下で<code>firebase init</code> を実行しましょう</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*EG8M_PVPDfWpx_UKOH8TVg.png" class="kg-image" alt="" loading="lazy"/></figure><p>既存のプロジェクトの設定また新規プロジェクトの作成ができます。今回既存のプロジェクトの設定をやっていきました。</p><p>init の設定で様々な設定がありますのでそれぞれを説明します。</p><p>1. FirebaseのHostingとFirestoreを設定したいので、両方を選択しました</p><p>2. Project Setup</p><ul><li>Use an existing project →既存のプロジェクトを選択する場合</li><li>デフォルトのプロジェクトを設定しました</li></ul><p>3. Firestore Setup</p><ul><li>rulesとindexesのファイルを定義できますが、今回デフォルト設定にしました</li></ul><p>4. Hosting Setup</p><ul><li>コンパイルされたファイルのフォルダーを設定しました。NuxtJsの場合distにコンパイルされたファイルが入っているので、distに設定しました</li><li>SPAの場合だと次はYesにしました</li></ul><p>5. Emulators Setup</p><p>＊エミューレーターを使うため、Javaをインストール必要がありますが、<br>開発環境でDockerのコンテナを使えばインストールは必要はありません。</br></p><ul><li>今回FirestoreとHostingのエミュレーターをローカルでテストするため設定したので、FirestoreとHostingを選択しました</li><li>UIエミューレーターのみ、ポート設定を4000にしました</li><li>他のエミューレーターのポートはデフォルトのままで大丈夫です</li></ul><p>インストールができましたら Firebase 設定の Plugin を作成しましょう</p><!--kg-card-begin: markdown--><pre><code>import * as firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'
import { FirebaseOptions } from '@firebase/app-types'
const firebaseConfig: FirebaseOptions = {
  apiKey: process.env.FIREBASE_API_KEY,
  authDomain: process.env.FIREBASE_AUTH_DOMAIN,
  databaseURL: process.env.FIREBASE_DATABASE_URL,
  projectId: process.env.FIREBASE_PROJECT_ID,
  storageBucket:process.env.FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.FIREBASE_APP_ID,
  measurementId: process.env.MEASUREMENT_ID,
}</code></pre>
<!--kg-card-end: markdown--><p>今後複数の環境を使うため、.envファイルに環境を定義する変数を入れました。APP_ENVIRONMENT = 'development'</p><p>定義したFirebaseAppをInitializeしたら、環境によって使っているFirestoreが設定されます。ローカルの場合だと、ローカルエミュレーターで動いているFirestoreのホストを設定しましまた。</p><!--kg-card-begin: markdown--><pre><code>if (!firebase.apps.length) {
  firebase.initializeApp(firebaseConfig)
}
const db = firebase.firestore()
  switch (process.env.APP_ENVIRONMENT) {
    case 'staging':
    case 'production':
    break
  default:
    db.settings({
      host: 'localhost:8080',
      ssl: false,
    })
    break
  }
const auth = firebase.auth()
export { auth, db }</code></pre>
<!--kg-card-end: markdown--><p>作成したプラグインを nuxt.config.jsに設定しました</p><p>plugins: [‘./plugins/firebase.ts’],</p><p>上記の設定が終わったらデプロイする前にローカルで確認してみましょう。コードをコンパイルし、serveコマンドでローカルにデプロイします。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/hosting/deploying"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Test locally then deploy to your site | Firebase</div><div class="kg-bookmark-description">You can view and test your site locally, even emulate your HTTPS functions, before deploying your site to production…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">firebase.google.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*ByH6h0h26uEGRdNk&quot;"/></div></a></figure><p>yarn generate<br>firebase serve --only hosting</br></p><p><code>firebase serve</code> はHostingとFunctionsだけに対応するので、ローカルでルールを試したい時はエミュレーターでテストする必要があります。</p><p>ローカルで問題がないようであれば、FirestoreとHostingにデプロイをしてみましょう！ターミナルで下記のコマンドを実行するとHostingとFirestoreのルールがデプロイされます。firebase deploy -P &lt;プロジェクトアリアス&gt; --only hosting,firestore:rules</p><p>デプロイが終わったら Hosting の URL で Nuxt のデフォルトページが表示されています。</p><p>次回はDockerを利用したNuxtとFirebaseの開発環境を紹介したいと思いますので、参考になればと思います！</p></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[NuxtJs2.13 + FirebaseプロジェクトをDockerを使ってコンテナ化]]></title><description><![CDATA[
--------------------------------------------------------------------------------

NuxtJs2.13 + FirebaseプロジェクトをDockerのコンテナ化

今回のプロジェクトをDockerのコンテナで管理することにしました。開発環境のためのディレクトリーを作っておきます。

下記のようなディレクトリー構成にしました。

├── docker 
├   ├── node 
         ├── Dockerfile
├   ├── firestore_saver
         ├── Dockerfile
├   ├── firebase
    │    ├── firestore
         │   ├── Dockerfile
         │   ├── firestore-run.sh
         │   ├── export
              ├──firebase-export-metadata.json     
              │─]]></description><link>https://tech.anti-pattern.co.jp/nuxtjs2-13-firebasepuroziekutowodockerwoshi-tutekontenahua/</link><guid isPermaLink="false">Ghost__Post__611dd4a63986b000013a59d5</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 03:56:48 GMT</pubDate><content:encoded><![CDATA[<hr><p><strong>NuxtJs2.13 + FirebaseプロジェクトをDockerのコンテナ化</strong></p><p>今回のプロジェクトをDockerのコンテナで管理することにしました。開発環境のためのディレクトリーを作っておきます。</p><p>下記のようなディレクトリー構成にしました。</p><!--kg-card-begin: markdown--><pre><code class="language-.">├── docker 
├   ├── node 
         ├── Dockerfile
├   ├── firestore_saver
         ├── Dockerfile
├   ├── firebase
    │    ├── firestore
         │   ├── Dockerfile
         │   ├── firestore-run.sh
         │   ├── export
              ├──firebase-export-metadata.json     
              │──firestore_export
                │──firestore_export.overall_export_metadata
                │──all_namespaces        
                  │──all_kinds
                   │──all_namespaces_all_kinds.export_metadata
                   │──output-&lt;番号&gt; 
└── docker-compose.yml
└── .env
└── firebase-blog → アプリケーションコード</code></pre>
<!--kg-card-end: markdown--><p>まずdocker-compose.ymlファイルを作っておきましょう。<br>３つのコンテナを設定します。</br></p><ul><li>node-front</li><li>firestore <br> Firestoreのエミュレーターの起動と管理するコンテナ</br></li><li>firestore-saver <br> ローカルデータを保存するためのコンテナ</br></li></ul><p>docker-compose.ymlのNodeコンテナ設定をみていきます。</p><!--kg-card-begin: markdown--><pre><code>node:
  build:
  context: ./docker/node
  volumes:
    - ./firebase-blog:/app/firebase-blog:cached
  container_name: node-front
  tty: true
  working_dir: /app/firebase-blog
  ports:
    - &quot;3000:3000&quot;
  environment:
    - HOST=0.0.0.0</code></pre>
<!--kg-card-end: markdown--><p>アプリケーションのコードをキャッシュすることでビルドが速くなります。ポートの設定は<code>yarn dev</code> を実行する時使われるポートを開くためです。localhostにアクセスするため環境変数を<code>HOST 0.0.0.0</code> の設定をします。</p><p>nodeのDockerfileの中身はこちらです</p><!--kg-card-begin: markdown--><pre><code>FROM node:14
RUN apt-get update &amp;&amp; \
apt-get install -y vim procps net-tools &amp;&amp; \
apt-get clean;</code></pre>
<!--kg-card-end: markdown--><p>nodeコンテナ内でVimを使うため、vimをインストールしています。</p><p>docker-compose.ymlとnode用のDockerfileを作成したら以下コマンドでコンテナのビルドと起動をしてみましょう。<br><code>docker-compose up --build</code></br></p><p>Nuxtバージョン12.3以上を使っている場合package.jsonのdevコマンドでポートとホストの指定が必要です</p><p>ポートとホストを指定しないとコンテナ上で<code>yarn dev</code> を実行する際にsseのエラーがおきてしまいます。“scripts”: {<br>  “dev”: “HOST=0.0.0.0 PORT=&lt;docker-compose.ymlで定義したポート&gt; nuxt “,</br></p><p>nodeのコンテナ上で<code>yarn dev</code>を起動してみましょうdocker exec -it node-front bash<br>yarn dev</br></p><p>ブラウザーで<code>localhost:3000</code>で表示を確認しましょう</p><h4 id="%E6%AC%A1%E3%81%AB%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AFfirestore%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E7%94%A8%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">次に用意するコンテナはFirestoreのローカルエミュレーター用のコンテナ</h4><p>firebase.jsonファイルの中身を確認するとそれぞれのエミュレーターはどのポートにサーバされているの設定ができます。</p><p>管理をしやすくするためにFirebase関連のファイルをfirebase-configディレクトリーに入れておきます。中身はFirebaseの設定、configファイル、ログファイルなどが入ります。</p><p>ローカルシステムとマッチするため、ホストを0.0.0.0に指定して、ポートはデフォルトは好きな使ってないポートに設定します。</p><p>この設定にすることによるエミュレーターを起動したらブラウザーでlocalhost:&lt;ポート&gt;でアクセスできるようになります。</p><!--kg-card-begin: markdown--><pre><code>&quot;emulators&quot;: {
  &quot;firestore&quot;: {
    &quot;port&quot;: 8080,
    &quot;host&quot;: &quot;0.0.0.0&quot;
  },
  &quot;ui&quot;: {
    &quot;port&quot;: &quot;4000&quot;,
    &quot;host&quot;: &quot;0.0.0.0&quot;
  },
}</code></pre>
<!--kg-card-end: markdown--><p>Firestoreのdocker-compose.yml 設定</p><!--kg-card-begin: markdown--><pre><code>firestore:
  image: firestore
  depends_on:
    - node
    - firestore-saver
  build:
  context: ./docker/firebase/firestore
  volumes:
    - ./firebase-blog/firebase-config:/app/firebase-config:cached                
    - ./firebase-blog/firebase.json:/app/firebase-      
      config/firebase.json:cached
    - ./firebase-blog/.firebaserc:/app/firebase- 
      config/.firebaserc:cached
    - ./docker/firebase/firestore/export:/app/firebase-config/export
    - ./docker/firebase/firestore/emulator_cache:/root/.cache
  container_name: firestore
  tty: true
  working_dir: /app/firebase-config
  ports:
    - &quot;8080:8080&quot;
    - &quot;4000:4000&quot;
  environment:
    - HOST=0.0.0.0
    - TOKEN=${TOKEN}
    - PROJECT_ALIAS=${PROJECT_ALIAS}
  command: /bin/bash run-firestore.sh</code></pre>
<!--kg-card-end: markdown--><p>このコンテナだけで使うことがないので、depends_onの設定でfirestoreコンテナが立ち上がるとnodeとfirestore-saverの両方が起動されるように設定します。</p><p>各Volumeを説明します</p><ul><li><code>./docker/firebase/firestore/export:/app/firebase-config/export</code></li><li><code>./firebase-blog/firebase.json:/app/firebase-config/firebase.json:cached</code></li><li><code>./firebase-blog/.firebaserc:/app/firebase-config/.firebaserc:cached</code></li></ul><p>Firebaseに関する設定やコンフィグのファイルはfirebase-configのディレクトリーに入っています。</p><p>ディレクトリーの中身はこちらです</p><!--kg-card-begin: markdown--><pre><code>.
├── firebase-blog
├   ├── firebase-config
    │    ├── .firebaserc
         ├── firebase.json
         ├── firestore-debug.log
         ├── ui-debug.log
         ├── firstore.indexes.json
         ├── firestore.rules
         ├── export
             ├──firebase-export-metadata.json     
             │──firestore_export
               │──firestore_export.overall_export_metadata
               │──all_namespaces        
                 │──all_kinds
                  │──all_namespaces_all_kinds.export_metadata
                  │──output-&lt;番号&gt;</code></pre>
<!--kg-card-end: markdown--><p>毎回エミュレーターをインストールしないためにエミューレーターのキャッシュファイルもマウントしておきます</p><ul><li><code>./docker/firebase/firestore/emulator_cache:/root/.cache</code></li></ul><p>FirestoreのDockerfileの中身はこちらです。</p><!--kg-card-begin: markdown--><pre><code>FROM node:14
RUN apt-get update &amp;&amp; \
apt-get install -y openjdk-8-jdk jq\
ca-certificates-java \
ant \
vim procps net-tools &amp;&amp; \
apt-get clean &amp;&amp; \
update-ca-certificates -f;
RUN yarn global add firebase-tools
COPY run-firestore.sh /usr/local/bin/run-firestore.sh</code></pre>
<!--kg-card-end: markdown--><p>ベースはNodeでエミュレーターを使うためのイメージにJavaとVimを使いたかったので一緒にインストールしました。。また、コンテナ内で使うためVimもインストールしました。<br>今回、起動時の シェルでFirebaseコマンドを使うためにFirebaseCLIもインストールしました。</br></p><p>Firestoreコンテナの起動時にエミューレーターを起動したいので、run-firestore.shで起動しています。エミュレーターを起動する時にローカルに保存したデータを使いたいので、マウントされているディレクトリーからインポートしています。</p><!--kg-card-begin: markdown--><pre><code>#!/bin/bash
set -eu
auth=&quot; - token $TOKEN&quot;
echo &quot;プロジェクト設定&quot;
firebase use $PROJECT_ALIAS $auth
echo &quot;Firestoreのエミュレーター起動開始 約2分&quot;
firebase emulators:start - only firestore - import=&quot;./export/&quot; $auth</code></pre>
<!--kg-card-end: markdown--><p>最後にローカルデータを保存するためのコンテナを用意します。</p><!--kg-card-begin: markdown--><pre><code>firestore-saver:
  build:
  context: ./docker/firebase/firestore_saver
  container_name: firestore-saver
  environment:
    - PROJECT_ID=${PROJECT_ID}
    - FIRESTORE_EMULATOR_HOST=firestore:8080
  volumes:
    - ./docker/firebase/firestore/export:/firebase/firestore/export
  command: /bin/bash run-saver.sh</code></pre>
<!--kg-card-end: markdown--><p>起動時に実行するrun-saver.shの中身はこちらです。</p><!--kg-card-begin: markdown--><pre><code>#!/bin/bash
while true
do
curl -X POST -H &quot;Content-Type: application/json&quot; -d &quot;{\&quot;database\&quot;: \&quot;projects/$PROJECT_ID/databases/(default)\&quot;, \&quot;export_directory\&quot;: \&quot;./export\&quot;, \&quot;export_name\&quot;: \&quot;firestore_export\&quot;}&quot; http://firestore:8080/emulator/v1/projects/$PROJECT_ID:export
sleep 5
done</code></pre>
<!--kg-card-end: markdown--><p>Firestore-saverのDockerfile中身</p><!--kg-card-begin: markdown--><pre><code>FROM google/cloud-sdk:alpine
RUN apk add --update --no-cache openjdk8 \
&amp;&amp; gcloud components update \
&amp;&amp; gcloud components install cloud-firestore-emulator beta --quiet
COPY run-saver.sh /usr/local/bin/run-saver.sh</code></pre>
<!--kg-card-end: markdown--><p>コマンドの詳しい説明はゆうくんのブログを参考に</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://medium.com/anti-pattern-engineering/forestore-local-emulator-%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%93%AC%E4%BC%BC%E7%9A%84%E3%81%AB%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%81%99%E3%82%8B-ed04c1db82e5"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Firestore Local Emulator のデータを擬似的に永続化する</div><div class="kg-bookmark-description">Firestore Local Emulator にimport/export機能が追加されたらしいので、それを利用して擬似的に永続化しました。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">medium.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/1*5HDVWAdLvtGA5PKoOl3JyA.png&quot;"/></div></a></figure><hr><h4 id="%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%82%87%E3%81%86">環境を使ってみましょう</h4><p>この三つのコンテナが用意すれば使い回せる開発環境ができます。</p><p>まず<code>docker-compose up —-build</code> を実行してみます。</p><p>ターミナルでエミュレーターの起動が終わるまでfirestore-exportのコンテナからエラーが表示されます。上から見てみると <code>Could not resolve host: firestore</code> のエラーはホストとなっているコンテナが立ち上がってないという意味です。次は <code>Failed to connect to firestore port 8080: Connection refused</code> Firestoreのコンテナが立ち上がっているけどポート8080にローカルエミュレーターはまだ起動されていないの意味です。その次は正常な動きです。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*ZoW0wx4cSq1IylijFZKV4A.png" class="kg-image" alt="" loading="lazy"><figcaption>firestore-saverの起動中のエラーと正常な動き</figcaption></img></figure><p>正常に立ち上がったNodeコンテナのログは以下です。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*GjZx6aN_ludn4No2P28ZsA.png" class="kg-image" alt="" loading="lazy"><figcaption>Nodeコンテナの正常な起動</figcaption></img></figure><p>そして、最後にFirestoreとエミュレーターが正常に立ち上がったら以下のようなメッセージが表示されているはずです。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*SrNvys72T26x3X5V3UTJJw.png" class="kg-image" alt="" loading="lazy"><figcaption>Firestoreコンテナが正常に立ち上がった場合</figcaption></img></figure><p>エミュレーターが起動されたら5秒ずつfirestore-saverが動いてローカルデータが保存されます。</p><p>全部が立ち上がったらNodeコンテナを入りyarn devを実行しましょう</p><p>各ポートにアクセスすると表示される画面を載せておきます</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*EIRBe87lBUkN6M3L7SfKWA.png" class="kg-image" alt="" loading="lazy"><figcaption>localhost:3000 → Nuxtプロジェクトのホーム画面</figcaption></img></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*zK-wm_S9LgH1pQX-y9u1LQ.png" class="kg-image" alt="" loading="lazy"><figcaption>localhost:4000 → Firebaseのローカルエミュレータースイート</figcaption></img></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*IgdgKAiUExTZROpbJlBK5A.png" class="kg-image" alt="" loading="lazy"><figcaption>localhost:8080 → OK （Firestoreのエミュレーターが正常に動いているの確認）</figcaption></img></figure><p>Dockerで環境を管理すると新しい開発メンバーのジョインやバージョン管理がよりやりやすくなります。<br>みなさんもDockerで環境構築してみましょう。</br></p></hr></hr>]]></content:encoded></item><item><title><![CDATA[Firestoreセキュリティルール設定]]></title><description><![CDATA[Firestoreを使うことによってセキュリティールールを設定する必要があります！

基本設定からご説明します
firestore.rulesのファイルでルールの管理ができる。ローカル環境でFirestoreのエミュレーターが起動している時に動的に読み込んで更新してくれる。

2020年７月の時点でバージョンは２となっていますが、
Firebaseの公式ドキュメントによるバージョンをチェックしましょう。

Get started with Cloud Firestore Security Rules | FirebaseWith Cloud Firestore
Security Rules, you can focus on building a great user experience without
having
to manage…firebase.google.com
[https://firebase.google.com/docs/firestore/security/get-started]
FirebaseとGCPで様々なルール設定があるので、スコープを設定するためバ]]></description><link>https://tech.anti-pattern.co.jp/firestoresekiyuriteirurushe-ding/</link><guid isPermaLink="false">Ghost__Post__611db2403986b000013a5978</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 03:47:47 GMT</pubDate><content:encoded><![CDATA[<p>Firestoreを使うことによってセキュリティールールを設定する必要があります！</p><p>基本設定からご説明します<br>firestore.rulesのファイルでルールの管理ができる。ローカル環境でFirestoreのエミュレーターが起動している時に動的に読み込んで更新してくれる。</br></p><p>2020年７月の時点でバージョンは２となっていますが、<br>Firebaseの公式ドキュメントによるバージョンをチェックしましょう。</br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/firestore/security/get-started"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Get started with Cloud Firestore Security Rules | Firebase</div><div class="kg-bookmark-description">With Cloud Firestore Security Rules, you can focus on building a great user experience without having to manage…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">firebase.google.com</span></div></div></a></figure><p>FirebaseとGCPで様々なルール設定があるので、スコープを設定するためバージョン指定のあとセキュリティルールの設定をする。matchの中で全ルールを書く。</p><!--kg-card-begin: markdown--><pre><code class="language-rules_version">service cloud.firestore {
  match /databases/{database}/documents {
    //
  }
}</code></pre>
<!--kg-card-end: markdown--><p>Firestoreのセキュリティールールはホワイトリストの仕組みとなっている。</p><p>Firestoreにリクエストが来たら、許可しているルールが存在しない限りではデータを読み込みと書き込みができない。</p><p>ルールで様々インターフェースがあり、主に使うのはrequestのプロパティー。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/reference/rules/rules.firestore.Request"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Interface: Request | Firebase</div><div class="kg-bookmark-description">AnalyticsUserPropertyAllowAdPersonalizationSignals</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">firebase.google.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="&quot;https://cdn-images-1.medium.com/fit/c/320/320/0*BVOQxWeNVSFYNr8j&quot;"/></div></a></figure><p>リクエストの認証情報と比較したい時にrequest.authでそれぞれの情報を取得できる。書き込みのルールでリクエストデータをバリデートする時にrequest.resource.data.&lt;データ名&gt;で取得できる。</p><p>ルールは読み込みと書き込みに分けていて、さらに読み込みはGetとListに分けられている。また、書き込みはCreate・Update・Deleteに分けられている。<br>シンプルなルールを書いてみましょう。</br></p><p>ログイン済みのユーザーのみの読み込み許可のルールを書きましょう。</p><p>match /consumedFoods/testFood {<br>      allow read: if request.auth != null;<br>}</br></br></p><p>上記の書き方でtestFoodのドキュメントのみ読み込みは可能となる。<br>できるだけルールを細かく書いたほうが管理しやすい。<br>スコープを広げて、全ドキュメンとへ影響するルールの設定もできる。</br></br></p><p>match /consumedFoods/{foodId}</p><p>指定コレクション配下のドキュメントに対してルールが適用される</p><p>match /{documentID=**}</p><p>上記の書き方をすると全てのデータに対して条件を書くので、要注意だ。</p><p>サブコレクションがある場合ドキュメントの許可を設定しても、サブコレクションのデータを読み込めない。</p><!--kg-card-begin: markdown--><pre><code class="language-match">  // ドキュメントの条件
  allow read: if request.auth != null
  match /{allChildren=**} {
   // サブコレクションの条件
   allow read: if request.auth != null || request.auth == null;
  }
}</code></pre>
<!--kg-card-end: markdown--><p>このように条件を分けることにより、認証済みユーザがconsumedFoods Collectionの DocumentとSubCollectionの読み込みが許可される。<br>それに加えて、未認証ユーザに対して<br>consumedFoodsのSub Collectionにのみ読み込み権限を与えることができる</br></br></p><p>次にルールで使う関数の書き方を説明していきます！</p><p>色々なデータに同じ条件を使う場合関数化をするのが便利です。<br>例えば、フォームに入力された値のフォーマットと必須チェックするため関数を用意しました。</br></p><!--kg-card-begin: markdown--><pre><code class="language-match"> // ↑書き込みの対象ドキュメント
  function isValidEmail() {
    return (request.resource.data.email.size() &gt; 0 &amp;&amp;  
      request.resource.data.email.matches('.+@.+'))
    }
  
  allow create:
   // ↑createで作成のみの許可となる
    if isValidEmail();
}</code></pre>
<!--kg-card-end: markdown--><p>文字列に対するルールにmatchesのメソッドがあり、正規表現と比較ことができます。<br><a href="https://firebase.google.com/docs/reference/rules/rules.String" rel="noopener">https://firebase.google.com/docs/reference/rules/rules.String</a><br>同じくsizeのメソッドで文字列の長さをチェックできます。バイトで計算されるので、マルチバイトの文字列だと要注意です。</br></br></p><p>全体的なルールを組み合わせるとこんな感じになります！</p><!--kg-card-begin: markdown--><pre><code class="language-rules_version">service cloud.firestore {
     match /databases/{database}/documents {
        match /consumedFoods/{foodId}/{allChildren=**} {
            function isAdmin() { 
                return request.auth.uid != null;
            }
            // サブコレクションとドキュメントの権限条件は一緒の場合
            allow read: if isAdmin()
        }
        match /consumedFoods/{foodId} {
            // ドキュメントの条件
            allow read: if request.auth != null
            match /{allChildren=**} {
                // サブコレクションの条件
                allow read: if request.auth != null || request.auth         == null;
            }
        }
        match /public/users/newApplication/{newUserDocument} {
        // ↑書き込みの対象ドキュメント
            function isValidEmail() {
                return (request.resource.data.email.size() &gt; 0 &amp;&amp;  
                    request.resource.data.email.matches('.+@.+')
                )
            }
    
            allow create:
            // ↑createで作成のみの許可となる
                if isValidEmail();
        }
    }
}</code></pre>
<!--kg-card-end: markdown--><p>対象プロジェクトにルールをデプロイするとFirebase ConsoleのCloud FirestoreのRulesタブに表示されている。そして、適用するため公開をする必要はある。</p><p>Firestoreのルールの設定による様々なことができるので、便利な機能です！</p>]]></content:encoded></item><item><title><![CDATA[cakephpのクエリービルダーでwhereの検索条件]]></title><description><![CDATA[こんにちは！あやんです

cakephpのクエリービルダーを利用して様々な検索条件を紹介していきます

まず検索クエリーを用意します

$query = $model->find(‘all’, $options);

$optionsの中でwhere条件や結合条件などの設定ができます。

cakephpの公式サイトでオプションで使えるプロパティー説明のリンク
https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html

$optionsの中身はこのような配列となります。

$options = [
'conditions' => [],
'join' => [],
...
];

クエリーを作成するモデルのfindメソッドにあるオプションにconditionsを設定することによって様々なwhere条件を追加できます。

ケース１AND
sql例文: where a = 1 and b < 2 and c ≥ 3

$conditions['a'] = 1
$conditions['b < '] = 2
$c]]></description><link>https://tech.anti-pattern.co.jp/cakephpnokueribirudadewherenojian-suo-tiao-jian/</link><guid isPermaLink="false">Ghost__Post__611db2113986b000013a5971</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 01:21:37 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは！あやんです</p><p>cakephpのクエリービルダーを利用して様々な検索条件を紹介していきます</p><p>まず検索クエリーを用意します</p><p>$query = $model-&gt;find(‘all’, $options);</p><p>$optionsの中でwhere条件や結合条件などの設定ができます。</p><p>cakephpの公式サイトでオプションで使えるプロパティー説明のリンク<br><a href="https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html" rel="nofollow noopener noopener noopener">https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html</a></br></p><p>$optionsの中身はこのような配列となります。</p><p>$options = [<br>    'conditions' =&gt; [],<br>    'join' =&gt; [],<br>    ...<br>];</br></br></br></br></p><p>クエリーを作成するモデルのfindメソッドにあるオプションにconditionsを設定することによって様々なwhere条件を追加できます。</p><p><strong>ケース１AND</strong><br>sql例文: where a = 1 and b &lt; 2 and c ≥ 3</br></p><p>$conditions['a'] = 1<br>$conditions['b &lt; '] = 2<br>$conditions['c ≥ '] = 3</br></br></p><p><strong>ケース2 WHERE IN</strong><br>sql例文: where ids in (1, 2, 3)</br></p><p>$conditions['ids'] = [1, 2, 3]</p><p><strong>ケース3 AND とORを同時に使う場合</strong><br>sql例文: where a =1 and b =2 and (c = 3 or d = 4);</br></p><p>$conditions[‘a’] = 1<br>$conditions[‘b’] = 2<br>$conditions[‘OR’] = [<br>    'c' =&gt; 3,<br>    'd' =&gt; 4<br>]</br></br></br></br></br></p><p><strong>ケース4 notが含まれてるOR</strong></p><p>sql例文: where a =1 and b =2 and (c = 3 or f is not null);</p><p>$conditions[‘a’] = 1<br>$conditions[‘b’] = 2<br>$conditions[‘OR’] = [<br>    'c' =&gt; 3,<br>    'NOT' =&gt; [<br>       'f' =&gt; null<br>    ]<br>]</br></br></br></br></br></br></br></p><p>最後に書いたい$conditionsを$optionsに設定し、クエリーを実行できます！</p><p>$options['conditions'] = $conditions;$query = $model-&gt;find(‘all’, $options);<br>$data = $query-&gt;all();</br></p><p>ちょっと複雑なwhere条件でもクエリービルダーが使えるので、cakephpの便利な機能です！</p>]]></content:encoded></item><item><title><![CDATA[php7.4.8のメモリー管理]]></title><description><![CDATA[よくphpでデーターベースから大量のデータを取得し、整形したりcsvを生成したりすることがあります。

メモリーエラーまた性能が落としてしまう問題があるので、速度とメモリー管理のバランスを注意する必要があります。

性能改善で 様々な方法がありますが、unsetとnullを比較していきたいと思います

データベースから取得する情報と似たテストデータを配列で用意します。

for($i = 1; $i < 100000; $i++) {
$testArray[] = [
'morning' => 'GoodMorning'.$i,
'afternoon' => 'Hello'.$i,
'evening' => 'GoodEvening'.$i
];
}

そして三つのケースを見ていきます

● PHPのGC（ガベージコレクション）に任せる(スクリプト終了後メモリを自動的に解除される)
● 使い終わった変数をunsetでメモリを解除する
● 使い終わった変数をnullに設定する

$startMemory = memory_get_usage();// $testArray = null;]]></description><link>https://tech.anti-pattern.co.jp/php7-4-8nomemoriguan-li/</link><guid isPermaLink="false">Ghost__Post__611db1ba3986b000013a5966</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 01:20:39 GMT</pubDate><content:encoded><![CDATA[<p>よくphpでデーターベースから大量のデータを取得し、整形したりcsvを生成したりすることがあります。</p><p>メモリーエラーまた性能が落としてしまう問題があるので、速度とメモリー管理のバランスを注意する必要があります。</p><p>性能改善で 様々な方法がありますが、unsetとnullを比較していきたいと思います</p><p>データベースから取得する情報と似たテストデータを配列で用意します。</p><p>for($i = 1; $i &lt; 100000; $i++) {<br>  $testArray[] = [<br>    'morning' =&gt; 'GoodMorning'.$i,<br>    'afternoon' =&gt; 'Hello'.$i,<br>    'evening' =&gt; 'GoodEvening'.$i<br>  ];<br>}</br></br></br></br></br></br></p><p>そして三つのケースを見ていきます</p><p>● PHPのGC（ガベージコレクション）に任せる(スクリプト終了後メモリを自動的に解除される)<br>● 使い終わった変数をunsetでメモリを解除する<br>● 使い終わった変数をnullに設定する</br></br></p><p>$startMemory = memory_get_usage();// $testArray = null;<br>// unset($testArray);$endMemory = memory_get_usage();<br>echo "解除されたメモリ".$endMemory - $startMemory." バイト\n";</br></br></p><p>実行した結果はこちらです</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*92Qar3A8dQRfPWIztHyL9A.png" class="kg-image" alt="" loading="lazy"><figcaption>実行した結果</figcaption></img></figure><p>unsetを使った場合スクリプトの速度が落ちてしまうので、メモリーのキャパシティーには問題なければ速度に対してGCに任せるのがベストのようです。またnullを使っている場合だと変数を上書きしているためCPUが使われています。</p><p>ただし大量のデータの場合メモリーの上限を超えてしまう可能性があるので、性能のためデータを分けて処理する方法なども性能改善の参考になると思います。</p><p>参考<br><a href="https://www.php.net/manual/en/features.gc.performance-considerations.php" rel="nofollow noopener noopener">https://www.php.net/manual/en/features.gc.performance-considerations.php</a><br><a href="https://www.toptal.com/php/objects-references-php-memory" rel="nofollow noopener noopener">https://www.toptal.com/php/objects-references-php-memory</a></br></br></p>]]></content:encoded></item><item><title><![CDATA[Github Actions のトリガーイベント]]></title><description><![CDATA[二つのGithub Actionsトリガーイベントの設定方法を紹介していきます！

Github Actionsの作成で最初の方にトリガーを設定します。トリガーというのはactionを実行させるイベントです。onの下に定義します。

name: <Action名>
on: 
push:
branches:
- release 
jobs:
....

まず一つ目はよく使われているあるブランチにプッシュがあった時のイベントです。上記の例は「release」のブランチにプッシュしたらアクションが実行されます。branchesを指定しない場合だとどのブランチがプッシュがあってもactionが実行されます。

次はpull requestに関するイベントです。
pull requestのタイプがたくさんあります。下記のリンクで使えるactivity
typesがあるので、アクションの目的によってイベントを組み合わせることができます。

Events that trigger workflowsYou can configure workflows to run for one or more
]]></description><link>https://tech.anti-pattern.co.jp/github-actions-notorigaibento/</link><guid isPermaLink="false">Ghost__Post__611db0dc3986b000013a595e</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 01:18:36 GMT</pubDate><content:encoded><![CDATA[<p>二つのGithub Actionsトリガーイベントの設定方法を紹介していきます！</p><p>Github Actionsの作成で最初の方にトリガーを設定します。トリガーというのはactionを実行させるイベントです。onの下に定義します。</p><p>name: &lt;Action名&gt;<br>on:   <br>  push:    <br>    branches:      <br>      - release <br>jobs:<br>....</br></br></br></br></br></br></p><p>まず一つ目はよく使われているあるブランチにプッシュがあった時のイベントです。上記の例は「release」のブランチにプッシュしたらアクションが実行されます。branchesを指定しない場合だとどのブランチがプッシュがあってもactionが実行されます。</p><p>次はpull requestに関するイベントです。<br>pull requestのタイプがたくさんあります。下記のリンクで使えるactivity typesがあるので、アクションの目的によってイベントを組み合わせることができます。</br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Events that trigger workflows</div><div class="kg-bookmark-description">You can configure workflows to run for one or more events using the on workflow syntax. For more information, see &quot;…</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">docs.github.com</span></div></div></a></figure><p>一つの例はpull requestの作成とレビュー依頼の時にテストケースのアクションが実装されます。複数のタイプを使う場合配列で指定します。</p><p>on:   <br>  pull_request:<br>    branches: <br>      - feature/**<br>    types: [opened, review_requested]</br></br></br></br></p><p>onで複数のトリガーを指定ができます。それぞれのトリガーの細かい設定が他のトリガーに影響がありませんが、各トリガーイベントの後ろに「：」が必要です。pushとpull requestのトリガーを組み合わせると下記のように指定します。</p><p>on:   <br>  push:    <br>    branches:      <br>      - release<br>  pull_request:<br>    branches: <br>      - feature/**<br>    types: [opened, review_requested]</br></br></br></br></br></br></br></p><p>Github Actionsで気軽に自動化ができるので、ぜひ使ってみてください！</p><p>参考：<a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows#configuring-workflow-events" rel="nofollow noopener noopener">https://docs.github.com/en/actions/reference/events-that-trigger-workflows#configuring-workflow-events</a></p>]]></content:encoded></item><item><title><![CDATA[A Bit of Info]]></title><description><![CDATA[大学の頃に特に気に入っていたコンセプトを紹介していきます！

コンピューターのデータの一番小さい単位はビット(bit)です。８ビットを組み合わせると1バイト(byte)になります。Decimalは人間がいつも使っている数字ですが、コンピューターは0と1を使ってbinaryで理解しています。例えば、123の数字をbinaryにすると1111011になります。

binaryの八桁の数字の中でMost Significant Byte(最上位バイト) とLeast Significant Byte(最下位バイト)
という表現があります。八桁の中で左端にある数字がmsb(最上位バイト) , 右端にある数字が
lsb(最下位バイト)となります。シンプルなコンセプトですが、とても大事なことになってきます。

msbとlsbの話を踏まえて、マルチバイトのデータに対してプロセッサーによってendiannessということが変わります。Big EndianとLittle
Endianがあります。

Big Endian だとmsbが一番小さいメモリーアドレスに保存されています。Little
Endian]]></description><link>https://tech.anti-pattern.co.jp/a-bit-of-info/</link><guid isPermaLink="false">Ghost__Post__611db0733986b000013a5957</guid><dc:creator><![CDATA[hayes.ayan]]></dc:creator><pubDate>Thu, 19 Aug 2021 01:14:50 GMT</pubDate><content:encoded><![CDATA[<p>大学の頃に特に気に入っていたコンセプトを紹介していきます！</p><p>コンピューターのデータの一番小さい単位はビット(bit)です。８ビットを組み合わせると1バイト(byte)になります。Decimalは人間がいつも使っている数字ですが、コンピューターは0と1を使ってbinaryで理解しています。例えば、123の数字をbinaryにすると1111011になります。</p><p>binaryの八桁の数字の中でMost Significant Byte(最上位バイト) とLeast Significant Byte(最下位バイト) という表現があります。八桁の中で左端にある数字がmsb(最上位バイト) , 右端にある数字が lsb(最下位バイト)となります。シンプルなコンセプトですが、とても大事なことになってきます。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*kci8D6xGuTGfocvzt88rZg.png" class="kg-image" alt="" loading="lazy"/></figure><p>msbとlsbの話を踏まえて、マルチバイトのデータに対してプロセッサーによってendiannessということが変わります。Big EndianとLittle Endianがあります。</p><p>Big Endian だとmsbが一番小さいメモリーアドレスに保存されています。Little Endianだとlsbが一番小さいメモリーアドレスに保存されています。<br>つまり機械によってマルチバイトの保存順番が逆になります。</br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*vIk7yJ07MO8rzxSOewPRYA.png" class="kg-image" alt="" loading="lazy"><figcaption>マルチバイトデータの例</figcaption></img></figure><p>TCP/IPスタック開発でendiannessが大事になります。例としてはネットワークでlittle endianのPCとbig endianのサーバーが同じIPアドレスを読み込もうとすると数字が逆になってIPアドレスが異なってしまいます。</p><p>現在TCP/IPのネットワークスタンダードはbig endianなので、変換が必要稼働かの判断をするため4つの判断できるC・C++のファンクションがあります。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*ethJdJ9uglyfWYjEuTFgbQ.png" class="kg-image" alt="" loading="lazy"><figcaption>イメージのソース<a href="https://docs.microsoft.com/ja-jp/cpp/mfc/windows-sockets-byte-ordering?view=msvc-160" data-href="https://docs.microsoft.com/ja-jp/cpp/mfc/windows-sockets-byte-ordering?view=msvc-160" class="markup--anchor markup--figure-anchor" rel="nofollow noopener noopener" target="_blank">https://docs.microsoft.com/ja-jp/cpp/mfc/windows-sockets-byte-ordering?view=msvc-160</a></figcaption></img></figure><p>普段あまりウェブ開発には意識をする必要はありませんが、コンピューターサイエンスを勉強するとよく出てくるトピックでした！</p><p>参考：<br><a href="https://bit-calculator.com/most-and-least-significant-bit" rel="nofollow noopener noopener">https://bit-calculator.com/most-and-least-significant-bit</a><br><a href="https://www.bogotobogo.com/Embedded/Little_endian_big_endian_htons_htonl.php" rel="nofollow noopener noopener">https://www.bogotobogo.com/Embedded/Little_endian_big_endian_htons_htonl.php</a></br></br></p>]]></content:encoded></item><item><title><![CDATA[GORMV2 hint句]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

PostgreSQLのUPSERTみたいな事をやりたくて、GORM V2を使用してこんなコードを書きました。

レコードの存在有無に関わらず、レコードを挿入又は更新する場合、Assign関数を使用しこの様なコードになります。

dto := sampleDTO{
　　CompanyMemberID:   memberID,
　　UserID:            userID,
}
r.db.Conn(ctx).
  Where("company_member_id = ? AND user_id = ?", memberID, userID).
　　　　Assign(&dto).
　　　　FirstOrCreate(&sampleDTO{})


これを実装している時に、GORMのAPIを確認していたのですが、
V2になって対応され気になった機能について、確認してみました。

取得結果をMapに格納
result := map[string]interface{}{}
udtos := []userDTO{}
r.db.]]></description><link>https://tech.anti-pattern.co.jp/gormv2tohintku/</link><guid isPermaLink="false">Ghost__Post__6110adff3986b000013a5568</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Wed, 11 Aug 2021 06:05:22 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>PostgreSQLのUPSERTみたいな事をやりたくて、GORM V2を使用してこんなコードを書きました。</p>
<p>レコードの存在有無に関わらず、レコードを挿入又は更新する場合、Assign関数を使用しこの様なコードになります。</p>
<pre><code>dto := sampleDTO{
　　CompanyMemberID:   memberID,
　　UserID:            userID,
}
r.db.Conn(ctx).
  Where(&quot;company_member_id = ? AND user_id = ?&quot;, memberID, userID).
　　　　Assign(&amp;dto).
　　　　FirstOrCreate(&amp;sampleDTO{})
</code></pre>
<p>これを実装している時に、GORMのAPIを確認していたのですが、<br>
V2になって対応され気になった機能について、確認してみました。</br></p>
<h4 id="%E5%8F%96%E5%BE%97%E7%B5%90%E6%9E%9C%E3%82%92map%E3%81%AB%E6%A0%BC%E7%B4%8D">取得結果をMapに格納</h4>
<pre><code>result := map[string]interface{}{}
udtos := []userDTO{}
r.db.Conn(ctx).
　　　　Model(&amp;userDTO{}).
  Where(&quot;id = ?&quot;, userID).
  First(&amp;result)
}
</code></pre>
<p>mapのkeyがカラム名、mapのvalueがDBの値が格納されたmapで取得できました</p>
<h4 id="hints">Hints</h4>
<blockquote>
<p><a href="https://github.com/go-gorm/hints">https://github.com/go-gorm/hints</a></p>
</blockquote>
<p>PostgreSQLはSQL実行時にオプティマイザが統計情報を参照して、最も効率が良いと予想される実行計画が選択され、実行されます。ただし、それが必ずしも最適なものとは限りません。その際に利用する一つの手としてhint句があります。</p>
<p>PostgreSQLでhint句使えないと思ってましたが違うんですね。</p>
<blockquote>
<p><a href="https://pghintplan.osdn.jp/pg_hint_plan.html">https://pghintplan.osdn.jp/pg_hint_plan.html</a><br>
拡張モジュールを使います。</br></p>
</blockquote>
<p>GORM V2ではこの３つが指定できる様です<br>
・Optimizer Hints<br>
・Index Hints<br>
・Comment Hints</br></br></br></p>
<blockquote>
<p><a href="https://gorm.io/docs/hints.html">https://gorm.io/docs/hints.html</a></p>
</blockquote>
<pre><code>import &quot;gorm.io/hints&quot;

db.Clauses(hints.UseIndex(&quot;idx_user_name&quot;)).Find(&amp;User{})
// SELECT * FROM `users` USE INDEX (`idx_user_name`)

db.Clauses(hints.ForceIndex(&quot;idx_user_name&quot;, &quot;idx_user_id&quot;).ForJoin()).Find(&amp;User{})
// SELECT * FROM `users` FORCE INDEX FOR JOIN (`idx_user_name`,`idx_user_id`)&quot;

db.Clauses(
  hints.ForceIndex(&quot;idx_user_name&quot;, &quot;idx_user_id&quot;).ForOrderBy(),
  hints.IgnoreIndex(&quot;idx_user_name&quot;).ForGroupBy(),
).Find(&amp;User{})
// SELECT * FROM `users` FORCE INDEX FOR ORDER BY (`idx_user_name`,`idx_user_id`) IGNORE INDEX FOR GROUP BY (`idx_user_name`)&quot;
</code></pre>
<p>上記のインデックスのヒント句を試してみたかったのですが、拡張モジュールのインストールに手間取りタイムアップ・・・・次回再チャレンジしたいと思います！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）]]></title><description><![CDATA[プロダクト開発の全体的な流れは以下の記事に書いてありますので、今回はGitHubを活用したカンバン方式の詳細を書いて行こうと思います。

Anti-Pattern Inc. Engineering Blog - Anti-Pattern Inc. Engineering Blog
Anti-Pattern Inc.(株式会社アンチパターン)のエンジニアブログです。Anti-Pattern Inc. Engineering Blog
[https://tech.anti-pattern.co.jp/anti-pattern-inc-dev-knowledge-202107/]
アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)
また、開発メンバーの半数以上が副業です。優秀な方々であれば豊富な知識と思考を持っているため、短時間でも十分な成果を出せます。

重要なのはいかに、そういった方々が働きやすい仕組みを作るか、となります。

ちょうどスポットインスタンスをいかにうまく使うかと似ていると思っています。活用にコツがいりますが、扱えれば絶大なパフォーマ]]></description><link>https://tech.anti-pattern.co.jp/githubnopuroziekutowoshi-tute/</link><guid isPermaLink="false">Ghost__Post__6105140f3986b000013a4964</guid><category><![CDATA[GitHub]]></category><category><![CDATA[kanban]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Tue, 03 Aug 2021 13:43:09 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_444-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_444-1.png" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）"/><p>プロダクト開発の全体的な流れは以下の記事に書いてありますので、今回はGitHubを活用したカンバン方式の詳細を書いて行こうと思います。</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/anti-pattern-inc-dev-knowledge-202107/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Anti-Pattern Inc. Engineering Blog - Anti-Pattern Inc. Engineering Blog</div><div class="kg-bookmark-description">Anti-Pattern Inc.(株式会社アンチパターン)のエンジニアブログです。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）"/></div></a><figcaption>アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)</figcaption></figure><p>また、開発メンバーの半数以上が副業です。優秀な方々であれば豊富な知識と思考を持っているため、短時間でも十分な成果を出せます。</p><p>重要なのはいかに、そういった方々が働きやすい仕組みを作るか、となります。</p><p>ちょうどスポットインスタンスをいかにうまく使うかと似ていると思っています。活用にコツがいりますが、扱えれば絶大なパフォーマンスを得ることができること等。</p><p>私はこのメタファーが好きで時たま使っています。</p><p/><!--kg-card-begin: markdown--><h2 id="%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E6%A7%8B%E6%88%90">メンバー構成</h2>
<p>副業: 7名<br>
※週10h ~ 30hと働く時間はそれぞれバラバラで、固定の曜日も設けてません<br>
フルタイム: 2名</br></br></p>
<!--kg-card-end: markdown--><h2 id="%E3%81%93%E3%81%A0%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%84%E7%82%B9">こだわりたい点</h2><ul><li>GitHubをできる限り使う。（いろんなツールを使って、情報を発散させたくない）</li><li>毎週の稼働時間のコミットを求めない</li><li>だれがいつ稼働しても良い状態にする</li><li>自分のタスクの状態管理をできる限り意識させないようにする</li><li>それぞれのタスクの状態がカンバンでわかるようにする</li></ul><h1 id="%E6%BA%96%E5%82%99">準備</h1><h2 id="github%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91">GitHubのプロジェクトとリポジトリの紐付け</h2><p>GitHubはプロジェクトを作成すると、このようなカンバンを作ることができます。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_444.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="1651" height="783" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_444.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/Selection_444.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/Selection_444.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_444.png 1651w" sizes="(min-width: 1200px) 1200px"/></figure><p>開発には</p><ul><li>dev-env</li><li>API</li><li>Front✕3</li></ul><p>と計5つのリポジトリが使われています。</p><p>よってプロジェクトを１つ作りこのような形で対象のリポジトリを紐付けます。こうすると複数のリポジトリのISSUEの情報が１つのカンバンで見ることができるようになります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_443.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="1227" height="754" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_443.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/Selection_443.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_443.png 1227w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%82%AB%E3%83%B3%E3%83%90%E3%83%B3%E3%83%AC%E3%83%BC%E3%83%B3">カンバンレーン</h2><p>今、どのISSUEがどのステータスかひと目で分かるように以下のレーンを使用しています。</p><ul><li>TODO</li><li>Priority List</li><li>Priority List for API</li><li>Priority List for Front</li><li>In Progress</li><li>In Review</li><li>In STG</li><li>Done</li></ul><p>当初 Priority Listは、APIとFrontを一つのレーンで管理していましたが、現在は3レーンに分けています。</p><p>APIかFront、どちらのISSUEか判断する必要がなくなったためメンバーからも好評でした。</p><h2 id="issue%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%A7%BB%E5%8B%95%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96">ISSUE(タスク)の移動の自動化</h2><p>開発者がカンバンのレーンを動かすのは<strong>  Priority List for x → In Progressのみ</strong>です。自分が作業をする際に、ISSUEに自身をアサインします。</p><p>他は全て自動化させます。そのためのルールがこちら</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_448.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="493" height="592"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_447.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="552" height="542"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_446-1.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="505" height="709"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_445-2.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="536" height="610"/></figure><p>また、作成したプルリクエストにプロジェクトとISSUEを紐付けるようにします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_449.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="374" height="343"/></figure><p>こんな感じで、プルリクテンプレートでプルリクテンプレートを作りこれらの紐付け作業を忘れない用にしています。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_450.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="343" height="146"/></figure><p>これで、カンバン上からISSUEに紐づくプルリクがひと目で分かるようになります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_460.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="377" height="295"/></figure><p>こうすることにより</p><ol><li>ISSUEをPriority Listに移動 (POがISSUEを作成したり移動したりすることが多い）</li><li>作業を開始するさいに、ISSUEをIn Progressに移動（開発者)</li><li>プルリクを作成すると自動的に In Reviewに移動</li><li>Reviewerがマージ 自動的にIn STGに移動 (マージされるとGitHub Actionsによってい自動的にStaging環境にデプロイされる)</li><li>Stagingでビジネスサイドが確認＆本番環境へデプロイするとDone 移動(POが基本的に移動、またDoneにはいっているISSUEは毎週月曜日にアーカイブしてます)</li></ol><p>という流れを作ることができ、半自動化もされています。<strong>開発者は 2 のISSUEを取る際のみ動かせば良いという状態が作れています。　 </strong></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_451.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="788" height="174" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/Selection_451.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_451.png 788w" sizes="(min-width: 720px) 720px"/></figure><p>ルールや約束ごとではなく、自動化、仕組み化によって意識しなくても良い状態になっていることが重要です。</p><h1 id="issue%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA">ISSUEのサイズ</h1><p>タスクの見積もりには、Tシャツサイズ見積もりを採用しています。我々が使っているサイズは S,M,Lの3つのみでXLは採用していません。Lよりも大きいものをつけようとする場合は、そもそもISSUEの粒度がでかすぎるとして、もう少し細かくし、L以下になるようにします。</p><p>例：〇〇という機能を作る → 〇〇という機能を作るための設計をする。</p><p>また、S=2h 未満という時間で見積もってはおらず、SサイズのISSUEの例を出しており、それを基準に</p><ul><li>M : Sの3~5倍</li><li>L  : Sの6~10倍</li></ul><p>としています。</p><p>時間で見積もると人によって開発時間は異なるで、作成者によってのサイズばらつきが大きくなってしまいます。</p><p>ISSUEは作成者がS,M,Lのいずれかのlabelを貼ります。着手する前に大体の規模感がわかります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_459.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="385" height="454"/></figure><h1 id="issue%E3%81%AE%E3%81%A8%E3%82%8A%E6%96%B9%E3%81%AE%E5%B7%A5%E5%A4%AB">ISSUEのとり方の工夫</h1><p>基本的にはPriority Listの名前通り上から順に取っていきますが。その際に状態が3つ有ります。</p><ul><li>誰かがアサインされている</li><li><code>anyone</code> ラベルがついている</li><li>上記2つではない</li></ul><p>それぞれから見て一番優先的に取ってほしいISSUEは自分がアサインされているものです。着手する際は、自分以外のassigneesを外してIn Progressに移動します。(開発に加わったばかりのメンバーや特定のISSUE、知識に依存がある場合はこの方法が使われます）</p><p><code>anyone</code> ラベルがついているものは、その名の通り誰でも着手可能な状態となっているISSUEです。空いているときに自由に着手できます。</p><p>上記2つに当てはまらないISSUEはAPIが開発されていないなど別要因で、まだ着手不可なものとなります。</p><p>ちなみに、自分のiconやラベルでカンバン上でワンクリックで絞り込めるのでとても便利です。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_453.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="433" height="429"/></figure><h1 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91milestone">スプリントの紐付け(Milestone)</h1><p>弊社では1週間のスプリントを採用しています。</p><p>In STGにあるISSUEを毎週決まった曜日に現スプリントの数値がはいったMilestoreを紐付けます。(PO)</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_461.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="371" height="518"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_462-1.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="360" height="186"/></figure><p>こうすることで、毎スプリントでの消化ポイント(Sを1ポイントとした)を図ることができます。</p><h2 id="%E7%B4%B0%E3%81%8B%E3%81%84%E5%B7%A5%E5%A4%AB">細かい工夫</h2><h3 id="%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%BE%E3%81%A7%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AAissue%E3%81%AE%E6%8A%8A%E6%8F%A1">リリースまでに必要なISSUEの把握</h3><p>緊急度が高いISSUE(主に、次のリリースには1〜3くらいのISSUE実装完了が必要な場合）がある際は、「次のリリースまでに必要」カードより上においておきます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/Selection_458-4.png" class="kg-image" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）" loading="lazy" width="371" height="211"/></figure><h3 id="issue%E5%88%86%E5%89%B2">ISSUE分割</h3><p>開発者は開発をしている最中や、取り掛かる前にそのISSUEをコンフリクトがおきない（他の人が同時に取り掛かっても問題ない）単位に自由に分割することができます。特にLサイズのラベルがあるISSUEは積極的に分割することを推奨しています。</p><h3 id="%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%92%E5%B8%B8%E3%81%AB%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B">プルリクを常に更新する</h3><p>稼働終了時に常に、しかかりを常にプルリクとしてあげておきます。こうすることにより、途中で他の人に気軽にバトンタッチすることができます。こちらは多々起きる現象ではないですが、これによりMやLサイズのISSUEにも気軽に取り組むことができますし、平日働いて土日に休んでいる間に他の人がしかかりのISSUEを終わらせてくれたりします。</p><h2 id="wiki">Wiki</h2><p>カンバンの仕組みやルール、開発環境についての情報などは全てGitHubのWikiに記載するようにしています。どのメンバーもWikiを任意のタイミングで更新できるようにしており、基本的にはWikiとReadmeを見れば困ることはないという状態になっています。</p><h1 id="%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%95%E3%81%9B%E3%82%8B%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AA%E8%A9%B1">これらの仕組みを加速させる技術的な話</h1><p>FrontはNuxt.jsとTypeScript</p><p>APIはGo</p><p>API定義にはOpenAPIを採用しています。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://spec.openapis.org/oas/v3.1.0"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OpenAPI Specification v3.1.0 | Introduction, Definitions, &amp; More</div><div class="kg-bookmark-description">The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface description for HTTP APIs.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Introduction, Definitions, &amp; More</span></div></div></a></figure><p>そしてOpenAPIから、API側とFront側のコードを自動生成します。</p><p>そうすることにより、下記のmock imageを使うことにより、OpenAPIから自動的に指定されている型を満たすランダムな値が返ってくるmockコンテナを立てることができます。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://hub.docker.com/r/stoplight/prism"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Docker Hub</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div></a></figure><p>この仕組みを使うと新規機能を開発する場合、</p><ol><li>開発ISSUEができる</li><li>OpenAPIの追加ISSUEができる＆mainブランチにマージされる</li><li>コードを自動出力</li><li>mockサーバを活用したFrontの開発、API開発 とそれぞれ平行して行うことができる。</li></ol><p>よって、Frontの開発がAPIの開発を待たなくて良いことや、自動生成により型が保証されており、APIの改修後にFront側をそれに合わせて修正するということが少なくなります。</p><p>また、「OpenAPIの改修」という小さなISSUEに分割するという流れが自然にできるので気に入っています。</p><h1 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h1><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/features/issues"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub Issues · Project planning for developers</div><div class="kg-bookmark-description">Give your developers flexible features for project management that adapts to any team, project, and workflow—all alongside your code.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）"><span class="kg-bookmark-author">GitHub</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/site/social-cards/issues-social.png" alt="GitHubを使った「カンバン方式」の実践ナレッジ(多数の副業メンバーが参画）"/></div></a></figure><p>これがGAされたら、さらにいろいろできるので、GA後さらにカスタマイズしてこうと思ってます。</p>]]></content:encoded></item><item><title><![CDATA[GASでGoogleWorkspaceの共有ドライブ内ファイルの権限チェック]]></title><description><![CDATA[Gsuite改め、Google
Workspaceの共有ドライブ利用して社内のファイルを管理していますが、アルバイトや業務委託の方など関係者が増えてくると権限の管理が煩雑になってきますよね。

弊社アンチパターンでも、権限の設定は共有ドライブのルートフォルダでのみ行い、共有ドライブ内のフォルダやファイルには個別に権限を設定しないというルールはつくったものの、すでに設定されている権限を可視化したり、今後個別設定された権限を検知できないためにGASでチェックできる仕組みを作成しました。

const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('filelist')
const DRIVE_NAME = SHEET.getRange('A1').getValue()

const getFilesAuth = () => {
  // 共有ドライブを取得
  const drive = DriveApp.getFolderById(getDriveId(DRIVE_NAME))
  // デフォルト以外で権限付与]]></description><link>https://tech.anti-pattern.co.jp/linekara/</link><guid isPermaLink="false">Ghost__Post__61056f4c3986b000013a4aba</guid><category><![CDATA[GoogleAppsScript]]></category><category><![CDATA[GoogleWorkspace]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Tue, 03 Aug 2021 13:41:30 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1544396821-4dd40b938ad3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fGZpbGV8ZW58MHx8fHwxNjI3OTgwNjU0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1544396821-4dd40b938ad3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fGZpbGV8ZW58MHx8fHwxNjI3OTgwNjU0&ixlib=rb-1.2.1&q=80&w=2000" alt="GASでGoogleWorkspaceの共有ドライブ内ファイルの権限チェック"/><p>Gsuite改め、Google Workspaceの共有ドライブ利用して社内のファイルを管理していますが、アルバイトや業務委託の方など関係者が増えてくると権限の管理が煩雑になってきますよね。</p><p>弊社アンチパターンでも、権限の設定は共有ドライブのルートフォルダでのみ行い、共有ドライブ内のフォルダやファイルには個別に権限を設定しないというルールはつくったものの、すでに設定されている権限を可視化したり、今後個別設定された権限を検知できないためにGASでチェックできる仕組みを作成しました。</p><!--kg-card-begin: markdown--><pre><code class="language-JavaScript">const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('filelist')
const DRIVE_NAME = SHEET.getRange('A1').getValue()

const getFilesAuth = () =&gt; {
  // 共有ドライブを取得
  const drive = DriveApp.getFolderById(getDriveId(DRIVE_NAME))
  // デフォルト以外で権限付与されているフォルダとファイルをシートに記録
  getAuthorizedItems(drive, DRIVE_NAME)
}

/**
 * ファイルオブジェクトもしくはフォルダオブジェクトから権限保有者名を取得
 * @param {Folder} folder - フォルダ
 * @param {string} path - パス名
 */
const getAuthorizedItems = (folder,path) =&gt; {  
  // フォルダ内のファイルを取得
  const files = folder.getFiles()
  while (files.hasNext()) {
    const file = files.next()
    // ファイルに権限付与されたユーザーを取得
    const authorizers = getAuthorizers(file)
    // デフォルト以外で権限付与されていない場合はスキップ
    if (authorizers === '') continue
    // シートに記録。空白, ファイル名, 権限付与者, ファイルURL
    SHEET.appendRow(['', path + ' / ' + file.getName(), authorizers, file.getUrl()])
  }
  // folder内のフォルダを取得
  const folders = folder.getFolders()
  while (folders.hasNext()) {
    const folder = folders.next()
    const path_name = path + ' / ' + folder.getName()
    // フォルダ内を再帰的に検出
    getAuthorizedItems(folder, path_name)
    // フォルダに権限付与されたユーザーを取得
    const authorizers = getAuthorizers(folder)
    if (authorizers === '') continue
    // シートに記録。d（ディレクトリを表す）, ディレクトリ名, 権限付与者, URL
    SHEET.appendRow(['d', path + ' / ' + folder.getName(), authorizers, folder.getUrl()])
  }
}

/**
 * ファイルオブジェクトもしくはフォルダオブジェクトから権限保有者名を取得
 * @param {object} item - ファイルオブジェクトもしくはフォルダオブジェクト
 * @return {string} - 権限保有者名
 */
const getAuthorizers = (item) =&gt; {
  const editors = item.getEditors()
  const viewers = item.getViewers()
  const authorize_users = editors.concat(viewers)
  let authorizers = ''
  authorize_users.forEach(user =&gt; {
    authorizers += user.getName()+ ' '
  })
  return authorizers
}

/**
 * 共有ドライブ名から共有ドライブを取得
 * @param {string} teamDriveName - 共有ドライブ名
 * @return {int} - 共有ドライブID
 */
const getDriveId = (drive_name) =&gt; {
  // シートA1セルに記載のドライブ名を取得
  const team_drives = Drive.Teamdrives.list().items
  Logger.log(team_drives)
  let id = 0
  team_drives.forEach(team_drive =&gt; {  
      if (team_drive.name === drive_name) {
        Logger.log(team_drive.getId())
       id = team_drive.getId()
    }
  })
  return id
}
</code></pre>
<!--kg-card-end: markdown--><p>実行すると、このような具合に個別に権限付与されたファイル・フォルダの一覧を取得することができます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-52.png" class="kg-image" alt="GASでGoogleWorkspaceの共有ドライブ内ファイルの権限チェック" loading="lazy" width="2000" height="1185" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-52.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-52.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/05/image-52.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-52.png 2072w" sizes="(min-width: 720px) 720px"/></figure><p>共有ドライブ内のファイル数が多いと実行に時間がかかり、GASの実行時間上限に引っかかってしまう場合があるので、スプレッドシートへの記録を一回で済むようにしたり、複数回実行しても大丈夫なように工夫する必要がありそうです。</p>]]></content:encoded></item><item><title><![CDATA[JavaScriptで [] === [] が falseになるのがなぜなのかわからなかったので言語化してみた]]></title><description><![CDATA[こんにちは、いわむらです

先日ある処理の実装をしていた時に空配列の判定処理がうまくいかず試行錯誤している中で 空配列 === [] 
としてみた時にfalseが返ってきたのですがその時になぜfalseになるか説明できずもやもやしていたのでちょっと調べてみました

普段は 配列.length !== 0として比較していたのですが、今回気になった部分でやっていることを分解してみると以下のような記述と同じになります

const emptyArray = [];
const emptyArray1 = [];

console.log(emptyArray === emptyArray1); // false

// 参照同士の場合
const emptyArrayRef = [];
const emptyArrayRef1 = emptyArrayRef;

console.log(emptyArrayRef === emptyArrayRef1); // true

なぜ初めに検証した空配列同士の比較がfalseになるかというと、それぞれの変数が参照しているメモリ箇所を比較しているので]]></description><link>https://tech.anti-pattern.co.jp/javascriptde/</link><guid isPermaLink="false">Ghost__Post__60edc4b73986b000013a376e</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Fri, 30 Jul 2021 16:08:46 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>先日ある処理の実装をしていた時に空配列の判定処理がうまくいかず試行錯誤している中で <code>空配列 === []</code> としてみた時にfalseが返ってきたのですがその時になぜfalseになるか説明できずもやもやしていたのでちょっと調べてみました</p><p>普段は <code>配列.length !== 0</code>として比較していたのですが、今回気になった部分でやっていることを分解してみると以下のような記述と同じになります</p><pre><code class="language-JavaScript">const emptyArray = [];
const emptyArray1 = [];

console.log(emptyArray === emptyArray1); // false

// 参照同士の場合
const emptyArrayRef = [];
const emptyArrayRef1 = emptyArrayRef;

console.log(emptyArrayRef === emptyArrayRef1); // true</code></pre><p>なぜ初めに検証した空配列同士の比較がfalseになるかというと、それぞれの変数が参照しているメモリ箇所を比較しているのでfalseになるということがわかりました</p><p>これでなぜ <code>空配列 === []</code>がfalseを返すのが説明できるようになりました</p><p>ついでに元々実装しようとしていた部分がなぜうごかなかったのかも復習してみようと思います</p><pre><code class="language-TypeScript">type User = {
	id: number
    name: string
    description?: string[]
}

const userNoDescription = {
	id: 1,
    name: 'hoge',
} as User

// うまくいかなかない
const foo = function(description: string[]|undefined): void {
	if (description?.length !== 0) {
    	// do something
    }
}

foo(userNoDescription)</code></pre><p>上の実装だとなぜうまくいかなかったのかは引数の <code>description</code>がundefinedの場合も空配列ではない時の処理が実行されてしまうという所が原因でした</p><p>上の実装をいい感じに直すと以下のようになります</p><pre><code class="language-TypeScript">// type User と const userNoDescriptionは省略
const foo = function(description: string[]|undefined): void {
	if (Array.isArray(description) &amp;&amp; description.length !== 0) {
    	// do something
    }
}

foo(userNoDescription)</code></pre><p>これで期待した通りの動きになりました</p><p>すごく基本的な部分ですがちゃんと言語化できることって大事だなと気づきました。最後まで読んでいただきありがとうございました。</p>]]></content:encoded></item><item><title><![CDATA[AWS SSO 向けの Chrome 拡張機能を作ったお話]]></title><description><![CDATA[こんにちは。矢ヶ崎です。

AWS Single Sign-On (AWS SSO) って便利ですよね。AWS で複数アカウントを扱う時には、AWS Organizations
を使って管理することがよくあるかと思いますが、ログインをどう統合するのか？ってなかなか頭を悩ませる場合があるかと思います。AWS SSO
を使うと、ADだIdPだSAMLだとか、なんやかんや難しいことを考えないでも簡単にログインを統合することができます(もちろんちゃんと考えてもっと複雑な認証統合にも使うことができます)。なので、弊社でも便利に使わせていただいております！

いや〜これは便利！とか思いつつも、現時点でちょっと足りないと感じる部分ももちろんあります。

それは、ここ！

AWS コンソールのヘッダ部分です！

簡単にログインできるのは良いのですが、いまどのアカウントを操作しているのか、パッと見でわかりません。。。現在のロールとログインユーザはわかるのですが、「どのアカウント」を操作しているのかがパッとわからないのです！思い込みが激しめのぼくには、これはなかなか危険です。開発アカウントであれこれしてい]]></description><link>https://tech.anti-pattern.co.jp/chromekuo-zhang-zuo-ri/</link><guid isPermaLink="false">Ghost__Post__60f920993986b000013a3858</guid><category><![CDATA[AWS]]></category><category><![CDATA[SSO]]></category><category><![CDATA[ChromeExtension]]></category><category><![CDATA[GoogleChrome]]></category><category><![CDATA[Firefox]]></category><dc:creator><![CDATA[Akihiro YAGASAKI]]></dc:creator><pubDate>Thu, 22 Jul 2021 13:41:17 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/awssso1.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/awssso1.png" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話"/><p>こんにちは。矢ヶ崎です。</p><p>AWS Single Sign-On (AWS SSO) って便利ですよね。AWS で複数アカウントを扱う時には、AWS Organizations を使って管理することがよくあるかと思いますが、ログインをどう統合するのか？ってなかなか頭を悩ませる場合があるかと思います。AWS SSO を使うと、ADだIdPだSAMLだとか、なんやかんや難しいことを考えないでも簡単にログインを統合することができます(もちろんちゃんと考えてもっと複雑な認証統合にも使うことができます)。なので、弊社でも便利に使わせていただいております！</p><p>いや〜これは便利！とか思いつつも、現時点でちょっと足りないと感じる部分ももちろんあります。</p><p>それは、ここ！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-14.png" class="kg-image" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話" loading="lazy" width="1388" height="134" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-14.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-14.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-14.png 1388w" sizes="(min-width: 720px) 720px"/></figure><p>AWS コンソールのヘッダ部分です！</p><p>簡単にログインできるのは良いのですが、いまどのアカウントを操作しているのか、パッと見でわかりません。。。現在のロールとログインユーザはわかるのですが、「どのアカウント」を操作しているのかがパッとわからないのです！思い込みが激しめのぼくには、これはなかなか危険です。開発アカウントであれこれしているつもりが、実は本番アカウントだった！とかだと事故が起こってしまいます。</p><p>そこで、こんな表示になるといいな〜と思いました。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-15.png" class="kg-image" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話" loading="lazy" width="1144" height="140" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-15.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-15.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-15.png 1144w" sizes="(min-width: 720px) 720px"/></figure><p>「あ〜 SSO でログイン中なんだな〜。どのアカウントにどんなロールで入ってるんだな〜。ヘッダが赤めになっているっていうことは、本番アカウントだから気をつけないとな〜。」</p><p>っていう感じでわかるといいな！と思いました。そこで、今回は Chrome 拡張機能で解決することにしました。</p><p>ダウンロードはこちらから：</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://chrome.google.com/webstore/detail/extension-for-aws-sso/ejjegcnihofdahmbbhekhkcnpflljeej?hl&#x3D;ja"><div class="kg-bookmark-content"><div class="kg-bookmark-title">拡張機能 for AWS SSO</div><div class="kg-bookmark-description">AWS Single Sign-On (AWS SSO) を使うときに、もうちょっと便利に使えるようにするための拡張機能です。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ssl.gstatic.com/chrome/webstore/images/icon_144px.png" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話"><span class="kg-bookmark-author">Chrome ウェブストア</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://lh3.googleusercontent.com/iittSyh13Y6M3Hy9HJP5kM2zBZXo5bpJxmxMGjH4hWpj9sOfVsc5v5oChBPa5ZSjaoNUTs5SUlkScCwAGLEjX88H&#x3D;w128-h128-e365-rj-sc0x00ffffff" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話"/></div></a></figure><p>しかし、「Chrome 拡張機能で大切な AWS コンソールの情報を取られたり操作されたりするのはこわい！だから、こんな得体のしれない拡張機能入れたくない！」っていうのがあるかと思います。</p><p>そんな方は、以下にソースコードがありますので、 Clone して、中身を確認して、Chrome の開発者モードで使ってもらえれば得体がわかる状態で安心してお使いいただけます！</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yaggytter/chrome-extension-awssso"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yaggytter/chrome-extension-awssso: Chrome Extension for AWS SSO</div><div class="kg-bookmark-description">Chrome Extension for AWS SSO. Contribute to yaggytter/chrome-extension-awssso development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yaggytter</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b1d142dd197fb6444571801a977226c28836551398d5de6ec7e8923c7b638eb8/yaggytter/chrome-extension-awssso" alt="AWS SSO 向けの Chrome 拡張機能を作ったお話"/></div></a></figure><p>強い権限を要求してくる得体のしれない Chrome 拡張機能はちゃんと確認してから使いましょう！ということです。</p><p>見ていただくとわかりますが、中身はめっちゃ単純です。</p><p>・AWS SSO のアプリケーション一覧ページ（AWS アカウントにログインするページ）から DOM を解析して、クリックされた部分の情報をブラウザに記憶します。<br>	content.js で解析をし、 background.js で記憶します</br></p><p>・AWS コンソールにページでは、右上のアカウント情報の部分を、記憶したものをベースに書き換えます。</p><p>・もしアカウント名（AWS SSOでつけた名前）に 'Production' が含まれていたら本番アカウントと認識して、ヘッダの色を赤めにします</p><p>ただこれだけです！</p><p>Chrome 拡張機能は、エンジニアにとってはとっても単純で簡単に作成することができるかと思います。もし、みなさんが大好きなWebサービスやWebページがあって、大好きなんだけどちょっとだけ物足りないな〜、っていう場合には、サービス提供元に要望をフィードバックするとともに、サクッと Chrome 拡張機能を作って自分で便利にしちゃうっていうのもありますよ！個人的にはおすすめですよ！っていうお話でした。</p><p>（もちろん、 Firefox 拡張機能など、他のブラウザでも同様です）</p><p>こちらからは以上です。</p>]]></content:encoded></item><item><title><![CDATA[アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)]]></title><description><![CDATA[こんにちは。

株式会社アンチパターンのCEO兼VPoEの小笹です。

株式会社アンチパターンでは、「日本のソフトウェアエンジニアを憧れの職業へ」を目指して、AWSエンジニア特化型のマッチングプラットフォーム「engineed」を開発しています。

engineedの開発は、フルタイムのメンバーだけではなく、社内のメンバーがサイドプロジェクトとして関わっていたり、外部の副業やフリーランスの方々が多数関わっていたりします。

前提として、優秀なソフトウェアエンジニアは生産性が非常に高いです。
なので、少ない時間でも優秀な人がプロダクト開発に関わってくださることは、大きな価値を生みます。
しかしながら、多くの企業がまだ副業者の活用に関して、ネガティブなイメージを持っていたり、うまく活用するイメージをもっていないように思います。
(私自身がengineedの営業を行う中で感じていることなのでやや定性的ですが)

そこで、非同期的なプロダクト開発を進めていくナレッジをシェアすることで、少しでも啓蒙活動になればいいなというのと、
より多くの優秀なソフトウェアエンジニアに参画いただきたいと思い、筆]]></description><link>https://tech.anti-pattern.co.jp/anti-pattern-inc-dev-knowledge-202107/</link><guid isPermaLink="false">Ghost__Post__60e6f9a83986b000013a366d</guid><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Thu, 08 Jul 2021 13:24:16 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/Selection_345-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/Selection_345-1.png" alt="アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)"/><p>こんにちは。</p>
<p>株式会社アンチパターンのCEO兼VPoEの小笹です。</p>
<p>株式会社アンチパターンでは、「日本のソフトウェアエンジニアを憧れの職業へ」を目指して、AWSエンジニア特化型のマッチングプラットフォーム「engineed」を開発しています。</p>
<p>engineedの開発は、フルタイムのメンバーだけではなく、社内のメンバーがサイドプロジェクトとして関わっていたり、外部の副業やフリーランスの方々が多数関わっていたりします。</p>
<p>前提として、優秀なソフトウェアエンジニアは生産性が非常に高いです。<br>
なので、<strong>少ない時間でも優秀な人がプロダクト開発に関わってくださることは、大きな価値を生みます。</strong><br>
しかしながら、多くの企業がまだ副業者の活用に関して、ネガティブなイメージを持っていたり、うまく活用するイメージをもっていないように思います。<br>
(私自身がengineedの営業を行う中で感じていることなのでやや定性的ですが)</br></br></br></p>
<p>そこで、非同期的なプロダクト開発を進めていくナレッジをシェアすることで、少しでも啓蒙活動になればいいなというのと、<strong>より多くの優秀なソフトウェアエンジニアに参画いただきたい</strong>と思い、筆を執りました。</p>
<p>本項では、非同期的なプロダクト開発に関して、</p>
<ol>
<li>時間的な流れに着目した開発の流れ</li>
<li>インクリメントに着目した開発の流れ</li>
</ol>
<p>で整理しています。</p>
<h2 id="%E6%A6%82%E8%A6%81">概要</h2>
<h3 id="%E4%BD%93%E5%88%B6">体制</h3>
<ul>
<li>プロダクトオーナー：1名</li>
<li>スクラムマスター(仮)：1名</li>
<li>開発チーム(ソフトウェアエンジニア)：9名</li>
<li>開発チーム(デザイナー)：1名</li>
</ul>
<h3 id="%E6%8A%80%E8%A1%93">技術</h3>
<ul>
<li>環境：Docker</li>
<li>フロント：TypeScript / Vue.js / Nuxt.js / Vuetify</li>
<li>API：Go</li>
<li>DB：PostgreSQL</li>
<li>ソース/課題管理：GitHub</li>
<li>インフラ：AWS</li>
</ul>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-06-10.27.12.png" alt="アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h1 id="1%E6%99%82%E9%96%93%E7%9A%84%E3%81%AA%E6%B5%81%E3%82%8C%E3%81%AB%E7%9D%80%E7%9B%AE%E3%81%97%E3%81%9F%E9%96%8B%E7%99%BA%E3%81%AE%E6%B5%81%E3%82%8C">1.時間的な流れに着目した開発の流れ</h1>
<h2 id="%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%EF%BC%9F">スクラムじゃない？</h2>
<p>私自身認定スクラムマスターの資格を持っておきながらなんですが、engineedでは「スクラムを採用している」と言っていません。<br>
というのも、スクラムというと設定されたイベントや確約をしっかり実行/設定している感じに受け取られますが、それは難しいと感じているからです。</br></p>
<h2 id="%E3%82%84%E3%82%81%E3%81%9F%E3%81%93%E3%81%A8">やめたこと</h2>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%82%B4%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">スプリントゴールを設定すること</h3>
<p>1週間を周期(スプリント)とおいて各人が開発に取り組んでいますが、その週どれくらいの時間をプロジェクトに投じれるかは本人も分かりません。<br>
なので、スプリントゴールを定めて、それを果たすぞ！と息巻いたところで、正直何にもならないのです。<br>
アンコントローラブルなものは、アンコントローラブルなものとして扱うべきです。<br>
なので思い切ってスプリントゴールを設定することをプロジェクトの初期段階でやめました。<br>
当然ベロシティは計測しプロダクトのロードマップは引きます。</br></br></br></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%97%E3%83%A9%E3%83%B3%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%87%E3%82%A4%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0">スプリントプランニング/デイリースクラム</h3>
<p>多くのメンバーがサイドプロジェクトとして参画していることもあり、同期で行うイベントを設定するのが難しいです。<br>
なのでスプリントゴールを設定しないことと合わせて、スプリントプランニングとデイリースクラムをなくしました。<br>
実施しているのはスプリントレビューとスプリントレトロスペクティブ、そしてウィークリースクラムです。</br></br></p>
<h3 id="%E5%8A%B4%E5%83%8D%E6%99%82%E9%96%93%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">労働時間を管理すること</h3>
<p>週ごとに何時間働くかを管理していません。実績を見ることはします。</p>
<h2 id="%E5%AE%9F%E6%96%BD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">実施していること</h2>
<h3 id="%E3%82%A6%E3%82%A3%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0">ウィークリースクラム</h3>
<p>その週やったこと、次やろうと思っていること、困っていることを発表します。<br>
もし、その週稼働できなかったら、ちょっと忙しくてできませんでした！と発表してもらいます。<br>
それでは、問題の検知が1週間ごとにしかできないのでは？と思われる方もいるかもしれませんが、問題は発生した時、その場で共有し、その解決にフォーカスすべきだと考えています。</br></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC">スプリントレビュー</h3>
<p>最近は毎スプリントリリースしているので、プロダクトの最新版を共有しつつ、ビジネスのことも含めてシェアします。<br>
この際、発表はプロダクトオーナーがしております。<br>
基本的にはみんなでプロダクトの成長や発展を喜んでいるセレモニーとなっています。</br></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%AC%E3%83%88%E3%83%AD%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96">スプリントレトロスペクティブ</h3>
<p>そのスプリントの結果などをスクラムマスター(仮)の僕がシェアします。</p>
<h4 id="%E7%99%BA%E8%A1%A8%E3%81%AE%E5%86%85%E5%AE%B9">発表の内容</h4>
<ul>
<li>何がリリースできたのか？</li>
<li>そのスプリントで消化したISSUEの総計ポイントはいくつだったか？</li>
<li>今後どのような変化が予測されるか？</li>
</ul>
<p>発表を踏まえてチームでのふりかえりを実施します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/RetroSample.001.jpeg" alt="アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><ul>
<li>What was Good?</li>
<li>What was Bad?</li>
<li>Ideas</li>
<li>Action</li>
</ul>
<p>という4象限を使っています。<br>
Miroにあったクイックレトロスペクティブをそのまま採用しています。<br>
ファシリテーションはスクラムマスター(仮)が行っています。</br></br></p>
<p>より非同期で開発しやすいようにWikiの更新がActionになることがあります。</p>
<h2 id="%E6%99%82%E9%96%93%E7%9A%84%E3%81%AA%E6%B5%81%E3%82%8C">時間的な流れ</h2>
<p>月：スプリントレビュー/スプリントレトロスペクティブ/ウィークリースクラムを実施します。<br>
火~金：割と夜に開発が進む傾向にあります。<br>
土日：もりもりと開発が進みます。</br></br></p>
<h2 id="%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%A8%E3%81%97%E3%81%A6%E3%82%82">スクラムじゃないとしても</h2>
<p>イベントなどは全然違いますが、その三本柱たる「透明性」「検査」「適応」は実現できていると思っています。<br>
また価値基準に関してもかなり高い水準で満たされています。</br></p>
<p><em>確約（Commitment）</em><br>
プロダクトを通した理念実現に向けて互いをサポートすることを確約しています。</br></p>
<p><em>集中（Focus）</em><br>
プロダクトを成長させるためにそのスプリントで可能な限り集中して作業します。</br></p>
<p><em>公開（Openness）</em><br>
全ての作業はGitHubのカンバンを活用し全メンバーが見られる状態になっています。<br>
作業途中でもプルリクエストを出し、他メンバーに作業を引き渡すなども行われています。</br></br></p>
<p><em>尊敬（Respect）</em><br>
各メンバーは独立した一個人として尊重して扱われます。誰しも時間の制約はあれど、出来うる限りの確約をしてくれることを信頼しています。</br></p>
<p><em>勇気（Courage）</em><br>
ただでさえソフトウェア開発は難しい中で、非同期に行うことは困難です。皆そのことに勇気を持って向き合ってくれています。</br></p>
<p>スクラムじゃないとしても学んできた内容は開発フローの中に詰まっています。(アジャイルではあると思ってます。)</p>
<p>これからも大事に育てていきたいと思います。</p>
<h1 id="2%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E7%9D%80%E7%9B%AE%E3%81%97%E3%81%9F%E9%96%8B%E7%99%BA%E3%81%AE%E6%B5%81%E3%82%8C">2.インクリメントに着目した開発の流れ</h1>
<p>なるべく各人が非同期に活動できるようワークフローや技術面も工夫しています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineedDevFlow.001.jpeg" alt="アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>青：プロダクトオーナー、デザイナー、スクラムマスター(仮)<br>
緑：開発チーム</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_345.png" alt="アンチパターン社における非同期的なプロダクト開発のナレッジ(202107スナップショット)" loading="lazy"/></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0issue%E3%82%92%E4%BD%9C%E3%82%8B">プロダクトバックログ(ISSUE)を作る</h2>
<p>ここは主にプロダクトオーナーとスクラムマスターで議論をしていきます。<br>
2人ともユーザーやクライアントと直接やりとりをし、何故その機能を作るべきなのかをしっかり設計します。<br>
その部分が後ろの工程で行われる開発の品質に関わることを知っているからです。</br></br></p>
<h2 id="%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3">デザイン</h2>
<p>プロダクトバックログをもとにデザインに起こします。<br>
engineedではAtomic Designを採用しており、AtomをなるべくVuetifyのコンポーネントで表現しようとしています。<br>
なので、基本的にはVuetifyを見ながらFigma上にデザインを作っていきます。<br>
大抵2~3案あげて、議論を深めます。<br>
デザインが不要な機能に関してはこの工程をスキップします。</br></br></br></br></p>
<h2 id="%E8%A8%AD%E8%A8%88api%E5%AE%9A%E7%BE%A9">設計/API定義</h2>
<p>画面が必要なものはFigmaとプロダクトバックログを、必要でないものはプロダクトバックログをもとに、データモデルを設計をします。そしてAPI定義を行います。<br>
コンフリクト防止とフロント側への開発影響を極力少なくするために、OpenAPIを使ってスキーマファーストなフローにしています。</br></p>
<h2 id="issue%E5%88%86%E5%89%B2">ISSUE分割</h2>
<p>必要に応じてフロントとAPIにISSUEを分割します。その際もとのプロダクトバックログは親ISSUEとして設定します。<br>
この時点でISSUEにはS/M/Lの規模見積もりを付与します。<br>
これはベロシティの計算に活用しつつ、その機能の実装時期を見積もる際に活用します。<br>
ISSUEにはラベルが設定されており、anyoneというラベルは誰でも取っていいなどルールが設定されています。</br></br></br></p>
<h2 id="%E9%96%8B%E7%99%BA">開発</h2>
<p>フロントとAPIでそれぞれレーンを設けてあり上から順に開発していきます。<br>
フロントもAPIもどちらもできる人はプロダクトオーナーと相談したりその時の状況を見てよしなに取っていってもらいます。<br>
着手したらIn Progressレーンにチケットを移動させます。</br></br></p>
<h3 id="%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%86%E3%82%B9%E3%83%88">システムテスト</h3>
<p>Front：スナップショットテストは必須としており、ロジックの部分は徐々に増やしていっているところであります。<br>
API：ユニットテストとインテグレーションテストを必須としています。<br>
Front、APIともにプルリク作成時にGitHub Actionsでテストが走り、すべて通った上で、別のメンバーによるレビューを受けないとマージできない仕組みとなっています。</br></br></p>
<h2 id="%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E3%83%86%E3%82%B9%E3%83%88">受け入れテスト</h2>
<p>プロダクトバックログが要求を満たしているかを確認します。<br>
確認ができた場合はチェック完了のラベルをISSUEにつけます。<br>
不具合や追加の要望があれば、ISSUEを戻すのではなく、新たにISSUEを起票します。</br></br></p>
<h2 id="%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">デプロイ</h2>
<p>そのデプロイのバージョン(メジャーなのかパッチなのか)とデプロイ先の環境(内部向けかユーザー向けかなど)によって作業内容や確認方法を変えています。<br>
人の手をなるべく介さないようにCI/CD環境を整えることも必要です。<br>
1スプリントに1回リリースできるといいなと思ってやっております。</br></br></p>
<p>提供したインクリメントが価値を発揮しているかは様々なデータをもとに分析し、より良いプロダクトになるように意識しています。こちらも大事に育てていきたいと思っています。</p>
<h1 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h1>
<p>ソフトウェア開発って楽しいですよね！</p>
<h3 id="%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA%E3%82%92%E9%80%B2%E3%82%81%E3%82%8B%E4%B8%8A%E3%81%A7%E9%87%8D%E8%A6%81%E3%81%A0%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%8C%E3%82%89%E6%B1%8E%E7%94%A8%E7%9A%84%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%AA%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">プロダクト開発を進める上で重要だと思っていながら汎用的じゃないなと思っていること</h3>
<p>engineedのプロダクトオーナーは優秀なソフトウェアエンジニアです。なので、LayerXさんが定義しているようなProduct Engineering Managerと言っていいと思います。彼自身が技術的なところもかなり踏み込んで開発チームと密なコミュニケーションをとって、技術的な側面も含めて戦略を策定していますし、直近の戦略では彼自身がビジネスのマネジメント権限を僕に一時的に委譲し、開発に入るということも実行しています。ソフトウェアエンジニアリングの知識があるプロダクトマネジメントってとってもいいなと思うので、これも啓蒙していきたいところです。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[JavaScriptでCSVをDLする方法]]></title><description><![CDATA[こんにちは、いわむらです

今回はJavaScriptでCSVファイルを出力する方法をこの間覚えたのでご紹介しようと思います

CSVファイルはサーバーサイドの方で作成した情報をjsonで返ってくる想定で作成します

とりあえず先に完成形はこんな感じになります(※ IEやFirefoxでは別途対応が必要)

function downloadCSV(data) {
  const data = data.csv;
  const bom  = new Uint8Array([0xef, 0xbb, 0xbf]);
  const blob = new Blob([bom, data], { type: "text/csv" });
  const url  = 
    (window.URL || window.webkitURL).createObjectURL(blob);
  const downloadElement    = document.createElement("a"); 
  downloadElement.href     = url;
  downloadE]]></description><link>https://tech.anti-pattern.co.jp/javascriptdecsvwodlsurufang-fa/</link><guid isPermaLink="false">Ghost__Post__610538053986b000013a4a74</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Tue, 06 Jul 2021 11:58:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回はJavaScriptでCSVファイルを出力する方法をこの間覚えたのでご紹介しようと思います</p><p>CSVファイルはサーバーサイドの方で作成した情報をjsonで返ってくる想定で作成します</p><p>とりあえず先に完成形はこんな感じになります(※ IEやFirefoxでは別途対応が必要)</p><pre><code>function downloadCSV(data) {
  const data = data.csv;
  const bom  = new Uint8Array([0xef, 0xbb, 0xbf]);
  const blob = new Blob([bom, data], { type: "text/csv" });
  const url  = 
    (window.URL || window.webkitURL).createObjectURL(blob);
  const downloadElement    = document.createElement("a"); 
  downloadElement.href     = url;
  downloadElement.download = 'sample.csv';
  downloadElement.click();
  (window.URL || window.webkitURL).revokeObjectURL(url);
}</code></pre><p>自分の作成したコードは、受け取ったdataオブジェクトの中にcsvプロパティがあり(中身はCSVの元になる情報)それを <code>sample.csv</code> というファイルとして出力する処理になっています</p><p>実装前の自分は知らない処理ばっかりだったので1行ずつ処理を追って説明してみようと思います</p><pre><code>const data = data.csv</code></pre><p>これは 引数に渡されたdataオブジェクトからcsvの内容を取り出しています</p><pre><code>const bom = new Uint8Array([0xef, 0xbb, 0xbf])</code></pre><p>new Uint8Array がなんぞやって感じだったので<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array" rel="noopener">MDN</a>で調べました</p><blockquote><code><strong>Uint8Array</strong></code>は型付き配列であり、 8 ビット符号なし整数値の配列を表します。中身は<code>0</code>で初期化されます。生成されると、配列の中の要素はオブジェクトのメソッドを使用するか、配列の標準的な添字の構文を使用するか (すなわち、ブラケット構文を使用するか) して参照することができます。</blockquote><p>やっているのはUTF-8のファイルだということを示すためにUint8Arrayを使ってバイナリデータにしてます</p><pre><code>const = new Blob([bom, data], { type: "text/csv" })</code></pre><p>これは受け取った引数を元に新しいBlob (バイナリ・ラージ・オブジェクト) を作成します。第1引数に元になる情報、第2引数にオプションとしてMINEタイプを渡しています。</p><pre><code>const url = (window.URL || window.webKitURL).createObjectURL(blob)</code></pre><p>ブラウザのメモリ上にあるblobを参照するためのオブジェクトURL作成をしています</p><pre><code>const downloadElement = document.createElement("a")</code></pre><p>ダウンロードを実行するためにaタグを作成しています</p><pre><code>downloadElement.href = url</code></pre><p>ダウンロード先のURLは先程作成したオブジェクトURLをセットしています</p><pre><code>downloadElement.download = 'sample.csv'</code></pre><p>aタグのdownload属性に値をセットするとセットした値のファイル名でダウンロードされるので指定のファイル名をセットしています</p><pre><code>downloadElement.click()</code></pre><p>擬似的にクリックしたことにしてダウンロードを実行させています</p><pre><code>(window.URL || window.webkitURL).revokeObjectURL(url)</code></pre><p>最後にダウンロードが完了したらオブジェクトURL生成時にブラウザのメモリを利用しているのでメモリを開放します</p><p>といった感じの流れで終了です</p><p>今回1行ずつ処理を見てみてとても勉強になりました</p><p>次回は今回の処理をTypeScriptで実装してみようかなと思っています</p><p>最後まで読んでいただきありがとうございました</p>]]></content:encoded></item><item><title><![CDATA[GolangでCognito認証しトークンを取得する]]></title><description><![CDATA[自分が関わっているサービスで、認証にAmazon Cognitoを使っています。

Amazon Cognito（ウェブ/モバイルアプリのユーザー管理）| AWSAmazon Web Services, Inc.
[https://aws.amazon.com/jp/cognito/]
全てのリクエストについてトークンの検証をするので、APIサーバの動作確認時に必ずヘッダにトークンをセットする必要があります。このトークンを用意するのが地味に面倒だったので、Golangでスクリプトを書きました。

以下の記事を参考にしました。

golangでCognito認証（ただしSecure Remote Password(SRP)プロトコルではない） - Qiita参考
http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.ht...
Qiitacobachan [https://qiita.com/cobachan/items/9e]]></description><link>https://tech.anti-pattern.co.jp/golang-cognito/</link><guid isPermaLink="false">Ghost__Post__61040a413986b000013a45df</guid><category><![CDATA[Amazon Cognito]]></category><category><![CDATA[Go]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Tue, 29 Jun 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>自分が関わっているサービスで、認証にAmazon Cognitoを使っています。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/cognito/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon Cognito（ウェブ/モバイルアプリのユーザー管理）| AWS</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/libra-css/images/site/touch-icon-ipad-144-smile.png"><span class="kg-bookmark-author">Amazon Web Services, Inc.</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_1200x630.png"/></div></a></figure><!--kg-card-begin: markdown--><p>全てのリクエストについてトークンの検証をするので、APIサーバの動作確認時に必ずヘッダにトークンをセットする必要があります。このトークンを用意するのが地味に面倒だったので、Golangでスクリプトを書きました。</p>
<p>以下の記事を参考にしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/cobachan/items/9ec379bbcc28a9d3d08a"><div class="kg-bookmark-content"><div class="kg-bookmark-title">golangでCognito認証（ただしSecure Remote Password(SRP)プロトコルではない） - Qiita</div><div class="kg-bookmark-description">参考 http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.ht...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">cobachan</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1aMjlzWVc1bjQ0R25RMjluYm1sMGItaXFqZWlvdk8tOGlPT0JuLU9Cb09PQmwxTmxZM1Z5WlNCU1pXMXZkR1VnVUdGemMzZHZjbVFvVTFKUUtlT0RsLU9EcmVPRGlPT0NzLU9EcS1PQnAtT0JyLU9CcXVPQmhPLThpUSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz0zNDM5ZTNiMWI1NjU0YTJkYTYyMWQyYTRiZTc5Mzg2ZQ&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RR052WW1GamFHRnUmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT00NSZ0eHQtYWxpZ249cmlnaHQlMkNib3R0b20mcz05ZDk4YWFlMzI2MWM1MzYxYjRlNGUyZDBmM2UzOTM1MA&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;bd6ba9aebd7022eb579c63ff8f29209d"/></div></a></figure><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/f4552724774f546a688e0935f80154c7.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist109529913" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_token-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_token-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_token-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_token-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_token-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_token-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_token-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_token-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;os&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_token-go-LC7" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_token-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/aws&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_token-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/aws/session&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_token-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/service/cognitoidentityprovider&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_token-go-LC11" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_token-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_token-go-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_token-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">os</span>.<span class="pl-c1">Args</span>) <span class="pl-c1">!=</span> <span class="pl-c1">3</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_token-go-LC15" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Fatal</span>(<span class="pl-s">&quot;invalid args&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_token-go-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_token-go-LC17" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">id</span> <span class="pl-c1">:=</span> <span class="pl-s1">os</span>.<span class="pl-c1">Args</span>[<span class="pl-c1">1</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_token-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">password</span> <span class="pl-c1">:=</span> <span class="pl-s1">os</span>.<span class="pl-c1">Args</span>[<span class="pl-c1">2</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_token-go-LC19" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_token-go-LC20" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">params</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>cognitoidentityprovider.<span class="pl-smi">AdminInitiateAuthInput</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_token-go-LC21" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">AuthFlow</span>: <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">cognitoidentityprovider</span>.<span class="pl-c1">AuthFlowTypeAdminNoSrpAuth</span>),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_token-go-LC22" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">AuthParameters</span>: <span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-c1">*</span><span class="pl-smi">string</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_token-go-LC23" class="blob-code blob-code-inner js-file-line">			<span class="pl-s">&quot;USERNAME&quot;</span>: <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">id</span>),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_token-go-LC24" class="blob-code blob-code-inner js-file-line">			<span class="pl-s">&quot;PASSWORD&quot;</span>: <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">password</span>),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_token-go-LC25" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_token-go-LC26" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">ClientId</span>:   <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;CLIENT_ID&quot;</span>)),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_token-go-LC27" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">UserPoolId</span>: <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;USER_POOL_ID&quot;</span>)),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_token-go-LC28" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_token-go-LC29" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_token-go-LC30" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">client</span> <span class="pl-c1">:=</span> <span class="pl-s1">cognitoidentityprovider</span>.<span class="pl-en">New</span>(</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_token-go-LC31" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">session</span>.<span class="pl-en">Must</span>(<span class="pl-s1">session</span>.<span class="pl-en">NewSessionWithOptions</span>(session.<span class="pl-smi">Options</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_token-go-LC32" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">SharedConfigState</span>: <span class="pl-s1">session</span>.<span class="pl-c1">SharedConfigEnable</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_token-go-LC33" class="blob-code blob-code-inner js-file-line">		})),</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_token-go-LC34" class="blob-code blob-code-inner js-file-line">	)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_token-go-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_token-go-LC36" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">res</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">AdminInitiateAuth</span>(<span class="pl-s1">params</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_token-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_token-go-LC38" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Fatal</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_token-go-LC39" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_token-go-LC40" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">res</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-s1">res</span>.<span class="pl-c1">AuthenticationResult</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-s1">res</span>.<span class="pl-c1">AuthenticationResult</span>.<span class="pl-c1">IdToken</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_token-go-LC41" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Fatal</span>(<span class="pl-s">&quot;failed to login&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_token-go-LC42" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_token-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-c1">*</span><span class="pl-s1">res</span>.<span class="pl-c1">AuthenticationResult</span>.<span class="pl-c1">IdToken</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_token-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_token-go-LC44" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/f4552724774f546a688e0935f80154c7/raw/666ff46242c2f5d04c5b93a4aea3323cbeef38e0/cognito_token.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/f4552724774f546a688e0935f80154c7#file-cognito_token-go">cognito_token.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>引数でusernameとpasswordを指定します。sessionの生成方法は自分の環境に合わせて少し変えています。以下を参考にしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Configuring the AWS SDK for Go - AWS SDK for Go</div><div class="kg-bookmark-description">Configure the |sdk-go| to specify which credentials to use and to which AWS Region to send requests.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">AWS SDK for Go</span></img></div></div></a></figure><!--kg-card-begin: markdown--><p>ローカルではDockerを使用しているので、簡単に使うためにMakefileに以下を追加します。</p>
<pre><code>token:
    docker-compose exec app go run main.go ${ID} ${PASS}
</code></pre>
<p>以下のように実行すると、トークンが出力されます。</p>
<pre><code>$ make token ID=email@example.com PASS=password
</code></pre>
<p>以上です。</p>
<!--kg-card-end: markdown--></link>]]></content:encoded></item><item><title><![CDATA[Amazon Cognito のローカル開発用エミュレータを作ろうとした話]]></title><description><![CDATA[自分が関わっているサービスで、認証に Amazon Cognito を使っています。

Amazon Cognito（ウェブ/モバイルアプリのユーザー管理）| AWSAmazon Web Services, Inc.
[https://aws.amazon.com/jp/cognito/]Cognito
は公式でエミュレータ的なものは提供されていないようなので、ローカル環境では開発用の Cognito に繋いでいます。

実物の Cognito を使う場合、メールをモックサーバに飛ばせないので誤送信の可能性があったり、ユーザーの追加が面倒だったりと、個人的に不便を感じていました。

そのため、Cognito の動きを再現するエミュレータを作りました。

今回は自分が必要な最低限の機能だけ実装しています。足りない機能は適宜追加するつもりです。

とりあえず以下の機能を実装しました。

 * 公開鍵の取得
 * 認証
 * ユーザー作成

エンドポイント
Cognito のエンドポイントは恐らく以下の2つだけです。

1. GET https://cognito-idp.{region}.]]></description><link>https://tech.anti-pattern.co.jp/amazon-cognito-emulator/</link><guid isPermaLink="false">Ghost__Post__61040dc93986b000013a4604</guid><category><![CDATA[Amazon Cognito]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Tue, 29 Jun 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>自分が関わっているサービスで、認証に Amazon Cognito を使っています。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aws.amazon.com/jp/cognito/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon Cognito（ウェブ/モバイルアプリのユーザー管理）| AWS</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://a0.awsstatic.com/libra-css/images/site/touch-icon-ipad-144-smile.png"><span class="kg-bookmark-author">Amazon Web Services, Inc.</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_1200x630.png"/></div></a></figure><!--kg-card-begin: markdown--><p>Cognito は公式でエミュレータ的なものは提供されていないようなので、ローカル環境では開発用の Cognito に繋いでいます。</p>
<p>実物の Cognito を使う場合、メールをモックサーバに飛ばせないので誤送信の可能性があったり、ユーザーの追加が面倒だったりと、個人的に不便を感じていました。</p>
<p>そのため、Cognito の動きを再現するエミュレータを作りました。</p>
<p>今回は自分が必要な最低限の機能だけ実装しています。足りない機能は適宜追加するつもりです。</p>
<p>とりあえず以下の機能を実装しました。</p>
<ul>
<li>公開鍵の取得</li>
<li>認証</li>
<li>ユーザー作成</li>
</ul>
<h2 id="%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">エンドポイント</h2>
<p>Cognito のエンドポイントは恐らく以下の2つだけです。</p>
<pre><code>1. GET https://cognito-idp.{region}.amazonaws.com/{user-pool-id}/.well-known/jwks.json
2. POST https://cognito-idp.{region}.amazonaws.com/
</code></pre>
<ol>
<li>は公開鍵の取得、2. はそれ以外の操作（認証やユーザーの作成、削除）に使います。</li>
</ol>
<h2 id="%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E5%8F%96%E5%BE%97">公開鍵の取得</h2>
<ol>
<li>のエンドポイントを叩くと、以下のような json が返ってきます。</li>
</ol>
<pre><code>{  
  &quot;keys&quot;: [  
    {  
      &quot;alg&quot;: &quot;RS256&quot;,  
      &quot;e&quot;: &quot;XXXX&quot;,  
      &quot;kid&quot;: &quot;xxxxkid&quot;,  
      &quot;kty&quot;: &quot;RSA&quot;,  
      &quot;n&quot;: &quot;xxxx...&quot;,  
      &quot;use&quot;: &quot;sig&quot;  
    },
    ...
  ]  
}
</code></pre>
<p>RSA で暗号化しているようなので、まずは鍵を作成します。以下を参考にしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/wh1teB0x/items/e2133eeb94f57629b5e7"><div class="kg-bookmark-content"><div class="kg-bookmark-title">jwt-goを用いた、GolangでのJWTの発行、認証について - Qiita</div><div class="kg-bookmark-description">GolangでJWT（JSON Web Token）を取り扱いたいと思い、jwt-goの使い方を調べました。 JWTについての説明は他の有益な解説サイトがあるので、そちらを参考にして下さい。 早速実装の説明に入ります。 Rou...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">wh1teB0x</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1hbmQwTFdkdjQ0S1M1NVNvNDRHRTQ0R2Y0NENCUjI5c1lXNW40NEduNDRHdVNsZFU0NEd1NTVtNjZLR000NENCNktxTjZLaTg0NEdyNDRHazQ0R0U0NEdtJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTQmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWNlbnRlciUyQ21pZGRsZSZzPWUxNWE4MWY2MTM4Mjc0NTNhYzA3NmM0Y2FjMzUzYzQz&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RSGRvTVhSbFFqQjQmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT00NSZ0eHQtYWxpZ249cmlnaHQlMkNib3R0b20mcz0xM2E3Mzk1NTMyZGJmZDVjMmQ2YWRlNGNmYzdiNDczMg&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;691ce4b4ba3509891bad67290d63de81"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://stackoverflow.com/questions/55470311/encode-private-key-getting-error-asn1-structure-error-tags-dont-match"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Encode Private Key getting Error: asn1: structure error: tags don’t match</div><div class="kg-bookmark-description">When i try to parses the encode private key with sample private key -----BEGIN OPENSSH PRIVATE KEY-----b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v&#x3D;c78bd457575a"><span class="kg-bookmark-author">Stack Overflow</span><span class="kg-bookmark-publisher">Black_Dreams</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v&#x3D;73d79a89bded"/></div></a></figure><!--kg-card-begin: markdown--><p>ターミナルで以下を実行します。</p>
<pre><code>$ ssh-keygen -t rsa -f key.pem -m pem  
$ ssh-keygen -f key.pem.pub -e -m pkcs8 &gt; key.pem.pub.pkcs8
</code></pre>
<p><code>key.pem</code> が秘密鍵、<code>key.pem.pub.pkcs8</code> が公開鍵です。</p>
<p><code>key.pem.pub.pkcs8</code>を以下のように読み込んで整形します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/01ad8e5ae7e1a3f886f4be4f6b217ec1.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110338074" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_public_key-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_public_key-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_public_key-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_public_key-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/base64&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_public_key-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/binary&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_public_key-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_public_key-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;io/ioutil&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_public_key-go-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_public_key-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/dgrijalva/jwt-go&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_public_key-go-LC8" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_public_key-go-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_public_key-go-LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-s1">jwkKeyID</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;hoge&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_public_key-go-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_public_key-go-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">jwkKey</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_public_key-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Alg</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;alg&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_public_key-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">E</span>   <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;e&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_public_key-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Kid</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;kid&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_public_key-go-LC16" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Kty</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;kty&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_public_key-go-LC17" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">N</span>   <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;n&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_public_key-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Use</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;use&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_public_key-go-LC19" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_public_key-go-LC20" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_public_key-go-LC21" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">getPublicKey</span>() (<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_public_key-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">verifyBytes</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s">&quot;./key.pem.pub.pkcs8&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_public_key-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_public_key-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_public_key-go-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_public_key-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">verifyKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">jwt</span>.<span class="pl-en">ParseRSAPublicKeyFromPEM</span>(<span class="pl-s1">verifyBytes</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_public_key-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_public_key-go-LC28" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_public_key-go-LC29" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_public_key-go-LC30" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_public_key-go-LC31" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">encodedN</span> <span class="pl-c1">:=</span> <span class="pl-s1">base64</span>.<span class="pl-c1">RawURLEncoding</span>.<span class="pl-en">EncodeToString</span>(<span class="pl-s1">verifyKey</span>.<span class="pl-c1">N</span>.<span class="pl-en">Bytes</span>())</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_public_key-go-LC32" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_public_key-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">bytesE</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-c1">4</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_public_key-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">binary</span>.<span class="pl-c1">BigEndian</span>.<span class="pl-en">PutUint32</span>(<span class="pl-s1">bytesE</span>, <span class="pl-en">uint32</span>(<span class="pl-s1">verifyKey</span>.<span class="pl-c1">E</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_public_key-go-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_public_key-go-LC36" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">encodedE</span> <span class="pl-c1">:=</span> <span class="pl-s1">base64</span>.<span class="pl-c1">RawURLEncoding</span>.<span class="pl-en">EncodeToString</span>(<span class="pl-s1">bytesE</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_public_key-go-LC37" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_public_key-go-LC38" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pubKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(<span class="pl-smi">jwkKey</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_public_key-go-LC39" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Alg</span>: <span class="pl-s1">jwt</span>.<span class="pl-c1">SigningMethodRS256</span>.<span class="pl-en">Alg</span>(),</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_public_key-go-LC40" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">E</span>:   <span class="pl-s1">encodedE</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_public_key-go-LC41" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Kid</span>: <span class="pl-s1">jwkKeyID</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_public_key-go-LC42" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Kty</span>: <span class="pl-s">&quot;RSA&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_public_key-go-LC43" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">N</span>:   <span class="pl-s1">encodedN</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_public_key-go-LC44" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Use</span>: <span class="pl-s">&quot;sig&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_public_key-go-LC45" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_public_key-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_public_key-go-LC47" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_public_key-go-LC48" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_public_key-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-en">string</span>(<span class="pl-s1">pubKey</span>), <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_public_key-go-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/01ad8e5ae7e1a3f886f4be4f6b217ec1/raw/ee469b087678297a60343a573ba7239b934bf737/cognito_public_key.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/01ad8e5ae7e1a3f886f4be4f6b217ec1#file-cognito_public_key-go">cognito_public_key.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>kid</code> は鍵を識別するための ID ですが、後述する token の header にセットした値と一致していれば何でも良いです。</p>
<p>整形した鍵を json で返すエンドポイントを作成します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/5efe826eef370b141e479336da674600.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110338133" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_public_key_endpoint-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_public_key_endpoint-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_public_key_endpoint-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_public_key_endpoint-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_public_key_endpoint-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;net/http&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_public_key_endpoint-go-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_public_key_endpoint-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/chi/v5&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_public_key_endpoint-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/chi/v5/middleware&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_public_key_endpoint-go-LC8" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_public_key_endpoint-go-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_public_key_endpoint-go-LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_public_key_endpoint-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pubKeyString</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">getPublicKey</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_public_key_endpoint-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_public_key_endpoint-go-LC13" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_public_key_endpoint-go-LC14" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_public_key_endpoint-go-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_public_key_endpoint-go-LC16" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span> <span class="pl-c1">:=</span> <span class="pl-s1">chi</span>.<span class="pl-en">NewRouter</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_public_key_endpoint-go-LC17" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Use</span>(<span class="pl-s1">middleware</span>.<span class="pl-c1">Logger</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_public_key_endpoint-go-LC18" class="blob-code blob-code-inner js-file-line">  </td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_public_key_endpoint-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Get</span>(<span class="pl-s">&quot;/{userPoolID}/.well-known/jwks.json&quot;</span>, <span class="pl-k">func</span>(<span class="pl-s1">w</span> http.<span class="pl-smi">ResponseWriter</span>, <span class="pl-s1">r</span> <span class="pl-c1">*</span>http.<span class="pl-smi">Request</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_public_key_endpoint-go-LC20" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">Write</span>([]<span class="pl-smi">byte</span>(<span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">`{&quot;keys&quot;:[%s]}`</span>, <span class="pl-s1">pubKeyString</span>)))</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_public_key_endpoint-go-LC21" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_public_key_endpoint-go-LC22" class="blob-code blob-code-inner js-file-line">  </td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_public_key_endpoint-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">http</span>.<span class="pl-en">ListenAndServe</span>(<span class="pl-s">&quot;:80&quot;</span>, <span class="pl-s1">mux</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_public_key_endpoint-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_public_key_endpoint-go-LC24" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/5efe826eef370b141e479336da674600/raw/9f48f8bb74e659257c1e17b93f33609753d0a5d3/cognito_public_key_endpoint.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/5efe826eef370b141e479336da674600#file-cognito_public_key_endpoint-go">cognito_public_key_endpoint.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>恐らく実際は<code>userPoolID</code> ごとに異なる鍵を返していると思いますが、面倒なので全ての ID で同じ 鍵を返しています。</p>
<p>これで公開鍵の取得エンドポイントは完成です。</p>
<h2 id="%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%83%85%E5%A0%B1">ユーザー情報</h2>
<p>実際にどんな感じで保存しているかは分かりませんが、ここでは json 形式でファイルに保存するようにしました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3cbf0c3f69770d1dbe45648d011c5e9a.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110338456" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_user_pool-json" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-json  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_user_pool-json-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_user_pool-json-LC1" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_user_pool-json-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s"><span class="pl-pds">&quot;</span>user-pool-id-hoge<span class="pl-pds">&quot;</span></span>: {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_user_pool-json-LC3" class="blob-code blob-code-inner js-file-line">		<span class="pl-s"><span class="pl-pds">&quot;</span>username-hoge<span class="pl-pds">&quot;</span></span>: {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_user_pool-json-LC4" class="blob-code blob-code-inner js-file-line">			<span class="pl-s"><span class="pl-pds">&quot;</span>uuid<span class="pl-pds">&quot;</span></span>: <span class="pl-s"><span class="pl-pds">&quot;</span>208b377c-e86e-3f1d-a23c-cdab84d86901<span class="pl-pds">&quot;</span></span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_user_pool-json-LC5" class="blob-code blob-code-inner js-file-line">			<span class="pl-s"><span class="pl-pds">&quot;</span>password<span class="pl-pds">&quot;</span></span>: <span class="pl-s"><span class="pl-pds">&quot;</span>password<span class="pl-pds">&quot;</span></span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_user_pool-json-LC6" class="blob-code blob-code-inner js-file-line">			<span class="pl-s"><span class="pl-pds">&quot;</span>username<span class="pl-pds">&quot;</span></span>: <span class="pl-s"><span class="pl-pds">&quot;</span>username-hoge<span class="pl-pds">&quot;</span></span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_user_pool-json-LC7" class="blob-code blob-code-inner js-file-line">			<span class="pl-s"><span class="pl-pds">&quot;</span>email<span class="pl-pds">&quot;</span></span>: <span class="pl-s"><span class="pl-pds">&quot;</span>email@example.com<span class="pl-pds">&quot;</span></span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_user_pool-json-LC8" class="blob-code blob-code-inner js-file-line">			<span class="pl-s"><span class="pl-pds">&quot;</span>email_verified<span class="pl-pds">&quot;</span></span>: <span class="pl-c1">true</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_user_pool-json-LC9" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_user_pool-json-LC10" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-json-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_user_pool-json-LC11" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3cbf0c3f69770d1dbe45648d011c5e9a/raw/acad96791dac283e662f4cdad3d9da6e99312760/cognito_user_pool.json" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3cbf0c3f69770d1dbe45648d011c5e9a#file-cognito_user_pool-json">cognito_user_pool.json</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/76c063408fc8a79ebe643df9ad39214a.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110338316" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_user_pool-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_user_pool-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_user_pool-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_user_pool-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_user_pool-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_user_pool-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;sync&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_user_pool-go-LC5" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_user_pool-go-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_user_pool-go-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-s1">poolFileName</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;pool.json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_user_pool-go-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_user_pool-go-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_user_pool-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s1">poolFileName</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_user_pool-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_user_pool-go-LC12" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_user_pool-go-LC13" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_user_pool-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">poolMap</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">map</span>[<span class="pl-smi">UserPoolID</span>]<span class="pl-smi">UserMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_user_pool-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">data</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">poolMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_user_pool-go-LC16" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_user_pool-go-LC17" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_user_pool-go-LC18" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_user_pool-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">userPool</span> <span class="pl-c1">=</span> <span class="pl-smi">UserPool</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_user_pool-go-LC20" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">poolMap</span>: <span class="pl-s1">poolMap</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_user_pool-go-LC21" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">mutex</span>:   <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">Mutex</span>{},</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_user_pool-go-LC22" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_user_pool-go-LC23" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_user_pool-go-LC24" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">...</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_user_pool-go-LC25" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_user_pool-go-LC26" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_user_pool-go-LC27" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">User</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_user_pool-go-LC28" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">UUID</span>          <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;uuid&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_user_pool-go-LC29" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Password</span>      <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;password&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_user_pool-go-LC30" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Username</span>      <span class="pl-smi">Username</span> <span class="pl-s">`json:&quot;username&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_user_pool-go-LC31" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Email</span>         <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;email&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_user_pool-go-LC32" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">EmailVerified</span> <span class="pl-smi">bool</span>     <span class="pl-s">`json:&quot;email_verified&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_user_pool-go-LC33" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_user_pool-go-LC34" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_user_pool-go-LC35" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">Username</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_user_pool-go-LC36" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_user_pool-go-LC37" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserMap</span> <span class="pl-k">map</span>[<span class="pl-smi">Username</span>]<span class="pl-c1">*</span><span class="pl-smi">User</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_user_pool-go-LC38" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_user_pool-go-LC39" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserPoolID</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_user_pool-go-LC40" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_user_pool-go-LC41" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserPool</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_user_pool-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">poolMap</span> <span class="pl-k">map</span>[<span class="pl-smi">UserPoolID</span>]<span class="pl-smi">UserMap</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_user_pool-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">mutex</span>   <span class="pl-c1">*</span>sync.<span class="pl-smi">Mutex</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_user_pool-go-LC44" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_user_pool-go-LC45" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_user_pool-go-LC46" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">GetUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) (<span class="pl-c1">*</span><span class="pl-smi">User</span>, <span class="pl-smi">bool</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_user_pool-go-LC47" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_user_pool-go-LC48" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_user_pool-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_user_pool-go-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-cognito_user_pool-go-LC51" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-cognito_user_pool-go-LC52" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) (<span class="pl-c1">*</span><span class="pl-smi">User</span>, <span class="pl-smi">bool</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-cognito_user_pool-go-LC53" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-cognito_user_pool-go-LC54" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-cognito_user_pool-go-LC55" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">false</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-cognito_user_pool-go-LC56" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-cognito_user_pool-go-LC57" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">uMap</span>[<span class="pl-s1">username</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-cognito_user_pool-go-LC58" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-cognito_user_pool-go-LC59" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">false</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-cognito_user_pool-go-LC60" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-cognito_user_pool-go-LC61" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">u</span>, <span class="pl-c1">true</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-cognito_user_pool-go-LC62" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-cognito_user_pool-go-LC63" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-cognito_user_pool-go-LC64" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">CreateUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">user</span> <span class="pl-smi">User</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-cognito_user_pool-go-LC65" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-cognito_user_pool-go-LC66" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-cognito_user_pool-go-LC67" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-cognito_user_pool-go-LC68" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-cognito_user_pool-go-LC69" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-cognito_user_pool-go-LC70" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">uMap</span> <span class="pl-c1">=</span> <span class="pl-en">make</span>(<span class="pl-smi">UserMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-cognito_user_pool-go-LC71" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>] <span class="pl-c1">=</span> <span class="pl-s1">uMap</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-cognito_user_pool-go-LC72" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-cognito_user_pool-go-LC73" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">uMap</span>[<span class="pl-s1">user</span>.<span class="pl-c1">Username</span>]; <span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-cognito_user_pool-go-LC74" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;already exist&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-cognito_user_pool-go-LC75" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-cognito_user_pool-go-LC76" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>[<span class="pl-s1">user</span>.<span class="pl-c1">Username</span>] <span class="pl-c1">=</span> <span class="pl-c1">&amp;</span><span class="pl-s1">user</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-cognito_user_pool-go-LC77" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">updateFile</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-cognito_user_pool-go-LC78" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-cognito_user_pool-go-LC79" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-cognito_user_pool-go-LC80" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">updateFile</span>() <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-cognito_user_pool-go-LC81" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">file</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">os</span>.<span class="pl-en">Create</span>(<span class="pl-s1">poolFileName</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-cognito_user_pool-go-LC82" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-cognito_user_pool-go-LC83" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-cognito_user_pool-go-LC84" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-cognito_user_pool-go-LC85" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">file</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-cognito_user_pool-go-LC86" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">content</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-cognito_user_pool-go-LC87" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-cognito_user_pool-go-LC88" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-cognito_user_pool-go-LC89" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-cognito_user_pool-go-LC90" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">file</span>.<span class="pl-en">Write</span>(<span class="pl-s1">content</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-cognito_user_pool-go-LC91" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-cognito_user_pool-go-LC92" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-cognito_user_pool-go-LC93" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-cognito_user_pool-go-LC94" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">DeleteUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-cognito_user_pool-go-LC95" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-cognito_user_pool-go-LC96" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-cognito_user_pool-go-LC97" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-cognito_user_pool-go-LC98" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">exist</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>); <span class="pl-s1">exist</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-cognito_user_pool-go-LC99" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">delete</span>(<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>], <span class="pl-s1">username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-cognito_user_pool-go-LC100" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-cognito_user_pool-go-LC101" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">updateFile</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_user_pool-go-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-cognito_user_pool-go-LC102" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/76c063408fc8a79ebe643df9ad39214a/raw/01f5eafe6c352b1460605bc297607ab0a3f3e551/cognito_user_pool.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/76c063408fc8a79ebe643df9ad39214a#file-cognito_user_pool-go">cognito_user_pool.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>main 実行時に<code>pool.json</code> を読み込み、map で保持します。map にユーザーを追加、削除する度にファイルを更新しています。パフォーマンスは悪そうですが、そこまで気にしてないので良しとしています。</p>
<p>ユーザー情報を拡張する場合は構造体のフィールドを追加するなどして対応できると思います。</p>
<h2 id="%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">ルーティング</h2>
<p>公開鍵の取得以外は全て同じエンドポイントですが、リクエストの識別にはヘッダを使用しています。</p>
<p><code>X-Amz-Target</code> というキーに<code>AWSCognitoIdentityProviderService.AdminInitiateAuth</code> のような形式でセットされているので、これを使います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/99d46c09c0d47f8bf9cf703e46ea1348.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110338930" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_route-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_route-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_route-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_route-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_route-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;io/ioutil&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_route-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_route-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;net/http&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_route-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;strings&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_route-go-LC7" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_route-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/chi/v5&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_route-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/render&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_route-go-LC10" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_route-go-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_route-go-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_route-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">...</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_route-go-LC14" class="blob-code blob-code-inner js-file-line">  </td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_route-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Post</span>(<span class="pl-s">&quot;/&quot;</span>, <span class="pl-k">func</span>(<span class="pl-s1">w</span> http.<span class="pl-smi">ResponseWriter</span>, <span class="pl-s1">r</span> <span class="pl-c1">*</span>http.<span class="pl-smi">Request</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_route-go-LC16" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">b</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadAll</span>(<span class="pl-s1">r</span>.<span class="pl-c1">Body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_route-go-LC17" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_route-go-LC18" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">render</span>.<span class="pl-en">JSON</span>(<span class="pl-s1">w</span>, <span class="pl-s1">r</span>, <span class="pl-s1">http</span>.<span class="pl-c1">StatusInternalServerError</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_route-go-LC19" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_route-go-LC20" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_route-go-LC21" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">defer</span> <span class="pl-s1">r</span>.<span class="pl-c1">Body</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_route-go-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_route-go-LC23" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">out</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">route</span>(<span class="pl-s1">r</span>.<span class="pl-c1">Header</span>.<span class="pl-en">Get</span>(<span class="pl-s">&quot;X-Amz-Target&quot;</span>), <span class="pl-s1">b</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_route-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_route-go-LC25" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_route-go-LC26" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">render</span>.<span class="pl-en">JSON</span>(<span class="pl-s1">w</span>, <span class="pl-s1">r</span>, <span class="pl-s1">http</span>.<span class="pl-c1">StatusInternalServerError</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_route-go-LC27" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_route-go-LC28" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_route-go-LC29" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">WriteHeader</span>(<span class="pl-s1">http</span>.<span class="pl-c1">StatusOK</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_route-go-LC30" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">Write</span>(<span class="pl-s1">out</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_route-go-LC31" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_route-go-LC32" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_route-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">http</span>.<span class="pl-en">ListenAndServe</span>(<span class="pl-s">&quot;:80&quot;</span>, <span class="pl-s1">mux</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_route-go-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_route-go-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_route-go-LC36" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">route</span>(<span class="pl-s1">xAmzTarget</span> <span class="pl-smi">string</span>, <span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_route-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">targets</span> <span class="pl-c1">:=</span> <span class="pl-s1">strings</span>.<span class="pl-en">Split</span>(<span class="pl-s1">xAmzTarget</span>, <span class="pl-s">&quot;.&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_route-go-LC38" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">targets</span>) <span class="pl-c1">&lt;</span> <span class="pl-c1">2</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_route-go-LC39" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid header&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_route-go-LC40" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_route-go-LC41" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_route-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">switch</span> <span class="pl-s1">targets</span>[<span class="pl-c1">1</span>] {</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_route-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">case</span> <span class="pl-s">&quot;AdminInitiateAuth&quot;</span>:</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_route-go-LC44" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-en">adminInitiateAuth</span>(<span class="pl-s1">body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_route-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">case</span> <span class="pl-s">&quot;AdminCreateUser&quot;</span>:</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_route-go-LC46" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-en">adminCreateUser</span>(<span class="pl-s1">body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_route-go-LC47" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">...</span></td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_route-go-LC48" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_route-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid operation name&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_route-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_route-go-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/99d46c09c0d47f8bf9cf703e46ea1348/raw/e435dfb4d7bc2b65725ec6ffb91d0b368ea25574/cognito_route.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/99d46c09c0d47f8bf9cf703e46ea1348#file-cognito_route-go">cognito_route.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="%E8%AA%8D%E8%A8%BC">認証</h2>
<p>公開鍵と同じように秘密鍵を読み込みます。<code>clientID</code> は環境変数から読み取ります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/794add8f02eac1fa4a1d4168df264793.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110339314" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_admin_initiate_auth-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_admin_initiate_auth-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_admin_initiate_auth-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;crypto/rsa&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_admin_initiate_auth-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_admin_initiate_auth-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_admin_initiate_auth-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;io/ioutil&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_admin_initiate_auth-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_admin_initiate_auth-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;time&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_admin_initiate_auth-go-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_admin_initiate_auth-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/service/cognitoidentityprovider&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_admin_initiate_auth-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/dgrijalva/jwt-go&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_admin_initiate_auth-go-LC11" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_admin_initiate_auth-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_admin_initiate_auth-go-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">signKey</span> <span class="pl-c1">*</span>rsa.<span class="pl-smi">PrivateKey</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_admin_initiate_auth-go-LC14" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">clientID</span> <span class="pl-smi">ClientID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_admin_initiate_auth-go-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_admin_initiate_auth-go-LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">ClientID</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_admin_initiate_auth-go-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_admin_initiate_auth-go-LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_admin_initiate_auth-go-LC19" class="blob-code blob-code-inner js-file-line">  	<span class="pl-c1">...</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_admin_initiate_auth-go-LC20" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_admin_initiate_auth-go-LC21" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_admin_initiate_auth-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">signKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-en">getPrivateKey</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_admin_initiate_auth-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_admin_initiate_auth-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_admin_initiate_auth-go-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_admin_initiate_auth-go-LC26" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_admin_initiate_auth-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">clientID</span> <span class="pl-c1">=</span> <span class="pl-en">ClientID</span>(<span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;CLIENT_ID&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_admin_initiate_auth-go-LC28" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_admin_initiate_auth-go-LC29" class="blob-code blob-code-inner js-file-line">  	<span class="pl-c1">...</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_admin_initiate_auth-go-LC30" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_admin_initiate_auth-go-LC31" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_admin_initiate_auth-go-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">getPrivateKey</span>() (<span class="pl-c1">*</span>rsa.<span class="pl-smi">PrivateKey</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_admin_initiate_auth-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">signBytes</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s">&quot;./key.pem&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_admin_initiate_auth-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_admin_initiate_auth-go-LC35" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_admin_initiate_auth-go-LC36" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_admin_initiate_auth-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">jwt</span>.<span class="pl-en">ParseRSAPrivateKeyFromPEM</span>(<span class="pl-s1">signBytes</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_admin_initiate_auth-go-LC38" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_admin_initiate_auth-go-LC39" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_admin_initiate_auth-go-LC40" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">u</span> <span class="pl-smi">User</span>) <span class="pl-en">ToToken</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>) <span class="pl-c1">*</span>jwt.<span class="pl-smi">Token</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_admin_initiate_auth-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">token</span> <span class="pl-c1">:=</span> <span class="pl-s1">jwt</span>.<span class="pl-en">New</span>(<span class="pl-s1">jwt</span>.<span class="pl-c1">SigningMethodRS256</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_admin_initiate_auth-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">token</span>.<span class="pl-c1">Header</span>[<span class="pl-s">&quot;kid&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">jwkKeyID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_admin_initiate_auth-go-LC43" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_admin_initiate_auth-go-LC44" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span> <span class="pl-c1">:=</span> <span class="pl-s1">token</span>.<span class="pl-c1">Claims</span>.(jwt.<span class="pl-smi">MapClaims</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_admin_initiate_auth-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;iat&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Unix</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_admin_initiate_auth-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;exp&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Add</span>(<span class="pl-s1">time</span>.<span class="pl-c1">Hour</span> <span class="pl-c1">*</span> <span class="pl-c1">24</span> <span class="pl-c1">*</span> <span class="pl-c1">365</span> <span class="pl-c1">*</span> <span class="pl-c1">10</span>).<span class="pl-en">Unix</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_admin_initiate_auth-go-LC47" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;sub&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">u</span>.<span class="pl-c1">UUID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_admin_initiate_auth-go-LC48" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;email&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">u</span>.<span class="pl-c1">Email</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_admin_initiate_auth-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">token</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_admin_initiate_auth-go-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-cognito_admin_initiate_auth-go-LC51" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-cognito_admin_initiate_auth-go-LC52" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">adminInitiateAuth</span>(<span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-cognito_admin_initiate_auth-go-LC53" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">in</span> <span class="pl-c1">:=</span> cognitoidentityprovider.<span class="pl-smi">AdminInitiateAuthInput</span>{}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-cognito_admin_initiate_auth-go-LC54" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">body</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">in</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-cognito_admin_initiate_auth-go-LC55" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-cognito_admin_initiate_auth-go-LC56" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-cognito_admin_initiate_auth-go-LC57" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-cognito_admin_initiate_auth-go-LC58" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// TODO: まだ ADMIN_NO_SRP_AUTH だけ</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-cognito_admin_initiate_auth-go-LC59" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthFlow</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">AuthFlow</span> <span class="pl-c1">!=</span> <span class="pl-s1">cognitoidentityprovider</span>.<span class="pl-c1">AuthFlowTypeAdminNoSrpAuth</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-cognito_admin_initiate_auth-go-LC60" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid auth flow&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-cognito_admin_initiate_auth-go-LC61" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-cognito_admin_initiate_auth-go-LC62" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-cognito_admin_initiate_auth-go-LC63" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">cID</span> <span class="pl-smi">ClientID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-cognito_admin_initiate_auth-go-LC64" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">ClientId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-cognito_admin_initiate_auth-go-LC65" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">cID</span> <span class="pl-c1">=</span> <span class="pl-en">ClientID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">ClientId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-cognito_admin_initiate_auth-go-LC66" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-cognito_admin_initiate_auth-go-LC67" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">cID</span> <span class="pl-c1">!=</span> <span class="pl-s1">clientID</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-cognito_admin_initiate_auth-go-LC68" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid client id&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-cognito_admin_initiate_auth-go-LC69" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-cognito_admin_initiate_auth-go-LC70" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-cognito_admin_initiate_auth-go-LC71" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-cognito_admin_initiate_auth-go-LC72" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-cognito_admin_initiate_auth-go-LC73" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span> <span class="pl-c1">=</span> <span class="pl-en">UserPoolID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-cognito_admin_initiate_auth-go-LC74" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-cognito_admin_initiate_auth-go-LC75" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">username</span> <span class="pl-smi">Username</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-cognito_admin_initiate_auth-go-LC76" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthParameters</span>[<span class="pl-s">&quot;USERNAME&quot;</span>]; <span class="pl-s1">ok</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-s1">u</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-cognito_admin_initiate_auth-go-LC77" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span> <span class="pl-c1">=</span> <span class="pl-en">Username</span>(<span class="pl-c1">*</span><span class="pl-s1">u</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-cognito_admin_initiate_auth-go-LC78" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-cognito_admin_initiate_auth-go-LC79" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">GetUser</span>(</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-cognito_admin_initiate_auth-go-LC80" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-cognito_admin_initiate_auth-go-LC81" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-cognito_admin_initiate_auth-go-LC82" class="blob-code blob-code-inner js-file-line">	)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-cognito_admin_initiate_auth-go-LC83" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-cognito_admin_initiate_auth-go-LC84" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;user not found&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-cognito_admin_initiate_auth-go-LC85" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-cognito_admin_initiate_auth-go-LC86" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">u</span>.<span class="pl-c1">EmailVerified</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-cognito_admin_initiate_auth-go-LC87" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;email not verified&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-cognito_admin_initiate_auth-go-LC88" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-cognito_admin_initiate_auth-go-LC89" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-cognito_admin_initiate_auth-go-LC90" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">password</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-cognito_admin_initiate_auth-go-LC91" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">p</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthParameters</span>[<span class="pl-s">&quot;PASSWORD&quot;</span>]; <span class="pl-s1">ok</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-s1">p</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-cognito_admin_initiate_auth-go-LC92" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">password</span> <span class="pl-c1">=</span> <span class="pl-c1">*</span><span class="pl-s1">p</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-cognito_admin_initiate_auth-go-LC93" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-cognito_admin_initiate_auth-go-LC94" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">u</span>.<span class="pl-c1">Password</span> <span class="pl-c1">!=</span> <span class="pl-s1">password</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-cognito_admin_initiate_auth-go-LC95" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;password not match&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-cognito_admin_initiate_auth-go-LC96" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-cognito_admin_initiate_auth-go-LC97" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-cognito_admin_initiate_auth-go-LC98" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">tokenString</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">u</span>.<span class="pl-en">ToToken</span>(<span class="pl-s1">userPoolID</span>).<span class="pl-en">SignedString</span>(<span class="pl-s1">signKey</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-cognito_admin_initiate_auth-go-LC99" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-cognito_admin_initiate_auth-go-LC100" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-cognito_admin_initiate_auth-go-LC101" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-cognito_admin_initiate_auth-go-LC102" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminInitiateAuthOutput</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-cognito_admin_initiate_auth-go-LC103" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">AuthenticationResult</span>: <span class="pl-c1">&amp;</span>cognitoidentityprovider.<span class="pl-smi">AuthenticationResultType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-cognito_admin_initiate_auth-go-LC104" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">AccessToken</span>: <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s1">tokenString</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-cognito_admin_initiate_auth-go-LC105" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-cognito_admin_initiate_auth-go-LC106" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_initiate_auth-go-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-cognito_admin_initiate_auth-go-LC107" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/794add8f02eac1fa4a1d4168df264793/raw/f36b4cdb06eb1e3902f038d96c6df45e8955b7b4/cognito_admin_initiate_auth.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/794add8f02eac1fa4a1d4168df264793#file-cognito_admin_initiate_auth-go">cognito_admin_initiate_auth.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>requestBody は<code>github.com/aws/aws-sdk-go/service/cognitoidentityprovider</code> の構造体を使ってそのままパースできます。</p>
<p>claims には最低限の情報をセットしていますが、実際に使うには足りないと思うので、以下を参考に必要に応じて情報を追加します。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Using the ID Token - Amazon Cognito</div><div class="kg-bookmark-description">Using the ID Token</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">Amazon Cognito</span></img></div></div></a></figure><!--kg-card-begin: markdown--><p>読み込んだ秘密鍵で署名し、トークン文字列に変換します。ここでは<code>AccessToken</code> にセットしていますが、使い方によっては<code>IdToken</code> 等にセットするかもしれません。</p>
<h2 id="%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BD%9C%E6%88%90">ユーザー作成</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/cec3b852b6abface3fcd772cd2c13985.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110339722" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_admin_create_user-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_admin_create_user-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_admin_create_user-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_admin_create_user-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_admin_create_user-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_admin_create_user-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;math/rand&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_admin_create_user-go-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_admin_create_user-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/service/cognitoidentityprovider&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_admin_create_user-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/gofrs/uuid&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_admin_create_user-go-LC8" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_admin_create_user-go-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_admin_create_user-go-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_admin_create_user-go-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">adminCreateUser</span>(<span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_admin_create_user-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">in</span> <span class="pl-c1">:=</span> cognitoidentityprovider.<span class="pl-smi">AdminCreateUserInput</span>{}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_admin_create_user-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">body</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">in</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_admin_create_user-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_admin_create_user-go-LC15" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_admin_create_user-go-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_admin_create_user-go-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_admin_create_user-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_admin_create_user-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_admin_create_user-go-LC20" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span> <span class="pl-c1">=</span> <span class="pl-en">UserPoolID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_admin_create_user-go-LC21" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_admin_create_user-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">username</span> <span class="pl-smi">Username</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_admin_create_user-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">Username</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_admin_create_user-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span> <span class="pl-c1">=</span> <span class="pl-en">Username</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">Username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_admin_create_user-go-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_admin_create_user-go-LC26" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_admin_create_user-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">MessageAction</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">MessageAction</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;RESEND&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_admin_create_user-go-LC28" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">exist</span> <span class="pl-c1">:=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">GetUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>); <span class="pl-c1">!</span><span class="pl-s1">exist</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_admin_create_user-go-LC29" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;user not found&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_admin_create_user-go-LC30" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_admin_create_user-go-LC31" class="blob-code blob-code-inner js-file-line">		<span class="pl-c">// TODO: パスワード変更して通知メール再送信</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_admin_create_user-go-LC32" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminCreateUserOutput</span>{})</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_admin_create_user-go-LC33" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_admin_create_user-go-LC34" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_admin_create_user-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">email</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_admin_create_user-go-LC36" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">attr</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserAttributes</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_admin_create_user-go-LC37" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">attr</span>.<span class="pl-c1">Name</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-s1">attr</span>.<span class="pl-c1">Value</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_admin_create_user-go-LC38" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">continue</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_admin_create_user-go-LC39" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_admin_create_user-go-LC40" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-c1">*</span><span class="pl-s1">attr</span>.<span class="pl-c1">Name</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;email&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_admin_create_user-go-LC41" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">email</span> <span class="pl-c1">=</span> <span class="pl-c1">*</span><span class="pl-s1">attr</span>.<span class="pl-c1">Value</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_admin_create_user-go-LC42" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_admin_create_user-go-LC43" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_admin_create_user-go-LC44" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// TODO: email_verified が true ならパスワードメール送信, false なら検証メール送信</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_admin_create_user-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// 常にtrueとして扱っている</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_admin_create_user-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">email</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_admin_create_user-go-LC47" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid email&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_admin_create_user-go-LC48" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_admin_create_user-go-LC49" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_admin_create_user-go-LC50" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">id</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">uuid</span>.<span class="pl-en">NewV4</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-cognito_admin_create_user-go-LC51" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-cognito_admin_create_user-go-LC52" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-cognito_admin_create_user-go-LC53" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-cognito_admin_create_user-go-LC54" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pass</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">makeRandomStr</span>(<span class="pl-c1">8</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-cognito_admin_create_user-go-LC55" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-cognito_admin_create_user-go-LC56" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-cognito_admin_create_user-go-LC57" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-cognito_admin_create_user-go-LC58" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">idString</span> <span class="pl-c1">:=</span> <span class="pl-s1">id</span>.<span class="pl-en">String</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-cognito_admin_create_user-go-LC59" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">user</span> <span class="pl-c1">:=</span> <span class="pl-smi">User</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-cognito_admin_create_user-go-LC60" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">UUID</span>:          <span class="pl-s1">idString</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-cognito_admin_create_user-go-LC61" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Password</span>:      <span class="pl-s1">pass</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-cognito_admin_create_user-go-LC62" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Username</span>:      <span class="pl-s1">username</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-cognito_admin_create_user-go-LC63" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Email</span>:         <span class="pl-s1">email</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-cognito_admin_create_user-go-LC64" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">EmailVerified</span>: <span class="pl-c1">true</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-cognito_admin_create_user-go-LC65" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-cognito_admin_create_user-go-LC66" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">CreateUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">user</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-cognito_admin_create_user-go-LC67" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-cognito_admin_create_user-go-LC68" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-cognito_admin_create_user-go-LC69" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-cognito_admin_create_user-go-LC70" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-cognito_admin_create_user-go-LC71" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminCreateUserOutput</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-cognito_admin_create_user-go-LC72" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">User</span>: <span class="pl-c1">&amp;</span>cognitoidentityprovider.<span class="pl-smi">UserType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-cognito_admin_create_user-go-LC73" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">Attributes</span>: []<span class="pl-c1">*</span>cognitoidentityprovider.<span class="pl-smi">AttributeType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-cognito_admin_create_user-go-LC74" class="blob-code blob-code-inner js-file-line">				{</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-cognito_admin_create_user-go-LC75" class="blob-code blob-code-inner js-file-line">					<span class="pl-c1">Name</span>:  <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s">&quot;sub&quot;</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-cognito_admin_create_user-go-LC76" class="blob-code blob-code-inner js-file-line">					<span class="pl-c1">Value</span>: <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s1">idString</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-cognito_admin_create_user-go-LC77" class="blob-code blob-code-inner js-file-line">				},</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-cognito_admin_create_user-go-LC78" class="blob-code blob-code-inner js-file-line">			},</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-cognito_admin_create_user-go-LC79" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-cognito_admin_create_user-go-LC80" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-cognito_admin_create_user-go-LC81" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-cognito_admin_create_user-go-LC82" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-cognito_admin_create_user-go-LC83" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">makeRandomStr</span>(<span class="pl-s1">digit</span> <span class="pl-smi">uint32</span>) (<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-cognito_admin_create_user-go-LC84" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">const</span> <span class="pl-s1">letters</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@&amp;%/:;,.&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-cognito_admin_create_user-go-LC85" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-cognito_admin_create_user-go-LC86" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">b</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-s1">digit</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-cognito_admin_create_user-go-LC87" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">rand</span>.<span class="pl-en">Read</span>(<span class="pl-s1">b</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-cognito_admin_create_user-go-LC88" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-cognito_admin_create_user-go-LC89" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-cognito_admin_create_user-go-LC90" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-cognito_admin_create_user-go-LC91" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">result</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-cognito_admin_create_user-go-LC92" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">v</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">b</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-cognito_admin_create_user-go-LC93" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">result</span> <span class="pl-c1">+=</span> <span class="pl-en">string</span>(<span class="pl-s1">letters</span>[<span class="pl-en">int</span>(<span class="pl-s1">v</span>)<span class="pl-c1">%</span><span class="pl-en">len</span>(<span class="pl-s1">letters</span>)])</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-cognito_admin_create_user-go-LC94" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-cognito_admin_create_user-go-LC95" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">result</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-cognito_admin_create_user-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-cognito_admin_create_user-go-LC96" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/cec3b852b6abface3fcd772cd2c13985/raw/0711f52c9476a4beccdf8f51510249cc1c6804e6/cognito_admin_create_user.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/cec3b852b6abface3fcd772cd2c13985#file-cognito_admin_create_user-go">cognito_admin_create_user.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>全て検証済みのユーザーとして作成しています。メール送信部分は省いていますが、そのうち追加予定です。</p>
<p>ランダム文字列生成は以下を参考にしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/nakaryooo/items/7d269525a288c4b3ecda"><div class="kg-bookmark-content"><div class="kg-bookmark-title">golang でランダム文字列生成 - Qiita</div><div class="kg-bookmark-description">Go では乱数を返すライブラリはあれど、ランダム文字列を返すライブラリがない（少なくとも今の所は）。というわけで、パスワードなどでランダムな文字列を生成したい場合は自分で書く必要がある。 ちなみに乱数を生成するには math/ra...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">nakaryooo</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1aMjlzWVc1bklPT0JwLU9EcWVPRHMtT0RnT09Eb09hV2gtV3RsLVdJbC1lVW4tYUlrQSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz05ZmU5ODRjMWVlMWRmZjVmYmU0NTc4ZTU5YTVkMzk3YQ&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RRzVoYTJGeWVXOXZidyZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTRkNWQwMjQ1MWY1YzA1NWJmN2I5OTdmYjMwNzAyZjhl&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;b50a34bd31f5b462830d5198b069249d"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E3%82%A2%E3%83%97%E3%83%AA%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A">アプリ側の設定</h2>
<p>Cognito のクライアント生成時に、特定の環境変数を設定している場合はそちらに繋ぐように変更します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/9f58aedb19bfb4f8b1f2d2cc347a9428.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110340020" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_session_endpoint-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_session_endpoint-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_session_endpoint-go-LC1" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">endpoint</span> <span class="pl-c1">*</span><span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_session_endpoint-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">cognitoEndpoint</span> <span class="pl-c1">=</span> <span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;COGNITO_ENDPOINT&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_session_endpoint-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">cognitoEndpoint</span> <span class="pl-c1">!=</span> <span class="pl-s">&quot;&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_session_endpoint-go-LC4" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">endpoint</span> <span class="pl-c1">=</span> <span class="pl-s1">aws</span>.<span class="pl-en">String</span>(<span class="pl-s1">cognitoEndpoint</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_session_endpoint-go-LC5" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_session_endpoint-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">client</span> <span class="pl-c1">:=</span> cognitoidentityprovider.<span class="pl-smi">New</span>(</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_session_endpoint-go-LC7" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">session</span>.<span class="pl-en">Must</span>(<span class="pl-s1">session</span>.<span class="pl-en">NewSessionWithOptions</span>(session.<span class="pl-smi">Options</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_session_endpoint-go-LC8" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">Config</span>:            aws.<span class="pl-smi">Config</span>{<span class="pl-c1">Endpoint</span>: <span class="pl-s1">endpoint</span>},</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_session_endpoint-go-LC9" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">SharedConfigState</span>: <span class="pl-s1">session</span>.<span class="pl-c1">SharedConfigEnable</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_session_endpoint-go-LC10" class="blob-code blob-code-inner js-file-line">		})),</td>
      </tr>
      <tr>
        <td id="file-cognito_session_endpoint-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_session_endpoint-go-LC11" class="blob-code blob-code-inner js-file-line">	)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/9f58aedb19bfb4f8b1f2d2cc347a9428/raw/eda88469f24973dff6a9884b657c4e90a7d36c92/cognito_session_endpoint.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/9f58aedb19bfb4f8b1f2d2cc347a9428#file-cognito_session_endpoint-go">cognito_session_endpoint.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://docs.aws.amazon.com/ja_jp/sdk-for-go/v1/developer-guide/configuring-sdk.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Configuring the AWS SDK for Go - AWS SDK for Go</div><div class="kg-bookmark-description">Configure the |sdk-go| to specify which credentials to use and to which AWS Region to send requests.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://docs.aws.amazon.com/assets/images/favicon.ico"><span class="kg-bookmark-author">AWS SDK for Go</span></img></div></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>すべてまとめると以下になります。コードが散らかってるのでもう少し整理したいところです…</p>
<p>汎用的なものが作れたら Docker Hub に上げようかなと思っていましたが、中々難しそうです。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/c2205e6feb06cad3bee470b665a0dd33.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist110339821" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cognito_mock-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cognito_mock-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cognito_mock-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cognito_mock-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cognito_mock-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cognito_mock-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;crypto/rsa&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cognito_mock-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/base64&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cognito_mock-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/binary&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cognito_mock-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;encoding/json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cognito_mock-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cognito_mock-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;io/ioutil&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cognito_mock-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cognito_mock-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;math/rand&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cognito_mock-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;net/http&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cognito_mock-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;os&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cognito_mock-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;strings&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cognito_mock-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;sync&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cognito_mock-go-LC16" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;time&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cognito_mock-go-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cognito_mock-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/aws/aws-sdk-go/service/cognitoidentityprovider&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cognito_mock-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/dgrijalva/jwt-go&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cognito_mock-go-LC20" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/chi/v5&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cognito_mock-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/chi/v5/middleware&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cognito_mock-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/go-chi/render&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cognito_mock-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;github.com/gofrs/uuid&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cognito_mock-go-LC24" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cognito_mock-go-LC25" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cognito_mock-go-LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">userPool</span> <span class="pl-smi">UserPool</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cognito_mock-go-LC27" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">clientID</span> <span class="pl-smi">ClientID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cognito_mock-go-LC28" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">signKey</span> <span class="pl-c1">*</span>rsa.<span class="pl-smi">PrivateKey</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cognito_mock-go-LC29" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cognito_mock-go-LC30" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-s1">jwkKeyID</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;hoge&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cognito_mock-go-LC31" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-s1">poolFileName</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;pool.json&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cognito_mock-go-LC32" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cognito_mock-go-LC33" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cognito_mock-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s1">poolFileName</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cognito_mock-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-cognito_mock-go-LC36" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-cognito_mock-go-LC37" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-cognito_mock-go-LC38" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">poolMap</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">map</span>[<span class="pl-smi">UserPoolID</span>]<span class="pl-smi">UserMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-cognito_mock-go-LC39" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">data</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">poolMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-cognito_mock-go-LC40" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-cognito_mock-go-LC41" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-cognito_mock-go-LC42" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-cognito_mock-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">userPool</span> <span class="pl-c1">=</span> <span class="pl-smi">UserPool</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-cognito_mock-go-LC44" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">poolMap</span>: <span class="pl-s1">poolMap</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-cognito_mock-go-LC45" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">mutex</span>:   <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">Mutex</span>{},</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-cognito_mock-go-LC46" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-cognito_mock-go-LC47" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-cognito_mock-go-LC48" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">clientID</span> <span class="pl-c1">=</span> <span class="pl-en">ClientID</span>(<span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;CLIENT_ID&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-cognito_mock-go-LC49" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-cognito_mock-go-LC50" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">signKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-en">getPrivateKey</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-cognito_mock-go-LC51" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-cognito_mock-go-LC52" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-cognito_mock-go-LC53" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-cognito_mock-go-LC54" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-cognito_mock-go-LC55" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pubKeyString</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">getPublicKey</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-cognito_mock-go-LC56" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-cognito_mock-go-LC57" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-cognito_mock-go-LC58" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-cognito_mock-go-LC59" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-cognito_mock-go-LC60" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span> <span class="pl-c1">:=</span> <span class="pl-s1">chi</span>.<span class="pl-en">NewRouter</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-cognito_mock-go-LC61" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Use</span>(<span class="pl-s1">middleware</span>.<span class="pl-c1">Logger</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-cognito_mock-go-LC62" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Get</span>(<span class="pl-s">&quot;/{userPoolID}/.well-known/jwks.json&quot;</span>, <span class="pl-k">func</span>(<span class="pl-s1">w</span> http.<span class="pl-smi">ResponseWriter</span>, <span class="pl-s1">r</span> <span class="pl-c1">*</span>http.<span class="pl-smi">Request</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-cognito_mock-go-LC63" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">Write</span>([]<span class="pl-smi">byte</span>(<span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">`{&quot;keys&quot;:[%s]}`</span>, <span class="pl-s1">pubKeyString</span>)))</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-cognito_mock-go-LC64" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-cognito_mock-go-LC65" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">mux</span>.<span class="pl-en">Post</span>(<span class="pl-s">&quot;/&quot;</span>, <span class="pl-k">func</span>(<span class="pl-s1">w</span> http.<span class="pl-smi">ResponseWriter</span>, <span class="pl-s1">r</span> <span class="pl-c1">*</span>http.<span class="pl-smi">Request</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-cognito_mock-go-LC66" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">b</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadAll</span>(<span class="pl-s1">r</span>.<span class="pl-c1">Body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-cognito_mock-go-LC67" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-cognito_mock-go-LC68" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">render</span>.<span class="pl-en">JSON</span>(<span class="pl-s1">w</span>, <span class="pl-s1">r</span>, <span class="pl-s1">http</span>.<span class="pl-c1">StatusInternalServerError</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-cognito_mock-go-LC69" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-cognito_mock-go-LC70" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-cognito_mock-go-LC71" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">defer</span> <span class="pl-s1">r</span>.<span class="pl-c1">Body</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-cognito_mock-go-LC72" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-cognito_mock-go-LC73" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">out</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">route</span>(<span class="pl-s1">r</span>.<span class="pl-c1">Header</span>.<span class="pl-en">Get</span>(<span class="pl-s">&quot;X-Amz-Target&quot;</span>), <span class="pl-s1">b</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-cognito_mock-go-LC74" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-cognito_mock-go-LC75" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-cognito_mock-go-LC76" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">render</span>.<span class="pl-en">JSON</span>(<span class="pl-s1">w</span>, <span class="pl-s1">r</span>, <span class="pl-s1">http</span>.<span class="pl-c1">StatusInternalServerError</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-cognito_mock-go-LC77" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-cognito_mock-go-LC78" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-cognito_mock-go-LC79" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">WriteHeader</span>(<span class="pl-s1">http</span>.<span class="pl-c1">StatusOK</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-cognito_mock-go-LC80" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">w</span>.<span class="pl-en">Write</span>(<span class="pl-s1">out</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-cognito_mock-go-LC81" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-cognito_mock-go-LC82" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-cognito_mock-go-LC83" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">http</span>.<span class="pl-en">ListenAndServe</span>(<span class="pl-s">&quot;:80&quot;</span>, <span class="pl-s1">mux</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-cognito_mock-go-LC84" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-cognito_mock-go-LC85" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-cognito_mock-go-LC86" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">User</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-cognito_mock-go-LC87" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">UUID</span>          <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;uuid&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-cognito_mock-go-LC88" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Password</span>      <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;password&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-cognito_mock-go-LC89" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Username</span>      <span class="pl-smi">Username</span> <span class="pl-s">`json:&quot;username&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-cognito_mock-go-LC90" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Email</span>         <span class="pl-smi">string</span>   <span class="pl-s">`json:&quot;email&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-cognito_mock-go-LC91" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">EmailVerified</span> <span class="pl-smi">bool</span>     <span class="pl-s">`json:&quot;email_verified&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-cognito_mock-go-LC92" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-cognito_mock-go-LC93" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-cognito_mock-go-LC94" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">u</span> <span class="pl-smi">User</span>) <span class="pl-en">ToToken</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>) <span class="pl-c1">*</span>jwt.<span class="pl-smi">Token</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-cognito_mock-go-LC95" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">token</span> <span class="pl-c1">:=</span> <span class="pl-s1">jwt</span>.<span class="pl-en">New</span>(<span class="pl-s1">jwt</span>.<span class="pl-c1">SigningMethodRS256</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-cognito_mock-go-LC96" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">token</span>.<span class="pl-c1">Header</span>[<span class="pl-s">&quot;kid&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">jwkKeyID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-cognito_mock-go-LC97" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-cognito_mock-go-LC98" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span> <span class="pl-c1">:=</span> <span class="pl-s1">token</span>.<span class="pl-c1">Claims</span>.(jwt.<span class="pl-smi">MapClaims</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-cognito_mock-go-LC99" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;iat&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Unix</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-cognito_mock-go-LC100" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;exp&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Add</span>(<span class="pl-s1">time</span>.<span class="pl-c1">Hour</span> <span class="pl-c1">*</span> <span class="pl-c1">24</span> <span class="pl-c1">*</span> <span class="pl-c1">365</span> <span class="pl-c1">*</span> <span class="pl-c1">10</span>).<span class="pl-en">Unix</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-cognito_mock-go-LC101" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;sub&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">u</span>.<span class="pl-c1">UUID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-cognito_mock-go-LC102" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">claims</span>[<span class="pl-s">&quot;email&quot;</span>] <span class="pl-c1">=</span> <span class="pl-s1">u</span>.<span class="pl-c1">Email</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-cognito_mock-go-LC103" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">token</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-cognito_mock-go-LC104" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-cognito_mock-go-LC105" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-cognito_mock-go-LC106" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">ClientID</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-cognito_mock-go-LC107" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L108" class="blob-num js-line-number" data-line-number="108"/>
        <td id="file-cognito_mock-go-LC108" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">Username</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L109" class="blob-num js-line-number" data-line-number="109"/>
        <td id="file-cognito_mock-go-LC109" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L110" class="blob-num js-line-number" data-line-number="110"/>
        <td id="file-cognito_mock-go-LC110" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserMap</span> <span class="pl-k">map</span>[<span class="pl-smi">Username</span>]<span class="pl-c1">*</span><span class="pl-smi">User</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L111" class="blob-num js-line-number" data-line-number="111"/>
        <td id="file-cognito_mock-go-LC111" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L112" class="blob-num js-line-number" data-line-number="112"/>
        <td id="file-cognito_mock-go-LC112" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserPoolID</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L113" class="blob-num js-line-number" data-line-number="113"/>
        <td id="file-cognito_mock-go-LC113" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L114" class="blob-num js-line-number" data-line-number="114"/>
        <td id="file-cognito_mock-go-LC114" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">UserPool</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L115" class="blob-num js-line-number" data-line-number="115"/>
        <td id="file-cognito_mock-go-LC115" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">poolMap</span> <span class="pl-k">map</span>[<span class="pl-smi">UserPoolID</span>]<span class="pl-smi">UserMap</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L116" class="blob-num js-line-number" data-line-number="116"/>
        <td id="file-cognito_mock-go-LC116" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">mutex</span>   <span class="pl-c1">*</span>sync.<span class="pl-smi">Mutex</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L117" class="blob-num js-line-number" data-line-number="117"/>
        <td id="file-cognito_mock-go-LC117" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L118" class="blob-num js-line-number" data-line-number="118"/>
        <td id="file-cognito_mock-go-LC118" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L119" class="blob-num js-line-number" data-line-number="119"/>
        <td id="file-cognito_mock-go-LC119" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">GetUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) (<span class="pl-c1">*</span><span class="pl-smi">User</span>, <span class="pl-smi">bool</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L120" class="blob-num js-line-number" data-line-number="120"/>
        <td id="file-cognito_mock-go-LC120" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L121" class="blob-num js-line-number" data-line-number="121"/>
        <td id="file-cognito_mock-go-LC121" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L122" class="blob-num js-line-number" data-line-number="122"/>
        <td id="file-cognito_mock-go-LC122" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L123" class="blob-num js-line-number" data-line-number="123"/>
        <td id="file-cognito_mock-go-LC123" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L124" class="blob-num js-line-number" data-line-number="124"/>
        <td id="file-cognito_mock-go-LC124" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L125" class="blob-num js-line-number" data-line-number="125"/>
        <td id="file-cognito_mock-go-LC125" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) (<span class="pl-c1">*</span><span class="pl-smi">User</span>, <span class="pl-smi">bool</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L126" class="blob-num js-line-number" data-line-number="126"/>
        <td id="file-cognito_mock-go-LC126" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L127" class="blob-num js-line-number" data-line-number="127"/>
        <td id="file-cognito_mock-go-LC127" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L128" class="blob-num js-line-number" data-line-number="128"/>
        <td id="file-cognito_mock-go-LC128" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">false</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L129" class="blob-num js-line-number" data-line-number="129"/>
        <td id="file-cognito_mock-go-LC129" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L130" class="blob-num js-line-number" data-line-number="130"/>
        <td id="file-cognito_mock-go-LC130" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">uMap</span>[<span class="pl-s1">username</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L131" class="blob-num js-line-number" data-line-number="131"/>
        <td id="file-cognito_mock-go-LC131" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L132" class="blob-num js-line-number" data-line-number="132"/>
        <td id="file-cognito_mock-go-LC132" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">false</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L133" class="blob-num js-line-number" data-line-number="133"/>
        <td id="file-cognito_mock-go-LC133" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L134" class="blob-num js-line-number" data-line-number="134"/>
        <td id="file-cognito_mock-go-LC134" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">u</span>, <span class="pl-c1">true</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L135" class="blob-num js-line-number" data-line-number="135"/>
        <td id="file-cognito_mock-go-LC135" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L136" class="blob-num js-line-number" data-line-number="136"/>
        <td id="file-cognito_mock-go-LC136" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L137" class="blob-num js-line-number" data-line-number="137"/>
        <td id="file-cognito_mock-go-LC137" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">CreateUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">user</span> <span class="pl-smi">User</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L138" class="blob-num js-line-number" data-line-number="138"/>
        <td id="file-cognito_mock-go-LC138" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L139" class="blob-num js-line-number" data-line-number="139"/>
        <td id="file-cognito_mock-go-LC139" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L140" class="blob-num js-line-number" data-line-number="140"/>
        <td id="file-cognito_mock-go-LC140" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L141" class="blob-num js-line-number" data-line-number="141"/>
        <td id="file-cognito_mock-go-LC141" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>]</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L142" class="blob-num js-line-number" data-line-number="142"/>
        <td id="file-cognito_mock-go-LC142" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L143" class="blob-num js-line-number" data-line-number="143"/>
        <td id="file-cognito_mock-go-LC143" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">uMap</span> <span class="pl-c1">=</span> <span class="pl-en">make</span>(<span class="pl-smi">UserMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L144" class="blob-num js-line-number" data-line-number="144"/>
        <td id="file-cognito_mock-go-LC144" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>] <span class="pl-c1">=</span> <span class="pl-s1">uMap</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L145" class="blob-num js-line-number" data-line-number="145"/>
        <td id="file-cognito_mock-go-LC145" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L146" class="blob-num js-line-number" data-line-number="146"/>
        <td id="file-cognito_mock-go-LC146" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">uMap</span>[<span class="pl-s1">user</span>.<span class="pl-c1">Username</span>]; <span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L147" class="blob-num js-line-number" data-line-number="147"/>
        <td id="file-cognito_mock-go-LC147" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;already exist&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L148" class="blob-num js-line-number" data-line-number="148"/>
        <td id="file-cognito_mock-go-LC148" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L149" class="blob-num js-line-number" data-line-number="149"/>
        <td id="file-cognito_mock-go-LC149" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">uMap</span>[<span class="pl-s1">user</span>.<span class="pl-c1">Username</span>] <span class="pl-c1">=</span> <span class="pl-c1">&amp;</span><span class="pl-s1">user</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L150" class="blob-num js-line-number" data-line-number="150"/>
        <td id="file-cognito_mock-go-LC150" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">updateFile</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L151" class="blob-num js-line-number" data-line-number="151"/>
        <td id="file-cognito_mock-go-LC151" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L152" class="blob-num js-line-number" data-line-number="152"/>
        <td id="file-cognito_mock-go-LC152" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L153" class="blob-num js-line-number" data-line-number="153"/>
        <td id="file-cognito_mock-go-LC153" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">updateFile</span>() <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L154" class="blob-num js-line-number" data-line-number="154"/>
        <td id="file-cognito_mock-go-LC154" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">file</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">os</span>.<span class="pl-en">Create</span>(<span class="pl-s1">poolFileName</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L155" class="blob-num js-line-number" data-line-number="155"/>
        <td id="file-cognito_mock-go-LC155" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L156" class="blob-num js-line-number" data-line-number="156"/>
        <td id="file-cognito_mock-go-LC156" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L157" class="blob-num js-line-number" data-line-number="157"/>
        <td id="file-cognito_mock-go-LC157" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L158" class="blob-num js-line-number" data-line-number="158"/>
        <td id="file-cognito_mock-go-LC158" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">file</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L159" class="blob-num js-line-number" data-line-number="159"/>
        <td id="file-cognito_mock-go-LC159" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">content</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L160" class="blob-num js-line-number" data-line-number="160"/>
        <td id="file-cognito_mock-go-LC160" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L161" class="blob-num js-line-number" data-line-number="161"/>
        <td id="file-cognito_mock-go-LC161" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L162" class="blob-num js-line-number" data-line-number="162"/>
        <td id="file-cognito_mock-go-LC162" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L163" class="blob-num js-line-number" data-line-number="163"/>
        <td id="file-cognito_mock-go-LC163" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">file</span>.<span class="pl-en">Write</span>(<span class="pl-s1">content</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L164" class="blob-num js-line-number" data-line-number="164"/>
        <td id="file-cognito_mock-go-LC164" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L165" class="blob-num js-line-number" data-line-number="165"/>
        <td id="file-cognito_mock-go-LC165" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L166" class="blob-num js-line-number" data-line-number="166"/>
        <td id="file-cognito_mock-go-LC166" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L167" class="blob-num js-line-number" data-line-number="167"/>
        <td id="file-cognito_mock-go-LC167" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">pool</span> <span class="pl-smi">UserPool</span>) <span class="pl-en">DeleteUser</span>(<span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span>, <span class="pl-s1">username</span> <span class="pl-smi">Username</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L168" class="blob-num js-line-number" data-line-number="168"/>
        <td id="file-cognito_mock-go-LC168" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Lock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L169" class="blob-num js-line-number" data-line-number="169"/>
        <td id="file-cognito_mock-go-LC169" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">pool</span>.<span class="pl-c1">mutex</span>.<span class="pl-en">Unlock</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L170" class="blob-num js-line-number" data-line-number="170"/>
        <td id="file-cognito_mock-go-LC170" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L171" class="blob-num js-line-number" data-line-number="171"/>
        <td id="file-cognito_mock-go-LC171" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">exist</span> <span class="pl-c1">:=</span> <span class="pl-s1">pool</span>.<span class="pl-en">getUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>); <span class="pl-s1">exist</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L172" class="blob-num js-line-number" data-line-number="172"/>
        <td id="file-cognito_mock-go-LC172" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">delete</span>(<span class="pl-s1">pool</span>.<span class="pl-c1">poolMap</span>[<span class="pl-s1">userPoolID</span>], <span class="pl-s1">username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L173" class="blob-num js-line-number" data-line-number="173"/>
        <td id="file-cognito_mock-go-LC173" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L174" class="blob-num js-line-number" data-line-number="174"/>
        <td id="file-cognito_mock-go-LC174" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">pool</span>.<span class="pl-en">updateFile</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L175" class="blob-num js-line-number" data-line-number="175"/>
        <td id="file-cognito_mock-go-LC175" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L176" class="blob-num js-line-number" data-line-number="176"/>
        <td id="file-cognito_mock-go-LC176" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L177" class="blob-num js-line-number" data-line-number="177"/>
        <td id="file-cognito_mock-go-LC177" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">jwkKey</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L178" class="blob-num js-line-number" data-line-number="178"/>
        <td id="file-cognito_mock-go-LC178" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Alg</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;alg&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L179" class="blob-num js-line-number" data-line-number="179"/>
        <td id="file-cognito_mock-go-LC179" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">E</span>   <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;e&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L180" class="blob-num js-line-number" data-line-number="180"/>
        <td id="file-cognito_mock-go-LC180" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Kid</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;kid&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L181" class="blob-num js-line-number" data-line-number="181"/>
        <td id="file-cognito_mock-go-LC181" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Kty</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;kty&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L182" class="blob-num js-line-number" data-line-number="182"/>
        <td id="file-cognito_mock-go-LC182" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">N</span>   <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;n&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L183" class="blob-num js-line-number" data-line-number="183"/>
        <td id="file-cognito_mock-go-LC183" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Use</span> <span class="pl-smi">string</span> <span class="pl-s">`json:&quot;use&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L184" class="blob-num js-line-number" data-line-number="184"/>
        <td id="file-cognito_mock-go-LC184" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L185" class="blob-num js-line-number" data-line-number="185"/>
        <td id="file-cognito_mock-go-LC185" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L186" class="blob-num js-line-number" data-line-number="186"/>
        <td id="file-cognito_mock-go-LC186" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">getPublicKey</span>() (<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L187" class="blob-num js-line-number" data-line-number="187"/>
        <td id="file-cognito_mock-go-LC187" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">verifyBytes</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s">&quot;./key.pem.pub.pkcs8&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L188" class="blob-num js-line-number" data-line-number="188"/>
        <td id="file-cognito_mock-go-LC188" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L189" class="blob-num js-line-number" data-line-number="189"/>
        <td id="file-cognito_mock-go-LC189" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L190" class="blob-num js-line-number" data-line-number="190"/>
        <td id="file-cognito_mock-go-LC190" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L191" class="blob-num js-line-number" data-line-number="191"/>
        <td id="file-cognito_mock-go-LC191" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">verifyKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">jwt</span>.<span class="pl-en">ParseRSAPublicKeyFromPEM</span>(<span class="pl-s1">verifyBytes</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L192" class="blob-num js-line-number" data-line-number="192"/>
        <td id="file-cognito_mock-go-LC192" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L193" class="blob-num js-line-number" data-line-number="193"/>
        <td id="file-cognito_mock-go-LC193" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L194" class="blob-num js-line-number" data-line-number="194"/>
        <td id="file-cognito_mock-go-LC194" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L195" class="blob-num js-line-number" data-line-number="195"/>
        <td id="file-cognito_mock-go-LC195" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L196" class="blob-num js-line-number" data-line-number="196"/>
        <td id="file-cognito_mock-go-LC196" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">encodedN</span> <span class="pl-c1">:=</span> <span class="pl-s1">base64</span>.<span class="pl-c1">RawURLEncoding</span>.<span class="pl-en">EncodeToString</span>(<span class="pl-s1">verifyKey</span>.<span class="pl-c1">N</span>.<span class="pl-en">Bytes</span>())</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L197" class="blob-num js-line-number" data-line-number="197"/>
        <td id="file-cognito_mock-go-LC197" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L198" class="blob-num js-line-number" data-line-number="198"/>
        <td id="file-cognito_mock-go-LC198" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">bytesE</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-c1">4</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L199" class="blob-num js-line-number" data-line-number="199"/>
        <td id="file-cognito_mock-go-LC199" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">binary</span>.<span class="pl-c1">BigEndian</span>.<span class="pl-en">PutUint32</span>(<span class="pl-s1">bytesE</span>, <span class="pl-en">uint32</span>(<span class="pl-s1">verifyKey</span>.<span class="pl-c1">E</span>))</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L200" class="blob-num js-line-number" data-line-number="200"/>
        <td id="file-cognito_mock-go-LC200" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L201" class="blob-num js-line-number" data-line-number="201"/>
        <td id="file-cognito_mock-go-LC201" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">encodedE</span> <span class="pl-c1">:=</span> <span class="pl-s1">base64</span>.<span class="pl-c1">RawURLEncoding</span>.<span class="pl-en">EncodeToString</span>(<span class="pl-s1">bytesE</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L202" class="blob-num js-line-number" data-line-number="202"/>
        <td id="file-cognito_mock-go-LC202" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L203" class="blob-num js-line-number" data-line-number="203"/>
        <td id="file-cognito_mock-go-LC203" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pubKey</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(<span class="pl-smi">jwkKey</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L204" class="blob-num js-line-number" data-line-number="204"/>
        <td id="file-cognito_mock-go-LC204" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Alg</span>: <span class="pl-s1">jwt</span>.<span class="pl-c1">SigningMethodRS256</span>.<span class="pl-en">Alg</span>(),</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L205" class="blob-num js-line-number" data-line-number="205"/>
        <td id="file-cognito_mock-go-LC205" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">E</span>:   <span class="pl-s1">encodedE</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L206" class="blob-num js-line-number" data-line-number="206"/>
        <td id="file-cognito_mock-go-LC206" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Kid</span>: <span class="pl-s1">jwkKeyID</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L207" class="blob-num js-line-number" data-line-number="207"/>
        <td id="file-cognito_mock-go-LC207" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Kty</span>: <span class="pl-s">&quot;RSA&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L208" class="blob-num js-line-number" data-line-number="208"/>
        <td id="file-cognito_mock-go-LC208" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">N</span>:   <span class="pl-s1">encodedN</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L209" class="blob-num js-line-number" data-line-number="209"/>
        <td id="file-cognito_mock-go-LC209" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Use</span>: <span class="pl-s">&quot;sig&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L210" class="blob-num js-line-number" data-line-number="210"/>
        <td id="file-cognito_mock-go-LC210" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L211" class="blob-num js-line-number" data-line-number="211"/>
        <td id="file-cognito_mock-go-LC211" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L212" class="blob-num js-line-number" data-line-number="212"/>
        <td id="file-cognito_mock-go-LC212" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L213" class="blob-num js-line-number" data-line-number="213"/>
        <td id="file-cognito_mock-go-LC213" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L214" class="blob-num js-line-number" data-line-number="214"/>
        <td id="file-cognito_mock-go-LC214" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-en">string</span>(<span class="pl-s1">pubKey</span>), <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L215" class="blob-num js-line-number" data-line-number="215"/>
        <td id="file-cognito_mock-go-LC215" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L216" class="blob-num js-line-number" data-line-number="216"/>
        <td id="file-cognito_mock-go-LC216" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L217" class="blob-num js-line-number" data-line-number="217"/>
        <td id="file-cognito_mock-go-LC217" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">getPrivateKey</span>() (<span class="pl-c1">*</span>rsa.<span class="pl-smi">PrivateKey</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L218" class="blob-num js-line-number" data-line-number="218"/>
        <td id="file-cognito_mock-go-LC218" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">signBytes</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">ioutil</span>.<span class="pl-en">ReadFile</span>(<span class="pl-s">&quot;./key.pem&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L219" class="blob-num js-line-number" data-line-number="219"/>
        <td id="file-cognito_mock-go-LC219" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L220" class="blob-num js-line-number" data-line-number="220"/>
        <td id="file-cognito_mock-go-LC220" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L221" class="blob-num js-line-number" data-line-number="221"/>
        <td id="file-cognito_mock-go-LC221" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L222" class="blob-num js-line-number" data-line-number="222"/>
        <td id="file-cognito_mock-go-LC222" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">jwt</span>.<span class="pl-en">ParseRSAPrivateKeyFromPEM</span>(<span class="pl-s1">signBytes</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L223" class="blob-num js-line-number" data-line-number="223"/>
        <td id="file-cognito_mock-go-LC223" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L224" class="blob-num js-line-number" data-line-number="224"/>
        <td id="file-cognito_mock-go-LC224" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L225" class="blob-num js-line-number" data-line-number="225"/>
        <td id="file-cognito_mock-go-LC225" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">route</span>(<span class="pl-s1">xAmzTarget</span> <span class="pl-smi">string</span>, <span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L226" class="blob-num js-line-number" data-line-number="226"/>
        <td id="file-cognito_mock-go-LC226" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">xAmzTarget</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L227" class="blob-num js-line-number" data-line-number="227"/>
        <td id="file-cognito_mock-go-LC227" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">targets</span> <span class="pl-c1">:=</span> <span class="pl-s1">strings</span>.<span class="pl-en">Split</span>(<span class="pl-s1">xAmzTarget</span>, <span class="pl-s">&quot;.&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L228" class="blob-num js-line-number" data-line-number="228"/>
        <td id="file-cognito_mock-go-LC228" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">targets</span>) <span class="pl-c1">&lt;</span> <span class="pl-c1">2</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L229" class="blob-num js-line-number" data-line-number="229"/>
        <td id="file-cognito_mock-go-LC229" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid header&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L230" class="blob-num js-line-number" data-line-number="230"/>
        <td id="file-cognito_mock-go-LC230" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L231" class="blob-num js-line-number" data-line-number="231"/>
        <td id="file-cognito_mock-go-LC231" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L232" class="blob-num js-line-number" data-line-number="232"/>
        <td id="file-cognito_mock-go-LC232" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">switch</span> <span class="pl-s1">targets</span>[<span class="pl-c1">1</span>] {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L233" class="blob-num js-line-number" data-line-number="233"/>
        <td id="file-cognito_mock-go-LC233" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">case</span> <span class="pl-s">&quot;AdminInitiateAuth&quot;</span>:</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L234" class="blob-num js-line-number" data-line-number="234"/>
        <td id="file-cognito_mock-go-LC234" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-en">adminInitiateAuth</span>(<span class="pl-s1">body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L235" class="blob-num js-line-number" data-line-number="235"/>
        <td id="file-cognito_mock-go-LC235" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">case</span> <span class="pl-s">&quot;AdminCreateUser&quot;</span>:</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L236" class="blob-num js-line-number" data-line-number="236"/>
        <td id="file-cognito_mock-go-LC236" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-en">adminCreateUser</span>(<span class="pl-s1">body</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L237" class="blob-num js-line-number" data-line-number="237"/>
        <td id="file-cognito_mock-go-LC237" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L238" class="blob-num js-line-number" data-line-number="238"/>
        <td id="file-cognito_mock-go-LC238" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid operation name&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L239" class="blob-num js-line-number" data-line-number="239"/>
        <td id="file-cognito_mock-go-LC239" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L240" class="blob-num js-line-number" data-line-number="240"/>
        <td id="file-cognito_mock-go-LC240" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L241" class="blob-num js-line-number" data-line-number="241"/>
        <td id="file-cognito_mock-go-LC241" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">adminInitiateAuth</span>(<span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L242" class="blob-num js-line-number" data-line-number="242"/>
        <td id="file-cognito_mock-go-LC242" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">in</span> <span class="pl-c1">:=</span> cognitoidentityprovider.<span class="pl-smi">AdminInitiateAuthInput</span>{}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L243" class="blob-num js-line-number" data-line-number="243"/>
        <td id="file-cognito_mock-go-LC243" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">body</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">in</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L244" class="blob-num js-line-number" data-line-number="244"/>
        <td id="file-cognito_mock-go-LC244" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L245" class="blob-num js-line-number" data-line-number="245"/>
        <td id="file-cognito_mock-go-LC245" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L246" class="blob-num js-line-number" data-line-number="246"/>
        <td id="file-cognito_mock-go-LC246" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L247" class="blob-num js-line-number" data-line-number="247"/>
        <td id="file-cognito_mock-go-LC247" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// TODO: まだ ADMIN_NO_SRP_AUTH だけ</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L248" class="blob-num js-line-number" data-line-number="248"/>
        <td id="file-cognito_mock-go-LC248" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthFlow</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">AuthFlow</span> <span class="pl-c1">!=</span> <span class="pl-s1">cognitoidentityprovider</span>.<span class="pl-c1">AuthFlowTypeAdminNoSrpAuth</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L249" class="blob-num js-line-number" data-line-number="249"/>
        <td id="file-cognito_mock-go-LC249" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid auth flow&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L250" class="blob-num js-line-number" data-line-number="250"/>
        <td id="file-cognito_mock-go-LC250" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L251" class="blob-num js-line-number" data-line-number="251"/>
        <td id="file-cognito_mock-go-LC251" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L252" class="blob-num js-line-number" data-line-number="252"/>
        <td id="file-cognito_mock-go-LC252" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">cID</span> <span class="pl-smi">ClientID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L253" class="blob-num js-line-number" data-line-number="253"/>
        <td id="file-cognito_mock-go-LC253" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">ClientId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L254" class="blob-num js-line-number" data-line-number="254"/>
        <td id="file-cognito_mock-go-LC254" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">cID</span> <span class="pl-c1">=</span> <span class="pl-en">ClientID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">ClientId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L255" class="blob-num js-line-number" data-line-number="255"/>
        <td id="file-cognito_mock-go-LC255" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L256" class="blob-num js-line-number" data-line-number="256"/>
        <td id="file-cognito_mock-go-LC256" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">cID</span> <span class="pl-c1">!=</span> <span class="pl-s1">clientID</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L257" class="blob-num js-line-number" data-line-number="257"/>
        <td id="file-cognito_mock-go-LC257" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid client id&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L258" class="blob-num js-line-number" data-line-number="258"/>
        <td id="file-cognito_mock-go-LC258" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L259" class="blob-num js-line-number" data-line-number="259"/>
        <td id="file-cognito_mock-go-LC259" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L260" class="blob-num js-line-number" data-line-number="260"/>
        <td id="file-cognito_mock-go-LC260" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L261" class="blob-num js-line-number" data-line-number="261"/>
        <td id="file-cognito_mock-go-LC261" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L262" class="blob-num js-line-number" data-line-number="262"/>
        <td id="file-cognito_mock-go-LC262" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span> <span class="pl-c1">=</span> <span class="pl-en">UserPoolID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L263" class="blob-num js-line-number" data-line-number="263"/>
        <td id="file-cognito_mock-go-LC263" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L264" class="blob-num js-line-number" data-line-number="264"/>
        <td id="file-cognito_mock-go-LC264" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">username</span> <span class="pl-smi">Username</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L265" class="blob-num js-line-number" data-line-number="265"/>
        <td id="file-cognito_mock-go-LC265" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthParameters</span>[<span class="pl-s">&quot;USERNAME&quot;</span>]; <span class="pl-s1">ok</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-s1">u</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L266" class="blob-num js-line-number" data-line-number="266"/>
        <td id="file-cognito_mock-go-LC266" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span> <span class="pl-c1">=</span> <span class="pl-en">Username</span>(<span class="pl-c1">*</span><span class="pl-s1">u</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L267" class="blob-num js-line-number" data-line-number="267"/>
        <td id="file-cognito_mock-go-LC267" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L268" class="blob-num js-line-number" data-line-number="268"/>
        <td id="file-cognito_mock-go-LC268" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">u</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">GetUser</span>(</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L269" class="blob-num js-line-number" data-line-number="269"/>
        <td id="file-cognito_mock-go-LC269" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L270" class="blob-num js-line-number" data-line-number="270"/>
        <td id="file-cognito_mock-go-LC270" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L271" class="blob-num js-line-number" data-line-number="271"/>
        <td id="file-cognito_mock-go-LC271" class="blob-code blob-code-inner js-file-line">	)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L272" class="blob-num js-line-number" data-line-number="272"/>
        <td id="file-cognito_mock-go-LC272" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L273" class="blob-num js-line-number" data-line-number="273"/>
        <td id="file-cognito_mock-go-LC273" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;user not found&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L274" class="blob-num js-line-number" data-line-number="274"/>
        <td id="file-cognito_mock-go-LC274" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L275" class="blob-num js-line-number" data-line-number="275"/>
        <td id="file-cognito_mock-go-LC275" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">u</span>.<span class="pl-c1">EmailVerified</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L276" class="blob-num js-line-number" data-line-number="276"/>
        <td id="file-cognito_mock-go-LC276" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;email not verified&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L277" class="blob-num js-line-number" data-line-number="277"/>
        <td id="file-cognito_mock-go-LC277" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L278" class="blob-num js-line-number" data-line-number="278"/>
        <td id="file-cognito_mock-go-LC278" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L279" class="blob-num js-line-number" data-line-number="279"/>
        <td id="file-cognito_mock-go-LC279" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">password</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L280" class="blob-num js-line-number" data-line-number="280"/>
        <td id="file-cognito_mock-go-LC280" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">p</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">in</span>.<span class="pl-c1">AuthParameters</span>[<span class="pl-s">&quot;PASSWORD&quot;</span>]; <span class="pl-s1">ok</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-s1">p</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L281" class="blob-num js-line-number" data-line-number="281"/>
        <td id="file-cognito_mock-go-LC281" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">password</span> <span class="pl-c1">=</span> <span class="pl-c1">*</span><span class="pl-s1">p</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L282" class="blob-num js-line-number" data-line-number="282"/>
        <td id="file-cognito_mock-go-LC282" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L283" class="blob-num js-line-number" data-line-number="283"/>
        <td id="file-cognito_mock-go-LC283" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">u</span>.<span class="pl-c1">Password</span> <span class="pl-c1">!=</span> <span class="pl-s1">password</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L284" class="blob-num js-line-number" data-line-number="284"/>
        <td id="file-cognito_mock-go-LC284" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;password not match&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L285" class="blob-num js-line-number" data-line-number="285"/>
        <td id="file-cognito_mock-go-LC285" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L286" class="blob-num js-line-number" data-line-number="286"/>
        <td id="file-cognito_mock-go-LC286" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L287" class="blob-num js-line-number" data-line-number="287"/>
        <td id="file-cognito_mock-go-LC287" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">tokenString</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">u</span>.<span class="pl-en">ToToken</span>(<span class="pl-s1">userPoolID</span>).<span class="pl-en">SignedString</span>(<span class="pl-s1">signKey</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L288" class="blob-num js-line-number" data-line-number="288"/>
        <td id="file-cognito_mock-go-LC288" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L289" class="blob-num js-line-number" data-line-number="289"/>
        <td id="file-cognito_mock-go-LC289" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L290" class="blob-num js-line-number" data-line-number="290"/>
        <td id="file-cognito_mock-go-LC290" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L291" class="blob-num js-line-number" data-line-number="291"/>
        <td id="file-cognito_mock-go-LC291" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminInitiateAuthOutput</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L292" class="blob-num js-line-number" data-line-number="292"/>
        <td id="file-cognito_mock-go-LC292" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">AuthenticationResult</span>: <span class="pl-c1">&amp;</span>cognitoidentityprovider.<span class="pl-smi">AuthenticationResultType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L293" class="blob-num js-line-number" data-line-number="293"/>
        <td id="file-cognito_mock-go-LC293" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">AccessToken</span>: <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s1">tokenString</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L294" class="blob-num js-line-number" data-line-number="294"/>
        <td id="file-cognito_mock-go-LC294" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L295" class="blob-num js-line-number" data-line-number="295"/>
        <td id="file-cognito_mock-go-LC295" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L296" class="blob-num js-line-number" data-line-number="296"/>
        <td id="file-cognito_mock-go-LC296" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L297" class="blob-num js-line-number" data-line-number="297"/>
        <td id="file-cognito_mock-go-LC297" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L298" class="blob-num js-line-number" data-line-number="298"/>
        <td id="file-cognito_mock-go-LC298" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">adminCreateUser</span>(<span class="pl-s1">body</span> []<span class="pl-smi">byte</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L299" class="blob-num js-line-number" data-line-number="299"/>
        <td id="file-cognito_mock-go-LC299" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">in</span> <span class="pl-c1">:=</span> cognitoidentityprovider.<span class="pl-smi">AdminCreateUserInput</span>{}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L300" class="blob-num js-line-number" data-line-number="300"/>
        <td id="file-cognito_mock-go-LC300" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">Unmarshal</span>(<span class="pl-s1">body</span>, <span class="pl-c1">&amp;</span><span class="pl-s1">in</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L301" class="blob-num js-line-number" data-line-number="301"/>
        <td id="file-cognito_mock-go-LC301" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L302" class="blob-num js-line-number" data-line-number="302"/>
        <td id="file-cognito_mock-go-LC302" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L303" class="blob-num js-line-number" data-line-number="303"/>
        <td id="file-cognito_mock-go-LC303" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L304" class="blob-num js-line-number" data-line-number="304"/>
        <td id="file-cognito_mock-go-LC304" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L305" class="blob-num js-line-number" data-line-number="305"/>
        <td id="file-cognito_mock-go-LC305" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">userPoolID</span> <span class="pl-smi">UserPoolID</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L306" class="blob-num js-line-number" data-line-number="306"/>
        <td id="file-cognito_mock-go-LC306" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L307" class="blob-num js-line-number" data-line-number="307"/>
        <td id="file-cognito_mock-go-LC307" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">userPoolID</span> <span class="pl-c1">=</span> <span class="pl-en">UserPoolID</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">UserPoolId</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L308" class="blob-num js-line-number" data-line-number="308"/>
        <td id="file-cognito_mock-go-LC308" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L309" class="blob-num js-line-number" data-line-number="309"/>
        <td id="file-cognito_mock-go-LC309" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">username</span> <span class="pl-smi">Username</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L310" class="blob-num js-line-number" data-line-number="310"/>
        <td id="file-cognito_mock-go-LC310" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">Username</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L311" class="blob-num js-line-number" data-line-number="311"/>
        <td id="file-cognito_mock-go-LC311" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">username</span> <span class="pl-c1">=</span> <span class="pl-en">Username</span>(<span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">Username</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L312" class="blob-num js-line-number" data-line-number="312"/>
        <td id="file-cognito_mock-go-LC312" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L313" class="blob-num js-line-number" data-line-number="313"/>
        <td id="file-cognito_mock-go-LC313" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L314" class="blob-num js-line-number" data-line-number="314"/>
        <td id="file-cognito_mock-go-LC314" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">in</span>.<span class="pl-c1">MessageAction</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> <span class="pl-c1">&amp;&amp;</span> <span class="pl-c1">*</span><span class="pl-s1">in</span>.<span class="pl-c1">MessageAction</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;RESEND&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L315" class="blob-num js-line-number" data-line-number="315"/>
        <td id="file-cognito_mock-go-LC315" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">exist</span> <span class="pl-c1">:=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">GetUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">username</span>); <span class="pl-c1">!</span><span class="pl-s1">exist</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L316" class="blob-num js-line-number" data-line-number="316"/>
        <td id="file-cognito_mock-go-LC316" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;user not found&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L317" class="blob-num js-line-number" data-line-number="317"/>
        <td id="file-cognito_mock-go-LC317" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L318" class="blob-num js-line-number" data-line-number="318"/>
        <td id="file-cognito_mock-go-LC318" class="blob-code blob-code-inner js-file-line">		<span class="pl-c">// TODO: パスワード変更して通知メール再送信</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L319" class="blob-num js-line-number" data-line-number="319"/>
        <td id="file-cognito_mock-go-LC319" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminCreateUserOutput</span>{})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L320" class="blob-num js-line-number" data-line-number="320"/>
        <td id="file-cognito_mock-go-LC320" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L321" class="blob-num js-line-number" data-line-number="321"/>
        <td id="file-cognito_mock-go-LC321" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L322" class="blob-num js-line-number" data-line-number="322"/>
        <td id="file-cognito_mock-go-LC322" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">email</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L323" class="blob-num js-line-number" data-line-number="323"/>
        <td id="file-cognito_mock-go-LC323" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">attr</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">in</span>.<span class="pl-c1">UserAttributes</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L324" class="blob-num js-line-number" data-line-number="324"/>
        <td id="file-cognito_mock-go-LC324" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">attr</span>.<span class="pl-c1">Name</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> <span class="pl-c1">||</span> <span class="pl-s1">attr</span>.<span class="pl-c1">Value</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L325" class="blob-num js-line-number" data-line-number="325"/>
        <td id="file-cognito_mock-go-LC325" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">continue</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L326" class="blob-num js-line-number" data-line-number="326"/>
        <td id="file-cognito_mock-go-LC326" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L327" class="blob-num js-line-number" data-line-number="327"/>
        <td id="file-cognito_mock-go-LC327" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-c1">*</span><span class="pl-s1">attr</span>.<span class="pl-c1">Name</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;email&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L328" class="blob-num js-line-number" data-line-number="328"/>
        <td id="file-cognito_mock-go-LC328" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">email</span> <span class="pl-c1">=</span> <span class="pl-c1">*</span><span class="pl-s1">attr</span>.<span class="pl-c1">Value</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L329" class="blob-num js-line-number" data-line-number="329"/>
        <td id="file-cognito_mock-go-LC329" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L330" class="blob-num js-line-number" data-line-number="330"/>
        <td id="file-cognito_mock-go-LC330" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L331" class="blob-num js-line-number" data-line-number="331"/>
        <td id="file-cognito_mock-go-LC331" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// TODO: email_verified が true ならパスワードメール送信, false なら検証メール送信</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L332" class="blob-num js-line-number" data-line-number="332"/>
        <td id="file-cognito_mock-go-LC332" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// 常にtrueとして扱っている</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L333" class="blob-num js-line-number" data-line-number="333"/>
        <td id="file-cognito_mock-go-LC333" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">email</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L334" class="blob-num js-line-number" data-line-number="334"/>
        <td id="file-cognito_mock-go-LC334" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">fmt</span>.<span class="pl-en">Errorf</span>(<span class="pl-s">&quot;invalid email&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L335" class="blob-num js-line-number" data-line-number="335"/>
        <td id="file-cognito_mock-go-LC335" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L336" class="blob-num js-line-number" data-line-number="336"/>
        <td id="file-cognito_mock-go-LC336" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L337" class="blob-num js-line-number" data-line-number="337"/>
        <td id="file-cognito_mock-go-LC337" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">id</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">uuid</span>.<span class="pl-en">NewV4</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L338" class="blob-num js-line-number" data-line-number="338"/>
        <td id="file-cognito_mock-go-LC338" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L339" class="blob-num js-line-number" data-line-number="339"/>
        <td id="file-cognito_mock-go-LC339" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L340" class="blob-num js-line-number" data-line-number="340"/>
        <td id="file-cognito_mock-go-LC340" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L341" class="blob-num js-line-number" data-line-number="341"/>
        <td id="file-cognito_mock-go-LC341" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">pass</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">makeRandomStr</span>(<span class="pl-c1">8</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L342" class="blob-num js-line-number" data-line-number="342"/>
        <td id="file-cognito_mock-go-LC342" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L343" class="blob-num js-line-number" data-line-number="343"/>
        <td id="file-cognito_mock-go-LC343" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L344" class="blob-num js-line-number" data-line-number="344"/>
        <td id="file-cognito_mock-go-LC344" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L345" class="blob-num js-line-number" data-line-number="345"/>
        <td id="file-cognito_mock-go-LC345" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">idString</span> <span class="pl-c1">:=</span> <span class="pl-s1">id</span>.<span class="pl-en">String</span>()</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L346" class="blob-num js-line-number" data-line-number="346"/>
        <td id="file-cognito_mock-go-LC346" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">user</span> <span class="pl-c1">:=</span> <span class="pl-smi">User</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L347" class="blob-num js-line-number" data-line-number="347"/>
        <td id="file-cognito_mock-go-LC347" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">UUID</span>:          <span class="pl-s1">idString</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L348" class="blob-num js-line-number" data-line-number="348"/>
        <td id="file-cognito_mock-go-LC348" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Password</span>:      <span class="pl-s1">pass</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L349" class="blob-num js-line-number" data-line-number="349"/>
        <td id="file-cognito_mock-go-LC349" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Username</span>:      <span class="pl-s1">username</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L350" class="blob-num js-line-number" data-line-number="350"/>
        <td id="file-cognito_mock-go-LC350" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">Email</span>:         <span class="pl-s1">email</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L351" class="blob-num js-line-number" data-line-number="351"/>
        <td id="file-cognito_mock-go-LC351" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">EmailVerified</span>: <span class="pl-c1">true</span>,</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L352" class="blob-num js-line-number" data-line-number="352"/>
        <td id="file-cognito_mock-go-LC352" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L353" class="blob-num js-line-number" data-line-number="353"/>
        <td id="file-cognito_mock-go-LC353" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-s1">userPool</span>.<span class="pl-en">CreateUser</span>(<span class="pl-s1">userPoolID</span>, <span class="pl-s1">user</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L354" class="blob-num js-line-number" data-line-number="354"/>
        <td id="file-cognito_mock-go-LC354" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L355" class="blob-num js-line-number" data-line-number="355"/>
        <td id="file-cognito_mock-go-LC355" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L356" class="blob-num js-line-number" data-line-number="356"/>
        <td id="file-cognito_mock-go-LC356" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L357" class="blob-num js-line-number" data-line-number="357"/>
        <td id="file-cognito_mock-go-LC357" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L358" class="blob-num js-line-number" data-line-number="358"/>
        <td id="file-cognito_mock-go-LC358" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">json</span>.<span class="pl-en">Marshal</span>(cognitoidentityprovider.<span class="pl-smi">AdminCreateUserOutput</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L359" class="blob-num js-line-number" data-line-number="359"/>
        <td id="file-cognito_mock-go-LC359" class="blob-code blob-code-inner js-file-line">		<span class="pl-c1">User</span>: <span class="pl-c1">&amp;</span>cognitoidentityprovider.<span class="pl-smi">UserType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L360" class="blob-num js-line-number" data-line-number="360"/>
        <td id="file-cognito_mock-go-LC360" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">Attributes</span>: []<span class="pl-c1">*</span>cognitoidentityprovider.<span class="pl-smi">AttributeType</span>{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L361" class="blob-num js-line-number" data-line-number="361"/>
        <td id="file-cognito_mock-go-LC361" class="blob-code blob-code-inner js-file-line">				{</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L362" class="blob-num js-line-number" data-line-number="362"/>
        <td id="file-cognito_mock-go-LC362" class="blob-code blob-code-inner js-file-line">					<span class="pl-c1">Name</span>:  <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s">&quot;sub&quot;</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L363" class="blob-num js-line-number" data-line-number="363"/>
        <td id="file-cognito_mock-go-LC363" class="blob-code blob-code-inner js-file-line">					<span class="pl-c1">Value</span>: <span class="pl-c1">&amp;</span>[]<span class="pl-smi">string</span>{<span class="pl-s1">idString</span>}[<span class="pl-c1">0</span>],</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L364" class="blob-num js-line-number" data-line-number="364"/>
        <td id="file-cognito_mock-go-LC364" class="blob-code blob-code-inner js-file-line">				},</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L365" class="blob-num js-line-number" data-line-number="365"/>
        <td id="file-cognito_mock-go-LC365" class="blob-code blob-code-inner js-file-line">			},</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L366" class="blob-num js-line-number" data-line-number="366"/>
        <td id="file-cognito_mock-go-LC366" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L367" class="blob-num js-line-number" data-line-number="367"/>
        <td id="file-cognito_mock-go-LC367" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L368" class="blob-num js-line-number" data-line-number="368"/>
        <td id="file-cognito_mock-go-LC368" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L369" class="blob-num js-line-number" data-line-number="369"/>
        <td id="file-cognito_mock-go-LC369" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L370" class="blob-num js-line-number" data-line-number="370"/>
        <td id="file-cognito_mock-go-LC370" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">makeRandomStr</span>(<span class="pl-s1">digit</span> <span class="pl-smi">uint32</span>) (<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L371" class="blob-num js-line-number" data-line-number="371"/>
        <td id="file-cognito_mock-go-LC371" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">const</span> <span class="pl-s1">letters</span> <span class="pl-c1">=</span> <span class="pl-s">&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@&amp;%/:;,.&quot;</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L372" class="blob-num js-line-number" data-line-number="372"/>
        <td id="file-cognito_mock-go-LC372" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L373" class="blob-num js-line-number" data-line-number="373"/>
        <td id="file-cognito_mock-go-LC373" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">b</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-s1">digit</span>)</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L374" class="blob-num js-line-number" data-line-number="374"/>
        <td id="file-cognito_mock-go-LC374" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">rand</span>.<span class="pl-en">Read</span>(<span class="pl-s1">b</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L375" class="blob-num js-line-number" data-line-number="375"/>
        <td id="file-cognito_mock-go-LC375" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-s">&quot;&quot;</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L376" class="blob-num js-line-number" data-line-number="376"/>
        <td id="file-cognito_mock-go-LC376" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L377" class="blob-num js-line-number" data-line-number="377"/>
        <td id="file-cognito_mock-go-LC377" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L378" class="blob-num js-line-number" data-line-number="378"/>
        <td id="file-cognito_mock-go-LC378" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">result</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L379" class="blob-num js-line-number" data-line-number="379"/>
        <td id="file-cognito_mock-go-LC379" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">v</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">b</span> {</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L380" class="blob-num js-line-number" data-line-number="380"/>
        <td id="file-cognito_mock-go-LC380" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">result</span> <span class="pl-c1">+=</span> <span class="pl-en">string</span>(<span class="pl-s1">letters</span>[<span class="pl-en">int</span>(<span class="pl-s1">v</span>)<span class="pl-c1">%</span><span class="pl-en">len</span>(<span class="pl-s1">letters</span>)])</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L381" class="blob-num js-line-number" data-line-number="381"/>
        <td id="file-cognito_mock-go-LC381" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L382" class="blob-num js-line-number" data-line-number="382"/>
        <td id="file-cognito_mock-go-LC382" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">result</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-cognito_mock-go-L383" class="blob-num js-line-number" data-line-number="383"/>
        <td id="file-cognito_mock-go-LC383" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/c2205e6feb06cad3bee470b665a0dd33/raw/a7c159f9563c64a9bcd7a07d7338bf6024cd371b/cognito_mock.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/c2205e6feb06cad3bee470b665a0dd33#file-cognito_mock-go">cognito_mock.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--></link></link></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[【体験談】簿記3級の勉強時間とネット試験について]]></title><description><![CDATA[先日、日商簿記検定3級のネット試験を受けてきたので、勉強にかかった時間や、2020年12月に始まったばかりの「ネット試験方式」についてまとめてみました！

はじめに
まずは私について、簿記3級を受ける前はこんな感じでした！
・1年半ほど経理含むバックオフィス業務を経験
・普段は会計ソフトを使用している
・勘定科目は少々知っていたが「貸方」「借方」とか分からず…
・簿記の学習経験はナシ

勉強時間について
テキスト：26時間（各章読んで解いてを繰り返しテキスト1周）
問題集：9時間（模擬試験2回と、予想問題を解いては復習）
合計：35時間（土日を中心に3週間ほど勉強しました！）

ネットで「簿記3級 勉強時間」と調べると、最低50時間、平均100時間程度と出てましたが、思ったより早く合格できました！
（日々会計ソフトをいじってた分、多少巻けたようで嬉しかった。笑）

受験日を前もって決めていた為、あまり期間がなかったですが、本番に向けて追い込む感じとか部活の大会前みたいで楽しかったです〜！

ネット試験方式について
ネット試験と言っても自宅や職場などで受ける訳ではなく、全国にある試験会場]]></description><link>https://tech.anti-pattern.co.jp/nissyouboki3kyu-netshiken/</link><guid isPermaLink="false">Ghost__Post__61013af23986b000013a3e51</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 23 Jun 2021 11:12:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>先日、日商簿記検定3級のネット試験を受けてきたので、勉強にかかった時間や、2020年12月に始まったばかりの「ネット試験方式」についてまとめてみました！</p>
<h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2>
<p>まずは私について、簿記3級を受ける前はこんな感じでした！<br>
・1年半ほど経理含むバックオフィス業務を経験<br>
・普段は会計ソフトを使用している<br>
・勘定科目は少々知っていたが「貸方」「借方」とか分からず…<br>
・簿記の学習経験はナシ</br></br></br></br></p>
<h2 id="%E5%8B%89%E5%BC%B7%E6%99%82%E9%96%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">勉強時間について</h2>
<p>テキスト：26時間（各章読んで解いてを繰り返しテキスト1周）<br>
問題集：9時間（模擬試験2回と、予想問題を解いては復習）<br>
<strong>合計：35時間</strong>（土日を中心に3週間ほど勉強しました！）</br></br></p>
<p>ネットで「簿記3級 勉強時間」と調べると、最低50時間、平均100時間程度と出てましたが、思ったより早く合格できました！<br>
（日々会計ソフトをいじってた分、多少巻けたようで嬉しかった。笑）</br></p>
<p>受験日を前もって決めていた為、あまり期間がなかったですが、本番に向けて追い込む感じとか部活の大会前みたいで楽しかったです〜！</p>
<h2 id="%E3%83%8D%E3%83%83%E3%83%88%E8%A9%A6%E9%A8%93%E6%96%B9%E5%BC%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">ネット試験方式について</h2>
<p>ネット試験と言っても自宅や職場などで受ける訳ではなく、全国にある試験会場(テストセンター)に行って受験します！<br>
<a href="https://www.kentei.ne.jp/32497">日商簿記検定ネット試験を開始いたしました | 商工会議所の検定試験</a></br></p>
<p>テストセンターの空きさえあれば、受験希望日の3日前まで申込可能です。<br>
開始時間も15分単位で選べたり、昼過ぎや夕方でも試験が受けられるので、朝早いのが苦手な人にもオススメです〜！<br>
※年3回の統一試験の場合、簿記3級は9時開始か11時開始(2021年度より)<br>
<a href="https://www.kentei.ne.jp/34043">第158回簿記検定試験からの変更点について | 商工会議所の検定試験</a></br></br></br></p>
<p>ネット試験の場合、試験後もスコアレポートをぺろっと1枚もらって終了ですので、すぐ帰れますよ！笑</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/PC.png" alt="PC" loading="lazy"/></p>
<h2 id="%E3%83%8D%E3%83%83%E3%83%88%E8%A9%A6%E9%A8%93%E5%BD%93%E6%97%A5%E3%81%AE%E6%B5%81%E3%82%8C">ネット試験当日の流れ</h2>
<p><strong>①13:15開始で申し込んでいたので、12:50過ぎにテストセンターへ到着</strong><br>
↓<br>
<strong>②身分証の提示、注意事項など読んで同意書にサイン</strong><br>
↓<br>
<strong>③荷物をロッカーに預ける、スタッフの方から注意事項を聞く</strong><br>
・腕時計も外す、ポケットに何も入っていないか確認される<br>
・電卓は予備含め2台持参したが1台しか部屋に持ち込めないと言われる<br>
・ソーラー電卓の場合、試験部屋の明かり加減で使えないかもと言われる<br>
（そういう事象がたまに起こるそうですが、私は無事使えました！）<br>
↓<br>
<strong>④13:00過ぎに、もう試験始めていいよとなり試験部屋に案内される</strong><br>
（試験前の待機スペースはありましたが、早めに部屋へ案内された為、直前に勉強する時間はありませんでした！）<br>
↓<br>
<strong>⑤デスクに置いてある注意事項を読み、気持ちを落ち着かせて受験開始！</strong><br>
（全ての会場にあるか分からないですが、耳栓やイヤーマフが席にあり、イヤーマフをすると周りの音が少し気にならなくて良かったです！）<br>
↓<br>
<strong>⑥13:10頃試験開始（試験時間：60分）</strong><br>
（予想問題を家で解いた時も60分で終わったためしがなかった為、全部解答することより、時間内に行けるとこまで確実に解く！を意識しました）<br>
↓<br>
<strong>⑦14:10頃試験終了、画面に点数と「合格」の文字が表示される</strong><br>
↓<br>
<strong>⑧受付で下書き用紙など返却＆スコアレポートを受け取り、終了！</strong><br>
（14:15〜14:20ぐらいには会場を出たので、テストセンターの滞在時間は合計で1時間半ぐらいかと思います！）</br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></br></p>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>ネット試験だと、問題用紙に書き込めないしやりにくいかな？と思いましたが、特に問題なかったです！<br>
合否もその場で分かる為スピーディーで良いなと思いました！</br></p>
<p>簿記2級になると勉強時間は最低100時間、平均300時間ぐらい要るようですが、年内にまたネット試験で挑戦してみようと思います〜！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[二分探索の応用]]></title><description><![CDATA[皆さんご存知の二分探索。この応用について今回は書いていきたいと思う。

二分探索の一般化
二分探索とはつまり、範囲を特定することである。

例億マス計算
そこで今回は二分探索を使う下記問題を解いていく

C - 億マス計算AtCoder is a programming contest site for anyone from beginners to
experts. We hold weekly programming contests online.AtCoderAtCoder Inc.
[https://atcoder.jp/contests/arc037/tasks/arc037_c]

愚直に2重ループで解くと

O(N²)になるため、時間が足りなくなる

blog-binary_search_2blog-binary_search_2. GitHub Gist: instantly share code,
notes, and snippets.Gist262588213843476
[https://gist.github.com/kooooohe/8cc33e0f1e]]></description><link>https://tech.anti-pattern.co.jp/er-fen-tan-suo-noying-yong/</link><guid isPermaLink="false">Ghost__Post__60fa72003986b000013a3951</guid><category><![CDATA[C++]]></category><category><![CDATA[algorithm]]></category><category><![CDATA[binary_search]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Tue, 15 Jun 2021 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_XGofnd5bRfFGPVvXDCnuhg.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_XGofnd5bRfFGPVvXDCnuhg.png" alt="二分探索の応用"/><p>皆さんご存知の二分探索。この応用について今回は書いていきたいと思う。</p><h4 id="%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2%E3%81%AE%E4%B8%80%E8%88%AC%E5%8C%96">二分探索の一般化</h4><p>二分探索とはつまり、範囲を特定することである。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/800/1*XGofnd5bRfFGPVvXDCnuhg.png" class="kg-image" alt="二分探索の応用" loading="lazy"><figcaption>例</figcaption></img></figure><h4 id="%E5%84%84%E3%83%9E%E3%82%B9%E8%A8%88%E7%AE%97">億マス計算</h4><p>そこで今回は二分探索を使う下記問題を解いていく</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://atcoder.jp/contests/arc037/tasks/arc037_c"><div class="kg-bookmark-content"><div class="kg-bookmark-title">C - 億マス計算</div><div class="kg-bookmark-description">AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://img.atcoder.jp/assets/atcoder.png" alt="二分探索の応用"><span class="kg-bookmark-author">AtCoder</span><span class="kg-bookmark-publisher">AtCoder Inc.</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://img.atcoder.jp/assets/atcoder.png" alt="二分探索の応用"/></div></a></figure><p/><p>愚直に2重ループで解くと</p><p>O(N²)になるため、時間が足りなくなる</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/8cc33e0f1eb035b878db003b0779a71b"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-binary_search_2</div><div class="kg-bookmark-description">blog-binary_search_2. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="二分探索の応用"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="二分探索の応用"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-c">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

int main() {

  int N, M;
  cin &gt;&gt; N &gt;&gt; M;
  vector&lt;long long&gt; a(N);
  vector&lt;long long&gt; b(N);
  vector&lt;long long&gt; r(N * N);

  for (int i = 0; i &lt; N; ++i) {
    cin &gt;&gt; a[i];
  }
  for (int i = 0; i &lt; N; ++i) {
    cin &gt;&gt; b[i];
  }

  int ind = 0;
  // O(N)
  for (int i = 0; i &lt; N; ++i) {
    // O(N)
    for (int j = 0; j &lt; N; ++j) {
      r[ind] = a[i] * b[j];
      ind++;
    }
  }
  // O(log_N^2)
  sort(r.begin(), r.end());
  cout

</code></pre>
<!--kg-card-end: markdown--><p>これを 二分探索 in 二分探索でとくと</p><p>O(log_(MAX(A)*MAX(B))*N*log_N)</p><p>で解けるようになる。</p><p>今回、 <code>std:upper_bound を使う。</code></p><p>これは、指定した数よりも大きい最初のイテレータを返す。これを使用し、x以下の個数を求めることができる。</p><p>※内部で二分探索を使用している</p><blockquote><em>詳細はこちら </em><a href="https://cpprefjp.github.io/reference/algorithm/upper_bound.html" rel="nofollow noopener noopener"><em>https://cpprefjp.github.io/reference/algorithm/upper_bound.html</em></a></blockquote><p>std:upper_bound とstd:lower_boundの使い方は下記がわかりやすい</p><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/ganyariya/items/33f1326154b85db465c3"><div class="kg-bookmark-content"><div class="kg-bookmark-title">lower_boundとupper_boundの使い方 - Qiita</div><div class="kg-bookmark-description">1.lower_boundとupper_bound lower_boundとupper_boundはC++のSTLライブラリの関数なのじゃ… 俗に言う二分探索に似たやつなのじゃ… 違いとしては lower_boundは...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png" alt="二分探索の応用"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">ganyariya</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1iRzkzWlhKZlltOTFibVRqZ2FoMWNIQmxjbDlpYjNWdVpPT0JydVM5di1PQmhPYVd1USZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz0wYmQzOTVjYjVmM2RiMDI1NTE4MWRlYTVjOTBjY2VkYQ&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RR2RoYm5saGNtbDVZUSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTI2OGQ5YzdmODQyNTRiZTdlMmVkNjYzMzQxZjkyZDJi&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;1cfe7c9b2e2e53217e7d3758970d013c" alt="二分探索の応用"/></div></a></figure><p/><p>考え方ざっくり</p><ul><li>掛け算した結果をもとに二分探索する(外側)</li><li>↑の結果をa[i]で割った数値以下の数値を二分探索で探し、カウントする</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/01db8a05584db938eb8e2e9f52e4e743"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-binary_search</div><div class="kg-bookmark-description">blog-binary_search. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="二分探索の応用"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="二分探索の応用"/></div></a></figure><p/><!--kg-card-begin: markdown--><pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
 
using namespace std;
 
const long long INF = 1LL &lt;&lt; 60;
int main() {
 
  int N, M;
  cin &gt;&gt; N &gt;&gt; M;
  vector&lt;long long&gt; a(N);
  vector&lt;long long&gt; b(N);
 
  for (int i = 0; i &lt; N; ++i) {
    cin &gt;&gt; a[i];
  }
  for (int i = 0; i &lt; N; ++i) {
    cin &gt;&gt; b[i];
  }
  // O(log_N)
  sort(b.begin(), b.end());
 
  long long left = 0;
  long long right = INF;
 
  // O(log_(MAX(A)*MAX(B)))
  while (right - left &gt; 1) {
    long long mid = (right + left) / 2;
    long long cnt = 0;
    // O(N)
    for (int i = 0; i &lt; N; ++i) {
      // O(log_N)
      cnt += upper_bound(b.begin(), b.end(), mid / a[i]) - b.begin();
    }
    if (cnt &gt;= M) {
      right = mid;
    } else {
      left = mid;
    }
  }
 
  cout &lt;&lt; right &lt;&lt; endl;
}
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Golangのスライス確認]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

今回のブログはプルリクでもらったあるコメントが、勉強するきっかけになったお話です。

私が書いたコードがこちら

a2 := func() *string { s := "sample"; return &s }()
fmt.Printf("%#v %#v \n", a2, *a2)

出力結果）
(*string)(0xc000051360) "sample"


弊社のUくんがコメントで教えてくれたのがこちら

a := &[]string{"sample"}[0] 
fmt.Printf("%#v %#v \n", a, *a)

出力結果）  
(*string)(0xc000051330) "sample"


別々に実行しているのでアドレスは違いますが、目的のポインターは取得できています。どっちでもできるけど好みですーとのこと。

いつもは、なるほど！で終わってますが、ゼロ値、nilスライス、空スライスについて確認してみました。

・intの変数定義はゼロで初期化されますよね

var i int  
fmt.P]]></description><link>https://tech.anti-pattern.co.jp/golangnosuraisuque-ren/</link><guid isPermaLink="false">Ghost__Post__61013b543986b000013a3e5b</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Tue, 15 Jun 2021 11:12:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/29791364_1246754985456610_5906763196705800192_n.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/29791364_1246754985456610_5906763196705800192_n.jpg" alt="Golangのスライス確認"/><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>今回のブログはプルリクでもらったあるコメントが、勉強するきっかけになったお話です。</p>
<p>私が書いたコードがこちら</p>
<pre><code class="language-go:sample">a2 := func() *string { s := &quot;sample&quot;; return &amp;s }()
fmt.Printf(&quot;%#v %#v \n&quot;, a2, *a2)

出力結果）
(*string)(0xc000051360) &quot;sample&quot;
</code></pre>
<p>弊社のUくんがコメントで教えてくれたのがこちら</p>
<pre><code class="language-go:sample">a := &amp;[]string{&quot;sample&quot;}[0] 
fmt.Printf(&quot;%#v %#v \n&quot;, a, *a)

出力結果）  
(*string)(0xc000051330) &quot;sample&quot;
</code></pre>
<p>別々に実行しているのでアドレスは違いますが、目的のポインターは取得できています。どっちでもできるけど好みですーとのこと。</p>
<p>いつもは、なるほど！で終わってますが、ゼロ値、nilスライス、空スライスについて確認してみました。</p>
<p>・intの変数定義はゼロで初期化されますよね</p>
<pre><code class="language-go:sample">var i int  
fmt.Printf(&quot;%#v \n&quot;, i)

出力結果）  
0
</code></pre>
<p>・int配列は、長さ分ゼロが設定された配列となります</p>
<pre><code class="language-go:sample">var array [1]int  
fmt.Printf(&quot;%d %d %#v \n&quot;, len(array), cap(array), array)

出力結果)  
1 1 [1]int{0}array2 := [1]int{}  
fmt.Printf(&quot;%d %d %#v \n&quot;, len(array2), cap(array2), array2)

出力結果)  
1 1 [1]int{0}`
</code></pre>
<p>・intスライスはnilスライスと空スライスとなります</p>
<pre><code class="language-go:sample">var slice1 []int  
fmt.Printf(&quot;%d %d %#v \n&quot;, len(slice1), cap(slice1), slice1)

出力結果)  
0 0 []int(nil)slice2 := make([]int, 0)  
fmt.Printf(&quot;%d %d %#v \n&quot;, len(slice2), cap(slice2), slice2)

出力結果)  
0 0 []int{}
</code></pre>
<p>普段nilスライスは意識して使ってませんでした。</p>
<p>Golangのwikiで確認してみると、機能的には同等だが、nilスライスを推奨と書かれてました。</p>
<blockquote>
<p>The former declares a nil slice value, while the latter is non-nil but zero-length. They are functionally equivalent — their <code>len</code> and <code>cap</code> are both zero—but the nil slice is the preferred style.</p>
</blockquote>
<p>知らない事いっぱいあるなーと思ったのと、Uくんキッカケ作ってくれてありがとう！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[【Vuetify】v-carouselのProps７種を検証してみた。]]></title><description><![CDATA[ンポーネントの中でも利用したことのない「Carousel」について、色々と検証したことを書いていこうと思います。

v-carouselとは
主に、複数の画像やコンテンツを一つのスライド内で指定した間隔で順番に表示してくれるコンポーネントです。Webサイトのトップに配置して、おすすめのコンテンツを表示するのに使われているのを見たことがあります。

Propsを7種を検証してみる
Vuetifyの公式APIを確認してみると、v-carouselのPropsは結構ありますが、Props全てにサンプルが用意されていません。実際に業務で使うことがなければ、どんな挙動をするのかわからないので、いくつかのPropsの挙動を検証してみたいと思います。

v-carousel APIAPI for the v-carousel component.Vuetify
[https://vuetifyjs.com/ja/api/v-carousel/]
カルーセル・コンポーネントカルーセルコンポーネントは、テキストや画像のスライドなどの視覚的なコンテンツを循環表示させるために使用されます。Vuetify
[]]></description><link>https://tech.anti-pattern.co.jp/vuetify-v-carouselnoprops7zhong-wojian-zheng-sitemita/</link><guid isPermaLink="false">Ghost__Post__610a18423986b000013a4e43</guid><dc:creator><![CDATA[Yasuhiro Takahashi]]></dc:creator><pubDate>Thu, 03 Jun 2021 03:00:00 GMT</pubDate><content:encoded><![CDATA[<p>ンポーネントの中でも利用したことのない「Carousel」について、色々と検証したことを書いていこうと思います。</p><h3 id="v-carousel%E3%81%A8%E3%81%AF">v-carouselとは</h3><p>主に、複数の画像やコンテンツを一つのスライド内で指定した間隔で順番に表示してくれるコンポーネントです。Webサイトのトップに配置して、おすすめのコンテンツを表示するのに使われているのを見たことがあります。</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_QWpMbxz" src="https://codepen.io/yasuhirotakahashi/embed/preview/QWpMbxz?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=QWpMbxz" title="carousel sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/></figure><h4 id="props%E3%82%927%E7%A8%AE%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">Propsを7種を検証してみる</h4><p>Vuetifyの公式APIを確認してみると、v-carouselのPropsは結構ありますが、Props全てにサンプルが用意されていません。実際に業務で使うことがなければ、どんな挙動をするのかわからないので、いくつかのPropsの挙動を検証してみたいと思います。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/api/v-carousel/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">v-carousel API</div><div class="kg-bookmark-description">API for the v-carousel component.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/components/carousels/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">カルーセル・コンポーネント</div><div class="kg-bookmark-description">カルーセルコンポーネントは、テキストや画像のスライドなどの視覚的なコンテンツを循環表示させるために使用されます。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><h3 id="mandatory"><strong>mandatory</strong></h3><p>公式のAPIでは、Descriptionの欄に説明がありません。翻訳してみると「必須の」という意味でした。defaultでtrueなのでfalseにすると初期表示が空のコンテンツ（何もコンテンツがない状態）が表示されます。シンプルな機能なため、説明がなかったのかなと思います。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_MWpvwxg" src="https://codepen.io/yasuhirotakahashi/embed/preview/MWpvwxg?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=MWpvwxg" title="Carousel mandatory sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>初期表示で何も表示されない</figcaption></figure><h3 id="reverse-function reverse() { [native code] }1"><strong>reverse</strong></h3><p>コンテンツのスライド方向が逆になります。通常のスライド方向に慣れてしまうと少し違和感がありますね。</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_OJpjMpM" src="https://codepen.io/yasuhirotakahashi/embed/preview/OJpjMpM?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=OJpjMpM" title="Carousel reverse sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/></figure><h3 id="next-icon-prev-icon"><strong>next-icon, prev-icon</strong></h3><p>次のコンテンツ、前のコンテンツに移動するためのボタンのアイコンを変更できます。<code>v-slot:prev</code> を利用すればより自由にカスタマイズできますが、アイコンだけ変えたい時に便利ですね。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_OJpjMpM" src="https://codepen.io/yasuhirotakahashi/embed/preview/OJpjMpM?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=OJpjMpM" title="Carousel reverse sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>前へボタン：mdi-arrow-left-thick、次へボタン：mdi-arrow-right-bold-circle-outlineを指定</figcaption></figure><h3 id="progress-progress-color">progress, progress-color</h3><p>用意されているコンテンツの数を100%したときに、現時点で表示されているコンテンツは何％目であるかを表現してくれるバーが追加されます。デリミターを非表示の際に、残りコンテンツがどれくらい残っているか表現することに使えるかなと思います。progress-colorは指定した色にバーの色が変化します。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_JjWyGQg" src="https://codepen.io/yasuhirotakahashi/embed/preview/JjWyGQg?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=JjWyGQg" title="Carousel progress sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>コンテンツが次に移る際に、バーが変化している</figcaption></figure><h3 id="vertical-delimiters">vertical-delimiters</h3><p>指定すると、デリミターが画面左端の縦方向に配置されます。公式APIを確認すると、vertical-delimitersに渡せる値のtypeがstringとなっているのですが、説明部分には特に指定できる文字列の記載がありませんでした。そこで、公式のGitHubを覗きに行くと、、、指定できる文字列を見つけました！、どうやら、leftとrightを指定できるみたいです。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/vuetifyjs/vuetify/blob/18c2d6ce95978cd2b75a6eaace45141deaa7dbad/packages/vuetify/src/components/VCarousel/VCarousel.ts#L58"><div class="kg-bookmark-content"><div class="kg-bookmark-title">vuetify/VCarousel.ts at 18c2d6ce95978cd2b75a6eaace45141deaa7dbad · vuetifyjs/vuetify</div><div class="kg-bookmark-description">🐉 Material Component Framework for Vue. Contribute to vuetifyjs/vuetify development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">vuetifyjs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/67962648/806bc000-1f97-11eb-8cec-f5185cc34c00"/></div></a></figure><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_QWpMNNr" src="https://codepen.io/yasuhirotakahashi/embed/preview/QWpMNNr?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=QWpMNNr" title="Carousel vertical-delimiters sample" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>rightを指定すると、右側に配置される</figcaption></figure><p>以上が、v-carouselのPropsでどのようなことができるのか検証した結果になります。</p><p>今回は公式のGitHubのソースを直接見てみましたが、説明されていない機能を見つけられるという事があったりと、直接ソースを確認するのはVuetifyの理解を深めるにはとても良い手段だと感じました。</p><p>VuetifyのUIコンポーネントはまだまだあるので、今後もやってみようかなと思います</p>]]></content:encoded></item><item><title><![CDATA[XormのBulk Insertの速度改善]]></title><description><![CDATA[XormのBulk Insert（一括登録）で、件数が多い場合に遅くなったので色々試して速くしました。

過去にもXormの記事を書いているので、よろしければどうぞ。

GolangのORM、Xormの使い方ざっくりまとめ
最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。
自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。 環境 * Go : 1.13.1 * Xorm :
0.7.9 * PostgreSQL : 11.6 使用するテーブルcreate table users( id BIGSERIAL, first_name
VARCHAR(20) NOT NULL, last_nameVARCHAR(20) NOT …Anti-Pattern Inc. Engineering
BlogYu Takahashi [https://tech.anti-pattern.co.jp/xorm/]
Xormで複雑な]]></description><link>https://tech.anti-pattern.co.jp/xorm-bulk-insert/</link><guid isPermaLink="false">Ghost__Post__610403d03986b000013a4580</guid><category><![CDATA[Xorm]]></category><category><![CDATA[PostgreSQL]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sat, 29 May 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>XormのBulk Insert（一括登録）で、件数が多い場合に遅くなったので色々試して速くしました。</p>
<p>過去にもXormの記事を書いているので、よろしければどうぞ。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/xorm/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GolangのORM、Xormの使い方ざっくりまとめ</div><div class="kg-bookmark-description">最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。 自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。 環境 * Go : 1.13.1 * Xorm : 0.7.9 * PostgreSQL : 11.6 使用するテーブルcreate table users( id BIGSERIAL, first_name VARCHAR(20) NOT NULL, last_nameVARCHAR(20) NOT …</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Yu Takahashi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/xormdefu-za-nasqlwoshi-xing-suru/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Xormで複雑なSQLを実行する</div><div class="kg-bookmark-description">以前、基本的な使い方をまとめた記事を書きましたが、もう少し複雑なことをしたくなって色々試したので、まとめておきます。 GolangのORM、Xormの使い方ざっくりまとめ最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。anti-pattern-engineeringYu Takahashi[https://medium.com/anti-pattern-engineering/golang%E3%81%AEorm-xorm%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%BE%E3%81%A8%E3%82%81-744f55c3115d…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Yu Takahashi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>Golang : 1.15.8</li>
<li>Xorm : 0.8.2</li>
<li>PostgreSQL : 13.2</li>
</ul>
<p>以下のテーブルの<code>users</code> だけ使います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672078" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-table" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-table-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-table-LC1" class="blob-code blob-code-inner js-file-line">create table users(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-table-LC2" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-table-LC3" class="blob-code blob-code-inner js-file-line">    first_name VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-table-LC4" class="blob-code blob-code-inner js-file-line">    last_name  VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-table-LC5" class="blob-code blob-code-inner js-file-line">    first_name_kana VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-table-LC6" class="blob-code blob-code-inner js-file-line">    last_name_kana  VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-table-LC7" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-table-LC8" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-table-LC9" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-table-LC10" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-table-LC11" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-table-LC12" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-table-LC13" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-table-LC14" class="blob-code blob-code-inner js-file-line">create table friends(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-table-LC15" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-table-LC16" class="blob-code blob-code-inner js-file-line">    user_id    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-table-LC17" class="blob-code blob-code-inner js-file-line">    friend_id  BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-table-LC18" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-table-LC19" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-table-LC20" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-table-LC21" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-table-LC22" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-table-LC23" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (user_id) REFERENCES users (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-table-LC24" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (friend_id) REFERENCES users (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-table-LC25" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888/raw/6e33d4b70a32903c250790a3b71d9cd72a2e16ea/go-xorm-table" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888#file-go-xorm-table">go-xorm-table</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="%E9%80%9A%E5%B8%B8%E3%81%AE-insert">通常の Insert</h2>
<p>普通にinsertするとこんな感じです。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/555059f4f8b12de0bfacc6c13772c031.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108654695" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;time&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert-go-LC7" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert-go-LC8" class="blob-code blob-code-inner js-file-line">	_ <span class="pl-s">&quot;github.com/lib/pq&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;xorm.io/core&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;xorm.io/xorm&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert-go-LC11" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert-go-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">xorm</span>.<span class="pl-en">NewEngine</span>(<span class="pl-s">&quot;postgres&quot;</span>, <span class="pl-s">&quot;postgres://user:password@db/database?sslmode=disable&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert-go-LC16" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert-go-LC17" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert-go-LC18" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">engine</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert-go-LC20" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">ShowSQL</span>(<span class="pl-c1">true</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">SetMapper</span>(core.<span class="pl-smi">GonicMapper</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert-go-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">const</span> <span class="pl-s1">count</span> <span class="pl-c1">=</span> <span class="pl-c1">10</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert-go-LC24" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">us</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">user</span>, <span class="pl-c1">0</span>, <span class="pl-s1">count</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert-go-LC25" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">count</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert-go-LC26" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">us</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">us</span>, <span class="pl-smi">user</span>{</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert-go-LC27" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstName</span>:     <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;太郎%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert-go-LC28" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastName</span>:      <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm_bulk_insert-go-LC29" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstNameKana</span>: <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;タロウ%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-xorm_bulk_insert-go-LC30" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastNameKana</span>:  <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-xorm_bulk_insert-go-LC31" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-xorm_bulk_insert-go-LC32" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-xorm_bulk_insert-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">err</span> <span class="pl-c1">=</span> <span class="pl-en">insert</span>(<span class="pl-s1">engine</span>, <span class="pl-s1">us</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-xorm_bulk_insert-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-xorm_bulk_insert-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">Unscoped</span>().<span class="pl-en">Where</span>(<span class="pl-s">&quot;id &gt; ?&quot;</span>, <span class="pl-c1">0</span>).<span class="pl-en">Delete</span>(<span class="pl-smi">user</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-xorm_bulk_insert-go-LC36" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-xorm_bulk_insert-go-LC37" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-xorm_bulk_insert-go-LC38" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">user</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-xorm_bulk_insert-go-LC39" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">ID</span>            <span class="pl-smi">uint64</span> <span class="pl-s">`xorm:&quot;autoincr&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-xorm_bulk_insert-go-LC40" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">FirstName</span>     <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-xorm_bulk_insert-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">LastName</span>      <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-xorm_bulk_insert-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">FirstNameKana</span> <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-xorm_bulk_insert-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">LastNameKana</span>  <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-xorm_bulk_insert-go-LC44" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Version</span>       <span class="pl-smi">uint64</span>    <span class="pl-s">`xorm:&quot;version&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-xorm_bulk_insert-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">CreatedAt</span>     time.<span class="pl-smi">Time</span> <span class="pl-s">`xorm:&quot;created&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-xorm_bulk_insert-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">UpdatedAt</span>     time.<span class="pl-smi">Time</span> <span class="pl-s">`xorm:&quot;updated&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-xorm_bulk_insert-go-LC47" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">DeletedAt</span>     time.<span class="pl-smi">Time</span> <span class="pl-s">`xorm:&quot;deleted&quot;`</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-xorm_bulk_insert-go-LC48" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-xorm_bulk_insert-go-LC49" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-xorm_bulk_insert-go-LC50" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-smi">user</span>) <span class="pl-en">TableName</span>() <span class="pl-smi">string</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-xorm_bulk_insert-go-LC51" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s">&quot;users&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-xorm_bulk_insert-go-LC52" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-xorm_bulk_insert-go-LC53" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-xorm_bulk_insert-go-LC54" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">insert</span>(<span class="pl-s1">db</span> xorm.<span class="pl-smi">Interface</span>, <span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-xorm_bulk_insert-go-LC55" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">db</span>.<span class="pl-en">Insert</span>(<span class="pl-c1">&amp;</span><span class="pl-s1">us</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-xorm_bulk_insert-go-LC56" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-xorm_bulk_insert-go-LC57" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/555059f4f8b12de0bfacc6c13772c031/raw/0990dba71ac06eadaf5c4075cd9c110f6dbd9472/xorm_bulk_insert.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/555059f4f8b12de0bfacc6c13772c031#file-xorm_bulk_insert-go">xorm_bulk_insert.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>通常の<code>Insert</code> メソッドについて、件数を変えてベンチマークを取ってみます。あとで使いまわすので<code>base</code> 関数で共通化しています。DBに繋ぐテストのため、DBの性能によっても結果は変わると思います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8d6a53eb285e0c639554e6808187fb27.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108672950" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_test-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_test-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_test-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_test-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_test-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_test-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;testing&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_test-go-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_test-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;xorm.io/core&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_test-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;xorm.io/xorm&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_test-go-LC9" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_test-go-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_test-go-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">base</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>, <span class="pl-s1">insertCount</span> <span class="pl-smi">int</span>, <span class="pl-s1">fn</span> <span class="pl-k">func</span>(xorm.<span class="pl-smi">Interface</span>, <span class="pl-smi">users</span>) <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_test-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">us</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-smi">users</span>, <span class="pl-c1">0</span>, <span class="pl-s1">insertCount</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_test-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">insertCount</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_test-go-LC14" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">us</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">us</span>, <span class="pl-smi">user</span>{</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_test-go-LC15" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstName</span>:     <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;太郎+%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_test-go-LC16" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastName</span>:      <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト+%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_test-go-LC17" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstNameKana</span>: <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;タロウ+%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_test-go-LC18" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastNameKana</span>:  <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト+%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_test-go-LC19" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert_test-go-LC20" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert_test-go-LC21" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert_test-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">xorm</span>.<span class="pl-en">NewEngine</span>(<span class="pl-s">&quot;postgres&quot;</span>, <span class="pl-s">&quot;postgres://user:password@db/database?sslmode=disable&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert_test-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert_test-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert_test-go-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert_test-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">engine</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert_test-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">SetMapper</span>(core.<span class="pl-smi">GonicMapper</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert_test-go-LC28" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">b</span>.<span class="pl-en">ResetTimer</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm_bulk_insert_test-go-LC29" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">b</span>.<span class="pl-c1">N</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-xorm_bulk_insert_test-go-LC30" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">b</span>.<span class="pl-en">StartTimer</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-xorm_bulk_insert_test-go-LC31" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">engine</span>.<span class="pl-en">Transaction</span>(<span class="pl-k">func</span>(<span class="pl-s1">tx</span> <span class="pl-c1">*</span>xorm.<span class="pl-smi">Session</span>) (<span class="pl-k">interface</span>{}, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-xorm_bulk_insert_test-go-LC32" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">fn</span>(<span class="pl-s1">tx</span>, <span class="pl-s1">us</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-xorm_bulk_insert_test-go-LC33" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-xorm_bulk_insert_test-go-LC34" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-xorm_bulk_insert_test-go-LC35" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-xorm_bulk_insert_test-go-LC36" class="blob-code blob-code-inner js-file-line">			<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-xorm_bulk_insert_test-go-LC37" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-xorm_bulk_insert_test-go-LC38" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">b</span>.<span class="pl-en">StopTimer</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-xorm_bulk_insert_test-go-LC39" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">engine</span>.<span class="pl-en">Unscoped</span>().<span class="pl-en">Where</span>(<span class="pl-s">&quot;id &gt; ?&quot;</span>, <span class="pl-c1">0</span>).<span class="pl-en">Delete</span>(<span class="pl-smi">user</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-xorm_bulk_insert_test-go-LC40" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-xorm_bulk_insert_test-go-LC41" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-xorm_bulk_insert_test-go-LC42" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-xorm_bulk_insert_test-go-LC43" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_insert_1</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-xorm_bulk_insert_test-go-LC44" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1</span>, <span class="pl-s1">insert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-xorm_bulk_insert_test-go-LC45" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-xorm_bulk_insert_test-go-LC46" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-xorm_bulk_insert_test-go-LC47" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_insert_10</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-xorm_bulk_insert_test-go-LC48" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">10</span>, <span class="pl-s1">insert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-xorm_bulk_insert_test-go-LC49" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-xorm_bulk_insert_test-go-LC50" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-xorm_bulk_insert_test-go-LC51" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_insert_100</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-xorm_bulk_insert_test-go-LC52" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">100</span>, <span class="pl-s1">insert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-xorm_bulk_insert_test-go-LC53" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-xorm_bulk_insert_test-go-LC54" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-xorm_bulk_insert_test-go-LC55" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_insert_1000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-xorm_bulk_insert_test-go-LC56" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1000</span>, <span class="pl-s1">insert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-xorm_bulk_insert_test-go-LC57" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8d6a53eb285e0c639554e6808187fb27/raw/5d891f982b4e5474060f826f33c142e1964b5bbe/xorm_bulk_insert_test.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8d6a53eb285e0c639554e6808187fb27#file-xorm_bulk_insert_test-go">xorm_bulk_insert_test.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.27.37.png" alt="----------2022-05-11-10.27.37" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.27.49.png" alt="----------2022-05-11-10.27.49" loading="lazy"/></p>
<p>1,000件のinsertで約1.5秒かかっています。100件が0.025秒であることを考えると、だいぶ遅いように見えます。</p>
<h2 id="100%E4%BB%B6%E3%81%94%E3%81%A8%E3%81%AB%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B">100件ごとに分割する</h2>
<p>100件が0.025秒なら、1,000件を100件 × 10回のinsertに分割することで速くなるのでは？と思い試してみました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8b7972032b67045ad44aec0754923e42.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673038" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_2-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_2-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">splitInsert</span>(<span class="pl-s1">db</span> xorm.<span class="pl-smi">Interface</span>, <span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_2-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">const</span> <span class="pl-s1">limit</span> <span class="pl-c1">=</span> <span class="pl-c1">100</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_2-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">start</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">us</span>.<span class="pl-en">Len</span>(); <span class="pl-s1">start</span> <span class="pl-c1">+=</span> <span class="pl-s1">limit</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_2-go-LC4" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">end</span> <span class="pl-c1">:=</span> <span class="pl-s1">start</span> <span class="pl-c1">+</span> <span class="pl-s1">limit</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_2-go-LC5" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">end</span> <span class="pl-c1">&gt;</span> <span class="pl-s1">us</span>.<span class="pl-en">Len</span>() {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_2-go-LC6" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">end</span> <span class="pl-c1">=</span> <span class="pl-s1">us</span>.<span class="pl-en">Len</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_2-go-LC7" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_2-go-LC8" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">target</span> <span class="pl-c1">:=</span> <span class="pl-s1">us</span>[<span class="pl-s1">start</span>:<span class="pl-s1">end</span>]</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_2-go-LC9" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">db</span>.<span class="pl-en">Insert</span>(<span class="pl-c1">&amp;</span><span class="pl-s1">target</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_2-go-LC10" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_2-go-LC11" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_2-go-LC12" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_2-go-LC13" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_2-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_2-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_2-go-LC15" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8b7972032b67045ad44aec0754923e42/raw/c3119be74d32e4a3e53dae19e75037b215a78849/xorm_bulk_insert_2.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8b7972032b67045ad44aec0754923e42#file-xorm_bulk_insert_2-go">xorm_bulk_insert_2.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8f2ba7001c2e15c014bd9ccc3268f868.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673168" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_test_2-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_splitInsert_1</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1</span>, <span class="pl-s1">splitInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC3" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC4" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_splitInsert_10</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">10</span>, <span class="pl-s1">splitInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC7" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_splitInsert_100</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">100</span>, <span class="pl-s1">splitInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC11" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_splitInsert_1000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1000</span>, <span class="pl-s1">splitInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC15" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_splitInsert_10000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">10000</span>, <span class="pl-s1">splitInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_2-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_test_2-go-LC19" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8f2ba7001c2e15c014bd9ccc3268f868/raw/b9df923294954bd66d41762d8c3003a2570d511f/xorm_bulk_insert_test_2.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8f2ba7001c2e15c014bd9ccc3268f868#file-xorm_bulk_insert_test_2-go">xorm_bulk_insert_test_2.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.29.18.png" alt="----------2022-05-11-10.29.18" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.29.32.png" alt="----------2022-05-11-10.29.32" loading="lazy"/></p>
<p>期待通り、<code>1,000件の速度 ≒ 100件の速度 × 10</code> になりました。この修正は手軽にできて効果もありますが、10,000件になると約2.4秒となり、少し気になってきます。できればもう少し速くしたいです。</p>
<h2 id="%E8%87%AA%E5%88%86%E3%81%A7sql%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B">自分でSQLを構築する</h2>
<p>Xorm の力を極力借りず、自分で構築していきます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/1e2de3019e0fb2e28dabf786dedb386e.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673386" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_3-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_3-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">bulkInserter</span> <span class="pl-k">interface</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_3-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">TableName</span>() <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_3-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Args</span>(<span class="pl-smi">int</span>) []<span class="pl-k">interface</span>{}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_3-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Columns</span>() <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_3-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Values</span>() <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_3-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">Len</span>() <span class="pl-smi">int</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_3-go-LC7" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_3-go-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_3-go-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-s1">pqArgLimit</span> <span class="pl-c1">=</span> <span class="pl-c1">65535</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_3-go-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_3-go-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">config</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_3-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">returningColumns</span> []<span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_3-go-LC13" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_3-go-LC14" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_3-go-LC15" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">Option</span> <span class="pl-k">func</span>(<span class="pl-c1">*</span><span class="pl-smi">config</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_3-go-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_3-go-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Returning</span>(<span class="pl-s1">columns</span> <span class="pl-c1">...</span><span class="pl-smi">string</span>) <span class="pl-smi">Option</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_3-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-k">func</span>(<span class="pl-s1">c</span> <span class="pl-c1">*</span><span class="pl-smi">config</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_3-go-LC19" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span> <span class="pl-c1">=</span> <span class="pl-s1">columns</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert_3-go-LC20" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert_3-go-LC21" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert_3-go-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert_3-go-LC23" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">BulkInsert</span>(<span class="pl-s1">db</span> xorm.<span class="pl-smi">Interface</span>, <span class="pl-s1">inserter</span> <span class="pl-smi">bulkInserter</span>, <span class="pl-s1">options</span> <span class="pl-c1">...</span><span class="pl-smi">Option</span>) ([]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert_3-go-LC24" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">insertCount</span> <span class="pl-c1">:=</span> <span class="pl-s1">inserter</span>.<span class="pl-en">Len</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert_3-go-LC25" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">insertCount</span> <span class="pl-c1">==</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert_3-go-LC26" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert_3-go-LC27" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert_3-go-LC28" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">c</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span><span class="pl-smi">config</span>{}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm_bulk_insert_3-go-LC29" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">opt</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">options</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-xorm_bulk_insert_3-go-LC30" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">opt</span>(<span class="pl-s1">c</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-xorm_bulk_insert_3-go-LC31" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-xorm_bulk_insert_3-go-LC32" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">results</span> []<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-xorm_bulk_insert_3-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">returning</span> <span class="pl-c1">:=</span> <span class="pl-s">&quot;&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-xorm_bulk_insert_3-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// RETURNING を使用する場合はSQLと返却値を用意する</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-xorm_bulk_insert_3-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-xorm_bulk_insert_3-go-LC36" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">returning</span> <span class="pl-c1">=</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot; RETURNING %s&quot;</span>, <span class="pl-s1">strings</span>.<span class="pl-en">Join</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>, <span class="pl-s">&quot;, &quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-xorm_bulk_insert_3-go-LC37" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">results</span> <span class="pl-c1">=</span> <span class="pl-en">make</span>([]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span>, <span class="pl-c1">0</span>, <span class="pl-s1">insertCount</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-xorm_bulk_insert_3-go-LC38" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-xorm_bulk_insert_3-go-LC39" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">valuesString</span> <span class="pl-c1">:=</span> <span class="pl-s1">inserter</span>.<span class="pl-en">Values</span>() <span class="pl-c1">+</span> <span class="pl-s">&quot;,&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-xorm_bulk_insert_3-go-LC40" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">argCount</span> <span class="pl-c1">:=</span> <span class="pl-en">len</span>(<span class="pl-s1">inserter</span>.<span class="pl-en">Args</span>(<span class="pl-c1">0</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-xorm_bulk_insert_3-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// &quot;github.com/lib/pq&quot; の引数の上限を超えないよう分割する</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-xorm_bulk_insert_3-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">insertLimit</span> <span class="pl-c1">:=</span> <span class="pl-s1">pqArgLimit</span><span class="pl-c1">/</span><span class="pl-s1">argCount</span> <span class="pl-c1">-</span> <span class="pl-c1">1</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-xorm_bulk_insert_3-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">start</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">insertCount</span>; <span class="pl-s1">start</span> <span class="pl-c1">+=</span> <span class="pl-s1">insertLimit</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-xorm_bulk_insert_3-go-LC44" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">end</span> <span class="pl-c1">:=</span> <span class="pl-s1">start</span> <span class="pl-c1">+</span> <span class="pl-s1">insertLimit</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-xorm_bulk_insert_3-go-LC45" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">end</span> <span class="pl-c1">&gt;</span> <span class="pl-s1">insertCount</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-xorm_bulk_insert_3-go-LC46" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">end</span> <span class="pl-c1">=</span> <span class="pl-s1">insertCount</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-xorm_bulk_insert_3-go-LC47" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-xorm_bulk_insert_3-go-LC48" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-xorm_bulk_insert_3-go-LC49" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">var</span> <span class="pl-s1">values</span> strings.<span class="pl-smi">Builder</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-xorm_bulk_insert_3-go-LC50" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">values</span>.<span class="pl-en">Grow</span>(<span class="pl-en">len</span>([]<span class="pl-smi">byte</span>(<span class="pl-s1">valuesString</span>)) <span class="pl-c1">*</span> (<span class="pl-s1">end</span> <span class="pl-c1">-</span> <span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-xorm_bulk_insert_3-go-LC51" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">args</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-k">interface</span>{}, <span class="pl-c1">0</span>, (<span class="pl-s1">end</span><span class="pl-c1">-</span><span class="pl-s1">start</span>)<span class="pl-c1">*</span><span class="pl-s1">argCount</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-xorm_bulk_insert_3-go-LC52" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-s1">start</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">end</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-xorm_bulk_insert_3-go-LC53" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">args</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">args</span>, <span class="pl-s1">inserter</span>.<span class="pl-en">Args</span>(<span class="pl-s1">i</span>)<span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-xorm_bulk_insert_3-go-LC54" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">values</span>.<span class="pl-en">WriteString</span>(<span class="pl-s1">valuesString</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-xorm_bulk_insert_3-go-LC55" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-xorm_bulk_insert_3-go-LC56" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">sql</span> <span class="pl-c1">:=</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-xorm_bulk_insert_3-go-LC57" class="blob-code blob-code-inner js-file-line">			<span class="pl-s">&quot;INSERT INTO %s (%s) VALUES %s%s&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-xorm_bulk_insert_3-go-LC58" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">inserter</span>.<span class="pl-en">TableName</span>(),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-xorm_bulk_insert_3-go-LC59" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">inserter</span>.<span class="pl-en">Columns</span>(),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-xorm_bulk_insert_3-go-LC60" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">strings</span>.<span class="pl-en">TrimRight</span>(<span class="pl-s1">values</span>.<span class="pl-en">String</span>(), <span class="pl-s">&quot;,&quot;</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-xorm_bulk_insert_3-go-LC61" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">returning</span>,</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-xorm_bulk_insert_3-go-LC62" class="blob-code blob-code-inner js-file-line">		)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-xorm_bulk_insert_3-go-LC63" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">result</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">db</span>.<span class="pl-en">QueryString</span>(<span class="pl-en">append</span>([]<span class="pl-k">interface</span>{}{<span class="pl-s1">sql</span>}, <span class="pl-s1">args</span><span class="pl-c1">...</span>)<span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-xorm_bulk_insert_3-go-LC64" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-xorm_bulk_insert_3-go-LC65" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-xorm_bulk_insert_3-go-LC66" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-xorm_bulk_insert_3-go-LC67" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-xorm_bulk_insert_3-go-LC68" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">results</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">results</span>, <span class="pl-s1">result</span><span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-xorm_bulk_insert_3-go-LC69" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-xorm_bulk_insert_3-go-LC70" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-xorm_bulk_insert_3-go-LC71" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-xorm_bulk_insert_3-go-LC72" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">results</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_3-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-xorm_bulk_insert_3-go-LC73" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/1e2de3019e0fb2e28dabf786dedb386e/raw/da62f534debbb76e92fa9b07dc537b03d4a0bfa1/xorm_bulk_insert_3.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/1e2de3019e0fb2e28dabf786dedb386e#file-xorm_bulk_insert_3-go">xorm_bulk_insert_3.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>以下のように使います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/e8466073551c3a431f334387add55aab.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673733" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_4-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_4-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_4-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">xorm</span>.<span class="pl-en">NewEngine</span>(<span class="pl-s">&quot;postgres&quot;</span>, <span class="pl-s">&quot;postgres://user:password@db/database?sslmode=disable&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_4-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_4-go-LC4" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_4-go-LC5" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_4-go-LC6" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_4-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">defer</span> <span class="pl-s1">engine</span>.<span class="pl-en">Close</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_4-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">ShowSQL</span>(<span class="pl-c1">true</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_4-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">SetMapper</span>(core.<span class="pl-smi">GonicMapper</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_4-go-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_4-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">const</span> <span class="pl-s1">count</span> <span class="pl-c1">=</span> <span class="pl-c1">20000</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_4-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">us</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-smi">users</span>, <span class="pl-c1">0</span>, <span class="pl-s1">count</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_4-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">count</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_4-go-LC14" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">us</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">us</span>, <span class="pl-smi">user</span>{</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_4-go-LC15" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstName</span>:     <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;太郎%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_4-go-LC16" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastName</span>:      <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_4-go-LC17" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">FirstNameKana</span>: <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;タロウ%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_4-go-LC18" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">LastNameKana</span>:  <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot;テスト%v&quot;</span>, <span class="pl-s1">i</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_4-go-LC19" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert_4-go-LC20" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert_4-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">result</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">BulkInsert</span>(<span class="pl-s1">engine</span>, <span class="pl-s1">us</span>, <span class="pl-en">Returning</span>(<span class="pl-s">&quot;id&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert_4-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert_4-go-LC23" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert_4-go-LC24" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert_4-go-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert_4-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">log</span>.<span class="pl-en">Println</span>(<span class="pl-s1">result</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert_4-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">engine</span>.<span class="pl-en">Unscoped</span>().<span class="pl-en">Where</span>(<span class="pl-s">&quot;id &gt; ?&quot;</span>, <span class="pl-c1">0</span>).<span class="pl-en">Delete</span>(<span class="pl-smi">user</span>{})</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert_4-go-LC28" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm_bulk_insert_4-go-LC29" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-xorm_bulk_insert_4-go-LC30" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">users</span> []<span class="pl-smi">user</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-xorm_bulk_insert_4-go-LC31" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-xorm_bulk_insert_4-go-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-smi">users</span>) <span class="pl-en">TableName</span>() <span class="pl-smi">string</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-xorm_bulk_insert_4-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s">&quot;users&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-xorm_bulk_insert_4-go-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-xorm_bulk_insert_4-go-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-xorm_bulk_insert_4-go-LC36" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-en">Len</span>() <span class="pl-smi">int</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-xorm_bulk_insert_4-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-en">len</span>(<span class="pl-s1">us</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-xorm_bulk_insert_4-go-LC38" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-xorm_bulk_insert_4-go-LC39" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-xorm_bulk_insert_4-go-LC40" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-en">Columns</span>() <span class="pl-smi">string</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-xorm_bulk_insert_4-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s">&quot;first_name,last_name,first_name_kana,last_name_kana,version&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-xorm_bulk_insert_4-go-LC42" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-xorm_bulk_insert_4-go-LC43" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-xorm_bulk_insert_4-go-LC44" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-en">Values</span>() <span class="pl-smi">string</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-xorm_bulk_insert_4-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s">&quot;(?,?,?,?,?)&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-xorm_bulk_insert_4-go-LC46" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-xorm_bulk_insert_4-go-LC47" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-xorm_bulk_insert_4-go-LC48" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-en">Args</span>(<span class="pl-s1">i</span> <span class="pl-smi">int</span>) []<span class="pl-k">interface</span>{} {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-xorm_bulk_insert_4-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> []<span class="pl-k">interface</span>{}{<span class="pl-s1">us</span>[<span class="pl-s1">i</span>].<span class="pl-c1">FirstName</span>, <span class="pl-s1">us</span>[<span class="pl-s1">i</span>].<span class="pl-c1">LastName</span>, <span class="pl-s1">us</span>[<span class="pl-s1">i</span>].<span class="pl-c1">FirstNameKana</span>, <span class="pl-s1">us</span>[<span class="pl-s1">i</span>].<span class="pl-c1">LastNameKana</span>, <span class="pl-c1">1</span>}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_4-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-xorm_bulk_insert_4-go-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/e8466073551c3a431f334387add55aab/raw/79343191e9582d612e2459638ae6e1ef675f00a4/xorm_bulk_insert_4.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/e8466073551c3a431f334387add55aab#file-xorm_bulk_insert_4-go">xorm_bulk_insert_4.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>user</code> 構造体のスライス<code>users</code> に以下のinterfaceを実装しています。このinterfaceを実装すると<code>BulkInsert</code> 関数に渡すことができます。</p>
<pre><code>type bulkInserter interface {  
    TableName() string  
    Args(int) []interface{}  
    Columns() string  
    Values() string  
    Len() int  
}
</code></pre>
<p>Xorm は内部で <a href="https://github.com/lib/pq">lib/pq</a> を使用しており、このライブラリでSQLにバインドできる引数の上限が 65535 となっているため、それを超えないように分割して処理しています。</p>
<p>オプションとして<code>RETURNING</code> 句をセットできるようにしているので、後続の処理でinsert結果のIDを使用したい時も使えます。オプションの実装に<a href="https://blog.web-apps.tech/go-functional-option-pattern/">Functional Option Pattern</a> を使用しているので、将来的な拡張もしやすいと思います。例えば<code>ON CONFLICT</code> 句を使いたくなったら以下のように拡張できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/9d713e3868cf96a761104ce75ae7ed19.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673988" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_5-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_5-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">config</span> <span class="pl-k">struct</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_5-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">returningColumns</span> []<span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_5-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-c1">onConflict</span>       <span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_5-go-LC4" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_5-go-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_5-go-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">type</span> <span class="pl-smi">Option</span> <span class="pl-k">func</span>(<span class="pl-c1">*</span><span class="pl-smi">config</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_5-go-LC7" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_5-go-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Returning</span>(<span class="pl-s1">columns</span> <span class="pl-c1">...</span><span class="pl-smi">string</span>) <span class="pl-smi">Option</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_5-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-k">func</span>(<span class="pl-s1">c</span> <span class="pl-c1">*</span><span class="pl-smi">config</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_5-go-LC10" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span> <span class="pl-c1">=</span> <span class="pl-s1">columns</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_5-go-LC11" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_5-go-LC12" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_5-go-LC13" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_5-go-LC14" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">OnConflict</span>(<span class="pl-s1">onConflict</span> <span class="pl-smi">string</span>) <span class="pl-smi">Option</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_5-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-k">func</span>(<span class="pl-s1">c</span> <span class="pl-c1">*</span><span class="pl-smi">config</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_5-go-LC16" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">c</span>.<span class="pl-c1">onConflict</span> <span class="pl-c1">=</span> <span class="pl-s1">onConflict</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_5-go-LC17" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_5-go-LC18" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_5-go-LC19" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert_5-go-LC20" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">c</span> <span class="pl-smi">config</span>) <span class="pl-en">optionalSQL</span>() <span class="pl-smi">string</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert_5-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">returning</span> <span class="pl-c1">:=</span> <span class="pl-s">&quot;&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert_5-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert_5-go-LC23" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">returning</span> <span class="pl-c1">=</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot; RETURNING %s&quot;</span>, <span class="pl-s1">strings</span>.<span class="pl-en">Join</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>, <span class="pl-s">&quot;,&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert_5-go-LC24" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert_5-go-LC25" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">onConflict</span> <span class="pl-c1">:=</span> <span class="pl-s">&quot;&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert_5-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">c</span>.<span class="pl-c1">onConflict</span> <span class="pl-c1">!=</span> <span class="pl-s">&quot;&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert_5-go-LC27" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">onConflict</span> <span class="pl-c1">=</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(<span class="pl-s">&quot; ON CONFLICT %s&quot;</span>, <span class="pl-s1">c</span>.<span class="pl-c1">onConflict</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert_5-go-LC28" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm_bulk_insert_5-go-LC29" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">onConflict</span> <span class="pl-c1">+</span> <span class="pl-s1">returning</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-xorm_bulk_insert_5-go-LC30" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-xorm_bulk_insert_5-go-LC31" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-xorm_bulk_insert_5-go-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> (<span class="pl-s1">c</span> <span class="pl-smi">config</span>) <span class="pl-en">hasReturn</span>() <span class="pl-smi">bool</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-xorm_bulk_insert_5-go-LC33" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-en">len</span>(<span class="pl-s1">c</span>.<span class="pl-c1">returningColumns</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-xorm_bulk_insert_5-go-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-xorm_bulk_insert_5-go-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-xorm_bulk_insert_5-go-LC36" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">BulkInsert</span>(<span class="pl-s1">db</span> xorm.<span class="pl-smi">Interface</span>, <span class="pl-s1">inserter</span> <span class="pl-smi">bulkInserter</span>, <span class="pl-s1">options</span> <span class="pl-c1">...</span><span class="pl-smi">Option</span>) ([]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span>, <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-xorm_bulk_insert_5-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">insertCount</span> <span class="pl-c1">:=</span> <span class="pl-s1">inserter</span>.<span class="pl-en">Len</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-xorm_bulk_insert_5-go-LC38" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">insertCount</span> <span class="pl-c1">==</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-xorm_bulk_insert_5-go-LC39" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-xorm_bulk_insert_5-go-LC40" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-xorm_bulk_insert_5-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">c</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span><span class="pl-smi">config</span>{}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-xorm_bulk_insert_5-go-LC42" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">opt</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">options</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-xorm_bulk_insert_5-go-LC43" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">opt</span>(<span class="pl-s1">c</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-xorm_bulk_insert_5-go-LC44" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-xorm_bulk_insert_5-go-LC45" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">var</span> <span class="pl-s1">results</span> []<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-xorm_bulk_insert_5-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">c</span>.<span class="pl-en">hasReturn</span>() {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-xorm_bulk_insert_5-go-LC47" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">results</span> <span class="pl-c1">=</span> <span class="pl-en">make</span>([]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-smi">string</span>, <span class="pl-c1">0</span>, <span class="pl-s1">insertCount</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-xorm_bulk_insert_5-go-LC48" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-xorm_bulk_insert_5-go-LC49" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">optionalSQL</span> <span class="pl-c1">:=</span> <span class="pl-s1">c</span>.<span class="pl-en">optionalSQL</span>()</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-xorm_bulk_insert_5-go-LC50" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">valuesString</span> <span class="pl-c1">:=</span> <span class="pl-s1">inserter</span>.<span class="pl-en">Values</span>() <span class="pl-c1">+</span> <span class="pl-s">&quot;,&quot;</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-xorm_bulk_insert_5-go-LC51" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">argCount</span> <span class="pl-c1">:=</span> <span class="pl-en">len</span>(<span class="pl-s1">inserter</span>.<span class="pl-en">Args</span>(<span class="pl-c1">0</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-xorm_bulk_insert_5-go-LC52" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">insertLimit</span> <span class="pl-c1">:=</span> <span class="pl-s1">pqArgLimit</span><span class="pl-c1">/</span><span class="pl-s1">argCount</span> <span class="pl-c1">-</span> <span class="pl-c1">1</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-xorm_bulk_insert_5-go-LC53" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">start</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">insertCount</span>; <span class="pl-s1">start</span> <span class="pl-c1">+=</span> <span class="pl-s1">insertLimit</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-xorm_bulk_insert_5-go-LC54" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">end</span> <span class="pl-c1">:=</span> <span class="pl-s1">start</span> <span class="pl-c1">+</span> <span class="pl-s1">insertLimit</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-xorm_bulk_insert_5-go-LC55" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">end</span> <span class="pl-c1">&gt;</span> <span class="pl-s1">insertCount</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-xorm_bulk_insert_5-go-LC56" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">end</span> <span class="pl-c1">=</span> <span class="pl-s1">insertCount</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-xorm_bulk_insert_5-go-LC57" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-xorm_bulk_insert_5-go-LC58" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-xorm_bulk_insert_5-go-LC59" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">var</span> <span class="pl-s1">values</span> strings.<span class="pl-smi">Builder</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-xorm_bulk_insert_5-go-LC60" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">values</span>.<span class="pl-en">Grow</span>(<span class="pl-en">len</span>([]<span class="pl-smi">byte</span>(<span class="pl-s1">valuesString</span>)) <span class="pl-c1">*</span> (<span class="pl-s1">end</span> <span class="pl-c1">-</span> <span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-xorm_bulk_insert_5-go-LC61" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">args</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-k">interface</span>{}, <span class="pl-c1">0</span>, (<span class="pl-s1">end</span><span class="pl-c1">-</span><span class="pl-s1">start</span>)<span class="pl-c1">*</span><span class="pl-s1">argCount</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-xorm_bulk_insert_5-go-LC62" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-s1">start</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">end</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-xorm_bulk_insert_5-go-LC63" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">args</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">args</span>, <span class="pl-s1">inserter</span>.<span class="pl-en">Args</span>(<span class="pl-s1">i</span>)<span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-xorm_bulk_insert_5-go-LC64" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">values</span>.<span class="pl-en">WriteString</span>(<span class="pl-s1">valuesString</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-xorm_bulk_insert_5-go-LC65" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-xorm_bulk_insert_5-go-LC66" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">sql</span> <span class="pl-c1">:=</span> <span class="pl-s1">fmt</span>.<span class="pl-en">Sprintf</span>(</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-xorm_bulk_insert_5-go-LC67" class="blob-code blob-code-inner js-file-line">			<span class="pl-s">&quot;INSERT INTO %s (%s) VALUES %s%s&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-xorm_bulk_insert_5-go-LC68" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">inserter</span>.<span class="pl-en">TableName</span>(),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-xorm_bulk_insert_5-go-LC69" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">inserter</span>.<span class="pl-en">Columns</span>(),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-xorm_bulk_insert_5-go-LC70" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">strings</span>.<span class="pl-en">TrimRight</span>(<span class="pl-s1">values</span>.<span class="pl-en">String</span>(), <span class="pl-s">&quot;,&quot;</span>),</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-xorm_bulk_insert_5-go-LC71" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">optionalSQL</span>,</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-xorm_bulk_insert_5-go-LC72" class="blob-code blob-code-inner js-file-line">		)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-xorm_bulk_insert_5-go-LC73" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">result</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">db</span>.<span class="pl-en">QueryString</span>(<span class="pl-en">append</span>([]<span class="pl-k">interface</span>{}{<span class="pl-s1">sql</span>}, <span class="pl-s1">args</span><span class="pl-c1">...</span>)<span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-xorm_bulk_insert_5-go-LC74" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-xorm_bulk_insert_5-go-LC75" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-xorm_bulk_insert_5-go-LC76" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-xorm_bulk_insert_5-go-LC77" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">c</span>.<span class="pl-en">hasReturn</span>() {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-xorm_bulk_insert_5-go-LC78" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">results</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">results</span>, <span class="pl-s1">result</span><span class="pl-c1">...</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-xorm_bulk_insert_5-go-LC79" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-xorm_bulk_insert_5-go-LC80" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-xorm_bulk_insert_5-go-LC81" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-xorm_bulk_insert_5-go-LC82" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">results</span>, <span class="pl-c1">nil</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_5-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-xorm_bulk_insert_5-go-LC83" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/9d713e3868cf96a761104ce75ae7ed19/raw/202c9b89e4d656e341b37789ffef515ca1b39b99/xorm_bulk_insert_5.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/9d713e3868cf96a761104ce75ae7ed19#file-xorm_bulk_insert_5-go">xorm_bulk_insert_5.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>こちらもベンチマークを取ります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/7427ce68d409b4fe9ff9145d3eea4c46.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108673636" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_test_3-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">bulkInsert</span>(<span class="pl-s1">db</span> xorm.<span class="pl-smi">Interface</span>, <span class="pl-s1">us</span> <span class="pl-smi">users</span>) <span class="pl-smi">error</span> {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC2" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">BulkInsert</span>(<span class="pl-s1">db</span>, <span class="pl-s1">us</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">err</span></td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC4" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_1</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC8" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_10</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">10</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC12" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC13" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC14" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_100</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC15" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">100</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC16" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_1000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">1000</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC20" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC21" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC22" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_10000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">10000</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC24" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC25" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">Benchmark_bulkInsert_100000</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">base</span>(<span class="pl-s1">b</span>, <span class="pl-c1">100000</span>, <span class="pl-s1">bulkInsert</span>)</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_test_3-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm_bulk_insert_test_3-go-LC28" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/7427ce68d409b4fe9ff9145d3eea4c46/raw/c6983198e09a0e6a5e0001bcb4b7131958647fb3/xorm_bulk_insert_test_3.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/7427ce68d409b4fe9ff9145d3eea4c46#file-xorm_bulk_insert_test_3-go">xorm_bulk_insert_test_3.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.29.46.png" alt="----------2022-05-11-10.29.46" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.29.54.png" alt="----------2022-05-11-10.29.54" loading="lazy"/></p>
<p>さらに速くなりました。分割した場合と比較すると10,000件は約2.9倍の速度で、100,000件でも約4.4秒で完了します。メモリ消費についても、100件以降で見ると約20倍少なくなっています。</p>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>自分でSQLを構築することで</p>
<ul>
<li>速度の向上</li>
<li>メモリ消費削減</li>
<li>Bulkでも自動採番のID取得可能</li>
</ul>
<p>と、中々いい感じになりました。</p>
<p>最後に測定結果を貼っておきます。登録件数が多い場合、施行回数が少なくなっているので、多少の誤差はあると思います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3de1ca8cb1f2041513ff24f1e9f58ad6.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist108674846" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm_bulk_insert_bench" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm_bulk_insert_bench-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm_bulk_insert_bench-LC1" class="blob-code blob-code-inner js-file-line">Benchmark_insert_1-4                         637           1996446 ns/op            7155 B/op        171 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm_bulk_insert_bench-LC2" class="blob-code blob-code-inner js-file-line">Benchmark_insert_10-4                        403           3375597 ns/op           60062 B/op       1862 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm_bulk_insert_bench-LC3" class="blob-code blob-code-inner js-file-line">Benchmark_insert_100-4                        46          25023146 ns/op         2944130 B/op     117100 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm_bulk_insert_bench-LC4" class="blob-code blob-code-inner js-file-line">Benchmark_insert_1000-4                        1        1544852600 ns/op        260334552 B/op  11072318 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm_bulk_insert_bench-LC5" class="blob-code blob-code-inner js-file-line">Benchmark_splitInsert_1-4                    594           1812986 ns/op            7148 B/op        171 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm_bulk_insert_bench-LC6" class="blob-code blob-code-inner js-file-line">Benchmark_splitInsert_10-4                   441           2625726 ns/op           60024 B/op       1861 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm_bulk_insert_bench-LC7" class="blob-code blob-code-inner js-file-line">Benchmark_splitInsert_100-4                   49          22577567 ns/op         2943919 B/op     117099 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm_bulk_insert_bench-LC8" class="blob-code blob-code-inner js-file-line">Benchmark_splitInsert_1000-4                   5         243017580 ns/op        29459081 B/op    1170782 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm_bulk_insert_bench-LC9" class="blob-code blob-code-inner js-file-line">Benchmark_splitInsert_10000-4                  1        2398265900 ns/op        294224288 B/op  11707072 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm_bulk_insert_bench-LC10" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_1-4                     675           1555644 ns/op            4319 B/op         81 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm_bulk_insert_bench-LC11" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_10-4                    626           1897336 ns/op           13916 B/op        264 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm_bulk_insert_bench-LC12" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_100-4                   237           4554855 ns/op          135957 B/op       2322 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm_bulk_insert_bench-LC13" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_1000-4                   21         118428919 ns/op         1419985 B/op      24852 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm_bulk_insert_bench-LC14" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_10000-4                   2         836984500 ns/op        15459056 B/op     249985 allocs/op</td>
      </tr>
      <tr>
        <td id="file-xorm_bulk_insert_bench-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm_bulk_insert_bench-LC15" class="blob-code blob-code-inner js-file-line">Benchmark_bulkInsert_100000-4                  1        4404440900 ns/op        161538312 B/op   2499028 allocs/op</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3de1ca8cb1f2041513ff24f1e9f58ad6/raw/cadbf800f973c08c11e5d6a181435c88ae358455/xorm_bulk_insert_bench" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3de1ca8cb1f2041513ff24f1e9f58ad6#file-xorm_bulk_insert_bench">xorm_bulk_insert_bench</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h2>
<ul>
<li><a href="https://gitea.com/xorm/xorm">https://gitea.com/xorm/xorm</a></li>
<li><a href="https://github.com/lib/pq">https://github.com/lib/pq</a></li>
<li><a href="https://blog.web-apps.tech/go-functional-option-pattern/">https://blog.web-apps.tech/go-functional-option-pattern/</a></li>
</ul>
<!--kg-card-end: markdown--></link></link></link></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[GitHub GraphQL API を利用してPull requests のコメントを抽出してみた]]></title><description><![CDATA[こおりやまです

以前、こちらのブログでGitHub GraphQL APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests
のコメント取得が必要になりGoogle Apps Script（GAS）から呼び出しスプレッドシートに出力してみました。

GitHub GraphQL API をさわってみた
[https://ghost.tech.anti-pattern.co.jp/github-graphql-api-wosawatutemita/]

まずは GraphQL API Explorer を利用して必要な情報が取得できるようQuery を検討します。

実行するクエリを作成したら、スクリプトを書いていきます。

書いたコードはこんな感じ
（設定情報は環境に合わせて設定して下さい）

/***********************************************
 * 設定情報
 ***********************************************/
var ACCESS\_TOKEN = "]]></description><link>https://tech.anti-pattern.co.jp/github-graphql-api-woli-yong-sitepull-requests-nokomentowochou-chu-sitemita/</link><guid isPermaLink="false">Ghost__Post__610bbd753986b000013a52f4</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 26 May 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こおりやまです</p>
<p>以前、こちらのブログでGitHub GraphQL APIをさわってどのような情報を取得できるのか確認していたのですが、Pull requests のコメント取得が必要になりGoogle Apps Script（GAS）から呼び出しスプレッドシートに出力してみました。</p>
<p><a href="https://ghost.tech.anti-pattern.co.jp/github-graphql-api-wosawatutemita/">GitHub GraphQL API をさわってみた</a></p>
<p>まずは GraphQL API Explorer を利用して必要な情報が取得できるようQuery を検討します。</p>
<p>実行するクエリを作成したら、スクリプトを書いていきます。</p>
<p>書いたコードはこんな感じ<br>
（設定情報は環境に合わせて設定して下さい）</br></p>
<pre><code>/***********************************************
 * 設定情報
 ***********************************************/
var ACCESS\_TOKEN = &quot;ACCESS\_TOKEN&quot;;  
var ENDPOINT = &quot;[https://api.github.com/graphql]&quot;;  
var REPOSITORY\_NAME = &quot;NAME&quot;;  
var REPOSITORY\_OWNER = &quot;OWNER&quot;;  
var LABELS = &quot;LABEL&quot;;

/***********************************************
 * GitHubからPRの一覧取得
***********************************************/
function getPullRequests(endCursor) {
  // 次ページの検索情報  
  var pageCursor = &quot;&quot;;  
  if(endCursor != &quot;&quot;){  
    // 次ページを検索させるための情報  
    pageCursor = &quot;,after: \\&quot;&quot; + endCursor + &quot;\\&quot;&quot;  
  }
  // 作成日降順、ラベルを特定  
  var query = '\\  
  {\\  
    repository(name: &quot;' + REPOSITORY\_NAME + '&quot;, owner: &quot;' + REPOSITORY\_OWNER + '&quot;) {\\  
       pullRequests(first: 50' + pageCursor + ', labels: &quot;' + LABELS + '&quot;, orderBy: {field: CREATED\_AT, direction: DESC}) {\\  
         edges {\\  
          node {\\  
            url\\  
            title\\  
            closed\\  
            createdAt\\  
            author {\\  
              login\\  
            }\\  
            reviews(first: 20) {\\  
              nodes {\\  
                bodyText\\  
                author {\\  
                  login\\  
                }\\  
              }\\  
            }\\  
          }\\  
        }\\  
        pageInfo {\\  
            hasNextPage\\  
            endCursor\\  
        }\\  
      }\\  
    }\\  
  }';

   var options = {  
    'method' : 'post',  
    'contentType' : 'application/json',  
    'headers' : {  
      'Authorization' : 'Bearer ' +  ACCESS\_TOKEN  
     },  
    'payload' : JSON.stringify({query:query})  
  };
  
  // fetch 情報を取得  
  var response = UrlFetchApp.fetch(ENDPOINT, options);
  // Json形式で返却  
  return JSON.parse(response.getContentText());;  
}

/***********************************************
 * main
 * GitHubからPRの一覧取得
***********************************************/
function main(){  
    Logger.log(&quot;開始&quot;);

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
    var iRow = 2;  
    var nextPageCursor = &quot;&quot;; // 次ページのカーソル情報

    do{  
        var allDocuments = getPullRequests(nextPageCursor);  
        var edges = allDocuments.data.repository.pullRequests.edges;

        edges.forEach(function(edge){  
          // Logger.log(edge);  
          //出力前にクリア  
          sheet.getRange(iRow+':'+iRow).clear();

          sheet.getRange(iRow, 1).setValue(edge.node.url);  
          sheet.getRange(iRow, 2).setValue(edge.node.author.login);  
          sheet.getRange(iRow, 3).setValue(edge.node.title);

         // コメント情報を出力する  
          var iCol = 4;  
          var reviews = edge.node.reviews.nodes;  
          reviews.forEach(function(review){  
            if(review.bodyText!=&quot;&quot;){  
              var login = review.author.login;  
              sheet.getRange(iRow, iCol).setValue('@'+login + '\\n' + review.bodyText); }  
              iCol++;  
            }  
          }); iRow++;  
        });  
        // 次ページがあるか、最終行のカーソル情報を取得  
        nextPageCursor = allDocuments.data.repository.pullRequests.pageInfo.endCursor  
        var hasNextPage = allDocuments.data.repository.pullRequests.pageInfo.hasNextPage  
        Logger.log(&quot;行:&quot; + (iRow-2) + ' endCursor:' + nextPageCursor + ' hasNextPage:' + hasNextPage);
        
    // 次ページがなくなるまでループ  
    }while(hasNextPage === true)

    Logger.log(&quot;終了&quot;);  
}
</code></pre>
<p>一度に取得する行数を <code>first: 50</code> で設定しておりページングさせるところで少し悩みましたが、以下のページを参考にして実装しています。</p>
<p><a href="https://graphql.org/learn/pagination/">https://graphql.org/learn/pagination/</a></p>
<p>pullRequests にある <code>paheInfo</code> 情報を取得するようQueryを設定して、取得した<code>endCursor</code> 情報を取得時の <code>after</code> に設定することで次ページの情報が取得できるようになります。</p>
<pre><code>pageInfo {  
    hasNextPage  
    endCursor  
}
</code></pre>
<p>設定したコードを実行すると以下のフォーマットで情報が取得できます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EsClzg7aH6gT2eWb7yXfPQ.png" alt="1_EsClzg7aH6gT2eWb7yXfPQ" loading="lazy"><br>
今回はコメント情報だけ必要だったのでQueryは上記になっていますが、レビューコメントなども取得できる所までは確認しており、必要になったらまたブログで書こうかと思います。</br></img></p>
<p>ではでは</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[STUDIOの便利な機能5選]]></title><description><![CDATA[Photo by Toa Heftiba
[https://unsplash.com/@heftiba?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
最近はSTUDIOでサイトを作っており、作成時に便利だった機能を5つまとめました。

① PCとモバイルで表示を変える
② カルーセルを設定する
③ hover時に表示を変化させる
④ 何度も使う要素はSymbolで共通化
⑤ レスポンシブのブレイクポイントを変更する


① PCとモバイルで表示を変える
上の画像を選択し、左上の目のアイコンでタブレットとモバイルのチェックボックスを外します。

次に下の画像を選択し、「基準」のチェックボックスを外します。

実際の動き② カルーセルを設定する
ダッシュボード>CMS からモデルを追加します。

「記事タイプ」を選択して新]]></description><link>https://tech.anti-pattern.co.jp/useful_features_of_studio/</link><guid isPermaLink="false">Ghost__Post__610431b33986b000013a4699</guid><category><![CDATA[STUDIO]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Wed, 19 May 2021 17:16:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="5184" height="3456" srcset="https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@heftiba?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Toa Heftiba</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1467189386127-c4e5e31ee213?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDQ1fHxjYWZlfGVufDB8fHx8MTYyNzY2NjAxMQ&ixlib=rb-1.2.1&q=80&w=2000" alt="STUDIOの便利な機能5選"/><p>最近はSTUDIOでサイトを作っており、作成時に便利だった機能を5つまとめました。</p><h4 id="%E2%91%A0-pc%E3%81%A8%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B">① PCとモバイルで表示を変える</h4><h4 id="%E2%91%A1-%E3%82%AB%E3%83%AB%E3%83%BC%E3%82%BB%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">② カルーセルを設定する</h4><h4 id="%E2%91%A2-hover%E6%99%82%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%82%92%E5%A4%89%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B">③ hover時に表示を変化させる</h4><h4 id="%E2%91%A3-%E4%BD%95%E5%BA%A6%E3%82%82%E4%BD%BF%E3%81%86%E8%A6%81%E7%B4%A0%E3%81%AFsymbol%E3%81%A7%E5%85%B1%E9%80%9A%E5%8C%96">④ 何度も使う要素はSymbolで共通化</h4><h4 id="%E2%91%A4-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B7%E3%83%96%E3%81%AE%E3%83%96%E3%83%AC%E3%82%A4%E3%82%AF%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B">⑤ レスポンシブのブレイクポイントを変更する</h4><p/><h2 id="%E2%91%A0-pc%E3%81%A8%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B-1">① PCとモバイルで表示を変える</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-6.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1120" height="664" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-6.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-6.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-6.png 1120w" sizes="(min-width: 720px) 720px"/></figure><p>上の画像を選択し、左上の目のアイコンでタブレットとモバイルのチェックボックスを外します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-7.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1026" height="605" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-7.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-7.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-7.png 1026w" sizes="(min-width: 720px) 720px"/></figure><p>次に下の画像を選択し、「基準」のチェックボックスを外します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-8.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1236" height="667" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-8.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-8.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-8.png 1236w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-9.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="600" height="374" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-9.png 600w"><figcaption>実際の動き</figcaption></img></figure><h2 id="%E2%91%A1-%E3%82%AB%E3%83%AB%E3%83%BC%E3%82%BB%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-1">② カルーセルを設定する</h2><p>ダッシュボード&gt;CMS からモデルを追加します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-10.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="754" height="381" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-10.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-10.png 754w" sizes="(min-width: 720px) 720px"/></figure><p>「記事タイプ」を選択して新規モデルを作成します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-11.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1134" height="717" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-11.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-11.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-11.png 1134w" sizes="(min-width: 720px) 720px"/></figure><p>作成したモデル内に記事を作成し、カルーセルに表示させたいカバー画像を設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-12.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="678" height="369" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-12.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-12.png 678w"/></figure><p>左のメニューから、CMSを選び、上から2つ目を選択します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-13.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="969" height="641" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-13.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-13.png 969w" sizes="(min-width: 720px) 720px"/></figure><p>要素の左上のチップをクリックすると、どのモデルと表示数を設定できます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-14.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1310" height="611" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-14.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-14.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-14.png 1310w" sizes="(min-width: 720px) 720px"/></figure><p>画像のみの表示にしたい場合は、この部分↓を消したらOKです。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-16.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1148" height="684" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-16.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-16.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-16.png 1148w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-17.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="600" height="465" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-17.png 600w"/></figure><h2 id="%E2%91%A2-hover%E6%99%82%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%82%92%E5%A4%89%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B-1">③ hover時に表示を変化させる</h2><p>好きなようにボタンを作成し、選択した状態にします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-18.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="277" height="197"/></figure><p>hoverにチェックをつけます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-19.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1167" height="496" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-19.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-19.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-19.png 1167w" sizes="(min-width: 720px) 720px"/></figure><p>チェックを付けた状態でデザインを変更します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-20.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="285" height="203"/></figure><p>画像を2つ重ねることで、hoverで画像が切り替わるようにすることもできます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-21.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="600" height="203" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-21.png 600w"><figcaption>実際の動き</figcaption></img></figure><h2 id="%E2%91%A3-%E4%BD%95%E5%BA%A6%E3%82%82%E4%BD%BF%E3%81%86%E8%A6%81%E7%B4%A0%E3%81%AFsymbol%E3%81%A7%E5%85%B1%E9%80%9A%E5%8C%96-1">④ 何度も使う要素はSymbolで共通化</h2><p>ヘッダー、フッダーなど複数のページで共通して利用するパーツはシンボル化すると、全ページを修正する必要がなくなり楽です。<br>シンボル化したいパーツを選択・右クリックし、シンボル化を選択します。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-22.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="811" height="658" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-22.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-22.png 811w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E2%91%A4-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B7%E3%83%96%E3%81%AE%E3%83%96%E3%83%AC%E3%82%A4%E3%82%AF%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-1">⑤ レスポンシブのブレイクポイントを変更する</h2><p>STUDIOではデフォルトで3種の画面幅設定ができ、タブレットとモバイルで2箇所のブレイクポイントがあります。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-23.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="934" height="745" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-23.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-23.png 934w" sizes="(min-width: 720px) 720px"/></figure><p>ブレイクポイントは「ブレイクポイントの編集」から確認、編集できます</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/image-58.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1049" height="253" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2021/07/image-58.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2021/07/image-58.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/image-58.png 1049w"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-25.png" class="kg-image" alt="STUDIOの便利な機能5選" loading="lazy" width="1444" height="366" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-25.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-25.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-25.png 1444w" sizes="(min-width: 720px) 720px"/></figure><p>編集をクリックすると、それぞれのブレイクポイントを変えられたり、タブレットとPCの中間の「スモール」、モバイルよりも小さい「ミニ」のブレイクポイントを追加することもできます。</p><p>ブレイクポイントの編集は全ページに反映されるので、注意が必要です。</p><p>おわり</p>]]></content:encoded></item><item><title><![CDATA[Contentful Gatsby Starter Blogを使うときの注意点]]></title><description><![CDATA[■今やっていること
Gatsby + ContentfulのJAMstackなブログサイトを構築しています。

■使っているスターターキット
Gatsbyには素早くデプロイできるようにスターターキットがいっぱい用意されています。好みのものを採用してみてください。

Starter LibraryGatsby Starters: LibraryGatsby
[https://www.gatsbyjs.com/starters/?v=2]今回はcontentful [https://github.com/contentful]が提供しているキットを採用しています。

GitHub - contentful/starter-gatsby-blog: Gatsby starter for a Contentful
project
from the community.Gatsby starter for a Contentful project from the community.
-
GitHub - contentful/starter-gatsby-blog: Gatsby start]]></description><link>https://tech.anti-pattern.co.jp/notes-on-using-the-contentful-gatsby-starter-blog/</link><guid isPermaLink="false">Ghost__Post__610153383986b000013a4152</guid><category><![CDATA[Gatsby]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Mon, 17 May 2021 11:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E2%96%A0%E4%BB%8A%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8">■今やっていること</h2>
<p>Gatsby + ContentfulのJAMstackなブログサイトを構築しています。</p>
<h2 id="%E2%96%A0%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88">■使っているスターターキット</h2>
<p>Gatsbyには素早くデプロイできるようにスターターキットがいっぱい用意されています。好みのものを採用してみてください。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.gatsbyjs.com/starters/?v&#x3D;2"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Starter Library</div><div class="kg-bookmark-description">Gatsby Starters: Library</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gatsbyjs.com/icons/icon-512x512.png?v&#x3D;3ad5294f3fa6c06e2d07ab07c76df2cf"><span class="kg-bookmark-author">Gatsby</span></img></div></div></a></figure><!--kg-card-begin: markdown--><p>今回は<a href="https://github.com/contentful">contentful</a>が提供しているキットを採用しています。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/contentful/starter-gatsby-blog/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - contentful/starter-gatsby-blog: Gatsby starter for a Contentful project from the community.</div><div class="kg-bookmark-description">Gatsby starter for a Contentful project from the community. - GitHub - contentful/starter-gatsby-blog: Gatsby starter for a Contentful project from the community.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">contentful</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/784c3696d8e182acf1c4dc5ce575ade4423bd40a356ee967e045e8b987969d5c/contentful/starter-gatsby-blog"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E2%96%A0%E6%B3%A8%E6%84%8F%E7%82%B9">■注意点</h2>
<p><code>/src/pages/index.js</code></p>
<p>の11行目で</p>
<pre><code>const siteTitle = get(this, ‘props.data.site.siteMetadata.title’)
</code></pre>
<p>としていますが、41行目のHomeQueryでこのデータを取ってきてないので、そのままの状態だとundefinedになります。</p>
<p>なので下記のようにQueryを足してあげましょう。</p>
<pre><code>site {
    siteMetadata {
        defaultTitle: title
        titleTemplate
        defaultDescription: description
        siteUrl: url
        defaultImage: image
        twitterUsername
    }
}
</code></pre>
<p>ユーザーコミュニティでは指摘があって反映されていますが、公式はまだ対応していないみたいでハマりました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/contentful-userland/about"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - contentful-userland/about: Organization mission statement and contribution guidelines</div><div class="kg-bookmark-description">Organization mission statement and contribution guidelines - GitHub - contentful-userland/about: Organization mission statement and contribution guidelines</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">contentful-userland</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/7b7444e98139660e5ab3009aa6fb51d1a517696786119d717977fa63e565ab24/contentful-userland/about"/></div></a></figure><!--kg-card-begin: markdown--><p>結構細かいところで直しが多いのでブログの公開はもう1週間くらい必要そうです。</p>
<p>頑張ります！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Slackのメンバー種別と権限について理解しよう！]]></title><description><![CDATA[Slack(有料プラン)のメンバー種別を大まかに分けると、「メンバー」と「ゲスト」の2種類があります。
もう少し細かく説明すると、「メンバー」は権限ごとに4種類に分けられ、「ゲスト」は参加出来るチャンネル数により2種類に分けられます。
（※招待中の種別に関する説明は省きます）

「メンバー」4種
①ワークスペースのプライマリーオーナー
②ワークスペースのオーナー
③ワークスペースの管理者
④通常メンバー

「ゲスト」2種
⑤マルチチャンネルゲスト
⑥シングルチャンネルゲスト

権限は①のプライマリーオーナーが最強で、②〜⑥にかけて弱くなっていきます。

各メンバー種別の特徴
①ワークスペースのプライマリーオーナー
・ワークスペースで1人しかなれない
・ワークスペース自体の削除や権限譲渡ができるのはこの人だけ

②ワークスペースのオーナー
・プライマリーオーナーとほぼ同等の権限を持つ
・自分と同等以上の権限を持つアカウントの解除や権限剥奪は出来ない

③ワークスペースの管理者
・メンバーやチャンネルの管理は大体できる
・ワークスペースの設定はものによる
・自分と同等以上の権限を持つアカウ]]></description><link>https://tech.anti-pattern.co.jp/slack-member/</link><guid isPermaLink="false">Ghost__Post__610140033986b000013a3e8e</guid><category><![CDATA[Slack]]></category><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Fri, 14 May 2021 11:53:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Slack(有料プラン)のメンバー種別を大まかに分けると、「メンバー」と「ゲスト」の2種類があります。<br>
もう少し細かく説明すると、「メンバー」は権限ごとに4種類に分けられ、「ゲスト」は参加出来るチャンネル数により2種類に分けられます。<br>
（※招待中の種別に関する説明は省きます）</br></br></p>
<h2 id="%E3%80%8C%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%80%8D4%E7%A8%AE">「メンバー」4種</h2>
<p>①ワークスペースのプライマリーオーナー<br>
②ワークスペースのオーナー<br>
③ワークスペースの管理者<br>
④通常メンバー</br></br></br></p>
<h2 id="%E3%80%8C%E3%82%B2%E3%82%B9%E3%83%88%E3%80%8D2%E7%A8%AE">「ゲスト」2種</h2>
<p>⑤マルチチャンネルゲスト<br>
⑥シングルチャンネルゲスト</br></p>
<p>権限は①のプライマリーオーナーが最強で、②〜⑥にかけて弱くなっていきます。</p>
<h2 id="%E5%90%84%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E7%A8%AE%E5%88%A5%E3%81%AE%E7%89%B9%E5%BE%B4">各メンバー種別の特徴</h2>
<h4 id="%E2%91%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%97%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%AA%E3%83%BC%E3%82%AA%E3%83%BC%E3%83%8A%E3%83%BC">①ワークスペースのプライマリーオーナー</h4>
<p>・ワークスペースで1人しかなれない<br>
・ワークスペース自体の削除や権限譲渡ができるのはこの人だけ</br></p>
<h4 id="%E2%91%A1%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%8A%E3%83%BC">②ワークスペースのオーナー</h4>
<p>・プライマリーオーナーとほぼ同等の権限を持つ<br>
・自分と同等以上の権限を持つアカウントの解除や権限剥奪は出来ない</br></p>
<h4 id="%E2%91%A2%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E7%AE%A1%E7%90%86%E8%80%85">③ワークスペースの管理者</h4>
<p>・メンバーやチャンネルの管理は大体できる<br>
・ワークスペースの設定はものによる<br>
・自分と同等以上の権限を持つアカウントの解除や権限剥奪は出来ない</br></br></p>
<h4 id="%E2%91%A3%E9%80%9A%E5%B8%B8%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC">④通常メンバー</h4>
<p>・チャンネルの作成や参加など自由にできる<br>
・他のメンバーを管理する権限はほぼない</br></p>
<h4 id="%E2%91%A4%E3%83%9E%E3%83%AB%E3%83%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%B2%E3%82%B9%E3%83%88">⑤マルチチャンネルゲスト</h4>
<p>・自由にチャンネルに参加出来ない<br>
・招待されれば複数チャンネルに参加できる<br>
・プライベートチャンネルなら作成もできる</br></br></p>
<h4 id="%E2%91%A5%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%B2%E3%82%B9%E3%83%88">⑥シングルチャンネルゲスト</h4>
<p>・自由にチャンネルに参加出来ない<br>
・招待された1つのチャンネルのみ参加できる<br>
・メンバー料金がかからない（無料）</br></br></p>
<h2 id="%E5%90%84%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E7%A8%AE%E5%88%A5%E3%81%A7%E5%87%BA%E6%9D%A5%E3%82%8B%E3%81%93%E3%81%A8">各メンバー種別で出来ること</h2>
<p>※一覧に記載した◯×△はデフォルト設定時のものです。設定により権限を変更できるものもあります。<br>
※個人的に理解する為に表を作ったので、公式とは表現が異なる部分があります。正確に知りたい方は公式サイトをご確認ください。<br>
<a href="https://slack.com/intl/ja-jp/help">Slack ヘルプセンター | Slack</a></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/slack-member.png" alt="slack-member" loading="lazy"/></p>
<p>以下に、Slackの種別と権限について説明されてるオススメページを貼っておきます！</p>
<p>▼各メンバー種別によって出来ることが知りたい時<br>
<a href="https://slack.com/intl/ja-jp/help/articles/201314026-Slack-%E3%81%A7%E3%81%AE%E5%90%84%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E7%A8%AE%E5%88%A5%E3%81%AE%E6%A8%A9%E9%99%90">Slack での各メンバー種別の権限 | Slack</a></br></p>
<p>▼「プライマリーオーナー」「オーナー」「管理者」の違いが知りたい時<br>
<a href="https://slack.com/intl/ja-jp/help/articles/218124397-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E7%A8%AE%E5%88%A5%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B">メンバー種別を変更する | Slack</a><br>
<a href="https://slack.com/intl/ja-jp/help/articles/204475027-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E8%A7%A3%E9%99%A4">メンバーのアカウントの解除 | Slack</a></br></br></p>
<p>▼「ゲスト」が出来ることを詳しく知りたい時<br>
<a href="https://slack.com/intl/ja-jp/help/articles/202518103-Slack-%E3%81%A7%E3%81%AE%E3%82%B2%E3%82%B9%E3%83%88%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E7%A8%AE%E5%88%A5%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B">Slack でのゲストのメンバー種別を理解する | Slack</a></br></p>
<p>それでは、楽しいSlackライフを！</p>
<!--kg-card-end: markdown--><p/>]]></content:encoded></item><item><title><![CDATA[GORMとPostgreSQLのtimezone?]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。

弊社ではGolang使用してアプリケーション開発をしています。DBはPostgreSQLでORマッパーにGORMを利用しています。

Golangコンテナ、DBコンテナはタイムゾーンを指定していないのでデフォルト値が適用されています。これをJSTにしたかった！というブログです。

■Golangコンテナ
$ docker exec -it 58d644eaec04 bash
root@58d644eaec04:/app# date  
**Sat May  8 10:43:18 UTC 2021**

■DBコンテナ
root@2e3c2a3ad755:/# psql -U ***** -d *****
psql (11.9 (Debian 11.9-1.pgdg90+1))  
Type "help" for help.  
=> show timezone;
TimeZone  
------------  
**UTC**


time.Now()を出力した結果です。UTCが設定されています

now := time.]]></description><link>https://tech.anti-pattern.co.jp/gormtopostgresqlnotimezone/</link><guid isPermaLink="false">Ghost__Post__610e0e8e3986b000013a5338</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Fri, 14 May 2021 04:55:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n.jpg" alt="GORMとPostgreSQLのtimezone?"/><p>こんにちは、Anti-Pattern Inc.の塚本です。</p>
<p>弊社ではGolang使用してアプリケーション開発をしています。DBはPostgreSQLでORマッパーにGORMを利用しています。</p>
<p>Golangコンテナ、DBコンテナはタイムゾーンを指定していないのでデフォルト値が適用されています。これをJSTにしたかった！というブログです。</p>
<pre><code>■Golangコンテナ
$ docker exec -it 58d644eaec04 bash
root@58d644eaec04:/app# date  
**Sat May  8 10:43:18 UTC 2021**

■DBコンテナ
root@2e3c2a3ad755:/# psql -U ***** -d *****
psql (11.9 (Debian 11.9-1.pgdg90+1))  
Type &quot;help&quot; for help.  
=&gt; show timezone;
TimeZone  
------------  
**UTC**
</code></pre>
<p>time.Now()を出力した結果です。UTCが設定されています</p>
<pre><code>now := time.Now()  
pretty.Println(now)
// 一部省略  
time.Time{
    wall: 0xc01dba5be36c39a0,
    ext:  9264217901,
    loc:  &amp;time.Location{
        name: &quot;Local&quot;,
        zone: {
            {name:&quot;UTC&quot;, offset:0, isDST:false},
        },
        extend:     &quot;UTC0&quot;,
    },
}
</code></pre>
<p>time packageのzoneinfo.goを見ると、Locationが設定される優先順位が記述されています。</p>
<pre><code>// Local represents the system's local time zone.  
// On Unix systems, Local consults the **TZ environment**  
// variable to find the time zone to use. No TZ means  
// use the system default **/etc/localtime**.  
// TZ=&quot;&quot; means use UTC.  
// TZ=&quot;foo&quot; means use file foo in the system timezone directory.var Local *Location = &amp;localLoc
</code></pre>
<p>コンテナにJSTのtimezoneを設定します</p>
<pre><code>RUN apt-get update &amp;&amp; apt-get install -y tzdata  
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime  
ENV TZ=Asia/Tokyo
</code></pre>
<p>イメージをリビルドして再起動した結果です<br>
OSのtimezoneがJSTに変更されてます</br></p>
<pre><code>$ docker exec -it 05be8001430e bash
root@05be8001430e:/app# date  
**Sat May  8 20:34:47 JST 2021**
root@05be8001430e:/app# strings /etc/localtime  
TZif2  
TZif2  
JST-9
</code></pre>
<p>time.Now()を出力した結果です。 name: “Asia/Tokyo”に変更され、JSTで出力されます</p>
<pre><code>now := time.Now()  
pretty.Println(now)
// 一部省略  

time.Time{
    wall: 0xc01dbbf41503be10,
    ext:  320877338601,
    loc:  &amp;time.Location{
        name: &quot;Asia/Tokyo&quot;,
        zone: {
            {name:&quot;LMT&quot;, offset:33539, isDST:false},
            {name:&quot;JDT&quot;, offset:36000, isDST:true},
            {name:&quot;JST&quot;, offset:32400, isDST:false},
            {name:&quot;JST&quot;, offset:32400, isDST:false},
        },
        extend:     &quot;JST-9&quot;,
    },
}

pretty.Println(now.String())  
2021-05-08 20:48:48.8286243 +0900 **JST** m=+2.744851101
</code></pre>
<p>今回は直接変更して検証しています</p>
<pre><code>ALTER DATABASE &quot;****&quot; SET timezone TO 'Asia/Tokyo';
$ docker exec -it f27946c4ba27 bash  
root@f27946c4ba27:/# psql -U *** -d *****
psql (11.9 (Debian 11.9-1.pgdg90+1))  
Type &quot;help&quot; for help.
=&gt; show timezone;  
TimeZone  
------------  
Asia/Tokyo
</code></pre>
<p>データ登録時のログで確認してますが、現在日時（JST）で設定されています。ここまでは想定通りです。</p>
<pre><code>INSERT INTO &quot;test_names&quot; (&quot;created_at&quot;,&quot;updated_at&quot;,&quot;deleted_at&quot;,&quot;name&quot;) VALUES ('2021-05-08 21:08:45.757','2021-05-08 21:08:45.757',NULL,'test') RETURNING &quot;id&quot;
</code></pre>
<p>次にデータ取得</p>
<p>DBから取得したデータのCreatedAtをログに出力します。<br>
<a href="https://pkg.go.dev/gorm.io/gorm#Model">https://pkg.go.dev/gorm.io/gorm#Model</a></br></p>
<pre><code>pretty.Println(result.Model)
pretty.Println(result.Model.CreatedAt.String())
pretty.Println(result.Model.CreatedAt.Location())
gorm.Model{
    ID:        0x5,
    CreatedAt: time.Time{
        wall: 0x2d28f578,
        ext:  63756104925,
        loc:  (*time.Location)(nil),
    },
    UpdatedAt: time.Time{
        wall: 0x2d28f578,
        ext:  63756104925,
        loc:  (*time.Location)(nil),
    },
    DeletedAt: gorm.DeletedAt{},
}
2021-05-08 21:08:45.757659 +0000 UTC
&amp;time.Location{
    name:       &quot;UTC&quot;,
    zone:       nil,
    tx:         nil,
    extend:     &quot;&quot;,
    cacheStart: 0,
    cacheEnd:   0,
    cacheZone:  (*time.zone)(nil),
}
</code></pre>
<p>あれ？UTCになってる。locがnil ムムム・・</p>
<p>ちなみにDBのカラム定義はtimezoneを持ってません</p>
<pre><code>created\_at   | timestamp without time zone 
</code></pre>
<p>では、timezoneを持たせて確認</p>
<pre><code>ALTER TABLE tableName ALTER COLUMN created\_at TYPE timestamp with time zone
</code></pre>
<p>locに設定されて、timezoneはJSTと判定されてます（これが期待していた結果です）</p>
<pre><code>// 抜粋  
gorm.Model{
    ID:        0x5,
    CreatedAt: time.Time{
        wall: 0x2d28f578,
        ext:  63756072525,
        loc:  &amp;time.Location{
            name: &quot;Asia/Tokyo&quot;,
            zone: {
                {name:&quot;LMT&quot;, offset:33539, isDST:false},
                {name:&quot;JDT&quot;, offset:36000, isDST:true},
                {name:&quot;JST&quot;, offset:32400, isDST:false},
                {name:&quot;JST&quot;, offset:32400, isDST:false},
            },
           extend:     &quot;JST-9&quot;,
            cacheStart: 9223372036854775807,
            cacheEnd:   9223372036854775807,
            cacheZone:  &amp;time.zone{(CYCLIC REFERENCE)},
        },
    },
    UpdatedAt: time.Time{
        wall: 0x2d28f578,
        ext:  63756104925,
        loc:  (*time.Location)(nil),
    },
    DeletedAt: gorm.DeletedAt{},
}
2021-05-08 21:08:45.757659 +0900 JST
&amp;time.Location{
    name: &quot;Asia/Tokyo&quot;,
    zone: {
        {name:&quot;LMT&quot;, offset:33539, isDST:false},
        {name:&quot;JDT&quot;, offset:36000, isDST:true},
        {name:&quot;JST&quot;, offset:32400, isDST:false},
        {name:&quot;JST&quot;, offset:32400, isDST:false},
    },
   extend:     &quot;JST-9&quot;,
    cacheStart: 9223372036854775807,
    cacheEnd:   9223372036854775807,
    cacheZone:  &amp;time.zone{(CYCLIC REFERENCE)},
}
</code></pre>
<p>DBとGolangの実行環境のtimezoneを変えて取得したデータのtimezoneを確認した結果はこちら<br>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1_K4rZ9j7TfC_EZmtgYnniKg.png" alt="GORMとPostgreSQLのtimezone?" loading="lazy"/></br></p>
<p>DBのカラムがtimezoneを保持していないと、Golang(GORM)で変数にバインドしたtime型のlocationはUTCとなる（①）。timezoneを保持している場合は、Golang(GORM)実行環境のtimezoneが設定される。</p>
<p>個人的には、DBとGolang実行環境でシステムは分離されているので、DBの設定を優先させても良いかと思いました（③）。</p>
<p>どうするかは、これから検討しようと思います。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[PHPからGoogleスプレッドシートにデータを登録してみた]]></title><description><![CDATA[弊社の取り組みで、POSSEという学生プログラミングコミュニティに関わっておりますが、その中で学生に実際の案件に近い形でチーム開発を経験してもらうというカリキュラムがあります。
POSSEについてはこちら
https://posse.anti-pattern.co.jp/

学生がチームに分かれて取り組むカリキュラムになっており、モックアップを作成しながらお客様に要件ヒアリングを行います。その後は開発、テストまで行い、最後にはお客様の要件を満たしているか、プログラムはちゃんと実装できているか、チームで協力して開発できているかなどの基準で良かったチームを表彰します。お客様が実際にほしいと思っているものを作成するので、良いものを作った場合は実際にお客様の会社のサービスとして利用される可能性もあります。

私はメンターとしてチーム開発をサポートする、という立場で参加しております。
学生が要件定義をしている中で、
「作成するサイトで申込みがあった場合、申込みの情報をスプレッドシートに保存したい」という要件がありました。
本当にスプレッドシートが最適なのか、
別の形が良いのではないドか、など学生]]></description><link>https://tech.anti-pattern.co.jp/gas-de-spreadsheet/</link><guid isPermaLink="false">Ghost__Post__610acfc53986b000013a50cd</guid><category><![CDATA[PHP]]></category><category><![CDATA[GAS]]></category><category><![CDATA[google]]></category><category><![CDATA[spreadsheet]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Thu, 29 Apr 2021 17:36:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/3-4.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/3-4.png" alt="PHPからGoogleスプレッドシートにデータを登録してみた"/><p>弊社の取り組みで、POSSEという学生プログラミングコミュニティに関わっておりますが、その中で学生に実際の案件に近い形でチーム開発を経験してもらうというカリキュラムがあります。<br>
POSSEについてはこちら<br>
<a href="https://posse.anti-pattern.co.jp/">https://posse.anti-pattern.co.jp/</a></br></br></p>
<p>学生がチームに分かれて取り組むカリキュラムになっており、モックアップを作成しながらお客様に要件ヒアリングを行います。その後は開発、テストまで行い、最後にはお客様の要件を満たしているか、プログラムはちゃんと実装できているか、チームで協力して開発できているかなどの基準で良かったチームを表彰します。お客様が実際にほしいと思っているものを作成するので、良いものを作った場合は実際にお客様の会社のサービスとして利用される可能性もあります。</p>
<p>私はメンターとしてチーム開発をサポートする、という立場で参加しております。<br>
学生が要件定義をしている中で、<br>
「作成するサイトで申込みがあった場合、申込みの情報をスプレッドシートに保存したい」という要件がありました。<br>
本当にスプレッドシートが最適なのか、 別の形が良いのではないドか、など学生が要件ヒアリングをしているのを聞いていると、スプレッドシートに保存するというのが、選択肢としてありそうな感じでした。</br></br></br></p>
<p>プログラムからスプレッドシートにデータを保存。というのを実装したことが無く、実装できないのであれば学生に早めに伝えないと行けないので、念の為実装確認をした。というのがこの記事を書いた経緯になります。では本題に入ります。</p>
<p>実装方法を調べるため公式のGoogleさん探すと、以下のページを見つけました。<br>
PHP Quickstart | Sheets API | Google Developers<br>
<a href="https://developers.google.com/sheets/api/quickstart/php">https://developers.google.com/sheets/api/quickstart/php</a><br>
POSSEのカリキュラムでPHPを勉強しているのですが、丁度PHPのサンプルが公式にありました。こんなページあるのなら実装できそうなので、検証要らない気もしますが。。。念の為実装してみます</br></br></br></p>
<p><strong>Step 1: Turn on the Google Sheets API</strong><br>
これはスプレッドシートにアクセスするアカウントを作成するために必要な作業です。ボタンポチポチ押して行くと、OAuthって出てきました。ログインしないといけないので嫌です。<br>
左のメニューにAuthorizing Requestsとあるので見てみると、API keyと書いてあるのでこれ使いたいです。<br>
Acquiring and using an API keyを見ると、Credentials pageでキーを作れと書いてあるので作りに行きます。</br></br></br></p>
<p>認証情報を作成 - サービスアカウントから作成します。<br>
名前はわかりやすいものを設定して、権限などは付与せずに作成します。</br></p>
<p>その後認証用のキーを作成します。作成したユーザをクリックし、キーのタブを選択、鍵を追加 - 新しい鍵を作成を選択します。<br>
JSONを選択し作成ボタンを押します。<br>
鍵が作成されダウンロードされますので、大事に保管しておきます。<br>
これでStep1は終わりです。</br></br></br></p>
<p><strong>Step 2: Install the Google Client Library</strong><br>
こちらはライブラリのインストールです。<br>
書いてあるとおりコマンド打てばライブラリがインストールされます。composerがなくてエラーになる場合はインストールしてからですね。</br></br></p>
<p><strong>Step 3: Set up the sample</strong><br>
サンプルコードがあるので使わせていただきます。<br>
手を入れるのは2箇所、<br>
OAuthを使うようになっているところを、API Keyを使うようにする。<br>
データを取ってくるサンプルなので、書き込むように変更する。</br></br></br></br></p>
<p><strong>API Keyを使うようにする</strong><br>
サンプルの中にAPI Keyを使う処理も入っているので、つまんで使います。<br>
getClient()メソッドの中で色々処理してますが、STEP1で作った認証情報設定するだけで基本OKぽいです。<br>
サンプルはsetScopesで読み込み専用としているので、書き込みできそうなものを設定します。<br>
ここのドキュメントにパラメータが記載されてます。<br>
<a href="https://developers.google.com/resources/api-libraries/documentation/sheets/v4/php/latest/class-Google_Service_Sheets.html">https://developers.google.com/resources/api-libraries/documentation/sheets/v4/php/latest/class-Google_Service_Sheets.html</a></br></br></br></br></br></p>
<p><code>$client = new Google\_Client();   $client-&gt;setScopes(Google\_Service\_Sheets::SPREADSHEETS);   $client-&gt;setAuthConfig('credentials.json');   $service = new Google\_Service\_Sheets($client);</code></p>
<p><strong>書き込むように変更する</strong><br>
はじめ見ていたPHP Quickstartの左のメニューに、Reading and Writing Valuesとあるので見てみます。<br>
Writing to a single rangeのサンプルがあるのでこれをパクります</br></br></p>
<!--kg-card-end: markdown--><pre><code>$values = \[  
    \[  
        // Cell values ...  
    \],  
    // Additional rows ...  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' =&gt; $values  
\]);  
$params = \[  
    'valueInputOption' =&gt; $valueInputOption  
\];  
$result = $service-&gt;spreadsheets\_values-&gt;update($spreadsheetId, $range,  
$body, $params);  
printf("%d cells updated.", $result-&gt;getUpdatedCells());</code></pre><!--kg-card-begin: markdown--><p>このサンプルそのまま使えないので、手を入れます<br>
appendメソッドに渡すのは以下の情報<br>
・$spreadsheetId（スプレッドシートのID）<br>
・$range（対象シートや対象セルなどの情報）<br>
・$body（追加する値）<br>
・$params（関数など 設定しない場合はUSER_ENTEREDで良さそう）<br>
参考ドキュメント：<br>
<a href="https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append">https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append</a><br>
<a href="https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption">https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption</a></br></br></br></br></br></br></br></br></p>
<p>スプレッドシートIDはURLから確認できます。<br>
例）<a href="https://docs.google.com/spreadsheets/d/">https://docs.google.com/spreadsheets/d/</a><strong>1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70</strong>/edit#gid=0<br>
太字の部分がスプレッドシートIDになります。<br>
ボディーには追加する値、今回は「posse」を設定します。</br></br></br></p>
<!--kg-card-end: markdown--><pre><code>$spreadsheetId = '1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70';  
$range = 'シート1';  
$values = \[  
    \[  
        'posse'  
    \],  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' =&gt; $values  
\]);  
$params = \[  
    'valueInputOption' =&gt; 'USER\_ENTERED'  
\];  
$result = $service-&gt;spreadsheets\_values-&gt;append($spreadsheetId, $range, $body, $params);  
printf("%d cells appended.", $result-&gt;getUpdates()-&gt;getUpdatedCells());
</code></pre><!--kg-card-begin: markdown--><p>結果のコード全体では下記のようになります。<br>
quickstart.phpという名前で保存しておきます。</br></p>
<!--kg-card-end: markdown--><pre><code>&lt;　?php  
require \_\_DIR\_\_ . '/vendor/autoload.php';  
$client = new Google\_Client();  
$client-&gt;setScopes(Google\_Service\_Sheets::SPREADSHEETS);  
$client-&gt;setAuthConfig('credentials.json');  
$service = new Google\_Service\_Sheets($client);  
$spreadsheetId = '1yZYItshTGo4HRreUhNrTaoCDfxOdZBVm8uZhFWEqA70';  
$range = 'シート1';  
$values = \[  
    \[  
        'posse'  
    \],  
\];  
$body = new Google\_Service\_Sheets\_ValueRange(\[  
    'values' =&gt; $values  
\]);  
$params = \[  
    'valueInputOption' =&gt; 'USER\_ENTERED'  
\];  
$result = $service-&gt;spreadsheets\_values-&gt;append($spreadsheetId, $range, $body, $params);  
printf("%d cells appended.", $result-&gt;getUpdates()-&gt;getUpdatedCells());</code></pre><!--kg-card-begin: markdown--><p>最後に対象のスプレッドシートに、Step1で作ったユーザからアクセス出来るようにアクセス権設定をします。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-43.png" class="kg-image" alt="PHPからGoogleスプレッドシートにデータを登録してみた" loading="lazy" width="657" height="419" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-43.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-43.png 657w"/></figure><!--kg-card-begin: markdown--><p>これで準備完了です。</p>
<p><strong>Step 4: Run the sample</strong></p>
<p><code>root@9046954e4dec:/var/www/html# php quickstart.php   1 cells appended.</code></p>
<p>1セル追加したと出てますね。実際にスプレッドシート見てみます</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-44.png" class="kg-image" alt="PHPからGoogleスプレッドシートにデータを登録してみた" loading="lazy" width="760" height="418" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-44.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-44.png 760w" sizes="(min-width: 720px) 720px"/></figure><!--kg-card-begin: markdown--><p>値が設定できているのでOKですね！サンプルがコピペで動く感じでは無かったのでちょっと時間かかりましたが、割と簡単に動くのを確認出来ました。<br>
あとは今回実装するシステムで、credentials.jsonが外部から見られちゃった。。。ということがないように、気をつけてほしいなと願っています。（もちろん成果物のチェック対象です）</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Signed bitとBITとGoと]]></title><description><![CDATA[目次

 * きっかけ
 * Two’s complement(2の補数)
 * 累積和
 * BIT(binary indexed tree)
 * 転倒数

きっかけ
先日友人から下記の結果についての質問がきた。

package main
import (
  "fmt"
)

func main() {
  const a = ^0 
  fmt.Println(a)
}


皆さんも予想してみてほしい。

実行は↓から

The Go Playground [https://play.golang.org/p/qpWRExXsJ8E]

^0 はNOTでbit反転なのだが、値はintegerのmax値になることなく

`-1` となる。

これは、ご存知Signed Integer で全bitが1の場合はTwo’s complement(2の補数)となり `-1`が出力される。

そして、Goのconstは数値が右辺に来た場合はSigned Integer Typeとデフォルトで解釈する。

では uintのmaxの値をbit反転で取りたい場合はというと


package ]]></description><link>https://tech.anti-pattern.co.jp/signed-bittobittogoto/</link><guid isPermaLink="false">Ghost__Post__60fac55d3986b000013a3d15</guid><category><![CDATA[algorithm]]></category><category><![CDATA[BIT]]></category><category><![CDATA[Go]]></category><category><![CDATA[C++]]></category><category><![CDATA[CS]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 22 Apr 2021 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_OWywy2ytKalepHLU9Ci80Q.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_OWywy2ytKalepHLU9Ci80Q.png" alt="Signed bitとBITとGoと"/><p>目次</p><ul><li>きっかけ</li><li>Two’s complement(2の補数)</li><li>累積和</li><li>BIT(binary indexed tree)</li><li>転倒数</li></ul><h3 id="%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">きっかけ</h3><p>先日友人から下記の結果についての質問がきた。</p><!--kg-card-begin: markdown--><pre><code class="language-go">package main
import (
  &quot;fmt&quot;
)

func main() {
  const a = ^0 
  fmt.Println(a)
}
</code></pre>
<!--kg-card-end: markdown--><p>皆さんも予想してみてほしい。</p><p>実行は↓から</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://play.golang.org/p/qpWRExXsJ8E"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Go Playground</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div><div class="kg-bookmark-thumbnail"><img src="https://play.golang.org/static/gopher.png" alt="Signed bitとBITとGoと"/></div></a></figure><p/><p><code>^0</code> はNOTでbit反転なのだが、値はintegerのmax値になることなく</p><p>`-1` となる。</p><p>これは、ご存知Signed Integer で全bitが1の場合はTwo’s complement(2の補数)となり `-1`が出力される。</p><p>そして、Goのconstは数値が右辺に来た場合はSigned Integer Typeとデフォルトで解釈する。</p><p>では uintのmaxの値をbit反転で取りたい場合はというと</p><!--kg-card-begin: markdown--><pre><code class="language-go">
package main
import (
  &quot;fmt&quot;
)
  
func main() {
  const a = ^uint(0)
  fmt.Println(a)
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://play.golang.org/p/qpWRExXsJ8E"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Go Playground</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div><div class="kg-bookmark-thumbnail"><img src="https://play.golang.org/static/gopher.png" alt="Signed bitとBITとGoと"/></div></a></figure><p>こんな感じで、uint(0)として、bitの幅をuintのbit数としてしてあげると良い。</p><p>そうするとその数のbitが反転し、uintのmax値を取得することができる。</p><h4 id="two%E2%80%99s-complement2%E3%81%AE%E8%A3%9C%E6%95%B0%E3%82%92%E8%BB%BD%E3%81%8F%E5%BE%A9%E7%BF%92">Two’s complement(2の補数)を軽く復習</h4><p>Signed Integerでのマイナス表現はbitを反転させて1を足す。</p><ul><li>12をSigned 8bit Integer で表現すると 0000 1100となる。</li><li>-12の場合はbit反転して1を足すことにより 1111 0100 となる。</li></ul><p>また、-12から12を得るためににも同様に反転させてから1を足す。</p><p>Most Signicant Bit (最上位bit)が0の場合は正の数、0の場合は負の数となる。</p><h3 id="%E5%BF%9C%E7%94%A8">応用</h3><h4 id="least-significant-1-bit">least-significant 1 bit</h4><p>Two’s complementを応用すると、1となっている最下位のbitを取得することができる</p><!--kg-card-begin: markdown--><pre><code class="language-go">a := 12
fmt.Println(a&amp;-a) // 12&amp;-12
</code></pre>
<!--kg-card-end: markdown--><p>0000 1100 &amp; 1111 0100 となり</p><p>結果は 0000 0100 // 3となる</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://play.golang.org/p/2WSqeHyi2aM"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Go Playground</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div><div class="kg-bookmark-thumbnail"><img src="https://play.golang.org/static/gopher.png" alt="Signed bitとBITとGoと"/></div></a></figure><h3 id="bitbinary-indexed-tree">BIT(binary Indexed Tree)</h3><h4 id="%E7%B4%AF%E7%A9%8D%E5%92%8C">累積和</h4><p>vs:=[1,2,4,6,1,4,6,9]</p><p>みたいな数値があった際に、</p><p>S0 = 0<br>S1 = S0 + v0<br>S2 = S1 + v1...</br></br></p><p>としておくことにより、</p><p>各、区間の和の取得に定数時間 O(1)</p><p>値の更新に O(N)かかるデータ構造を作成できる。</p><p>例えば、[v2,v5 )</p><p>の和を計算する際は S5-S2とすればすぐ求まる。</p><h4 id="bit">BIT</h4><p>これの発展形にBIT(binary indexed tree)がある</p><p>これは、区間の和の取得にO(log_N)</p><p>値の更新にO(log_N)で行われる</p><p>これの仕組みに `累積和`と `Two’s complement`が使われている。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/d8ffbc5f54504c39f4bfcfb30be5e9ce"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog ap</div><div class="kg-bookmark-description">blog ap. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Signed bitとBITとGoと"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Signed bitとBITとGoと"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
package main

import &quot;fmt&quot;

type BIT struct {
	n   int
	bit []int
}

func (b *BIT) Sum(a int) int {
	s := 0
	for i := a; i &gt; 0; i -= (i &amp; -i) {
		s += b.bit[i]
	}
	return s
}

func (b *BIT) Add(a, x int) {
	for i := a; i &lt; b.n; i += (i &amp; -i) {
		b.bit[i] += x
	}
}

func (b *BIT) Debug() {
	for _, v := range b.bit {
		fmt.Print(v)
		fmt.Print(&quot; &quot;)
	}
	fmt.Println()
}

func NewBIT(n int) *BIT {
	return &amp;BIT{n + 1, make([]int, n+1)}
}

func main() {
	t := []int{1, 2, 4, 6, 1, 4, 6, 9}

	b2 := NewBIT(len(t))
	for i, v := range t {
		b2.Add(i+1, v)
		b2.Debug()
	}
	fmt.Println(b2.Sum(len(t)))
}
</code></pre>
<!--kg-card-end: markdown--><p>0 1 1 0 1 0 0 0 1 <br>0 1 3 0 3 0 0 0 3 <br>0 1 3 4 7 0 0 0 7 <br>0 1 3 4 13 0 0 0 13 <br>0 1 3 4 13 1 1 0 14 <br>0 1 3 4 13 1 5 0 18 <br>0 1 3 4 13 1 5 6 24 <br>0 1 3 4 13 1 5 6 33 <br>33</br></br></br></br></br></br></br></br></p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*OWywy2ytKalepHLU9Ci80Q.png" class="kg-image" alt="Signed bitとBITとGoと" loading="lazy"/></figure><h3 id="%E8%BB%A2%E5%80%92%E6%95%B0">転倒数</h3><p>BITを使えば、バブルソートの交換回数をO(log_N)で求めることができる。</p><p>※愚直に計算しようとするとO(N²)かかる</p><p>[4, 2, 1, 5, 8, 6, 3, 7]のバブルソートの交換回数を求めている<br>BITを構築しながら、カウントをしていく</br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/59424955a116c1e4e48d82ece94330e6"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ap blog</div><div class="kg-bookmark-description">ap blog. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Signed bitとBITとGoと"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Signed bitとBITとGoと"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
package main

import &quot;fmt&quot;

type BIT struct {
	n   int
	bit []int
}

func (b *BIT) Sum(a int) int {
	s := 0
	for i := a; i &gt; 0; i -= (i &amp; -i) {
		s += b.bit[i]
	}
	return s
}

func (b *BIT) Add(a, x int) {
	for i := a; i &lt; b.n; i += (i &amp; -i) {
		b.bit[i] += x
	}
}

func (b *BIT) Debug() {
	for _, v := range b.bit {
		fmt.Print(v)
		fmt.Print(&quot; &quot;)
	}
	fmt.Println()
}

func NewBIT(n int) *BIT {
	return &amp;BIT{n + 1, make([]int, n+1)}
}

func main() {
	t := []int{4, 2, 1, 5, 8, 6, 3, 7}
	b := NewBIT(len(t))
        ans:=0
	for i, v := range t {
                ans += i-b.Sum(v)
		b.Add(v, 1)
		b.Debug()
	}
	fmt.Println(ans)

}
</code></pre>
<!--kg-card-end: markdown--><p>0 0 0 0 1 0 0 0 1 <br>0 0 1 0 2 0 0 0 2 <br>0 1 2 0 3 0 0 0 3 <br>0 1 2 0 3 1 1 0 4 <br>0 1 2 0 3 1 1 0 5 <br>0 1 2 0 3 1 2 0 6 <br>0 1 2 1 4 1 2 0 7 <br>0 1 2 1 4 1 2 1 8 <br>9</br></br></br></br></br></br></br></br></p><p>参考:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/drken/items/56a6b68edef8fc605821"><div class="kg-bookmark-content"><div class="kg-bookmark-title">累積和を何も考えずに書けるようにする！ - Qiita</div><div class="kg-bookmark-description">0. はじめに 最近では AtCoder がコーディング面接の文脈でも有効なものとしての認識が広まってきています。AtCoder の登竜門といわれる水色を目指すにあたって多くの方が「勉強した」と報告している代表的なアルゴリズム的...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png" alt="Signed bitとBITとGoと"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">drken</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND01N1N2NTZtTjVaS000NEtTNUwyVjQ0S0M2SUNENDRHSTQ0R2E0NEdyNXB1NDQ0R1I0NEtMNDRLSTQ0R0c0NEdyNDRHWjQ0S0w3N3lCJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTQmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWNlbnRlciUyQ21pZGRsZSZzPTE4N2UyYmNjZmE5YjE0NTYyM2JiNzBmNjNmZmQ1MGQz&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RR1J5YTJWdSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPThlZDNkOTIxODRmYzllMWZjZmY3Njk3NTcyYTZjYjY3&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;11d880dee8ae5888ba64889b7e3d06e8" alt="Signed bitとBITとGoと"/></div></a></figure><p><a href="http://hos.ac/slides/20140319_bit.pdf">http://hos.ac/slides/20140319_bit.pdf</a></p>]]></content:encoded></item><item><title><![CDATA[Nuxt.jsでAmazon Cognitoを使う]]></title><description><![CDATA[
nuxt.jsAmplifyを使わずに、認証の部分のみをCognitoに任せてNuxt.jsで使いたい

今回はこの中のAuth.tsのみを使用する。

amplify-js/Auth.ts at master · aws-amplify/amplify-jsA declarative JavaScript
library for application development using cloud services. - amplify-js/Auth.ts
at master · aws-amplify/amplify-jsGitHubaws-amplify
[https://github.com/aws-amplify/amplify-js/blob/master/packages/auth/src/Auth.ts]
Amplifyを使用して、認証画面の自動生成等を行っている記事は多く見かけた。

認証にのみCognitoを使うケース&認証画面はすでにあるものを使いたい場合の記事が少なかったので、こちらに書き記す。

 * 下準備
 * login処理
 * Middlewa]]></description><link>https://tech.anti-pattern.co.jp/nuxt-jsdeamazon-cognitowoshi-u/</link><guid isPermaLink="false">Ghost__Post__60fac06f3986b000013a3cb8</guid><category><![CDATA[Cognito]]></category><category><![CDATA[Nuxt.js]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 22 Apr 2021 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/0_Lc18HgU94OGf5mps.png" medium="image"/><content:encoded><![CDATA[<h3/><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/800/0*Lc18HgU94OGf5mps.png" class="kg-image" alt="Nuxt.jsでAmazon Cognitoを使う" loading="lazy"><figcaption>nuxt.js</figcaption></img></figure><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/0_Lc18HgU94OGf5mps.png" alt="Nuxt.jsでAmazon Cognitoを使う"/><p>Amplifyを使わずに、認証の部分のみをCognitoに任せてNuxt.jsで使いたい</p><p>今回はこの中のAuth.tsのみを使用する。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/aws-amplify/amplify-js/blob/master/packages/auth/src/Auth.ts"><div class="kg-bookmark-content"><div class="kg-bookmark-title">amplify-js/Auth.ts at master · aws-amplify/amplify-js</div><div class="kg-bookmark-description">A declarative JavaScript library for application development using cloud services. - amplify-js/Auth.ts at master · aws-amplify/amplify-js</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Nuxt.jsでAmazon Cognitoを使う"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">aws-amplify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b90772cb2801ccc1d5a77e4b1a9084e65435d90657bdb4ff96bc28d3dae91872/aws-amplify/amplify-js" alt="Nuxt.jsでAmazon Cognitoを使う"/></div></a></figure><p>Amplifyを使用して、認証画面の自動生成等を行っている記事は多く見かけた。</p><p>認証にのみCognitoを使うケース&amp;認証画面はすでにあるものを使いたい場合の記事が少なかったので、こちらに書き記す。</p><ul><li>下準備</li><li>login処理</li><li>Middleware機能を使い、ページ遷移時にUserのセッション確認</li></ul><h3 id="pkgs">pkgs</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/aws-amplify/amplify-js/blob/master/packages/auth/src/Auth.ts"><div class="kg-bookmark-content"><div class="kg-bookmark-title">amplify-js/Auth.ts at master · aws-amplify/amplify-js</div><div class="kg-bookmark-description">A declarative JavaScript library for application development using cloud services. - amplify-js/Auth.ts at master · aws-amplify/amplify-js</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Nuxt.jsでAmazon Cognitoを使う"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">aws-amplify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b90772cb2801ccc1d5a77e4b1a9084e65435d90657bdb4ff96bc28d3dae91872/aws-amplify/amplify-js" alt="Nuxt.jsでAmazon Cognitoを使う"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/nuxt-community/dotenv-module"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - nuxt-community/dotenv-module: Loads your .env file into your application context</div><div class="kg-bookmark-description">Loads your .env file into your application context - GitHub - nuxt-community/dotenv-module: Loads your .env file into your application context</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Nuxt.jsでAmazon Cognitoを使う"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">nuxt-community</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/dcd161dd8129eb9cc85e6718d7451d32862d1297362e8ab1b6fb2b02c3206620/nuxt-community/dotenv-module" alt="Nuxt.jsでAmazon Cognitoを使う"/></div></a></figure><p>.envも使いたいのでこちらも</p><p>yarn add <a href="http://twitter.com/aws" rel="noopener">@aws</a>-amplify/auth<br>yarn add --dev @nuxtjs/dotenv</br></p><p>でインストールする。</p><h3 id="env">.env</h3><!--kg-card-begin: markdown--><pre><code class="language-env">USER_POOL_ID=xxx
IDENTITY_POOL_ID=xxx
USER_POOL_WEB_CLIENT_ID=xxx
REGION=xxx
</code></pre>
<!--kg-card-end: markdown--><p>Cognitoに必要な接続情報を書いておく。</p><h3 id="plugin">plugin</h3><p>次にNuxt.jsのplugins機能を使ってアプリの実行時にConfig情報をセットするようにしておく。</p><p>この際についでに `CognitoUser`もimportして、このpluginから使える用におくと後々便利。</p><p>例：congit-xxx.ts</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">import { Auth, CognitoUser } from '@aws-amplify/auth'
import { Configuration } from '@/generated/types/typescript-axios/configuration'

Auth.configure({
  userPoolId: process.env.USER_POOL_ID ?? '',
  identityPoolId: process.env.IDENTITY_POOL_ID ?? '',
  userPoolWebClientId: process.env.USER_POOL_WEB_CLIENT_ID ?? '',
  region: process.env.REGION ?? '',
  })
  
export default Authexport { CognitoUser }
</code></pre>
<!--kg-card-end: markdown--><p>ここまでやっておくと,</p><!--kg-card-begin: markdown--><p><code>import Auth, { CognitoUser } from ‘@/plugins/cognito-xxx’</code></p>
<!--kg-card-end: markdown--><p>で使えるようになり</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">
methods: {
  async login() {
    const user = await Auth.signIn(this.email, this.password)
  }
}
</code></pre>
<!--kg-card-end: markdown--><p>各 ComponentからAuthに関数処理を使える用になる。</p><p>実際にlogin処理を実行するとローカルストレージに値がはいっていることが確認できる。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*y9PKFogFuTIq_vxk_93UsA.png" class="kg-image" alt="Nuxt.jsでAmazon Cognitoを使う" loading="lazy"/></figure><h3 id="middlewares">Middlewares</h3><p>middleware/authenticated.ts</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">
import Auth from '@/plugins/cognito-xxx'
import { Middleware } from '@nuxt/types'

const myMiddleware: Middleware = async (context) =&gt; {
  try {
    await Auth.currentAuthenticatedUser()
    } catch (error) {
      return context.redirect('/')
    }
  }
}
export default myMiddleware
</code></pre>
<!--kg-card-end: markdown--><p>ページ遷移時に、毎回認証Userを取得することによって、Sessionが生きていればページ遷移、切れていればTopページに移動する。</p><p>※Access Token有効期限が切れている場合にリクエストを投げるので必ずしも毎回リクエストを飛ばしているわけではない。</p><p>上記ルールを適用するpageに下記を追加していく。</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">export default Vue.extend({
  middleware: 'authenticated',
)}
</code></pre>
<!--kg-card-end: markdown--><p>認証されていないUserがアクセスしようとするとTopページに自動的に飛ばされる</p><h3 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h3><p>これで最低限、Nuxt.jsとCognitoを使った下準備はできたのではないだろうか？</p><p>Nuxt.jsには便利な機能がたくさんあるので、楽にこういった処理を作れるのは大変ありがたい。</p>]]></content:encoded></item><item><title><![CDATA[Nuxt.jsでURLをリンクにするコンポーネント作成]]></title><description><![CDATA[こんにちは、いわむらです

今回は、Nuxt.jsでURLを含むテキストを受け取ったらURL部分だけリンクにするコンポーネントの作成について書いていこうと思います

最初に今回利用するNuxt.jsやTypeScript等のバージョンを記載しておきます

Nuxt: 2.14.6
TypeScript: 4.1
Vue: 2.6.12

上記の環境で動作検証を行いました

今回のお題ですが、以下に記述するような文章のURL部分をaタグにしたいというのが課題です

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「日本のソフトウェアエンジニアを憧れの職業へ」
engineedは株式会社アンチパターンの運営するサービスです。
https://info.engineed.io/engineer/
https://anti-pattern.co.jp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
© 2021 Anti-Pattern Inc. All rights reserved.

上記の課題に対して参考にした記事があるので]]></description><link>https://tech.anti-pattern.co.jp/nuxt-jsdeurlworinkunisurukonponentozuo-cheng/</link><guid isPermaLink="false">Ghost__Post__6105355b3986b000013a4a5e</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Fri, 16 Apr 2021 11:44:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回は、Nuxt.jsでURLを含むテキストを受け取ったらURL部分だけリンクにするコンポーネントの作成について書いていこうと思います</p><p>最初に今回利用するNuxt.jsやTypeScript等のバージョンを記載しておきます</p><pre><code>Nuxt: 2.14.6
TypeScript: 4.1
Vue: 2.6.12</code></pre><p>上記の環境で動作検証を行いました</p><p>今回のお題ですが、以下に記述するような文章のURL部分をaタグにしたいというのが課題です</p><pre><code>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「日本のソフトウェアエンジニアを憧れの職業へ」
engineedは株式会社アンチパターンの運営するサービスです。
https://info.engineed.io/engineer/
https://anti-pattern.co.jp/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
© 2021 Anti-Pattern Inc. All rights reserved.</code></pre><p>上記の課題に対して参考にした記事があるのでそちらを先に載せておきます(<a href="https://www.softel.co.jp/blogs/tech/archives/6514" rel="nofollow noopener noopener">https://www.softel.co.jp/blogs/tech/archives/6514</a>)</p><p>作成したコンポーネントは以下になります</p><pre><code>&lt;script lang="ts"&gt;
import Vue from 'vue'
import { VNode } from 'vue/types'
export default Vue.extend({
  name: 'DocumentWithLink',
props: {
    document: {
      type: String,
      required: true,
    },
  },
  render(createElement): VNode {
    // urlをaタグにするために切り分ける
    const separatedDocuments = this.document.split(
      /(https?:\/\/[\w!?\/\+\-_~=;\.,*&amp;@#$%\(\)\'\[\]]+)/i
    )
    const vnodes = separetedDocuments.map(
      (item, index): VNode =&gt; {
        if (index % 2) {
          return createElement(
            'a',
            {
              attrs: {
                href: item,
                target: '_blank',
                rel: 'noopener noreferrer',
              },
            },
            item
          )
        }
        return Vue.prototype.createTextVNode(item)
      }
    )
    return createElement('span', vnodes)
  },
})
&lt;/script&gt;</code></pre><p>作成したコンポーネントは、</p><p>① 文字列を必ず受け取る</p><p>② その文字列をURL部分とそれ以外に分けて配列に入れる</p><p>③ URL部分はaタグにする</p><p>④ それ以外の部分は文字は文字のまま仮想ノードにする</p><p>⑤ 最後に全体をspanでかこったやつを出力する</p><p>こんな感じの流れで作ってみました</p><p>今回のコンポーネントの作成で初めて知ったことがあったのでそちらを共有して終わりにしようかと思います</p><p>今回初めて知ったのですが②の部分の処理に<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split" rel="noopener">split</a>メソッド（メソッドについては<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split" rel="noopener">MDN</a>を参照してください）を利用していまして、今まで使っていた時には区切り文字を返却する配列には含まないイメージだったのですが、区切り文字に指定する正規表現に括弧（ ）をつけてあげることで区切り文字を含む配列を返すようになることを学びました</p><p>みなさんも使う機会があれば使ってみてください</p>]]></content:encoded></item><item><title><![CDATA[Googleスプレッドシートの集計関数について]]></title><description><![CDATA[こおりやまです

最近何かとスプレッドシートで集計関数を利用することが多くなってきたのでまとめてみました。

SUM、COUNT、IF、SWITCH、VLOOKUPなどを多く利用するかと思いますが、 〜 IFS を利用すると複数条件を指定した集計が可能となります。

SUM関数
SUM関数 はみなさんも知っている通り指定範囲を集計します、「SUM(値1, 値2)」で定義します。

SUM IF関数
「SUMIF(範囲, 条件, 合計範囲)」と指定出来検索条件に一致する箇所の合計値になります。

SUM IFS関数
「**SUMIFS(合計範囲, 条件範囲1, 条件1, [条件範囲2, 条件2, …])」と指定できます。

SUM IFとSUM IFSに共に集計するために条件を指定できるのですが、条件を複数指定したい場合、〜IFSを利用します。

条件を直接式内に記述指定ますが用途としては以下のような感じでしょか。



IF/IFSに関しては、合計範囲の指定箇所が異なり、最終的に条件を追加したくなるパターンがだいたい発生するので、最初からIFS利用したほうが修正の手間が省けます。

C]]></description><link>https://tech.anti-pattern.co.jp/googlesupuretudositonoji-ji-guan-shu-nituite/</link><guid isPermaLink="false">Ghost__Post__610bbc4a3986b000013a52d6</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Mon, 12 Apr 2021 10:26:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こおりやまです</p>
<p>最近何かとスプレッドシートで集計関数を利用することが多くなってきたのでまとめてみました。</p>
<p>SUM、COUNT、IF、SWITCH、VLOOKUPなどを多く利用するかと思いますが、 〜 IFS を利用すると複数条件を指定した集計が可能となります。</p>
<p><strong>SUM関数</strong><br>
SUM関数 はみなさんも知っている通り指定範囲を集計します、「SUM(値1, 値2)」で定義します。</br></p>
<p><strong>SUM IF関数</strong><br>
「SUMIF(範囲, 条件, 合計範囲)」と指定出来検索条件に一致する箇所の合計値になります。</br></p>
<p><strong>SUM IFS関数</strong><br>
「**SUMIFS(合計範囲, 条件範囲1, 条件1, [条件範囲2, 条件2, …])」と指定できます。</br></p>
<p>SUM IFとSUM IFSに共に集計するために条件を指定できるのですが、条件を複数指定したい場合、〜IFSを利用します。</p>
<p>条件を直接式内に記述指定ますが用途としては以下のような感じでしょか。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_N47t1-cyEjaUG5cdNKo64w--1-.png" alt="1_N47t1-cyEjaUG5cdNKo64w--1-" loading="lazy"/></p>
<p>IF/IFSに関しては、合計範囲の指定箇所が異なり、最終的に条件を追加したくなるパターンがだいたい発生するので、最初からIFS利用したほうが修正の手間が省けます。</p>
<p>COUNT関数も同様に、COUNT(値1, [値2, …])、COUNTIF(範囲, 条件)、COUNTIFS(条件範囲1, 条件1, [条件範囲2, 条件2, …])があり、条件を複数指定しながら件数の取得が可能です。</p>
<p>ほかMAX（最大）、MIN（最小）、AVERAGE（平均）などにも、IF/IFSと定義されています。</p>
<p>このブログ書いていて初めて知ったのですが、IFにもIFSがあることを知りました！</p>
<p>今まで入れ子またはSWITCHで書いていた、知らなかった〜</p>
<p>関数のリストなど、こちらを参照しています。<br>
<a href="https://support.google.com/docs/table/25273?hl=ja&amp;ref_topic=3105474#">https://support.google.com/docs/table/25273?hl=ja&amp;ref_topic=3105474#</a></br></p>
<p>ではでは</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[【Vuetify】v-skeleton-loaderのProps６種を検証してみた。]]></title><description><![CDATA[こんにちは、たかはしです。今回はVuetifyの理解を深めるため、UIコンポーネントの中でもあまりサンプルがなく、利用したことのない「Skeleton
loaders」について、色々と検証したことを書いていこうと思います。

v-skeleton-loaderとは
主に、コンテンツがロードされていることを表現するためのコンポーネントです。例えば、画像の取得が終わらない時に代わりに画像を表示する予定のエリアに配置することで、「画像を読み込み中ですよ」と表現できます。

サンプル（読み込みしているように表現できる）Propsを6種を検証してみる
Vuetifyの公式APIを確認してみると、v-skeleton-loaderのPropsは結構ありますが、それに対してサンプルがあまり用意されていません。実際に業務で使うことがなければ、どんな挙動をするのかわからないので、いくつかのPropsの挙動を検証してみたいと思います。

v-skeleton-loader APIAPI for the v-skeleton-loader component.Vuetify
[https://vuetify]]></description><link>https://tech.anti-pattern.co.jp/vuetify-v-skeleton-loadernoprops6zhong-wojian-zheng-sitemita/</link><guid isPermaLink="false">Ghost__Post__610a1bb43986b000013a4e73</guid><dc:creator><![CDATA[Yasuhiro Takahashi]]></dc:creator><pubDate>Thu, 08 Apr 2021 03:00:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、たかはしです。今回はVuetifyの理解を深めるため、UIコンポーネントの中でもあまりサンプルがなく、利用したことのない「Skeleton loaders」について、色々と検証したことを書いていこうと思います。</p><h3 id="v-skeleton-loader%E3%81%A8%E3%81%AF">v-skeleton-loaderとは</h3><p>主に、コンテンツがロードされていることを表現するためのコンポーネントです。例えば、画像の取得が終わらない時に代わりに画像を表示する予定のエリアに配置することで、「画像を読み込み中ですよ」と表現できます。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_OJWxjRZ" src="https://codepen.io/yasuhirotakahashi/embed/preview/OJWxjRZ?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=OJWxjRZ" title="skeleton-loader samle" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>サンプル（読み込みしているように表現できる）</figcaption></figure><h4 id="props%E3%82%926%E7%A8%AE%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">Propsを6種を検証してみる</h4><p>Vuetifyの公式APIを確認してみると、v-skeleton-loaderのPropsは結構ありますが、それに対してサンプルがあまり用意されていません。実際に業務で使うことがなければ、どんな挙動をするのかわからないので、いくつかのPropsの挙動を検証してみたいと思います。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/api/v-skeleton-loader/#props"><div class="kg-bookmark-content"><div class="kg-bookmark-title">v-skeleton-loader API</div><div class="kg-bookmark-description">API for the v-skeleton-loader component.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/components/skeleton-loaders/#section-30dc30a430e930fc30d730ec30fc30c830fb30b330f330dd30fc30cd30f330c8"><div class="kg-bookmark-content"><div class="kg-bookmark-title">スケルトンローダー・コンポーネント</div><div class="kg-bookmark-description">v-skeleton-loader コンポーネントは、プロジェクト内の多くの役割を満たすことができる多彩なツールです。 中心にあるコンポーネントは、何かが来ているが、まだ利用できないというユーザーへの指示を提供します。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><h4 id="boilerplate">boilerplate</h4><p>読み込みアニメーションを無効にしてくれます。</p><p>無効時はアニメーションとマウスオーバー時にカーソルにアイコンがなくなっていますね。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_mdRBMvG" src="https://codepen.io/yasuhirotakahashi/embed/preview/mdRBMvG?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=mdRBMvG" title="sl samle boilerplate" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左：boilerplate=false、右：boilerplate=true</figcaption></figure><h4 id="loading">loading</h4><p>これは少し特殊でloadingがtrue時は特に変化はないのですが、falseの時にdefaultスロットにコンテンツを設定していると、そのコンテンツが表示されるようです。</p><p>loadingのtrue,falseを切り替えるサンプルを用意してみました、挙動が確認できると思います。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_abpLLYG" src="https://codepen.io/yasuhirotakahashi/embed/preview/abpLLYG?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=abpLLYG" title="sl sample loading" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左：defaultスロットにコンテンツあり、右：コンテンツなし・loadingの追加のみ</figcaption></figure><h4 id="transition">transition</h4><p>コンポーネントのトランジションを設定できます。どんな挙動になるのか検証したところ先ほどのloadingと組み合わせると、コンテンツの切り替え時にtransitionに設定した値が反映されるみたいです。読み込み完了時にコンテンツと入れ替える時に使えそうですね。サンプル用意してみました。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_vYgeWdG" src="https://codepen.io/yasuhirotakahashi/embed/preview/vYgeWdG?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=vYgeWdG" title="sl sample transition" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左：スケールするtransition、右：スライドするtransition</figcaption></figure><h4 id="tile">tile</h4><p>各コンポーネントの四隅の丸みがなくなります、、、以上！。サンプルを用意しましたので、違いを確認できると思います。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_qBRPpEZ" src="https://codepen.io/yasuhirotakahashi/embed/preview/qBRPpEZ?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=qBRPpEZ" title="sl sample tile" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左：tile=false、右：tile=true</figcaption></figure><h4 id="type">type</h4><p>表示するスケルトンの表示内容を設定できます。文字列で指定するのですが、事前に定義されているものがあるため、それを設定することで表示内容が変化します。また、カンマ区切りで複数の表示内容を組み合わせることもできます。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_GRrMyzX" src="https://codepen.io/yasuhirotakahashi/embed/preview/GRrMyzX?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=GRrMyzX" title="sl sample type" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左から、type=”card”, type=”card-avatar”, type=”paragraph”, type=”paragraph, paragraph, paragraph”</figcaption></figure><p>VuetifyのUIコンポーネントと対応した表示形式が事前に定義されているので、スケルトンを配置したいコンポーネントに合わせて柔軟に対応できそうです。公式サイトに載っているものだけでも、30種類はあります。</p><h4 id="types">types</h4><p>先ほど述べた30種類の定義されているリストをカスタムできます。例えば 既存で{<code>card: image, card-heading</code>}という定義があるのですが、それを上書きすることができます。{<code>card: image, card-heading, card-heading</code>}というオブジェクトを用意してtypesにセット、typeにcardを指定してあげると内容が変化します。独自のスケルトンを作成して、共通で利用したい際に便利な気がします。</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_rNjGJMm" src="https://codepen.io/yasuhirotakahashi/embed/preview/rNjGJMm?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=rNjGJMm" title="sl sample types" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/><figcaption>左：typesを指定、右：typesを未指定</figcaption></figure><p>以上が、v-skeleton-loaderのPropsでどのようなことができるのか検証した結果になります。割と触ったことのないUIコンポーネントを今回のように一つ一つ検証するのは、Vuetifyの理解に繋がりました。</p><p>まだまだVuetifyのUIコンポーネントはあるので、今後をやってみようかなと思います。</p><h3 id="reference">Reference</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/components/skeleton-loaders/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">スケルトンローダー・コンポーネント</div><div class="kg-bookmark-description">v-skeleton-loader コンポーネントは、プロジェクト内の多くの役割を満たすことができる多彩なツールです。 中心にあるコンポーネントは、何かが来ているが、まだ利用できないというユーザーへの指示を提供します。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/api/v-skeleton-loader/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">v-skeleton-loader API</div><div class="kg-bookmark-description">API for the v-skeleton-loader component.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする]]></title><description><![CDATA[オザサです。
engineedというAWSエンジニア特化型マッチングプラットフォームでは、Atomic Designを導入しています。

フロントはNuxt.js(TypeScript)/Vuetifyで実装されており、デザインの段階ではFigmaを使用しています。デザインの段階からコンポーネントの設計をできれば、実装の段階で行われる議論の濃度を高めることができるのではと思い、デザインワークフローを整えてきまして、ある程度形になってきたのでシェアしようというのが本稿の趣旨です。

■前提
ライブラリをフル活用して開発を進めていくことで、開発のスピードをあげようというのが基本的な考え方にありました。

■下準備
・FigmaのPagesにComponentsとAppを作成します。
ComponentsはNuxt.jsプロジェクトのcomponentsディレクトリと対応させています。
AppはNuxt.jsプロジェクトのpagesディレクトリと対応させています。

・ComponentsにAssets/Atoms/Molecules/Organismsというフレームを作成します。


■デ]]></description><link>https://tech.anti-pattern.co.jp/designing-a-web-application-using-figma-and-atomicdesign/</link><guid isPermaLink="false">Ghost__Post__60ebf3523986b000013a36ed</guid><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Mon, 05 Apr 2021 08:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/engineed_figma.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/engineed_figma.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする"/><p>オザサです。<br>
engineedというAWSエンジニア特化型マッチングプラットフォームでは、Atomic Designを導入しています。</br></p>
<p>フロントはNuxt.js(TypeScript)/Vuetifyで実装されており、デザインの段階ではFigmaを使用しています。デザインの段階からコンポーネントの設計をできれば、実装の段階で行われる議論の濃度を高めることができるのではと思い、デザインワークフローを整えてきまして、ある程度形になってきたのでシェアしようというのが本稿の趣旨です。</p>
<h2 id="%E2%96%A0%E5%89%8D%E6%8F%90">■前提</h2>
<p>ライブラリをフル活用して開発を進めていくことで、開発のスピードをあげようというのが基本的な考え方にありました。</p>
<h2 id="%E2%96%A0%E4%B8%8B%E6%BA%96%E5%82%99">■下準備</h2>
<h3 id="%E3%83%BBfigma%E3%81%AEpages%E3%81%ABcomponents%E3%81%A8app%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82">・FigmaのPagesにComponentsとAppを作成します。</h3>
<p>ComponentsはNuxt.jsプロジェクトのcomponentsディレクトリと対応させています。<br>
AppはNuxt.jsプロジェクトのpagesディレクトリと対応させています。</br></p>
<h3 id="%E3%83%BBcomponents%E3%81%ABassetsatomsmoleculesorganisms%E3%81%A8%E3%81%84%E3%81%86%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82">・ComponentsにAssets/Atoms/Molecules/Organismsというフレームを作成します。</h3>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma1.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<h2 id="%E2%96%A0%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC">■デザインワークフロー</h2>
<h3 id="%E3%83%BBasset%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B">・Assetを用意する</h3>
<p>必要な素材はまず準備しておきます。<br>
ロゴ画像やアイコンなどはAssetsに格納します。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma2.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<h3 id="%E3%83%BBvuetify%E3%81%8B%E3%82%89%E6%8E%A2%E3%81%99">・Vuetifyから探す</h3>
<p>Atomic Designを活用する上で、このプロジェクトではAtomsはVuetifyのコンポーネントとしています。<br>
なので、デザインをする上では仕様を満たすコンポーネントがあるかをVuetifyのライブラリから探す作業から始めます。</br></p>
<h3 id="%E3%83%BBatoms%E3%82%92%E4%BD%9C%E3%82%8B">・Atomsを作る</h3>
<p>Vuetifyで使うものを決めたらそれをFigma上に再現します。<br>
「Vuetify Components」という有志が作ったFigmaから引用することも行います。<br>
<a href="https://www.figma.com/community/file/809503557326720142">https://www.figma.com/community/file/809503557326720142</a></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma3.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<p>この例ではv-btnとv-text-fieldを再現しています。<br>
この時点で作ったものはコンポーネントとして設定しておきます。</br></p>
<h3 id="%E3%83%BBmolecules%E3%82%92%E4%BD%9C%E3%82%8B">・Moleculesを作る</h3>
<p>Atomsにある任意のコンポーネントをインスタンス化して組み合わせます。<br>
組み合わせたものをコンポーネントとして設定します。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma4.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<p>この例ではv-btnとv-text-fieldを組み合わせて検索フォーム(ESearchForm)を作っています。ここでいうEとはengineedです。対象のアプリごとに独自の接頭語を付けると良いでしょう。</p>
<h3 id="%E3%83%BBorganisms%E3%82%92%E4%BD%9C%E3%82%8B">・Organismsを作る</h3>
<p>AssetsやAtoms、Moleculesを組み合わせてOrganismsをコンポーネントとして設定します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma5.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<p>例ではロゴ入りのヘッダー(EAppHeader)を作っています。<br>
Vuetifyにはv-app-barがあるので通常はそれとの組み合わせになるでしょうがここではあくまで例として。</br></p>
<h3 id="%E3%83%BBpages%E3%82%92app%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E9%85%8D%E7%BD%AE">・pagesをAppに切り替えてインスタンスを配置</h3>
<p>基本的に作業はComponentsで行いAppは貼り付けるだけにします。<br>
これによりコンポーネントに変更があった際Appにも適切に反映されるようにしています。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/engineed_figma6.png" alt="Figmaを使ってAtomicDesignを導入したWebアプリケーションのデザイン設計をする" loading="lazy"/></p>
<h3 id="%E3%83%BB%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC">・開発者によるレビュー</h3>
<p>デザインができてコンポーネントの設計までできたら開発者にレビューをもらいます。この時点である程度フィードバックをもらうことで実装時との認識ずれを軽減します。</p>
<h3 id="%E3%83%BB%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0">・リファクタリング</h3>
<p>実際にコードにする際、Figma上のコンポーネント設計から変わることもあります。</p>
<p>具体的にはダウンロード機能つきリンクをあまり深くまで考えず、デザイン上は単なるAtomとして定義してしまっていたのですが、汎用性を認められMoleculeとして実装されました。</p>
<p>実際にどう実装されているのかはコードを見ながら、適宜Figmaに反映していきます。当然実装されたコードを正とします。</p>
<p>こんな具合でFigmaを活用していくと、最初こそ大変ですが、あとからはありものの組み合わせだけでデザインができるようになり、スピードと品質が担保できます。</p>
<h2 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h2>
<p>今は僕がデザインをやっているのですが、代表取締役としてのタスクも盛り盛りになってきたので大変です。</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[PostgreSQL ユニーク制約とユニークインデックス]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。
今回のブログは、あるカラムにユニーク制約を設定した時のお話です

制約とは
https://www.postgresql.jp/document/12/html/ddl-constraints.html

> データ型は、テーブルに格納するデータの種類を限定するための方法です。 しかし、多くのアプリケーションでは、型が提供する制約では精密さに欠けます。
例えば、製品の価格が入る列には、おそらく正数のみを受け入れるようにする必要があります。 しかし、正数のみを受け入れるという標準のデータ型はありません。
また、他の列や行に関連して列データを制約したい場合もあります。
例えば、製品の情報が入っているテーブルでは、1つの製品番号についての行が2行以上あってはなりません。

このような問題を解決するため、SQLでは列およびテーブルに対する制約を定義することができます。 制約によってテーブル内のデータを自由に制御することができます。
制約に違反するデータを列に格納しようとすると、エラーとなります。 このことは、デフォルト値として定義され]]></description><link>https://tech.anti-pattern.co.jp/postgresql-yunikuzhi-yue-toyunikuindetukusu/</link><guid isPermaLink="false">Ghost__Post__610e12c23986b000013a53a4</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 29 Mar 2021 05:25:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-1.jpg" alt="PostgreSQL ユニーク制約とユニークインデックス"/><p>こんにちは、Anti-Pattern Inc.の塚本です。<br>
今回のブログは、あるカラムにユニーク制約を設定した時のお話です</br></p>
<h3 id="%E5%88%B6%E7%B4%84%E3%81%A8%E3%81%AF">制約とは</h3>
<p><a href="https://www.postgresql.jp/document/12/html/ddl-constraints.html">https://www.postgresql.jp/document/12/html/ddl-constraints.html</a></p>
<blockquote>
<p>データ型は、テーブルに格納するデータの種類を限定するための方法です。 しかし、多くのアプリケーションでは、型が提供する制約では精密さに欠けます。 例えば、製品の価格が入る列には、おそらく正数のみを受け入れるようにする必要があります。 しかし、正数のみを受け入れるという標準のデータ型はありません。 また、他の列や行に関連して列データを制約したい場合もあります。 例えば、製品の情報が入っているテーブルでは、1つの製品番号についての行が2行以上あってはなりません。</p>
<p>このような問題を解決するため、SQLでは列およびテーブルに対する制約を定義することができます。 制約によってテーブル内のデータを自由に制御することができます。 制約に違反するデータを列に格納しようとすると、エラーとなります。 このことは、デフォルト値として定義された値を格納する場合にも適用されます。</p>
</blockquote>
<p>PostgreSQL 12.4 第5章 データ定義 5.4. 制約からの引用です。<br>
テーブル、カラムに特定の制限をかける事ができるって事ですね。</br></p>
<h2 id="alter-table%E6%96%87%E3%81%A7%E6%A4%9C%E8%A8%BC">ALTER TABLE文で検証</h2>
<p>例えばこのようなテーブル構成で、nameにユニーク制約を設定してみます</p>
<pre><code>CREATE TABLE fruits
(
  id   serial  NOT NULL,
  name varchar NOT NULL,
  PRIMARY KEY (id)
);
</code></pre>
<pre><code>ALTER TABLE fruits ADD UNIQUE(name);
</code></pre>
<pre><code>=&gt; ALTER TABLE fruits ADD UNIQUE(name);
ALTER TABLE

=&gt; \d fruits
 Column |       Type        | Collation | Nullable |              Default   
--------+-------------------+-----------+----------+------------------------
 id     | integer           |           | not null | nextval('fruits_id_seq'::regclass)
 name   | character varying |           | not null | 
Indexes:
    &quot;fruits_pkey&quot; PRIMARY KEY, btree (id)
    &quot;fruits_name_key&quot; UNIQUE CONSTRAINT, btree (name)

</code></pre>
<blockquote>
<p>一意性制約を追加すると、制約で指定された列または列のグループに対して一意的なBツリーのインデックスが自動的に作られます。</p>
</blockquote>
<p>PostgreSQL 12.4 第5章 データ定義 5.4. 制約からの引用です。</p>
<p>Indexesの最後の行に”UNIQUE CONSTRAINT”と出力されてますので、設定されている事がわかります。</p>
<p>システムカタログも確認してみます</p>
<pre><code>=&gt; select * from pg_class where relname = 'fruits';
-[ RECORD 1 ]-------+--------
relname             | fruits
relnamespace        | 16386
reltype             | 8289445
reloftype           | 0
relowner            | 16385
relam               | 0
relfilenode         | 8289443
reltablespace       | 0
relpages            | 0
reltuples           | 0
relallvisible       | 0
reltoastrelid       | 8289447
relhasindex         | t
relisshared         | f
relpersistence      | p
relkind             | r
relnatts            | 2
relchecks           | 0
relhasoids          | f
relhasrules         | f
relhastriggers      | f
relhassubclass      | f
relrowsecurity      | f
relforcerowsecurity | f
relispopulated      | t
relreplident        | d
relispartition      | f
relrewrite          | 0
relfrozenxid        | 4334146
relminmxid          | 1
relacl              | 
reloptions          | 
relpartbound        | 
</code></pre>
<p>pg_classカタログに格納されているfruitsテーブルの情報を確認します。ここでは、relfilenodeの値 8289443に注目します。</p>
<p>pg_constraint カタログに格納されている制約情報を確認します。conrelidはこの制約が設定されているテーブルのoidが設定されます。conrelidは8289443が設定されています。contype = u は一意性制約を表しています。</p>
<pre><code>=&gt; select * from pg_constraint where conrelid = 8289443;
conname       | fruits_name_key
connamespace  | 16386
contype       | u
condeferrable | f
condeferred   | f
convalidated  | t
conrelid      | 8289443
contypid      | 0
conindid      | 8289452
conparentid   | 0
confrelid     | 0
confupdtype   |  
confdeltype   |  
confmatchtype |  
conislocal    | t
coninhcount   | 0
connoinherit  | t
conkey        | {2}
confkey       | 
conpfeqop     | 
conppeqop     | 
conffeqop     | 
conexclop     | 
conbin        | 
consrc        | 
</code></pre>
<p>また、pg_constraintカタログのconindidはこの制約で利用されるインデックスのoidが設定されます。</p>
<p>pg_indexカタログを確認すると対応するインデックス情報が格納されています。indisunique = t が一意性インデックスを表しています。indrelidには、このインデックスが使われるテーブルのoidが設定されるので、fruitstテーブルの8289443が設定されています。</p>
<pre><code>=&gt; select * from pg_index where indrelid = 8289443;
indexrelid     | 8289452
indrelid       | 8289443
indnatts       | 1
indnkeyatts    | 1
indisunique    | t
indisprimary   | f
indisexclusion | f
indimmediate   | t
indisclustered | f
indisvalid     | t
indcheckxmin   | f
indisready     | t
indislive      | t
indisreplident | f
indkey         | 2
indcollation   | 100
indclass       | 3126
indoption      | 0
indexprs       | 
indpred        | 
</code></pre>
<h3 id="%E6%A4%9C%E8%A8%BC">検証</h3>
<p>同じnameを設定してinsertするとエラーが発生します。正しく機能している事がわかりました。</p>
<pre><code>=&gt; insert into fruits (name) values ('apple');
INSERT 0 1

=&gt; insert into fruits (name) values ('apple');
ERROR:  duplicate key value violates unique constraint &quot;fruits_name_key&quot;
DETAIL:  Key (name)=(apple) already exists.

</code></pre>
<h2 id="unique-index%E6%96%87%E3%81%A7%E6%A4%9C%E8%A8%BC">UNIQUE INDEX文で検証</h2>
<p>ALTER TABLE文で、fruitsテーブルにUNIQUE属性を追加した場合に、一意性インデックスが作成されました。一意制約はそのインデックスで実現されている事わかったので、一意インデックスだけ作成してみます。</p>
<pre><code>CREATE UNIQUE INDEX unique_idx_fruits_name ON fruits (name);
</code></pre>
<pre><code>=&gt; CREATE UNIQUE INDEX unique_idx_fruits_name ON fruits (name);
CREATE INDEX

=&gt; \d fruits
 Column |       Type        | Collation | Nullable |              Default               
--------+-------------------+-----------+----------+------------------------
 id     | integer           |           | not null | nextval('fruits_id_seq'::regclass)
 name   | character varying |           | not null | 
Indexes:
    &quot;fruits_pkey&quot; PRIMARY KEY, btree (id)
    &quot;unique_idx_fruits_name&quot; UNIQUE, btree (name)
</code></pre>
<p>unique_idx_fruits_nameが作成されています。ただ、CONSTRAINTの出力がありません。</p>
<h3 id="%E6%A4%9C%E8%A8%BC">検証</h3>
<p>同じnameを設定してinsertするとエラーが発生します。正しい挙動はしてそうです。</p>
<pre><code>=&gt; insert into fruits (name) values ('apple');
INSERT 0 1

=&gt; insert into fruits (name) values ('apple');
ERROR:  duplicate key value violates unique constraint &quot;unique_idx_fruits_name&quot;
DETAIL:  Key (name)=(apple) already exists.
</code></pre>
<p>同様にシステムカタログを確認します。</p>
<pre><code>=&gt; select * from pg_class where relname = 'fruits';
relname             | fruits
relnamespace        | 16386
reltype             | 8289458
reloftype           | 0
relowner            | 16385
relam               | 0
relfilenode         | 8289456
reltablespace       | 0
relpages            | 0
reltuples           | 0
relallvisible       | 0
reltoastrelid       | 8289460
relhasindex         | t
relisshared         | f
relpersistence      | p
relkind             | r
relnatts            | 2
relchecks           | 0
relhasoids          | f
relhasrules         | f
relhastriggers      | f
relhassubclass      | f
relrowsecurity      | f
relforcerowsecurity | f
relispopulated      | t
relreplident        | d
relispartition      | f
relrewrite          | 0
relfrozenxid        | 4334153
relminmxid          | 1
relacl              | 
reloptions          | 
relpartbound        | 

=&gt; select * from pg_constraint where conrelid = 8289456;
conname       | fruits_pkey
connamespace  | 16386
contype       | p
condeferrable | f
condeferred   | f
convalidated  | t
conrelid      | 8289456
contypid      | 0
conindid      | 8289463
conparentid   | 0
confrelid     | 0
confupdtype   |  
confdeltype   |  
confmatchtype |  
conislocal    | t
coninhcount   | 0
connoinherit  | t
conkey        | {1}
confkey       | 
conpfeqop     | 
conppeqop     | 
conffeqop     | 
conexclop     | 
conbin        | 
consrc        | 

=&gt; select * from pg_index where indrelid = 8289456;
-[ RECORD 1 ]--+--------
indexrelid     | 8289465
indrelid       | 8289456
indnatts       | 1
indnkeyatts    | 1
indisunique    | t
indisprimary   | f
indisexclusion | f
indimmediate   | t
indisclustered | f
indisvalid     | t
indcheckxmin   | f
indisready     | t
indislive      | t
indisreplident | f
indkey         | 2
indcollation   | 100
indclass       | 3126
indoption      | 0
indexprs       | 
indpred        | 
-[ RECORD 2 ]--+--------
indexrelid     | 8289463
indrelid       | 8289456
indnatts       | 1
indnkeyatts    | 1
indisunique    | t
indisprimary   | t
indisexclusion | f
indimmediate   | t
indisclustered | f
indisvalid     | t
indcheckxmin   | f
indisready     | t
indislive      | t
indisreplident | f
indkey         | 1
indcollation   | 0
indclass       | 1978
indoption      | 0
indexprs       | 
indpred        | 
</code></pre>
<p>unique_idx_fruits_nameは制約名ではないので、pg_constraintには格納されてません。</p>
<p>indrelidを指定しているので2件取得されてますが、RECORD 2の方が追加した一意インデックスです。(RECORD 1は主キーに対するインデックス)</p>
<h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3>
<pre><code>① ALTER TABLE fruits ADD UNIQUE(name);  
② CREATE UNIQUE INDEX unique_idx_fruits_name ON fruits (name);
</code></pre>
<p>②の場合はpg_constraintカタログ（テーブル上の検査制約）に登録されない事がわかりましたが、①、②どちらも、ユニークインデックスが作成され、期待していた挙動の確認はできました。</p>
<p>モヤモヤするので、PostgreSQLのマニュアルを見ると、次のように書かれています。</p>
<blockquote>
<p>インデックスは、列値の一意性や、複数列を組み合わせた値の一意性を強制するためにも使用できます。<br>
PostgreSQLでは、テーブルに一意性制約または主キーが定義されると、自動的に一意インデックスを作成します。 このインデックスが、主キーや一意性制約（適切ならば複数列のインデックスで）となる列に対して作成され、この制約を強制する機構となります。</br></p>
<p>PostgreSQL 12.4文書 第11章 インデックス 11.6. 一意インデックス 引用</p>
</blockquote>
<p>また、9.4以前のマニュアルで、11.6. Unique IndexesのNoteには、<br>
The preferred way to add a unique constraint to a table is ALTER TABLE … ADD CONSTRAINT.<br>
という記述があり、ALTER TABLEが推奨されていたようだけど、それ以降のバージョンではその記述がありません・・・</br></br></p>
<p>テーブル制約として設定するカラムの一意制約と、ユニークインデックス。ムムム・・・と、なったのですがマニュアルにはこんな記述もありした。</p>
<blockquote>
<p>一意性制約を追加すると、制約で指定された列または列のグループに対して一意的なBツリーのインデックスが自動的に作られます。 一部の行だけに適用される一意性の制限を一意性制約として作成することはできませんが、そのような制限を一意な<a href="https://www.postgresql.jp/document/12/html/indexes-partial.html">部分インデックス</a>を作成することで実現することは可能です。</p>
</blockquote>
<p>一意制約（テーブル制約、ユニークインデックス）は同じ挙動。一意制約として部分インデックスを指定する場合は、テーブル制約は付けられないということでしょうかね。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる]]></title><description><![CDATA[Photo by Becca Tapert
[https://unsplash.com/@beccatapert?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
Google検索結果の、リッチリザルトってご存知ですか？
リッチリザルトは通常の検索結果表示と違い、写真やカード形式などで表示される検索結果のことです。

※リッチリザルトとは [https://support.google.com/webmasters/answer/7506797?hl=ja]

head内に構造化データを埋め込み、Googleにうまく認識してもらえると、リッチリザルトとして表示されるようになります。
構造化データの例：
https://developers.google.com/search/docs/data-types/recipe?h]]></description><link>https://tech.anti-pattern.co.jp/shopify_blog/</link><guid isPermaLink="false">Ghost__Post__610442fa3986b000013a47c9</guid><category><![CDATA[Shopify]]></category><category><![CDATA[SEO]]></category><category><![CDATA[Rich Result]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Wed, 17 Mar 2021 18:34:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="4993" height="3329" srcset="https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@beccatapert?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Becca Tapert</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1556909211-36987daf7b4d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fFJlY2lwZXxlbnwwfHx8fDE2Mjc2NjkzOTc&ixlib=rb-1.2.1&q=80&w=2000" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる"/><p>Google検索結果の、リッチリザルトってご存知ですか？<br>リッチリザルトは通常の検索結果表示と違い、写真やカード形式などで表示される検索結果のことです。</br></p><p><a href="https://support.google.com/webmasters/answer/7506797?hl=ja">※リッチリザルトとは</a></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-26.png" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="1400" height="826" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-26.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-26.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-26.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>head内に構造化データを埋め込み、Googleにうまく認識してもらえると、リッチリザルトとして表示されるようになります。<br>構造化データの例：<a href="https://developers.google.com/search/docs/data-types/recipe?hl=ja#guidelines" rel="noopener nofollow">https://developers.google.com/search/docs/data-types/recipe?hl=ja#guidelines</a></br></p><p>Shopifyのブログで、レシピの記事を書いたときにリッチリザルトとして表示されるように構造化データを埋め込むのをやってみたので、まとめていきます。</p><p>theme.liquidの&lt;head&gt;タグ内に以下を追記します。</p><!--kg-card-begin: markdown--><pre><code>{% if template == 'article' %}
  {% for tag in article.tags %}
    {% if tag == 'レシピ' %}
      {% capture filename %}google_rich_contents_recipe_{{ article.id }}{% endcapture %}
      {% include filename %}
    {% endif %}
  {% endfor %}
{% endif %}
</code></pre>
<!--kg-card-end: markdown--><p>shopifyのページの殆どは、theme.liquidというレイアウトが最初に読み込まれます。テンプレートがarticle（ブログ記事ページ）で、「レシピ」というタグがついていた場合に、snippetが埋め込まれるよう設定します。</p><p>レシピのタグを付けたブログを作成すると、ページ上部にsnippetsディレクトリに、該当のファイルがないという意味のエラーが出現します。</p><p>Liquid error: Could not find asset snippets/google_rich_contents_recipe_555492081762.liquid</p><p>※数字部分は人それぞれブログ記事のIDが表示されます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-27.png" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="1400" height="366" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-27.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-27.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>オンラインストアのコードの編集から、新しいsnippetsを上記で表示されていたファイル名で追加し、構造化データテキストを保存します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-28.png" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="1400" height="909" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-28.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-28.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-28.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>snippetsにファイルを保存すると、エラーが消えます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-29.png" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="1400" height="659" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-29.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-29.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-29.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>リッチリザルトの構造化データが正しくセットされているかどうかは、<a href="https://search.google.com/test/rich-results">こちらのサイト</a>でチェックすることができます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-30.png" class="kg-image" alt="Shopifyのブログ記事をGoogle検索結果のリッチリザルトで表示させる" loading="lazy" width="1400" height="569" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-30.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-30.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-30.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>うまくいっているようです！</p><p>他の方法で構造化データをもたせる方法がありましたら、逆に教えてほしいです！</p>]]></content:encoded></item><item><title><![CDATA[区間DPのテーブルを可視化してわかりやすくしてみた]]></title><description><![CDATA[
前回
DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化するやることMediumkooooohe
[https://medium.com/@1211lta/dp-dynamic-programming-%E3%82%92vue3-0-with-ts-primevue%E3%81%A7%E8%A6%96%E8%A6%9A%E5%8C%96%E3%81%99%E3%82%8B-2c84c749f340]
区間DP
DP(動的計画法)の中で区間を状態として表すものをいう。

[a,b,c,d]とあった際に、

 * a→b cost 3
 * a→c cost 10
 * b→d cost 2 etc

といったような条件が有り、適切に区切ったさいの 最小、最大のコストを取るか見積もる際などに使われる

※なので今回の区切る個数は 添字0~4の5つとなる

dp[i][j] = (i,j] の最適解 となるように計算していく

イメージ図参考問題(応用)
https://judge.u-aizu.ac.jp/onlinejudge/d]]></description><link>https://tech.anti-pattern.co.jp/qu-jian-dpnoteburuwoke-shi-hua-sitewakariyasukusitemita/</link><guid isPermaLink="false">Ghost__Post__60fac4923986b000013a3cf8</guid><category><![CDATA[DP]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[algorithm]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 17 Mar 2021 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_4bQ-t_w7sh24vPWgmdvrtg.png" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="%E5%89%8D%E5%9B%9E">前回</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://medium.com/@1211lta/dp-dynamic-programming-%E3%82%92vue3-0-with-ts-primevue%E3%81%A7%E8%A6%96%E8%A6%9A%E5%8C%96%E3%81%99%E3%82%8B-2c84c749f340"><div class="kg-bookmark-content"><div class="kg-bookmark-title">DP(Dynamic Programming)をVue3.0 With TS &amp; PrimeVUEで視覚化する</div><div class="kg-bookmark-description">やること</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://miro.medium.com/fit/c/152/152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png" alt="区間DPのテーブルを可視化してわかりやすくしてみた"><span class="kg-bookmark-author">Medium</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://miro.medium.com/freeze/max/1200/1*Wn5nU4cRDRibnfyQKhbM4w.gif" alt="区間DPのテーブルを可視化してわかりやすくしてみた"/></div></a></figure><h3 id="%E5%8C%BA%E9%96%93dp">区間DP</h3><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_4bQ-t_w7sh24vPWgmdvrtg.png" alt="区間DPのテーブルを可視化してわかりやすくしてみた"/><p>DP(動的計画法)の中で区間を状態として表すものをいう。</p><p>[a,b,c,d]とあった際に、</p><ul><li>a→b cost 3</li><li>a→c cost 10</li><li>b→d cost 2 etc</li></ul><p>といったような条件が有り、適切に区切ったさいの 最小、最大のコストを取るか見積もる際などに使われる</p><p>※なので今回の区切る個数は 添字0~4の5つとなる</p><p>dp[i][j] = (i,j] の最適解 となるように計算していく</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/800/1*4bQ-t_w7sh24vPWgmdvrtg.png" class="kg-image" alt="区間DPのテーブルを可視化してわかりやすくしてみた" loading="lazy"><figcaption>イメージ図</figcaption></img></figure><h3 id="%E5%8F%82%E8%80%83%E5%95%8F%E9%A1%8C%E5%BF%9C%E7%94%A8">参考問題(応用)</h3><p><a href="https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2877">https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2877</a></p><p/><p>こちらはO(N²M)となる</p><ul><li>dp[0][0] = 0</li><li>dp[i][k] = max(dp[i][k], dp[i][k-1] + c[j][i]) ( i &gt; j ≥ 0, M ≥k ≥ 0)</li></ul><p>※k = 区切り数</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/e43435447e2aea178f0cf8fae894ae9f"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ap-blog-cpp</div><div class="kg-bookmark-description">ap-blog-cpp. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="区間DPのテーブルを可視化してわかりやすくしてみた"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="区間DPのテーブルを可視化してわかりやすくしてみた"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-cpp">#include &lt;iomanip&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;
template &lt;class T&gt; void chmax(T &amp;a, T b) {
  if (a &lt; b) {
    a = b;
  }
}

int main() {
  int N;
  int M;
  cin &gt;&gt; N &gt;&gt; M;
  vector&lt;long long&gt; points(N);
  for (int i = 0; i &lt; N; ++i) {
    cin &gt;&gt; points[i];
  }

  vector&lt;vector&lt;double&gt;&gt; c(N + 1, vector&lt;double&gt;(N + 1));

  for (int i = 0; i &lt;= N; ++i) {
    for (int j = i + 1; j &lt;= N; ++j) {
      double sum = 0;
      for (int k = i; k &lt; j; ++k) {
        sum += points[k];
      }
      c[i][j] = sum / (j - i);
    }
  }

  const long long INF = 1LL &lt;&lt; 60;
  vector&lt;vector&lt;double&gt;&gt; dp(N + 1, vector&lt;double&gt;(M + 1, -INF));
  dp[0][0] = 0;

  for (int i = 0; i &lt;= N; ++i) {
    for (int k = 1; k &lt;= M; ++k) {
      if (k &gt; i) {
        break;
      }
      for (int j = 0; j &lt; i; ++j) {
        chmax(dp[i][k], dp[j][k - 1] + c[j][i]);
      }
    }
  }

  double res = -1;
  for (int i = 0; i &lt;= M; ++i) {
    chmax(res, dp[N][i]);
  }
  cout &lt;&lt; fixed &lt;&lt; setprecision(10) &lt;&lt; res &lt;&lt; endl;
}
</code></pre>
<!--kg-card-end: markdown--><p>なかなか、コードからだと動きがイメージしづらいのでNuxtとVuetifyを使ってさくっとテーブルを可視化させていく(今回は例の1つ目の入力値の過程と結果のみ表示）</p><p>N = 5 <br>M = 3<br>points[9,1,2,3,9]</br></br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/vue-dp/blob/main/pages/index.vue"><div class="kg-bookmark-content"><div class="kg-bookmark-title">vue-dp/index.vue at main · kooooohe/vue-dp</div><div class="kg-bookmark-description">Contribute to kooooohe/vue-dp development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="区間DPのテーブルを可視化してわかりやすくしてみた"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f44f529837691130cb51296e609faa68550d6fdc2b965d00f87aca366c423b61/kooooohe/vue-dp" alt="区間DPのテーブルを可視化してわかりやすくしてみた"/></div></a></figure><h4 id="%E3%82%B3%E3%82%B9%E3%83%88%E8%A8%88%E7%AE%97%E6%B8%88%E3%81%BF%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">コスト計算済みテーブル</h4><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*1atCh7ctuxdTPvtR1BgkyA.png" class="kg-image" alt="区間DPのテーブルを可視化してわかりやすくしてみた" loading="lazy"/></figure><h3 id="dp%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">DPテーブル</h3><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*kYec034JrU2zHnnY84MNGw.png" class="kg-image" alt="区間DPのテーブルを可視化してわかりやすくしてみた" loading="lazy"/></figure><h3 id="%E4%B8%A1%E6%96%B9">両方</h3><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*G_B8WZ6HdahKnzzQqcWyyQ.png" class="kg-image" alt="区間DPのテーブルを可視化してわかりやすくしてみた" loading="lazy"/></figure><p>DPを行う際には、可視化して進めると理解がとても深まり良いですね。ちなみに、最初dpテーブルの初期値を0にしており正しい答えが出ずにハマっておりました。</p><p>また、前回同様動きをつけるともっとわかりやすいが、可変の配列に対するVueの仕様でハマったのでそれはまた別の機会に。</p><p>とてもおすすめ本</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BC%81%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%EF%BC%AB%EF%BC%B3%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB%E5%85%BC%E8%B3%87-ebook/dp/B08PV83L3N/ref&#x3D;tmm_kin_swatch_0?_encoding&#x3D;UTF8&amp;qid&#x3D;1615737384&amp;sr&#x3D;1-2"><div class="kg-bookmark-content"><div class="kg-bookmark-title">問題解決力を鍛える！アルゴリズムとデータ構造 (ＫＳ情報科学専門書) | 大槻兼資, 秋葉拓哉 | 工学 | Kindleストア | Amazon</div><div class="kg-bookmark-description">Amazonで大槻兼資, 秋葉拓哉の問題解決力を鍛える！アルゴリズムとデータ構造 (ＫＳ情報科学専門書)。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">大槻兼資</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:355-2603324-8255337:WH7KY7HVMZW31BJA64RB$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DWH7KY7HVMZW31BJA64RB%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="区間DPのテーブルを可視化してわかりやすくしてみた"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[PDFファイルにハイパーリンクを貼りたい！]]></title><description><![CDATA[最近、URLを記載した書類をPDFファイルにして取引先に送る機会があり「あー、ただPDFにしただけじゃリンク飛べないのか〜」と知りました。その時に色々調べたのでまとめてみました！

MacのプレビューAppでリンク設定出来る？
以前、PDFファイルの分割や結合をしようとした時は、MacのプレビューAppが万能だったので（過去のブログより
[https://ghost.tech.anti-pattern.co.jp/pdf-split-join-mac/]
）今回も期待したのですが、今はプレビューAppからリンク編集機能がなくなっているようでした。
プレビュー appでurlリンクを作成… — Apple コミュニティ
[https://discussionsjapan.apple.com/thread/10171254]

無料でリンク設定する方法は？
他にも無料でリンク貼る方法はないかなぁと思い、PDFelement [https://pdf.wondershare.jp/]
の無料版をダウンロードしてみましたが、無料版では保存の際に透かしが入ってしまう為、取引先に送る書類としては使]]></description><link>https://tech.anti-pattern.co.jp/pdf-hyperlink/</link><guid isPermaLink="false">Ghost__Post__6101492d3986b000013a4006</guid><category><![CDATA[pfd]]></category><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Sat, 13 Mar 2021 12:12:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>最近、URLを記載した書類をPDFファイルにして取引先に送る機会があり「あー、ただPDFにしただけじゃリンク飛べないのか〜」と知りました。その時に色々調べたのでまとめてみました！</p>
<h2 id="mac%E3%81%AE%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BCapp%E3%81%A7%E3%83%AA%E3%83%B3%E3%82%AF%E8%A8%AD%E5%AE%9A%E5%87%BA%E6%9D%A5%E3%82%8B%EF%BC%9F">MacのプレビューAppでリンク設定出来る？</h2>
<p>以前、PDFファイルの分割や結合をしようとした時は、MacのプレビューAppが万能だったので（<a href="https://ghost.tech.anti-pattern.co.jp/pdf-split-join-mac/">過去のブログより</a>）今回も期待したのですが、今はプレビューAppからリンク編集機能がなくなっているようでした。<br>
<a href="https://discussionsjapan.apple.com/thread/10171254">プレビュー appでurlリンクを作成… — Apple コミュニティ</a></br></p>
<h2 id="%E7%84%A1%E6%96%99%E3%81%A7%E3%83%AA%E3%83%B3%E3%82%AF%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F">無料でリンク設定する方法は？</h2>
<p>他にも無料でリンク貼る方法はないかなぁと思い、<a href="https://pdf.wondershare.jp/">PDFelement</a>の無料版をダウンロードしてみましたが、無料版では保存の際に透かしが入ってしまう為、取引先に送る書類としては使えず。結局無料で使い勝手良いものは見つけられなかったので、有料の<a href="https://acrobat.adobe.com/jp/ja/acrobat/acrobat-pro.html">Adobe Acrobat Pro DC</a>を使うことにしました。</p>
<h2 id="adobe-acrobat-pro-dc%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F">Adobe Acrobat Pro DCを使ってみた</h2>
<p>リンクを設定したいPDFを開き、編集画面 で「 Webまたは文書リンクを追加/編集」を選択</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/hyperlink-1.png" alt="hyperlink-1" loading="lazy"/></p>
<p>リンクを設定したい範囲を選択すると「リンクを作成」という画面が出てくるので、「リンクの表示方法」と「リンクアクション」を設定</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/hyperlink-2.png" alt="hyperlink-2" loading="lazy"/></p>
<p>次に「URLの編集」画面が出るので、設定したいURLを入力</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/hyperlink-3.png" alt="hyperlink-3" loading="lazy"/></p>
<p>以上です！簡単！</p>
<h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2>
<p>2月頭にGoogle スプレッドシートで作成した書類をPDFにした時には、確かにダウンロードしただけではリンクが押せなかったのですが…2021/3/11現在では、Google スプレッドシートからPDFでダウンロードするだけで、リンクが押せるようになってました！！！<br>
それらしき記事は見つけられなかったのですが、この１ヶ月で機能がパワーアップした模様です。（勘違いだったらすみません）</br></p>
<p>ブログ書き途中に気付いたので、前提が変わってしまったと少々悲しくなりましたが…有料の編集ソフト使わなくても良くなったのなら、まぁいっか！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[日本語変換完了のEnterでsubmitしないための方法]]></title><description><![CDATA[こんにちは、いわむらです

今回はTypeScriptでnullとundefinedの時にデフォルト値をセットする方法を紹介していきます

TypeScript 3.7 (2019/11 release)で追加されたnullish
coalescingというnull合体演算子を使うと簡単にデフォルト値をセットすることができます

試しにuserオブジェクトのhogeプロパティを返す関数を使ってみます

上記getHoge関数を各user毎に実行していくと返ってくる値は記述したとおり以下の結果になりました

空文字の場合は正しく空文字が出力されているのがわかります

今までデフォルト値をセットするときはOR(||)を使ったりtypeofを使用した厳密等価していましたが、ORだと空文字や0などもfalseの判定になってしまっていたのと厳密等価を使用したnullやundefinedの判定は少し冗長な書き方を使っていましたがこれからはnull合体演算子を使ってワンライナーでデフォルト値をセットすることができるという紹介でした。

ちなみにJavaScriptでもES2020からは同じくnull]]></description><link>https://tech.anti-pattern.co.jp/ri-ben-yu-bian-huan-wan-liao-noenterdesubmitsinaitamenofang-fa/</link><guid isPermaLink="false">Ghost__Post__6105325c3986b000013a4a54</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Thu, 11 Mar 2021 11:23:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回はTypeScriptでnullとundefinedの時にデフォルト値をセットする方法を紹介していきます</p><p>TypeScript 3.7 (2019/11 release)で追加されたnullish coalescingというnull合体演算子を使うと簡単にデフォルト値をセットすることができます</p><p>試しにuserオブジェクトのhogeプロパティを返す関数を使ってみます</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*bXBA4NrRLVHCq_lZoedIxw.png" class="kg-image" alt="" loading="lazy"/></figure><p>上記getHoge関数を各user毎に実行していくと返ってくる値は記述したとおり以下の結果になりました</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*EYIDmNrCK2vkV8nWaxk-tg.png" class="kg-image" alt="" loading="lazy"/></figure><p>空文字の場合は正しく空文字が出力されているのがわかります</p><p>今までデフォルト値をセットするときはOR(||)を使ったりtypeofを使用した厳密等価していましたが、ORだと空文字や0などもfalseの判定になってしまっていたのと厳密等価を使用したnullやundefinedの判定は少し冗長な書き方を使っていましたがこれからはnull合体演算子を使ってワンライナーでデフォルト値をセットすることができるという紹介でした。</p><p>ちなみにJavaScriptでもES2020からは同じくnullish coalescingが追加されるようなので使えるブラウザは限られますが試してみてはいかがでしょうか？</p><p>MDN:<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator" rel="noopener">https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator</a></p><p>TypeScript3.7 : <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html" rel="noopener">https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html</a></p><p>以上、TypeScriptでnullish coalescingを使ってデフォルト値をセットする方法のご紹介でした。</p>]]></content:encoded></item><item><title><![CDATA[Google Apps Script(GAS)をスケジュール実行する（トリガー登録）]]></title><description><![CDATA[こんにちは、こおりやまです。

以前、こちらの記事でスクレイピングを行う記事を書きましたが作成したスクリプトをスケジュール起動させ定期的に実行するよう登録してみたいと思います。

GASのエディタ画面を開き、目覚し時計のアイコン、トリガーを選択します。その後以下の画面になるので、「新しいトリーガーを作成します。」をクリックし追加画面を開きます。



トリガーを追加画面が表示されるので、実行する関数名を設定し、イベントのソースを選択で「時間主導型」を設定、トリガータイプを実行するスケジュールに適した設定を選択します。

こちらは日付ベースのタイマーを選択してみました。



選択すると、時刻選択が可能となり１時間単位で実行する時間が選択可能となります。



実行する時間を設定し保存ボタンをクリックすると、アクセスに関するリクエストの要求画面が表示されるので、内容を確認し許可ボタンをクリックするとトリガー登録されます。



上記設定の場合、毎日午後４時〜５時の時間帯にスクリプトが自動実行されるように登録されました。

登録したトリガーは詳細画面で以下のように実行したスクリプトの情報な]]></description><link>https://tech.anti-pattern.co.jp/google-apps-script-gas-wosukeziyurushi-xing-suru-torigadeng-lu/</link><guid isPermaLink="false">Ghost__Post__610bba313986b000013a52a5</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Thu, 11 Mar 2021 02:11:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、こおりやまです。</p>
<p>以前、こちらの記事でスクレイピングを行う記事を書きましたが作成したスクリプトをスケジュール起動させ定期的に実行するよう登録してみたいと思います。</p>
<p>GASのエディタ画面を開き、目覚し時計のアイコン、トリガーを選択します。その後以下の画面になるので、「新しいトリーガーを作成します。」をクリックし追加画面を開きます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_OT0aVVFbUgRmIvJw4IySKg.png" alt="1_OT0aVVFbUgRmIvJw4IySKg" loading="lazy"/></p>
<p>トリガーを追加画面が表示されるので、実行する関数名を設定し、イベントのソースを選択で「時間主導型」を設定、トリガータイプを実行するスケジュールに適した設定を選択します。</p>
<p>こちらは日付ベースのタイマーを選択してみました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_m6qBRmhpH9tJfzLjRm5SlQ.png" alt="1_m6qBRmhpH9tJfzLjRm5SlQ" loading="lazy"/></p>
<p>選択すると、時刻選択が可能となり１時間単位で実行する時間が選択可能となります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_4oPQInFpbWjA0Wb7sgBvxA.png" alt="1_4oPQInFpbWjA0Wb7sgBvxA" loading="lazy"/></p>
<p>実行する時間を設定し保存ボタンをクリックすると、アクセスに関するリクエストの要求画面が表示されるので、内容を確認し許可ボタンをクリックするとトリガー登録されます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_s8_6OYCACrMGX3XghJtN8A.png" alt="1_s8_6OYCACrMGX3XghJtN8A" loading="lazy"/></p>
<p>上記設定の場合、毎日午後４時〜５時の時間帯にスクリプトが自動実行されるように登録されました。</p>
<p>登録したトリガーは詳細画面で以下のように実行したスクリプトの情報なども確認可能となっています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1__IKbc2OzIoXIg-luAOlrGA.png" alt="1__IKbc2OzIoXIg-luAOlrGA" loading="lazy"/></p>
<p>実行数を選択すると、実行したスクリプト名、実行した時間、実行時間、ステータスなども一覧で確認できるようになっており非常に便利です。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_6eQwtVlbPpfL1FHaksCPjw.png" alt="1_6eQwtVlbPpfL1FHaksCPjw" loading="lazy"/></p>
<p>ちなみに、時間主導型の場合、トリガータイプは他に以下設定が可能となっていますので、目的にあった設定ができるのではないでしょうか。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_SLEvdDwsR1wOdlGivubmDQ.png" alt="1_SLEvdDwsR1wOdlGivubmDQ" loading="lazy"/></p>
<p>また、トリガー追加時にエラー通知も設定できエラーになるとGmailへ通知が来るようにも設定できます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_KhShe9Z3cip4i8ep895xNw.png" alt="1_KhShe9Z3cip4i8ep895xNw" loading="lazy"/></p>
<p>他には、イベントとしてスプレッドシートやカレンダーなども選択きるのでまた今度さわってみたいと思います。</p>
<p>ではでは</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Xormで複雑なSQLを実行する]]></title><description><![CDATA[以前、基本的な使い方をまとめた記事を書きましたが、もう少し複雑なことをしたくなって色々試したので、まとめておきます。

GolangのORM、Xormの使い方ざっくりまとめ
最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。
自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。 環境 * Go : 1.13.1 * Xorm :
0.7.9 * PostgreSQL : 11.6 使用するテーブルcreate table users( id BIGSERIAL, first_name
VARCHAR(20) NOT NULL, last_nameVARCHAR(20) NOT …Anti-Pattern Inc. Engineering
BlogYu Takahashi [https://tech.anti-pattern.co.jp/xorm/]環境
 * Go : 1.15.8
 * Xorm : 1.0.7
]]></description><link>https://tech.anti-pattern.co.jp/xormdefu-za-nasqlwoshi-xing-suru/</link><guid isPermaLink="false">Ghost__Post__6103ff773986b000013a453e</guid><category><![CDATA[Xorm]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Mon, 08 Mar 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>以前、基本的な使い方をまとめた記事を書きましたが、もう少し複雑なことをしたくなって色々試したので、まとめておきます。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tech.anti-pattern.co.jp/xorm/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GolangのORM、Xormの使い方ざっくりまとめ</div><div class="kg-bookmark-description">最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。 自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。 環境 * Go : 1.13.1 * Xorm : 0.7.9 * PostgreSQL : 11.6 使用するテーブルcreate table users( id BIGSERIAL, first_name VARCHAR(20) NOT NULL, last_nameVARCHAR(20) NOT …</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tech.anti-pattern.co.jp/icons/icon-512x512.png"><span class="kg-bookmark-author">Anti-Pattern Inc. Engineering Blog</span><span class="kg-bookmark-publisher">Yu Takahashi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ghost.org/v4.0.0/images/publication-cover.jpg"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>Go : 1.15.8</li>
<li>Xorm : 1.0.7</li>
<li>PostgreSQL : 11.6</li>
</ul>
<p>使用するテーブルは前回と同じです。</p>
<h2 id="join-%E3%81%AB%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B">JOIN にエイリアスをつける</h2>
<p>サブクエリをJOINするとき、エイリアスをつけなければ実行できないケースがあります。しかし、<code>Join</code> メソッドの引数にはエイリアスをセットするパラメータがありません。</p>
<p><code>xorm.io/builder</code> を使うと、追加できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/68ebff03bfb8c39c016980c55e67deb5.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995006" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-join" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-join-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-join-LC1" class="blob-code blob-code-inner js-file-line">	subSQL, subArgs, err := builder.</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-join-LC2" class="blob-code blob-code-inner js-file-line">		Select(&quot;*&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-join-LC3" class="blob-code blob-code-inner js-file-line">		From(&quot;users&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-join-LC4" class="blob-code blob-code-inner js-file-line">		Where(builder.Like{&quot;last_name&quot;, &quot;テスト&quot;}).</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-join-LC5" class="blob-code blob-code-inner js-file-line">		ToSQL()</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-join-LC6" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-join-LC7" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-join-LC8" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-join-LC9" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-join-LC10" class="blob-code blob-code-inner js-file-line">	query := builder.</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-join-LC11" class="blob-code blob-code-inner js-file-line">		Select(&quot;friends.*&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-join-LC12" class="blob-code blob-code-inner js-file-line">		From(&quot;friends&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-join-LC13" class="blob-code blob-code-inner js-file-line">		InnerJoin(fmt.Sprintf(&quot;(%s) AS sub_1&quot;, subSQL),</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-join-LC14" class="blob-code blob-code-inner js-file-line">			builder.Expr(&quot;friends.user_id = sub_1.id&quot;, subArgs...),</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-join-LC15" class="blob-code blob-code-inner js-file-line">		)</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-join-LC16" class="blob-code blob-code-inner js-file-line">	sql, args, err := query.ToSQL()</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-join-LC17" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm-join-LC18" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm-join-LC19" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm-join-LC20" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-join-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm-join-LC21" class="blob-code blob-code-inner js-file-line">	log.Println(sql)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/68ebff03bfb8c39c016980c55e67deb5/raw/9044aacd4760942377fe216c948cc55fe908bf20/xorm-join" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/68ebff03bfb8c39c016980c55e67deb5#file-xorm-join">xorm-join</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    friends.*  
FROM  
    friends  
    INNER JOIN  
        (  
            SELECT  
                *  
            FROM  
                users  
            WHERE  
                last_name LIKE $1  
        ) AS sub_1  
    ON  friends.user_id = sub_1.id
</code></pre>
<p>13,14行目のように <code>fmt.Sprintf</code> でエイリアスを追加し、引数は<code>builder.Expr</code> で後から追加しています。若干無理やりですが、これで動きます。</p>
<p>（ちなみに上の例ではエイリアスをつけなくても実行できます。サブクエリがもっと複雑になるとエイリアスが必要になったりします。）</p>
<h2 id="%E4%BB%BB%E6%84%8F%E3%81%AEsql%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%80%81%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%99%E3%82%8B">任意のSQLを実行し、結果をバインドする</h2>
<p>上の例で構築したSQLを実行するためには以下のようにします。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/f02f51ca2ebb1debf61c9f090b10777a.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995218" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-any-sql-1" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-any-sql-1-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-any-sql-1-LC1" class="blob-code blob-code-inner js-file-line">	friends := make([]friend, 0)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-any-sql-1-LC2" class="blob-code blob-code-inner js-file-line">	err := engine.SQL(sql, args...).Find(&amp;friends)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-any-sql-1-LC3" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-any-sql-1-LC4" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-any-sql-1-LC5" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-any-sql-1-LC6" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-any-sql-1-LC7" class="blob-code blob-code-inner js-file-line">	log.Println(friends)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-1-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-any-sql-1-LC8" class="blob-code blob-code-inner js-file-line">    </td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/f02f51ca2ebb1debf61c9f090b10777a/raw/6edc067abd91c1cccac2d3141a184c464d9a8fa7/xorm-any-sql-1" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/f02f51ca2ebb1debf61c9f090b10777a#file-xorm-any-sql-1">xorm-any-sql-1</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/b0de43ea95768752498947c990c2ce95.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995253" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-any-sql-2" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-any-sql-2-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-any-sql-2-LC1" class="blob-code blob-code-inner js-file-line">	rows, err := engine.SQL(sql, args...).Rows(&amp;friend{})</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-any-sql-2-LC2" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-any-sql-2-LC3" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-any-sql-2-LC4" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-any-sql-2-LC5" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-any-sql-2-LC6" class="blob-code blob-code-inner js-file-line">        friends := make([]friend, 0)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-any-sql-2-LC7" class="blob-code blob-code-inner js-file-line">	for rows.Next() {</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-any-sql-2-LC8" class="blob-code blob-code-inner js-file-line">		dto := friend{}</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-any-sql-2-LC9" class="blob-code blob-code-inner js-file-line">		err := rows.Scan(&amp;dto)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-any-sql-2-LC10" class="blob-code blob-code-inner js-file-line">		if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-any-sql-2-LC11" class="blob-code blob-code-inner js-file-line">			log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-any-sql-2-LC12" class="blob-code blob-code-inner js-file-line">			return</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-any-sql-2-LC13" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-any-sql-2-LC14" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-any-sql-2-LC15" class="blob-code blob-code-inner js-file-line">		friends = append(friends, dto)</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-any-sql-2-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-any-sql-2-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-any-sql-2-LC17" class="blob-code blob-code-inner js-file-line">	log.Println(friends)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/b0de43ea95768752498947c990c2ce95/raw/cbde886abc9d86a29b553afa59224c54539dbdab/xorm-any-sql-2" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/b0de43ea95768752498947c990c2ce95#file-xorm-any-sql-2">xorm-any-sql-2</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>どちらでもできますが、基本的に1番目のほうで問題ないと思います。</p>
<h2 id="with-%E3%82%92%E4%BD%BF%E3%81%86">WITH を使う</h2>
<p><code>WITH</code> はXormで用意されてないようなので、自分で構築する必要があります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/9eb8f12b3e579cf0841f0ff307bc0cbb.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995326" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-with" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-with-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-with-LC1" class="blob-code blob-code-inner js-file-line">	withSQL, withArgs, err := builder.</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-with-LC2" class="blob-code blob-code-inner js-file-line">		Select(&quot;*&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-with-LC3" class="blob-code blob-code-inner js-file-line">		From(&quot;users&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-with-LC4" class="blob-code blob-code-inner js-file-line">		Where(builder.Like{&quot;last_name&quot;, &quot;テスト&quot;}).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-with-LC5" class="blob-code blob-code-inner js-file-line">		ToSQL()</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-with-LC6" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-with-LC7" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-with-LC8" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-with-LC9" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-with-LC10" class="blob-code blob-code-inner js-file-line">	const alias = &quot;sub_2&quot;</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-with-LC11" class="blob-code blob-code-inner js-file-line">	mainSQL, mainArgs, err := builder.</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-with-LC12" class="blob-code blob-code-inner js-file-line">		Select(&quot;*&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-with-LC13" class="blob-code blob-code-inner js-file-line">		From(&quot;friends&quot;).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-with-LC14" class="blob-code blob-code-inner js-file-line">		Where(builder.Expr(fmt.Sprintf(&quot;user_id IN (SELECT id from %s)&quot;, alias))).</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-with-LC15" class="blob-code blob-code-inner js-file-line">		ToSQL()</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-with-LC16" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-with-LC17" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm-with-LC18" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm-with-LC19" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm-with-LC20" class="blob-code blob-code-inner js-file-line">	sql := fmt.Sprintf(&quot;WITH %s AS (%s) %s&quot;, alias, withSQL, mainSQL)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm-with-LC21" class="blob-code blob-code-inner js-file-line">	args := append(withArgs, mainArgs...)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm-with-LC22" class="blob-code blob-code-inner js-file-line">	friends := make([]friend, 0)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm-with-LC23" class="blob-code blob-code-inner js-file-line">	err = engine.SQL(sql, args...).Find(&amp;friends)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm-with-LC24" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm-with-LC25" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm-with-LC26" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm-with-LC27" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-with-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm-with-LC28" class="blob-code blob-code-inner js-file-line">	log.Println(friends)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/9eb8f12b3e579cf0841f0ff307bc0cbb/raw/484c9295cfa22c20cf86cb99811841072998ae6f/xorm-with" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/9eb8f12b3e579cf0841f0ff307bc0cbb#file-xorm-with">xorm-with</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>WITH sub_2 AS(  
    SELECT  
        *  
    FROM  
        users  
    WHERE  
        last_name LIKE $1  
)  
SELECT  
    *  
FROM  
    friends  
WHERE  
    user_id IN(  
        SELECT  
            id  
        from  
            sub_2  
    )
</code></pre>
<h2 id="bulkinsert-%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%E3%81%AEid%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">BulkInsert した結果のIDを取得する</h2>
<p>前回の記事でも書きましたが、BulkInsert するとIDを自動で構造体にセットしてくれません。自分でSQLを構築すると取得できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3852886db07c830cb7aa8ffaef7bfffd.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995436" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-bulk-insert-1" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-bulk-insert-1-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-bulk-insert-1-LC1" class="blob-code blob-code-inner js-file-line">        // insert対象のデータを生成</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-bulk-insert-1-LC2" class="blob-code blob-code-inner js-file-line">        users := make([]user, 3)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-bulk-insert-1-LC3" class="blob-code blob-code-inner js-file-line">	for i = 0; i &lt; 3; i++ {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-bulk-insert-1-LC4" class="blob-code blob-code-inner js-file-line">		users[i] = user{</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-bulk-insert-1-LC5" class="blob-code blob-code-inner js-file-line">			FirstName: fmt.Sprintf(&quot;太郎+%v&quot;, i),</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-bulk-insert-1-LC6" class="blob-code blob-code-inner js-file-line">			LastName:  fmt.Sprintf(&quot;テスト+%v&quot;, i),</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-bulk-insert-1-LC7" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-bulk-insert-1-LC8" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-bulk-insert-1-LC9" class="blob-code blob-code-inner js-file-line">        </td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-bulk-insert-1-LC10" class="blob-code blob-code-inner js-file-line">        </td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-bulk-insert-1-LC11" class="blob-code blob-code-inner js-file-line">	valueStrings := make([]string, len(users))</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-bulk-insert-1-LC12" class="blob-code blob-code-inner js-file-line">	args := make([]interface{}, 0, len(users)*5)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-bulk-insert-1-LC13" class="blob-code blob-code-inner js-file-line">	for i, u := range users {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-bulk-insert-1-LC14" class="blob-code blob-code-inner js-file-line">		valueStrings[i] = &quot;(?,?,?,?,?,now(),now())&quot;</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-bulk-insert-1-LC15" class="blob-code blob-code-inner js-file-line">		args = append(args, u.FirstName, u.LastName, u.FirstNameKana, u.LastNameKana, 1)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-bulk-insert-1-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-bulk-insert-1-LC17" class="blob-code blob-code-inner js-file-line">	valueString := strings.Join(valueStrings, &quot;,&quot;)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm-bulk-insert-1-LC18" class="blob-code blob-code-inner js-file-line">	sql := fmt.Sprintf(&quot;INSERT INTO users (first_name, last_name, first_name_kana, last_name_kana, version, created_at, updated_at) VALUES %s RETURNING id&quot;, valueString)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm-bulk-insert-1-LC19" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm-bulk-insert-1-LC20" class="blob-code blob-code-inner js-file-line">	ids := make([]string, 0)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm-bulk-insert-1-LC21" class="blob-code blob-code-inner js-file-line">	err := engine.SQL(sql, args...).Find(&amp;ids)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm-bulk-insert-1-LC22" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm-bulk-insert-1-LC23" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm-bulk-insert-1-LC24" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm-bulk-insert-1-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-1-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm-bulk-insert-1-LC26" class="blob-code blob-code-inner js-file-line">	log.Println(ids)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3852886db07c830cb7aa8ffaef7bfffd/raw/64e2d166dd619fa05cdb64af9e2e584884c523fd/xorm-bulk-insert-1" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3852886db07c830cb7aa8ffaef7bfffd#file-xorm-bulk-insert-1">xorm-bulk-insert-1</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>INSERT INTO users(  
    first_name,  
    last_name,  
    first_name_kana,  
    last_name_kana,  
    version,  
    created_at,  
    updated_at  
)  
VALUES(  
    $1,  
    $2,  
    $3,  
    $4,  
    $5,  
    now(),  
    now()  
),  
(  
    $6,  
    $7,  
    $8,  
    $9,  
    $10,  
    now(),  
    now()  
),  
(  
    $11,  
    $12,  
    $13,  
    $14,  
    $15,  
    now(),  
    now()  
) RETURNING id
</code></pre>
<p>Insert なのに<code>Find</code> メソッドを使っているのが非常に違和感ありますが、一応動きます。</p>
<p>複数のカラムを返すこともできます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/168b0042531b3053f54b028010fe2d3b.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995490" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-bulk-insert-2" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-bulk-insert-2-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-bulk-insert-2-LC1" class="blob-code blob-code-inner js-file-line">	users := make([]user, 3)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-bulk-insert-2-LC2" class="blob-code blob-code-inner js-file-line">	for i = 0; i &lt; 3; i++ {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-bulk-insert-2-LC3" class="blob-code blob-code-inner js-file-line">		users[i] = user{</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-bulk-insert-2-LC4" class="blob-code blob-code-inner js-file-line">			FirstName: fmt.Sprintf(&quot;太郎+%v&quot;, i),</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-bulk-insert-2-LC5" class="blob-code blob-code-inner js-file-line">			LastName:  fmt.Sprintf(&quot;テスト+%v&quot;, i),</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-bulk-insert-2-LC6" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-bulk-insert-2-LC7" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-bulk-insert-2-LC8" class="blob-code blob-code-inner js-file-line">        </td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-bulk-insert-2-LC9" class="blob-code blob-code-inner js-file-line">        </td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-bulk-insert-2-LC10" class="blob-code blob-code-inner js-file-line">	valueStrings := make([]string, len(users))</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-bulk-insert-2-LC11" class="blob-code blob-code-inner js-file-line">	args := make([]interface{}, 0, len(users)*5)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-bulk-insert-2-LC12" class="blob-code blob-code-inner js-file-line">	for i, u := range users {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-bulk-insert-2-LC13" class="blob-code blob-code-inner js-file-line">		valueStrings[i] = &quot;(?,?,?,?,?,now(),now())&quot;</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-bulk-insert-2-LC14" class="blob-code blob-code-inner js-file-line">		args = append(args, u.FirstName, u.LastName, u.FirstNameKana, u.LastNameKana, 1)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-bulk-insert-2-LC15" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-bulk-insert-2-LC16" class="blob-code blob-code-inner js-file-line">	valueString := strings.Join(valueStrings, &quot;,&quot;)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-bulk-insert-2-LC17" class="blob-code blob-code-inner js-file-line">	sql := fmt.Sprintf(&quot;INSERT INTO users (first_name, last_name, first_name_kana, last_name_kana, version, created_at, updated_at) VALUES %s RETURNING id, first_name&quot;, valueString)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm-bulk-insert-2-LC18" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm-bulk-insert-2-LC19" class="blob-code blob-code-inner js-file-line">	createdUsers := make([]user, 0)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm-bulk-insert-2-LC20" class="blob-code blob-code-inner js-file-line">	err := engine.SQL(sql, args...).Find(&amp;createdUsers)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm-bulk-insert-2-LC21" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm-bulk-insert-2-LC22" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm-bulk-insert-2-LC23" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm-bulk-insert-2-LC24" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-2-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm-bulk-insert-2-LC25" class="blob-code blob-code-inner js-file-line">	log.Println(createdUsers)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/168b0042531b3053f54b028010fe2d3b/raw/02967c72ea64070657cffbd8e6e9bb809aeb4f19/xorm-bulk-insert-2" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/168b0042531b3053f54b028010fe2d3b#file-xorm-bulk-insert-2">xorm-bulk-insert-2</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>INSERT INTO users(  
    first_name,  
    last_name,  
    first_name_kana,  
    last_name_kana,  
    version,  
    created_at,  
    updated_at  
)  
VALUES(  
    $1,  
    $2,  
    $3,  
    $4,  
    $5,  
    now(),  
    now()  
),  
(  
    $6,  
    $7,  
    $8,  
    $9,  
    $10,  
    now(),  
    now()  
),  
(  
    $11,  
    $12,  
    $13,  
    $14,  
    $15,  
    now(),  
    now()  
) RETURNING id,  
first_name
</code></pre>
<p>以下のように、<code>QueryString</code> メソッドでも同じことできます。<code>Find</code> を使うよりは違和感ないですが、少しコードが長くなります。余計なバインド処理がなくなるので、パフォーマンスは良いかもしれません。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/36dbb7a860c78a94908944806462b7bf.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist107995517" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-xorm-bulk-insert-3" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-xorm-bulk-insert-3-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-xorm-bulk-insert-3-LC1" class="blob-code blob-code-inner js-file-line">	results, err := engine.QueryString(append([]interface{}{sql}, args...)...)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-xorm-bulk-insert-3-LC2" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-xorm-bulk-insert-3-LC3" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-xorm-bulk-insert-3-LC4" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-xorm-bulk-insert-3-LC5" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-xorm-bulk-insert-3-LC6" class="blob-code blob-code-inner js-file-line">	ids := make([]int, len(results))</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-xorm-bulk-insert-3-LC7" class="blob-code blob-code-inner js-file-line">	firstNames := make([]string, len(results))</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-xorm-bulk-insert-3-LC8" class="blob-code blob-code-inner js-file-line">	for i, row := range results {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-xorm-bulk-insert-3-LC9" class="blob-code blob-code-inner js-file-line">		idString, ok := row[&quot;id&quot;]</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-xorm-bulk-insert-3-LC10" class="blob-code blob-code-inner js-file-line">		if !ok {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-xorm-bulk-insert-3-LC11" class="blob-code blob-code-inner js-file-line">			log.Println(&quot;error&quot;)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-xorm-bulk-insert-3-LC12" class="blob-code blob-code-inner js-file-line">			return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-xorm-bulk-insert-3-LC13" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-xorm-bulk-insert-3-LC14" class="blob-code blob-code-inner js-file-line">		id, err := strconv.Atoi(idString)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-xorm-bulk-insert-3-LC15" class="blob-code blob-code-inner js-file-line">		if err != nil {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-xorm-bulk-insert-3-LC16" class="blob-code blob-code-inner js-file-line">			log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-xorm-bulk-insert-3-LC17" class="blob-code blob-code-inner js-file-line">			return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-xorm-bulk-insert-3-LC18" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-xorm-bulk-insert-3-LC19" class="blob-code blob-code-inner js-file-line">		ids[i] = id</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-xorm-bulk-insert-3-LC20" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-xorm-bulk-insert-3-LC21" class="blob-code blob-code-inner js-file-line">		firstName, ok := row[&quot;first_name&quot;]</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-xorm-bulk-insert-3-LC22" class="blob-code blob-code-inner js-file-line">		if !ok {</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-xorm-bulk-insert-3-LC23" class="blob-code blob-code-inner js-file-line">			log.Println(&quot;error&quot;)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-xorm-bulk-insert-3-LC24" class="blob-code blob-code-inner js-file-line">			return</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-xorm-bulk-insert-3-LC25" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-xorm-bulk-insert-3-LC26" class="blob-code blob-code-inner js-file-line">		firstNames[i] = firstName</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-xorm-bulk-insert-3-LC27" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-xorm-bulk-insert-3-LC28" class="blob-code blob-code-inner js-file-line">	log.Println(ids)</td>
      </tr>
      <tr>
        <td id="file-xorm-bulk-insert-3-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-xorm-bulk-insert-3-LC29" class="blob-code blob-code-inner js-file-line">	log.Println(firstNames)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/36dbb7a860c78a94908944806462b7bf/raw/068d088f496276ab37a0823e90c1b526fe915124/xorm-bulk-insert-3" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/36dbb7a860c78a94908944806462b7bf#file-xorm-bulk-insert-3">xorm-bulk-insert-3</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>以上です。結構柔軟にSQL実行できるみたいです。</p>
<!--kg-card-end: markdown--></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[【Vuetify】v-text-fieldを使って、入力はyyyymmdd形式、表示はyyyy/mm/dd形式、実際の値はyyyy-mm-dd形式になるコンポーネントを作ってみた。]]></title><description><![CDATA[こんにちは、たかはしです。今回は以前Vuetifyを利用した開発の際に、「入力するときは、yyyymmdd形式で、表示はyyyy/mm/ddになるフォームの入力項目が欲しい」という要望と「DBに保存する時は、yyyy-mm-dd形式」という条件を満たすために工夫したことを簡単に書いていこうと思います。

Vuetifyで日付の入力を扱う際に使えそうなコンポーネントとして思いついたのがまずv-date-picker、次にv-text-fieldのtypeをdateに設定したものです。以下にサンプルを貼っておきます。

v-date-picker(公式サンプル)
v-text-fieldのtypeをdateに設定したもの
ただ以上のサンプルを触ってみるとv-date-pickerはカレンダーを用いた入力なので、不採用。

v-text-fieldのtypeをdateにしたものは、まず入力方法がブラウザによって変化してしまうため、不採用。

<input type=“date”> - HTML: HyperText Markup Language | MDN<input> 要素の
type=]]></description><link>https://tech.anti-pattern.co.jp/vuetify-v-text-fieldwoshi-tute-ru-li-hayyyymmddxing-shi-biao-shi-hayyyy-mm-ddxing-shi-shi-ji-nozhi-hayyyy-mm-ddxing-shi-ninarukonponentowozuo-tutemita/</link><guid isPermaLink="false">Ghost__Post__610a1d653986b000013a4e9a</guid><dc:creator><![CDATA[Yasuhiro Takahashi]]></dc:creator><pubDate>Thu, 25 Feb 2021 03:00:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、たかはしです。今回は以前Vuetifyを利用した開発の際に、「入力するときは、yyyymmdd形式で、表示はyyyy/mm/ddになるフォームの入力項目が欲しい」という要望と「DBに保存する時は、yyyy-mm-dd形式」という条件を満たすために工夫したことを簡単に書いていこうと思います。</p><p>Vuetifyで日付の入力を扱う際に使えそうなコンポーネントとして思いついたのがまずv-date-picker、次にv-text-fieldのtypeをdateに設定したものです。以下にサンプルを貼っておきます。</p><h2 id="v-date-picker%E5%85%AC%E5%BC%8F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">v-date-picker(公式サンプル)</h2><figure class="kg-card kg-embed-card"><iframe id="cp_embed_qBqVOVx" src="https://codepen.io/yasuhirotakahashi/embed/preview/qBqVOVx?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=qBqVOVx" title="Vuetify Example Pen" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/></figure><h2 id="v-text-field%E3%81%AEtype%E3%82%92date%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE">v-text-fieldのtypeをdateに設定したもの</h2><figure class="kg-card kg-embed-card"><iframe id="cp_embed_vYyWNRQ" src="https://codepen.io/yasuhirotakahashi/embed/preview/vYyWNRQ?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=vYyWNRQ" title="Vuetify Example Pen" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/></figure><p>ただ以上のサンプルを触ってみるとv-date-pickerはカレンダーを用いた入力なので、不採用。</p><p>v-text-fieldのtypeをdateにしたものは、まず入力方法がブラウザによって変化してしまうため、不採用。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/date"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&lt;input type&#x3D;“date”&gt; - HTML: HyperText Markup Language | MDN</div><div class="kg-bookmark-description">&lt;input&gt; 要素の type&#x3D;“date” 入力型は、検証付きのテキストボックスまたは特殊な日付選択インターフェイスのどちらかで、ユーザーに日付を入力させる入力欄を生成します。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.mozilla.org/favicon-48x48.97046865.png"><span class="kg-bookmark-author">MDN</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://developer.mozilla.org/mdn-social-share.0ca9dbda.png"/></div></a></figure><p>そこで、既存のv-text-filedをベースにロジックを追加することでいい感じに要望に答えることができないかと試行錯誤した結果が以下になります。（以前実装したソースを参考にcodepenで再作成しました。）</p><p><strong>表示はyyyy/mm/dd、入力はyyyymmdd、実データはyyyy-mm-dd</strong></p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_ZEBXGgO" src="https://codepen.io/yasuhirotakahashi/embed/preview/ZEBXGgO?default-tabs=js%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=ZEBXGgO" title="date field(sample)" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;"/></figure><p>ソースコードは上記のcodepenで確認できると思いますが、簡単に解説していきます。</p><p>まず、入力用と表示用でv-text-fieldを2つ用意します。</p><p>入力用のコンポーネントは、バリデーションと最大入力数を6に設定しておきます。そして、blurイベント時に関数を呼び出すようにしておきます。</p><pre><code>&lt;v-text-field
 v-model=”inputDate”
 :rules=”[rules.required, rules.yyyymmdd]”
 label=”入力用”
 @blur=”formatToDateString”
 maxlength=”8"
 /&gt;</code></pre><p>blurイベント時に呼ばれる関数は、入力された値の形式に問題なければ、表示用の変数にyyyy/mm/dd形式の文字列に変換してセット、DB保存用にyyyy-mm-dd形式の文字列に変換してセットという処理を行っています。</p><pre><code>formatToDateString() {
  // 空文字の場合、変換しない
  if (this.inputDate === '') return
  // 形式が正しくない場合、変換しない
  if (!this.dateRule.test(this.inputDate)) return   
  const str = String(this.inputDate)
  // 表示用に加工
  this.displayDate = `${str.slice(0, 4)}/${str.slice(4,6)}/${str.slice(6,8)}`
  // DB保存用に加工
  this.outputDate = `${str.slice(0, 4)}-${str.slice(4,6)}-${str.slice(6,8)}`
  this.isEdit = false
}</code></pre><p>表示用のコンポーネントには、表示用の文字列をセット、focusイベント時に、isEditのフラグをtrueにする処理を設定しておきます。</p><p>この処理を行うことで、focusしていない時は、yyyy/mm/dd形式、入力する時は、yyyymmdd形式で入力ができるようになります。また、DBに保存する用のデータを確保できます。（もしコンポーネント化する場合は、親コンポーネントとのデータの同期でもう少し工夫が必要ですが、、、）</p><pre><code>&lt;template v-if="isEdit"&gt;
  &lt;v-text-field
    v-model="inputDate"
    :rules="[rules.required, rules.yyyymmdd]"
    label="入力用"
    @blur="formatToDateString"
    maxlength="8"
  /&gt;
&lt;/template&gt;
&lt;template v-else&gt;
  &lt;v-text-field
    v-if="!isEdit"
    v-model="displayDate"
    label="表示用"
    @focus="isEdit = true"
  /&gt;
&lt;/template&gt;</code></pre><p>v-ifや@focus、@blurを利用することでコンポーネントの拡張が簡単にできますので、是非皆さんもやってみてください！！</p><h2 id="reference">Reference</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/components/text-fields/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">テキストフィールド・コンポーネント</div><div class="kg-bookmark-description">テキストフィールドコンポーネントは、ユーザからのテキスト入力を受け付けます。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://vuetifyjs.com/ja/components/date-pickers/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">デートピッカー・コンポーネント</div><div class="kg-bookmark-description">date picker コンポーネントは、日付、月、および年の選択を可能にするスタンドアロンインターフェイスです。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://vuetifyjs.com/favicon.ico"><span class="kg-bookmark-author">Vuetify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-300.png"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[細かすぎて伝わらないFigmaのVariants機能小ネタ]]></title><description><![CDATA[最近はFigmaで機能のデザインを行っています。

とっても便利ですね！

最近触ってみて知った小ネタを紹介します。

Variantsについて
前回のブログを参照してください！

figmaのVariantsでコンポーネントの状態管理をする手順こんにちは。オザサです。anti-pattern-engineering小笹佑京(Yuki
Ozasa)
[https://medium.com/anti-pattern-engineering/figma%E3%81%AEvariants%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E7%8A%B6%E6%85%8B%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86-82cea3dd5e21]
見つけた小ネタ




属性に対してTrue/Falseの状態を定義すると、アイコンがスイッチになってくれます。

細かすぎて気がつける人いるのか疑問ですが嬉し]]></description><link>https://tech.anti-pattern.co.jp/figma-variants/</link><guid isPermaLink="false">Ghost__Post__6101527d3986b000013a412e</guid><category><![CDATA[Figma]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Wed, 24 Feb 2021 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/figma-variants-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/figma-variants-1-1.png" alt="細かすぎて伝わらないFigmaのVariants機能小ネタ"/><p>最近はFigmaで機能のデザインを行っています。</p>
<p>とっても便利ですね！</p>
<p>最近触ってみて知った小ネタを紹介します。</p>
<h2 id="variants%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Variantsについて</h2>
<p>前回のブログを参照してください！</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://medium.com/anti-pattern-engineering/figma%E3%81%AEvariants%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E7%8A%B6%E6%85%8B%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86-82cea3dd5e21"><div class="kg-bookmark-content"><div class="kg-bookmark-title">figmaのVariantsでコンポーネントの状態管理をする手順</div><div class="kg-bookmark-description">こんにちは。オザサです。</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://miro.medium.com/fit/c/152/152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png" alt="細かすぎて伝わらないFigmaのVariants機能小ネタ"><span class="kg-bookmark-author">anti-pattern-engineering</span><span class="kg-bookmark-publisher">小笹佑京(Yuki Ozasa)</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://miro.medium.com/freeze/max/640/1*vDsaYb5OPBPk0nEmCCDCwg.gif" alt="細かすぎて伝わらないFigmaのVariants機能小ネタ"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%9F%E5%B0%8F%E3%83%8D%E3%82%BF">見つけた小ネタ</h2>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/figma-variants-1-1.png" alt="細かすぎて伝わらないFigmaのVariants機能小ネタ" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/figma-variants-2-1.png" alt="細かすぎて伝わらないFigmaのVariants機能小ネタ" loading="lazy"/></p>
<p>属性に対してTrue/Falseの状態を定義すると、アイコンがスイッチになってくれます。</p>
<p>細かすぎて気がつける人いるのか疑問ですが嬉しい機能でした。</p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GolangでAmazon Cognitoを使う]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。
APIサーバからCognitoに接続して、ユーザー登録するユースケースの実装について書こうと思います。

Nuxt.jsでAmazon Cognitoを使う内容は、弊社メンバのkoooooheが書いてますので、どうぞ参考に！

> https://medium.com/anti-pattern-engineering/nuxt-jsでcognitoを使う-cd011efa1b29
[https://medium.com/anti-pattern-engineering/nuxt-js%E3%81%A7cognito%E3%82%92%E4%BD%BF%E3%81%86-cd011efa1b29]


Configuring the AWS SDK for Goを利用して実装しました。

AdminCreateUserを発行したいのでちょっとだけ変更していますが、ほとんど、AWS Code Sampleが使えます。これはありがたい。

> https://docs.aws.amazon.com/code-samples/late]]></description><link>https://tech.anti-pattern.co.jp/golangdeamazon-cognitowoshi-u/</link><guid isPermaLink="false">Ghost__Post__610e1b6d3986b000013a5426</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Thu, 11 Feb 2021 05:37:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-3.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-3.jpg" alt="GolangでAmazon Cognitoを使う"/><p>こんにちは、Anti-Pattern Inc.の塚本です。<br>
APIサーバからCognitoに接続して、ユーザー登録するユースケースの実装について書こうと思います。</br></p>
<p>Nuxt.jsでAmazon Cognitoを使う内容は、弊社メンバのkoooooheが書いてますので、どうぞ参考に！</p>
<blockquote>
<p><a href="https://medium.com/anti-pattern-engineering/nuxt-js%E3%81%A7cognito%E3%82%92%E4%BD%BF%E3%81%86-cd011efa1b29">https://medium.com/anti-pattern-engineering/nuxt-jsでcognitoを使う-cd011efa1b29</a></p>
</blockquote>
<p>Configuring the AWS SDK for Goを利用して実装しました。</p>
<p>AdminCreateUserを発行したいのでちょっとだけ変更していますが、ほとんど、AWS Code Sampleが使えます。これはありがたい。</p>
<blockquote>
<p><a href="https://docs.aws.amazon.com/code-samples/latest/catalog/go-cognito-CognitoCreateUser.go.html">https://docs.aws.amazon.com/code-samples/latest/catalog/go-cognito-CognitoCreateUser.go.html</a></p>
</blockquote>
<h2 id="%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">実装したプログラム</h2>
<p>認証情報は環境変数に設定しているので、アプリケーションで設定していません。<br>
<a href="https://github.com/aws/aws-sdk-go/blob/master/aws/session/env_config.go">https://github.com/aws/aws-sdk-go/blob/master/aws/session/env_config.go</a></br></p>
<pre><code>import (
 &quot;os&quot;
 &quot;github.com/aws/aws-sdk-go/aws&quot;
 &quot;github.com/aws/aws-sdk-go/aws/session&quot;
 &quot;github.com/aws/aws-sdk-go/service/cognitoidentityprovider&quot;
)
func CreateUser(email string) (*string, error) {
 sess := session.Must(session.NewSessionWithOptions(session.Options{
  SharedConfigState: session.SharedConfigEnable,
 }))
cognitoClient := cognitoidentityprovider.New(sess)
 newUserData := &amp;cognitoidentityprovider.AdminCreateUserInput{
  // lambda param
  //ClientMetadata: map[string]*string{&quot;test&quot;: &amp;val},
DesiredDeliveryMediums: []*string{
   aws.String(&quot;EMAIL&quot;),
  },
    
  UserAttributes: []*cognitoidentityprovider.AttributeType{
   {
    Name:  aws.String(&quot;email&quot;),
    Value: aws.String(email),
   },
   {
    Name:  aws.String(&quot;custom:custom_parameter&quot;),
    Value: aws.String(&quot;1&quot;),
   }
  },
 }
  
 newUserData.SetUserPoolId(os.Getenv(&quot;POOL_ID&quot;))
 newUserData.SetUsername(email)
ret, err := cognitoClient.AdminCreateUser(newUserData)
 if err != nil {
  return nil, err
 }
  
 for _, v := range ret.User.Attributes {
  if *v.Name == &quot;sub&quot; {
   return v.Value, nil
  }
 }
 return nil, err
}
</code></pre>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>珍しく今回はハマってません。<br>
ClientMetadataを何に使うのかパッと分からなかったのですが、Cognitoのユーザプールに設定するトリガーに渡せるパラメーターなんですね。こちらにしっかり書いてありました。</br></p>
<blockquote>
<p><a href="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-post-authentication.html">https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-post-authentication.html</a></p>
</blockquote>
<p>ドキュメントが充実しているなーというのが今回の感想です。</p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[GolangでAmazon S3を使う]]></title><description><![CDATA[こんにちは、Anti-Pattern Inc.の塚本です。
APIサーバからS3に接続して、ファイルをアップロードするユースケースの実装について書こうと思います。

Amazon S3を立てなくてもローカル環境で確認出来る様に、minioを使いました。

minioについてはこちらを参考にしました。ありがとうございます。

https://qiita.com/reflet/items/3e0f07bc9d64314515c1
https://dev.classmethod.jp/articles/s3-compatible-storage-minio/

実装したプログラム
AWS SDK for Go API Reference [https://docs.aws.amazon.com/sdk-for-go/api]
を参考に実装してます。

認証情報は環境変数に設定しているので、アプリケーションで設定していません。
https://github.com/aws/aws-sdk-go/blob/master/aws/session/env_config.go

import (
 "]]></description><link>https://tech.anti-pattern.co.jp/golangdeamazon-s3woshi-u/</link><guid isPermaLink="false">Ghost__Post__610e19c03986b000013a53ff</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Thu, 11 Feb 2021 05:33:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-2.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-2.jpg" alt="GolangでAmazon S3を使う"/><p>こんにちは、Anti-Pattern Inc.の塚本です。<br>
APIサーバからS3に接続して、ファイルをアップロードするユースケースの実装について書こうと思います。</br></p>
<p>Amazon S3を立てなくてもローカル環境で確認出来る様に、minioを使いました。</p>
<p>minioについてはこちらを参考にしました。ありがとうございます。</p>
<p><a href="https://qiita.com/reflet/items/3e0f07bc9d64314515c1">https://qiita.com/reflet/items/3e0f07bc9d64314515c1</a><br>
<a href="https://dev.classmethod.jp/articles/s3-compatible-storage-minio/">https://dev.classmethod.jp/articles/s3-compatible-storage-minio/</a></br></p>
<h2 id="%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">実装したプログラム</h2>
<p><a href="https://docs.aws.amazon.com/sdk-for-go/api">AWS SDK for Go API Reference</a>を参考に実装してます。</p>
<p>認証情報は環境変数に設定しているので、アプリケーションで設定していません。<br>
<a href="https://github.com/aws/aws-sdk-go/blob/master/aws/session/env_config.go">https://github.com/aws/aws-sdk-go/blob/master/aws/session/env_config.go</a></br></p>
<pre><code>import (
 &quot;bytes&quot;
 &quot;encoding/base64&quot;
 &quot;github.com/aws/aws-sdk-go/aws&quot;
 &quot;github.com/aws/aws-sdk-go/aws/session&quot;
 &quot;github.com/aws/aws-sdk-go/service/s3/s3manager&quot;
)
func (s s3Service) Upload(f upload.File) error {
 sess := session.Must(session.NewSessionWithOptions(session.Options{
  SharedConfigState: session.SharedConfigEnable,
  Config: aws.Config{
   Endpoint:         aws.String(s.Endpoints),
   S3ForcePathStyle: aws.Bool(true)},
 }))
 uploader := s3manager.NewUploader(sess)
 fname := f.ConvFileName()
 data, _ := base64.StdEncoding.DecodeString(f.Data)
 wb := new(bytes.Buffer)
 wb.Write(data)
 // Upload the file to S3.
 if _, err := uploader.Upload(&amp;s3manager.UploadInput{
  Bucket: aws.String(s.BucketName),
  Key:    aws.String(fname),
  Body:   wb,
 }); err != nil {
  return err
 }
 return nil
}
</code></pre>
<p>minioを使う時には、この考慮が必要そうです。</p>
<pre><code>S3ForcePathStyle: aws.Bool(true)},
</code></pre>
<p>パスの生成が違うんですね。SDKでS3ForcePathStyleのコメントにはこの様に記述されてます。<br>
// Set this to `true` to force the request to use path-style addressing,<br>
// i.e., `http://s3.amazonaws.com/BUCKET/KEY`. By default, the S3 client<br>
// will use virtual hosted bucket addressing when possible<br>
// (`http://BUCKET.s3.amazonaws.com/KEY`).</br></br></br></br></p>
<p>ちなみにfalseの場合はエラーとなります。<br>
caused by: Put &quot;<a href="http://engineed.minio:9000/5af84b7c80dffc14d769421f68cf4ef5e0d03128858fb648cdcfcc1196dbf3e3">http://test.minio:9000/5af84b7c80dffc14d769421f68cf4ef5e0d03128858fb648cdcfcc1196dbf3e3</a>&quot;: dial tcp: lookup engineed.minio on 127.0.0.11:53: no such host</br></p>
<pre><code> data, _ := base64.StdEncoding.DecodeString(f.Data)
 wb := new(bytes.Buffer)
 wb.Write(data)
</code></pre>
<p>UploadInputのBodyには*bytes.Bufferを設定しています。<br>
s3manager.UploadInputのBodyはio.Reader型です。bytes.BufferもRead(p []byte) (n int, err error)メソッドを実装しているので、Bodyに設定出来るんですね。</br></p>
<p>ドキュメント充実してるなーと感じた開発でした。</p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[バックオフィス初心者向け〜1月の提出書類まとめ〜]]></title><description><![CDATA[こんにちは！バックオフィス歴2年目のすももです。
1月末は、「給与支払報告書」「法定調書合計表」「償却資産申告書」と提出期限のある書類が集中していて慌ただしくなりますよね！

年に一度の作業なので、忘れないようにそれぞれの書類について簡単にまとめてみました！



給与支払報告書とは？
市区町村に対し、前年1月1日〜12月31日までの1年間の給与支払状況を報告する為の書類です。
この書類をもとに今年度の住民税額(6月から翌年5月分)が算出されます。

提出対象者
前年1年間に給与を支払った全員(アルバイトや既に退職した人も含む)
※年間支払額が30万円以下の退職者の場合は提出義務なし
※年間支払額が30万円以下であっても1月1日現在在籍中であれば提出必要

提出先：市区町村(※1月1日現在に居住している住所地の市区町村)
電子申告：e-TAX(国税電子申告•納税システム)

従業員が増えるほど提出書類も提出先も増える為、なかなか手間がかります…！
私は2年連続郵送で提出しましたが(今年は21市区町村へ)、簡易書留代もまぁまぁ掛かるので、来年こそは電子申告でいけるよう使い方をマスターした]]></description><link>https://tech.anti-pattern.co.jp/backoffice-january-matome/</link><guid isPermaLink="false">Ghost__Post__610a2f323986b000013a4f4c</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Tue, 09 Feb 2021 06:14:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは！バックオフィス歴2年目のすももです。<br>
1月末は、「給与支払報告書」「法定調書合計表」「償却資産申告書」と提出期限のある書類が集中していて慌ただしくなりますよね！</br></p>
<p>年に一度の作業なので、忘れないようにそれぞれの書類について簡単にまとめてみました！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/jan-1.png" alt="jan-1" loading="lazy"/></p>
<h2 id="%E7%B5%A6%E4%B8%8E%E6%94%AF%E6%89%95%E5%A0%B1%E5%91%8A%E6%9B%B8%E3%81%A8%E3%81%AF%EF%BC%9F">給与支払報告書とは？</h2>
<p>市区町村に対し、前年1月1日〜12月31日までの1年間の給与支払状況を報告する為の書類です。<br>
この書類をもとに今年度の住民税額(6月から翌年5月分)が算出されます。</br></p>
<h4 id="%E6%8F%90%E5%87%BA%E5%AF%BE%E8%B1%A1%E8%80%85">提出対象者</h4>
<p>前年1年間に給与を支払った全員(アルバイトや既に退職した人も含む)<br>
※年間支払額が30万円以下の退職者の場合は提出義務なし<br>
※年間支払額が30万円以下であっても1月1日現在在籍中であれば提出必要</br></br></p>
<p>提出先：市区町村(※1月1日現在に居住している住所地の市区町村)<br>
電子申告：e-TAX(国税電子申告•納税システム)</br></p>
<p>従業員が増えるほど提出書類も提出先も増える為、なかなか手間がかります…！<br>
私は2年連続郵送で提出しましたが(今年は21市区町村へ)、簡易書留代もまぁまぁ掛かるので、来年こそは電子申告でいけるよう使い方をマスターしたいと思います！</br></p>
<h2 id="%E6%B3%95%E5%AE%9A%E8%AA%BF%E6%9B%B8%E5%90%88%E8%A8%88%E8%A1%A8%E3%81%A8%E3%81%AF%EF%BC%9F">法定調書合計表とは？</h2>
<p>税務署がお金の動きを正しく把握する為の書類です。<br>
前年1年間に、どこにいくら支払ったのかを報告します。<br>
この書類により何か税額が決まる訳ではなく、確定申告の裏付け資料として使われます。</br></br></p>
<h4 id="%E6%8F%90%E5%87%BA%E5%86%85%E5%AE%B9">提出内容</h4>
<ol>
<li>給与所得の源泉徴収票合計表</li>
<li>退職所得の源泉徴収票合計表</li>
<li>報酬、料金、契約金及び賞金の支払調書合計表</li>
<li>不動産の使用料等の支払調書合計表</li>
<li>不動産等の譲受けの対価の支払調書合計表</li>
<li>不動産等の売買又は貸付けのあっせん手数料の支払調書合計表</li>
</ol>
<p>以上6種類の法定調書を種類ごとに集計して合計表に記載、支払金額など各種条件を確認し、対象の人の分の支払調書を作成したり、源泉徴収票を添付して提出します。</p>
<p>提出先：所轄税務署(国税庁)<br>
電子申告：eLTAX(地方税ポータルシステム)</br></p>
<p>支払調書に記載する為に、源泉徴収対象の個人事業主の方のマイナンバー収集をする必要があります！<br>
早めにお願いしておかないと、提出期限ギリギリで慌てて収集する事になるので注意しましょう！(私は2年連続で慌てました。笑)</br></p>
<h2 id="%E5%84%9F%E5%8D%B4%E8%B3%87%E7%94%A3%E7%94%B3%E5%91%8A%E6%9B%B8%E3%81%A8%E3%81%AF%EF%BC%9F">償却資産申告書とは？</h2>
<p>1月1日現在所有している償却資産を、資産が所在する市区町村に対して申告する為の書類です。<br>
※償却資産とは、事業用資産のうち土地・家屋以外の資産のこと<br>
この書類により今年度の償却資産税額が算出されます。(東京23区の場合は6月上旬に納税通知書が交付される)</br></br></p>
<h4 id="%E6%8F%90%E5%87%BA%E6%9B%B8%E9%A1%9E">提出書類</h4>
<p>・償却資産申告書（償却資産課税台帳）<br>
・種類別明細書（増加資産・全資産用）<br>
・種類別明細書（減少資産用）</br></br></p>
<p>以上3種類の書類を記入するのですが、種類別明細書は増減や修正があった場合のみ提出すれば良いので、償却資産に変更がなければ償却資産申告書（償却資産課税台帳）のみを提出します。</p>
<p>提出先：市区町村(※東京23区の場合は都税事務所)<br>
電子申告：eLTAX(地方税ポータルシステム)</br></p>
<p>いつも東京都主税局の申告の手引きを見ていますが、記入方法など分かりやすく説明されているので、さほど困らずに記入出来ます！<br>
1月末の提出書類の中では一番手間が掛からない書類かと♪</br></p>
<p>以上！楽しいバックオフィスライフを！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する]]></title><description><![CDATA[Photo by Aleksander Vlad
[https://unsplash.com/@aleksowlade?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
地方のエンジニアの少ない中小企業で副業を行っていて、現場のメンバーでもメンテナンスできるようなNoCodeのサイト制作が求められ、最近よくSTUDIOを使っています。
STUDIO:https://studio.design/ja

こんなメニューを作成します↓

全体の構成はこのような感じです↓

ベースとなるヘッダーを用意する
サブメニューの要素を追加する
今回はABOUTを選択し、2回グループ化します。
「commandキー+G」をすると、グループ化できます。2回もグループ化するなんて謎かもしれませんが、この後にいn
hoverという機能を利用するた]]></description><link>https://tech.anti-pattern.co.jp/creating_a_header_in_studio/</link><guid isPermaLink="false">Ghost__Post__6104ad0d3986b000013a4819</guid><category><![CDATA[STUDIO]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Thu, 04 Feb 2021 02:20:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="6000" height="4000" srcset="https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@aleksowlade?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Aleksander Vlad</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1544731612-de7f96afe55f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHxjb21wdXRlcnxlbnwwfHx8fDE2Mjc2OTY0Mzc&ixlib=rb-1.2.1&q=80&w=2000" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する"/><p>地方のエンジニアの少ない中小企業で副業を行っていて、現場のメンバーでもメンテナンスできるようなNoCodeのサイト制作が求められ、最近よくSTUDIOを使っています。<br>STUDIO:<a href="https://studio.design/ja" rel="noopener nofollow">https://studio.design/ja</a></br></p><p>こんなメニューを作成します↓</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-31.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1200" height="243" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-31.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-31.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-31.png 1200w" sizes="(min-width: 720px) 720px"/></figure><p>全体の構成はこのような感じです↓</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-32.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="851" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-32.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-32.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-32.png 1400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B">ベースとなるヘッダーを用意する</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-33.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1032" height="526" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-33.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-33.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-33.png 1032w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%82%B5%E3%83%96%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">サブメニューの要素を追加する</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-34.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="739" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-34.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-34.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-34.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>今回はABOUTを選択し、2回グループ化します。<br>「commandキー+G」をすると、グループ化できます。2回もグループ化するなんて謎かもしれませんが、この後にいn hoverという機能を利用するために必要になります。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-35.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="562" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-35.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-35.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-35.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>ABOUTのテキストと並列になる場所にテキストを追加します。<br>更に追加したテキストをグループ化します<br>デフォルトだとABOUTと追加したテキストは横並びになるので、縦並びになるよう修正します</br></br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-36.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1066" height="596" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-36.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-36.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-36.png 1066w" sizes="(min-width: 720px) 720px"><figcaption>下の矢印を選択すると縦並びになる</figcaption></img></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-37.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="705" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-37.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-37.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-37.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>好きな数だけメニューを追加します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-38.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="994" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-38.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-38.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-38.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>サブメニューが入ったグループの配置を「相対位置」から「絶対位置」に変更し、好みの位置に移動させます。更に色や形を整えていきます</p><p>sub menu group<br>・縦幅： 50px<br>・横幅：280%<br>・塗り：#EEEEEE</br></br></br></p><p>メニューテキスト<br>・左右のマージン：10px</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-39.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="769" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-39.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-39.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-39.png 1400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%83%9B%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B">ホバーの設定をする</h2><p>ここから、「ABOUT」をホバーしたときのみサブメニューが表示されるように設定をするのですが、その前の準備としてABOUTを囲っている外側のグループ（out side groupと呼びます）のホバー設定をします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-40.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="955" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-40.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-40.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-40.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>こうすると、見た目上は変化がないのですがout side groupの中にある要素がin hoverという機能を使えるようになります。</p><p>次に、サブメニュー（menu1,menu2,menu3）は通常時は表示されないように設定するため、sub menu groupを選択し、モーションの透明度を0に設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-41.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="674" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-41.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-41.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-41.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>このとき、一緒にスケールのY軸を0、原点を上の真ん中を選択すると、表示されたときの動きがいい感じになります。</p><p>最後にsub menu group を選択し、コンディションから「in:hover」を選択した状態でモーションの透明度を1、スケールのY軸を1に設定します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-42.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1400" height="743" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-42.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-42.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-42.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>以上で設定完了です。<br>ライブプレビューで様子を見てみましょう！</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-43.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="938" height="904" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-43.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-43.png 938w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-44.png" class="kg-image" alt="NoCodeでサイト構築できる「STUDIO」でヘッダーのサブメニューを実装する" loading="lazy" width="1200" height="243" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-44.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-44.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-44.png 1200w" sizes="(min-width: 720px) 720px"/></figure><p>できてますね！</p><h2 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h2><p>NoCodeのツールですが、かなり細かいところまで表現することができるSTUDIO、エンジニア・デザイナーじゃないと理解が難しい概念などたまにありますが、テキストの修正やブログの記事更新などは誰でも簡単にできてしまいます！<br>わからないところはチャットで質問できるところもありがたいポイントです。</br></p><p>サイトのテンプレートなども豊富で、サクッとサイトを作りたいときの手段として一つ持っていてもいいかと思います！</p>]]></content:encoded></item><item><title><![CDATA[Vuetifyのv-list-item-subtitleで文字を丸めないで出力する]]></title><description><![CDATA[こんにちは、いわむらです。

今回はVuetifyのListsコンポーネントの一つであるv-list-item-subtitleを使うと文字をいい感じに丸めてくれるのですが、そのまま出力する方法をご紹介します

まず動作確認用のテンプレートを公式から拝借してきます

Lists#Nav [https://vuetifyjs.com/ja/components/lists/#nav]をお借りしました

利用する部分のみをいったん抜粋します

v-list-item-subtitle の部分で文字が丸まってしまうのを確認するために長文を入力します

こんな感じで一定の文字数を超えてしまうと切り取られ「…」に置き換えられてしまいます。

すべての文字を出力したい場合は v-list-item-subtitle にスタイルを追加してあげましょう

wrap-textというクラスを作成してあげてそこにスタイルを追加します

スタイルを追加したらclassを付与してあげましょう

white-space: nowrap が元々のスタイルで追加されているのではみ出た部分が突き抜ける形になっているので]]></description><link>https://tech.anti-pattern.co.jp/vuetifynov-list-item-subtitledewen-zi-wowan-menaidechu-li-suru/</link><guid isPermaLink="false">Ghost__Post__610531603986b000013a4a48</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Wed, 27 Jan 2021 11:20:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです。</p><p>今回はVuetifyのListsコンポーネントの一つであるv-list-item-subtitleを使うと文字をいい感じに丸めてくれるのですが、そのまま出力する方法をご紹介します</p><p>まず動作確認用のテンプレートを公式から拝借してきます</p><p><a href="https://vuetifyjs.com/ja/components/lists/#nav" rel="noopener">Lists#Nav</a>をお借りしました</p><p>利用する部分のみをいったん抜粋します</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*hf76T0zKg47rgj3pyspqgg.png" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*rAzUfjpzVpxhPAFeTN-Xog.png" class="kg-image" alt="" loading="lazy"/></figure><p><strong>v-list-item-subtitle </strong>の部分で文字が丸まってしまうのを確認するために長文を入力します</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*iMRmsi1r1zuWC1bOSEEmtw.png" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*snFNOfAZGpHbTp7HZ0F4sg.png" class="kg-image" alt="" loading="lazy"/></figure><p>こんな感じで一定の文字数を超えてしまうと切り取られ「…」に置き換えられてしまいます。</p><p>すべての文字を出力したい場合は <strong>v-list-item-subtitle </strong>にスタイルを追加してあげましょう</p><p>wrap-textというクラスを作成してあげてそこにスタイルを追加します</p><p>スタイルを追加したらclassを付与してあげましょう</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*Te6Ni32j0Q7Y7ZXbgl19RQ.png" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*tdA1Joch8O6eGolNzHyiNA.png" class="kg-image" alt="" loading="lazy"/></figure><p>white-space: nowrap が元々のスタイルで追加されているのではみ出た部分が突き抜ける形になっているのでwhite-space: normalにしてはみ出る部分が表示されるように変更しました。</p><p>これで <strong>v-list-item-subtitle </strong>の丸められる部分を表示することができました</p><p>以上でv-list-item-subtitleで文字を丸めないで出力する方法のご紹介でした</p><p>おまけ:</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*eLU2kTudEklHiDBKwg4yqg.png" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*2k5BFRQw2GQdjnBqlyZd_A.png" class="kg-image" alt="" loading="lazy"/></figure><pre><code>display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; // (任意の数字）</code></pre><p>上記3つのスタイルを追加してあげるとline-clampに指定した数値行だけ表示することができるので数行だけ出したい場合等は試してみてください</p>]]></content:encoded></item><item><title><![CDATA[Googleスプレッドシートのあれこれ]]></title><description><![CDATA[こおりやまです。

最近、Googleスプレッドシート（以下スプレッド）を利用することが多くなってきたので、知っていると便利なショートカットキーと関数をご紹介いたします。

Excelから引き続きスプレッドでもこのショートカットキーを知っているのと知らないとだいぶ作業時間が短縮できると思うのが F4 ですね。

F4 
にも状態によって２パターターンの動作があり、シート内だと、直前の動作を繰り返す動作となるのですが、数式内で利用すると「絶対参照」、「相対参照」を切り替えることができます。


数式内の B3 を選択し F4 を押下すると $B$3 となり 絶対参照に変換されます。再度押下すると 行のみ絶対参照 → 列のみ絶対参照 → 相対参照 
と変換されます。



絶対参照に変換後、横にコピーするだけなので便利ですね。

関数では IMPORTRANGEでしょうか。

IMPORTRANGEは他のスプレッドを参照させることが可能です。
ヘルプを確認すると。IMPORTRANGE(スプレッドシートキー, 範囲の文字列) となっており、スプレッドシートキーはURLのここの部分ですね。
]]></description><link>https://tech.anti-pattern.co.jp/googlesupuretudositonoarekore/</link><guid isPermaLink="false">Ghost__Post__610b9aac3986b000013a5280</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 20 Jan 2021 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こおりやまです。</p>
<p>最近、Googleスプレッドシート（以下スプレッド）を利用することが多くなってきたので、知っていると便利なショートカットキーと関数をご紹介いたします。</p>
<p>Excelから引き続きスプレッドでもこのショートカットキーを知っているのと知らないとだいぶ作業時間が短縮できると思うのが <code>F4</code> ですね。</p>
<p><code>F4</code> にも状態によって２パターターンの動作があり、シート内だと、直前の動作を繰り返す動作となるのですが、数式内で利用すると「絶対参照」、「相対参照」を切り替えることができます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_iIAnrLMCzYsPrqMYC105Yg.png" alt="1_iIAnrLMCzYsPrqMYC105Yg" loading="lazy"><br>
数式内の <code>B3</code> を選択し <code>F4</code> を押下すると <code>$B$3</code> となり <code>絶対参照</code>に変換されます。再度押下すると <code>行のみ絶対参照</code> → <code>列のみ絶対参照</code> → <code>相対参照</code> と変換されます。</br></img></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_Obi-0mkCDmQFMm8QMN6mEA.png" alt="1_Obi-0mkCDmQFMm8QMN6mEA" loading="lazy"/></p>
<p>絶対参照に変換後、横にコピーするだけなので便利ですね。</p>
<p>関数では <code>IMPORTRANGE</code>でしょうか。</p>
<p>IMPORTRANGEは他のスプレッドを参照させることが可能です。<br>
ヘルプを確認すると。<code>IMPORTRANGE(スプレッドシートキー, 範囲の文字列)</code> となっており、スプレッドシートキーはURLのここの部分ですね。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_zLxJ7V5xEJUudaJDMw9Krw.png" alt="1_zLxJ7V5xEJUudaJDMw9Krw" loading="lazy"/></p>
<p>範囲の文字列は<code>シート名!A:B</code> など参照させたいシート名とセルの範囲を設定すると参照可能となります。(こちらの機能で参照させるには読み込み先のスプレッドにアクセス権限が必要となります)</p>
<p>IMPORTRANGE を利用することで、別のシートに対してVLOOKUPなどでの参照が可能となります。</p>
<p>ではでは</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[スクラムの歴史と3本柱について]]></title><description><![CDATA[はじめに
あけましておめでとうございます。オザサです。

昨年の12月に認定スクラムマスター研修を受け、試験も合格、無事に認定スクラムマスターとなりました。

研修を受けた後、スクラムに関わるあらゆることが気になりだし、様々な書籍を横断的に読んでまいりました。その中で得た学びを社内外に発信すべく本ブログを執筆しました。

あまりにも多くのことを学んだので何遍かに分けるつもりです。

研修においては、James Coplien氏と川口恭伸氏、また同時翻訳をしてくださった方、また、同じ研修を受けた方々に感謝申し上げます。

スクラムの歴史
スクラム以前ソフトウェア開発の話
> 1968年、NATO後援の国際会議にて、ソフトウェア開発を職人芸的な作成方法から工業製品としての作成方法に変える方法として、製品製造過程のように開発をいくつかの工程に分け、各工程の終了を意味する文書を作成することで進捗を管理し、早いうちから品質の作りこみをしようとするウォーターフォール・モデルの原形が提唱された。(
https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3]]></description><link>https://tech.anti-pattern.co.jp/the-history-of-scrum-and-its-three-pillars/</link><guid isPermaLink="false">Ghost__Post__610150b23986b000013a4101</guid><category><![CDATA[Scrum]]></category><category><![CDATA[Agile]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Wed, 13 Jan 2021 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/the-history-of-scrum-and-its-three-pillars-1-1.gif" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/the-history-of-scrum-and-its-three-pillars-1-1.gif" alt="スクラムの歴史と3本柱について"/><p>あけましておめでとうございます。オザサです。</p>
<p>昨年の12月に認定スクラムマスター研修を受け、試験も合格、無事に認定スクラムマスターとなりました。</p>
<p>研修を受けた後、スクラムに関わるあらゆることが気になりだし、様々な書籍を横断的に読んでまいりました。その中で得た学びを社内外に発信すべく本ブログを執筆しました。</p>
<p>あまりにも多くのことを学んだので何遍かに分けるつもりです。</p>
<p>研修においては、James Coplien氏と川口恭伸氏、また同時翻訳をしてくださった方、また、同じ研修を受けた方々に感謝申し上げます。</p>
<h2 id="%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE%E6%AD%B4%E5%8F%B2">スクラムの歴史</h2>
<h3 id="%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E4%BB%A5%E5%89%8D%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E8%A9%B1">スクラム以前ソフトウェア開発の話</h3>
<blockquote>
<p>1968年、NATO後援の国際会議にて、ソフトウェア開発を職人芸的な作成方法から工業製品としての作成方法に変える方法として、製品製造過程のように開発をいくつかの工程に分け、各工程の終了を意味する文書を作成することで進捗を管理し、早いうちから品質の作りこみをしようとするウォーターフォール・モデルの原形が提唱された。(<a href="https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB">https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AB</a>)</p>
</blockquote>
<p>大まかにいうと製造業や建築業の知見をソフトウェア開発に活かそうという試みである。</p>
<p>アジャイル開発が主流になる以前は、ウォーターフォールモデルが主流だったとされているが、厳密にウォータフォールで行われるというケースは少なく、あくまで<strong>工程に着目する開発</strong>、というのが広く用いられていた。(『More Effective Agile』より)</p>
<p>工程に着目し、<strong>理想主義的</strong>で<strong>予測可能な状態</strong>にあるものに対して有効な手段であるため、変化の激しい環境やソフトウェアのような抽象的なものには不向きであると今日では認識されている。</p>
<p>多くの書籍で言及されているこのモデルの問題点は、「<strong>事前に要求を特定し開発を進めることは現実的ではない</strong>」という点にある。</p>
<p>このモデルはNassim Nicholas Taleb氏の『反脆弱性』でいうところの脆いシステムとも言える。曰くその性質について下記のように言及している。</p>
<blockquote>
<p>物事が計画どおりの針路に従うかどうかに依存している。<br>
逸脱は少なければ少ないほどよい。<br>
逸脱は利益よりも害が多いからだ。</br></br></p>
</blockquote>
<p>この逸脱を不確実性によってもたらされるものであると仮定した場合、やはり不確実性の高いソフトウェア開発においては反脆いシステムである必要がある。</p>
<p>話をスクラムに戻す。</p>
<h3 id="%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE%E6%BA%90%E6%B5%81">スクラムの源流</h3>
<p>『スクラム 仕事が四倍早くなる世界標準のチーム戦術』にも記載があるが、ソフトウェア開発者であったJeff Sutherland氏はウォーターフォールのやり方に疑問を持っており、新たな開発手法を模索していた。</p>
<p>研修の中では、Scrumの源流として3つの要素をCoplien氏が挙げていた。</p>
<p><em>1.The new new product development game</em> by Hirotaka Takeuchi and Ikujiro Nonaka</p>
<p><em>2.Borland Software Craftsmanship: A New Look at Process, Quality and Productivity</em></p>
<p><em>3.Iterative, Incremental Development, Timeboxes</em></p>
<p>である。ここでは1について言及したい。</p>
<h3 id="1the-new-new-product-development-game-by-hirotaka-takeuchi-and-ikujiro-nonaka">1.The new new product development game by Hirotaka Takeuchi and Ikujiro Nonaka</h3>
<p>野中郁次郎氏と竹内弘高氏によって1986年に発表された論文である。</p>
<p>この論文はNASAや富士ゼロックス、ホンダ、キャノンなどの企業を研究することで、新たな新製品開発のプロセスを明らかにしたものである。</p>
<p>その要点は論文の一文にまとまっているので紹介する。</p>
<blockquote>
<p>Stop running the relay race and take up rugby.</p>
<p>パスリレーをやめてラグビーのように行おう(本稿著者意訳)</p>
</blockquote>
<p>この論文では図のような製品開発タイプについて言及しており、TypeCのチームをその様子からスクラムと名付けている。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/the-history-of-scrum-and-its-three-pillars-1.gif" alt="スクラムの歴史と3本柱について" loading="lazy"/></p>
<p>このTypeCにはホンダやキャノンといった日本の製造業が挙げられている。</p>
<p>よって、ある意味では日本の製造業からスクラム開発の着想が得られているとのことだが、元を辿れば、この製造業に多大な影響を与えたのは、アメリカの統計学者であったWilliam Edwards Deming氏である。</p>
<p>Deming氏は元々第2次世界大戦後の1951年の日本における国勢調査の計画立案にかかわるため来日。日本に滞在中、日本科学技術連盟からの招待もあり、多くの日本の技術者に対して「統計的工程管理法」を教えた。その中で継続的な品質改善を行うことの重要性を説いたという。</p>
<p>その上で改善の手法として、PDCAサイクルの元となる考えを示した。(PDCAサイクル自体は講義を受けた日本科学技術連盟が提唱している。)</p>
<p>この考え方は当時の日本としては画期的なものであり、トヨタの文化と適合し、「リーン生産方式」へと後に昇華された。</p>
<p>トヨタの源流は豊田自動織機であり、自動織機を製造していた。この自動織機は、織が正しく行われなかった際、異常を検知して直ちに動作を停止するよう制御されており、問題の検出を機械的に行うことが可能であったという。問題を直ちに検知し対応する。</p>
<p>のちにトヨタ生産方式でいう所の「ジャストインタイム」に繋がるトヨタの文化があったのだろう。</p>
<h3 id="2borland-software-craftsmanship-a-new-look-at-process-quality-and-productivity">2.Borland Software Craftsmanship: A New Look at Process, Quality and Productivity</h3>
<p><a href="https://sites.google.com/a/gertrudandcope.com/info/Publications/Patterns/Process/QPW">https://sites.google.com/a/gertrudandcope.com/info/Publications/Patterns/Process/QPW</a></p>
<p>本稿では内容については触れない。</p>
<h3 id="3iterative-incremental-development-timeboxes">3.Iterative, Incremental Development, Timeboxes</h3>
<p>こちらについても本稿では内容については触れない。</p>
<p>以上の3つの要素をもとに、Smalltalkのより良い開発手法について取りまとめたものがJeff Sutherland氏によって生み出され、それをKen Schwaber氏と共に抽象化/汎用化したものとしてScrumを提唱したという。</p>
<p>なお、アジャイルソフトウェア開発宣言が生まれるのはその後2001年のことである。</p>
<p>各語の関係性については川口恭伸氏の絵が有名であろうから詳しくはそれを参照されたい。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/the-history-of-scrum-and-its-three-pillars-2.png" alt="スクラムの歴史と3本柱について" loading="lazy"><br>
<a href="https://speakerdeck.com/kawaguti/agile-and-lean-from-altitude-12-000-feets?slide=3">https://speakerdeck.com/kawaguti/agile-and-lean-from-altitude-12-000-feets?slide=3</a></br></img></p>
<h2 id="ooda%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A8%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE3%E6%9C%AC%E6%9F%B1">OODAループとスクラムの3本柱</h2>
<h3 id="ooda%E3%83%AB%E3%83%BC%E3%83%97">OODAループ</h3>
<p>今日ではPDCAサイクルではなく、OODAループが注目されており、Jeff Sutherland氏曰くその考えをScrumに導入しているとしている(<a href="https://www.aglx.consulting/post/ooda-the-mindset-of-scrum">https://www.aglx.consulting/post/ooda-the-mindset-of-scrum</a>)が、このOODAループを提唱したアメリカのJohn Boyd氏はトヨタ生産方式も学んでいたことから、ある意味で考えが昇華されていると言えるだろう。</p>
<p>John Boyd氏はアメリカ空軍大佐で、飛行機乗りであった。朝鮮戦争における空対空戦闘は、米国軍のF86戦闘機とソ連製のMiG15が主たるものであった。機体性能だけでみるとMiG15の方が優れているにも関わらず、10対1で圧倒的にF86の方が撃墜される確率は低かったという。この結果に疑問を持ったBoyd氏が研究を重ねた結果分かったのは、<strong>F86の方がコックピットからの視界が広く、相手より反応が早くできたこと</strong>であるという。</p>
<p>この観察から始まる行動までの流れを理論化したものがOODAループである。</p>
<p>(余談だが、Jeff Sutherland氏も空軍パイロットであった。飛行機が着艦する様子からバーンダウンチャートを生み出したとのこと。)</p>
<p>話を戻して、OODAループとは、</p>
<p><em>Observe 観察<br>
Orient 方向づけ<br>
Deside 意思決定<br>
Act 行動</br></br></br></em></p>
<p>のループを指しており、<strong>経験主義/実証主義的</strong>なアプローチである。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/the-history-of-scrum-and-its-three-pillars-3.png" alt="スクラムの歴史と3本柱について" loading="lazy"/></p>
<p><a href="https://ja.wikipedia.org/wiki/OODA%E3%83%AB%E3%83%BC%E3%83%97">https://ja.wikipedia.org/wiki/OODA%E3%83%AB%E3%83%BC%E3%83%97</a></p>
<p>アメリカの経営評論家Tom Petersは1989年に</p>
<blockquote>
<p>OODAループで定義されている機動性ことが「競争優位」の源泉であり、単なるスピードやサイズよりも重要だと書い</p>
</blockquote>
<p>たそうな。</p>
<p>OODAループにおいてはある種不確実性をチャンスと見做す。この考え方は『反脆弱性』の反脆いシステムに繋がる。曰くそのシステムによって、</p>
<blockquote>
<p>試行錯誤は繰り返すごとに価値を増し、失敗よりも投資に近くなる</p>
</blockquote>
<p>という。</p>
<p>スクラムないしはアジャイル開発にも同様のことが言えるだろう。</p>
<p>その過程では問題を明らかにすること(観察される状態にする)が全ての始まりたり得る。つまり<strong>透明性</strong>、そして<strong>検査</strong>と<strong>適応</strong>である。これがスクラムの3本柱とされている。(『スクラムガイド』より)</p>
<p>Coplien氏は研修の中で</p>
<blockquote>
<p>スクラムはいかに自分がダメなのかを曝け出す。問題を明らかにするのであって問題を解決してくれるフレームワークではない。スクラムを銀の弾丸みたいに捉えている人がいるがその期待には応えられない。</p>
</blockquote>
<p>と述べた。</p>
<p>これは『Clean Agile』における</p>
<blockquote>
<p>希望がプロジェクトを破壊する前に、アジャイルで希望を破壊する。</p>
</blockquote>
<p>とも繋がる発言であると捉えられる。</p>
<p>しかし、このことに立ち向かうには勇気が必要である。それは問題を曝け出すことに対する恐れに対応するためだ。</p>
<p>それはどうやったら手に入るのか、それはまたの機会に。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[PostgreSQLで配列を扱う]]></title><description><![CDATA[パフォーマンス改善のために、今までアプリでやっていた処理をDBに寄せることになりした。その一環でSQLで配列を使った処理を書いたので、まとめました。

詳しくは公式ドキュメントを参照ください。

9.18. 配列関数と演算子 [https://www.postgresql.jp/document/11/html/functions-array.html]
環境
 * PostgreSQL 11.6

使用するテーブル
create table users( id BIGSERIAL, first_name VARCHAR(20) NOT NULL, last_name
VARCHAR(20) NOT NULL, first_name_kana VARCHAR(20), last_name_kana VARCHAR(20), 
version BIGINT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIME]]></description><link>https://tech.anti-pattern.co.jp/postgresql-array/</link><guid isPermaLink="false">Ghost__Post__6103faad3986b000013a4519</guid><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Tue, 29 Dec 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>パフォーマンス改善のために、今までアプリでやっていた処理をDBに寄せることになりした。その一環でSQLで配列を使った処理を書いたので、まとめました。</p>
<p>詳しくは公式ドキュメントを参照ください。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.postgresql.jp/document/11/html/functions-array.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">9.18. 配列関数と演算子</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>PostgreSQL 11.6</li>
</ul>
<h2 id="%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">使用するテーブル</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672078" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-table" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-table-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-table-LC1" class="blob-code blob-code-inner js-file-line">create table users(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-table-LC2" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-table-LC3" class="blob-code blob-code-inner js-file-line">    first_name VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-table-LC4" class="blob-code blob-code-inner js-file-line">    last_name  VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-table-LC5" class="blob-code blob-code-inner js-file-line">    first_name_kana VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-table-LC6" class="blob-code blob-code-inner js-file-line">    last_name_kana  VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-table-LC7" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-table-LC8" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-table-LC9" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-table-LC10" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-table-LC11" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-table-LC12" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-table-LC13" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-table-LC14" class="blob-code blob-code-inner js-file-line">create table friends(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-table-LC15" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-table-LC16" class="blob-code blob-code-inner js-file-line">    user_id    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-table-LC17" class="blob-code blob-code-inner js-file-line">    friend_id  BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-table-LC18" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-table-LC19" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-table-LC20" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-table-LC21" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-table-LC22" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-table-LC23" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (user_id) REFERENCES users (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-table-LC24" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (friend_id) REFERENCES users (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-table-LC25" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888/raw/6e33d4b70a32903c250790a3b71d9cd72a2e16ea/go-xorm-table" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888#file-go-xorm-table">go-xorm-table</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E9%9B%86%E7%B4%84%E3%81%99%E3%82%8B">配列として集約する</h2>
<pre><code>SELECT  
  ARRAY_AGG(friend_id) AS friend_ids  
FROM  
  friends  
GROUP BY  
  user_id
</code></pre>
<p><code>ARRAY_AGG</code> で配列を生成できます。</p>
<h2 id="%E3%82%BD%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E9%9B%86%E7%B4%84%E3%81%99%E3%82%8B">ソートして集約する</h2>
<pre><code>SELECT  
  ARRAY_AGG(friend_id ORDER BY created_at) AS friend_ids  
FROM  
  friends  
GROUP BY  
  user_id
</code></pre>
<p><code>friend_id</code> を <code>created_at</code> でソートしています。</p>
<h2 id="%E5%85%88%E9%A0%AD%E8%A6%81%E7%B4%A0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97">先頭要素だけ取得</h2>
<pre><code>SELECT  
  (ARRAY_AGG(friend_id ORDER BY created_at))[1] AS first_friend_id  
FROM  
  friends  
GROUP BY  
  user_id
</code></pre>
<p>1始まりの添字でアクセスできます。要素数を超えた添字を指定した場合、<code>NULL</code> になります。ちなみに<code>ARRAY_AGG</code> の中に<code>LIMIT 1</code> をつけるのは動きませんでした。<br>
<code>ARRAY_AGG(friend_id ORDER BY created_at LIMIT 1)</code></br></p>
<h2 id="2%E7%95%AA%E7%9B%AE%E4%BB%A5%E9%99%8D%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97">2番目以降だけ取得</h2>
<pre><code>SELECT  
  ARRAY_REMOVE(  
    ARRAY_AGG(friend_id),  
    (ARRAY_AGG(friend_id ORDER BY created_at))[1]  
  ) AS other_friend_ids  
FROM  
  friends  
GROUP BY  
  user_id
</code></pre>
<p><code>ARRAY_REMOVE</code> で要素を削除できます。ソートした先頭要素を削除することで、2番目以降の要素のみを取得できます。重複要素がある場合は全て消えるので注意が必要です。</p>
<h2 id="%E5%85%B1%E9%80%9A%E8%A6%81%E7%B4%A0%E3%81%AE%E7%A2%BA%E8%AA%8D">共通要素の確認</h2>
<pre><code>SELECT  
  *  
FROM (  
  SELECT  
    ARRAY_AGG(friend_id ORDER BY created_at) AS friend_ids  
  FROM  
    friends  
  GROUP BY  
    user_id  
) AS foo  
WHERE  
  friend_ids &amp;&amp; ARRAY[1, 2]::bigint[]
</code></pre>
<p><code>&amp;&amp;</code> は1要素でも一致していればtrueを返します。数値の型が違う場合は必要に応じてcastします。</p>
<h2 id="%E9%85%8D%E5%88%97%E3%82%92%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B">配列をテーブルとして展開する</h2>
<p>以下の記事を参考にしました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.odin.hyork.net/write/write0905.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Studio ODIN - blog�����l�^�W &gt; PostgreSQL �� �z����e�[�u���̂悤�Ɉ���</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.odin.hyork.net/img/touch-icon_198x198.png"><span class="kg-bookmark-author">blog�����l�^�W &gt; PostgreSQL �� �z����e�[�u���̂悤�Ɉ���</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.google.co.jp/intl/ja/logos/Logo_25wht.gif"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>SELECT  
  (fields::VARCHAR[])[1]::NUMERIC AS id,  
  (fields::VARCHAR[])[2]::NUMERIC AS value,  
FROM  
  UNNEST(ARRAY['{1,1}','{2,3}','{3,2}']) AS fields
</code></pre>
<p>アプリで持っている情報をSQLで参照したい場合に使用できます。</p>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A">おわり</h2>
<p>SQLで配列を使う方法についてまとめてみました。</p>
<p>配列だけでなくJSONを操作するSQLなども試しましたが、使いすぎると可読性が落ちるので、どれくらいのパフォーマンス向上に寄与するのかを考えて使った方が良さそうだなと思いました。（ここで挙げたものも、試すだけ試して使わなかった例があります）</p>
<!--kg-card-end: markdown--></link>]]></content:encoded></item><item><title><![CDATA[Shopifyでセクションを自作する]]></title><description><![CDATA[Photo by Alexander Naglestad
[https://unsplash.com/@alexandernaglestad?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
最近必死でShopifyの開発を行っているので、その内容をまとめます！

セクションとは
画像左側の「ヘッダー」「テキストオーバーレイ…」などがセクションと呼ばれるもので、ページの各パーツのことです

どんなものを作成するか
Shopifyに登録されたブログの最新記事を表示させるものを作ります

利用する画像をアップする
左下の設定 ＞ ファイル ＞ ファイルをアップロード
からファイルをアップすることができます

画像をアップロードすると、URLを取得できます

sectionファイルを作成する
次にsectionファイルを作成して]]></description><link>https://tech.anti-pattern.co.jp/shopify_section/</link><guid isPermaLink="false">Ghost__Post__6104bceb3986b000013a487f</guid><category><![CDATA[Shopify]]></category><category><![CDATA[Shopify Theme]]></category><category><![CDATA[Liquid]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Tue, 22 Dec 2020 04:10:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHN1aXRzfGVufDB8fHx8MTYyNzcwNDcxNQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fFN1aXRzfGVufDB8fHx8MTYyNzcwMDQ3MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="7952" height="5304" srcset="https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fFN1aXRzfGVufDB8fHx8MTYyNzcwMDQ3MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fFN1aXRzfGVufDB8fHx8MTYyNzcwMDQ3MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fFN1aXRzfGVufDB8fHx8MTYyNzcwMDQ3MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fFN1aXRzfGVufDB8fHx8MTYyNzcwMDQ3MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@alexandernaglestad?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Alexander Naglestad</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1580657018950-c7f7d6a6d990?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fHN1aXRzfGVufDB8fHx8MTYyNzcwNDcxNQ&ixlib=rb-1.2.1&q=80&w=2000" alt="Shopifyでセクションを自作する"/><p>最近必死でShopifyの開発を行っているので、その内容をまとめます！</p><h2 id="%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF">セクションとは</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_I7vPGH_ASqKwpr_HCgNyBA.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1400" height="1169" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_I7vPGH_ASqKwpr_HCgNyBA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_I7vPGH_ASqKwpr_HCgNyBA.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_I7vPGH_ASqKwpr_HCgNyBA.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>画像左側の「ヘッダー」「テキストオーバーレイ…」などがセクションと呼ばれるもので、ページの各パーツのことです</p><h2 id="%E3%81%A9%E3%82%93%E3%81%AA%E3%82%82%E3%81%AE%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%8B">どんなものを作成するか</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_fRUF0aADvCUgrY1EGCyGsg.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1400" height="582" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_fRUF0aADvCUgrY1EGCyGsg.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_fRUF0aADvCUgrY1EGCyGsg.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_fRUF0aADvCUgrY1EGCyGsg.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>Shopifyに登録されたブログの最新記事を表示させるものを作ります</p><h2 id="%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E7%94%BB%E5%83%8F%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B">利用する画像をアップする</h2><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_jfb-5hQhcBBn7bzwij-gkA.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1400" height="839" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_jfb-5hQhcBBn7bzwij-gkA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_jfb-5hQhcBBn7bzwij-gkA.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_jfb-5hQhcBBn7bzwij-gkA.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>左下の設定 ＞ ファイル ＞ ファイルをアップロード<br>からファイルをアップすることができます</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_yB6yAsP2BvPU3EKiZztW7Q.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1400" height="493" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_yB6yAsP2BvPU3EKiZztW7Q.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_yB6yAsP2BvPU3EKiZztW7Q.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_yB6yAsP2BvPU3EKiZztW7Q.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>画像をアップロードすると、URLを取得できます</p><h2 id="section%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">sectionファイルを作成する</h2><p>次にsectionファイルを作成してきます。<a href="https://help.shopify.com/ja/manual/online-store/themes/theme-code">Shopifyのコード編集画面</a>まで行くと、「Sections」というフォルダがあり、各セクションの.liquidファイルがこの中に入っています。「新しいsectionを追加する」をクリックしてファイルを新規作成します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_yaN_UcLMRHEgeqXVMUnNsQ.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1112" height="1274" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_yaN_UcLMRHEgeqXVMUnNsQ.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_yaN_UcLMRHEgeqXVMUnNsQ.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_yaN_UcLMRHEgeqXVMUnNsQ.png 1112w" sizes="(min-width: 720px) 720px"/></figure><h2 id="liquid%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB">liquidファイル</h2><!--kg-card-begin: markdown--><pre><code>&lt;div class=&quot;tl_container page-width&quot;&gt;
  {%- assign blog_1 = blogs[section.settings.blog_1] -%}
  {%- assign blog_2 = blogs[section.settings.blog_2] -%}
  {%- assign blog_3 = blogs[section.settings.blog_3] -%}
  {%- assign blog_4 = blogs[section.settings.blog_4] -%}
  {%- assign blog_5 = blogs[section.settings.blog_5] -%}
  &lt;ul class=&quot;tl_list&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;#A&quot; class=&quot;a ON&quot;&gt;{{ blog_1.title }}&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#B&quot; class=&quot;b&quot;&gt;{{ blog_2.title }}&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#C&quot; class=c&gt;{{ blog_3.title }}&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#D&quot; class=d&gt;{{ blog_4.title }}&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#E&quot; class=e&gt;{{ blog_5.title }}&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;section id=&quot;A&quot; class=&quot;tl_section a&quot;&gt;
    {% for article1 in blog_1.articles limit: 1 %}
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;h2&gt;{{ article1.title }}&lt;/h2&gt;
      &lt;p&gt;{{ article1.content }}&lt;/p&gt;
      &lt;button class=&quot;blog-detail&quot; onclick=&quot;location.href='{{ article1.url }}'&quot;&gt;ブログをもっと見る&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/2788204_s.jpg?v=1608208421&quot; /&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/949796_s.jpg?v=1608208420&quot; /&gt;
    &lt;/div&gt;
    {% endfor %}
  &lt;/section&gt;

  &lt;section id=&quot;B&quot; class=&quot;tl_section b&quot;&gt;
    {% for article2 in blog_2.articles limit: 1 %}
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;h2&gt;{{ article2.title }}&lt;/h2&gt;
      &lt;p&gt;{{ article2.content }}&lt;/p&gt;
      &lt;button class=&quot;blog-detail&quot; onclick=&quot;location.href='{{ article2.url }}'&quot;&gt;ブログをもっと見る&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/2788204_s.jpg?v=1608208421&quot; /&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/949796_s.jpg?v=1608208420&quot; /&gt;
    &lt;/div&gt;
    {% endfor %}
  &lt;/section&gt;

  &lt;section id=C class=&quot;tl_section c&quot;&gt;
    {% for article3 in blog_3.articles limit: 1 %}
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;h2&gt;{{ article3.title }}&lt;/h2&gt;
      &lt;p&gt;{{ article3.content }}&lt;/p&gt;
      &lt;button class=&quot;blog-detail&quot; onclick=&quot;location.href='{{ article3.url }}'&quot;&gt;ブログをもっと見る&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/2788204_s.jpg?v=1608208421&quot; /&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/949796_s.jpg?v=1608208420&quot; /&gt;
    &lt;/div&gt;
    {% endfor %}
  &lt;/section&gt;

  &lt;section id=D class=&quot;tl_section d&quot;&gt;
    {% for article4 in blog_4.articles limit: 1 %}
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;h2&gt;{{ article4.title }}&lt;/h2&gt;
      &lt;p&gt;{{ article4.content }}&lt;/p&gt;
      &lt;button class=&quot;blog-detail&quot; onclick=&quot;location.href='{{ article4.url }}'&quot;&gt;ブログをもっと見る&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/2788204_s.jpg?v=1608208421&quot; /&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/949796_s.jpg?v=1608208420&quot; /&gt;
    &lt;/div&gt;
    {% endfor %}
  &lt;/section&gt;
  
  &lt;section id=E class=&quot;tl_section e&quot;&gt;
    {% for article5 in blog_5.articles limit: 1 %}
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;h2&gt;{{ article5.title }}&lt;/h2&gt;
      &lt;p&gt;{{ article5.content }}&lt;/p&gt;
      &lt;button class=&quot;blog-detail&quot; onclick=&quot;location.href='{{ article5.url }}'&quot;&gt;ブログをもっと見る&lt;/button&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/2788204_s.jpg?v=1608208421&quot; /&gt;
    &lt;/div&gt;
    &lt;div class=&quot;blog-sction-column&quot;&gt;
      &lt;img src=&quot;https://cdn.shopify.com/s/files/1/0277/3614/6018/files/949796_s.jpg?v=1608208420&quot; /&gt;
    &lt;/div&gt;
    {% endfor %}
  &lt;/section&gt;
&lt;/div&gt;

{% schema %}
  {
    &quot;name&quot;: {
      &quot;ja&quot;: &quot;ブログタブ&quot;,
      &quot;en&quot;: &quot;blog tab&quot;
	},
    &quot;settings&quot;: [
    {
      &quot;id&quot;: &quot;blog_1&quot;,
      &quot;type&quot;: &quot;blog&quot;,
      &quot;label&quot;: {
        &quot;en&quot;: &quot;Blog 1&quot;,
        &quot;ja&quot;: &quot;ブログ 1&quot;
      }
    },
    {
      &quot;id&quot;: &quot;blog_2&quot;,
      &quot;type&quot;: &quot;blog&quot;,
      &quot;label&quot;: {
        &quot;en&quot;: &quot;Blog 2&quot;,
        &quot;ja&quot;: &quot;ブログ 2&quot;
      }
    },
    {
      &quot;id&quot;: &quot;blog_3&quot;,
      &quot;type&quot;: &quot;blog&quot;,
      &quot;label&quot;: {
        &quot;en&quot;: &quot;Blog 3&quot;,
        &quot;ja&quot;: &quot;ブログ 3&quot;
      }
    },
    {
      &quot;id&quot;: &quot;blog_4&quot;,
      &quot;type&quot;: &quot;blog&quot;,
      &quot;label&quot;: {
        &quot;en&quot;: &quot;Blog 4&quot;,
        &quot;ja&quot;: &quot;ブログ 4&quot;
      }
    },
    {
      &quot;id&quot;: &quot;blog_5&quot;,
      &quot;type&quot;: &quot;blog&quot;,
      &quot;label&quot;: {
        &quot;en&quot;: &quot;Blog 5&quot;,
        &quot;ja&quot;: &quot;ブログ 5&quot;
      }
    }
  ],
  &quot;presets&quot;: [
    {
      &quot;name&quot;: {
        &quot;en&quot;: &quot;Blog tab&quot;,
        &quot;ja&quot;: &quot;ブログタブ&quot;
      },
      &quot;category&quot;: {
        &quot;en&quot;: &quot;Blog&quot;,
        &quot;ja&quot;: &quot;ブログ&quot;
      }
    }
    ]
  }
{% endschema %}

{% stylesheet %}

.tl_container {
  margin: 0 auto;
}

.tl_list {
  display: flex;
  padding: 0;
  margin: 0;
  align-items: center;
  justify-content: left;
  list-style: none;
}

.tl_list li {
  margin: 0;
  width: 33.3333%;
  text-align: center;
  border-radius: 4px 4px 0 0;
}

.tl_list a {
  color: #000000;
  padding: 1rem 0.5rem;
  display: block;
  border: none;
  text-decoration: none;
  text-shadow: none;
}
.tl_list a:hover,
.tl_list a:focus {
  text-shadow: none;
}

.tl_list a {
  border-bottom:solid #E3E3E3;
}

.tl_list a[aria-selected=&quot;true&quot;] {
  border-bottom:solid #FDCF50;
}


/* White focus ring - so you can see when it's focussed (not required) */
.tl_section h2:focus {
  outline: none;
}


/* Section styling (optional) */

.tl_section {
  padding: 1rem 0;
  min-height: 8rem;
  /* border-radius: 0 0 4px 4px; */
  text-shadow: none;

  /* overflow: hidden; */

  display: flex;
  flex-wrap: wrap;
}
.tl_section h2 {
  margin-top: 1rem;
}

.tl_section .blog-sction-column {
  /* width: 30%;
  float: left; */
  padding: 0 10px;
  flex: 0 0 33.3333%;
  max-width: 33.3333%; /* IE11バグ対応 */
  position: relative;
}

@media (max-width: 800px) {
  .tl_section .blog-detail {
    flex: 0 0 100%;
    max-width: 100%; /* IE11バグ対応 */
  }
}

.tl_section .blog-sction-column img {
  height: 350px;
  object-fit: cover;
}


.tl_section .blog-detail {
  background-color: #DEDEDE;
  border: none;
  height: 50px;
  padding: 0 50px;
  border-radius: 25px;
  position: absolute;
  bottom: 10px;
}

/* 
Section styling (required)
Removes hidden sections from the keychain. 
Only used when JavaScript is available.
*/
[role=&quot;tabpanel&quot;][aria-hidden=&quot;true&quot;] {
  display: none;
}

{% endstylesheet %}

{% javascript %}
var accessibleTabs6 = (function () {

  &quot;use strict&quot;;

  var d = document;
  var tabListClass;
  var onClass;
  var hoverableClass;

  var setTabsOff = function (tabList) {
    var i = tabList.tabs.length;
    while (i--) {
      setTab(tabList.tabs[i], false);
    }
  };

  var setTab = function (tab, switchOn) {
    if (tab &amp;&amp; tab.panelId) {
      d.getElementById(tab.panelId).setAttribute(&quot;aria-hidden&quot;, !switchOn);
      tab.setAttribute(&quot;aria-selected&quot;, switchOn);
      tab.setAttribute(&quot;tabindex&quot;, switchOn ? &quot;0&quot; : &quot;-1&quot;);
    }
  };

  var _activateTab = function (e) {
    var tab = e.target;
    if (e.preventDefault) {
      e.preventDefault();
      setTabsOff(tab.tabList);
      setTab(tab, true);
      d.getElementById(tab.panelId).children[0].focus();
    }
  };

  var _keypressed = function (e) {

    var tab = e.target;
    var newNo = -1;
    var tabs = tab.tabList.tabs;
    var maxNo = tabs.length - 1;

    if (e.keyCode === 37 || e.keyCode === 38) { // left / up arrow
      newNo = (tab.no === 0) ? maxNo : tab.no - 1;
    }
    if (e.keyCode === 39 || e.keyCode === 40) { // right arrow / down arrow
      newNo = (tab.no === maxNo) ? 0 : tab.no + 1;
    }

    if (newNo &gt; -1) {
      setTabsOff(tab.tabList);
      setTab(tabs[newNo], true);
      tabs[newNo].focus();
    }
  };

  var _tabHovered = function (e) {
    var a = e.target;
    var useHover = a.tabList.classList.contains(hoverableClass);
    if (useHover) {
      _activateTab(e);
    }
  };

  var _events = function (tab) {
    tab.addEventListener(&quot;click&quot;, _activateTab, false);
    tab.addEventListener(&quot;keydown&quot;, _keypressed, false);
    tab.addEventListener(&quot;mouseover&quot;, _tabHovered, false);
  };

  var _initialiseAriaAttributes = function (tab) {

    var tabPanel = d.getElementById(tab.panelId);

    tab.parentNode.setAttribute(&quot;role&quot;, &quot;presentation&quot;);
    tab.setAttribute(&quot;role&quot;, &quot;tab&quot;);
    tab.setAttribute(&quot;aria-controls&quot;, tab.panelId);

    tabPanel.setAttribute(&quot;role&quot;, &quot;tabpanel&quot;);
    tabPanel.setAttribute(&quot;aria-labelledby&quot;, tab.id);

    // Make first &lt;section&gt; object keyboard focussable
    // Preferably a heading
    // Tabindex=0 to work both forwards and backwards through the keychain
    tabPanel.children[0].setAttribute(&quot;tabindex&quot;, &quot;0&quot;);

  };

  var _setUpConfig = function (cfg) {
    tabListClass = cfg.tabListClass || &quot;tl_list&quot;;
    onClass = cfg.onClass || &quot;ON&quot;;
    hoverableClass = cfg.hoverableClass || &quot;tl-hoverable&quot;;
  };

  var _setUpTab = function (tab, panelId, count) {
    tab.no = count;
    tab.id = &quot;tab-&quot; + panelId;
    tab.panelId = panelId;
    _initialiseAriaAttributes(tab);
    _events(tab);
  };


  var _initialiseTabList = function (tabList) {

    var defaultTab = 0;
    var panelId;
    var tabPanel;
    var i;

    if (tabList) {

      tabList.setAttribute(&quot;role&quot;, &quot;tablist&quot;);
      tabList.tabs = tabList.getElementsByTagName(&quot;a&quot;);
      i = tabList.tabs.length;

      while (i--) {

        tabList.tabs[i].tabList = tabList;

        panelId = tabList.tabs[i].href.slice(tabList.tabs[i].href.lastIndexOf(&quot;#&quot;) + 1);
        tabPanel = d.getElementById(panelId);

        if (tabPanel) {
          _setUpTab(tabList.tabs[i], panelId, i);
          if (tabList.tabs[i].classList.contains(onClass)) {
            defaultTab = i;

            // onClass only used to declare intial state, so remove from DOM
            tabList.tabs[i].classList.remove(onClass);
            d.getElementById(panelId).classList.remove(onClass);
          }
        }
      }
      setTabsOff(tabList);
      if (tabList.tabs[defaultTab] &amp;&amp; tabList.tabs[defaultTab].panelId) {
        setTab(tabList.tabs[defaultTab], true);
      }
    }
  };

  var _isMustardCut = function (e) {
    // check browser feature support (IE10+)
    return (
      (typeof d.querySelectorAll === &quot;function&quot;) &amp;&amp;
      d.addEventListener &amp;&amp;
      !!d.documentElement.classList // IE10+
    );
  };

  var init = function (cfg) {
    var tabLists;
    var i;

    if (_isMustardCut()) {
      _setUpConfig(cfg);
      tabLists = d.getElementsByClassName(tabListClass);
      i = tabLists.length;
      while (i--) {
        _initialiseTabList(tabLists[i]);
      }
    }
  };

  return {
    init: init
  };

}());


accessibleTabs6.init({
  tabListClass : &quot;tl_list&quot;,   // default, may omit
  onClass : &quot;ON&quot;,               // default, may omit
  hoverableClass : &quot;tl-hoverable&quot;  // default, may omit
});
{% endjavascript %}
</code></pre>
<!--kg-card-end: markdown--><p>・ファイルの前半部分<br>HTMLのコード</br></p><p>・{% schema %} 〜{% endschema %}で囲まれた部分<br>設定項目を定義しています。</br></p><p>まず、管理画面上で利用できるようにしたいため、以下を設定してください</p><!--kg-card-begin: markdown--><pre><code>&quot;presets&quot;: [
    {
      &quot;name&quot;: {
        &quot;en&quot;: &quot;Blog tab&quot;,
        &quot;ja&quot;: &quot;ブログタブ&quot;
      },
      &quot;category&quot;: {
        &quot;en&quot;: &quot;Blog&quot;,
        &quot;ja&quot;: &quot;ブログ&quot;
      }
    }
 ]
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EEMa0Rjd0VV8y4NyQhFigQ.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="1052" height="1038" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_EEMa0Rjd0VV8y4NyQhFigQ.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_EEMa0Rjd0VV8y4NyQhFigQ.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EEMa0Rjd0VV8y4NyQhFigQ.png 1052w" sizes="(min-width: 720px) 720px"/></figure><p>そうするとこのように編集画面上から利用できるようになります。</p><p>今回はShopify内のブログを選択できるようにしたかったため、↓のような項目を5つ用意しています</p><!--kg-card-begin: markdown--><pre><code>{
  &quot;id&quot;: &quot;blog_1&quot;,
  &quot;type&quot;: &quot;blog&quot;,
  &quot;label&quot;: {
    &quot;en&quot;: &quot;Blog 1&quot;,
    &quot;ja&quot;: &quot;ブログ 1&quot;
  }
},
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EFP8hgDChriZQQxv1yqwog.png" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="604" height="426" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_EFP8hgDChriZQQxv1yqwog.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EFP8hgDChriZQQxv1yqwog.png 604w"/></figure><p>そうすると、sectionの設定からブログを選択できるようになります</p><p>選択したブログはliquidファイル上部のHTMLで</p><!--kg-card-begin: markdown--><pre><code>{%- assign blog_1 = blogs[section.settings.blog_1] -%}
</code></pre>
<!--kg-card-end: markdown--><p>このように記述すると、blog_1という名前で扱えるようになります。<br>取り出したblog objectの使い方はS<a href="https://shopify.dev/docs/themes/liquid/reference/objects/blog" rel="noopener nofollow">hopifyのdevelopersサイト</a>から確認できます</br></p><p>・{% stylesheet %}〜{% endstylesheet %}<br>・{% javascript %}〜{% endjavascript %}<br>こちらはそれぞれ、cssとJavaScriptを定義できます</br></br></p><p>以上のように設定すると、このようにsectionを作成することができます！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_4o8sON3bixsq4nF-ZMQ4Tg.gif" class="kg-image" alt="Shopifyでセクションを自作する" loading="lazy" width="600" height="300"/></figure><p>おわり</p>]]></content:encoded></item><item><title><![CDATA[BIG-IPのiRulesデバッグ その２！]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

今回は、バグ修正時にやってしまったアンチパターンを書こうと思います！

httpリダイレクトの場合にロケーションヘッダのURLをhttp://からhttps://に書き換えるiRuleです

その他にこの様な条件があります
・FQDN、IPアドレスのどちらかでアクセスされる
・IPアドレスは、Data Group Listに定義されている

修正前
when HTTP_RESPONSE {
  if { [HTTP::is_redirect] } {
    if { [string tolower [URI::host [HTTP::header Location]]] contains "testsystem.com" or 
    [class match [URI::host [HTTP::header Location]] contains target_group_list ] and 
    [URI::protocol [HTTP::header Location]] equals "http"} {
      ]]></description><link>https://tech.anti-pattern.co.jp/big-ipnoirulesdebatugu-sono2/</link><guid isPermaLink="false">Ghost__Post__610e1d4b3986b000013a5442</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 21 Dec 2020 05:48:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-4.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-4.jpg" alt="BIG-IPのiRulesデバッグ その２！"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>今回は、バグ修正時にやってしまったアンチパターンを書こうと思います！</p>
<p>httpリダイレクトの場合にロケーションヘッダのURLをhttp://からhttps://に書き換えるiRuleです</p>
<p>その他にこの様な条件があります<br>
・FQDN、IPアドレスのどちらかでアクセスされる<br>
・IPアドレスは、Data Group Listに定義されている</br></br></p>
<pre><code>修正前
when HTTP_RESPONSE {
  if { [HTTP::is_redirect] } {
    if { [string tolower [URI::host [HTTP::header Location]]] contains &quot;testsystem.com&quot; or 
    [class match [URI::host [HTTP::header Location]] contains target_group_list ] and 
    [URI::protocol [HTTP::header Location]] equals &quot;http&quot;} {
      HTTP::header replace Location [string replace [HTTP::header Location] 0 3 https]
    }
  }
}
修正後）
when HTTP_RESPONSE {
  if { [HTTP::is_redirect] } {
    if { ([string tolower [URI::host [HTTP::header Location]]] contains &quot;testsystem.com&quot; ) or 
    [class match [URI::host [HTTP::header Location]] contains target_group_list ] and 
    [URI::protocol [HTTP::header Location]] equals &quot;http&quot;} {
      HTTP::header replace Location [string replace [HTTP::header Location] 0 3 https]
    }
  }
}
</code></pre>
<p>修正した箇所はここになります。(host <strong>or</strong> target_group_list) <strong>and</strong> protocol</p>
<h3 id="%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8Dirule">動作確認iRule</h3>
<p>検証環境で動作確認をしました。<br>
IPアドレス(192.168.10.10)でアクセスしてみると、ロケーションヘッダがhttps://となって正常に通信ができてます。これが失敗すると、<a href="https://xn--http-pt8a">https://→http</a>://となり、ブラウザが混合コンテンツと判定しアクセスがブロックされます。</br></p>
<p>次に、FQDN(<a href="https://testsystem.com">https://testsystem.com</a>)でアクセスしてみます。</p>
<p>あれ？ エラーだ</p>
<pre><code>TCL error: /Common/redirect_test &lt;HTTP_RESPONSE&gt; 
- bad IP network address format (line 1)invalid IP match item testsystem.com for IP class /Common/target_group_list (line 1)
  invoked from within &quot;class match [URI::host [HTTP::header Location]] equals target_group_list &quot;
</code></pre>
<p>target_group_listの値で判定する処理は変えてないんだけど・・・</p>
<p>Data Group Listの設定値を確認すると</p>
<pre><code>ltm data-group internal target_group_list {  
    records {  
        192.168.10.10/32 { }  
    }  
 **type ip**}
</code></pre>
<p>あれ？typeがip（IPアドレス型）だ。</p>
<h3 id="%E5%86%8D%E4%BF%AE%E6%AD%A3">再修正</h3>
<p>FQDNでアクセスされた場合に、target_group_listとの突合は型が異なるのできませんでした。なので、IPアドレスを指定してアクセスされたかどうか、条件分岐を入れました。</p>
<p>IPアドレス判定はこのサイトを参考にしてます<a href="https://www.javadrive.jp/regex-basic/sample/index4.html">https://www.javadrive.jp/regex-basic/sample/index4.html</a></p>
<pre><code>when HTTP_RESPONSE {
  if { [HTTP::is_redirect] } {
    if { [string tolower [URI::host [HTTP::header Location]]] contains &quot;testsystem.com&quot; and [URI::protocol [HTTP::header Location]] equals &quot;http&quot;} {
      HTTP::header replace Location [string replace [HTTP::header Location] 0 3 https]
    }
    set host [string tolower [URI::host [HTTP::header Location]]]
    if { $host matches_regex {^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$}} {
      if { [class match $host contains target_group_list] and [URI::protocol [HTTP::header Location]] equals &quot;http&quot;} {
        HTTP::header replace Location [string replace [HTTP::header Location] 0 3 https]
      }
    }
  }
}
</code></pre>
<p>FQDN、IPアドレス共に期待通りの挙動となりました。</p>
<p>おしまい！</p>
<p>だと良かったんですが、</p>
<p>嫌な予感がしたので本番環境の設定値を確認すると・・</p>
<pre><code>ltm data-group internal target_group_list {
    records {
        192.168 { }
    }
    type string
}
</code></pre>
<p>あ・・・ type stringね。値もちがうし。そして、最初の修正でよくね？</p>
<h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3>
<p>検証環境のData Group List定義を本番環境に合わせて、最初のiRuleで動作確認し、問題ありませんでした。</p>
<p>今回の対応は、早く終わらせたかったのでやっちゃいましたが、</p>
<p>あれ？typeがip（IPアドレス型）だ。</p>
<p>この時に、本番環境を確認してれば再修正の時間は不要だったはずです。<br>
この環境差異については、“ムムムッ”となるところですが、<br>
慌てた自分に反省しつつ、年の瀬を感じる今日この頃です。</br></br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[PHPの連想配列から指定の項目のみを抜き出し新しい配列を作成する方法]]></title><description><![CDATA[こんにちは。いわむらです。

今回はarray_intersect_keyとarray_flipを使用してPHPの連想配列から指定の項目を抜き出し新しい配列を作成する方法を紹介します。

まずは連想配列を用意します。

食べ物の情報が入った配列から指定の情報を抜き出します。

りんごの情報抜き出したい情報を配列で用意します。

なまえ、金額、産地を抜き出すここでforeachを使用するとこんな感じになります。

これでも良いんですが、もっとおしゃれな感じに書く方法があります。

それがarray_intersect_keyとarray_flipを使用した方法です。

array_intersect_keyが複数の配列の共通項で新しい配列を作成します

array_flipは配列のkey => valueを逆にします

それぞれの関数についてはphp.netのリンクを張っておくので、

そちらを参照してください

array_intersect_key
[https://www.php.net/manual/ja/function.array-intersect-key.php]

ar]]></description><link>https://tech.anti-pattern.co.jp/phpnolian-xiang-pei-lie-karazhi-ding-noxiang-mu-nomiwoba-kichu-sixin-siipei-lie-wozuo-cheng-surufang-fa/</link><guid isPermaLink="false">Ghost__Post__61052f083986b000013a4a40</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Fri, 11 Dec 2020 11:08:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。いわむらです。</p><p>今回はarray_intersect_keyとarray_flipを使用してPHPの連想配列から指定の項目を抜き出し新しい配列を作成する方法を紹介します。</p><p>まずは連想配列を用意します。</p><p>食べ物の情報が入った配列から指定の情報を抜き出します。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*RGBatmPslYEb-LhCjB56UQ.png" class="kg-image" alt="" loading="lazy"><figcaption>りんごの情報</figcaption></img></figure><p>抜き出したい情報を配列で用意します。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/1600/1*K6R-6dnUg7_rOnDD6volEg.png" class="kg-image" alt="" loading="lazy"><figcaption>なまえ、金額、産地を抜き出す</figcaption></img></figure><p>ここでforeachを使用するとこんな感じになります。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*E4tV9CsBdM9nisfPp6pIKg.png" class="kg-image" alt="" loading="lazy"/></figure><p>これでも良いんですが、もっとおしゃれな感じに書く方法があります。</p><p>それがarray_intersect_keyとarray_flipを使用した方法です。</p><p>array_intersect_keyが複数の配列の共通項で新しい配列を作成します</p><p>array_flipは配列のkey =&gt; valueを逆にします</p><p>それぞれの関数についてはphp.netのリンクを張っておくので、</p><p>そちらを参照してください</p><p><a href="https://www.php.net/manual/ja/function.array-intersect-key.php" rel="noopener">array_intersect_key</a></p><p><a href="https://www.php.net/manual/ja/function.array-flip.php" rel="noopener">array_flip</a></p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*v3Yt6hAd0kmWSa4jTrEA1g.png" class="kg-image" alt="" loading="lazy"/></figure><p>2つの関数を利用することですっきりした状態で書くことができました</p><p>みなさんも使う場面があれば使ってみてはいかがでしょうか？</p><p>以上、連想配列から指定の項目を抜き出し新しい配列を作成する方法でした</p>]]></content:encoded></item><item><title><![CDATA[法務局に証明書を取りに行こう！]]></title><description><![CDATA[印鑑証明書や履歴事項全部証明書を取得する為に、法務局に行った時に調べた事、行ってみて分かった事をまとめました。



取得方法は？
オンライン申請（郵送or法務局の窓口で受け取り）
・登記・供託オンライン申請システム [https://www.touki-kyoutaku-online.moj.go.jp/index.html]に登録が必要
・手数料は電子納付(窓口で収入印紙による納付は不可)
・手数料が少し安い(100円程度)

郵送で申請
・受け取りまで時間がかかる、往復の郵送料がかかる
・法務局に出向く必要なし

法務局の窓口で申請（申請書or証明書発行請求機を使用）
・法務局で待ち時間がある（請求機を使用すると待ち時間を短縮できる）
・証明書発行請求機は設置されている所とない所がある（設置場所一覧 [http://www.moj.go.jp/content/000079870.pdf]）
・手数料は法務局内で収入印紙を購入すればOK

取得できる人、準備するものは？
登記簿謄本(登記事項証明書) ※履歴事項全部証明書など
・誰でも取得可
・持ち物なし、委任状も不要なので会社関係]]></description><link>https://tech.anti-pattern.co.jp/houmukyoku-syoumeisyo/</link><guid isPermaLink="false">Ghost__Post__610a31883986b000013a4f6b</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Wed, 09 Dec 2020 08:11:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>印鑑証明書や履歴事項全部証明書を取得する為に、法務局に行った時に調べた事、行ってみて分かった事をまとめました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/houmukyoku-1.png" alt="houmukyoku-1" loading="lazy"/></p>
<h2 id="%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F">取得方法は？</h2>
<h4 id="%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E7%94%B3%E8%AB%8B%EF%BC%88%E9%83%B5%E9%80%81or%E6%B3%95%E5%8B%99%E5%B1%80%E3%81%AE%E7%AA%93%E5%8F%A3%E3%81%A7%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%EF%BC%89">オンライン申請（郵送or法務局の窓口で受け取り）</h4>
<p>・<a href="https://www.touki-kyoutaku-online.moj.go.jp/index.html">登記・供託オンライン申請システム</a>に登録が必要<br>
・手数料は電子納付(窓口で収入印紙による納付は不可)<br>
・手数料が少し安い(100円程度)</br></br></p>
<h4 id="%E9%83%B5%E9%80%81%E3%81%A7%E7%94%B3%E8%AB%8B">郵送で申請</h4>
<p>・受け取りまで時間がかかる、往復の郵送料がかかる<br>
・法務局に出向く必要なし</br></p>
<h4 id="%E6%B3%95%E5%8B%99%E5%B1%80%E3%81%AE%E7%AA%93%E5%8F%A3%E3%81%A7%E7%94%B3%E8%AB%8B%EF%BC%88%E7%94%B3%E8%AB%8B%E6%9B%B8or%E8%A8%BC%E6%98%8E%E6%9B%B8%E7%99%BA%E8%A1%8C%E8%AB%8B%E6%B1%82%E6%A9%9F%E3%82%92%E4%BD%BF%E7%94%A8%EF%BC%89">法務局の窓口で申請（申請書or証明書発行請求機を使用）</h4>
<p>・法務局で待ち時間がある（請求機を使用すると待ち時間を短縮できる）<br>
・証明書発行請求機は設置されている所とない所がある（<a href="http://www.moj.go.jp/content/000079870.pdf">設置場所一覧</a>）<br>
・手数料は法務局内で収入印紙を購入すればOK</br></br></p>
<h2 id="%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%80%81%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AF%EF%BC%9F">取得できる人、準備するものは？</h2>
<h4 id="%E7%99%BB%E8%A8%98%E7%B0%BF%E8%AC%84%E6%9C%AC%E7%99%BB%E8%A8%98%E4%BA%8B%E9%A0%85%E8%A8%BC%E6%98%8E%E6%9B%B8-%E2%80%BB%E5%B1%A5%E6%AD%B4%E4%BA%8B%E9%A0%85%E5%85%A8%E9%83%A8%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AA%E3%81%A9">登記簿謄本(登記事項証明書) ※履歴事項全部証明書など</h4>
<p>・誰でも取得可<br>
・持ち物なし、委任状も不要なので会社関係者でなくても取得できる<br>
<a href="http://www.moj.go.jp/MINJI/TESURYO/index.html"><strong>手数料(1通分)</strong></a><br>
・窓口申請/窓口受取：600円<br>
・郵送申請/郵送受取：600円<br>
・オンライン申請/郵送受取：500円<br>
・オンライン申請/窓口受取：480円</br></br></br></br></br></br></p>
<h4 id="%E5%8D%B0%E9%91%91%E8%A8%BC%E6%98%8E%E6%9B%B8">印鑑証明書</h4>
<p>・原則として会社代表者本人のみ取得可<br>
・代理人の場合は、印鑑カードの持参と代表者の生年月日が分かれば取得できる(委任状は不要)<br>
<a href="http://www.moj.go.jp/MINJI/TESURYO/index.html"><strong>手数料(1通分)</strong></a><br>
・窓口申請/窓口受取：450円<br>
・郵送申請/郵送受取：450円<br>
・オンライン申請/郵送受取：410円<br>
・オンライン申請/窓口受取：390円</br></br></br></br></br></br></p>
<p><strong>今回は法務局で証明書発行請求機を使用して申請しました！</strong></p>
<p>請求機に入力する際、途中で法務局の管轄とか法人番号を入力したりするので、事前に確認しておくと良いです。<br>
（<a href="http://houmukyoku.moj.go.jp/homu/static/kankatsu_index.html">管轄のご案内：法務局</a>）</br></p>
<p>請求機で申請完了すると番号札が発行されます。<br>
10分くらいで窓口に呼ばれるので、必要な分の収入印紙を購入して待ちましょう。</br></p>
<p>以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[DockerのMySQLで日本語が使えない！？]]></title><description><![CDATA[Dockerで起動したMySQLで日本語が入力出来ないんです。という質問があったので、内容の確認とその対応についてまとめてみました

$ docker run -e MYSQL\_ROOT\_PASSWORD='password' -d -p 33016:3306 mysql

$ docker exec -it <CONTAINER ID>

bash\# mysql -u root -p
Enter password: password

mysql> 日本語

とやると、「日本語」が消えてしまう（入力出来ない）というものでした

mysql> exit

# 日本語

とやっても入力出来ません、これはMySQLコンテナが使っているイメージで、日本語入力が出来る設定がされていないからです
ログインしているコンテナで日本語が入力出来ないので、MySQLに接続しても日本語入力出来ません

コンテナに日本語入力に必要な設定をしてみます
Dockerfileを作成して以下の設定をします

#使うDockerイメージ  
FROM mysql

#日本語設定  
RUN apt-get up]]></description><link>https://tech.anti-pattern.co.jp/docker-no-mysql-de-japanese/</link><guid isPermaLink="false">Ghost__Post__6122fe153986b000013a5b37</guid><category><![CDATA[docker]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[japanese]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Mon, 07 Dec 2020 01:55:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Dockerで起動したMySQLで日本語が入力出来ないんです。という質問があったので、内容の確認とその対応についてまとめてみました</p>
<!--kg-card-end: markdown--><pre><code>$ docker run -e MYSQL\_ROOT\_PASSWORD='password' -d -p 33016:3306 mysql

$ docker exec -it &lt;CONTAINER ID&gt;

bash\# mysql -u root -p
Enter password: password

mysql&gt; 日本語</code></pre><!--kg-card-begin: markdown--><p>とやると、「日本語」が消えてしまう（入力出来ない）というものでした</p>
<!--kg-card-end: markdown--><pre><code>mysql&gt; exit

# 日本語</code></pre><!--kg-card-begin: markdown--><p>とやっても入力出来ません、これはMySQLコンテナが使っているイメージで、日本語入力が出来る設定がされていないからです<br>
ログインしているコンテナで日本語が入力出来ないので、MySQLに接続しても日本語入力出来ません</br></p>
<p>コンテナに日本語入力に必要な設定をしてみます<br>
Dockerfileを作成して以下の設定をします</br></p>
<!--kg-card-end: markdown--><pre><code>#使うDockerイメージ  
FROM mysql

#日本語設定  
RUN apt-get update &amp;&amp; apt-get install -y locales  
RUN sed -i -E 's/# (ja\_JP.UTF-8)/\\1/' /etc/locale.gen &amp;&amp; locale-gen  
ENV LANG ja\_JP.UTF-8
</code></pre><!--kg-card-begin: markdown--><p>設定内容としては、<br>
apt-get update → パッケージ管理のapt-getに必要な情報を取得<br>
apt-get install -y locales → 多国語サポート用ライブラリ（locales）インストール<br>
sed -i -E ‘s/# (ja_JP.UTF-8)/\1/’ /etc/locale.gen→日本語入力に必要なja_JP.UTF-8がコメントアウト（無効化）されているので、コメントアウトを削除（有効化）する<br>
locale-gen → ja_JP.UTF-8の設定を作成する（locale.genファイルで有効化したあとに、locale-genコマンド実行で設定が作成される）<br>
ENV LANG ja_JP.UTF-8 → ja_JP.UTF-8を利用する宣言をする</br></br></br></br></br></p>
<p>設定が出来たらビルド、コンテナ起動して日本語入力を試してみます</p>
<!--kg-card-end: markdown--><pre><code>$ docker build .  
Sending build context to Docker daemon  2.048kB  
Step 1/4 : FROM mysql  
 ---&gt; dd7265748b5d  
Step 2/4 : RUN apt-get update &amp;&amp; apt-get install -y locales  
 ---&gt; Using cache  
 ---&gt; e79295695ff9  
Step 3/4 : RUN sed -i -E 's/# (ja\_JP.UTF-8)/\\1/' /etc/locale.gen &amp;&amp; locale-gen  
 ---&gt; Using cache  
 ---&gt; b539a422d775  
Step 4/4 : ENV LANG ja\_JP.UTF-8  
 ---&gt; Using cache  
 ---&gt; 0a07da42c00e  
Successfully built 0a07da42c00e

$ docker run -e MYSQL\_ROOT\_PASSWORD='password' -d 0a07da42c00e

$ docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES  
d6567bd48620        0a07da42c00e        "docker-entrypoint.s…"   29 seconds ago      Up 29 seconds       3306/tcp, 33060/tcp   busy\_gates

$ docker exec -it d6567bd48620 bash\

# echo 日本語  
日本語
</code></pre><!--kg-card-begin: markdown--><p>日本語入力が出来ました。続いてMySQLでも確認してみます</p>
<!--kg-card-end: markdown--><pre><code># mysql -u root -p  
Enter password: passwordmysql

&gt; 日本語;  
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '日本語' at line 1</code></pre><p>同じく日本語入力の確認が出来ました</p>]]></content:encoded></item><item><title><![CDATA[MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます]]></title><description><![CDATA[まずDockerでMySQLを起動します
パスワード：password
ポート：3306
とします

$ docker run -e MYSQL\_ROOT\_PASSWORD=’password’ -d -p 3306:3306 mysql$ docker ps  
`
`
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES  
616c582d1c0b        mysql               "docker-entrypoint.s…"   22 minutes ago      Up 22 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   competent\_faraday


https://www.mysql.com/jp/products/workbench/
こちらのペ]]></description><link>https://tech.anti-pattern.co.jp/mysql-de-japanese/</link><guid isPermaLink="false">Ghost__Post__610acc313986b000013a504c</guid><category><![CDATA[MySQL]]></category><category><![CDATA[gui]]></category><category><![CDATA[docker]]></category><category><![CDATA[japanese]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Sun, 06 Dec 2020 17:24:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1-5.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1-5.png" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます"/><p>まずDockerでMySQLを起動します<br>パスワード：password<br>ポート：3306<br>とします</br></br></br></p><pre><code>$ docker run -e MYSQL\_ROOT\_PASSWORD=’password’ -d -p 3306:3306 mysql$ docker ps  
`
`
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES  
616c582d1c0b        mysql               "docker-entrypoint.s…"   22 minutes ago      Up 22 minutes       0.0.0.0:3306-&gt;3306/tcp, 33060/tcp   competent\_faraday
</code></pre><p><a href="https://www.mysql.com/jp/products/workbench/">https://www.mysql.com/jp/products/workbench/</a><br>こちらのページから、MySQL Workbenchをダウンロードしてインストールします<br>ダウンロードはこちらを押します</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-45.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="1603" height="895" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-45.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-45.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1600/2022/04/image-45.png 1600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-45.png 1603w" sizes="(min-width: 720px) 720px"/></figure><p>Select Operating Systemで使っているOSを選択（自動的に選ばれていると思いますが、違う場合は正しいのを選択しましょう）して、Downloadを押下します<br>アカウントがある人はログインして、ない人で作りたくもない人は<br>No thanks, just start my download. を押下すればダウンロードが始まります<br>通常のインストールですね、右にぽいっとします</br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-46.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="882" height="550" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-46.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-46.png 882w" sizes="(min-width: 720px) 720px"/></figure><p>終わったら起動します<br>MySQL Connections の右にある＋を押下します</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-47.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="1297" height="832" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-47.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-47.png 1297w" sizes="(min-width: 720px) 720px"/></figure><p>Dockerで動かしたMySQLに接続してみます<br>以下はローカルPCのDockerで動かしているMySQLコンテナに接続する際のサンプルです</br></p><pre><code>Connection Name: test
Hostname: 127.0.0.1
Username: root</code></pre><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-50.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="912" height="612" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-50.png 912w" sizes="(min-width: 720px) 720px"/></figure><p>パスワードはMySQLコンテナ起動時に指定したパスワードを指定します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-51.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="524" height="332"/></figure><p>Successfullyと出たので接続完了です、OKを押して閉じます<br>その後、OKを押して接続情報を保存します</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-53.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="328" height="442"/></figure><p>test が作成されているので、ダブルクリックして接続します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-56.png" class="kg-image" alt="MySQL Workbenchを使ってDockerのMySQLで日本語を扱ってみます" loading="lazy" width="1297" height="832" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/04/image-56.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/04/image-56.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/image-56.png 1297w" sizes="(min-width: 720px) 720px"/></figure><p>上記のようになればOKです！</p>]]></content:encoded></item><item><title><![CDATA[DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する]]></title><description><![CDATA[
やること
典型的な動的計画法（Dynamic Programming)を使うナップサック問題をVue3.0の学習がてら視覚化していく

技術
 * Vue3.0
 * TypeScript
 * PrimeVUE

PrimeVUE [https://primefaces.org/primevue/showcase/#/]
PrimeVUEはVue3.0に対応しており、良さげだったので使用。

あとせっかくなのでVueのCompositon APIで書いてみた。

余談：

Vue3.0のビルドが早くて驚いた。

また、Compositon APIを使うことにより型が厳密に定義できとても良いなと感じた。

ナップサック問題
ナップサック問題 - Wikipediaウィキメディア財団Contributors to Wikimedia projects
[https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C#:~:text=%E3%83%]]></description><link>https://tech.anti-pattern.co.jp/dp-dynamic-programming-wovue3-0-with-ts-primevuedeshi-jue-hua-suru/</link><guid isPermaLink="false">Ghost__Post__60fabed93986b000013a3c78</guid><category><![CDATA[DP]]></category><category><![CDATA[Vue]]></category><category><![CDATA[algorithm]]></category><category><![CDATA[Dynamic Programming]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Sun, 06 Dec 2020 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_Wn5nU4cRDRibnfyQKhbM4w.gif" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8">やること</h3><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_Wn5nU4cRDRibnfyQKhbM4w.gif" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/><p>典型的な動的計画法（Dynamic Programming)を使うナップサック問題をVue3.0の学習がてら視覚化していく</p><h3 id="%E6%8A%80%E8%A1%93">技術</h3><ul><li>Vue3.0</li><li>TypeScript</li><li>PrimeVUE</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://primefaces.org/primevue/showcase/#/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">PrimeVUE</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://primefaces.org/primevue/showcase/favicon.ico" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/></div></div></a></figure><p>PrimeVUEはVue3.0に対応しており、良さげだったので使用。</p><p>あとせっかくなのでVueのCompositon APIで書いてみた。</p><p>余談：</p><p>Vue3.0のビルドが早くて驚いた。</p><p>また、Compositon APIを使うことにより型が厳密に定義できとても良いなと感じた。</p><h4 id="%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C">ナップサック問題</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C#:~:text&#x3D;%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C%EF%BC%88%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E3%82%82%E3%82%93%E3%81%A0%E3%81%84,%E5%93%81%E7%89%A9%E3%82%92%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E3%81%AB%E8%A9%B0%E3%82%81"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ナップサック問題 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Knapsack.svg/1200px-Knapsack.svg.png" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/></div></a></figure><p>今回のナップサックにつめこむ対象はこれら、</p><p>※Maxの重量は5とする</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">
nup: [          
  { w: 2, v: 3 },
  { w: 1, v: 2 },
  { w: 3, v: 4 },
  { w: 2, v: 2 },
],
// w = weight
// v = 
valuemax_weight = 5;
</code></pre>
<!--kg-card-end: markdown--><p>愚直に再帰で全探索をするとO(2^n)かかってしまう。</p><p>そこで下記のような漸化式を作成し、</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/800/1*as_WcguJWnOPH4buv0J8ww.png" class="kg-image" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する" loading="lazy"><figcaption>wikipediaより</figcaption></img></figure><p>今回は上(indexが小さい)から計算してくので漸化式は</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">
dp[0][j] = 0
dp[i+1][j] {
  dp[i][j] (j &lt; nup[i].w)
  max(dp[i][j], dp[i][j-num[i].w] + nup[i].v)
}
</code></pre>
<!--kg-card-end: markdown--><p>このようになる。</p><p>こうすることによりO(nW)で計算ができるようになる。</p><p>C++で書くとこんな感じ</p><!--kg-card-begin: markdown--><pre><code class="language-c++">void solve() {
  for (int i=0;i&lt;n;i++) {
    for (int j=0; j&lt;=totalWeight; j++) {
      if (j &lt; weight[i]) {
        dp[i+1][j]=dp[i][j];
      } else {
        dp[i+1][j]=max(dp[i][j], dp[i+1][j-weight[i]] + value[i]);
      }
    }
  }
  cout &lt;&lt; dp[n][totalWeight] &lt;&lt; endl;
}
</code></pre>
<!--kg-card-end: markdown--><p>これにSleepを入れ、画面上に計算の過程を色を付けて示すようにした。</p><h3 id="%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/dp-vue3.0-primeviue"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/dp-vue3.0-primeviue</div><div class="kg-bookmark-description">Contribute to kooooohe/dp-vue3.0-primeviue development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b5ae91a823940dd162a1694768c8283c9f962e15a7cf7ced6c9e2c584731d677/kooooohe/dp-vue3.0-primeviue" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/></div></a></figure><p>PrimeVUEのDataTabelの仕様上、DPテーブル等ちょっとわかりにくくイレギュラーな形になっているが、ご愛嬌、ということで</p><p>そのうち拡張して、荷物の重さや価値、許容重量を決めれるようにして、いろいろと試せるようにしていく予定である</p><h3 id="gif">Gif</h3><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*Wn5nU4cRDRibnfyQKhbM4w.gif" class="kg-image" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する" loading="lazy"/></figure><p>DPや再帰処理はなれるまで紙に書いたり動きを1つ1つ追って理解する必要があった。</p><p>初見の際は難しく感じたが、実際に動きを見れてしまえば単純なもので、アルゴリズムというのはやはり楽しいなと感じた。</p><h3 id="%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%9C%AC">おすすめ本</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89-%E6%8B%93%E5%93%89-ebook/dp/B00CY9256C/ref&#x3D;sr_1_1?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;dchild&#x3D;1&amp;keywords&#x3D;%E8%9F%BB%E6%9C%AC&amp;qid&#x3D;1607870076&amp;s&#x3D;books&amp;sr&#x3D;1-1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">プログラミングコンテストチャレンジブック [第2版]　～問題解決のアルゴリズム活用力とコーディングテクニックを鍛える～ | 秋葉 拓哉, 岩田 陽一, 北川 宜稔 | 工学 | Kindleストア | Amazon</div><div class="kg-bookmark-description">Amazonで秋葉 拓哉, 岩田 陽一, 北川 宜稔のプログラミングコンテストチャレンジブック [第2版]　～問題解決のアルゴリズム活用力とコーディングテクニックを鍛える～。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">秋葉拓哉</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:357-6907985-6907031:0D6119HV47H5KPT8NX00$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3D0D6119HV47H5KPT8NX00%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/></div></a></figure><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E3%81%AA%E3%81%A3%E3%81%A8%E3%81%8F%EF%BC%81%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-%E3%82%A2%E3%83%87%E3%82%A3%E3%83%86%E3%82%A3%E3%82%A2%E3%83%BBY%E3%83%BB%E3%83%90%E3%83%BC%E3%82%AC%E3%83%90-ebook/dp/B01N14WBX3/ref&#x3D;sr_1_6?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;dchild&#x3D;1&amp;keywords&#x3D;%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&amp;qid&#x3D;1607870062&amp;s&#x3D;books&amp;sr&#x3D;1-6"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Amazon.co.jp: なっとく！アルゴリズム eBook : アディティア・Y・バーガバ, 株式会社クイープ, 株式会社クイープ: 本</div><div class="kg-bookmark-description">Amazon.co.jp: なっとく！アルゴリズム eBook : アディティア・Y・バーガバ, 株式会社クイープ, 株式会社クイープ: 本</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-publisher">アディティア・Y・バーガバ</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:356-2249083-8302142:YNQ54Z8CNENV34HKNSTG$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DYNQ54Z8CNENV34HKNSTG%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="DP(Dynamic Programming)をVue3.0 With TS & PrimeVUEで視覚化する"/></div></a></figure><p/>]]></content:encoded></item><item><title><![CDATA[Google Apps Script(GAS)でwebスクレイピング]]></title><description><![CDATA[こんにちは、こおりやまです。

Webページから情報を収集すべくGASを利用してスクレイピングしてみました。

今回、個人的に応援しているサッカーチームのカレンダーページを利用して情報を抜き出してみます。

https://www.verdy.co.jp/

GASのライブラリParserを利用すると指定したHTMLタグを利用し簡単に抽出可能です。

新しい、スプレッドシートを作成し、ライブラリとしてParserを追加します。

ID:M1lugvAXKKtUxn\_vdAG9JZleS6DrsjUUV

対象ページの情報取得はこんな感じでアクセスします。

var url = "[https://www.verdy.co.jp/calendar/202011]";  
var html = UrlFetchApp.fetch(url).getContentText('UTF-8');


あとは取得したい情報がどのような構成となっているのか確認します。



最初の <table>タグ内にカレンダー情報が存在するので、まず最初の <table>タグ情報を取得します。
build()だ]]></description><link>https://tech.anti-pattern.co.jp/google-apps-script-gas-dewebsukureipingu/</link><guid isPermaLink="false">Ghost__Post__610b96ac3986b000013a5254</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Mon, 30 Nov 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは、こおりやまです。</p>
<p>Webページから情報を収集すべくGASを利用してスクレイピングしてみました。</p>
<p>今回、個人的に応援しているサッカーチームのカレンダーページを利用して情報を抜き出してみます。</p>
<p><a href="https://www.verdy.co.jp/">https://www.verdy.co.jp/</a></p>
<p>GASのライブラリParserを利用すると指定したHTMLタグを利用し簡単に抽出可能です。</p>
<p>新しい、スプレッドシートを作成し、ライブラリとしてParserを追加します。</p>
<p>ID:<code>M1lugvAXKKtUxn\_vdAG9JZleS6DrsjUUV</code></p>
<p>対象ページの情報取得はこんな感じでアクセスします。</p>
<pre><code>var url = &quot;[https://www.verdy.co.jp/calendar/202011]&quot;;  
var html = UrlFetchApp.fetch(url).getContentText('UTF-8');
</code></pre>
<p>あとは取得したい情報がどのような構成となっているのか確認します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1_ZyfYrk6Rv9TT3Je1qwmGLA.png" alt="1_ZyfYrk6Rv9TT3Je1qwmGLA" loading="lazy"/></p>
<p>最初の <code>&lt;table&gt;</code>タグ内にカレンダー情報が存在するので、まず最初の <code>&lt;table&gt;</code>タグ情報を取得します。<br>
<code>build()</code>だと一番最初にヒットした情報を取得できます。</br></p>
<p><code>var table = Parser.data(html).from('&lt;table&gt;').to('&lt;/table&gt;').build();</code></p>
<p>次にカレンダーの行情報として <code>&lt;tr</code> 〜 <code>&lt;/tr&gt;</code>タグ情報を取得します。<br>
こちらは配列として取得します。<br>
<code>&lt;tr&gt;</code> としたいところですが、タグには複数の パターンで <code>class</code> 定義があるため開始は <code>&lt;tr</code> としています。</br></br></p>
<p><code>var listCalendar = Parser.data(table).from('&lt;tr').to('&lt;/tr&gt;').iterate();</code></p>
<p>取得した情報からHTMLタグ、改行情報を除きスプレッドシートに書き出す。</p>
<pre><code>var sheet = SpreadsheetApp.getActive().getSheetByName(&quot;VerdyCalendar&quot;);  
for(i = 0;i &lt; listCalendar.length; ++i ){  
    tag = '&lt;tr' + listCalendar\[i\]  
    //タグと改行コードを除く  
    sheet.getRange(i + 1, 1).setValue(tag.replace(/&lt;(&quot;\[^&quot;\]\*&quot;|'\[^'\]\*'|\[^'&quot;&gt;\])\*&gt;|\\r\\n|\\n|\\r/g,''));  
}
</code></pre>
<p>全体的なコードはこちら</p>
<pre><code>function myFunction() {  
  var url = &quot;[https://www.verdy.co.jp/calendar/202011]&quot;;  
  var html = UrlFetchApp.fetch(url).getContentText('UTF-8');

      //カレンダー部分  
  var table = Parser.data(html).from('&lt;table&gt;').to('&lt;/table&gt;').build();

    //行情報を取得  
  var listCalendar = Parser.data(table).from('&lt;tr').to('&lt;/tr&gt;').iterate();

    //出力用のカレンダー  
  var sheet = SpreadsheetApp.getActive().getSheetByName(&quot;VerdyCalendar&quot;);  
  for(i = 0;i &lt; listCalendar.length; ++i ){  
    tag = '&lt;tr' + listCalendar\[i\]  
    //タグと改行コードを除く  
    sheet.getRange(i + 1, 1).setValue(tag.replace(/&lt;(&quot;\[^&quot;\]\*&quot;|'\[^'\]\*'|\[^'&quot;&gt;\])\*&gt;|\\r\\n|\\n|\\r/g,''));  
  }  
}
</code></pre>
<p>抽出結果はこちら…あとは取得したデータを加工して利用するだけですね。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_S-fpYnrRBZo6O6FKMb5Tjw.png" alt="1_S-fpYnrRBZo6O6FKMb5Tjw" loading="lazy"/></p>
<p>最後にスクレイピングする場合、対象サイトなどに過度な負荷をかけないよう十分注意して実行しましょう。<br>
また、取得したデータを２次利用する場合や開示する場合など、該当サイトの規約など十分確認し利用注意が必要となります。</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[FigmaのVariantsでコンポーネントの状態管理をする手順]]></title><description><![CDATA[こんにちは。オザサです。

巷でFigmaが流行っているようなので自分で触ってみることにしました。

Variantsという機能があって面白そうだったので今回はその記事になります。
https://help.figma.com/hc/en-us/articles/360055471353-Prepare-for-Variants

できたもの


画質が荒くてすいません。

やっていることとしてはインスタンスのプロパティを変えると、矩形が変化したり色が変わったりするものを作った感じです。

下記の画像のように整理しておくと使い勝手がいいかと思います。



手順
まずはまっさらなFrameを作って作業場を確保しましょう。



次に矩形を設置します。



そのままの勢いでコンポーネントに設定しましょう。



最初はこんな感じでFrameの中にRectangle(コンポーネント)があって、その中にRectangle(図形)があるという構造になります。



では早速Variants機能を触っていきます。

画面右側にあるVariantsの「＋」ボタンを押します。



押下するとデフ]]></description><link>https://tech.anti-pattern.co.jp/to-manage-component-status-with-figmas-variants/</link><guid isPermaLink="false">Ghost__Post__61014f3a3986b000013a40f4</guid><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Mon, 23 Nov 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/to-manage-component-status-with-figmas-variants-1.gif" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/to-manage-component-status-with-figmas-variants-1.gif" alt="FigmaのVariantsでコンポーネントの状態管理をする手順"/><p>こんにちは。オザサです。</p>
<p>巷でFigmaが流行っているようなので自分で触ってみることにしました。</p>
<p><strong>Variants</strong>という機能があって面白そうだったので今回はその記事になります。<br>
<a href="https://help.figma.com/hc/en-us/articles/360055471353-Prepare-for-Variants">https://help.figma.com/hc/en-us/articles/360055471353-Prepare-for-Variants</a></br></p>
<h2 id="%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE">できたもの</h2>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/figma-variants-1.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>画質が荒くてすいません。</p>
<p>やっていることとしてはインスタンスのプロパティを変えると、矩形が変化したり色が変わったりするものを作った感じです。</p>
<p>下記の画像のように整理しておくと使い勝手がいいかと思います。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/figma-variants-2.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<h2 id="%E6%89%8B%E9%A0%86">手順</h2>
<p>まずはまっさらなFrameを作って作業場を確保しましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-3.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>次に矩形を設置します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-4.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>そのままの勢いでコンポーネントに設定しましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-5.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>最初はこんな感じでFrameの中にRectangle(コンポーネント)があって、その中にRectangle(図形)があるという構造になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-6.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>では早速Variants機能を触っていきます。</p>
<p>画面右側にあるVariantsの「＋」ボタンを押します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-7.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>押下するとデフォルトでは下記のような形でプロパティと値が設定されます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-8.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>そして、ちょっと分かりにくいのですが、コンポーネントと実際の矩形の間にVariantsが設定されます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-9.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>名前のところを押してみると、プロパティが設定されていることが確認できます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-10.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>なので、ここを書き換えてプロパティ名と値を設定しましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-11.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>こんな感じになります。</p>
<p>今回第一プロパティは形を選択するものにしたいので、squareとcircleを設定します。</p>
<p>circle(Variants)の中に四角でなく丸を設置しましょう。完成すると下記のような画面になるはずです。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-12.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>これで一つ設定ができました。</p>
<p>ほぼ同じ手順なので割愛しますが、Variantsの横にある三点リーダから「Add New Property」を設定して色について設定してあげます。</p>
<p>下記のような状態になります。あとはredに設定している矩形に赤色をつけてあげれば完成です。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-13.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>改めてですが、他の人が使いやすいように整理しておきます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/to-manage-component-status-with-figmas-variants-14.png" alt="FigmaのVariantsでコンポーネントの状態管理をする手順" loading="lazy"/></p>
<p>これを作っておくことで、ステータスごとに見た目が変化するコンポーネントを必要とする際、わざわざ似たような別のコンポーネントを作らずとも値を変えるだけで表現が可能になりました。</p>
<p>また、実際にそのコンポーネントを実装する際にどのようなプロパティを持っておけばいいのかデザインの時点で設計することができるので、きちんと使えれば実装の効率も上がるのではないかと考えています。</p>
<h2 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h2>
<p>Figma楽しいですね！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Laravelのバリデーションで指定の項目だけ許容する方法について]]></title><description><![CDATA[こんにちは。いわむらです

今回はLaravelで特定の項目のみを許容するバリデーションを紹介したいと思います

今回実際に使うルールは、Rule::inです

このメソッドがどういった動きをするかというと、

指定したリストの中に含まれている項目のみを許容します

画像にあるようにRule::inに許容する項目をarrayで渡してあげればOKです

今回は許容する項目のみを紹介しましたが、

Rule::notInというリストの項目を拒否するのもあります

DBに定数として保存していない項目を許容するか確認する際に使えて便利だったのでRule::inのご紹介でした]]></description><link>https://tech.anti-pattern.co.jp/laravelnobaridesiyondezhi-ding-noxiang-mu-dakexu-rong-surufang-fa-nituite/</link><guid isPermaLink="false">Ghost__Post__61041fa33986b000013a4684</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Wed, 11 Nov 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは。いわむらです</p><p>今回はLaravelで特定の項目のみを許容するバリデーションを紹介したいと思います</p><p>今回実際に使うルールは、Rule::inです</p><p>このメソッドがどういった動きをするかというと、</p><p>指定したリストの中に含まれている項目のみを許容します</p><figure class="kg-card kg-image-card"><img src="https://miro.medium.com/max/1174/1*_WXXX73LC3kODCisLMHcqA.png" class="kg-image" alt="" loading="lazy"/></figure><p>画像にあるようにRule::inに許容する項目をarrayで渡してあげればOKです</p><p>今回は許容する項目のみを紹介しましたが、</p><p>Rule::notInというリストの項目を拒否するのもあります</p><p>DBに定数として保存していない項目を許容するか確認する際に使えて便利だったのでRule::inのご紹介でした</p>]]></content:encoded></item><item><title><![CDATA[PostgreSQLを使ったマルチテナントデータを見直す]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

突然ですが、みなさんマルチテナントアーキテクチャってご存知ですか？

複数の企業データを扱うシステムで、リソースや運用コストなどを最大限に抑えて管理することなのですが、これを検討するのは大変です。

このブログは、あるマルチテナントデータの見直しについて、書きたいと思います。

では、どんな方法があるのでしょう？

1.複数データベース（単一インスタンス）

テナント毎に物理的にインスタンスを分けたデータベース管理

2.単一データベース＋複数スキーマ

物理的に一つのインスタンスで同じデータベースを、テナント毎にスキーマを分けて管理

3.単一データベース＋単一スキーマ

物理的に一つのインスタンスで全テナントを、一つのデータベースで管理する

それぞれ、メリット・デメリットはありそうです。安全性を考えると、1.が良さそうですが、お金かかりそうですよね。また、システムの規模、テナント数とかにも左右されそうです。

私が携わったシステムでは、運用から数年でこんな症状が出始めました。

 * DB全体の容量増加
 * 運用コストの増加
]]></description><link>https://tech.anti-pattern.co.jp/postgresqlwoshi-tutamarutitenantodetawojian-zhi-su/</link><guid isPermaLink="false">Ghost__Post__610e30223986b000013a5503</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Wed, 11 Nov 2020 07:07:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-9.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-9.jpg" alt="PostgreSQLを使ったマルチテナントデータを見直す"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>突然ですが、みなさんマルチテナントアーキテクチャってご存知ですか？</p>
<p>複数の企業データを扱うシステムで、リソースや運用コストなどを最大限に抑えて管理することなのですが、これを検討するのは大変です。</p>
<p>このブログは、あるマルチテナントデータの見直しについて、書きたいと思います。</p>
<p>では、どんな方法があるのでしょう？</p>
<p>1.複数データベース（単一インスタンス）</p>
<p>テナント毎に物理的にインスタンスを分けたデータベース管理</p>
<p>2.単一データベース＋複数スキーマ</p>
<p>物理的に一つのインスタンスで同じデータベースを、テナント毎にスキーマを分けて管理</p>
<p>3.単一データベース＋単一スキーマ</p>
<p>物理的に一つのインスタンスで全テナントを、一つのデータベースで管理する</p>
<p>それぞれ、メリット・デメリットはありそうです。安全性を考えると、1.が良さそうですが、お金かかりそうですよね。また、システムの規模、テナント数とかにも左右されそうです。</p>
<p>私が携わったシステムでは、運用から数年でこんな症状が出始めました。</p>
<ul>
<li>DB全体の容量増加</li>
<li>運用コストの増加</li>
<li>性能劣化</li>
</ul>
<p>そのため、マルチテナントデータの見直しに着手しました。</p>
<p>私が行ったのは、“単一データベース＋複数スキーマ”から</p>
<p>“単一データベース＋単一スキーマ”への変更です。</p>
<h3 id="%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E6%8B%85%E4%BF%9D">セキュリティの担保</h3>
<p>複数スキーマの各テナントデータを、単一スキーマに統合するためにデータを寄せる必要があります。そのために、PostgreSQLの行セキュリティポリシー(ROW LEVEL SECURITY)を利用しました。</p>
<blockquote>
<p><a href="https://www.postgresql.jp/docs/10/ddl-rowsecurity.html">https://www.postgresql.jp/docs/10/ddl-rowsecurity.html</a></p>
</blockquote>
<pre><code>CREATE POLICY sample_table_policy_view ON sample_table
  FOR ALL
  USING (tenant_id = current_tenant_id())
  WITH CHECK (tenant_id = current_tenant_id());
ALTER TABLE sample_table ENABLE ROW LEVEL SECURITY;
</code></pre>
<p>sample_tableには、tenant_id(テナントID)を設定しています。tenant_idはDBのroleと一致します。</p>
<p>そのため、テナントが接続した際にコンテキストのユーザ名（CURRENT_USER）からtenant_idをcurrent_tenant_id()で取得しできる仕組みです。</p>
<p>USINGでデータ参照のできる範囲、WITH CHECKでデータ参照、データ更新の範囲が抑止されています。</p>
<p>テナント毎のスキーマ定義で実現していたセキュリティは、これで担保することができました。</p>
<h3 id="%E5%A4%A7%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%AF%BE%E5%BF%9C">大量データの対応</h3>
<p>複数スキーマを統合したことにより、データ量が肥大化したテーブルが幾つかできてしまいました。トランザクションデータが格納されるテーブルのため、更にデータが増加する可能性が高く、Indexだけは対応できません。そのため、テーブルのパーティショニングを利用しました。</p>
<blockquote>
<p><a href="https://www.postgresql.jp/document/10/html/ddl-partitioning.html">https://www.postgresql.jp/document/10/html/ddl-partitioning.html</a></p>
</blockquote>
<pre><code>CREATE TABLE parent_table (
 id bigserial,
 tenant_id integer DEFAULT current_tenant_id() NOT NULL,
 partition_id SMALLINT NOT NULL DEFAULT partition_id(current_tenant_id())
) PARTITION BY LIST (partition_id);
</code></pre>
<p>PARTITION BY LISTで分割キーを指定します。</p>
<pre><code>CREATE POLICY partition_parent_table_view ON parent_table
  FOR ALL
  USING (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()))
  WITH CHECK (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()));
ALTER TABLE parent_table ENABLE ROW LEVEL SECURITY;
</code></pre>
<p>まずは、親テーブル（継承元）に対してRLSを設定します。</p>
<pre><code>-- 分割キー(partition_id)の値(0)格納するテーブル
CREATE TABLE partition_0 PARTITION OF parent_table FOR VALUES IN (0);
CREATE POLICY partition_parent_table_view ON partition_0
  FOR ALL
  USING (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()))
  WITH CHECK (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()));
ALTER TABLE partition_0 ENABLE ROW LEVEL SECURITY;
-- 分割キー(partition_id)の値(1)格納するテーブル
CREATE TABLE partition_1 PARTITION OF parent_table FOR VALUES IN (1);
CREATE POLICY partition_parent_table_view ON partition_1
  FOR ALL
  USING (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()))
  WITH CHECK (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()));
ALTER TABLE partition_1 ENABLE ROW LEVEL SECURITY;
-- 分割キー(partition_id)の値(2)格納するテーブル
CREATE TABLE partition_2 PARTITION OF parent_table FOR VALUES IN (2);
CREATE POLICY partition_parent_table_view ON partition_2
  FOR ALL
  USING (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()))
  WITH CHECK (tenant_id = current_tenant_id() AND
         partition_id = partition_id(current_tenant_id()));
ALTER TABLE partition_2 ENABLE ROW LEVEL SECURITY;
</code></pre>
<p>分割キー(partition_id)の値が0の値を格納する、子テーブル（partition_0）を作成しRLSを設定します。分割キーは、partition_id(current_tenant_id())で取得します。同様に分割キー(partition_id)の値が1、2 の値を格納する子テーブルをそれぞれ作成します。</p>
<p>この設定で、tenant_idから計算されたパーティションテーブルへデータが格納されます。そして、行セキュリティポリシーに従ったデータ参照、更新が可能となりました。</p>
<h3 id="%E3%81%9D%E3%81%97%E3%81%A6%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0">そしてチューニング</h3>
<p>データを一つのスキーマに寄せた後が大変でした。</p>
<p>実行計画を確認すると、ビックリする程、高コストだったり、Indexが効かない、設定しても逆にコストがかかったりと。</p>
<p>多段に ネストするクエリの実行計画・・・</p>
<p>一部を除き、何とかなるところまでチューニングを繰り返しました。</p>
<p>さらっと書いてますが、大変でした！</p>
<p>大変でしたが、収穫も大きく。</p>
<p>後輩が実行計画を読んで、クエリをチューニングし、Index設定をしている姿はちょっと感動しました。（初めての挑戦です）</p>
<p>それと、このブログに書いた内容は、PostgreSQL有識者の永安氏に大変お世話になってます。ありがとうございました！！</p>
<blockquote>
<p><a href="http://pgsqldeepdive.blogspot.com/">http://pgsqldeepdive.blogspot.com/</a></p>
<p><a href="https://www.slideshare.net/uptimejp/postgresql-6872500">https://www.slideshare.net/uptimejp/postgresql-6872500</a></p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[自宅でAWS 認定 ソリューションアーキテクト — アソシエイト を受験しました]]></title><description><![CDATA[もうAWSを使い始めて4，5年ぐらいになるのですが、今まで認定試験を受けていませんでした。資格なんてなくても使えればいいじゃん、、、と自分を言い聞かせていましたが、色々あってそうも言えない状況になってきたので受験することを決心

今はコロナの影響もあり在宅ワークなので、受験に行くの面倒だなと思っていたのですが、AWS公式ページから受験申込みのページ（PSIさん）を見ると、自宅から受験できるようでした。自宅で受験できるの楽じゃん！と思ってすぐ申し込みました。

一応断っておくと基本試験サイトは（試験中のやり取りも全て）英語なので、私が英語を間違って理解している可能性はありますが、受験に必要となるソフトウェア「PSI
Bridge Secure
Browser」を事前にインストールして後は試験時間を待つだけのようです。試験開始時間の30分前に居るように書いてある気がしたので、試験開始の30分前にPSIさんのサイトのリンクから「PSI
Bridge Secure Browser」を起動して待ちます。

他のアプリケーションは全て停止しろと言われるので、ChromeとかSlackを全部止めます]]></description><link>https://tech.anti-pattern.co.jp/aws-saa-in-home/</link><guid isPermaLink="false">Ghost__Post__610acb253986b000013a503b</guid><category><![CDATA[AWS]]></category><category><![CDATA[certificate]]></category><category><![CDATA[saa]]></category><category><![CDATA[online test]]></category><dc:creator><![CDATA[yuichi.kotani]]></dc:creator><pubDate>Sat, 07 Nov 2020 17:15:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1-3.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/1-3.png" alt="自宅でAWS 認定 ソリューションアーキテクト — アソシエイト を受験しました"/><p>もうAWSを使い始めて4，5年ぐらいになるのですが、今まで認定試験を受けていませんでした。資格なんてなくても使えればいいじゃん、、、と自分を言い聞かせていましたが、色々あってそうも言えない状況になってきたので受験することを決心</p>
<p>今はコロナの影響もあり在宅ワークなので、受験に行くの面倒だなと思っていたのですが、AWS公式ページから受験申込みのページ（PSIさん）を見ると、自宅から受験できるようでした。自宅で受験できるの楽じゃん！と思ってすぐ申し込みました。</p>
<p>一応断っておくと基本試験サイトは（試験中のやり取りも全て）英語なので、私が英語を間違って理解している可能性はありますが、受験に必要となるソフトウェア「PSI Bridge Secure Browser」を事前にインストールして後は試験時間を待つだけのようです。試験開始時間の30分前に居るように書いてある気がしたので、試験開始の30分前にPSIさんのサイトのリンクから「PSI Bridge Secure Browser」を起動して待ちます。</p>
<p>他のアプリケーションは全て停止しろと言われるので、ChromeとかSlackを全部止めます。マイクのチェックでなんか喋ってみろ画面に出るので、あ〜。ってしゃべるとOKになります。受験者の確認で身分証明書をカメラで撮影しろと言われるので、運転免許証を撮影します。自分の写真を取れと言われるので正面向いて写真撮ります。これで準備は終わりのようで、ちょっと準備するので15分ぐらい待ってろ。と言われます</p>
<p>ひたすら待ちます。25分ぐらい待って試験時間になりますが、画面にはまだ待てと出ているので待ちます。試験時間ちょっと過ぎたあたりで、あまりにも不安になりサポートにメッセージを送ってみます。<br>
「im waiting…」</br></p>
<p>応答ありません、さらに5分待って不安でもう一回メッセージ送ります<br>
「hello」</br></p>
<p>不安に思いながらもだんだんイライラしてきて、3分おきぐらいにメッセージを送ります<br>
「over 30 minutes, no response?」<br>
「hello」<br>
「why no response」<br>
「how long, i need wait???」<br>
「do your job」</br></br></br></br></br></p>
<p>試験時間を20分以上過ぎても応答無いので、なんか不具合があったんだろうと思い、一旦「PSI Bridge Secure Browser」を消して再度PSIさんの画面からアクセスしてみると、</p>
<p>Expired！！</p>
<p>初めてのAWS認定受験はこれで終了となります。1時間ぐらい無駄！？にしましたが、お金の方は返金されておりました<br>
会社でBBQがあったのでネタとしてこの話をしたら、「試験会場に移動する時間を考えたら、2回に1回受験できればいいんじゃないですか笑」という反応。前向きすぎ！</br></p>
<p>これでは終われないので別日に再度申し込みました、身分証明書の撮影などを終えると、ちょっと準備するので15分ぐらい待ってろ。という前回も見た画面が出てきました。またか！？と思ってちょっと待ってると、身分証明書が日本語でわからない、氏名がアルファベットで書いてある証明書を写せと言われました。反応があった〜！と喜びながら、パスポートを探して来て撮影します</p>
<p>その後は、部屋の中を360°写せ、もっとゆっくり、床も、机の上を写せ、机には何も置くな（USBケーブル・マウス・ヘッドセット）、別のPCは電源を落とせ、机の下も写せ、腕になにかつけて無いか袖をまくれ、耳になにかつけてないか見せろ、スマホは手が届かないところに置け、というように細かくチャットで指示されます。そしてついに試験開始！</p>
<p>当然ですが試験中もカメラでチェックされていて、（多分カメラを遮っていたのですが）手が邪魔、問題文を声に出して読むな、手で口を隠すな、と怒られながら試験を進めます。試験残り20分ぐらいに問題を一通りとき終わったタイミングで、突然画面が切り替わって身分証明書を撮影しろと言われ、もう一回パスポートを撮影します。また試験に戻ったので、フラグを付けた問題（気になった問題）をチラ見して、試験終了ボタンを押します。<br>
リモート試験どうだった？みたいな簡単なアンケートを答えると結果発表、「合格」！！ホッとしました、まあアソシエイトなので。。。</br></p>
<p>結果をスマホで撮って良い？とチャットで聞くと。駄目、と言われ数秒で「PSI Bridge Secure Browser」が勝手に終了しました。なんだか不思議な試験でしたがまあ受かったからいっか</p>
<p>試験は難しいというより質問が何を聞いているのか分かりづらいという印象でした。多分この選択肢を正解としたいんだろうけど、解釈次第では他の回答でも間違いでは無いんだけどな。。。みたいなのがちょろっとありました。後は勉強不足でよく使うS3ですらわからない問題が（泣）</p>
<p>「S3 スタンダード」か「S3 Glacier」ぐらいしか聞かれないだろうと思っていたのですが、思った以上に細かく聞かれたので、S3の料金節約をもっと勉強しておけばよかったな～という感じです<br>
不安な人は事前にちらっとドキュメント読んでおいたほうが良さそうです。普段使っているサービスでも全ての機能を使っているわけではないので、試験範囲となるサービスのドキュメントは一通り見ておくと安心ですね</br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ワーケーションを成功させるポイントとは]]></title><description><![CDATA[先月沖縄に8泊9日でワーケーションに行ったのですが、初めて複数人で長期ワーケーションをやってみて気付いた失敗例と、ワーケーションを成功させるポイントについてお伝えします！



〜今回のワーケーションの概要〜
・同じ会社の4人で行った
・1,2泊仕事しつつ旅する事は今までもあったが、ワーケーションとして長期間行くのは初めて
・行きは全員一緒に飛行機に乗ったが、帰る日付は人によって違った

★旅程を組む時のポイント
【同じ宿に長期で泊まるようにする】
移動時間もそうですが、宿から宿へ転々とするとその都度荷物をまとめたり広げたりする時間が発生します。
また、チェックアウト時間から次の宿にチェックイン出来る時間まで間が空く為、その間どこで仕事しよう？カフェ？コワーキングスペース？と探す必要が出てきます。
いつもと同じくらい仕事の時間を確保するには、8泊程度のワーケーションの場合、泊まる場所は1,2箇所に絞った方が良いでしょう。
（ちなみに今回のワーケーションでは、沖縄本島にある5箇所の宿を転々としました笑）

【旅行メンバーの仕事のスケジュールを確認し、遊ぶ時間を確保しておく】
スケジュール]]></description><link>https://tech.anti-pattern.co.jp/workation-point/</link><guid isPermaLink="false">Ghost__Post__610a4fe53986b000013a4fe2</guid><category><![CDATA[workation]]></category><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Tue, 03 Nov 2020 08:30:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>先月沖縄に8泊9日でワーケーションに行ったのですが、初めて複数人で長期ワーケーションをやってみて気付いた失敗例と、ワーケーションを成功させるポイントについてお伝えします！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/workation-1-1.jpeg" alt="workation-1-1" loading="lazy"/></p>
<h4 id="%E3%80%9C%E4%BB%8A%E5%9B%9E%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A6%82%E8%A6%81%E3%80%9C">〜今回のワーケーションの概要〜</h4>
<p>・同じ会社の4人で行った<br>
・1,2泊仕事しつつ旅する事は今までもあったが、ワーケーションとして長期間行くのは初めて<br>
・行きは全員一緒に飛行機に乗ったが、帰る日付は人によって違った</br></br></p>
<h2 id="%E2%98%85%E6%97%85%E7%A8%8B%E3%82%92%E7%B5%84%E3%82%80%E6%99%82%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">★旅程を組む時のポイント</h2>
<h4 id="%E3%80%90%E5%90%8C%E3%81%98%E5%AE%BF%E3%81%AB%E9%95%B7%E6%9C%9F%E3%81%A7%E6%B3%8A%E3%81%BE%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%80%91">【同じ宿に長期で泊まるようにする】</h4>
<p>移動時間もそうですが、宿から宿へ転々とするとその都度荷物をまとめたり広げたりする時間が発生します。<br>
また、チェックアウト時間から次の宿にチェックイン出来る時間まで間が空く為、その間どこで仕事しよう？カフェ？コワーキングスペース？と探す必要が出てきます。<br>
いつもと同じくらい仕事の時間を確保するには、8泊程度のワーケーションの場合、泊まる場所は1,2箇所に絞った方が良いでしょう。<br>
（ちなみに今回のワーケーションでは、沖縄本島にある5箇所の宿を転々としました笑）</br></br></br></p>
<h4 id="%E3%80%90%E6%97%85%E8%A1%8C%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%80%81%E9%81%8A%E3%81%B6%E6%99%82%E9%96%93%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%91">【旅行メンバーの仕事のスケジュールを確認し、遊ぶ時間を確保しておく】</h4>
<p>スケジュールが埋まりやすいメンバーが居る場合、事前にその人の予定を確保しておかないと、ワーケーション中一度も全員で遊べなかったなぁ…となります。<br>
融通が利く人には予定を合わせてもらい、ワーケーション中一度くらいはみんなでバケーションを楽しむ時間を確保出来ると、より楽しいワーケーションになるでしょう。</br></p>
<h2 id="%E2%98%85%E5%AE%BF%E3%82%92%E9%81%B8%E3%81%B6%E6%99%82%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">★宿を選ぶ時のポイント</h2>
<h4 id="%E3%80%90%E9%83%A8%E5%B1%8B%E3%81%AE%E9%96%93%E5%8F%96%E3%82%8A%E3%82%84%E3%80%81%E5%AE%B6%E5%85%B7%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%80%91">【部屋の間取りや、家具をチェックする】</h4>
<p>・仕事しやすい高さの机があるか<br>
・テーブル席やソファ席、テラスなど思い思いの場所で過ごせそうか<br>
・数名がWeb会議をしてもお互い邪魔にならない程度の距離を保てるか<br>
・寝室とリビングはドアや壁で仕切られているか<br>
この辺りをチェックすると良いでしょう。<br>
GoToで安く泊まれる事もありとっても素敵な宿を予約したのですが、仕事をするには不向きだったようで…<br>
「作業するには机が低い！良い高さの机はテラスにあるけどコンセントが無くて…ディスプレイ2台使いたいけど充電減り早くなるから外では長く作業できないよ〜」と一部のメンバーはお怒りでした。<br>
もちろん「バケーションするには最高の宿だね！」とは言ってくれましたよ(笑)</br></br></br></br></br></br></br></p>
<h4 id="%E3%80%90%E9%A3%9F%E6%96%99%E3%81%AE%E8%AA%BF%E9%81%94%E3%81%8C%E5%AE%B9%E6%98%93%E3%81%AB%E5%87%BA%E6%9D%A5%E3%82%8B%E5%A0%B4%E6%89%80%E3%81%AB%E3%81%99%E3%82%8B%E3%80%91">【食料の調達が容易に出来る場所にする】</h4>
<p>たまに自炊するのは楽しいですが、毎食誰かしらが作ったり片付けたり、車で買い出し行ったしてると仕事する時間が減っていきます。<br>
コンビニやスーパー、出来合いのものなど、小腹が空いたら一人でフラッと買い出しに行ける場所の方が仕事時間が確保できるでしょう。</br></p>
<h4 id="%E3%80%90%E9%80%94%E4%B8%AD%E3%81%A7%E5%B8%B0%E3%82%8B%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%8C%E3%81%84%E3%81%A6%E3%82%82%E8%87%AA%E5%8A%9B%E3%81%A7%E5%B8%B0%E3%82%8C%E3%82%8B%E5%A0%B4%E6%89%80%E3%81%AB%E3%81%99%E3%82%8B%E3%80%91">【途中で帰るメンバーがいても自力で帰れる場所にする】</h4>
<p>5日目と7日目に帰るメンバーが居た為、那覇空港まで車で送れるように旅程を組んだのですが(そのタイミングで宿を移動するようにした)、そもそも空港行きのバスが出ている場所を選べば送る必要がなかった事に後から気付きました。<br>
移動時間が一番時間を使うので、先に帰ったり後から合流するメンバーが居る場合は、自力で行き来できる場所を選ぶと良いでしょう。</br></p>
<h2 id="%E2%98%85%E6%8C%81%E3%81%A3%E3%81%A6%E8%A1%8C%E3%81%8F%E3%81%A8%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%82%E3%81%AE">★持って行くと役立つもの</h2>
<h4 id="%E5%BB%B6%E9%95%B7%E3%82%B3%E3%83%BC%E3%83%89">延長コード</h4>
<p>欲しい場所にコンセントがあるとは限りません。コードが届かないストレスを感じない為にも延長コードを準備しておくと良いです。</p>
<h4 id="%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88wi-fi">ポケットWi-Fi</h4>
<p>無料Wi-Fiがある宿を予約しても、通信環境が良いかどうかは分かりません。リビングは繋がるけど寝室とベランダは弱いなぁって事もあるので、ポケットWi-Fiも準備しておくと良いでしょう。</p>
<h4 id="%E6%8C%81%E3%81%A1%E9%81%8B%E3%81%B3%E7%94%A8%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%BC%E3%83%89">持ち運び用ホワイトボード</h4>
<p>これは人によると思いますが、今回の旅行メンバーの中にホワイトボード欲しい欲しい言ってる人が居たので(笑)<br>
同じ様に書いて整理したいタイプの方は、持ち運び用のホワイトボードを準備すると良いのではないでしょうか。</br></p>
<p>以上！お役に立てば幸いです！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[共通鍵暗号の1つであるS-DES(Simplified DES)をGoで実装してみたその１~key generate編~]]></title><description><![CDATA[共通鍵暗号の1つであるS-DES(Simplified DES)をGoで実装してみたその１~key generate編~
前回は公開鍵暗号の1つであるRSA暗号を実装してみたが、今回は共通鍵暗号の1つであるS-DESを実装していく。

公開鍵暗号の1つを実装してみたのであれば、共通鍵暗号の1つも実装しないわけには行かないだろう

公開鍵暗号の1つであるRSA暗号をGolangで実装してみる注意: ところどころ簡素化してあるところはありますMediumkooooohe
[https://medium.com/@1211lta/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7%E3%81%AE1%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8Brsa%E6%9A%97%E5%8F%B7%E3%82%92golang%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-a8d8ad01b903]
GitHub - kooooohe/SimplifiedDE]]></description><link>https://tech.anti-pattern.co.jp/gong-tong-jian-an-hao-no1tudearus-des-simplified-des-wogodeshi-zhuang-sitemitasono1-key-generatebian/</link><guid isPermaLink="false">Ghost__Post__60fab4453986b000013a3c54</guid><category><![CDATA[Go]]></category><category><![CDATA[DES]]></category><category><![CDATA[Crypt]]></category><category><![CDATA[S-DES]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Sun, 01 Nov 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E5%85%B1%E9%80%9A%E9%8D%B5%E6%9A%97%E5%8F%B7%E3%81%AE1%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8Bs-dessimplified-des%E3%82%92go%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%9D%E3%81%AE%EF%BC%91key-generate%E7%B7%A8">共通鍵暗号の1つであるS-DES(Simplified DES)をGoで実装してみたその１~key generate編~</h3><p>前回は公開鍵暗号の1つであるRSA暗号を実装してみたが、今回は共通鍵暗号の1つであるS-DESを実装していく。</p><p>公開鍵暗号の1つを実装してみたのであれば、共通鍵暗号の1つも実装しないわけには行かないだろう</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://medium.com/@1211lta/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7%E3%81%AE1%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8Brsa%E6%9A%97%E5%8F%B7%E3%82%92golang%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-a8d8ad01b903"><div class="kg-bookmark-content"><div class="kg-bookmark-title">公開鍵暗号の1つであるRSA暗号をGolangで実装してみる</div><div class="kg-bookmark-description">注意: ところどころ簡素化してあるところはあります</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://miro.medium.com/fit/c/152/152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"><span class="kg-bookmark-author">Medium</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://miro.medium.com/proxy/1*kFrc4tBFM_tCis-2Ic87WA.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/SimplifiedDES-Go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/SimplifiedDES-Go</div><div class="kg-bookmark-description">Contribute to kooooohe/SimplifiedDES-Go development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/62defca62f66664052a08d756a38823e9c536c872bf6e119f3ee99bc6de7455d/kooooohe/SimplifiedDES-Go"/></div></a></figure><p>↑のGitHubに随時追加していく予定です</p><h3 id="des%E3%81%A8%E3%81%AF">DESとは</h3><blockquote><a href="http://e-words.jp/w/DES.html#:~:text=DES%E3%81%A8%E3%81%AF%E3%80%811977%E5%B9%B4,%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B%E3%80%82" rel="noopener"><strong><em>DES</em></strong><em>とは、1977年にアメリカ連邦政府標準の</em><strong><em>暗号</em></strong><em>方式として採用された、共通鍵（秘密鍵）</em><strong><em>暗号</em></strong><em>方式の一つ。 </em><strong><em>DES</em></strong><em>は旧米国立標準局（NBS、現NIST）の標準規格としての名称であるため、</em><strong><em>暗号</em></strong><em>方式（</em><strong><em>暗号</em></strong><em>アルゴリズム）そのものを指す場合は「DEA」（Data Encryption Algorithm）と呼ばれることもある。</em></a></blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ctf-wiki.org/crypto/blockcipher/des/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">DES - CTF Wiki</div><div class="kg-bookmark-description">CTF Wiki</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ctf-wiki.org/assets/images/favicon.png"><span class="kg-bookmark-author">logo</span><span class="kg-bookmark-publisher">CTF Wiki Team</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://ctf-wiki.org/crypto/blockcipher/figure/des.gif"/></div></a></figure><h3 id="3des">3DES</h3><p>また、コンピュータの進化に伴ってより強度な暗号を生み出す必要があり、このDESの改良版である3DESもある。</p><p>※DESを三回繰り返すことにより、暗号強度を高めている。また、DESとの互換性もある</p><p>また、この互換性を持つための仕組みも知ると、思ったより簡単で面白いだろう</p><p>しかし、<a href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/00986/#:~:text=%E7%B1%B3%E5%9B%BD%E7%AB%8B%E6%A8%99%E6%BA%96%E6%8A%80%E8%A1%93%E7%A0%94%E7%A9%B6,%E3%81%93%E3%81%A8%E3%82%92%E6%8F%90%E6%A1%88%E3%81%97%E3%81%9F%E3%81%8B%E3%82%89%E3%81%A0%E3%80%82" rel="noopener">2023年を目処に使用は禁止される予定である。</a></p><h3 id="s-des">S-DES</h3><p>S-DES(Simplified DES）は教育用に作られたDES、鍵の長さや短かったり、暗号化が8bitずつであったり、ラウンド数などがDESより短くなっているが仕組みは同じである。</p><p>※あくまで教育用で作られており暗号強度は強くないのでProductionでは使わないように</p><p>そして今回は、このS-DESを実装を通して勉強していこうと思う、</p><p>本記事ではsub keyを作るところまでをおこなう</p><h4 id="10bit%E3%81%AEsecret-key%E3%82%92%E7%94%A8%E3%81%84%E3%81%A68bit%E3%81%AEsub-key%E3%82%922%E3%81%A4%E4%BD%9C%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D%E3%81%BE%E3%81%A7">10bitのsecret keyを用いて8bitのsub keyを2つ作るところまで</h4><ul><li>10bitのsecret keyを準備 (DESでは64bit)</li><li>そこから2ラウンドで暗号化を行うので、subkeyを2つ準備(DESでは16個)</li><li>鍵をp10を用いて転置をおこなう</li><li>5bitごとにleft shiftする(DESでは1回と2回、left shiftするタイミングが決まっている)</li><li>p8を用いてsubkey1を出力(8bit)</li><li>鍵を5bitごとleft shiftを2回する</li><li>p8を用いてsubkey2を出力</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/b40658d57a473d5437a16039e1a44dce"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog_des_1.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">package main

import &quot;fmt&quot;

var k1 [8]int
var k2 [8]int

func main() {
	key := [10]int{1, 0, 0, 1, 0, 1, 0, 1, 0, 1}

	rKey := p10(key)
	rKey = leftShift(rKey)
	p8(rKey, 1)
	fmt.Println(k1)

	rKey = leftShift(rKey)
	rKey = leftShift(rKey)

	p8(rKey, 2)
	fmt.Println(k2)
}

func p10(oKey [10]int) (r [10]int) {
	p10 := [10]int{2, 4, 1, 6, 3, 9, 0, 8, 7, 5}
	for k, v := range p10 {
		r[k] = oKey[v]
	}
	return
}

func leftShift(key [10]int) [10]int {
	tmp := key[0]
	for i := 0; i &lt; 4; i++ {
		key[i] = key[i+1]
	}
	key[4] = tmp
	tmp = key[5]

	for i := 5; i &lt; 9; i++ {
		key[i] = key[i+1]
	}
	key[9] = tmp
	return key
}

func p8(key [10]int, k int) {
	p8 := [8]int{5, 2, 6, 3, 7, 4, 9, 8}
	if k == 1 {
		for k, v := range p8 {
			k1[k] = key[v]
		}
	} else {
		for k, v := range p8 {
			k2[k] = key[v]
		}
	}
}
</code></pre>
<!--kg-card-end: markdown--><p>これにてS-DESにおける暗号化に必要な2つのsubkeyの出力が終わった。</p><p>次回以降このkeysを使って、暗号化を実装していこうと思います。</p><p>参考:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.cs.uri.edu/cryptography/dessimplified.htm"><div class="kg-bookmark-content"><div class="kg-bookmark-title">::CryptoGraphy - University of Rhode Island ::</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">University of Rhode Island ::</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.cs.uri.edu/cryptography/Images/Cryptography_logo.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://drive.google.com/viewerng/viewer?url&#x3D;https://sandilands.info/sgordon/teaching/reports/simplified-des-example.pdf"><div class="kg-bookmark-content"><div class="kg-bookmark-title">simplified-des-example.pdf</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"/></div><div class="kg-bookmark-thumbnail"><img src="https://drive.google.com/viewerng/thumb?ds&#x3D;AON1mFwVYTwmqkwu2AErU-rRmnASwM2afUps3vBNeY_uGtw8cj875Z9TBhr_tp4wsTr2zd0UDxENsC1slv9tViqMOblxvLY4HL1_IcPrxftNE7L8F4CBcGWYdTQbcXGAcGbKJsau7YxHkO4VCJ5QHO7Yrw_ovBInhinXKoBnFhnEF1nS6gdmBX5TnJsSNCJ5hdoFSs_IgwZUUcea-ZS9sMDcwRGL2lzuMjcbB-dmNQTu8AWp-XdQZZvUXEEHJxU_wdxNqpqYFATOJQEqc8bOwQhqkJfZwchPAz1_N3w4ZO5PQ_O5hRnCZk8%3D&amp;ck&#x3D;lantern&amp;authuser&amp;w&#x3D;800&amp;p&#x3D;proj"/></div></a></figure><p>おすすめ本</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6-IPUSIRON/dp/4798148814/ref&#x3D;sr_1_1?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;dchild&#x3D;1&amp;keywords&#x3D;%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6&amp;qid&#x3D;1604227538&amp;s&#x3D;books&amp;sr&#x3D;1-1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">暗号技術のすべて | IPUSIRON |本 | 通販 | Amazon</div><div class="kg-bookmark-description">AmazonでIPUSIRONの暗号技術のすべて。アマゾンならポイント還元本が多数。IPUSIRON作品ほか、お急ぎ便対象商品は当日お届けも可能。また暗号技術のすべてもアマゾン配送商品なら通常配送無料。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">イプシロン</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:355-5688021-2008536:GS2Y1J50F76CXC8NCN7K$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DGS2Y1J50F76CXC8NCN7K%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[GASでLINE BOT作る]]></title><description><![CDATA[LINE BOTを作る機会があったのでまとめようと思います

Photo by Shirota Yuri
[https://unsplash.com/@itshoobastank?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
作るもの
LINE BOTチャンネル内のメニューボタンをタップしたら返事返ってくるやつ

LINE developersに登録する
まずはLINE developers [https://developers.line.biz/ja/]
に登録します。登録するアカウントは「LINEアカウント」か「ビジネスアカウント」のどちらかを選択できます
[LINEアカウントでログイン]と[ビジネスアカウントでログイン]の違い
[https://help2.line.me/business_id/web/pc?]]></description><link>https://tech.anti-pattern.co.jp/linebot_gas/</link><guid isPermaLink="false">Ghost__Post__6104d25d3986b000013a48df</guid><category><![CDATA[GAS]]></category><category><![CDATA[LINE bot]]></category><category><![CDATA[GoogleAppsScript]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Sat, 31 Oct 2020 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&ixlib=rb-1.2.1&q=80&w=2000" alt="GASでLINE BOT作る"/><p>LINE BOTを作る機会があったのでまとめようと思います</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="5903" height="3935" srcset="https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1603435580027-f30889418372?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGhva2thaWRvfGVufDB8fHx8MTYyNzcwNTk2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@itshoobastank?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Shirota Yuri</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><h2 id="%E4%BD%9C%E3%82%8B%E3%82%82%E3%81%AE">作るもの</h2><p>LINE BOTチャンネル内のメニューボタンをタップしたら返事返ってくるやつ</p><h2 id="line-developers%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B">LINE developersに登録する</h2><p>まずは<a href="https://developers.line.biz/ja/" rel="noopener nofollow">LINE developers</a>に登録します。登録するアカウントは「LINEアカウント」か「ビジネスアカウント」のどちらかを選択できます<br><a href="https://help2.line.me/business_id/web/pc?lang=ja" rel="noopener nofollow">[LINEアカウントでログイン]と[ビジネスアカウントでログイン]の違い</a></br></p><p>2つは簡単に言うと、<br>・LINEアカウント → いつも使ってるやつ<br>・ビジネスアカウント → メールアドレスで新しくアカウント発行できる<br>という違いがあります</br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_nRW-Ewz0fjbG6xdkTOS3pQ.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="826" height="1016" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_nRW-Ewz0fjbG6xdkTOS3pQ.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_nRW-Ewz0fjbG6xdkTOS3pQ.png 826w" sizes="(min-width: 720px) 720px"/></figure><h2 id="%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">プロバイダーを作成する</h2><p>ログインをしたらプロバイダー一覧ページが表示されるので、好きな名前で作成します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_POqBFi7-3jrpYuzeEaqS6Q.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1218" height="1320" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_POqBFi7-3jrpYuzeEaqS6Q.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_POqBFi7-3jrpYuzeEaqS6Q.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_POqBFi7-3jrpYuzeEaqS6Q.png 1218w" sizes="(min-width: 720px) 720px"/></figure><p>作成するとコンソールが開きます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_ger3VjH6kx9HhXo4Zqv8jA.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="998" height="1710" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_ger3VjH6kx9HhXo4Zqv8jA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_ger3VjH6kx9HhXo4Zqv8jA.png 998w" sizes="(min-width: 720px) 720px"/></figure><p>プロバイダーを作成すると、その中に複数のLINE BOTチャネルを作成することができます<br>GitHubのOrganizationとリポジトリみたいなイメージです<br>プロバイダーを作成したら「Messaging API」を選択</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1__rD_-BO0X_ivZTP9vQqsgQ.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1264" height="1832" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1__rD_-BO0X_ivZTP9vQqsgQ.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1__rD_-BO0X_ivZTP9vQqsgQ.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1__rD_-BO0X_ivZTP9vQqsgQ.png 1264w" sizes="(min-width: 720px) 720px"/></figure><p>その後チャンネルの情報を入力していきます。<br>チャンネル名／チャンネル説明／大業種／小業種／メールアドレス<br>が必須入力項目のようですので、入力・作成します。</br></br></p><h2 id="%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">チャネルアクセストークンを取得する</h2><p>チャンネルを作成後、Messaging API設定ページへ行き、チャンネルアクセストークンを発行します</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_pi_pjEcPJ1G1YC3uL9pzqA.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1400" height="767" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_pi_pjEcPJ1G1YC3uL9pzqA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_pi_pjEcPJ1G1YC3uL9pzqA.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_pi_pjEcPJ1G1YC3uL9pzqA.png 1400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="gas%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B">GASを用意する</h2><!--kg-card-begin: markdown--><pre><code>// LINE developersのメッセージ送受信設定に記載のアクセストークン
const ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

function doPost(e) {
  // WebHookで受信した応答用Token
  const replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
  // ユーザーのメッセージを取得
  const userMessage = JSON.parse(e.postData.contents).events[0].message.text;  
  
  const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet');
  const wait_count = ss.getRange('A2').getValue();
  
  if (userMessage === '待ち台数を教えて') {
    PostMessage('現在の待ち台数は'+wait_count+'台です', replyToken);
  }
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

function PostMessage(message, replyToken) {
  // 応答メッセージ用のAPI URL
  const url = 'https://api.line.me/v2/bot/message/reply';

    UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': message,
      }],
    }),
    });
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_ePOGx9roZ40_SrNxT-HG_g.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="568" height="426"/></figure><p>※今回は問いかけると今何台待ってるかを返してくれるニッチなbotを作成しています<br>このようなスプレッドシートとGASを用意し、GASのコードを「ウェブアプリケーションとして導入」し公開します。<br>GASエディタ＞公開＞ウェブアプリケーションとして導入<br>「Who has access to the app:」の項目は「Anyone,even anonymous」を選択します。<br>URLが取得できるので、こちらをLINE developersのコンソールに登録します</br></br></br></br></p><h2 id="line-bot%E3%81%AEwebhookurl%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B">LINE BOTのWebhookURLを登録する</h2><p>コンソールに戻り、再びMessaging API設定の画面を開きます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_nOorUm6bCftxLr65-p6S2g.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1400" height="950" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_nOorUm6bCftxLr65-p6S2g.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_nOorUm6bCftxLr65-p6S2g.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_nOorUm6bCftxLr65-p6S2g.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>Webhook URLという項目があるので、先程のGASで取得したURLを入力して保存します。</p><p>同じ画面に友だち追加できるQRコードがあるので、友だち追加し、「待ち台数を教えて」と送ってみます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_J73OeMvUsMJKeCS81wcNlw.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="850" height="1644" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_J73OeMvUsMJKeCS81wcNlw.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_J73OeMvUsMJKeCS81wcNlw.png 850w" sizes="(min-width: 720px) 720px"/></figure><p>無事に動くことが確認できました！<br>ですがいちいち同じ文字をbotに送るのは大変なので、メニューを作成します</br></p><h2 id="%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">ボタンを作成する</h2><p>次に、<a href="https://manager.line.biz/account" rel="noopener nofollow">LINE official account Manager</a>にLINE developersとおなじアカウントでログインします。<br>作成したチャンネルが一覧に表示されますので、選択します。</br></p><p>ホーム＞リッチメニュー のページへ行き、「作成」をクリックします。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_xyNoSLhgcmbAQA_O28ue5Q.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1400" height="1305" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_xyNoSLhgcmbAQA_O28ue5Q.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_xyNoSLhgcmbAQA_O28ue5Q.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_xyNoSLhgcmbAQA_O28ue5Q.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>タイトル、表示期間を入力します<br>そして、メニューの見た目となる「コンテンツを設定」を行います<br>「テンプレートを選択」をクリックすると、メニューを何個に分割するかを選択できます。今回は小の分割されていないやつを選択しようと思います。</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_OFOCR6QiW6bpFldSiVy5GA.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1270" height="1286" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_OFOCR6QiW6bpFldSiVy5GA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_OFOCR6QiW6bpFldSiVy5GA.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_OFOCR6QiW6bpFldSiVy5GA.png 1270w" sizes="(min-width: 720px) 720px"/></figure><p>次に「画像を作成」をクリックし、メニューの見た目を作っていきます</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_J4VcGz82zZQCAfzPPIA68g.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1400" height="974" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_J4VcGz82zZQCAfzPPIA68g.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_J4VcGz82zZQCAfzPPIA68g.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_J4VcGz82zZQCAfzPPIA68g.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>北海道出身なので、北海道らしい画像にしました。お好みで文字なども入れられます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_oymgZ4DbTckMROuN61JRwg.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="1400" height="696" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_oymgZ4DbTckMROuN61JRwg.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_oymgZ4DbTckMROuN61JRwg.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_oymgZ4DbTckMROuN61JRwg.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>アクションのタイプを「テキスト」テキストの内容を「待ち台数を教えて」と設定します<br>設定後、「保存」をクリックします</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_2lNZ05UQcEmnxHLSyDq_DQ.png" class="kg-image" alt="GASでLINE BOT作る" loading="lazy" width="854" height="1658" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_2lNZ05UQcEmnxHLSyDq_DQ.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_2lNZ05UQcEmnxHLSyDq_DQ.png 854w" sizes="(min-width: 720px) 720px"/></figure><p>そうすると、LINE BOTに先程作成したメニューが表示されるようになり、いつでもかんたんに待ち台数を聞けるようになりました！</p><h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2><p>やっぱりGASは無料だし最高だな、と思いました<br>今回はテキストを受けてテキストを返すbotですが、スタンプ、音声、位置情報など多様な返事をすることもできるようです<br><a href="https://developers.line.biz/ja/docs/messaging-api/message-types/" rel="noopener nofollow">LINE BOT メッセージタイプ</a><br>みなさんも待ち台数を返すbotはもちろん、いろんなbotを考えて作ってみてくださいね！</br></br></br></p>]]></content:encoded></item><item><title><![CDATA[GitHub GraphQL API をさわってみた]]></title><description><![CDATA[こんにちは こおりやまです。

GitHubから情報を抜き出したいと思いいろいろ調べていたら、GraphQL API にたどり着きましたのでご紹介いたします。

上記リンクよりアクセスしログインして以下スクリプトを実行するとログインユーザがJson形式で取得できます。

{  
  viewer {  
    login  
  }  
}




右側が結果

メニューにあるExplorer をクリックするとクエリパラメータが選択できここで Queryを指定する感じです。
欲しいものがどこにあるのか・・・



出力する内容や条件を設定

では、プルリクのタイトル一覧を抽出してみます。
repositoryを選択し、owner /name を指定、pullRequestsのnodesでtitleを選択し実行。

{  
 repository(  
    owner: "オーナー",   
    name: "プロジェクト名") {  
    pullRequests(first: 10) {  
      nodes {  
        title  
      }]]></description><link>https://tech.anti-pattern.co.jp/github-graphql-api-wosawatutemita/</link><guid isPermaLink="false">Ghost__Post__610b94113986b000013a5232</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Tue, 20 Oct 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>こんにちは こおりやまです。</p>
<p>GitHubから情報を抜き出したいと思いいろいろ調べていたら、GraphQL API にたどり着きましたのでご紹介いたします。</p>
<p>上記リンクよりアクセスしログインして以下スクリプトを実行するとログインユーザがJson形式で取得できます。</p>
<pre><code>{  
  viewer {  
    login  
  }  
}
</code></pre>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_JVswZHaqAYBjc2T2bfsv3Q.png" alt="1_JVswZHaqAYBjc2T2bfsv3Q" loading="lazy"/></p>
<p>右側が結果</p>
<p>メニューにあるExplorer をクリックするとクエリパラメータが選択できここで Queryを指定する感じです。<br>
欲しいものがどこにあるのか・・・</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_0GscVGMWH_EpfwSCGlCMqQ.png" alt="1_0GscVGMWH_EpfwSCGlCMqQ" loading="lazy"/></p>
<p>出力する内容や条件を設定</p>
<p>では、プルリクのタイトル一覧を抽出してみます。<br>
repositoryを選択し、owner /name を指定、pullRequestsのnodesでtitleを選択し実行。</br></p>
<pre><code>{  
 repository(  
    owner: &quot;オーナー&quot;,   
    name: &quot;プロジェクト名&quot;) {  
    pullRequests(first: 10) {  
      nodes {  
        title  
      }  
    }  
  }  
}
</code></pre>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_RxATyynsZ8QeSfg7qBtQkg.png" alt="1_RxATyynsZ8QeSfg7qBtQkg" loading="lazy"/></p>
<p>出てきましたね、黒塗り多くなっていますが、こんな感じでJson形式で結果が取得できます。</p>
<p>これを利用するといろいろ抽出できるかもしれない！！</p>
<p>ということでもう少し触ってみます。</p>
<p>触ってみた結果は別の機会にご紹介させていただきます。</p>
<p>では、では</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Google ChromeのLighthouseを使ってWebサイトの評価を確認する]]></title><description><![CDATA[やりたいこと
こんにちは。オザサです。

自社サイトを最適化してユーザーのエクスペリエンスを向上させたい。

ので、まずはどこを改善すればいいかを確認したい。

Lighthouseとは
Chrome DevTools に統合されているオープンソースのサイト分析ツールです。

https://github.com/GoogleChrome/lighthouse

開発者ツールを立ち上げましょう。

最初は「Elements」が表示されていますが、「Lighthouse」タブを選択します。



下記のことを設定します。

Categories：どの指標で評価をするか。
Device: どのデバイスでの評価を受けるか。
Publisher Ads: コンテンツ内の広告に関する評価をするか。こちらはまだβ版の様子。

「Generate report」を押下すると処理が始まりますので、待ちましょう。



レポートが出来上がると、下記のような画面になります。



簡素なサイトなのでもっと評価高いかと思っていたのですが、まだまだでした・・・

SEO は100点なので嬉しい！ですが、コンテ]]></description><link>https://tech.anti-pattern.co.jp/using-lighthouse/</link><guid isPermaLink="false">Ghost__Post__61014e3e3986b000013a40c9</guid><category><![CDATA[GoogleChrome]]></category><category><![CDATA[Lighthouse]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 13 Oct 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/using-lighthouse-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">やりたいこと</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/using-lighthouse-1-1.png" alt="Google ChromeのLighthouseを使ってWebサイトの評価を確認する"/><p>こんにちは。オザサです。</p>
<p>自社サイトを最適化してユーザーのエクスペリエンスを向上させたい。</p>
<p>ので、まずはどこを改善すればいいかを確認したい。</p>
<h2 id="lighthouse%E3%81%A8%E3%81%AF">Lighthouseとは</h2>
<p>Chrome DevTools に統合されているオープンソースのサイト分析ツールです。</p>
<p><a href="https://github.com/GoogleChrome/lighthouse">https://github.com/GoogleChrome/lighthouse</a></p>
<p>開発者ツールを立ち上げましょう。</p>
<p>最初は「Elements」が表示されていますが、「Lighthouse」タブを選択します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/using-lighthouse-1.png" alt="Google ChromeのLighthouseを使ってWebサイトの評価を確認する" loading="lazy"/></p>
<p>下記のことを設定します。</p>
<p>Categories：どの指標で評価をするか。<br>
Device: どのデバイスでの評価を受けるか。<br>
Publisher Ads: コンテンツ内の広告に関する評価をするか。こちらはまだβ版の様子。</br></br></p>
<p>「Generate report」を押下すると処理が始まりますので、待ちましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/using-lighthouse-2.png" alt="Google ChromeのLighthouseを使ってWebサイトの評価を確認する" loading="lazy"/></p>
<p>レポートが出来上がると、下記のような画面になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/using-lighthouse-3.png" alt="Google ChromeのLighthouseを使ってWebサイトの評価を確認する" loading="lazy"/></p>
<p>簡素なサイトなのでもっと評価高いかと思っていたのですが、まだまだでした・・・</p>
<p>SEO は100点なので嬉しい！ですが、コンテンツはほとんどないので効果は薄いです・・・</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/using-lighthouse-4.png" alt="Google ChromeのLighthouseを使ってWebサイトの評価を確認する" loading="lazy"/></p>
<p>それぞれの項目をクリックすると詳細な評価を確認することができます。評価は減点方式な感じで行われるのであまり褒めてはいただけません。</p>
<p>試しにReduce the impact of third-party codeをみてみると、<br>
FontAwesome CDN / Google Tag Managerなどの第三者サイトから取得しているものが最適化の余地がありそうです。</br></p>
<blockquote>
<p>Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading.</p>
</blockquote>
<p>上記のようなアドバイスも表示されていました。<br>
・そもそも不要なものは呼び出さない<br>
・今はhead内で当該リソースを呼び出しているので、例えばbody直下に置くとか<br>
などの対応をすることでこの項目は改善できそうな気がします。</br></br></br></p>
<p>サイト改善には地道な作業が必要そうですが、実直に対応したいと思います。</p>
<p>サイトリニューアルの予定があるので、今のサイトに対しては何もしないとしても！</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[BIG-IPのiRulesのデバッグ！]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

アプリケーション開発をする時に、ちょっとしたデバッグログ出すじゃないですか。
・System.out.println
・fmt.Println
・echo
JavaScriptだとこういうのも使いますよね
・console.log

今回のブログは、iRulesをデバッグするめにsyslogに出力した時のメモです。

F5のサポートページを確認するとファシリティと、出力されるファイルが記載されてます。
https://support.f5.com/csp/article/K13317

> Facility : local0
Description : BIG-IP specific messages**
Default log file : /var/log/ltm**


local0を指定すれば、/var/log/ltmに出力されそうです。

因みに、実機でsyslog-ngの設定値の確認をする場合は、こちら。

cat /etc/syslog-ng/syslog-ng.conf

BIG-IPに関連する設定のみの場合は、こちら]]></description><link>https://tech.anti-pattern.co.jp/big-ipnoirulesnodebatugu/</link><guid isPermaLink="false">Ghost__Post__610e28fa3986b000013a549c</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Wed, 30 Sep 2020 06:34:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-6.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-6.jpg" alt="BIG-IPのiRulesのデバッグ！"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>アプリケーション開発をする時に、ちょっとしたデバッグログ出すじゃないですか。<br>
・System.out.println<br>
・fmt.Println<br>
・echo<br>
JavaScriptだとこういうのも使いますよね<br>
・console.log</br></br></br></br></br></p>
<p>今回のブログは、iRulesをデバッグするめにsyslogに出力した時のメモです。</p>
<p>F5のサポートページを確認するとファシリティと、出力されるファイルが記載されてます。<br>
<a href="https://support.f5.com/csp/article/K13317">https://support.f5.com/csp/article/K13317</a></br></p>
<blockquote>
<p><strong>Facility : local0<br>
Description :</br></strong> BIG-IP specific messages**<br>
Default log file : /var/log/ltm**</br></p>
</blockquote>
<p>local0を指定すれば、/var/log/ltmに出力されそうです。</p>
<p>因みに、実機でsyslog-ngの設定値の確認をする場合は、こちら。</p>
<p>cat /etc/syslog-ng/syslog-ng.conf</p>
<p>BIG-IPに関連する設定のみの場合は、こちらでも確認できます。</p>
<p>tmsh<br>
list /sys syslog all-properties</br></p>
<p>簡単なiRuleでリクエスト情報を出力してみます。</p>
<pre><code>when HTTP\_REQUEST {  
 log local0. &quot;before HTTP Location header : [HTTP::request]&quot;  
}
</code></pre>
<p>/var/log/ltmを確認してみます。</p>
<pre><code>Sep 30 16:50:56 ******* info tmm[20054]: Rule /Common/test-rule &lt;HTTP_REQUEST&gt;: before HTTP Location header : GET /sample HTTP/1.1 Host: test.com Connection: keep-alive Accept: application/json, text/plain, */* Pragma: no-cache Cache-Control: no-cache X-UserToken: 3d0d86f16fe714d0564f97e2031f4e311ce73a31330698ea0f801d70a37142bc5b4e70af X-WantSessionNotificationMessages: true User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://sample.com/test Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8 Cookie: _kyp=QEkQBZnKabCTI10FFKHHMBBe+mWNsYJcDsdTcBmoGnKW5lMQKRxglwOx1NkwbQO2MS6bdqboScIS_.ntt.com; _ga=GA1.2.1475955449.1594129652; _a1_f=c1c7dafd-7a86–4c7c-8d4f-a573ff3079a2; _a1_u=6643ba4
</code></pre>
<p>出力されてます。</p>
<p>これで手がかりは掴めそうなので、デバックするぞ！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Terraformでモジュール化する]]></title><description><![CDATA[Photo by Fatos Bytyqi
[https://unsplash.com/@fatosi?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
最近勉強中のTerraform(v0.13.2)の、モジュール化についてブログを書きます。
AWSのリソースにポリシーを適用したIAMロールをアタッチする場合には以下のような要素を定義する必要があります

・IAM role
・IAM Policy
・IAM Policy document
・信頼ポリシー
・IAM Policy attachment

IAM Roleの定義のように、毎回似たような記述を繰り返すのは大変なので、共通化できる部分をモジュール化すると便利です。

モジュール化前
module化する前のコードです
ファイル名は任意で、好きな名前を設定可能です。]]></description><link>https://tech.anti-pattern.co.jp/terraform_module/</link><guid isPermaLink="false">Ghost__Post__61050d163986b000013a495c</guid><category><![CDATA[AWS]]></category><category><![CDATA[Terraform]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Fri, 25 Sep 2020 09:24:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="Terraformでモジュール化する" loading="lazy" width="5184" height="3456" srcset="https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 720px) 720px"><figcaption>Photo by <a href="https://unsplash.com/@fatosi?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Fatos Bytyqi</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><img src="https://images.unsplash.com/photo-1517148815978-75f6acaaf32c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDUwfHxwcm9ncmFtbWVyfGVufDB8fHx8MTYyNzcyMTA1MQ&ixlib=rb-1.2.1&q=80&w=2000" alt="Terraformでモジュール化する"/><p>最近勉強中のTerraform(v0.13.2)の、モジュール化についてブログを書きます。<br>AWSのリソースにポリシーを適用したIAMロールをアタッチする場合には以下のような要素を定義する必要があります</br></p><p>・IAM role<br>・IAM Policy<br>・IAM Policy document<br>・信頼ポリシー<br>・IAM Policy attachment</br></br></br></br></p><p>IAM Roleの定義のように、毎回似たような記述を繰り返すのは大変なので、共通化できる部分をモジュール化すると便利です。</p><h2 id="%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%8C%96%E5%89%8D">モジュール化前</h2><p>module化する前のコードです<br>ファイル名は任意で、好きな名前を設定可能です。<br>また、リソースごとにファイルを分けるなどしてもOKです。</br></br></p><!--kg-card-begin: markdown--><pre><code># iam_role
resource &quot;aws_iam_role&quot; &quot;example&quot; {
    name        = &quot;ezample&quot;
    assume_role_policy = data.aws_iam_policy_document.ec2_assume_role.json
}

# iam_policy
resource &quot;aws_iam_policy&quot; &quot;example&quot; {
    name    = &quot;example&quot;
    policy  = data.aws_iam_policy_document.allow_describe_regions.json
}

# policy_doc_ec2_assume_role
data &quot;aws_iam_policy_document&quot; &quot;ec2_assume_role&quot; {
    statement {
        actions = [&quot;sts:AssumeRole&quot;]

        principals {
            type        = &quot;Service&quot;
            identifiers = [&quot;ec2.amazonaws.com&quot;]
        }
    }
}

# policy_doc_allow_describe_regions
data &quot;aws_iam_policy_document&quot; &quot;allow_describe_regions&quot; {
    statement {
        effect    = &quot;Allow&quot;
        actions   = [&quot;ec2:DescribeRegions&quot;]#リージョン一覧を取得する
        resources = [&quot;*&quot;]
    }
}

# iam_role_policy_attachment
resource &quot;aws_iam_role_policy_attachment&quot; &quot;example&quot; {
    role       = aws_iam_role.example.name
    policy_arn = aws_iam_policy.example.arn
}
</code></pre>
<!--kg-card-end: markdown--><p>IAMロールを定義するたびにこの全てを記述するのは大変です</p><h2 id="%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%8C%96%E5%BE%8C">モジュール化後</h2><p>モジュール化したいファイルは以下のようなディレクトリ構成にします<br>iam_roleというディレクトリを作成します。</br></p><p>┝main.tf #moduleを利用するファイル<br>└iam_role/<br>└iam_role.tf #moduleを定義するファイル</br></br></p><p>iam_role/iam_role.tfはこのように記述します</p><!--kg-card-begin: markdown--><pre><code>variable &quot;name&quot; {}
variable &quot;policy&quot; {}
variable &quot;identifier&quot; {}

resource &quot;aws_iam_role&quot; &quot;default&quot; {
    name = var.name
    assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

data &quot;aws_iam_policy_document&quot; &quot;assume_role&quot; {
    statement {
        actions = [&quot;sts:AssumeRole&quot;]

        principals {
            type        = &quot;Service&quot;
            identifiers = [var.identifier]
        }
    }
}

resource &quot;aws_iam_policy&quot; &quot;default&quot; {
    name   = var.name
    policy = var.policy
}

resource &quot;aws_iam_role_policy_attachment&quot; &quot;default&quot; {
    role       = aws_iam_role.default.name
    policy_arn = aws_iam_policy.default.arn
}

output &quot;iam_role_arn&quot; {
    value = aws_iam_role.default.arn
}

output &quot;iam_role_name&quot; {
    value = aws_iam_role.default.name
}
</code></pre>
<!--kg-card-end: markdown--><p>1-3行目<br>後から代入したい値はvariableで変数として宣言して初期値は空欄にしておきます</br></p><p>moduleを利用するmain.tfはこのように記述します</p><!--kg-card-begin: markdown--><pre><code>module &quot;describe_region_for_ec2&quot; {
    source     = &quot;./iam_role&quot;
    name       = &quot;describe-region-for-ec2&quot;
    identifier = &quot;ec2.amazonaws.com&quot;
    policy     = data.aws_iam_policy_document.allow_describe_regions.json
}

data &quot;aws_iam_policy_document&quot; &quot;allow_describe_regions&quot; {
    statement {
        effect    = &quot;Allow&quot;
        actions   = [&quot;ec2:DescribeRegions&quot;]#リージョン一覧を取得する
        resources = [&quot;*&quot;]
    }
}
</code></pre>
<!--kg-card-end: markdown--><p>1行目<br>moduleと宣言します<br>2行目~<br>sourceでmoduleがどこのディレクトリにあるかを指定し、変数に代入したい値を定義していきます</br></br></br></p><p>このように、何度も利用する部分は切り出して、モジュール化すると便利です</p><p>参考文献：<br>野村友規 <a href="https://www.amazon.co.jp/dp/B07XT7LJLC/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1" rel="noopener nofollow">実践Terraform AWSにおけるシステム設計とベストプラクティス</a></br></p>]]></content:encoded></item><item><title><![CDATA[PDFファイルを分割したり結合したりしたい！（Mac）]]></title><description><![CDATA[会社でよく書類をスキャンしてPDFファイルにするのですが、コロナの給付金のオンライン申請をする時に「あれ？別々でスキャンしちゃったけど1ファイルでアップロードするのか〜」とか「1ファイルにまとめちゃったけど別々でアップロードだったか…」となった事がありました。

その時はすぐスキャン出来る環境だったので、スキャンし直して対処してしまったのですが、またこういう事があった時用にPDFファイルを分けたりまとめたり出来たら良いな〜と思い調べたところ、MacのPDFプレビュー画面でとっても簡単に出来たのでご紹介いたします！

PDFを分割したい時
「ABってまとめちゃったけど、AだけのPDFが欲しいなぁ」
って思ったら、Aを選択してそのままデスクトップにポイ！



「ABCってまとめちゃったけど、BCだけのPDFが欲しいなぁ」
って思ったら、BCを選択してさっきと同じようにデスクトップにポイ！



この様にPDFをプレビュー画面で開き独立させたいページを選択したら、ドラッグ＆ドロップでデスクトップなどに移動させるだけで、とても簡単にPDFファイルの分割が出来ます！

ただ分割と言っても元のP]]></description><link>https://tech.anti-pattern.co.jp/pdf-split-join-mac/</link><guid isPermaLink="false">Ghost__Post__61014dbc3986b000013a40b8</guid><category><![CDATA[pdf]]></category><category><![CDATA[mac]]></category><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Thu, 24 Sep 2020 12:30:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>会社でよく書類をスキャンしてPDFファイルにするのですが、コロナの給付金のオンライン申請をする時に「あれ？別々でスキャンしちゃったけど1ファイルでアップロードするのか〜」とか「1ファイルにまとめちゃったけど別々でアップロードだったか…」となった事がありました。</p>
<p>その時はすぐスキャン出来る環境だったので、スキャンし直して対処してしまったのですが、またこういう事があった時用にPDFファイルを分けたりまとめたり出来たら良いな〜と思い調べたところ、MacのPDFプレビュー画面でとっても簡単に出来たのでご紹介いたします！</p>
<h2 id="pdf%E3%82%92%E5%88%86%E5%89%B2%E3%81%97%E3%81%9F%E3%81%84%E6%99%82">PDFを分割したい時</h2>
<p>「ABってまとめちゃったけど、AだけのPDFが欲しいなぁ」<br>
って思ったら、Aを選択してそのままデスクトップにポイ！</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-1.png" alt="pdf-1" loading="lazy"/></p>
<p>「ABCってまとめちゃったけど、BCだけのPDFが欲しいなぁ」<br>
って思ったら、BCを選択してさっきと同じようにデスクトップにポイ！</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-2.png" alt="pdf-2" loading="lazy"/></p>
<p>この様にPDFをプレビュー画面で開き独立させたいページを選択したら、ドラッグ＆ドロップでデスクトップなどに移動させるだけで、とても簡単にPDFファイルの分割が出来ます！</p>
<p>ただ分割と言っても元のPDFファイルから独立させた(コピーした)ページが消える訳ではないので、別ファイルに分けたあと不要なページがあれば、選択して削除してしまいましょう！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-3.png" alt="pdf-3" loading="lazy"/></p>
<h2 id="pdf%E3%82%92%E7%B5%90%E5%90%88%E3%81%97%E3%81%9F%E3%81%84%E6%99%82">PDFを結合したい時</h2>
<p>次は別々のPDFファイルを1つにまとめたい時です！<br>
まず結合したいファイルの内、片方のPDFを開き「サイドバーを非表示」になってる場合は「サムネール」をクリックして表示させましょう。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-4.png" alt="pdf-4" loading="lazy"/></p>
<p>「AとPを別々のファイルにしちゃったけどAPまとまったPDFが良いなぁ」と思ったら、A.pdfのサムネールにP.pdfをドラッグ＆ドロップ！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-5.png" alt="pdf-5" loading="lazy"/></p>
<p>これで、A.pdfはAとPの2ページが結合したPDFファイルになりました！<br>
※P単独のP.pdfはデスクトップに残ります(不要でしたら削除しましょう)</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/pdf-6.png" alt="pdf-6" loading="lazy"/></p>
<p>こんな感じで、ファイルをくっつけたり、分けたり、消したり、あと今回は書いてないですがページの順番を変えるのもプレビュー画面のサムネール上で自由に出来たので、今後はこの方法を活用したいと思います！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Bootstrapの機能を使っていい感じに文章を改行するTips]]></title><description><![CDATA[こんにちは。オザサです。
みなさま、サイトを作る時には何を使っていますか？

やはりレスポンシブなサイトを作るとなると、Bootstrapを使う機会も多いのではないでしょうか？

今回はBootstrap(4.1)の機能を活用したTipsを共有します。

解決したい課題
大きめな画面だと改行がいい感じになっているけど、スマホなどの画面だとちょっと改行が不自然なんてことありますよね。

解決方法
BootstrapのDisplay propertyを活用すると解決が可能です。

Display propertyはclassに付記することで使用できます。実際には下記のような記述をします。

.d-{breakpoint}-{value} for sm, md, lg, and xl.


https://getbootstrap.com/docs/4.1/utilities/display/

なお、Bootstrap4.1におけるbreakpointは下記のようになっています。

// Extra small devices (portrait phones, less than 576]]></description><link>https://tech.anti-pattern.co.jp/tips-on-how-to-use-bootstrap-features-to-create-nice-line-breaks-in-your-text/</link><guid isPermaLink="false">Ghost__Post__61014d2d3986b000013a40b0</guid><category><![CDATA[Bootstrap]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 22 Sep 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/tips-on-how-to-use-bootstrap-features-to-create-nice-line-breaks-in-your-text-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/tips-on-how-to-use-bootstrap-features-to-create-nice-line-breaks-in-your-text-1-1.png" alt="Bootstrapの機能を使っていい感じに文章を改行するTips"/><p>こんにちは。オザサです。<br>
みなさま、サイトを作る時には何を使っていますか？</br></p>
<p>やはりレスポンシブなサイトを作るとなると、Bootstrapを使う機会も多いのではないでしょうか？</p>
<p>今回はBootstrap(4.1)の機能を活用したTipsを共有します。</p>
<h2 id="%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C">解決したい課題</h2>
<p>大きめな画面だと改行がいい感じになっているけど、スマホなどの画面だとちょっと改行が不自然なんてことありますよね。</p>
<h2 id="%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95">解決方法</h2>
<p>BootstrapのDisplay propertyを活用すると解決が可能です。</p>
<p>Display propertyはclassに付記することで使用できます。実際には下記のような記述をします。</p>
<pre><code>.d-{breakpoint}-{value} for sm, md, lg, and xl.
</code></pre>
<p><a href="https://getbootstrap.com/docs/4.1/utilities/display/">https://getbootstrap.com/docs/4.1/utilities/display/</a></p>
<p>なお、Bootstrap4.1におけるbreakpointは下記のようになっています。</p>
<pre><code>// Extra small devices (portrait phones, less than 576px)  
// No media query for \`xs\` since this is the default in Bootstrap// Small devices (landscape phones, 576px and up)  
[@media](http://twitter.com/media) (min-width: 576px) { ... }// Medium devices (tablets, 768px and up)  
[@media](http://twitter.com/media) (min-width: 768px) { ... }// Large devices (desktops, 992px and up)  
[@media](http://twitter.com/media) (min-width: 992px) { ... }// Extra large devices (large desktops, 1200px and up)  
[@media](http://twitter.com/media) (min-width: 1200px) { ... }
</code></pre>
<p><a href="https://getbootstrap.com/docs/4.1/layout/overview/#responsive-breakpoints">https://getbootstrap.com/docs/4.1/layout/overview/#responsive-breakpoints</a></p>
<p>今回はスマホサイズのdisplayの時に改行したいので、「smの時のみbrタグが表示される」と表現できます。</p>
<pre><code>&lt;h1&gt;ほにゃらら&lt;br class=&quot;d-none d-sm-block&quot;&gt;ほにゃらら&lt;/h1&gt;
</code></pre>
<p>ん〜、いい感じ。CSSをいじったりしないで記述できるのでスッキリするし読みやすいですね！</p>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>Bootstrapのようなコンポーネントライブラリを使う時にはそもそも何ができるのか事前にある程度把握しておくと、真価を発揮できるようになるのでいいと思います！</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[LaravelでModelをコピーする]]></title><description><![CDATA[こんにちは、いわむらです

今回はLaravelのmodelのコピーする方法について解説していきます

検証環境は、

・PHP 7.2

・Laravel 5.8

でやっていきます

イメージとしてはTodoを作成して同じTodoを複製する感じの処理です

テーブルの構成はこんな感じです

Schema::create(‘todos’, function (Blueprint $table) {
	$table->increments(‘id’);
	$table->string(‘title’);
	$table->string(‘description’);
	$table->date(‘expired’);
	$table->timestamps();
});

ではTodoを一つ作成してみましょう

上のコードでTodoが作成できたかと思います

このTodoをコピーする方法がEloquentのModel.phpに定義してある

replicate関数を使うとすごく簡単にできます。

$todo = Todo::find(1);
$newTodo = $todo->repl]]></description><link>https://tech.anti-pattern.co.jp/laraveldemodelwokopisuru/</link><guid isPermaLink="false">Ghost__Post__61041e823986b000013a4674</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Mon, 14 Sep 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回はLaravelのmodelのコピーする方法について解説していきます</p><p>検証環境は、</p><p>・PHP 7.2</p><p>・Laravel 5.8</p><p>でやっていきます</p><p>イメージとしてはTodoを作成して同じTodoを複製する感じの処理です</p><p>テーブルの構成はこんな感じです</p><pre><code>Schema::create(‘todos’, function (Blueprint $table) {
	$table-&gt;increments(‘id’);
	$table-&gt;string(‘title’);
	$table-&gt;string(‘description’);
	$table-&gt;date(‘expired’);
	$table-&gt;timestamps();
});</code></pre><p>ではTodoを一つ作成してみましょう</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*vhb8tl4FkUgXQGQrHrq2YA.png" class="kg-image" alt="" loading="lazy"/></figure><p>上のコードでTodoが作成できたかと思います</p><p>このTodoをコピーする方法がEloquentのModel.phpに定義してある</p><p>replicate関数を使うとすごく簡単にできます。</p><pre><code>$todo = Todo::find(1);
$newTodo = $todo-&gt;replicate();</code></pre><p>対象のモデルを取得してそのモデルでreplicateを実行するだけです！</p><p>このときにコピーされる内容は、</p><p>・primary key</p><p>・ created_at</p><p>・ updated_at</p><p>の3つを除くすべてのカラムがコピーされます</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*Ei1wCoBLaBHy_Byy5Wi0Yg.png" class="kg-image" alt="" loading="lazy"/></figure><p>コピーされるとこんな感じです</p><p>ここまではまだ new Todo()してattributeをセットしているだけなので、</p><p>まだレコードはできていません</p><p>なのでコピーした$newTodoのレコードを保存するためにはsaveまで実行してください</p><p>ここまででmodelの複製が完了しfind()などで実際にDBからもってくることができます</p><p>おまけ</p><p>このreplicate関数は引数でコピーしないカラムを指定することができます</p><p>最後にそこの部分のコードを記述して終わりにしたいと思います</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*3mZygzTp3gaddvppkkB-FA.png" class="kg-image" alt="" loading="lazy"/></figure><p>replicateにArrayでコピーしたくないカラムを渡してあげれば、</p><p>コピーする項目を指定することができます</p><p>以上、LaravelのModelの複製方法のご紹介でした</p>]]></content:encoded></item><item><title><![CDATA[Cloud Firestoreのデータをスプレッドシートに出力してみた その①]]></title><description><![CDATA[Anti-Pattern こおりやまです

今回、Cloud Firestoreを利用したのですが、ドキュメント情報全て同時に確認したかったので、Google Apps
Scriptを利用してスプレッドシートに出力してみました。

スプレッドシートを作成しスクリプトを追加、Cloud Firestoreのライブラリを追加します。
「リソース」->「ライブラリ」を開き以下ライブラリを追加します。
1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw
(grahamearley [https://github.com/grahamearley/FirestoreGoogleAppsScript])



では、コードを書いていきます。
描いたコードはこんな感じです。。。

function myFunction() {

  const email = “メールアドレス”;  
 const key = “ダウンロードしたキー情報”;  
 const projectId = “プロジェクト情報”;

  const root\]]></description><link>https://tech.anti-pattern.co.jp/cloud-firestorenodetawosupuretudositonichu-li-sitemita-sono/</link><guid isPermaLink="false">Ghost__Post__610b6d733986b000013a5207</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Mon, 31 Aug 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Anti-Pattern こおりやまです</p>
<p>今回、Cloud Firestoreを利用したのですが、ドキュメント情報全て同時に確認したかったので、Google Apps Scriptを利用してスプレッドシートに出力してみました。</p>
<p>スプレッドシートを作成しスクリプトを追加、Cloud Firestoreのライブラリを追加します。<br>
「リソース」-&gt;「ライブラリ」を開き以下ライブラリを追加します。<br>
<code>1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw</code><br>
(<a href="https://github.com/grahamearley/FirestoreGoogleAppsScript">grahamearley</a>)</br></br></br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_q3R375i13PURgm23pi7cWQ.png" alt="1_q3R375i13PURgm23pi7cWQ" loading="lazy"/></p>
<p>では、コードを書いていきます。<br>
描いたコードはこんな感じです。。。</br></p>
<pre><code>function myFunction() {

  const email = “メールアドレス”;  
 const key = “ダウンロードしたキー情報”;  
 const projectId = “プロジェクト情報”;

  const root\_path = “/(default)/documents/”

 const firestore = FirestoreApp.getFirestore(email, key, projectId);  
 const sheet = SpreadsheetApp.getActiveSheet();

  const allDocuments = firestore.getDocuments(“test”);

  const headerlist = \[‘\_document\_path’\];  
 sheet.getRange(1, 1).setValue(‘\_document\_path’)

  // Logger.log(allDocuments);  
 // データの出力位置  
 let iRow = 2 // 取得した配列を繰り返す（ドキュメント）  
 allDocuments.forEach(function(rec){

  // パスからホームを削除して出力する  
 sheet.getRange(iRow, 1).setValue(rec.name.substring(rec.name.lastIndexOf(root\_path) + root\_path.length))// Keys（キー名をソートして取得）  
 Object.getOwnPropertyNames(rec.fields).sort().forEach(function(key){

  // 見出し出力（レコードによりフィールドが異なる可能性があるためヘッダー配列に存在する項目かチェック）  
 let iCol = headerlist.indexOf(key) + 1  
 if (iCol === 0){  
 // 見出しが存在しない場合、新しい項目を最後に追加  
 headerlist.push(key)  
 iCol = headerlist.length  
 sheet.getRange(1, iCol).setValue(key)  
 }

  // Value  
 sheet.getRange(iRow, iCol).setValue(JSON.stringify(rec.fields\[key\]));  
 ++iCol;  
 });  
 ++iRow;  
 });  
}
</code></pre>
<p>Cloud Firestore に接続<br>
メールアドレス、セキュリティキー、プロジェクトIDを定義 し <code>FirestoreApp.getFirestore</code>で接続します。</br></p>
<pre><code>const email = “メールアドレス”;  
const key = “ダウンロードしたキー情報”;  
const projectId = “プロジェクト情報”;

const firestore = FirestoreApp.getFirestore(email, key, projectId);
</code></pre>
<p>ドキュメントの一覧取得</p>
<pre><code>const allDocuments = firestore.getDocuments(“test”);
</code></pre>
<p>このコードで <code>test</code> 以下のドキュメント情報が配列で取得できます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_236mavuW1_nCkrvzEdUe3g.png" alt="1_236mavuW1_nCkrvzEdUe3g" loading="lazy"/></p>
<p>ドキュメントのフィールド情報取得<br>
JSON形式なので、キー名でソートして取得します</br></p>
<pre><code>Object.getOwnPropertyNames(rec.fields).sort().forEach(function(key){
</code></pre>
<p>あとは、取得したドキュメント情報をスプレッドに出力します。<br>
Firestoreはドキュメント毎にフィールド、タイプが異なるので一覧表示する場合、同じフィールド名を意識しながら一覧にして出力しています。<br>
また、新しいフィールドは順次後方に追加して出力しています。</br></br></p>
<p>結果はこちらです</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_lc58SAe31ujYI5C1q6k5hA.png" alt="1_lc58SAe31ujYI5C1q6k5hA" loading="lazy"/></p>
<p>１件目は <code>test4</code>があり、２件目は <code>test5</code>があり、差分として表示されているのが分かりますね。</p>
<p>今回は、ここまで</p>
<p>ドキュメント情報しか取得できていないので、次回はコレクションを取得して出力したいとおもいます。</p>
<p>また、スプレット出力は１セルずつ出力し、性能的に問題あるのでその点を改善していきたいと思います。</p>
<p>ではでは</p>
<p>参考<br>
<a href="https://github.com/grahamearley/FirestoreGoogleAppsScript">https://github.com/grahamearley/FirestoreGoogleAppsScript</a></br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Rustでstruct - mapの相互変換をするための derive macroを実装した]]></title><description><![CDATA[structとmapの相互変換
任意のstructをHashMapに変換する必要があったのでderive macroで実装しました。

できたものは以下になります。

GitHub - yutakahashi114/rust-map-macroContribute to
yutakahashi114/rust-map-macro development by creating an account on GitHub.
GitHubyutakahashi114 [https://github.com/yutakahashi114/rust-map-macro]
Rustにはreflectionがない
Rustは構造体からmap(HashMap)へ変換するための機能がないらしいです。

例えばGolangでは以下のように reflect パッケージを使うと実装できます。

Go言語でstructからmapへ変換 - Qiita構造体のフィールド一覧を取得したくなったので、reflectを使って実装。
struct2map.gopackage main import ( “fmt” “re]]></description><link>https://tech.anti-pattern.co.jp/rust-struct-map/</link><guid isPermaLink="false">Ghost__Post__6103de383986b000013a4423</guid><category><![CDATA[Rust]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sun, 23 Aug 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="struct%E3%81%A8map%E3%81%AE%E7%9B%B8%E4%BA%92%E5%A4%89%E6%8F%9B">structとmapの相互変換</h2>
<p>任意のstructを<code>HashMap</code>に変換する必要があったのでderive macroで実装しました。</p>
<p>できたものは以下になります。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yutakahashi114/rust-map-macro"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yutakahashi114/rust-map-macro</div><div class="kg-bookmark-description">Contribute to yutakahashi114/rust-map-macro development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yutakahashi114</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/a48a6f17b4f6d6eaf81b7f7514c1841725292beb76223a89f0ba1a0b2e906a02/yutakahashi114/rust-map-macro"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="rust%E3%81%AB%E3%81%AFreflection%E3%81%8C%E3%81%AA%E3%81%84">Rustにはreflectionがない</h2>
<p>Rustは構造体からmap(<code>HashMap</code>)へ変換するための機能がないらしいです。</p>
<p>例えばGolangでは以下のように <code>reflect</code> パッケージを使うと実装できます。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/hnaohiro/items/1f021fa5e703b5a530cf"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Go言語でstructからmapへ変換 - Qiita</div><div class="kg-bookmark-description">構造体のフィールド一覧を取得したくなったので、reflectを使って実装。 struct2map.gopackage main import ( “fmt” “reflect”) func StructToMap(...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">hnaohiro</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1SMl9vcUlEb3FwN2pnYWR6ZEhKMVkzVGpnWXZqZ29sdFlYRGpnYmpscElubWo1cyZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz05YjNjZmYyNDVkMjEzNGRiMmE4MmM3ZmY4OWE2NTUyYg&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RR2h1WVc5b2FYSnYmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT00NSZ0eHQtYWxpZ249cmlnaHQlMkNib3R0b20mcz1jNTVmMzdjZDUzZWI4NjU1YWM0ZDViNmNjMzNlZjJiMQ&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;07b97ec56d4862b60c8c674852a83fff"/></div></a></figure><!--kg-card-begin: markdown--><p>Rustにはreflectionの機能がないみたいです。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://doc.rust-jp.rs/book/second-edition/appendix-04-macros.html#a%E7%8B%AC%E8%87%AA%E3%81%AEderive%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%AB%E3%83%9E%E3%82%AF%E3%83%AD"><div class="kg-bookmark-content"><div class="kg-bookmark-title">D - マクロ - The Rust Programming Language</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://doc.rust-jp.rs/book/second-edition/favicon.png"><span class="kg-bookmark-author">The Rust Programming Language</span></img></div></div></a></figure><!--kg-card-begin: markdown--><blockquote>
<p>注釈: リフレクションとは、実行時に型名や関数の中身などを取得する機能のことです。 言語によって提供されていたりいなかったりしますが、実行時にメタデータがないと取得できないので、 RustやC++のようなアセンブリコードに翻訳され、パフォーマンスを要求される高級言語では、提供されないのが一般的と思われます。</p>
</blockquote>
<p>調べてみると、構造体・mapからjsonへの変換や、jsonから構造体・mapへの変換ができるライブラリはありました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/serde-rs/serde"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - serde-rs/serde: Serialization framework for Rust</div><div class="kg-bookmark-description">Serialization framework for Rust. Contribute to serde-rs/serde development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">serde-rs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b9694c456a05e715a860e4eb3c2cff2ac164e67ffab236e3e303a387ec55f289/serde-rs/serde"/></div></a></figure><!--kg-card-begin: markdown--><p>このライブラリを使うと以下のように構造体からmapへ変換できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/deb3a0ced497fb783bbc6ca993326dcb.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105004590" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-rust-map-macro-serde" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-rust-map-macro-serde-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-rust-map-macro-serde-LC1" class="blob-code blob-code-inner js-file-line">extern crate rust_map_macro;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-rust-map-macro-serde-LC2" class="blob-code blob-code-inner js-file-line">use serde::{Deserialize, Serialize};</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-rust-map-macro-serde-LC3" class="blob-code blob-code-inner js-file-line">use serde_json::{Map, Value};</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-rust-map-macro-serde-LC4" class="blob-code blob-code-inner js-file-line">use std::collections::HashMap;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-rust-map-macro-serde-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-rust-map-macro-serde-LC6" class="blob-code blob-code-inner js-file-line">fn main() {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-rust-map-macro-serde-LC7" class="blob-code blob-code-inner js-file-line">    let test = Test {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-rust-map-macro-serde-LC8" class="blob-code blob-code-inner js-file-line">        null: None,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-rust-map-macro-serde-LC9" class="blob-code blob-code-inner js-file-line">        boolean: true,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-rust-map-macro-serde-LC10" class="blob-code blob-code-inner js-file-line">        int: 1234,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-rust-map-macro-serde-LC11" class="blob-code blob-code-inner js-file-line">        float: 56.78,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-rust-map-macro-serde-LC12" class="blob-code blob-code-inner js-file-line">        string: &quot;str&quot;.to_string(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-rust-map-macro-serde-LC13" class="blob-code blob-code-inner js-file-line">        array: vec![&quot;array1&quot;.to_string(), &quot;array2&quot;.to_string()],</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-rust-map-macro-serde-LC14" class="blob-code blob-code-inner js-file-line">        map: vec![(&quot;seconds&quot;.to_string(), 1234), (&quot;nanos&quot;.to_string(), 5678)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-rust-map-macro-serde-LC15" class="blob-code blob-code-inner js-file-line">            .into_iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-rust-map-macro-serde-LC16" class="blob-code blob-code-inner js-file-line">            .collect(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-rust-map-macro-serde-LC17" class="blob-code blob-code-inner js-file-line">        time: Time {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-rust-map-macro-serde-LC18" class="blob-code blob-code-inner js-file-line">            seconds: 1234,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-rust-map-macro-serde-LC19" class="blob-code blob-code-inner js-file-line">            nanos: 5678,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-rust-map-macro-serde-LC20" class="blob-code blob-code-inner js-file-line">        },</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-rust-map-macro-serde-LC21" class="blob-code blob-code-inner js-file-line">    };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-rust-map-macro-serde-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-rust-map-macro-serde-LC23" class="blob-code blob-code-inner js-file-line">    let r = serde_json::to_string(&amp;test).unwrap();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-rust-map-macro-serde-LC24" class="blob-code blob-code-inner js-file-line">    let test_map: Map&lt;String, Value&gt; = serde_json::from_str(&amp;r).unwrap();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-rust-map-macro-serde-LC25" class="blob-code blob-code-inner js-file-line">    println!(&quot;map&quot;);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-rust-map-macro-serde-LC26" class="blob-code blob-code-inner js-file-line">    println!(&quot;{:?}&quot;, test_map);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-rust-map-macro-serde-LC27" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-rust-map-macro-serde-LC28" class="blob-code blob-code-inner js-file-line">    let r = serde_json::to_string(&amp;test_map).unwrap();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-rust-map-macro-serde-LC29" class="blob-code blob-code-inner js-file-line">    let test: Test = serde_json::from_str(&amp;r).unwrap();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-rust-map-macro-serde-LC30" class="blob-code blob-code-inner js-file-line">    println!(&quot;struct&quot;);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-rust-map-macro-serde-LC31" class="blob-code blob-code-inner js-file-line">    println!(&quot;{:?}&quot;, test);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-rust-map-macro-serde-LC32" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-rust-map-macro-serde-LC33" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-rust-map-macro-serde-LC34" class="blob-code blob-code-inner js-file-line">#[derive(Debug, Deserialize, Serialize)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-rust-map-macro-serde-LC35" class="blob-code blob-code-inner js-file-line">struct Test {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-rust-map-macro-serde-LC36" class="blob-code blob-code-inner js-file-line">    null: Option&lt;String&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-rust-map-macro-serde-LC37" class="blob-code blob-code-inner js-file-line">    boolean: bool,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-rust-map-macro-serde-LC38" class="blob-code blob-code-inner js-file-line">    int: i64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-rust-map-macro-serde-LC39" class="blob-code blob-code-inner js-file-line">    float: f64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-rust-map-macro-serde-LC40" class="blob-code blob-code-inner js-file-line">    string: String,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-rust-map-macro-serde-LC41" class="blob-code blob-code-inner js-file-line">    array: Vec&lt;String&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-rust-map-macro-serde-LC42" class="blob-code blob-code-inner js-file-line">    map: HashMap&lt;String, i64&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-rust-map-macro-serde-LC43" class="blob-code blob-code-inner js-file-line">    time: Time,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-rust-map-macro-serde-LC44" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-rust-map-macro-serde-LC45" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-rust-map-macro-serde-LC46" class="blob-code blob-code-inner js-file-line">#[derive(Debug, Deserialize, Serialize)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-rust-map-macro-serde-LC47" class="blob-code blob-code-inner js-file-line">pub struct Time {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-rust-map-macro-serde-LC48" class="blob-code blob-code-inner js-file-line">    pub seconds: i64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-rust-map-macro-serde-LC49" class="blob-code blob-code-inner js-file-line">    pub nanos: i32,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-serde-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-rust-map-macro-serde-LC50" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/deb3a0ced497fb783bbc6ca993326dcb/raw/176ceabb9b01242d77a677d946d6e68eae428cb6/rust-map-macro-serde" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/deb3a0ced497fb783bbc6ca993326dcb#file-rust-map-macro-serde">rust-map-macro-serde</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>map  
{&quot;array&quot;: Array([String(&quot;array1&quot;), String(&quot;array2&quot;)]), &quot;boolean&quot;: Bool(true), &quot;float&quot;: Number(56.78), &quot;int&quot;: Number(1234), &quot;map&quot;: Object({&quot;nanos&quot;: Number(5678), &quot;seconds&quot;: Number(1234)}), &quot;null&quot;: Null, &quot;string&quot;: String(&quot;str&quot;), &quot;time&quot;: Object({&quot;nanos&quot;: Number(5678), &quot;seconds&quot;: Number(1234)})}

struct  
Test { null: None, boolean: true, int: 1234, float: 56.78, string: &quot;str&quot;, array: [&quot;array1&quot;, &quot;array2&quot;], map: {&quot;nanos&quot;: 5678, &quot;seconds&quot;: 1234}, time: Time { seconds: 1234, nanos: 5678 } }
</code></pre>
<p>ただし、この方法を使った場合はjsonを経由するので余分な処理が走ります。また、fieldに構造体が入っていた場合、変換後はObjectになるので、mapと区別ができなくなります。</p>
<pre><code>...
&quot;map&quot;: Object({&quot;nanos&quot;: Number(5678), &quot;seconds&quot;: Number(1234)}),
...
&quot;time&quot;: Object({&quot;nanos&quot;: Number(5678), &quot;seconds&quot;: Number(1234)})
...
</code></pre>
<p>今回はmapの変換後に一部の型で変換前の型情報を持っておきたかったので、この方法は使えませんでした。</p>
<p>そこで、独自にderive macroを使って実装することにしました。</p>
<h2 id="derive-macro">derive macro</h2>
<p>Rustではmacroを使うことができます。簡単に言うと、RustでRustを書く、みたいな感じです。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://doc.rust-jp.rs/book/second-edition/appendix-04-macros.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">D - マクロ - The Rust Programming Language</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://doc.rust-jp.rs/book/second-edition/favicon.png"><span class="kg-bookmark-author">The Rust Programming Language</span></img></div></div></a></figure><!--kg-card-begin: markdown--><p>上で触れた<code>serde</code> でもmacroを使用しています。この<code>serde</code>を参考にmacroを実装しました。</p>
<h2 id="%E4%B8%8B%E6%BA%96%E5%82%99">下準備</h2>
<p>macroを書く前に、macro外でいくつか必要な処理を書いておきます。</p>
<pre><code>pub trait Mapper {  
    fn to_map(&amp;self) -&gt; HashMap&lt;String, FieldValue&gt;;  
    fn from_map(map: HashMap&lt;String, FieldValue&gt;) -&gt; Result&lt;Self&gt;  
    where  
        Self: std::marker::Sized;  
}

#[derive(Clone, Debug)]  
pub enum FieldValue {  
    Null,  
    Boolean(bool),  
    Integer(i64),  
    Double(f64),  
    String(String),  
    Time(Time),  
    Array(Vec&lt;FieldValue&gt;),  
    Map(HashMap&lt;String, FieldValue&gt;),  
}

#[derive(Clone, Debug)]  
pub struct Time {  
    pub seconds: i64,  
    pub nanos: i32,  
}
</code></pre>
<p><code>Mapper</code> は変換用のtraitです。このtraitが実装されている型は</p>
<p><code>to_map</code> ：構造体 =&gt;<code>HashMap&lt;String, FieldValue&gt;</code><br>
<code>from_map</code> ：<code>HashMap&lt;String, FieldValue&gt;</code> =&gt; 構造体</br></p>
<p>の変換ができるようになります。</p>
<p><code>FieldValue</code> はmap変換後のfieldの型になります。<code>Time</code>を<code>Time</code> として保持できるようにしています。</p>
<p>この<code>Mapper</code> をderive macroで任意の型に実装できるようにします。以下のように使うイメージです。</p>
<pre><code>#[derive(Mapper)]  
struct Test {  
    null: Option&lt;String&gt;,  
    boolean: bool,  
    int: i64,  
    float: f64,  
    string: String,  
    array: Vec&lt;String&gt;,  
    map: HashMap&lt;String, i64&gt;,  
    time: Time,  
}
</code></pre>
<p>型変換を全てmacroで実装するのは大変なので、型変換のためのtraitをmacro外で定義・実装しておきます。</p>
<pre><code>pub trait Converter: Sized {  
    fn to_field_value(&amp;self) -&gt; FieldValue;  
    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt;;  
}
</code></pre>
<p>例えば<code>String</code>には以下のように<code>Converter</code> を実装しておきます。</p>
<pre><code>impl Converter for String {  
    fn to_field_value(&amp;self) -&gt; FieldValue {  
        FieldValue::String(self.to_string())  
    }  
    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {  
        match fv {  
            FieldValue::String(value) =&gt; Ok(value),  
            _ =&gt; Err(anyhow!(&quot;invalid type: String&quot;)),  
        }  
    }  
}
</code></pre>
<p><code>Converter</code> のメソッドをmacroで呼ぶようにします。変換対象の全ての型について、<code>Converter</code> を実装しました。<code>serde</code> ライブラリでこんな感じに実装されていて、なるほどなと思いました。</p>
<p>具体的な<code>Converter</code> の実装は以下になります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/b5192ae5ac47a091eb93568bc7f3d2fc.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105006024" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-rust-map-macro-mapper" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-rust-map-macro-mapper-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-rust-map-macro-mapper-LC1" class="blob-code blob-code-inner js-file-line">use anyhow::{anyhow, Result};</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-rust-map-macro-mapper-LC2" class="blob-code blob-code-inner js-file-line">use num_traits::cast::FromPrimitive;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-rust-map-macro-mapper-LC3" class="blob-code blob-code-inner js-file-line">use std::collections::HashMap;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-rust-map-macro-mapper-LC4" class="blob-code blob-code-inner js-file-line">use std::convert::TryFrom;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-rust-map-macro-mapper-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-rust-map-macro-mapper-LC6" class="blob-code blob-code-inner js-file-line">#[derive(Clone, Debug)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-rust-map-macro-mapper-LC7" class="blob-code blob-code-inner js-file-line">pub enum FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-rust-map-macro-mapper-LC8" class="blob-code blob-code-inner js-file-line">    Null,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-rust-map-macro-mapper-LC9" class="blob-code blob-code-inner js-file-line">    Boolean(bool),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-rust-map-macro-mapper-LC10" class="blob-code blob-code-inner js-file-line">    Integer(i64),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-rust-map-macro-mapper-LC11" class="blob-code blob-code-inner js-file-line">    Double(f64),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-rust-map-macro-mapper-LC12" class="blob-code blob-code-inner js-file-line">    String(String),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-rust-map-macro-mapper-LC13" class="blob-code blob-code-inner js-file-line">    Time(Time),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-rust-map-macro-mapper-LC14" class="blob-code blob-code-inner js-file-line">    Array(Vec&lt;FieldValue&gt;),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-rust-map-macro-mapper-LC15" class="blob-code blob-code-inner js-file-line">    Map(HashMap&lt;String, FieldValue&gt;),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-rust-map-macro-mapper-LC16" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-rust-map-macro-mapper-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-rust-map-macro-mapper-LC18" class="blob-code blob-code-inner js-file-line">#[derive(Clone, Debug)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-rust-map-macro-mapper-LC19" class="blob-code blob-code-inner js-file-line">pub struct Time {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-rust-map-macro-mapper-LC20" class="blob-code blob-code-inner js-file-line">    pub seconds: i64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-rust-map-macro-mapper-LC21" class="blob-code blob-code-inner js-file-line">    pub nanos: i32,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-rust-map-macro-mapper-LC22" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-rust-map-macro-mapper-LC23" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-rust-map-macro-mapper-LC24" class="blob-code blob-code-inner js-file-line">pub trait Mapper {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-rust-map-macro-mapper-LC25" class="blob-code blob-code-inner js-file-line">    fn to_map(&amp;self) -&gt; HashMap&lt;String, FieldValue&gt;;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-rust-map-macro-mapper-LC26" class="blob-code blob-code-inner js-file-line">    fn from_map(map: HashMap&lt;String, FieldValue&gt;) -&gt; Result&lt;Self&gt;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-rust-map-macro-mapper-LC27" class="blob-code blob-code-inner js-file-line">    where</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-rust-map-macro-mapper-LC28" class="blob-code blob-code-inner js-file-line">        Self: std::marker::Sized;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-rust-map-macro-mapper-LC29" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-rust-map-macro-mapper-LC30" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-rust-map-macro-mapper-LC31" class="blob-code blob-code-inner js-file-line">pub trait Converter: Sized {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-rust-map-macro-mapper-LC32" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-rust-map-macro-mapper-LC33" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt;;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-rust-map-macro-mapper-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-rust-map-macro-mapper-LC35" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-rust-map-macro-mapper-LC36" class="blob-code blob-code-inner js-file-line">impl Converter for String {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-rust-map-macro-mapper-LC37" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-rust-map-macro-mapper-LC38" class="blob-code blob-code-inner js-file-line">        FieldValue::String(self.to_string())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-rust-map-macro-mapper-LC39" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-rust-map-macro-mapper-LC40" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-rust-map-macro-mapper-LC41" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-rust-map-macro-mapper-LC42" class="blob-code blob-code-inner js-file-line">            FieldValue::String(value) =&gt; Ok(value),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-rust-map-macro-mapper-LC43" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: String&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-rust-map-macro-mapper-LC44" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-rust-map-macro-mapper-LC45" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-rust-map-macro-mapper-LC46" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-rust-map-macro-mapper-LC47" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-rust-map-macro-mapper-LC48" class="blob-code blob-code-inner js-file-line">impl Converter for char {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-rust-map-macro-mapper-LC49" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-rust-map-macro-mapper-LC50" class="blob-code blob-code-inner js-file-line">        FieldValue::String(self.to_string())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-rust-map-macro-mapper-LC51" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-rust-map-macro-mapper-LC52" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-rust-map-macro-mapper-LC53" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-rust-map-macro-mapper-LC54" class="blob-code blob-code-inner js-file-line">            FieldValue::String(value) =&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-rust-map-macro-mapper-LC55" class="blob-code blob-code-inner js-file-line">                let chars: Vec&lt;char&gt; = value.chars().collect();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-rust-map-macro-mapper-LC56" class="blob-code blob-code-inner js-file-line">                if chars.len() != 1 {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-rust-map-macro-mapper-LC57" class="blob-code blob-code-inner js-file-line">                    return Err(anyhow!(&quot;invalid type: char&quot;));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-rust-map-macro-mapper-LC58" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-rust-map-macro-mapper-LC59" class="blob-code blob-code-inner js-file-line">                return Ok(chars[0]);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-rust-map-macro-mapper-LC60" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-rust-map-macro-mapper-LC61" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: char&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-rust-map-macro-mapper-LC62" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-rust-map-macro-mapper-LC63" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-rust-map-macro-mapper-LC64" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-rust-map-macro-mapper-LC65" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-rust-map-macro-mapper-LC66" class="blob-code blob-code-inner js-file-line">impl Converter for bool {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-rust-map-macro-mapper-LC67" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-rust-map-macro-mapper-LC68" class="blob-code blob-code-inner js-file-line">        FieldValue::Boolean(*self)</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-rust-map-macro-mapper-LC69" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-rust-map-macro-mapper-LC70" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-rust-map-macro-mapper-LC71" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-rust-map-macro-mapper-LC72" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-rust-map-macro-mapper-LC73" class="blob-code blob-code-inner js-file-line">            FieldValue::Boolean(value) =&gt; Ok(value),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-rust-map-macro-mapper-LC74" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: bool&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-rust-map-macro-mapper-LC75" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-rust-map-macro-mapper-LC76" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-rust-map-macro-mapper-LC77" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-rust-map-macro-mapper-LC78" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-rust-map-macro-mapper-LC79" class="blob-code blob-code-inner js-file-line">impl Converter for Time {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-rust-map-macro-mapper-LC80" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-rust-map-macro-mapper-LC81" class="blob-code blob-code-inner js-file-line">        FieldValue::Time(self.clone())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-rust-map-macro-mapper-LC82" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-rust-map-macro-mapper-LC83" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-rust-map-macro-mapper-LC84" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-rust-map-macro-mapper-LC85" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-rust-map-macro-mapper-LC86" class="blob-code blob-code-inner js-file-line">            FieldValue::Time(value) =&gt; Ok(value),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-rust-map-macro-mapper-LC87" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: Time&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-rust-map-macro-mapper-LC88" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-rust-map-macro-mapper-LC89" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-rust-map-macro-mapper-LC90" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-rust-map-macro-mapper-LC91" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-rust-map-macro-mapper-LC92" class="blob-code blob-code-inner js-file-line">macro_rules! integer_impls {               // int系の型は多くて大変なので一括で実装するためにmacroを使用している</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-rust-map-macro-mapper-LC93" class="blob-code blob-code-inner js-file-line">    ($($type:ty)+) =&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-rust-map-macro-mapper-LC94" class="blob-code blob-code-inner js-file-line">        $(</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-rust-map-macro-mapper-LC95" class="blob-code blob-code-inner js-file-line">            impl Converter for $type {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-rust-map-macro-mapper-LC96" class="blob-code blob-code-inner js-file-line">                #[inline]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-rust-map-macro-mapper-LC97" class="blob-code blob-code-inner js-file-line">                fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-rust-map-macro-mapper-LC98" class="blob-code blob-code-inner js-file-line">                    FieldValue::Integer(*self as i64)</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-rust-map-macro-mapper-LC99" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-rust-map-macro-mapper-LC100" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-rust-map-macro-mapper-LC101" class="blob-code blob-code-inner js-file-line">                #[inline]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-rust-map-macro-mapper-LC102" class="blob-code blob-code-inner js-file-line">                fn to_primitive(fv: FieldValue) -&gt;Result&lt;Self&gt;{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-rust-map-macro-mapper-LC103" class="blob-code blob-code-inner js-file-line">                    match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-rust-map-macro-mapper-LC104" class="blob-code blob-code-inner js-file-line">                        FieldValue::Integer(value)=&gt;{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-rust-map-macro-mapper-LC105" class="blob-code blob-code-inner js-file-line">                            if let Ok(value) = &lt;$type&gt;::try_from(value) {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-rust-map-macro-mapper-LC106" class="blob-code blob-code-inner js-file-line">                                return Ok(value);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-rust-map-macro-mapper-LC107" class="blob-code blob-code-inner js-file-line">                            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L108" class="blob-num js-line-number" data-line-number="108"/>
        <td id="file-rust-map-macro-mapper-LC108" class="blob-code blob-code-inner js-file-line">                            return Err(anyhow!(&quot;invalid type: {}&quot;,stringify!($type)))</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L109" class="blob-num js-line-number" data-line-number="109"/>
        <td id="file-rust-map-macro-mapper-LC109" class="blob-code blob-code-inner js-file-line">                        },</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L110" class="blob-num js-line-number" data-line-number="110"/>
        <td id="file-rust-map-macro-mapper-LC110" class="blob-code blob-code-inner js-file-line">                        _=&gt; Err(anyhow!(&quot;invalid type: {}&quot;,stringify!($type))),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L111" class="blob-num js-line-number" data-line-number="111"/>
        <td id="file-rust-map-macro-mapper-LC111" class="blob-code blob-code-inner js-file-line">                    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L112" class="blob-num js-line-number" data-line-number="112"/>
        <td id="file-rust-map-macro-mapper-LC112" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L113" class="blob-num js-line-number" data-line-number="113"/>
        <td id="file-rust-map-macro-mapper-LC113" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L114" class="blob-num js-line-number" data-line-number="114"/>
        <td id="file-rust-map-macro-mapper-LC114" class="blob-code blob-code-inner js-file-line">        )+</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L115" class="blob-num js-line-number" data-line-number="115"/>
        <td id="file-rust-map-macro-mapper-LC115" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L116" class="blob-num js-line-number" data-line-number="116"/>
        <td id="file-rust-map-macro-mapper-LC116" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L117" class="blob-num js-line-number" data-line-number="117"/>
        <td id="file-rust-map-macro-mapper-LC117" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L118" class="blob-num js-line-number" data-line-number="118"/>
        <td id="file-rust-map-macro-mapper-LC118" class="blob-code blob-code-inner js-file-line">integer_impls! {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L119" class="blob-num js-line-number" data-line-number="119"/>
        <td id="file-rust-map-macro-mapper-LC119" class="blob-code blob-code-inner js-file-line">    i8 i16 i32 i64 isize u8 u16 u32</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L120" class="blob-num js-line-number" data-line-number="120"/>
        <td id="file-rust-map-macro-mapper-LC120" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L121" class="blob-num js-line-number" data-line-number="121"/>
        <td id="file-rust-map-macro-mapper-LC121" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L122" class="blob-num js-line-number" data-line-number="122"/>
        <td id="file-rust-map-macro-mapper-LC122" class="blob-code blob-code-inner js-file-line">impl Converter for f32 {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L123" class="blob-num js-line-number" data-line-number="123"/>
        <td id="file-rust-map-macro-mapper-LC123" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L124" class="blob-num js-line-number" data-line-number="124"/>
        <td id="file-rust-map-macro-mapper-LC124" class="blob-code blob-code-inner js-file-line">        FieldValue::Double(*self as f64)</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L125" class="blob-num js-line-number" data-line-number="125"/>
        <td id="file-rust-map-macro-mapper-LC125" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L126" class="blob-num js-line-number" data-line-number="126"/>
        <td id="file-rust-map-macro-mapper-LC126" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L127" class="blob-num js-line-number" data-line-number="127"/>
        <td id="file-rust-map-macro-mapper-LC127" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L128" class="blob-num js-line-number" data-line-number="128"/>
        <td id="file-rust-map-macro-mapper-LC128" class="blob-code blob-code-inner js-file-line">            FieldValue::Double(value) =&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L129" class="blob-num js-line-number" data-line-number="129"/>
        <td id="file-rust-map-macro-mapper-LC129" class="blob-code blob-code-inner js-file-line">                if let Some(value) = f32::from_f64(value) {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L130" class="blob-num js-line-number" data-line-number="130"/>
        <td id="file-rust-map-macro-mapper-LC130" class="blob-code blob-code-inner js-file-line">                    return Ok(value);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L131" class="blob-num js-line-number" data-line-number="131"/>
        <td id="file-rust-map-macro-mapper-LC131" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L132" class="blob-num js-line-number" data-line-number="132"/>
        <td id="file-rust-map-macro-mapper-LC132" class="blob-code blob-code-inner js-file-line">                return Err(anyhow!(&quot;invalid type: f32&quot;));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L133" class="blob-num js-line-number" data-line-number="133"/>
        <td id="file-rust-map-macro-mapper-LC133" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L134" class="blob-num js-line-number" data-line-number="134"/>
        <td id="file-rust-map-macro-mapper-LC134" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: f32&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L135" class="blob-num js-line-number" data-line-number="135"/>
        <td id="file-rust-map-macro-mapper-LC135" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L136" class="blob-num js-line-number" data-line-number="136"/>
        <td id="file-rust-map-macro-mapper-LC136" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L137" class="blob-num js-line-number" data-line-number="137"/>
        <td id="file-rust-map-macro-mapper-LC137" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L138" class="blob-num js-line-number" data-line-number="138"/>
        <td id="file-rust-map-macro-mapper-LC138" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L139" class="blob-num js-line-number" data-line-number="139"/>
        <td id="file-rust-map-macro-mapper-LC139" class="blob-code blob-code-inner js-file-line">impl Converter for f64 {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L140" class="blob-num js-line-number" data-line-number="140"/>
        <td id="file-rust-map-macro-mapper-LC140" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L141" class="blob-num js-line-number" data-line-number="141"/>
        <td id="file-rust-map-macro-mapper-LC141" class="blob-code blob-code-inner js-file-line">        FieldValue::Double(*self)</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L142" class="blob-num js-line-number" data-line-number="142"/>
        <td id="file-rust-map-macro-mapper-LC142" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L143" class="blob-num js-line-number" data-line-number="143"/>
        <td id="file-rust-map-macro-mapper-LC143" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L144" class="blob-num js-line-number" data-line-number="144"/>
        <td id="file-rust-map-macro-mapper-LC144" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L145" class="blob-num js-line-number" data-line-number="145"/>
        <td id="file-rust-map-macro-mapper-LC145" class="blob-code blob-code-inner js-file-line">            FieldValue::Double(value) =&gt; Ok(value),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L146" class="blob-num js-line-number" data-line-number="146"/>
        <td id="file-rust-map-macro-mapper-LC146" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: f64&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L147" class="blob-num js-line-number" data-line-number="147"/>
        <td id="file-rust-map-macro-mapper-LC147" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L148" class="blob-num js-line-number" data-line-number="148"/>
        <td id="file-rust-map-macro-mapper-LC148" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L149" class="blob-num js-line-number" data-line-number="149"/>
        <td id="file-rust-map-macro-mapper-LC149" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L150" class="blob-num js-line-number" data-line-number="150"/>
        <td id="file-rust-map-macro-mapper-LC150" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L151" class="blob-num js-line-number" data-line-number="151"/>
        <td id="file-rust-map-macro-mapper-LC151" class="blob-code blob-code-inner js-file-line">impl&lt;T&gt; Converter for Option&lt;T&gt;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L152" class="blob-num js-line-number" data-line-number="152"/>
        <td id="file-rust-map-macro-mapper-LC152" class="blob-code blob-code-inner js-file-line">where</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L153" class="blob-num js-line-number" data-line-number="153"/>
        <td id="file-rust-map-macro-mapper-LC153" class="blob-code blob-code-inner js-file-line">    T: Converter,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L154" class="blob-num js-line-number" data-line-number="154"/>
        <td id="file-rust-map-macro-mapper-LC154" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L155" class="blob-num js-line-number" data-line-number="155"/>
        <td id="file-rust-map-macro-mapper-LC155" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L156" class="blob-num js-line-number" data-line-number="156"/>
        <td id="file-rust-map-macro-mapper-LC156" class="blob-code blob-code-inner js-file-line">        match self {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L157" class="blob-num js-line-number" data-line-number="157"/>
        <td id="file-rust-map-macro-mapper-LC157" class="blob-code blob-code-inner js-file-line">            Some(some) =&gt; some.to_field_value(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L158" class="blob-num js-line-number" data-line-number="158"/>
        <td id="file-rust-map-macro-mapper-LC158" class="blob-code blob-code-inner js-file-line">            None =&gt; FieldValue::Null,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L159" class="blob-num js-line-number" data-line-number="159"/>
        <td id="file-rust-map-macro-mapper-LC159" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L160" class="blob-num js-line-number" data-line-number="160"/>
        <td id="file-rust-map-macro-mapper-LC160" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L161" class="blob-num js-line-number" data-line-number="161"/>
        <td id="file-rust-map-macro-mapper-LC161" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L162" class="blob-num js-line-number" data-line-number="162"/>
        <td id="file-rust-map-macro-mapper-LC162" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L163" class="blob-num js-line-number" data-line-number="163"/>
        <td id="file-rust-map-macro-mapper-LC163" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L164" class="blob-num js-line-number" data-line-number="164"/>
        <td id="file-rust-map-macro-mapper-LC164" class="blob-code blob-code-inner js-file-line">            FieldValue::Null =&gt; Ok(None),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L165" class="blob-num js-line-number" data-line-number="165"/>
        <td id="file-rust-map-macro-mapper-LC165" class="blob-code blob-code-inner js-file-line">            _ =&gt; Ok(Some(T::to_primitive(fv)?)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L166" class="blob-num js-line-number" data-line-number="166"/>
        <td id="file-rust-map-macro-mapper-LC166" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L167" class="blob-num js-line-number" data-line-number="167"/>
        <td id="file-rust-map-macro-mapper-LC167" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L168" class="blob-num js-line-number" data-line-number="168"/>
        <td id="file-rust-map-macro-mapper-LC168" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L169" class="blob-num js-line-number" data-line-number="169"/>
        <td id="file-rust-map-macro-mapper-LC169" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L170" class="blob-num js-line-number" data-line-number="170"/>
        <td id="file-rust-map-macro-mapper-LC170" class="blob-code blob-code-inner js-file-line">impl&lt;T&gt; Converter for Vec&lt;T&gt;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L171" class="blob-num js-line-number" data-line-number="171"/>
        <td id="file-rust-map-macro-mapper-LC171" class="blob-code blob-code-inner js-file-line">where</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L172" class="blob-num js-line-number" data-line-number="172"/>
        <td id="file-rust-map-macro-mapper-LC172" class="blob-code blob-code-inner js-file-line">    T: Converter,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L173" class="blob-num js-line-number" data-line-number="173"/>
        <td id="file-rust-map-macro-mapper-LC173" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L174" class="blob-num js-line-number" data-line-number="174"/>
        <td id="file-rust-map-macro-mapper-LC174" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L175" class="blob-num js-line-number" data-line-number="175"/>
        <td id="file-rust-map-macro-mapper-LC175" class="blob-code blob-code-inner js-file-line">        FieldValue::Array(self.iter().map(|v| v.to_field_value()).collect())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L176" class="blob-num js-line-number" data-line-number="176"/>
        <td id="file-rust-map-macro-mapper-LC176" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L177" class="blob-num js-line-number" data-line-number="177"/>
        <td id="file-rust-map-macro-mapper-LC177" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L178" class="blob-num js-line-number" data-line-number="178"/>
        <td id="file-rust-map-macro-mapper-LC178" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L179" class="blob-num js-line-number" data-line-number="179"/>
        <td id="file-rust-map-macro-mapper-LC179" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L180" class="blob-num js-line-number" data-line-number="180"/>
        <td id="file-rust-map-macro-mapper-LC180" class="blob-code blob-code-inner js-file-line">            FieldValue::Array(value) =&gt; value</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L181" class="blob-num js-line-number" data-line-number="181"/>
        <td id="file-rust-map-macro-mapper-LC181" class="blob-code blob-code-inner js-file-line">                .into_iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L182" class="blob-num js-line-number" data-line-number="182"/>
        <td id="file-rust-map-macro-mapper-LC182" class="blob-code blob-code-inner js-file-line">                .map(|v| T::to_primitive(v))</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L183" class="blob-num js-line-number" data-line-number="183"/>
        <td id="file-rust-map-macro-mapper-LC183" class="blob-code blob-code-inner js-file-line">                .collect::&lt;Result&lt;Vec&lt;T&gt;&gt;&gt;(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L184" class="blob-num js-line-number" data-line-number="184"/>
        <td id="file-rust-map-macro-mapper-LC184" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: Vec&lt;T&gt;&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L185" class="blob-num js-line-number" data-line-number="185"/>
        <td id="file-rust-map-macro-mapper-LC185" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L186" class="blob-num js-line-number" data-line-number="186"/>
        <td id="file-rust-map-macro-mapper-LC186" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L187" class="blob-num js-line-number" data-line-number="187"/>
        <td id="file-rust-map-macro-mapper-LC187" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L188" class="blob-num js-line-number" data-line-number="188"/>
        <td id="file-rust-map-macro-mapper-LC188" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L189" class="blob-num js-line-number" data-line-number="189"/>
        <td id="file-rust-map-macro-mapper-LC189" class="blob-code blob-code-inner js-file-line">impl&lt;K, V&gt; Converter for HashMap&lt;K, V&gt;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L190" class="blob-num js-line-number" data-line-number="190"/>
        <td id="file-rust-map-macro-mapper-LC190" class="blob-code blob-code-inner js-file-line">where</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L191" class="blob-num js-line-number" data-line-number="191"/>
        <td id="file-rust-map-macro-mapper-LC191" class="blob-code blob-code-inner js-file-line">    K: ToString + From&lt;String&gt; + std::cmp::Eq + std::hash::Hash,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L192" class="blob-num js-line-number" data-line-number="192"/>
        <td id="file-rust-map-macro-mapper-LC192" class="blob-code blob-code-inner js-file-line">    V: Converter,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L193" class="blob-num js-line-number" data-line-number="193"/>
        <td id="file-rust-map-macro-mapper-LC193" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L194" class="blob-num js-line-number" data-line-number="194"/>
        <td id="file-rust-map-macro-mapper-LC194" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L195" class="blob-num js-line-number" data-line-number="195"/>
        <td id="file-rust-map-macro-mapper-LC195" class="blob-code blob-code-inner js-file-line">        FieldValue::Map(</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L196" class="blob-num js-line-number" data-line-number="196"/>
        <td id="file-rust-map-macro-mapper-LC196" class="blob-code blob-code-inner js-file-line">            self.iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L197" class="blob-num js-line-number" data-line-number="197"/>
        <td id="file-rust-map-macro-mapper-LC197" class="blob-code blob-code-inner js-file-line">                .map(|(key, value)| (key.to_string(), value.to_field_value()))</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L198" class="blob-num js-line-number" data-line-number="198"/>
        <td id="file-rust-map-macro-mapper-LC198" class="blob-code blob-code-inner js-file-line">                .collect(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L199" class="blob-num js-line-number" data-line-number="199"/>
        <td id="file-rust-map-macro-mapper-LC199" class="blob-code blob-code-inner js-file-line">        )</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L200" class="blob-num js-line-number" data-line-number="200"/>
        <td id="file-rust-map-macro-mapper-LC200" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L201" class="blob-num js-line-number" data-line-number="201"/>
        <td id="file-rust-map-macro-mapper-LC201" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L202" class="blob-num js-line-number" data-line-number="202"/>
        <td id="file-rust-map-macro-mapper-LC202" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L203" class="blob-num js-line-number" data-line-number="203"/>
        <td id="file-rust-map-macro-mapper-LC203" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L204" class="blob-num js-line-number" data-line-number="204"/>
        <td id="file-rust-map-macro-mapper-LC204" class="blob-code blob-code-inner js-file-line">            FieldValue::Map(value) =&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L205" class="blob-num js-line-number" data-line-number="205"/>
        <td id="file-rust-map-macro-mapper-LC205" class="blob-code blob-code-inner js-file-line">                let mut result = HashMap::with_capacity(value.len());</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L206" class="blob-num js-line-number" data-line-number="206"/>
        <td id="file-rust-map-macro-mapper-LC206" class="blob-code blob-code-inner js-file-line">                for (k, v) in value {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L207" class="blob-num js-line-number" data-line-number="207"/>
        <td id="file-rust-map-macro-mapper-LC207" class="blob-code blob-code-inner js-file-line">                    if let Ok(k) = K::try_from(k) {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L208" class="blob-num js-line-number" data-line-number="208"/>
        <td id="file-rust-map-macro-mapper-LC208" class="blob-code blob-code-inner js-file-line">                        result.insert(k, V::to_primitive(v)?);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L209" class="blob-num js-line-number" data-line-number="209"/>
        <td id="file-rust-map-macro-mapper-LC209" class="blob-code blob-code-inner js-file-line">                    } else {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L210" class="blob-num js-line-number" data-line-number="210"/>
        <td id="file-rust-map-macro-mapper-LC210" class="blob-code blob-code-inner js-file-line">                        return Err(anyhow!(&quot;invalid type: HashMap&lt;K, V&gt;&quot;));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L211" class="blob-num js-line-number" data-line-number="211"/>
        <td id="file-rust-map-macro-mapper-LC211" class="blob-code blob-code-inner js-file-line">                    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L212" class="blob-num js-line-number" data-line-number="212"/>
        <td id="file-rust-map-macro-mapper-LC212" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L213" class="blob-num js-line-number" data-line-number="213"/>
        <td id="file-rust-map-macro-mapper-LC213" class="blob-code blob-code-inner js-file-line">                return Ok(result);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L214" class="blob-num js-line-number" data-line-number="214"/>
        <td id="file-rust-map-macro-mapper-LC214" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L215" class="blob-num js-line-number" data-line-number="215"/>
        <td id="file-rust-map-macro-mapper-LC215" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: HashMap&lt;K, V&gt;&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L216" class="blob-num js-line-number" data-line-number="216"/>
        <td id="file-rust-map-macro-mapper-LC216" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L217" class="blob-num js-line-number" data-line-number="217"/>
        <td id="file-rust-map-macro-mapper-LC217" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L218" class="blob-num js-line-number" data-line-number="218"/>
        <td id="file-rust-map-macro-mapper-LC218" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L219" class="blob-num js-line-number" data-line-number="219"/>
        <td id="file-rust-map-macro-mapper-LC219" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L220" class="blob-num js-line-number" data-line-number="220"/>
        <td id="file-rust-map-macro-mapper-LC220" class="blob-code blob-code-inner js-file-line">impl&lt;T&gt; Converter for T        // MapperにもConverterを実装することで、ネストされた型も変換できるようになる</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L221" class="blob-num js-line-number" data-line-number="221"/>
        <td id="file-rust-map-macro-mapper-LC221" class="blob-code blob-code-inner js-file-line">where</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L222" class="blob-num js-line-number" data-line-number="222"/>
        <td id="file-rust-map-macro-mapper-LC222" class="blob-code blob-code-inner js-file-line">    T: Mapper,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L223" class="blob-num js-line-number" data-line-number="223"/>
        <td id="file-rust-map-macro-mapper-LC223" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L224" class="blob-num js-line-number" data-line-number="224"/>
        <td id="file-rust-map-macro-mapper-LC224" class="blob-code blob-code-inner js-file-line">    fn to_field_value(&amp;self) -&gt; FieldValue {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L225" class="blob-num js-line-number" data-line-number="225"/>
        <td id="file-rust-map-macro-mapper-LC225" class="blob-code blob-code-inner js-file-line">        FieldValue::Map(self.to_map())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L226" class="blob-num js-line-number" data-line-number="226"/>
        <td id="file-rust-map-macro-mapper-LC226" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L227" class="blob-num js-line-number" data-line-number="227"/>
        <td id="file-rust-map-macro-mapper-LC227" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L228" class="blob-num js-line-number" data-line-number="228"/>
        <td id="file-rust-map-macro-mapper-LC228" class="blob-code blob-code-inner js-file-line">    fn to_primitive(fv: FieldValue) -&gt; Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L229" class="blob-num js-line-number" data-line-number="229"/>
        <td id="file-rust-map-macro-mapper-LC229" class="blob-code blob-code-inner js-file-line">        match fv {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L230" class="blob-num js-line-number" data-line-number="230"/>
        <td id="file-rust-map-macro-mapper-LC230" class="blob-code blob-code-inner js-file-line">            FieldValue::Map(value) =&gt; Ok(T::from_map(value)?),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L231" class="blob-num js-line-number" data-line-number="231"/>
        <td id="file-rust-map-macro-mapper-LC231" class="blob-code blob-code-inner js-file-line">            _ =&gt; Err(anyhow!(&quot;invalid type: Mapper&quot;)),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L232" class="blob-num js-line-number" data-line-number="232"/>
        <td id="file-rust-map-macro-mapper-LC232" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L233" class="blob-num js-line-number" data-line-number="233"/>
        <td id="file-rust-map-macro-mapper-LC233" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-mapper-L234" class="blob-num js-line-number" data-line-number="234"/>
        <td id="file-rust-map-macro-mapper-LC234" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/b5192ae5ac47a091eb93568bc7f3d2fc/raw/3e54ec0c1191ee676f836b88997e1579df5b4afe/rust-map-macro-mapper" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/b5192ae5ac47a091eb93568bc7f3d2fc#file-rust-map-macro-mapper">rust-map-macro-mapper</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="macro%E5%AE%9F%E8%A3%85">macro実装</h2>
<p>derive macroの実装は以下のドキュメントを参考に進めました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://doc.rust-jp.rs/book/second-edition/appendix-04-macros.html#a%E7%8B%AC%E8%87%AA%E3%81%AEderive%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%AB%E3%83%9E%E3%82%AF%E3%83%AD"><div class="kg-bookmark-content"><div class="kg-bookmark-title">D - マクロ - The Rust Programming Language</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://doc.rust-jp.rs/book/second-edition/favicon.png"><span class="kg-bookmark-author">The Rust Programming Language</span></img></div></div></a></figure><!--kg-card-begin: markdown--><p>ベースのcrate（rust-map-macro）のディレクトリ内にmacro用のcrateを作成します。</p>
<pre><code>/rust-map-macro/src# cargo new mapper_derive --lib
</code></pre>
<p><code>/rust-map-macro/src/mapper_derive/Cargo.toml</code> に以下を記述し、macroのcrateであることを宣言します。</p>
<pre><code>[lib]  
proc-macro = true
</code></pre>
<p>macroを実装します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3dc523e2dee7610efad5571bf12eedb5.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105005731" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-rust-map-macro-macro" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-rust-map-macro-macro-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-rust-map-macro-macro-LC1" class="blob-code blob-code-inner js-file-line">extern crate proc_macro;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-rust-map-macro-macro-LC2" class="blob-code blob-code-inner js-file-line">extern crate syn;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-rust-map-macro-macro-LC3" class="blob-code blob-code-inner js-file-line">use anyhow::{anyhow, Result};</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-rust-map-macro-macro-LC4" class="blob-code blob-code-inner js-file-line">use syn::Data;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-rust-map-macro-macro-LC5" class="blob-code blob-code-inner js-file-line">use syn::Fields;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-rust-map-macro-macro-LC6" class="blob-code blob-code-inner js-file-line">#[macro_use]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-rust-map-macro-macro-LC7" class="blob-code blob-code-inner js-file-line">extern crate quote;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-rust-map-macro-macro-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-rust-map-macro-macro-LC9" class="blob-code blob-code-inner js-file-line">use proc_macro::TokenStream;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-rust-map-macro-macro-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-rust-map-macro-macro-LC11" class="blob-code blob-code-inner js-file-line">#[proc_macro_derive(Mapper)]                                          // #[proc_macro_derive(Mapper)] を書くことで、#[derive(Mapper)] を指定した時にderive_mapper() 関数が呼び出されるようになる</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-rust-map-macro-macro-LC12" class="blob-code blob-code-inner js-file-line">pub fn derive_mapper(input: TokenStream) -&gt; TokenStream {             // input: TokenStream に #[derive(Mapper)] を指定した型情報が入ってくる</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-rust-map-macro-macro-LC13" class="blob-code blob-code-inner js-file-line">    let input = syn::parse_macro_input!(input as syn::DeriveInput);   // inputをparseする</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-rust-map-macro-macro-LC14" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-rust-map-macro-macro-LC15" class="blob-code blob-code-inner js-file-line">    impl_mapper_macro(&amp;input).unwrap()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-rust-map-macro-macro-LC16" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-rust-map-macro-macro-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-rust-map-macro-macro-LC18" class="blob-code blob-code-inner js-file-line">fn impl_mapper_macro(input: &amp;syn::DeriveInput) -&gt; Result&lt;TokenStream&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-rust-map-macro-macro-LC19" class="blob-code blob-code-inner js-file-line">    let data_struct = match &amp;input.data {                              // #[derive(Mapper)] を指定した型がstructであるかを判定</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-rust-map-macro-macro-LC20" class="blob-code blob-code-inner js-file-line">        Data::Struct(data_struct) =&gt; data_struct,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-rust-map-macro-macro-LC21" class="blob-code blob-code-inner js-file-line">        Data::Enum(_) =&gt; Err(anyhow!(&quot;invalid type: Enum&quot;))?,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-rust-map-macro-macro-LC22" class="blob-code blob-code-inner js-file-line">        Data::Union(_) =&gt; Err(anyhow!(&quot;invalid type: Union&quot;))?,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-rust-map-macro-macro-LC23" class="blob-code blob-code-inner js-file-line">    };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-rust-map-macro-macro-LC24" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-rust-map-macro-macro-LC25" class="blob-code blob-code-inner js-file-line">    let fields_named = match &amp;data_struct.fields {                     // structのfield名一覧を取得する</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-rust-map-macro-macro-LC26" class="blob-code blob-code-inner js-file-line">        Fields::Named(fields_named) =&gt; fields_named,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-rust-map-macro-macro-LC27" class="blob-code blob-code-inner js-file-line">        Fields::Unnamed(_) =&gt; Err(anyhow!(&quot;invalid type: Unnamed&quot;))?,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-rust-map-macro-macro-LC28" class="blob-code blob-code-inner js-file-line">        Fields::Unit =&gt; Err(anyhow!(&quot;invalid type: Unit&quot;))?,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-rust-map-macro-macro-LC29" class="blob-code blob-code-inner js-file-line">    };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-rust-map-macro-macro-LC30" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-rust-map-macro-macro-LC31" class="blob-code blob-code-inner js-file-line">    let to_field_value_token_streams: Vec&lt;proc_macro2::TokenStream&gt; = fields_named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-rust-map-macro-macro-LC32" class="blob-code blob-code-inner js-file-line">        .named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-rust-map-macro-macro-LC33" class="blob-code blob-code-inner js-file-line">        .iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-rust-map-macro-macro-LC34" class="blob-code blob-code-inner js-file-line">        .enumerate()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-rust-map-macro-macro-LC35" class="blob-code blob-code-inner js-file-line">        .map(|(i, field)| {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-rust-map-macro-macro-LC36" class="blob-code blob-code-inner js-file-line">            let name = match &amp;field.ident {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-rust-map-macro-macro-LC37" class="blob-code blob-code-inner js-file-line">                Some(ident) =&gt; syn::Member::Named(ident.clone()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-rust-map-macro-macro-LC38" class="blob-code blob-code-inner js-file-line">                None =&gt; syn::Member::Unnamed(i.into()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-rust-map-macro-macro-LC39" class="blob-code blob-code-inner js-file-line">            };　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　                  // Converterを実装した型のto_field_valueを呼び、FieldValueに変換するためのmacroを書く</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-rust-map-macro-macro-LC40" class="blob-code blob-code-inner js-file-line">            return quote! {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-rust-map-macro-macro-LC41" class="blob-code blob-code-inner js-file-line">                result.insert(stringify!(#name).to_string(), rust_map_macro::mapper::Converter::to_field_value(&amp;self.#name));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-rust-map-macro-macro-LC42" class="blob-code blob-code-inner js-file-line">            };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-rust-map-macro-macro-LC43" class="blob-code blob-code-inner js-file-line">        })</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-rust-map-macro-macro-LC44" class="blob-code blob-code-inner js-file-line">        .collect();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-rust-map-macro-macro-LC45" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-rust-map-macro-macro-LC46" class="blob-code blob-code-inner js-file-line">    let to_primitive_token_streams: Vec&lt;proc_macro2::TokenStream&gt; = fields_named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-rust-map-macro-macro-LC47" class="blob-code blob-code-inner js-file-line">        .named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-rust-map-macro-macro-LC48" class="blob-code blob-code-inner js-file-line">        .iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-rust-map-macro-macro-LC49" class="blob-code blob-code-inner js-file-line">        .enumerate()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-rust-map-macro-macro-LC50" class="blob-code blob-code-inner js-file-line">        .map(|(i, field)| {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-rust-map-macro-macro-LC51" class="blob-code blob-code-inner js-file-line">            let name = match &amp;field.ident {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-rust-map-macro-macro-LC52" class="blob-code blob-code-inner js-file-line">                Some(ident) =&gt; syn::Member::Named(ident.clone()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-rust-map-macro-macro-LC53" class="blob-code blob-code-inner js-file-line">                None =&gt; syn::Member::Unnamed(i.into()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-rust-map-macro-macro-LC54" class="blob-code blob-code-inner js-file-line">            };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-rust-map-macro-macro-LC55" class="blob-code blob-code-inner js-file-line">            let ty = &amp;field.ty;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-rust-map-macro-macro-LC56" class="blob-code blob-code-inner js-file-line">            return quote! {                                                    // Converterを実装した型のto_primitiveを呼び、primitive型に変換するためのmacroを書く</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-rust-map-macro-macro-LC57" class="blob-code blob-code-inner js-file-line">                let mut #name: Option&lt;#ty&gt; = None;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-rust-map-macro-macro-LC58" class="blob-code blob-code-inner js-file-line">                if let Some(value) = __optional_map__.get_mut(stringify!(#name)) {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-rust-map-macro-macro-LC59" class="blob-code blob-code-inner js-file-line">                    if let Some(value) = std::mem::replace(value, None) {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-rust-map-macro-macro-LC60" class="blob-code blob-code-inner js-file-line">                        #name = Some(rust_map_macro::mapper::Converter::to_primitive(value)?);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-rust-map-macro-macro-LC61" class="blob-code blob-code-inner js-file-line">                    } else {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-rust-map-macro-macro-LC62" class="blob-code blob-code-inner js-file-line">                        return Err(anyhow::anyhow!(&quot;invalid type: {}&quot;, stringify!(#ty)));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-rust-map-macro-macro-LC63" class="blob-code blob-code-inner js-file-line">                    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-rust-map-macro-macro-LC64" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-rust-map-macro-macro-LC65" class="blob-code blob-code-inner js-file-line">                let #name = #name.ok_or(anyhow::anyhow!(&quot;invalid type: {}&quot;, stringify!(#ty)))?;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-rust-map-macro-macro-LC66" class="blob-code blob-code-inner js-file-line">            };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-rust-map-macro-macro-LC67" class="blob-code blob-code-inner js-file-line">        })</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-rust-map-macro-macro-LC68" class="blob-code blob-code-inner js-file-line">        .collect();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-rust-map-macro-macro-LC69" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-rust-map-macro-macro-LC70" class="blob-code blob-code-inner js-file-line">    let to_struct_token_streams: Vec&lt;proc_macro2::TokenStream&gt; = fields_named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-rust-map-macro-macro-LC71" class="blob-code blob-code-inner js-file-line">        .named</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-rust-map-macro-macro-LC72" class="blob-code blob-code-inner js-file-line">        .iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-rust-map-macro-macro-LC73" class="blob-code blob-code-inner js-file-line">        .enumerate()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-rust-map-macro-macro-LC74" class="blob-code blob-code-inner js-file-line">        .map(|(i, field)| {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-rust-map-macro-macro-LC75" class="blob-code blob-code-inner js-file-line">            let name = match &amp;field.ident {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-rust-map-macro-macro-LC76" class="blob-code blob-code-inner js-file-line">                Some(ident) =&gt; syn::Member::Named(ident.clone()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-rust-map-macro-macro-LC77" class="blob-code blob-code-inner js-file-line">                None =&gt; syn::Member::Unnamed(i.into()),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-rust-map-macro-macro-LC78" class="blob-code blob-code-inner js-file-line">            };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-rust-map-macro-macro-LC79" class="blob-code blob-code-inner js-file-line">            return quote! {                     // 変換後の変数を構造体にまとめるためのmacroを書く</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-rust-map-macro-macro-LC80" class="blob-code blob-code-inner js-file-line">                #name,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-rust-map-macro-macro-LC81" class="blob-code blob-code-inner js-file-line">            };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-rust-map-macro-macro-LC82" class="blob-code blob-code-inner js-file-line">        })</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-rust-map-macro-macro-LC83" class="blob-code blob-code-inner js-file-line">        .collect();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-rust-map-macro-macro-LC84" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-rust-map-macro-macro-LC85" class="blob-code blob-code-inner js-file-line">    let name = &amp;input.ident;                                              // 構造体名</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-rust-map-macro-macro-LC86" class="blob-code blob-code-inner js-file-line">    let (im_generics, ty_generics, _) = input.generics.split_for_impl();  // 構造体のgenerics引数</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-rust-map-macro-macro-LC87" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-rust-map-macro-macro-LC88" class="blob-code blob-code-inner js-file-line">    Ok(quote! {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-rust-map-macro-macro-LC89" class="blob-code blob-code-inner js-file-line">        impl#im_generics Mapper for #name#ty_generics {                                                  // 構造体にMapperを実装する</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-rust-map-macro-macro-LC90" class="blob-code blob-code-inner js-file-line">            fn to_map(&amp;self) -&gt; std::collections::HashMap&lt;String, rust_map_macro::mapper::FieldValue&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-rust-map-macro-macro-LC91" class="blob-code blob-code-inner js-file-line">                let mut result = std::collections::HashMap::new();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-rust-map-macro-macro-LC92" class="blob-code blob-code-inner js-file-line">                #(#to_field_value_token_streams)*                                                        // 上で書いたmacro（to_field_value_token_streams）をバインドする</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-rust-map-macro-macro-LC93" class="blob-code blob-code-inner js-file-line">                result</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-rust-map-macro-macro-LC94" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-rust-map-macro-macro-LC95" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-rust-map-macro-macro-LC96" class="blob-code blob-code-inner js-file-line">            fn from_map(__map__: std::collections::HashMap&lt;String, rust_map_macro::mapper::FieldValue&gt;) -&gt; anyhow::Result&lt;Self&gt; {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-rust-map-macro-macro-LC97" class="blob-code blob-code-inner js-file-line">                let mut __optional_map__ = std::collections::HashMap::with_capacity(__map__.len());</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-rust-map-macro-macro-LC98" class="blob-code blob-code-inner js-file-line">                for (key, val) in __map__ {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-rust-map-macro-macro-LC99" class="blob-code blob-code-inner js-file-line">                    __optional_map__.insert(key, Some(val));</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-rust-map-macro-macro-LC100" class="blob-code blob-code-inner js-file-line">                }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-rust-map-macro-macro-LC101" class="blob-code blob-code-inner js-file-line">                #(#to_primitive_token_streams)*             // 上で書いたmacro（to_primitive_token_streams）をバインドする</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-rust-map-macro-macro-LC102" class="blob-code blob-code-inner js-file-line">                Ok(#name { #(#to_struct_token_streams)* })  // 上で書いたmacro（to_struct_token_streams）をバインドする</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-rust-map-macro-macro-LC103" class="blob-code blob-code-inner js-file-line">            }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-rust-map-macro-macro-LC104" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-rust-map-macro-macro-LC105" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-rust-map-macro-macro-LC106" class="blob-code blob-code-inner js-file-line">    .into())</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-macro-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-rust-map-macro-macro-LC107" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3dc523e2dee7610efad5571bf12eedb5/raw/dc147f58e9259cca17ef3eb730ce76aeba96ea58/rust-map-macro-macro" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3dc523e2dee7610efad5571bf12eedb5#file-rust-map-macro-macro">rust-map-macro-macro</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>このmacroを使用するため、使用元のcrateの<code>/rust-map-macro/Cargo.toml</code>に以下を記述します。</p>
<pre><code>[dependencies]  
mapper_derive = { path = &quot;./src/mapper_derive&quot; }
</code></pre>
<p>以下のようにmacroを使用します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3d208f532179b074d78be444a4a56b06.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105005897" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-rust-map-macro-main" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-rust-map-macro-main-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-rust-map-macro-main-LC1" class="blob-code blob-code-inner js-file-line">extern crate rust_map_macro;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-rust-map-macro-main-LC2" class="blob-code blob-code-inner js-file-line">use rust_map_macro::mapper::{Mapper, Time};</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-rust-map-macro-main-LC3" class="blob-code blob-code-inner js-file-line">use std::collections::HashMap;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-rust-map-macro-main-LC4" class="blob-code blob-code-inner js-file-line">#[macro_use]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-rust-map-macro-main-LC5" class="blob-code blob-code-inner js-file-line">extern crate mapper_derive;</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-rust-map-macro-main-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-rust-map-macro-main-LC7" class="blob-code blob-code-inner js-file-line">fn main() {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-rust-map-macro-main-LC8" class="blob-code blob-code-inner js-file-line">    let test = Test {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-rust-map-macro-main-LC9" class="blob-code blob-code-inner js-file-line">        null: None,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-rust-map-macro-main-LC10" class="blob-code blob-code-inner js-file-line">        boolean: true,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-rust-map-macro-main-LC11" class="blob-code blob-code-inner js-file-line">        int: 1234,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-rust-map-macro-main-LC12" class="blob-code blob-code-inner js-file-line">        float: 56.78,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-rust-map-macro-main-LC13" class="blob-code blob-code-inner js-file-line">        string: &quot;str&quot;.to_string(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-rust-map-macro-main-LC14" class="blob-code blob-code-inner js-file-line">        array: vec![&quot;array1&quot;.to_string(), &quot;array2&quot;.to_string()],</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-rust-map-macro-main-LC15" class="blob-code blob-code-inner js-file-line">        map: vec![(&quot;seconds&quot;.to_string(), 1234), (&quot;nanos&quot;.to_string(), 5678)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-rust-map-macro-main-LC16" class="blob-code blob-code-inner js-file-line">            .into_iter()</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-rust-map-macro-main-LC17" class="blob-code blob-code-inner js-file-line">            .collect(),</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-rust-map-macro-main-LC18" class="blob-code blob-code-inner js-file-line">        time: Time {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-rust-map-macro-main-LC19" class="blob-code blob-code-inner js-file-line">            seconds: 1234,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-rust-map-macro-main-LC20" class="blob-code blob-code-inner js-file-line">            nanos: 5678,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-rust-map-macro-main-LC21" class="blob-code blob-code-inner js-file-line">        },</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-rust-map-macro-main-LC22" class="blob-code blob-code-inner js-file-line">    };</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-rust-map-macro-main-LC23" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-rust-map-macro-main-LC24" class="blob-code blob-code-inner js-file-line">    let test_map = test.to_map();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-rust-map-macro-main-LC25" class="blob-code blob-code-inner js-file-line">    println!(&quot;map&quot;);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-rust-map-macro-main-LC26" class="blob-code blob-code-inner js-file-line">    println!(&quot;{:?}&quot;, test_map);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-rust-map-macro-main-LC27" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-rust-map-macro-main-LC28" class="blob-code blob-code-inner js-file-line">    let test = Test::from_map(test_map).unwrap();</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-rust-map-macro-main-LC29" class="blob-code blob-code-inner js-file-line">    println!(&quot;struct&quot;);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-rust-map-macro-main-LC30" class="blob-code blob-code-inner js-file-line">    println!(&quot;{:?}&quot;, test);</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-rust-map-macro-main-LC31" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-rust-map-macro-main-LC32" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-rust-map-macro-main-LC33" class="blob-code blob-code-inner js-file-line">#[derive(Debug, Mapper)]</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-rust-map-macro-main-LC34" class="blob-code blob-code-inner js-file-line">struct Test {</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-rust-map-macro-main-LC35" class="blob-code blob-code-inner js-file-line">    null: Option&lt;String&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-rust-map-macro-main-LC36" class="blob-code blob-code-inner js-file-line">    boolean: bool,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-rust-map-macro-main-LC37" class="blob-code blob-code-inner js-file-line">    int: i64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-rust-map-macro-main-LC38" class="blob-code blob-code-inner js-file-line">    float: f64,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-rust-map-macro-main-LC39" class="blob-code blob-code-inner js-file-line">    string: String,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-rust-map-macro-main-LC40" class="blob-code blob-code-inner js-file-line">    array: Vec&lt;String&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-rust-map-macro-main-LC41" class="blob-code blob-code-inner js-file-line">    map: HashMap&lt;String, i64&gt;,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-rust-map-macro-main-LC42" class="blob-code blob-code-inner js-file-line">    time: Time,</td>
      </tr>
      <tr>
        <td id="file-rust-map-macro-main-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-rust-map-macro-main-LC43" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3d208f532179b074d78be444a4a56b06/raw/0de579fa86717a5d1b4979b4b0a37b8f85b4aadd/rust-map-macro-main" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3d208f532179b074d78be444a4a56b06#file-rust-map-macro-main">rust-map-macro-main</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>実行結果は以下です。</p>
<pre><code>map  
{&quot;time&quot;: Time(Time { seconds: 1234, nanos: 5678 }), &quot;string&quot;: String(&quot;str&quot;), &quot;float&quot;: Double(56.78), &quot;boolean&quot;: Boolean(true), &quot;int&quot;: Integer(1234), &quot;null&quot;: Null, &quot;array&quot;: Array([String(&quot;array1&quot;), String(&quot;array2&quot;)]), &quot;map&quot;: Map({&quot;seconds&quot;: Integer(1234), &quot;nanos&quot;: Integer(5678)})}

struct  
Test { null: None, boolean: true, int: 1234, float: 56.78, string: &quot;str&quot;, array: [&quot;array1&quot;, &quot;array2&quot;], map: {&quot;seconds&quot;: 1234, &quot;nanos&quot;: 5678}, time: Time { seconds: 1234, nanos: 5678 } }
</code></pre>
<p>mapの変換後も<code>Time</code>の情報を保持できています。</p>
<pre><code>map  
...
&quot;time&quot;: Time(Time { seconds: 1234, nanos: 5678 }), 
...
&quot;map&quot;: Map({&quot;seconds&quot;: Integer(1234), &quot;nanos&quot;: Integer(5678)})
...
</code></pre>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>macroの書き方は調べてもあまり情報が出てこず、大変でした。</p>
<h2 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h2>
<ul>
<li><a href="https://doc.rust-jp.rs/book/second-edition/appendix-04-macros.html">https://doc.rust-jp.rs/book/second-edition/appendix-04-macros.html</a></li>
<li><a href="https://github.com/serde-rs/serde">https://github.com/serde-rs/serde</a></li>
<li><a href="https://qiita.com/hnaohiro/items/1f021fa5e703b5a530cf">https://qiita.com/hnaohiro/items/1f021fa5e703b5a530cf</a></li>
<li><a href="https://stackoverflow.com/questions/57280100/parsing-a-json-into-a-map-in-rust">https://stackoverflow.com/questions/57280100/parsing-a-json-into-a-map-in-rust</a></li>
</ul>
<!--kg-card-end: markdown--></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[【高速】フィボナッチ数列をビネの公式を使いGoで実装する]]></title><description><![CDATA[
結論
O(log (n))となり

1000項目めを求めるには0.000199s

10000項目めは0.000405sで求められました。

完成品
https://github.com/kooooohe/fibonacci/blob/master/main.g
[https://github.com/kooooohe/fibonacci/blob/master/main.go]o



通常の再帰を使った簡単な解き方


fib_blog_1.goGitHub Gist: instantly share code, notes, and snippets.Gist
262588213843476
[https://gist.github.com/kooooohe/17818f61bcfe287eb2709466eaccbf7f]func fib(num int) int {
	if num <= 1 {
		return num
	}
	return fib(num-2) + fib(num-1)
}


これだとO(2^n)となるためかなり遅い。

※メモ化については今回は割愛 ]]></description><link>https://tech.anti-pattern.co.jp/gao-su-huibonatutishu-lie-wobinenogong-shi-woshi-igodeshi-zhuang-suru/</link><guid isPermaLink="false">Ghost__Post__60fab0573986b000013a3bd3</guid><category><![CDATA[fibonacci number]]></category><category><![CDATA[Go]]></category><category><![CDATA[golang]]></category><category><![CDATA[algorithm]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Sat, 22 Aug 2020 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/0_3BxGn-hH4T-yPdH9.jpeg" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="%E7%B5%90%E8%AB%96">結論</h3><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/0_3BxGn-hH4T-yPdH9.jpeg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/><p>O(log (n))となり</p><p>1000項目めを求めるには<strong>0.000199s</strong></p><p>10000項目めは<strong>0.000405s</strong>で求められました。</p><h3 id="%E5%AE%8C%E6%88%90%E5%93%81">完成品</h3><p><a href="https://github.com/kooooohe/fibonacci/blob/master/main.go" rel="noopener nofollow">https://github.com/kooooohe/fibonacci/blob/master/main.g</a>o</p><p/><h3 id="%E9%80%9A%E5%B8%B8%E3%81%AE%E5%86%8D%E5%B8%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%B0%A1%E5%8D%98%E3%81%AA%E8%A7%A3%E3%81%8D%E6%96%B9">通常の再帰を使った簡単な解き方</h3><p/><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/17818f61bcfe287eb2709466eaccbf7f"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_1.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">func fib(num int) int {
	if num &lt;= 1 {
		return num
	}
	return fib(num-2) + fib(num-1)
}
</code></pre>
<!--kg-card-end: markdown--><p>これだとO(2^n)となるためかなり遅い。</p><p>※メモ化については今回は割愛 メモ化すれば O(n)となる</p><h3 id="%E4%B8%80%E8%88%AC%E9%A0%85%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E5%85%AC%E5%BC%8F">一般項を求める公式</h3><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*3BxGn-hH4T-yPdH9" class="kg-image" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する" loading="lazy"/></figure><p>証明は漸化式を使うのだが、今回の主題ではないので割愛。</p><blockquote><em>興味ある方は: </em><a href="https://mathtrain.jp/fibonacci" rel="noopener"><em>https://mathtrain.jp/fibonacci</em></a></blockquote><p>これをGoで実装していく前に考えることがある。</p><p>`√5`は無理数であるため、プログラムでは表現できない。</p><p>丸め誤差が起きてしまい、100項目までいくと全然違う数値になってしまう。ただ今回は結果的に出てくる値が自然数になるため、それをうまく使うことにしよう。</p><p>いわゆる複素数的なものを作れば良い。</p><p>ということで今回の無理数√5を表現するための構造体からまずは作成する。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/49864a6391696556ffecabd8fca96ee1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_2.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">type fibNum struct {
	num               *big.Rat
	numMultipliedBySR *big.Rat
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*gWhZmE5AYGzyuFMX.png" class="kg-image" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する" loading="lazy"/></figure><p>となるためこの表現には</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/ec678aa10d459a214b9eca04d2192cb1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_3.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">a := big.NewRat(1, 2)
b := big.NewRat(1, 2)
fibNum{a, b}

</code></pre>
<!--kg-card-end: markdown--><p>これを使う。</p><p>同様にしてこのビネの公式をこの構造体を使い表すと</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/2704104a6cb796fd376c948fe21118c5"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_4.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">a := big.NewRat(1, 2)
b := big.NewRat(1, 2)
fibNum{a, b}
</code></pre>
<!--kg-card-end: markdown--><p>このようになる。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*3BxGn-hH4T-yPdH9" class="kg-image" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する" loading="lazy"/></figure><h4 id="%E5%90%84%E9%96%A2%E6%95%B0%E3%81%AE%E5%AE%9F%E8%A3%85">各関数の実装</h4><h4 id="%E4%B9%97%E7%AE%97%E5%AE%9F%E8%A3%85">乗算実装</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*UKrzkTRFdyDK13Ub.png" class="kg-image" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する" loading="lazy"/></figure><p>上記の式変形を利用して、 <code>fibNum</code>構造体の乗算を実装する</p><p>a,c= fibNum.num</p><p>b,d = fibNum.numMultipliedBySR と置き換えてもらえれば良い。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/abc5d6d4c5a920248ac3be026891c6ec"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_5.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
//(a+b√5)(c+d√5) = (ac+5bd)+(ad+bc)√5
func fibMul(t1, t2 fibNum) (r fibNum) {
	//(ac+5bd)
	var r1, r2 *big.Rat
	tmp1 := new(big.Rat).Mul(t1.num, t2.num)
	tmp2 := new(big.Rat).Mul(
		new(big.Rat).Mul(t1.numMultipliedBySR, t2.numMultipliedBySR),
		big.NewRat(5, 1),
	)
	r1 = new(big.Rat).Add(tmp1, tmp2)

	//(ad+bc)√5
	tmp3 := new(big.Rat).Mul(t1.num, t2.numMultipliedBySR)
	tmp4 := new(big.Rat).Mul(t1.numMultipliedBySR, t2.num)
	r2 = new(big.Rat).Add(tmp3, tmp4)

	//(ac+5bd)+(ad+bc)√5
	//new(big.Rat).Add(r3, rr3)

	r.num = r1
	r.numMultipliedBySR = r2
	return
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="%E7%B4%AF%E4%B9%97%E5%AE%9F%E8%A3%85">累乗実装</h4><p>これは作成済みのfibMul関数を流用すれば簡単である。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/3887b0ddd4cdc463b8f0520d2702ec98"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_6.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">func fibExp(t fibNum, n int) (r fibNum) {
	r := t
	for i := 1; i &lt; n; i++ {
		r = fibMul(t, r)
	}
	return
}
</code></pre>
<!--kg-card-end: markdown--><p>簡単な実装はこうだが、このアルゴリズムでは</p><p>O(n)の時間がかかってしまう。</p><h4 id="%E9%AB%98%E9%80%9F%E6%8C%87%E6%95%B0%E8%A8%88%E7%AE%97%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0">高速指数計算アルゴリズム</h4><p>そこで<strong>高速指数計算アルゴリズム</strong>を実装していく</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/f0562f7b847dab43a2a5e5f1b274a7cb"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_7.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
func fibExp(t fibNum, n int) fibNum {

	r := t

	// 1
	a := fibNum{num: big.NewRat(1, 1), numMultipliedBySR: big.NewRat(0, 999)}

	for n &gt; 1 {
		if n%2 == 1 {
			a = fibMul(a, r)
		}
		r = fibMul(r, r)
		n = n / 2
	}

	return fibMul(r, a)
}
</code></pre>
<!--kg-card-end: markdown--><p>すでに計算したものの2乗が使えるものは使っていこうという作戦</p><p>例: 2¹⁶ = (((2²)²)²)² といった具合である。</p><p>もちろんこれのみでは表現できない場合もあるが、それはaとして計算をしておいて最後に掛け合わせている。</p><p>これにより O(log(n)) まで高速化</p><p>6行目は、初期値である1を表現している。</p><h4 id="%E6%B8%9B%E7%AE%97%E5%AE%9F%E8%A3%85">減算実装</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/3892adcc05f1fd947330cbcf9686abb6"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_7.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">func fibMin(t1, t2 fibNum) (r fibNum) {
	r1 := new(big.Rat).Add(
		t1.num,
		new(big.Rat).Mul(t2.num, big.NewRat(-1, 1)),
	)

	r2 := new(big.Rat).Add(
		t1.numMultipliedBySR,
		new(big.Rat).Mul(t2.numMultipliedBySR, big.NewRat(-1, 1)),
	)

	r.num = r1
	r.numMultipliedBySR = r2
	return
}
</code></pre>
<!--kg-card-end: markdown--><p>これは特に難しいことはしていないのだが、一点、</p><p>math/big pkgには減算関数はなかったため、-1倍したものを足す形で実装した。</p><h4 id="%E9%99%A4%E7%AE%97%E5%AE%9F%E8%A3%85">除算実装</h4><p>最後に√5で割る処理が入っているが、1/√5 = 1/5 * √5 なため。</p><p>これをfibMulに渡せば同等の処理をできるため、特に実装することはなし。</p><h4 id="%E8%A8%88%E6%B8%AC">計測</h4><p>1000項目目を求めるには0.000199s</p><p>10000項目目は0.000405s</p><p>とかなり高速に求められる。</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://cdn-images-1.medium.com/max/2560/1*E4HQ6pG1tsM2Abw4i21Wdg.png" class="kg-image" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する" loading="lazy"/></figure><h3 id="%E5%85%A8%E4%BD%93%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89">全体のコード</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/b6734ef092992466f4c0c3a0f44688b8"><div class="kg-bookmark-content"><div class="kg-bookmark-title">fib_blog_8.go</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="【高速】フィボナッチ数列をビネの公式を使いGoで実装する"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
package main

import (
	&quot;fmt&quot;
	&quot;math/big&quot;
)

type fibNum struct {
	num               *big.Rat
	numMultipliedBySR *big.Rat
}

func main() {
	//println(fib(10000))
	fmt.Println(calcFib(10000))
}

// (((1+√5)/2)^n - ((1-√5)/2)^n) / √5
func calcFib(n int) *big.Int {
	// (1+√5)/2
	a := big.NewRat(1, 2)
	b := big.NewRat(1, 2)
	x := fibNum{a, b}

	// (1-√5)/2
	c := big.NewRat(1, 2)
	d := big.NewRat(-1, 2)
	y := fibNum{c, d}

	// (1/√5)
	e := big.NewRat(0, 999)
	f := big.NewRat(1, 5)
	z := fibNum{e, f}

	tmp := fibMin(fibExp(x, n), fibExp(y, n))

	// *(1/√5)
	r := fibMul(tmp, z)
	return r.num.Num()

}

func fibExp(t fibNum, n int) fibNum {

	r := t

	// 1
	a := fibNum{num: big.NewRat(1, 1), numMultipliedBySR: big.NewRat(0, 999)}

	for n &gt; 1 {
		if n%2 == 1 {
			a = fibMul(a, r)
		}
		r = fibMul(r, r)
		n = n / 2
	}

	return fibMul(r, a)
}

/*
func fibExp(t fibNum, n int) (r fibNum) {
	tmp := t
	for i := 1; i &lt; n; i++ {
		tmp = fibMul(t, tmp)
	}
	r = tmp
	return
}
*/

func fibMin(t1, t2 fibNum) (r fibNum) {
	r1 := new(big.Rat).Add(
		t1.num,
		new(big.Rat).Mul(t2.num, big.NewRat(-1, 1)),
	)

	r2 := new(big.Rat).Add(
		t1.numMultipliedBySR,
		new(big.Rat).Mul(t2.numMultipliedBySR, big.NewRat(-1, 1)),
	)

	r.num = r1
	r.numMultipliedBySR = r2
	return
}

//(a+b√5)(c+d√5) = (ac+5bd)+(ad+bc)√5
func fibMul(t1, t2 fibNum) (r fibNum) {
	//(ac+5bd)
	var r1, r2 *big.Rat
	tmp1 := new(big.Rat).Mul(t1.num, t2.num)
	tmp2 := new(big.Rat).Mul(
		new(big.Rat).Mul(t1.numMultipliedBySR, t2.numMultipliedBySR),
		big.NewRat(5, 1),
	)
	r1 = new(big.Rat).Add(tmp1, tmp2)

	//(ad+bc)√5
	tmp3 := new(big.Rat).Mul(t1.num, t2.numMultipliedBySR)
	tmp4 := new(big.Rat).Mul(t1.numMultipliedBySR, t2.num)
	r2 = new(big.Rat).Add(tmp3, tmp4)

	//(ac+5bd)+(ad+bc)√5
	//rrr := new(big.Rat).Add(r3, rr3)

	r.num = r1
	r.numMultipliedBySR = r2
	return
}

func fib(num int) int {
	if num &lt;= 1 {
		return num
	}
	return fib(num-2) + fib(num-1)
}
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[BIG-IPの脆弱性の対応！]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

最近、とても暑い日が続いてますね
私は在宅で仕事をしていますが、たまに外に出ると暑すぎで
汗が止まりません。

今回のブログは、冷や汗をかいた、脆弱性 CVE-2020–5902の対応について書こうと思います。

CVE-2020–5902影響範囲は？
参考）https://support.f5.com/csp/article/K52145254

> This vulnerability allows for unauthenticated attackers, or authenticated users,
with network access to the Configuration utility, through the BIG-IP management
port and/or self IPs, to execute arbitrary system commands, create or delete
files, disable services, and/or execute arbitrary Java cod]]></description><link>https://tech.anti-pattern.co.jp/big-ipnocui-ruo-xing-nodui-ying/</link><guid isPermaLink="false">Ghost__Post__610e29a53986b000013a54af</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Thu, 20 Aug 2020 06:40:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-7.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-7.jpg" alt="BIG-IPの脆弱性の対応！"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>最近、とても暑い日が続いてますね<br>
私は在宅で仕事をしていますが、たまに外に出ると暑すぎで<br>
汗が止まりません。</br></br></p>
<p>今回のブログは、冷や汗をかいた、脆弱性 CVE-2020–5902の対応について書こうと思います。</p>
<h3 id="cve-2020%E2%80%935902%E5%BD%B1%E9%9F%BF%E7%AF%84%E5%9B%B2%E3%81%AF%EF%BC%9F">CVE-2020–5902影響範囲は？</h3>
<p>参考）<a href="https://support.f5.com/csp/article/K52145254">https://support.f5.com/csp/article/K52145254</a></p>
<blockquote>
<p>This vulnerability allows for unauthenticated attackers, or authenticated users, with network access to the Configuration utility, through the BIG-IP management port and/or self IPs, to execute arbitrary system commands, create or delete files, disable services, and/or execute arbitrary Java code. This vulnerability may result in complete system compromise. The BIG-IP system in Appliance mode is also vulnerable. This issue is not exposed on the data plane; only the control plane is affected.</p>
</blockquote>
<p>攻撃者は、BIG-IPのトラフィック管理ユーザインターフェース（TMUI）に対する脆弱性を利用して、コマンドの実行、ファイルの作成/削除、サービスの停止、Javaコードの実行を任意に行う可能性がある<br>
また、システムが完全に侵害される可能性がある</br></p>
<p>結構やばいやつだ。</p>
<h3 id="%E8%AA%BF%E6%9F%BB%E9%96%8B%E5%A7%8B">調査開始</h3>
<p>恒久対応はファームウェアのアップグレードですが、直ぐにはできません。まずは、サポートサイトの記載通り緩和策をとることにしました。</p>
<h3 id="%E7%B7%A9%E5%92%8C%E7%AD%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">緩和策について</h3>
<p>BIG-IPのトラフィック管理ユーザインターフェース（TMUI）で使用されるWebサーバ(httpd)に対して、LocationMatchディレクティブを設定し、URLに含まれる特定の文字があった場合にアクセスできなくします。</p>
<p>１回目<br>
最初にサポートから提供された情報です。</br></p>
<pre><code>&lt;LocationMatch &quot;.*\.\.;.*&quot;&gt;
Redirect 404 /
&lt;/LocationMatch&gt;
</code></pre>
<p>2回目<br>
1回目に提供された情報が訂正されました。</br></p>
<pre><code>&lt;LocationMatch &quot;;&quot;&gt;
Redirect 404 /
&lt;/LocationMatch&gt;
</code></pre>
<p>3回目<br>
そして、更に追加されました。</br></p>
<pre><code>&lt;LocationMatch &quot;;&quot;&gt;
Redirect 404 /
&lt;/LocationMatch&gt;
&lt;LocationMatch &quot;hsqldb&quot;&gt;
Redirect 404 /
&lt;/LocationMatch&gt;
</code></pre>
<p>約2週間ぐらいですが、サポートページもどんどん更新されてます。<br>
AskF5のサイトも更新が続きます。<a href="https://support.f5.com/csp/article/K52145254">https://support.f5.com/csp/article/K52145254</a></br></p>
<h3 id="%E6%81%92%E4%B9%85%E5%AF%BE%E5%BF%9C%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6">恒久対応に向けて</h3>
<p>脆弱性が対策されたファームウェアがサポートより提供されましたので、<br>
適用の準備です。手順書を作りリハーサルを3回実施しました。<br>
また、このファームウェアにはCVE-2017–5754 (Meltdown)の対応がされています。そのため、パフォーマンスの検証が必要となりました。</br></br></p>
<h3 id="%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E6%A4%9C%E8%A8%BC">パフォーマンス検証</h3>
<p>今回は、ファームウェアのアップグレード前後でCPU、メモリの使用率に注目して15%以上の劣化がないかを確認します。</p>
<p>【準備】<br>
負荷ツールはJMeterを使い、1秒間に3リクエストを送るスレッドを100立ち上げ、10分間実行します。（ログインの部分は1度だけ実施されるのでここでは数から除外してます）</br></p>
<p>【結果】<br>
2回実行して確認しました。アップグレード前後でCPU、メモリとも大きな変化はありませんでした。</br></p>
<h3 id="%E6%81%92%E4%B9%85%E5%AF%BE%E5%BF%9C">恒久対応</h3>
<p>パフォーマンス検証も問題なかったので、本番環境に脆弱性が対策されたファームウェアを適用しました。</p>
<h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3>
<p>今回の事象でアタックは確認できませんでしたが、脆弱性が発表されると高確率でゼロディアタックされると思って良いです。<br>
別の脆弱性が発見された際に、私が携わっていたシステムは実際にゼロディアタックを受けました。幸い被害はありませんでしたが、その時の教訓から私はこの様に考えて行動しています。</br></p>
<p>・脆弱性は無くならないものという前提に立つ<br>
・IPA、JVNなどサイトで脆弱性情報を定期的に確認する<br>
・パフォーマンス検証できる様にする<br>
・対応する際は慌てず、諦めない！</br></br></br></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Juliaでフィボナッチ数列/ビネの公式を表現してみたい]]></title><description><![CDATA[Juliaとは
Juliaは何やら数学向きな言語らしく、チラホラと名前を見る機会があったので、触ってみました。

「フレキシブルな動的プログラミング言語であり、科学分野や計算処理におけるプログラミングに適し、これまでの静的プログラミング言語に匹敵するパフォーマンスを提供」するとのこと。
https://hshindo.github.io/julia-doc-ja-v0.6/manual/introduction.html

ダウンロード
https://julialang.org/downloads/
公式サイトから任意のバージョンのJuliaをダウンロードしてください。今回は1.5を使用してます。

dmgファイルを実行し、appファイルをApplicationフォルダに入れれば準備完了。

appファイルを実行すると、ターミナルが起動し、Juliaが起動した状態となります。

算術演算式
Juliaでは数式を書くように算術演算式を記載することができます。

julia> x = 10  
10  
julia> y = 2x+1  
21


例えば、一辺を10,8とする直角三角形]]></description><link>https://tech.anti-pattern.co.jp/fibonacci-binet-formula-in-julia/</link><guid isPermaLink="false">Ghost__Post__61014bf63986b000013a407c</guid><category><![CDATA[Julia]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 11 Aug 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/julia-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="julia%E3%81%A8%E3%81%AF">Juliaとは</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/julia-1-1.png" alt="Juliaでフィボナッチ数列/ビネの公式を表現してみたい"/><p>Juliaは何やら数学向きな言語らしく、チラホラと名前を見る機会があったので、触ってみました。</p>
<p>「フレキシブルな動的プログラミング言語であり、科学分野や計算処理におけるプログラミングに適し、これまでの静的プログラミング言語に匹敵するパフォーマンスを提供」するとのこと。<br>
<a href="https://hshindo.github.io/julia-doc-ja-v0.6/manual/introduction.html">https://hshindo.github.io/julia-doc-ja-v0.6/manual/introduction.html</a></br></p>
<h2 id="%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">ダウンロード</h2>
<p><a href="https://julialang.org/downloads/">https://julialang.org/downloads/</a><br>
公式サイトから任意のバージョンのJuliaをダウンロードしてください。今回は1.5を使用してます。</br></p>
<p>dmgファイルを実行し、appファイルをApplicationフォルダに入れれば準備完了。</p>
<p>appファイルを実行すると、ターミナルが起動し、Juliaが起動した状態となります。</p>
<h2 id="%E7%AE%97%E8%A1%93%E6%BC%94%E7%AE%97%E5%BC%8F">算術演算式</h2>
<p>Juliaでは数式を書くように算術演算式を記載することができます。</p>
<pre><code>julia&gt; x = 10  
10  
julia&gt; y = 2x+1  
21
</code></pre>
<p>例えば、一辺を10,8とする直角三角形があった場合、(単位は考慮しない)<br>
xはピタゴラスの定理を用いつつ、平方根を計算するsqrtを使って算出することができます。</br></p>
<pre><code>julia&gt; a = 10  
10  
julia&gt; b = 8  
8  
julia&gt; x = sqrt((a^2) - (b^2))  
6
</code></pre>
<h2 id="%E9%85%8D%E5%88%97">配列</h2>
<p>表題とはあまり関係ないのですが、慣れが必要だと感じたのは配列。<br>
配列を定義すると入れた値によって何の配列なのか出力されます。</br></p>
<pre><code>julia&gt; a = \[1, 2, 3\]  
3-element Array{Int64,1}:  
 1  
 2  
 3julia&gt; a = \[&quot;anti&quot;, &quot;pat&quot;, &quot;tern&quot;\]  
3-element Array{String,1}:  
 &quot;anti&quot;  
 &quot;pat&quot;  
 &quot;tern&quot;
</code></pre>
<p>ここまではいいのですが、antiを参照する際には <em>a[1]</em> と入力します。<br>
0番目というものに慣れてしまった人には逆に分かりにくい！</br></p>
<h2 id="%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0%E5%88%97%E3%81%AB%E3%83%88%E3%83%A9%E3%82%A4">フィボナッチ数列にトライ</h2>
<p>ではやってみます。</p>
<p>sqrtのようにJuliaには様々数学に使う関数がデフォルトで定義されています。また、定数も珍しいものがあります。</p>
<pre><code>julia&gt; Base.MathConstants.golden  
φ = 1.6180339887498...

julia&gt; 1\*(Base.MathConstants.golden)  
1.618033988749895
</code></pre>
<p>黄金数φですね。<br>
折角なのでこれを使ってフィボナッチ数列をビネの公式を使い解いてみようとします。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/----------2022-04-12-18.45.58.png" alt="Juliaでフィボナッチ数列/ビネの公式を表現してみたい" loading="lazy"/></p>
<p>画像はwikipediaより参照<br>
<a href="https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0">https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0</a></br></p>
<pre><code>julia&gt; n = 6  
6  
julia&gt; φ = Base.MathConstants.golden  
φ = 1.6180339887498...  
julia&gt; Fn = ((φ^n) - (-φ)^-n) / sqrt(5)  
8.0
</code></pre>
<p>結構そのままスッキリ書けますが、当然nが大きなると丸め誤差が起きてしまいます。</p>
<pre><code>julia&gt; n = 10  
10

julia&gt; φ = Base.MathConstants.golden  
φ = 1.6180339887498...

julia&gt; Fn = ((φ^n) - (-φ)^-n) / sqrt(5)  
54.99999999999999
</code></pre>
<p>ふむふむ、、、使いどころが難しそうです。</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[持続化給付金の添付書類の不備対処法と入金までの流れ]]></title><description><![CDATA[先月「持続化給付金」の申請をしたのですが、しっかり準備したつもりが一度不備になったので、その時の不備内容と対処方法をご紹介します！

■不備があると言われた添付書類
・税理士の署名・押印のある書類（※1.通常は確定申告書類を提出）
・対象月の売上台帳等※「売上減少の対象月」と同じ月の売上台帳

※1.弊社は2019年7月創業のため確定申告が完了しておらず、特例「A-1
直前の事業年度の確定申告が完了していない場合」を使用。税理士による署名及び押印がなされた事業収入証明書(2019年7月-12月)を提出しました。

■指摘された不備内容
> 申請内容・添付に不備がありましたので修正してください
「法人確定申告書」又はそれに代わる書類と法人番号が一致していませんでした。
「売上台帳」として認められない画像が添付されていました。持続化給付金申請要領を参考に、有効な書類を添付してください。
不備特記事
■添付頂いた《事業収入証明書》の2枚目に、月別の売上金額が記載されておりません。
■添付頂いた《売上台帳》が有効ではない書類です。売上台帳として有効な書類を添付してください。 ※対象となる売上月]]></description><link>https://tech.anti-pattern.co.jp/zizokuka-kyuhukin/</link><guid isPermaLink="false">Ghost__Post__610a4c333986b000013a4f90</guid><dc:creator><![CDATA[Sumomo Moriguchi]]></dc:creator><pubDate>Tue, 11 Aug 2020 08:15:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>先月「持続化給付金」の申請をしたのですが、しっかり準備したつもりが一度不備になったので、その時の不備内容と対処方法をご紹介します！</p>
<h2 id="%E2%96%A0%E4%B8%8D%E5%82%99%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%9F%E6%B7%BB%E4%BB%98%E6%9B%B8%E9%A1%9E">■不備があると言われた添付書類</h2>
<p><strong>・税理士の署名・押印のある書類</strong>（※1.通常は確定申告書類を提出）<br>
<strong>・対象月の売上台帳等※「売上減少の対象月」と同じ月の売上台帳</strong></br></p>
<p>※1.弊社は2019年7月創業のため確定申告が完了しておらず、特例「A-1 直前の事業年度の確定申告が完了していない場合」を使用。税理士による署名及び押印がなされた事業収入証明書(2019年7月-12月)を提出しました。</p>
<h2 id="%E2%96%A0%E6%8C%87%E6%91%98%E3%81%95%E3%82%8C%E3%81%9F%E4%B8%8D%E5%82%99%E5%86%85%E5%AE%B9">■指摘された不備内容</h2>
<blockquote>
<p><strong>申請内容・添付に不備がありましたので修正してください</strong><br>
「法人確定申告書」又はそれに代わる書類と法人番号が一致していませんでした。<br>
「売上台帳」として認められない画像が添付されていました。持続化給付金申請要領を参考に、有効な書類を添付してください。<br>
<strong>不備特記事</strong><br>
■添付頂いた《事業収入証明書》の2枚目に、月別の売上金額が記載されておりません。<br>
■添付頂いた《売上台帳》が有効ではない書類です。売上台帳として有効な書類を添付してください。 ※対象となる売上月の【売上額】の【合計】を記載してください。</br></br></br></br></br></p>
</blockquote>
<p>うーん。。</p>
<p><strong>・事業収入証明書(2019年7–12月)に法人番号を書く？<br>
・事業収入証明書(2019年7–12月)の各月の終わりと、対象月の売上台帳に手書きで月毎の売上額の合計を書き足せば良い？</br></strong></p>
<p>という事でしょうか・・・？</p>
<p>不備内容を読んでもいまいちよく分からなかったのですが、再度不備にはなりたくないので、思いつく事は全部試してみました。<br>
（結果、二度目は不備なく審査が通ったので良かったです！）</br></p>
<h2 id="%E2%96%A0%E4%B8%8D%E5%82%99%E6%9B%B8%E9%A1%9E%E3%81%AE%E4%BF%AE%E6%AD%A3%E7%AE%87%E6%89%80">■不備書類の修正箇所</h2>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/zizokuka-1.png" alt="zizokuka-1" loading="lazy"/></p>
<blockquote>
<p>「法人確定申告書」又はそれに代わる書類と法人番号が一致していませんでした。</p>
</blockquote>
<p><strong>=&gt;「事業収入証明書」の1枚目に法人番号を書き足してみる。</strong><br>
法人番号を記載するように！との注意書きは他のサイトでは見つけられなかったので必要ないかもですが、念の為、書けるものは書きます！笑</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/zizokuka-2.png" alt="zizokuka-2" loading="lazy"/></p>
<blockquote>
<p>添付頂いた《事業収入証明書》の2枚目に、月別の売上金額が記載されておりません。</p>
</blockquote>
<p><strong>=&gt;「事業収入証明書」の各月の終わりに、月毎の売上金額を書き足す。</strong><br>
会計ソフトから出力したものを使用しましたが、月毎の合計金額は記載されなかったので、手書きで書き足しました！</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/zizokuka-3.png" alt="zizokuka-3" loading="lazy"/></p>
<blockquote>
<p>添付頂いた《売上台帳》が有効ではない書類です。売上台帳として有効な書類を添付してください。 ※対象となる売上月の【売上額】の【合計】を記載してください。</p>
</blockquote>
<p><strong>=&gt;「対象月の売上台帳」の最終ページに、売上額の合計を書き足す。</strong><br>
「事業収入証明書」と同じように、手書きで月と金額を書き足しました！</br></p>
<p>こんな感じで数箇所書き足して再度申請したところ、二度目の審査は無事に通りました〜！<br>
ただ「審査が通りました」というメールは来ないので、入金されて気付くという感じでした！（給付のお知らせハガキは後日届きました）</br></p>
<h2 id="%E2%96%A0%E7%94%B3%E8%AB%8B%E3%81%8B%E3%82%89%E5%85%A5%E9%87%91%E3%81%BE%E3%81%A7%E3%81%AE%E6%B5%81%E3%82%8C">■申請から入金までの流れ</h2>
<p><strong>7/20(月)夜、一度目の申請<br>
↓<br>
7/22(水)朝、不備メールが届く<br>
↓<br>
7/24(金)夜、不備を修正し再度申請<br>
↓<br>
7/28(火)、入金！</br></br></br></br></br></br></strong></p>
<p>あくまで弊社の場合ですが、<br>
申請してから1,2日でチェックをされているようで、<br>
不備の連絡がくるのも振込されるのもとても早かったですよ〜！</br></br></p>
<p>以上、これから申請される方のお役に立てれば幸いです！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Firestoreの書き込み速度の検証]]></title><description><![CDATA[結論
1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。



Firestoreの書き込み制限
Firestoreは書き込み時にいくつかの制限があります。詳しくは
https://firebase.google.com/docs/firestore/quotas
[https://firebase.google.com/docs/firestore/quotas?hl=ja] にあります。

今回気になったのは4番目の制限です。ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限、という事です。

※2022/05/11 追記

制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。



あるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも？という話になりました。書き込み速度について調べていると以下の記事を見つけました。

Firestoreに負荷試験(L]]></description><link>https://tech.anti-pattern.co.jp/firestoren-write/</link><guid isPermaLink="false">Ghost__Post__6103f3e53986b000013a44b3</guid><category><![CDATA[Firestore]]></category><category><![CDATA[golang]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Fri, 31 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E7%B5%90%E8%AB%96">結論</h2>
<p>1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.11.13.png" alt="----------2022-05-11-10.11.13" loading="lazy"/></p>
<h2 id="firestore%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E5%88%B6%E9%99%90">Firestoreの書き込み制限</h2>
<p>Firestoreは書き込み時にいくつかの制限があります。詳しくは<a href="https://firebase.google.com/docs/firestore/quotas?hl=ja">https://firebase.google.com/docs/firestore/quotas</a> にあります。</p>
<p>今回気になったのは4番目の制限です。<strong>ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限</strong>、という事です。</p>
<p>※2022/05/11 追記</p>
<p>制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.14.04.png" alt="----------2022-05-11-10.14.04" loading="lazy"/></p>
<p>あるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも？という話になりました。書き込み速度について調べていると以下の記事を見つけました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/Yatima/items/2abb633191080ee1447c?utm_content&#x3D;buffera86fe&amp;utm_medium&#x3D;social&amp;utm_source&#x3D;facebook.com&amp;utm_campaign&#x3D;buffer"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Firestoreに負荷試験(Loadroid)してみた+補足 - Qiita</div><div class="kg-bookmark-description">こちらの記事は，Firebase.yebisu #1のLTに補足解説を加えたものになります．発表スライド当日お話できなかった，実施する際の注意などもありますので，ごさしゅーください． tl;dr 高頻度のドキュメント作成（自...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">Yatima</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1SbWx5WlhOMGIzSmw0NEdyNkxLZzZJMjM2S21tNmFpVEtFeHZZV1J5YjJsa0tlT0JsLU9CcHVPQnYtT0JueXZvbzV6b3RyTSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz03OTFiNDk4MzJhM2JmNjY0YmRlMmVjOWZkYTE4N2ExNA&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RRmxoZEdsdFlRJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NDUmdHh0LWFsaWduPXJpZ2h0JTJDYm90dG9tJnM9Yjk3NGQ4YzE0MTkwZGM4N2M5MDBlM2EwYjViYzQ2MjI&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;c8821aef00f52ee4a9157d66992585af"/></div></a></figure><p>この記事では10秒間で70,000件のdocumentの登録に成功されたようです。負荷を少しずつ上げていけば 500/s の制限を超えられるみたいです。少しずつ負荷を上げるとスケールできることは以下に書いてあります。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/firestore/best-practices?hl&#x3D;ja#ramping_up_traffic"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cloud Firestore のベスト プラクティス | Firebase</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/touchicon-180.png"><span class="kg-bookmark-author">Firebase</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/lockup.png"/></div></a></figure><!--kg-card-begin: markdown--><p>どのような条件の時に 500/s の制限に引っかかるのか気になったので試してみることにしました。</p>
<h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)</li>
<li>Ubuntu 20.04 LTS</li>
<li>Docker 19.03.13</li>
<li>Golang 1.14.9</li>
<li>cloud.google.com/go/firestore 1.3.0</li>
</ul>
<h2 id="%E8%B2%A0%E8%8D%B7%E3%82%92%E5%BE%90%E3%80%85%E3%81%AB%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%BF%E3%82%8B">負荷を徐々に上げてみる</h2>
<p>上の記事を参考に、以下のような処理を書いて試してみました。</p>
<p>500件のバッチ書き込みを実行<br>
=&gt; 500件のバッチ書き込みを2並列で実行<br>
=&gt; 500件のバッチ書き込みを4並列で実行<br>
=&gt; 500件のバッチ書き込みを8並列で実行<br>
=&gt; (10,000件まで繰り返す)</br></br></br></br></p>
<p>コード全体は以下になります。3つの変数（一度のバッチ書き込みの件数、登録件数、初回書き込み時の並列数）を変えられるように実装しました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105569020" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore_limit_test-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore_limit_test-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore_limit_test-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore_limit_test-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore_limit_test-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore_limit_test-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;context&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore_limit_test-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;flag&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore_limit_test-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore_limit_test-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore_limit_test-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;os&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore_limit_test-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;strconv&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore_limit_test-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;sync&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore_limit_test-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;time&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore_limit_test-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore_limit_test-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;cloud.google.com/go/firestore&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore_limit_test-go-LC14" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore_limit_test-go-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore_limit_test-go-LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> (</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-firestore_limit_test-go-LC17" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">size</span>  <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;size&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;chunk size&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-firestore_limit_test-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">total</span> <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;total&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;total count&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-firestore_limit_test-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">multi</span> <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;multi&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;multi&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-firestore_limit_test-go-LC20" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-firestore_limit_test-go-LC21" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-firestore_limit_test-go-LC22" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-firestore_limit_test-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">flag</span>.<span class="pl-en">Parse</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-firestore_limit_test-go-LC24" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-firestore_limit_test-go-LC25" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">ctx</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">Background</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-firestore_limit_test-go-LC26" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-firestore_limit_test-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">client</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">firestore</span>.<span class="pl-en">NewClient</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;PROJECT_ID&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-firestore_limit_test-go-LC28" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-firestore_limit_test-go-LC29" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Fatal</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-firestore_limit_test-go-LC30" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-firestore_limit_test-go-LC31" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-firestore_limit_test-go-LC32" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span> <span class="pl-c1">:=</span> <span class="pl-en">generateDocumentData</span>(<span class="pl-s1">client</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-firestore_limit_test-go-LC33" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-firestore_limit_test-go-LC34" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;create&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-firestore_limit_test-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">exec</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">data</span>, <span class="pl-s1">create</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-firestore_limit_test-go-LC36" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-firestore_limit_test-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;update&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-firestore_limit_test-go-LC38" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">exec</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">data</span>, <span class="pl-s1">update</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-firestore_limit_test-go-LC39" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// exec(ctx, client, data, updateIncrement)</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-firestore_limit_test-go-LC40" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// exec(ctx, client, data, updateArrayUnion)</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-firestore_limit_test-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// exec(ctx, client, data, updateServerTimestamp)</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-firestore_limit_test-go-LC42" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-firestore_limit_test-go-LC43" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;read&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-firestore_limit_test-go-LC44" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">read</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-firestore_limit_test-go-LC45" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-firestore_limit_test-go-LC46" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// fmt.Println(&quot;delete&quot;)</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-firestore_limit_test-go-LC47" class="blob-code blob-code-inner js-file-line">	<span class="pl-c">// exec(ctx, client, data, delete)</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-firestore_limit_test-go-LC48" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-firestore_limit_test-go-LC49" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-firestore_limit_test-go-LC50" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">panicIf</span>(<span class="pl-s1">err</span> <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-firestore_limit_test-go-LC51" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-firestore_limit_test-go-LC52" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-firestore_limit_test-go-LC53" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-firestore_limit_test-go-LC54" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-firestore_limit_test-go-LC55" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-firestore_limit_test-go-LC56" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">generateDocumentData</span>(<span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>) []<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{} {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-firestore_limit_test-go-LC57" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">limit</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">size</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-firestore_limit_test-go-LC58" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">totalCount</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">total</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-firestore_limit_test-go-LC59" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">count</span> <span class="pl-c1">:=</span> <span class="pl-s1">totalCount</span><span class="pl-c1">/</span><span class="pl-s1">limit</span> <span class="pl-c1">+</span> <span class="pl-c1">1</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-firestore_limit_test-go-LC60" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}, <span class="pl-c1">0</span>, <span class="pl-s1">count</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-firestore_limit_test-go-LC61" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-firestore_limit_test-go-LC62" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">j</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">j</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">count</span>; <span class="pl-s1">j</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-firestore_limit_test-go-LC63" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">min</span> <span class="pl-c1">:=</span> <span class="pl-s1">limit</span> <span class="pl-c1">*</span> <span class="pl-s1">j</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-firestore_limit_test-go-LC64" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">max</span> <span class="pl-c1">:=</span> <span class="pl-s1">limit</span> <span class="pl-c1">*</span> (<span class="pl-s1">j</span> <span class="pl-c1">+</span> <span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-firestore_limit_test-go-LC65" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">max</span> <span class="pl-c1">&gt;</span> <span class="pl-s1">totalCount</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-firestore_limit_test-go-LC66" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">max</span> <span class="pl-c1">=</span> <span class="pl-s1">totalCount</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-firestore_limit_test-go-LC67" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-firestore_limit_test-go-LC68" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">min</span> <span class="pl-c1">==</span> <span class="pl-s1">max</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-firestore_limit_test-go-LC69" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">break</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-firestore_limit_test-go-LC70" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-firestore_limit_test-go-LC71" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">results</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}, <span class="pl-s1">limit</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-firestore_limit_test-go-LC72" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-s1">min</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">max</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-firestore_limit_test-go-LC73" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">doc</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">NewDoc</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-firestore_limit_test-go-LC74" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">results</span>[<span class="pl-s1">doc</span>] <span class="pl-c1">=</span> <span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}{</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-firestore_limit_test-go-LC75" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;title&quot;</span>:        <span class="pl-s">&quot;title_&quot;</span> <span class="pl-c1">+</span> <span class="pl-s1">strconv</span>.<span class="pl-en">FormatInt</span>(<span class="pl-en">int64</span>(<span class="pl-s1">i</span>), <span class="pl-c1">10</span>),</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-firestore_limit_test-go-LC76" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;tags&quot;</span>:         []<span class="pl-smi">string</span>{<span class="pl-s">&quot;tag_1&quot;</span>, <span class="pl-s">&quot;tag_2&quot;</span>, <span class="pl-s">&quot;tag_3&quot;</span>},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-firestore_limit_test-go-LC77" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;author_id&quot;</span>:    <span class="pl-s">&quot;author_id_&quot;</span> <span class="pl-c1">+</span> <span class="pl-s1">strconv</span>.<span class="pl-en">FormatInt</span>(<span class="pl-en">int64</span>(<span class="pl-s1">i</span>), <span class="pl-c1">10</span>),</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-firestore_limit_test-go-LC78" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;view_count&quot;</span>:   <span class="pl-s1">i</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-firestore_limit_test-go-LC79" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;is_published&quot;</span>: <span class="pl-c1">true</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-firestore_limit_test-go-LC80" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;text&quot;</span>:         <span class="pl-s">&quot;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-firestore_limit_test-go-LC81" class="blob-code blob-code-inner js-file-line">				<span class="pl-c">// &quot;update_timestamp&quot;: firestore.ServerTimestamp,</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-firestore_limit_test-go-LC82" class="blob-code blob-code-inner js-file-line">			}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-firestore_limit_test-go-LC83" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-firestore_limit_test-go-LC84" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">data</span>, <span class="pl-s1">results</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-firestore_limit_test-go-LC85" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-firestore_limit_test-go-LC86" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">data</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-firestore_limit_test-go-LC87" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-firestore_limit_test-go-LC88" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-firestore_limit_test-go-LC89" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">exec</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">data</span> []<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-firestore_limit_test-go-LC90" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">execFunc</span> <span class="pl-k">func</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{})) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-firestore_limit_test-go-LC91" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-firestore_limit_test-go-LC92" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-firestore_limit_test-go-LC93" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;start&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-firestore_limit_test-go-LC94" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-firestore_limit_test-go-LC95" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">multi</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">multi</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-firestore_limit_test-go-LC96" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-firestore_limit_test-go-LC97" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">dataLen</span> <span class="pl-c1">:=</span> <span class="pl-en">len</span>(<span class="pl-s1">data</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-firestore_limit_test-go-LC98" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">current</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-firestore_limit_test-go-LC99" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-firestore_limit_test-go-LC100" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">wg</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">WaitGroup</span>{}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-firestore_limit_test-go-LC101" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">multi</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-firestore_limit_test-go-LC102" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">articles</span> <span class="pl-c1">:=</span> <span class="pl-s1">data</span>[<span class="pl-s1">current</span>]</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-firestore_limit_test-go-LC103" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-firestore_limit_test-go-LC104" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wg</span>.<span class="pl-en">Add</span>(<span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-firestore_limit_test-go-LC105" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">go</span> <span class="pl-k">func</span>() {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-firestore_limit_test-go-LC106" class="blob-code blob-code-inner js-file-line">				<span class="pl-en">execFunc</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">col</span>, <span class="pl-s1">articles</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-firestore_limit_test-go-LC107" class="blob-code blob-code-inner js-file-line">				<span class="pl-s1">wg</span>.<span class="pl-en">Done</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L108" class="blob-num js-line-number" data-line-number="108"/>
        <td id="file-firestore_limit_test-go-LC108" class="blob-code blob-code-inner js-file-line">			}()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L109" class="blob-num js-line-number" data-line-number="109"/>
        <td id="file-firestore_limit_test-go-LC109" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">current</span><span class="pl-c1">++</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L110" class="blob-num js-line-number" data-line-number="110"/>
        <td id="file-firestore_limit_test-go-LC110" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">if</span> <span class="pl-s1">dataLen</span> <span class="pl-c1">==</span> <span class="pl-s1">current</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L111" class="blob-num js-line-number" data-line-number="111"/>
        <td id="file-firestore_limit_test-go-LC111" class="blob-code blob-code-inner js-file-line">				<span class="pl-k">break</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L112" class="blob-num js-line-number" data-line-number="112"/>
        <td id="file-firestore_limit_test-go-LC112" class="blob-code blob-code-inner js-file-line">			}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L113" class="blob-num js-line-number" data-line-number="113"/>
        <td id="file-firestore_limit_test-go-LC113" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L114" class="blob-num js-line-number" data-line-number="114"/>
        <td id="file-firestore_limit_test-go-LC114" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">wg</span>.<span class="pl-en">Wait</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L115" class="blob-num js-line-number" data-line-number="115"/>
        <td id="file-firestore_limit_test-go-LC115" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">dataLen</span> <span class="pl-c1">==</span> <span class="pl-s1">current</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L116" class="blob-num js-line-number" data-line-number="116"/>
        <td id="file-firestore_limit_test-go-LC116" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">break</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L117" class="blob-num js-line-number" data-line-number="117"/>
        <td id="file-firestore_limit_test-go-LC117" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L118" class="blob-num js-line-number" data-line-number="118"/>
        <td id="file-firestore_limit_test-go-LC118" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">multi</span> <span class="pl-c1">*=</span> <span class="pl-c1">2</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L119" class="blob-num js-line-number" data-line-number="119"/>
        <td id="file-firestore_limit_test-go-LC119" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L120" class="blob-num js-line-number" data-line-number="120"/>
        <td id="file-firestore_limit_test-go-LC120" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L121" class="blob-num js-line-number" data-line-number="121"/>
        <td id="file-firestore_limit_test-go-LC121" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L122" class="blob-num js-line-number" data-line-number="122"/>
        <td id="file-firestore_limit_test-go-LC122" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;end&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L123" class="blob-num js-line-number" data-line-number="123"/>
        <td id="file-firestore_limit_test-go-LC123" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">last</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">OrderBy</span>(<span class="pl-s">&quot;view_count&quot;</span>, <span class="pl-s1">firestore</span>.<span class="pl-c1">Desc</span>).<span class="pl-en">Limit</span>(<span class="pl-c1">1</span>).<span class="pl-en">Documents</span>(<span class="pl-s1">ctx</span>).<span class="pl-en">GetAll</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L124" class="blob-num js-line-number" data-line-number="124"/>
        <td id="file-firestore_limit_test-go-LC124" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L125" class="blob-num js-line-number" data-line-number="125"/>
        <td id="file-firestore_limit_test-go-LC125" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">last</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L126" class="blob-num js-line-number" data-line-number="126"/>
        <td id="file-firestore_limit_test-go-LC126" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">last</span>[<span class="pl-c1">0</span>].<span class="pl-en">Data</span>()[<span class="pl-s">&quot;view_count&quot;</span>])</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L127" class="blob-num js-line-number" data-line-number="127"/>
        <td id="file-firestore_limit_test-go-LC127" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L128" class="blob-num js-line-number" data-line-number="128"/>
        <td id="file-firestore_limit_test-go-LC128" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L129" class="blob-num js-line-number" data-line-number="129"/>
        <td id="file-firestore_limit_test-go-LC129" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L130" class="blob-num js-line-number" data-line-number="130"/>
        <td id="file-firestore_limit_test-go-LC130" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">create</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L131" class="blob-num js-line-number" data-line-number="131"/>
        <td id="file-firestore_limit_test-go-LC131" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L132" class="blob-num js-line-number" data-line-number="132"/>
        <td id="file-firestore_limit_test-go-LC132" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">doc</span>, <span class="pl-s1">article</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L133" class="blob-num js-line-number" data-line-number="133"/>
        <td id="file-firestore_limit_test-go-LC133" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Create</span>(<span class="pl-s1">doc</span>, <span class="pl-s1">article</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L134" class="blob-num js-line-number" data-line-number="134"/>
        <td id="file-firestore_limit_test-go-LC134" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L135" class="blob-num js-line-number" data-line-number="135"/>
        <td id="file-firestore_limit_test-go-LC135" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L136" class="blob-num js-line-number" data-line-number="136"/>
        <td id="file-firestore_limit_test-go-LC136" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L137" class="blob-num js-line-number" data-line-number="137"/>
        <td id="file-firestore_limit_test-go-LC137" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L138" class="blob-num js-line-number" data-line-number="138"/>
        <td id="file-firestore_limit_test-go-LC138" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L139" class="blob-num js-line-number" data-line-number="139"/>
        <td id="file-firestore_limit_test-go-LC139" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">update</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L140" class="blob-num js-line-number" data-line-number="140"/>
        <td id="file-firestore_limit_test-go-LC140" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L141" class="blob-num js-line-number" data-line-number="141"/>
        <td id="file-firestore_limit_test-go-LC141" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">col</span>, <span class="pl-s1">article</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L142" class="blob-num js-line-number" data-line-number="142"/>
        <td id="file-firestore_limit_test-go-LC142" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Update</span>(<span class="pl-s1">col</span>, []firestore.<span class="pl-smi">Update</span>{</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L143" class="blob-num js-line-number" data-line-number="143"/>
        <td id="file-firestore_limit_test-go-LC143" class="blob-code blob-code-inner js-file-line">			{<span class="pl-c1">Path</span>: <span class="pl-s">&quot;title&quot;</span>, <span class="pl-c1">Value</span>: <span class="pl-s1">article</span>[<span class="pl-s">&quot;title&quot;</span>].(<span class="pl-smi">string</span>) <span class="pl-c1">+</span> <span class="pl-s">&quot;_update&quot;</span>},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L144" class="blob-num js-line-number" data-line-number="144"/>
        <td id="file-firestore_limit_test-go-LC144" class="blob-code blob-code-inner js-file-line">			{<span class="pl-c1">Path</span>: <span class="pl-s">&quot;view_count&quot;</span>, <span class="pl-c1">Value</span>: <span class="pl-s1">article</span>[<span class="pl-s">&quot;view_count&quot;</span>].(<span class="pl-smi">int</span>) <span class="pl-c1">+</span> <span class="pl-c1">10000</span>},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L145" class="blob-num js-line-number" data-line-number="145"/>
        <td id="file-firestore_limit_test-go-LC145" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L146" class="blob-num js-line-number" data-line-number="146"/>
        <td id="file-firestore_limit_test-go-LC146" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L147" class="blob-num js-line-number" data-line-number="147"/>
        <td id="file-firestore_limit_test-go-LC147" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L148" class="blob-num js-line-number" data-line-number="148"/>
        <td id="file-firestore_limit_test-go-LC148" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L149" class="blob-num js-line-number" data-line-number="149"/>
        <td id="file-firestore_limit_test-go-LC149" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L150" class="blob-num js-line-number" data-line-number="150"/>
        <td id="file-firestore_limit_test-go-LC150" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L151" class="blob-num js-line-number" data-line-number="151"/>
        <td id="file-firestore_limit_test-go-LC151" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">updateIncrement</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L152" class="blob-num js-line-number" data-line-number="152"/>
        <td id="file-firestore_limit_test-go-LC152" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L153" class="blob-num js-line-number" data-line-number="153"/>
        <td id="file-firestore_limit_test-go-LC153" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L154" class="blob-num js-line-number" data-line-number="154"/>
        <td id="file-firestore_limit_test-go-LC154" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Update</span>(<span class="pl-s1">col</span>, []firestore.<span class="pl-smi">Update</span>{</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L155" class="blob-num js-line-number" data-line-number="155"/>
        <td id="file-firestore_limit_test-go-LC155" class="blob-code blob-code-inner js-file-line">			{<span class="pl-c1">Path</span>: <span class="pl-s">&quot;view_count&quot;</span>, <span class="pl-c1">Value</span>: <span class="pl-s1">firestore</span>.<span class="pl-en">Increment</span>(<span class="pl-c1">10000</span>)},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L156" class="blob-num js-line-number" data-line-number="156"/>
        <td id="file-firestore_limit_test-go-LC156" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L157" class="blob-num js-line-number" data-line-number="157"/>
        <td id="file-firestore_limit_test-go-LC157" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L158" class="blob-num js-line-number" data-line-number="158"/>
        <td id="file-firestore_limit_test-go-LC158" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L159" class="blob-num js-line-number" data-line-number="159"/>
        <td id="file-firestore_limit_test-go-LC159" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L160" class="blob-num js-line-number" data-line-number="160"/>
        <td id="file-firestore_limit_test-go-LC160" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L161" class="blob-num js-line-number" data-line-number="161"/>
        <td id="file-firestore_limit_test-go-LC161" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L162" class="blob-num js-line-number" data-line-number="162"/>
        <td id="file-firestore_limit_test-go-LC162" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">updateArrayUnion</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L163" class="blob-num js-line-number" data-line-number="163"/>
        <td id="file-firestore_limit_test-go-LC163" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L164" class="blob-num js-line-number" data-line-number="164"/>
        <td id="file-firestore_limit_test-go-LC164" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L165" class="blob-num js-line-number" data-line-number="165"/>
        <td id="file-firestore_limit_test-go-LC165" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Update</span>(<span class="pl-s1">col</span>, []firestore.<span class="pl-smi">Update</span>{</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L166" class="blob-num js-line-number" data-line-number="166"/>
        <td id="file-firestore_limit_test-go-LC166" class="blob-code blob-code-inner js-file-line">			{<span class="pl-c1">Path</span>: <span class="pl-s">&quot;tags&quot;</span>, <span class="pl-c1">Value</span>: <span class="pl-s1">firestore</span>.<span class="pl-en">ArrayUnion</span>(<span class="pl-s">&quot;tag_3&quot;</span>, <span class="pl-s">&quot;tag_4&quot;</span>)},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L167" class="blob-num js-line-number" data-line-number="167"/>
        <td id="file-firestore_limit_test-go-LC167" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L168" class="blob-num js-line-number" data-line-number="168"/>
        <td id="file-firestore_limit_test-go-LC168" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L169" class="blob-num js-line-number" data-line-number="169"/>
        <td id="file-firestore_limit_test-go-LC169" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L170" class="blob-num js-line-number" data-line-number="170"/>
        <td id="file-firestore_limit_test-go-LC170" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L171" class="blob-num js-line-number" data-line-number="171"/>
        <td id="file-firestore_limit_test-go-LC171" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L172" class="blob-num js-line-number" data-line-number="172"/>
        <td id="file-firestore_limit_test-go-LC172" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L173" class="blob-num js-line-number" data-line-number="173"/>
        <td id="file-firestore_limit_test-go-LC173" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">updateServerTimestamp</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L174" class="blob-num js-line-number" data-line-number="174"/>
        <td id="file-firestore_limit_test-go-LC174" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L175" class="blob-num js-line-number" data-line-number="175"/>
        <td id="file-firestore_limit_test-go-LC175" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L176" class="blob-num js-line-number" data-line-number="176"/>
        <td id="file-firestore_limit_test-go-LC176" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Update</span>(<span class="pl-s1">col</span>, []firestore.<span class="pl-smi">Update</span>{</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L177" class="blob-num js-line-number" data-line-number="177"/>
        <td id="file-firestore_limit_test-go-LC177" class="blob-code blob-code-inner js-file-line">			{<span class="pl-c1">Path</span>: <span class="pl-s">&quot;update_timestamp&quot;</span>, <span class="pl-c1">Value</span>: <span class="pl-s1">firestore</span>.<span class="pl-c1">ServerTimestamp</span>},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L178" class="blob-num js-line-number" data-line-number="178"/>
        <td id="file-firestore_limit_test-go-LC178" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L179" class="blob-num js-line-number" data-line-number="179"/>
        <td id="file-firestore_limit_test-go-LC179" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L180" class="blob-num js-line-number" data-line-number="180"/>
        <td id="file-firestore_limit_test-go-LC180" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L181" class="blob-num js-line-number" data-line-number="181"/>
        <td id="file-firestore_limit_test-go-LC181" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L182" class="blob-num js-line-number" data-line-number="182"/>
        <td id="file-firestore_limit_test-go-LC182" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L183" class="blob-num js-line-number" data-line-number="183"/>
        <td id="file-firestore_limit_test-go-LC183" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L184" class="blob-num js-line-number" data-line-number="184"/>
        <td id="file-firestore_limit_test-go-LC184" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">delete</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L185" class="blob-num js-line-number" data-line-number="185"/>
        <td id="file-firestore_limit_test-go-LC185" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L186" class="blob-num js-line-number" data-line-number="186"/>
        <td id="file-firestore_limit_test-go-LC186" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L187" class="blob-num js-line-number" data-line-number="187"/>
        <td id="file-firestore_limit_test-go-LC187" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Delete</span>(<span class="pl-s1">col</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L188" class="blob-num js-line-number" data-line-number="188"/>
        <td id="file-firestore_limit_test-go-LC188" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L189" class="blob-num js-line-number" data-line-number="189"/>
        <td id="file-firestore_limit_test-go-LC189" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L190" class="blob-num js-line-number" data-line-number="190"/>
        <td id="file-firestore_limit_test-go-LC190" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L191" class="blob-num js-line-number" data-line-number="191"/>
        <td id="file-firestore_limit_test-go-LC191" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L192" class="blob-num js-line-number" data-line-number="192"/>
        <td id="file-firestore_limit_test-go-LC192" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L193" class="blob-num js-line-number" data-line-number="193"/>
        <td id="file-firestore_limit_test-go-LC193" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">read</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L194" class="blob-num js-line-number" data-line-number="194"/>
        <td id="file-firestore_limit_test-go-LC194" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;start&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L195" class="blob-num js-line-number" data-line-number="195"/>
        <td id="file-firestore_limit_test-go-LC195" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L196" class="blob-num js-line-number" data-line-number="196"/>
        <td id="file-firestore_limit_test-go-LC196" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">last</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">Where</span>(<span class="pl-s">&quot;view_count&quot;</span>, <span class="pl-s">&quot;&gt;=&quot;</span>, <span class="pl-c1">10000</span>).<span class="pl-en">Documents</span>(<span class="pl-s1">ctx</span>).<span class="pl-en">GetAll</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L197" class="blob-num js-line-number" data-line-number="197"/>
        <td id="file-firestore_limit_test-go-LC197" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L198" class="blob-num js-line-number" data-line-number="198"/>
        <td id="file-firestore_limit_test-go-LC198" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;end&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L199" class="blob-num js-line-number" data-line-number="199"/>
        <td id="file-firestore_limit_test-go-LC199" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;count: &quot;</span>, <span class="pl-en">len</span>(<span class="pl-s1">last</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L200" class="blob-num js-line-number" data-line-number="200"/>
        <td id="file-firestore_limit_test-go-LC200" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test-go-L201" class="blob-num js-line-number" data-line-number="201"/>
        <td id="file-firestore_limit_test-go-LC201" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb/raw/e24aec530289ded32f30e290845d22e3a0bfe0b3/firestore_limit_test.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb#file-firestore_limit_test-go">firestore_limit_test.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>3つの変数のうち登録件数は10,000件で固定し、一度のバッチ書き込みの件数、初回書き込み時の並列数を適当に変えて時間を測ってみました。結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.05.15.png" alt="----------2022-05-11-10.05.15" loading="lazy"/></p>
<p>500/s を大きく超えて最大 9407/s 出てました。実はそんなに気にしなくても大丈夫なのでしょうか。連続で試行したので既に十分スケールしていたのかもしれません。</p>
<h2 id="500s-%E3%81%AB%E5%BC%95%E3%81%A3%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%A9%E3%82%93%E3%81%AA%E6%9D%A1%E4%BB%B6%EF%BC%9F">500/s に引っかかるのはどんな条件？</h2>
<p>公式ドキュメントには条件として以下のように書かれています。</p>
<blockquote>
<p>Maximum write rate to a collection in which documents contain sequential values in an indexed field</p>
</blockquote>
<p>Increment 関数を使った更新が影響するのかと思い試しました。ついでにArrayUnion や ServerTimestamp も試してみました。登録件数は10,000件で固定です。結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.05.58.png" alt="----------2022-05-11-10.05.58" loading="lazy"/></p>
<p>殆ど変わりませんでした。逆にどうやったら引っかかるのでしょうか？</p>
<h2 id="%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E8%B2%A0%E8%8D%B7%E3%82%92%E5%BE%90%E3%80%85%E3%81%AB%E3%81%82%E3%81%92%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F">そもそも負荷を徐々にあげる必要があるのか？</h2>
<p>色々試したくなってきたので、最初から負荷を高めで固定してみました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105569821" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore_limit_test_2-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore_limit_test_2-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore_limit_test_2-go-LC1" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore_limit_test_2-go-LC2" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">exec2</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">data</span> []<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{},</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore_limit_test_2-go-LC3" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">execFunc</span> <span class="pl-k">func</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{})) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore_limit_test_2-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore_limit_test_2-go-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore_limit_test_2-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;start&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore_limit_test_2-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore_limit_test_2-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">multi</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">multi</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore_limit_test_2-go-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore_limit_test_2-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">limit</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">chan</span> <span class="pl-k">struct</span>{}, <span class="pl-s1">multi</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore_limit_test_2-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wg</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">WaitGroup</span>{}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore_limit_test_2-go-LC12" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">articles</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">data</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore_limit_test_2-go-LC13" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">limit</span> <span class="pl-c1">&lt;-</span> <span class="pl-k">struct</span>{}{}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore_limit_test_2-go-LC14" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">wg</span>.<span class="pl-en">Add</span>(<span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore_limit_test_2-go-LC15" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">go</span> <span class="pl-k">func</span>(<span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore_limit_test_2-go-LC16" class="blob-code blob-code-inner js-file-line">			<span class="pl-en">execFunc</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">col</span>, <span class="pl-s1">articles</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-firestore_limit_test_2-go-LC17" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">&lt;-</span><span class="pl-s1">limit</span></td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-firestore_limit_test_2-go-LC18" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wg</span>.<span class="pl-en">Done</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-firestore_limit_test_2-go-LC19" class="blob-code blob-code-inner js-file-line">		}(<span class="pl-s1">articles</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-firestore_limit_test_2-go-LC20" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-firestore_limit_test_2-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wg</span>.<span class="pl-en">Wait</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-firestore_limit_test_2-go-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-firestore_limit_test_2-go-LC23" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-firestore_limit_test_2-go-LC24" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;end&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-firestore_limit_test_2-go-LC25" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">last</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">OrderBy</span>(<span class="pl-s">&quot;view_count&quot;</span>, <span class="pl-s1">firestore</span>.<span class="pl-c1">Desc</span>).<span class="pl-en">Limit</span>(<span class="pl-c1">1</span>).<span class="pl-en">Documents</span>(<span class="pl-s1">ctx</span>).<span class="pl-en">GetAll</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-firestore_limit_test_2-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-firestore_limit_test_2-go-LC27" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">last</span>) <span class="pl-c1">&gt;</span> <span class="pl-c1">0</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-firestore_limit_test_2-go-LC28" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">last</span>[<span class="pl-c1">0</span>].<span class="pl-en">Data</span>()[<span class="pl-s">&quot;view_count&quot;</span>])</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-firestore_limit_test_2-go-LC29" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_limit_test_2-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-firestore_limit_test_2-go-LC30" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51/raw/1f690cca8034fcd76bf436d5b931625a8f7e9b6b/firestore_limit_test_2.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51#file-firestore_limit_test_2-go">firestore_limit_test_2.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>単純な並列化に変更しました。こちらも登録件数は10,000件で固定しています。結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.07.12.png" alt="----------2022-05-11-10.07.12" loading="lazy"/></p>
<p>さらに速くなりました。本当に計測方法が合っているのか不安になってきました。一応更新後に件数を確認し、更新されていることを確認しました。こちらも連続で試行していたので、既に十分スケールしていたのかもしれません。</p>
<p>以後の計測は負荷を徐々に上げず、単純な並列化で試しています。</p>
<p>削除の速度も測りました。あまり重視していないので1条件だけです。(最初から測定しておけばよかった）</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.08.29.png" alt="----------2022-05-11-10.08.29" loading="lazy"/></p>
<p>更新より少し遅いくらいでした。</p>
<h2 id="%E6%9C%80%E5%A4%A7%E4%BD%95%E4%BB%B6%E3%81%BE%E3%81%A7%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E3%81%8B">最大何件まで成功するか</h2>
<p>登録件数を変えていくつか試してみました。効果があるか分かりませんが、1条件ごとに2,3時間おいて試しました。結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.09.36.png" alt="----------2022-05-11-10.09.36" loading="lazy"/></p>
<p>40,000件は成功、50,000件は登録中にエラーとなりました。エラーが起きた後に確認しましたが、49,000件くらいまでは登録できていました。</p>
<h2 id="%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E6%95%B0%E3%82%922%E5%80%8D%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">リクエスト数を2倍にしてみる</h2>
<p>最後にインスタンスをもう一台立て、2つのインスタンスでほぼ同時に実行してみました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.10.16.png" alt="----------2022-05-11-10.10.16" loading="lazy"/></p>
<p>40,000件 * 2 までは遅くなっているものの成功、50,000件 * 2 の更新で両方エラーになりました。思ったよりだいぶ耐えました。</p>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>予想以上に書き込み可能件数が多かったです。自分で調べておいて何ですが合っているか不安なので、どこか間違ってたら教えていただけると非常に助かります。</p>
<!--kg-card-end: markdown--></link></link>]]></content:encoded></item><item><title><![CDATA[Firestoreの単一documentの読み込み速度の検証]]></title><description><![CDATA[結論
単一documentを連続で読み込むと、約 300/s 程度の速度は出せそう。

読み込み速度
前回は書き込み速度を測定
[https://medium.com/anti-pattern-engineering/firestore%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E9%80%9F%E5%BA%A6%E3%81%AE%E6%A4%9C%E8%A8%BC-8e1d4595a701]
しましたが、今回は読み込み速度を調べました。

環境
 * Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)
 * Ubuntu 20.04 LTS
 * Docker 19.03.8
 * Golang 1.14.9
 * cloud.google.com/go/firestore 1.3.0

検証
単一のdocumentを、1秒毎に指定したrateの数だけ取得し、全ての取得処理が完了するまでの時間を測定します。これを指定した回数（今回は60回）繰り返しました。使用したコードは以下です。（crea]]></description><link>https://tech.anti-pattern.co.jp/firestore-read/</link><guid isPermaLink="false">Ghost__Post__6103f8f43986b000013a4502</guid><category><![CDATA[Firestore]]></category><category><![CDATA[golang]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Fri, 31 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E7%B5%90%E8%AB%96">結論</h2>
<p>単一documentを連続で読み込むと、約 300/s 程度の速度は出せそう。</p>
<h2 id="%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E9%80%9F%E5%BA%A6">読み込み速度</h2>
<p>前回は<a href="https://medium.com/anti-pattern-engineering/firestore%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E9%80%9F%E5%BA%A6%E3%81%AE%E6%A4%9C%E8%A8%BC-8e1d4595a701">書き込み速度を測定</a>しましたが、今回は読み込み速度を調べました。</p>
<h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)</li>
<li>Ubuntu 20.04 LTS</li>
<li>Docker 19.03.8</li>
<li>Golang 1.14.9</li>
<li>cloud.google.com/go/firestore 1.3.0</li>
</ul>
<h2 id="%E6%A4%9C%E8%A8%BC">検証</h2>
<p>単一のdocumentを、1秒毎に指定したrateの数だけ取得し、全ての取得処理が完了するまでの時間を測定します。これを指定した回数（今回は60回）繰り返しました。使用したコードは以下です。（createまわりは前回の使い回し）</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/51c00e2234ab3568b108f85076d4730f.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist105634967" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore_read_test-go" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore_read_test-go-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore_read_test-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> main</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore_read_test-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore_read_test-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore_read_test-go-LC4" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;context&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore_read_test-go-LC5" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;flag&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore_read_test-go-LC6" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;fmt&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore_read_test-go-LC7" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;log&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore_read_test-go-LC8" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;os&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore_read_test-go-LC9" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;strconv&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore_read_test-go-LC10" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;sync&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore_read_test-go-LC11" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;time&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore_read_test-go-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore_read_test-go-LC13" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;cloud.google.com/go/firestore&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore_read_test-go-LC14" class="blob-code blob-code-inner js-file-line">	<span class="pl-s">&quot;google.golang.org/api/iterator&quot;</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore_read_test-go-LC15" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore_read_test-go-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-firestore_read_test-go-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> (</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-firestore_read_test-go-LC18" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">total</span>    <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;total&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;total count&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-firestore_read_test-go-LC19" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">rate</span>     <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;rate&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;rate&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-firestore_read_test-go-LC20" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">duration</span> <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Int</span>(<span class="pl-s">&quot;duration&quot;</span>, <span class="pl-c1">0</span>, <span class="pl-s">&quot;duration&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-firestore_read_test-go-LC21" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">execName</span> <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">String</span>(<span class="pl-s">&quot;exec&quot;</span>, <span class="pl-s">&quot;read&quot;</span>, <span class="pl-s">&quot;exec&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-firestore_read_test-go-LC22" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">sub</span>      <span class="pl-c1">=</span> <span class="pl-s1">flag</span>.<span class="pl-en">Bool</span>(<span class="pl-s">&quot;sub&quot;</span>, <span class="pl-c1">false</span>, <span class="pl-s">&quot;read sub&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-firestore_read_test-go-LC23" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-firestore_read_test-go-LC24" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-firestore_read_test-go-LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">main</span>() {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-firestore_read_test-go-LC26" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">flag</span>.<span class="pl-en">Parse</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-firestore_read_test-go-LC27" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-firestore_read_test-go-LC28" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">ctx</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">Background</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-firestore_read_test-go-LC29" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-firestore_read_test-go-LC30" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">client</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">firestore</span>.<span class="pl-en">NewClient</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">os</span>.<span class="pl-en">Getenv</span>(<span class="pl-s">&quot;PROJECT_ID&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-firestore_read_test-go-LC31" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-firestore_read_test-go-LC32" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">log</span>.<span class="pl-en">Fatal</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-firestore_read_test-go-LC33" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-firestore_read_test-go-LC34" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-firestore_read_test-go-LC35" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span> <span class="pl-c1">:=</span> <span class="pl-en">generateDocumentData</span>(<span class="pl-s1">client</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-firestore_read_test-go-LC36" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-firestore_read_test-go-LC37" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">*</span><span class="pl-s1">execName</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;create&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-firestore_read_test-go-LC38" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">exec</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">data</span>, <span class="pl-s1">create</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-firestore_read_test-go-LC39" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-firestore_read_test-go-LC40" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-firestore_read_test-go-LC41" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-c1">*</span><span class="pl-s1">execName</span> <span class="pl-c1">==</span> <span class="pl-s">&quot;read&quot;</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-firestore_read_test-go-LC42" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">read</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-firestore_read_test-go-LC43" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-firestore_read_test-go-LC44" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-firestore_read_test-go-LC45" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-firestore_read_test-go-LC46" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-firestore_read_test-go-LC47" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">panicIf</span>(<span class="pl-s1">err</span> <span class="pl-smi">error</span>) {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-firestore_read_test-go-LC48" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-firestore_read_test-go-LC49" class="blob-code blob-code-inner js-file-line">		<span class="pl-en">panic</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-firestore_read_test-go-LC50" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-firestore_read_test-go-LC51" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-firestore_read_test-go-LC52" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-firestore_read_test-go-LC53" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">generateDocumentData</span>(<span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>) []<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{} {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-firestore_read_test-go-LC54" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">limit</span> <span class="pl-c1">:=</span> <span class="pl-c1">120</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-firestore_read_test-go-LC55" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">totalCount</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">total</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-firestore_read_test-go-LC56" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">count</span> <span class="pl-c1">:=</span> <span class="pl-s1">totalCount</span><span class="pl-c1">/</span><span class="pl-s1">limit</span> <span class="pl-c1">+</span> <span class="pl-c1">1</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-firestore_read_test-go-LC57" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">data</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}, <span class="pl-c1">0</span>, <span class="pl-s1">count</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-firestore_read_test-go-LC58" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">col</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;articles&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-firestore_read_test-go-LC59" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">j</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">j</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">count</span>; <span class="pl-s1">j</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-firestore_read_test-go-LC60" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">min</span> <span class="pl-c1">:=</span> <span class="pl-s1">limit</span> <span class="pl-c1">*</span> <span class="pl-s1">j</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-firestore_read_test-go-LC61" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">max</span> <span class="pl-c1">:=</span> <span class="pl-s1">limit</span> <span class="pl-c1">*</span> (<span class="pl-s1">j</span> <span class="pl-c1">+</span> <span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-firestore_read_test-go-LC62" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">max</span> <span class="pl-c1">&gt;</span> <span class="pl-s1">totalCount</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-firestore_read_test-go-LC63" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">max</span> <span class="pl-c1">=</span> <span class="pl-s1">totalCount</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-firestore_read_test-go-LC64" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-firestore_read_test-go-LC65" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">if</span> <span class="pl-s1">min</span> <span class="pl-c1">==</span> <span class="pl-s1">max</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-firestore_read_test-go-LC66" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">break</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-firestore_read_test-go-LC67" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-firestore_read_test-go-LC68" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">results</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}, <span class="pl-s1">limit</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-firestore_read_test-go-LC69" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-s1">min</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">max</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-firestore_read_test-go-LC70" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">doc</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">NewDoc</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-firestore_read_test-go-LC71" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">results</span>[<span class="pl-s1">doc</span>] <span class="pl-c1">=</span> <span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}{</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-firestore_read_test-go-LC72" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;title&quot;</span>:        <span class="pl-s">&quot;title_&quot;</span> <span class="pl-c1">+</span> <span class="pl-s1">strconv</span>.<span class="pl-en">FormatInt</span>(<span class="pl-en">int64</span>(<span class="pl-s1">i</span>), <span class="pl-c1">10</span>),</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-firestore_read_test-go-LC73" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;tags&quot;</span>:         []<span class="pl-smi">string</span>{<span class="pl-s">&quot;tag_1&quot;</span>, <span class="pl-s">&quot;tag_2&quot;</span>, <span class="pl-s">&quot;tag_3&quot;</span>},</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-firestore_read_test-go-LC74" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;author_id&quot;</span>:    <span class="pl-s">&quot;author_id_&quot;</span> <span class="pl-c1">+</span> <span class="pl-s1">strconv</span>.<span class="pl-en">FormatInt</span>(<span class="pl-en">int64</span>(<span class="pl-s1">i</span>), <span class="pl-c1">10</span>),</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-firestore_read_test-go-LC75" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;view_count&quot;</span>:   <span class="pl-s1">i</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L76" class="blob-num js-line-number" data-line-number="76"/>
        <td id="file-firestore_read_test-go-LC76" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;is_published&quot;</span>: <span class="pl-c1">true</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L77" class="blob-num js-line-number" data-line-number="77"/>
        <td id="file-firestore_read_test-go-LC77" class="blob-code blob-code-inner js-file-line">				<span class="pl-s">&quot;text&quot;</span>:         <span class="pl-s">&quot;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L78" class="blob-num js-line-number" data-line-number="78"/>
        <td id="file-firestore_read_test-go-LC78" class="blob-code blob-code-inner js-file-line">			}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L79" class="blob-num js-line-number" data-line-number="79"/>
        <td id="file-firestore_read_test-go-LC79" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">subCol</span> <span class="pl-c1">:=</span> <span class="pl-s1">doc</span>.<span class="pl-en">Collection</span>(<span class="pl-s">&quot;sections&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L80" class="blob-num js-line-number" data-line-number="80"/>
        <td id="file-firestore_read_test-go-LC80" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">for</span> <span class="pl-s1">k</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">k</span> <span class="pl-c1">&lt;</span> <span class="pl-c1">3</span>; <span class="pl-s1">k</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L81" class="blob-num js-line-number" data-line-number="81"/>
        <td id="file-firestore_read_test-go-LC81" class="blob-code blob-code-inner js-file-line">				<span class="pl-s1">doc</span> <span class="pl-c1">:=</span> <span class="pl-s1">subCol</span>.<span class="pl-en">NewDoc</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L82" class="blob-num js-line-number" data-line-number="82"/>
        <td id="file-firestore_read_test-go-LC82" class="blob-code blob-code-inner js-file-line">				<span class="pl-s1">results</span>[<span class="pl-s1">doc</span>] <span class="pl-c1">=</span> <span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}{</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L83" class="blob-num js-line-number" data-line-number="83"/>
        <td id="file-firestore_read_test-go-LC83" class="blob-code blob-code-inner js-file-line">					<span class="pl-s">&quot;sort_order&quot;</span>: <span class="pl-s1">k</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L84" class="blob-num js-line-number" data-line-number="84"/>
        <td id="file-firestore_read_test-go-LC84" class="blob-code blob-code-inner js-file-line">					<span class="pl-s">&quot;text&quot;</span>:       <span class="pl-s">&quot;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789&quot;</span>,</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L85" class="blob-num js-line-number" data-line-number="85"/>
        <td id="file-firestore_read_test-go-LC85" class="blob-code blob-code-inner js-file-line">				}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L86" class="blob-num js-line-number" data-line-number="86"/>
        <td id="file-firestore_read_test-go-LC86" class="blob-code blob-code-inner js-file-line">			}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L87" class="blob-num js-line-number" data-line-number="87"/>
        <td id="file-firestore_read_test-go-LC87" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L88" class="blob-num js-line-number" data-line-number="88"/>
        <td id="file-firestore_read_test-go-LC88" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-en">append</span>(<span class="pl-s1">data</span>, <span class="pl-s1">results</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L89" class="blob-num js-line-number" data-line-number="89"/>
        <td id="file-firestore_read_test-go-LC89" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L90" class="blob-num js-line-number" data-line-number="90"/>
        <td id="file-firestore_read_test-go-LC90" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">return</span> <span class="pl-s1">data</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L91" class="blob-num js-line-number" data-line-number="91"/>
        <td id="file-firestore_read_test-go-LC91" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L92" class="blob-num js-line-number" data-line-number="92"/>
        <td id="file-firestore_read_test-go-LC92" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L93" class="blob-num js-line-number" data-line-number="93"/>
        <td id="file-firestore_read_test-go-LC93" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">exec</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">data</span> []<span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{},</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L94" class="blob-num js-line-number" data-line-number="94"/>
        <td id="file-firestore_read_test-go-LC94" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">execFunc</span> <span class="pl-k">func</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{})) {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L95" class="blob-num js-line-number" data-line-number="95"/>
        <td id="file-firestore_read_test-go-LC95" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L96" class="blob-num js-line-number" data-line-number="96"/>
        <td id="file-firestore_read_test-go-LC96" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;start&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L97" class="blob-num js-line-number" data-line-number="97"/>
        <td id="file-firestore_read_test-go-LC97" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L98" class="blob-num js-line-number" data-line-number="98"/>
        <td id="file-firestore_read_test-go-LC98" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">multi</span> <span class="pl-c1">:=</span> <span class="pl-c1">3</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L99" class="blob-num js-line-number" data-line-number="99"/>
        <td id="file-firestore_read_test-go-LC99" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L100" class="blob-num js-line-number" data-line-number="100"/>
        <td id="file-firestore_read_test-go-LC100" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">limit</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>(<span class="pl-k">chan</span> <span class="pl-k">struct</span>{}, <span class="pl-s1">multi</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L101" class="blob-num js-line-number" data-line-number="101"/>
        <td id="file-firestore_read_test-go-LC101" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wg</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">WaitGroup</span>{}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L102" class="blob-num js-line-number" data-line-number="102"/>
        <td id="file-firestore_read_test-go-LC102" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">articles</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">data</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L103" class="blob-num js-line-number" data-line-number="103"/>
        <td id="file-firestore_read_test-go-LC103" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">limit</span> <span class="pl-c1">&lt;-</span> <span class="pl-k">struct</span>{}{}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L104" class="blob-num js-line-number" data-line-number="104"/>
        <td id="file-firestore_read_test-go-LC104" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">wg</span>.<span class="pl-en">Add</span>(<span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L105" class="blob-num js-line-number" data-line-number="105"/>
        <td id="file-firestore_read_test-go-LC105" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">go</span> <span class="pl-k">func</span>(<span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L106" class="blob-num js-line-number" data-line-number="106"/>
        <td id="file-firestore_read_test-go-LC106" class="blob-code blob-code-inner js-file-line">			<span class="pl-en">execFunc</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">client</span>, <span class="pl-s1">articles</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L107" class="blob-num js-line-number" data-line-number="107"/>
        <td id="file-firestore_read_test-go-LC107" class="blob-code blob-code-inner js-file-line">			<span class="pl-c1">&lt;-</span><span class="pl-s1">limit</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L108" class="blob-num js-line-number" data-line-number="108"/>
        <td id="file-firestore_read_test-go-LC108" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wg</span>.<span class="pl-en">Done</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L109" class="blob-num js-line-number" data-line-number="109"/>
        <td id="file-firestore_read_test-go-LC109" class="blob-code blob-code-inner js-file-line">		}(<span class="pl-s1">articles</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L110" class="blob-num js-line-number" data-line-number="110"/>
        <td id="file-firestore_read_test-go-LC110" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L111" class="blob-num js-line-number" data-line-number="111"/>
        <td id="file-firestore_read_test-go-LC111" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wg</span>.<span class="pl-en">Wait</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L112" class="blob-num js-line-number" data-line-number="112"/>
        <td id="file-firestore_read_test-go-LC112" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L113" class="blob-num js-line-number" data-line-number="113"/>
        <td id="file-firestore_read_test-go-LC113" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L114" class="blob-num js-line-number" data-line-number="114"/>
        <td id="file-firestore_read_test-go-LC114" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;end&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L115" class="blob-num js-line-number" data-line-number="115"/>
        <td id="file-firestore_read_test-go-LC115" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L116" class="blob-num js-line-number" data-line-number="116"/>
        <td id="file-firestore_read_test-go-LC116" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L117" class="blob-num js-line-number" data-line-number="117"/>
        <td id="file-firestore_read_test-go-LC117" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">create</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">client</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">Client</span>, <span class="pl-s1">articles</span> <span class="pl-k">map</span>[<span class="pl-c1">*</span>firestore.<span class="pl-smi">DocumentRef</span>]<span class="pl-k">map</span>[<span class="pl-smi">string</span>]<span class="pl-k">interface</span>{}) {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L118" class="blob-num js-line-number" data-line-number="118"/>
        <td id="file-firestore_read_test-go-LC118" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">batch</span> <span class="pl-c1">:=</span> <span class="pl-s1">client</span>.<span class="pl-en">Batch</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L119" class="blob-num js-line-number" data-line-number="119"/>
        <td id="file-firestore_read_test-go-LC119" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">doc</span>, <span class="pl-s1">article</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">articles</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L120" class="blob-num js-line-number" data-line-number="120"/>
        <td id="file-firestore_read_test-go-LC120" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">batch</span>.<span class="pl-en">Create</span>(<span class="pl-s1">doc</span>, <span class="pl-s1">article</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L121" class="blob-num js-line-number" data-line-number="121"/>
        <td id="file-firestore_read_test-go-LC121" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L122" class="blob-num js-line-number" data-line-number="122"/>
        <td id="file-firestore_read_test-go-LC122" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">batch</span>.<span class="pl-en">Commit</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L123" class="blob-num js-line-number" data-line-number="123"/>
        <td id="file-firestore_read_test-go-LC123" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L124" class="blob-num js-line-number" data-line-number="124"/>
        <td id="file-firestore_read_test-go-LC124" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L125" class="blob-num js-line-number" data-line-number="125"/>
        <td id="file-firestore_read_test-go-LC125" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L126" class="blob-num js-line-number" data-line-number="126"/>
        <td id="file-firestore_read_test-go-LC126" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">read</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">col</span> <span class="pl-c1">*</span>firestore.<span class="pl-smi">CollectionRef</span>) {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L127" class="blob-num js-line-number" data-line-number="127"/>
        <td id="file-firestore_read_test-go-LC127" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">iter</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">Documents</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L128" class="blob-num js-line-number" data-line-number="128"/>
        <td id="file-firestore_read_test-go-LC128" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">snap</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">iter</span>.<span class="pl-en">Next</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L129" class="blob-num js-line-number" data-line-number="129"/>
        <td id="file-firestore_read_test-go-LC129" class="blob-code blob-code-inner js-file-line">	<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L130" class="blob-num js-line-number" data-line-number="130"/>
        <td id="file-firestore_read_test-go-LC130" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">id</span> <span class="pl-c1">:=</span> <span class="pl-s1">snap</span>.<span class="pl-c1">Ref</span>.<span class="pl-c1">ID</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L131" class="blob-num js-line-number" data-line-number="131"/>
        <td id="file-firestore_read_test-go-LC131" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L132" class="blob-num js-line-number" data-line-number="132"/>
        <td id="file-firestore_read_test-go-LC132" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">duration</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">duration</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L133" class="blob-num js-line-number" data-line-number="133"/>
        <td id="file-firestore_read_test-go-LC133" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">rate</span> <span class="pl-c1">:=</span> <span class="pl-c1">*</span><span class="pl-s1">rate</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L134" class="blob-num js-line-number" data-line-number="134"/>
        <td id="file-firestore_read_test-go-LC134" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L135" class="blob-num js-line-number" data-line-number="135"/>
        <td id="file-firestore_read_test-go-LC135" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;start&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L136" class="blob-num js-line-number" data-line-number="136"/>
        <td id="file-firestore_read_test-go-LC136" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wgAll</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">WaitGroup</span>{}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L137" class="blob-num js-line-number" data-line-number="137"/>
        <td id="file-firestore_read_test-go-LC137" class="blob-code blob-code-inner js-file-line">	<span class="pl-k">for</span> <span class="pl-s1">j</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">j</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">duration</span>; <span class="pl-s1">j</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L138" class="blob-num js-line-number" data-line-number="138"/>
        <td id="file-firestore_read_test-go-LC138" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">wgAll</span>.<span class="pl-en">Add</span>(<span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L139" class="blob-num js-line-number" data-line-number="139"/>
        <td id="file-firestore_read_test-go-LC139" class="blob-code blob-code-inner js-file-line">		<span class="pl-k">go</span> <span class="pl-k">func</span>() {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L140" class="blob-num js-line-number" data-line-number="140"/>
        <td id="file-firestore_read_test-go-LC140" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">start</span> <span class="pl-c1">:=</span> <span class="pl-s1">time</span>.<span class="pl-en">Now</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L141" class="blob-num js-line-number" data-line-number="141"/>
        <td id="file-firestore_read_test-go-LC141" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wg</span> <span class="pl-c1">:=</span> <span class="pl-c1">&amp;</span>sync.<span class="pl-smi">WaitGroup</span>{}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L142" class="blob-num js-line-number" data-line-number="142"/>
        <td id="file-firestore_read_test-go-LC142" class="blob-code blob-code-inner js-file-line">			<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">rate</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L143" class="blob-num js-line-number" data-line-number="143"/>
        <td id="file-firestore_read_test-go-LC143" class="blob-code blob-code-inner js-file-line">				<span class="pl-s1">wg</span>.<span class="pl-en">Add</span>(<span class="pl-c1">1</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L144" class="blob-num js-line-number" data-line-number="144"/>
        <td id="file-firestore_read_test-go-LC144" class="blob-code blob-code-inner js-file-line">				<span class="pl-k">go</span> <span class="pl-k">func</span>() {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L145" class="blob-num js-line-number" data-line-number="145"/>
        <td id="file-firestore_read_test-go-LC145" class="blob-code blob-code-inner js-file-line">					<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">Doc</span>(<span class="pl-s1">id</span>).<span class="pl-en">Get</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L146" class="blob-num js-line-number" data-line-number="146"/>
        <td id="file-firestore_read_test-go-LC146" class="blob-code blob-code-inner js-file-line">					<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L147" class="blob-num js-line-number" data-line-number="147"/>
        <td id="file-firestore_read_test-go-LC147" class="blob-code blob-code-inner js-file-line">					<span class="pl-c">// log.Printf(&quot;%+v&quot;, snap.Data())</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L148" class="blob-num js-line-number" data-line-number="148"/>
        <td id="file-firestore_read_test-go-LC148" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L149" class="blob-num js-line-number" data-line-number="149"/>
        <td id="file-firestore_read_test-go-LC149" class="blob-code blob-code-inner js-file-line">					<span class="pl-k">if</span> <span class="pl-c1">*</span><span class="pl-s1">sub</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L150" class="blob-num js-line-number" data-line-number="150"/>
        <td id="file-firestore_read_test-go-LC150" class="blob-code blob-code-inner js-file-line">						<span class="pl-s1">iter</span> <span class="pl-c1">:=</span> <span class="pl-s1">col</span>.<span class="pl-en">Doc</span>(<span class="pl-s1">id</span>).<span class="pl-en">Collection</span>(<span class="pl-s">&quot;sections&quot;</span>).<span class="pl-en">Documents</span>(<span class="pl-s1">ctx</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L151" class="blob-num js-line-number" data-line-number="151"/>
        <td id="file-firestore_read_test-go-LC151" class="blob-code blob-code-inner js-file-line">						<span class="pl-k">for</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L152" class="blob-num js-line-number" data-line-number="152"/>
        <td id="file-firestore_read_test-go-LC152" class="blob-code blob-code-inner js-file-line">							<span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">iter</span>.<span class="pl-en">Next</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L153" class="blob-num js-line-number" data-line-number="153"/>
        <td id="file-firestore_read_test-go-LC153" class="blob-code blob-code-inner js-file-line">							<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">==</span> <span class="pl-s1">iterator</span>.<span class="pl-c1">Done</span> {</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L154" class="blob-num js-line-number" data-line-number="154"/>
        <td id="file-firestore_read_test-go-LC154" class="blob-code blob-code-inner js-file-line">								<span class="pl-k">break</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L155" class="blob-num js-line-number" data-line-number="155"/>
        <td id="file-firestore_read_test-go-LC155" class="blob-code blob-code-inner js-file-line">							}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L156" class="blob-num js-line-number" data-line-number="156"/>
        <td id="file-firestore_read_test-go-LC156" class="blob-code blob-code-inner js-file-line">							<span class="pl-en">panicIf</span>(<span class="pl-s1">err</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L157" class="blob-num js-line-number" data-line-number="157"/>
        <td id="file-firestore_read_test-go-LC157" class="blob-code blob-code-inner js-file-line">							<span class="pl-c">// log.Printf(&quot;%+v&quot;, snap.Data())</span></td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L158" class="blob-num js-line-number" data-line-number="158"/>
        <td id="file-firestore_read_test-go-LC158" class="blob-code blob-code-inner js-file-line">						}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L159" class="blob-num js-line-number" data-line-number="159"/>
        <td id="file-firestore_read_test-go-LC159" class="blob-code blob-code-inner js-file-line">					}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L160" class="blob-num js-line-number" data-line-number="160"/>
        <td id="file-firestore_read_test-go-LC160" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L161" class="blob-num js-line-number" data-line-number="161"/>
        <td id="file-firestore_read_test-go-LC161" class="blob-code blob-code-inner js-file-line">					<span class="pl-s1">wg</span>.<span class="pl-en">Done</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L162" class="blob-num js-line-number" data-line-number="162"/>
        <td id="file-firestore_read_test-go-LC162" class="blob-code blob-code-inner js-file-line">				}()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L163" class="blob-num js-line-number" data-line-number="163"/>
        <td id="file-firestore_read_test-go-LC163" class="blob-code blob-code-inner js-file-line">			}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L164" class="blob-num js-line-number" data-line-number="164"/>
        <td id="file-firestore_read_test-go-LC164" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wg</span>.<span class="pl-en">Wait</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L165" class="blob-num js-line-number" data-line-number="165"/>
        <td id="file-firestore_read_test-go-LC165" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L166" class="blob-num js-line-number" data-line-number="166"/>
        <td id="file-firestore_read_test-go-LC166" class="blob-code blob-code-inner js-file-line">			<span class="pl-s1">wgAll</span>.<span class="pl-en">Done</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L167" class="blob-num js-line-number" data-line-number="167"/>
        <td id="file-firestore_read_test-go-LC167" class="blob-code blob-code-inner js-file-line">		}()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L168" class="blob-num js-line-number" data-line-number="168"/>
        <td id="file-firestore_read_test-go-LC168" class="blob-code blob-code-inner js-file-line">		<span class="pl-s1">time</span>.<span class="pl-en">Sleep</span>(<span class="pl-c1">1</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L169" class="blob-num js-line-number" data-line-number="169"/>
        <td id="file-firestore_read_test-go-LC169" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L170" class="blob-num js-line-number" data-line-number="170"/>
        <td id="file-firestore_read_test-go-LC170" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">wgAll</span>.<span class="pl-en">Wait</span>()</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L171" class="blob-num js-line-number" data-line-number="171"/>
        <td id="file-firestore_read_test-go-LC171" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">&quot;end&quot;</span>)</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L172" class="blob-num js-line-number" data-line-number="172"/>
        <td id="file-firestore_read_test-go-LC172" class="blob-code blob-code-inner js-file-line">	<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">time</span>.<span class="pl-en">Now</span>().<span class="pl-en">Sub</span>(<span class="pl-s1">start</span>))</td>
      </tr>
      <tr>
        <td id="file-firestore_read_test-go-L173" class="blob-num js-line-number" data-line-number="173"/>
        <td id="file-firestore_read_test-go-LC173" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/51c00e2234ab3568b108f85076d4730f/raw/9f54e2feafaddf35893f571339435943e4555a48/firestore_read_test.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/51c00e2234ab3568b108f85076d4730f#file-firestore_read_test-go">firestore_read_test.go</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.00.12.png" alt="----------2022-05-11-10.00.12" loading="lazy"/></p>
<p>300/sまではギリギリ捌ききれていそうです。500/sで急に遅くなっているのは1秒間に捌ききれずにどんどん詰まっていったためと思われます。</p>
<p>追加の検証で、単一documentの取得後にdocumentに紐づくsub collection配下のdocument（今回は3つ）を全取得するような処理を試してみました。結果は以下になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.00.30.png" alt="----------2022-05-11-10.00.30" loading="lazy"/></p>
<p>100/s はほぼ0.4sで完了していましたが、1回だけ1s越えがありました。それ以外はほぼ変わらない結果になりました。</p>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>単一アプリケーションからgoroutineで試してもこれくらいの速度が出るなら、懸念していたほど遅くはならなそうなので安心しました。</p>
<!--kg-card-end: markdown--></link>]]></content:encoded></item><item><title><![CDATA[TypeScriptでnullかundefinedの時にデフォルト値をセットする方法]]></title><description><![CDATA[こんにちは、いわむらです

今回はTypeScriptでnullとundefinedの時にデフォルト値をセットする方法を紹介していきます

TypeScript 3.7 (2019/11 release)で追加されたnullish
coalescingというnull合体演算子を使うと簡単にデフォルト値をセットすることができます

試しにuserオブジェクトのhogeプロパティを返す関数を使ってみます

上記getHoge関数を各user毎に実行していくと返ってくる値は記述したとおり以下の結果になりました

空文字の場合は正しく空文字が出力されているのがわかります

今までデフォルト値をセットするときはOR(||)を使ったりtypeofを使用した厳密等価していましたが、ORだと空文字や0などもfalseの判定になってしまっていたのと厳密等価を使用したnullやundefinedの判定は少し冗長な書き方を使っていましたがこれからはnull合体演算子を使ってワンライナーでデフォルト値をセットすることができるという紹介でした。

ちなみにJavaScriptでもES2020からは同じくnull]]></description><link>https://tech.anti-pattern.co.jp/typescriptdenullkaundefinednoshi-nidehuorutozhi-wosetutosurufang-fa/</link><guid isPermaLink="false">Ghost__Post__6103e8663986b000013a448f</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Wed, 29 Jul 2020 15:43:00 GMT</pubDate><content:encoded><![CDATA[<p>こんにちは、いわむらです</p><p>今回はTypeScriptでnullとundefinedの時にデフォルト値をセットする方法を紹介していきます</p><p>TypeScript 3.7 (2019/11 release)で追加されたnullish coalescingというnull合体演算子を使うと簡単にデフォルト値をセットすることができます</p><p>試しにuserオブジェクトのhogeプロパティを返す関数を使ってみます</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*bXBA4NrRLVHCq_lZoedIxw.png" class="kg-image" alt="" loading="lazy"/></figure><p>上記getHoge関数を各user毎に実行していくと返ってくる値は記述したとおり以下の結果になりました</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*EYIDmNrCK2vkV8nWaxk-tg.png" class="kg-image" alt="" loading="lazy"/></figure><p>空文字の場合は正しく空文字が出力されているのがわかります</p><p>今までデフォルト値をセットするときはOR(||)を使ったりtypeofを使用した厳密等価していましたが、ORだと空文字や0などもfalseの判定になってしまっていたのと厳密等価を使用したnullやundefinedの判定は少し冗長な書き方を使っていましたがこれからはnull合体演算子を使ってワンライナーでデフォルト値をセットすることができるという紹介でした。</p><p>ちなみにJavaScriptでもES2020からは同じくnullish coalescingが追加されるようなので使えるブラウザは限られますが試してみてはいかがでしょうか？</p><p>MDN :<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator" rel="noopener">https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator</a></p><p>TypeScript3.7 : <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html" rel="noopener">https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html</a></p><p>以上、TypeScriptでnullish coalescingを使ってデフォルト値をセットする方法のご紹介でした。</p>]]></content:encoded></item><item><title><![CDATA[公開鍵暗号の1つであるRSA暗号をGoで実装してみる]]></title><description><![CDATA[注意: ところどころ簡素化してあるところはあります

公開鍵暗号とは
> 公開鍵暗号Public-key cryptography
[https://en.wikipedia.org/wiki/Public-key_cryptography]暗号化
[https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%8C%96]復号
[https://ja.wikipedia.org/wiki/%E5%BE%A9%E5%8F%B7]暗号方式
[https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E6%96%B9%E5%BC%8F]
公開鍵暗号 - Wikipediaウィキメディア財団Contributors to Wikimedia projects
[https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7]流れ
 * 2種類の素数p,qを準備する(p != q)
 * 各素数の積 Nを計算 (p * q)
]]></description><link>https://tech.anti-pattern.co.jp/gong-kai-jian-an-hao-no1tudearursaan-hao-wogodeshi-zhuang-sitemiru/</link><guid isPermaLink="false">Ghost__Post__60fab24b3986b000013a3bfd</guid><category><![CDATA[Go]]></category><category><![CDATA[RSA]]></category><category><![CDATA[Crypt]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 29 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>注意: ところどころ簡素化してあるところはあります</p><h3 id="%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7%E3%81%A8%E3%81%AF">公開鍵暗号とは</h3><blockquote><strong>公開鍵暗号</strong><a href="https://en.wikipedia.org/wiki/Public-key_cryptography" rel="noopener">Public-key cryptography</a><a href="https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%8C%96" rel="noopener">暗号化</a><a href="https://ja.wikipedia.org/wiki/%E5%BE%A9%E5%8F%B7" rel="noopener">復号</a><a href="https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E6%96%B9%E5%BC%8F" rel="noopener">暗号方式</a></blockquote><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7"><div class="kg-bookmark-content"><div class="kg-bookmark-title">公開鍵暗号 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/50px-Question_book-4.svg.png"/></div></a></figure><h3 id="%E6%B5%81%E3%82%8C">流れ</h3><ul><li>2種類の素数p,qを準備する(p != q)</li><li>各素数の積 Nを計算 (p * q)</li><li>各素数から1を引いた値の最小公倍数Lを計算 lcm((p-1) * (q-1))</li><li>L未満でその値と互いに素な任意の値 Eを準備(公開鍵)</li><li>Lを法として公開鍵との積が1となる任意の値 Dを準備（秘密鍵）</li><li>EとNを使い暗号化</li><li>DとNを使い復号</li></ul><h4 id="2%E7%A8%AE%E9%A1%9E%E3%81%AE%E7%B4%A0%E6%95%B0pq%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8Bp-q">2種類の素数p,qを準備する(p != q)</h4><p>本来であれば、ある程度大きい素数を疑似乱数生成器で作る必要があるが、今回は学習も兼ねて、2つの値を自身で設定できるようにしてある。</p><p>※また、学習のためなので int 型としているが、本来はもっと大きな数値を扱える型としたほうが良い</p><!--kg-card-begin: markdown--><pre><code class="language-go">var p, q 
int fmt.Println(&quot;enter two defferent primary numbers&quot;)
fmt.Println(&quot;like 17 19&quot;)
fmt.Scan(&amp;p, &amp;q)
</code></pre>
<!--kg-card-end: markdown--><h4 id="%E5%90%84%E7%B4%A0%E6%95%B0%E3%81%AE%E7%A9%8Dn%E3%82%92%E8%A8%88%E7%AE%97-p-q">各素数の積Nを計算 (p * q)</h4><p><code>N = p*q</code></p><p>※このNは公開情報である</p><p>Nが大きい値の際に、素因数分解が現実的な時間で解読不可能なことを利用している。</p><p>(計算量的安全性)</p><p><em>Nの値としての推奨は 1024–4096ビット(Wikipediaより)</em></p><h4 id="%E5%90%84%E7%B4%A0%E6%95%B0%E3%81%8B%E3%82%891%E3%82%92%E5%BC%95%E3%81%84%E3%81%9F%E5%80%A4%E3%81%AE%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0l%E3%82%92%E8%A8%88%E7%AE%97-lcmp-1-q-1">各素数から1を引いた値の最小公倍数Lを計算 lcm((p-1) * (q-1))</h4><p>秘密鍵と公開鍵を作るためにLを準備する</p><p>ユークリッドの互除法を使い計算</p><!--kg-card-begin: markdown--><pre><code class="language-go">
L := culcLeastCommonMultiple(p-1, q-1)
func culcLeastCommonMultiple(a, b int) int {
  c := a * b
  if a &lt; b {
    tmp := a  a = b  b = tmp
   }
   r := a % b
   for r != 0 {
     a = b
     b = r
     r = a % b
   }
   return c / b
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="l%E6%9C%AA%E6%BA%80%E3%81%A7%E3%81%9D%E3%81%AE%E5%80%A4%E3%81%A8%E4%BA%92%E3%81%84%E3%81%AB%E7%B4%A0%E3%81%AA%E4%BB%BB%E6%84%8F%E3%81%AE%E6%95%B0e%E3%82%92%E6%BA%96%E5%82%99%E5%85%AC%E9%96%8B%E9%8D%B5">L未満でその値と互いに素な任意の数Eを準備(公開鍵)</h4><p>gcd(E,L) = 1</p><p>こちらは簡易的に、毎回乱数を取得して、それが互いに素か調べて当てはまった場合それを公開鍵とするようにしている。</p><!--kg-card-begin: markdown--><pre><code class="language-go">E := makePublicKey(L)
func makePublicKey(l int)int64 {
  rand.Seed(time.Now().UnixNano())
  r := rand.Intn(l)
  for greatestCommonDivisor(r, l) != 1 {
    r = rand.Intn(l)
  }
  return int64(r)
}

</code></pre>
<!--kg-card-end: markdown--><p>最小公倍数をユークリッドの互除法で取得し、それが1となるまで実行</p><!--kg-card-begin: markdown--><pre><code class="language-go">
func greatestCommonDivisor(a, b int) int {
  if a &lt; b {
    tmp := a
    a = b
    b = tmp
  }
  r := a % b
  for r != 0 {
    a = b
    b = r
    r = a % b
  }
  return b
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="l%E3%82%92%E6%B3%95%E3%81%A8%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%A8%E3%81%AE%E7%A9%8D%E3%81%8C1%E3%81%A8%E3%81%AA%E3%82%8B%E4%BB%BB%E6%84%8F%E3%81%AE%E5%80%A4d%E3%82%92%E6%BA%96%E5%82%99%EF%BC%88%E7%A7%98%E5%AF%86%E9%8D%B5%EF%BC%89">Lを法として公開鍵との積が1となる任意の値Dを準備（秘密鍵）</h4><p>// E*D mod L = 1 となるEを探す</p><p>こちらも簡易的に繰り上げ式で対象の値を取得</p><!--kg-card-begin: markdown--><pre><code class="language-go">D := int64(makePrivateKey(E, int64(L)))
func makePrivateKey(e int64, l int64) int64 {
  i := int64(2)
  for i*e%l != 1 {
    i++
  }
  return i
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="let%E2%80%99s-%E6%9A%97%E5%8F%B7%E5%8C%96">Let’s 暗号化</h4><p>//planText^E mod N</p><p>// planText^E mod N</p><!--kg-card-begin: markdown--><p><code> cryptgram := new(big.Int).Exp(big.NewInt(planText), big.NewInt(E), big.NewInt(N))</code></p>
<!--kg-card-end: markdown--><h4 id="let%E2%80%99s-%E5%BE%A9%E5%8F%B7">Let’s <strong>復号</strong></h4><p>// cryptgram^D mod N</p><!--kg-card-begin: markdown--><p><code>res := new(big.Int).Exp(cryptgram, big.NewInt(D), big.NewInt(N))</code></p>
<!--kg-card-end: markdown--><p>全コード</p><!--kg-card-begin: html--><script src="https://gist.github.com/kooooohe/642e9e68e3efbed02c2b28a9b7e79646.js"/><!--kg-card-end: html--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/RSA/blob/master/main.go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">RSA/main.go at master · kooooohe/RSA</div><div class="kg-bookmark-description">Contribute to kooooohe/RSA development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/109e785239fa8084d1d1ce4027a7d36d71862f707efa9e7b32e7b50108faf7ea/kooooohe/RSA"/></div></a></figure><p/><h3 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h3><p>今回は小さい数値しか暗号化、復号できませんが。</p><p>大枠流れはつかめると思います。</p><p>普段何気なく使っているものを、自分で実装するというのは楽しいですね</p><p>参考:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7"><div class="kg-bookmark-content"><div class="kg-bookmark-title">RSA暗号 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Question_book-4.svg/50px-Question_book-4.svg.png"/></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E7%A7%98%E5%AF%86%E3%81%AE%E5%9B%BD%E3%81%AE%E3%82%A2%E3%83%AA%E3%82%B9-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B015643CPE/ref&#x3D;sr_1_1?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;crid&#x3D;1MKMKETE6NUVZ&amp;dchild&#x3D;1&amp;keywords&#x3D;%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80&amp;qid&#x3D;1600837948&amp;s&#x3D;books&amp;sprefix&#x3D;%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%2Cstripbooks%2C479&amp;sr&#x3D;1-1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">暗号技術入門 第3版　秘密の国のアリス | 結城 浩 | コンピュータ・IT | Kindleストア | Amazon</div><div class="kg-bookmark-description">Amazonで結城 浩の暗号技術入門 第3版　秘密の国のアリス。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">結城 浩</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:358-3647777-8948302:H5MDW8VZDKPSDVSKMA0D$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DH5MDW8VZDKPSDVSKMA0D%26pty%3DDetail%26spty%3DGlance%26pti%3DB087X9QQB7:1000"/></div></a></figure>]]></content:encoded></item><item><title><![CDATA[【GAS】Google Calendar APIでMeetビデオ会議付き予定を作成してみた]]></title><description><![CDATA[Anti-Pattern こおりやまです

今回GASでCalendar APIを利用しMeetビデオ会議付き予定を作成したので、こちらで紹介したいと思います。

まずは、 [リソース]-[Googleの拡張サービス]から Calendar APIを有効にします。



あとはコードを書くだけですね。。。

ポイントはイベントに conferenceData を定義して、作成(Insert)のパラメータに {conferenceDataVersion: 1}
を設定して呼び出せばMeetビデオ会議付きイベントが作成されます。

// 作成するカレンダーのイベント定義  
  var createEvent = {  
    summary: 'イベントのタイトル',  
    start: {  
      dateTime: '開始日'  
    },  
    end: {  
      dateTime: '終了日'  
    },  
    conferenceData: {  
      createRequest: {  
        conferen]]></description><link>https://tech.anti-pattern.co.jp/gas-google-calendar-apidemeetbideohui-yi-fu-kiyu-ding-wozuo-cheng-sitemita/</link><guid isPermaLink="false">Ghost__Post__610b68a13986b000013a51cd</guid><dc:creator><![CDATA[Hiroki Kooriyama]]></dc:creator><pubDate>Wed, 15 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Anti-Pattern こおりやまです</p>
<p>今回GASでCalendar APIを利用しMeetビデオ会議付き予定を作成したので、こちらで紹介したいと思います。</p>
<p>まずは、 <code>[リソース]-[Googleの拡張サービス]</code>から <code>Calendar API</code>を有効にします。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_qihEgoJ-vHaRq11ujKG5EA.png" alt="1_qihEgoJ-vHaRq11ujKG5EA" loading="lazy"/></p>
<p>あとはコードを書くだけですね。。。</p>
<p>ポイントはイベントに <code>conferenceData</code> を定義して、作成(Insert)のパラメータに <code>{conferenceDataVersion: 1}</code>を設定して呼び出せばMeetビデオ会議付きイベントが作成されます。</p>
<pre><code>// 作成するカレンダーのイベント定義  
  var createEvent = {  
    summary: 'イベントのタイトル',  
    start: {  
      dateTime: '開始日'  
    },  
    end: {  
      dateTime: '終了日'  
    },  
    conferenceData: {  
      createRequest: {  
        conferenceSolutionKey: {  
          type: &quot;hangoutsMeet&quot;  
        },  
        requestId: 'リクエストID'  
      }  
    }  
  };//イベントの作成  
  var newEvent = Calendar.Events.insert(createEvent, 'カレンダーID', { conferenceDataVersion: 1 });
</code></pre>
<p>実行するとイベントオブジェクトが帰ってくるのであとは好きなようにあれですね。</p>
<p>ちなみに当時MeetはG Suiteユーザのみ利用可能でしたが、コロナ禍で無料アカウントでも利用可能となっているので同じコードで作成可能か実行してみました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_EuPVUlKydHgy0ZELdCoPsQ.png" alt="1_EuPVUlKydHgy0ZELdCoPsQ" loading="lazy"/></p>
<p>問題なくできました！！<br>
では楽しいテレビ会議ライフを</br></p>
<p>参照</p>
<p><a href="https://developers-jp.googleblog.com/2018/01/hangouts-meet-now-available-in-google.html">https://developers-jp.googleblog.com/2018/01/hangouts-meet-now-available-in-google.html</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Rustでベクターの要素から指定したindexの値を取得しようとしてハマった話]]></title><description><![CDATA[cannot move out of a shared reference
Rust初心者です。上記のエラーでハマりました。

vectorの要素のうち指定したindexの値だけを取り出したい
Goでいうと以下のような処理です。

func get() Hoge {  
    vector := []Hoge{{name: "first"}}  
    return vector[0]  
}

type Hoge struct {  
    name string  
}


まあ普通にできます。Rustでこれと似たようなことをするとき、最初に以下のようなコード書きました。

fn get() -> Result<Hoge, String> {  
    let vector: Vec<Hoge> = vec![Hoge {  
        name: String::from("first"),  
    }];
    
    if let Some(&first) = vector.get(0) {  
        return Ok(first);  
 ]]></description><link>https://tech.anti-pattern.co.jp/rust-index/</link><guid isPermaLink="false">Ghost__Post__6102bd073986b000013a43f3</guid><category><![CDATA[Rust]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 15 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="cannot-move-out-of-a-shared-reference">cannot move out of a shared reference</h2>
<p>Rust初心者です。上記のエラーでハマりました。</p>
<h2 id="vector%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AE%E3%81%86%E3%81%A1%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9Findex%E3%81%AE%E5%80%A4%E3%81%A0%E3%81%91%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%9F%E3%81%84">vectorの要素のうち指定したindexの値だけを取り出したい</h2>
<p>Goでいうと以下のような処理です。</p>
<pre><code>func get() Hoge {  
    vector := []Hoge{{name: &quot;first&quot;}}  
    return vector[0]  
}

type Hoge struct {  
    name string  
}
</code></pre>
<p>まあ普通にできます。Rustでこれと似たようなことをするとき、最初に以下のようなコード書きました。</p>
<pre><code>fn get() -&gt; Result&lt;Hoge, String&gt; {  
    let vector: Vec&lt;Hoge&gt; = vec![Hoge {  
        name: String::from(&quot;first&quot;),  
    }];
    
    if let Some(&amp;first) = vector.get(0) {  
        return Ok(first);  
    }
    
    Err(&quot;error&quot;.to_string())  
}

struct Hoge {  
    name: String,  
}
</code></pre>
<p>これはコンパイルエラーになります。</p>
<pre><code>error[E0507]: cannot move out of a shared reference  
  --&gt; src/main.rs:6:27  
  |  
6 |     if let Some(&amp;first) = vector.get(0) {  
  |                  -----    ^^^^^^^^^^^^^  
  |                  |  
  |                  data moved here  
  |                  move occurs because `first` has type `Hoge`, which does not implement the `Copy` trait
</code></pre>
<p>調べた結果、原因は <code>vector</code> から0番目の要素の所有権を奪おうとしていることのようです。<code>vector.get(0)</code> は（存在すれば）<code>vector</code>の0番目の要素の参照を返しますが、<code>let Some(&amp;first) = vector.get(0)</code>で所有権を奪って<code>first</code> を生成しようとしているのでエラーになるようです。</p>
<h2 id="stdmemreplace-%E3%82%92%E4%BD%BF%E3%81%86"><code>std::mem::replace</code> を使う</h2>
<p><code>vector[0]</code>の値を別の値と入れ替えることはできます。</p>
<pre><code>fn get() -&gt; Result&lt;Hoge, String&gt; {  
    let mut vector: Vec&lt;Hoge&gt; = vec![Hoge {  
        name: String::from(&quot;first&quot;),  
    }];
    
    let first = std::mem::replace(  
        &amp;mut vector[0],  
        Hoge {  
            name: String::from(&quot;&quot;),  
        },  
    )
    
    return Ok(first);  
}
</code></pre>
<p><code>vector[0]</code> を取り出し、代わりに新しい構造体をセットしています。これでコンパイルが通りました。</p>
<p>個人的には、元の配列の要素を<code>Some</code> でくくり、<code>replace</code> 時に<code>None</code> で置き換えたほうが良いかなと思いました。理由は以下です。</p>
<ul>
<li>代わりの要素を生成するのが面倒</li>
<li>要素のstructが複雑な場合は無駄にコストがかかる</li>
<li>2回目以降のアクセスで<code>None</code> が返ってくるので参照済みかの判定ができる</li>
</ul>
<pre><code>fn get() -&gt; Result&lt;Hoge, String&gt; {  
    let mut vector = vec![Some(Hoge {  
        name: String::from(&quot;first&quot;),  
    })];
    
    if let Some(first) = std::mem::replace(&amp;mut vector[0], None) {  
        return Ok(first);  
    }
    
    Err(&quot;error&quot;.to_string())  
}
</code></pre>
<p>ちなみに、最初のエラーメッセージに書いてありますが、要素の型に<code>Copy</code> トレイトが実装されていれば、<code>vector.get(0)</code>の方法でもできるらしいです。取り出すというより、元の値をコピーするみたいです。</p>
<pre><code>fn get() -&gt; Result&lt;Hoge, String&gt; {  
    let vector: Vec&lt;i64&gt; = vec![1];
    
    if let Some(&amp;first) = vector.get(0) {  
        return Ok(Hoge {  
            name: first.to_string(),  
        });  
    }
    
    Err(&quot;error&quot;.to_string())  
}
</code></pre>
<p>Rustでは他の言語で普通にできることができなくで躓きがちです。難しい…</p>
<h2 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h2>
<ul>
<li><a href="https://teratail.com/questions/142027">https://teratail.com/questions/142027</a></li>
<li><a href="https://qnighy.hatenablog.com/entry/2017/05/18/070000">https://qnighy.hatenablog.com/entry/2017/05/18/070000</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[スプレッドシートで日本語以外を半角にしたい]]></title><description><![CDATA[そんな時ありますよね？

こんにちは。小笹です。

スプレッドシートのデータを分析する時に半角と全角が混じっていて、困りました。日本語以外の文字で全角になっているのは特に気になってしまいます。

全部半角に揃えちゃうってやり方もありなのかもしれませんが、逆に日本語が半角だとそれはそれで違和感。

ｱﾝﾁﾊﾟﾀｰﾝ

ちょっと変な感じがします。
なので表題のことを実現したくスプレッドシートの関数を調べてみました。

結果
\=IF(NOT(DETECTLANGUAGE(対象のセル)=”ja”),ASC(対象のセル),対象のセル)


解説
DETECTLANGUAGE(対象のセル)


これはスプレッドシートの関数で、対象の言語を判定してくれます。
指定した範囲に複数の言語が含まれている場合には、最初に見つかったテキストが評価対象となりますので注意！

ASC(対象のセル)


ASC関数は文字列を半角にします。

今回はIFNOTを使って、「対象のセル(文字列を想定)が、日本語じゃなければ、半角にする」としています。



これでスッキリ！

こちらからは以上です。]]></description><link>https://tech.anti-pattern.co.jp/how-to-change-non-japanese-characters-in-a-spreadsheet-to-half-width-characters/</link><guid isPermaLink="false">Ghost__Post__61014ab13986b000013a4062</guid><category><![CDATA[GoogleSpreadSheet]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 07 Jul 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/how-to-change-non-japanese-characters-in-a-spreadsheet-to-half-width-characters-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/how-to-change-non-japanese-characters-in-a-spreadsheet-to-half-width-characters-1.png" alt="スプレッドシートで日本語以外を半角にしたい"/><p>そんな時ありますよね？</p>
<p>こんにちは。小笹です。</p>
<p>スプレッドシートのデータを分析する時に半角と全角が混じっていて、困りました。日本語以外の文字で全角になっているのは特に気になってしまいます。</p>
<p>全部半角に揃えちゃうってやり方もありなのかもしれませんが、逆に日本語が半角だとそれはそれで違和感。</p>
<p>ｱﾝﾁﾊﾟﾀｰﾝ</p>
<p>ちょっと変な感じがします。<br>
なので表題のことを実現したくスプレッドシートの関数を調べてみました。</br></p>
<h2 id="%E7%B5%90%E6%9E%9C">結果</h2>
<pre><code>\=IF(NOT(DETECTLANGUAGE(対象のセル)=”ja”),ASC(対象のセル),対象のセル)
</code></pre>
<h2 id="%E8%A7%A3%E8%AA%AC">解説</h2>
<pre><code>DETECTLANGUAGE(対象のセル)
</code></pre>
<p>これはスプレッドシートの関数で、対象の言語を判定してくれます。<br>
指定した範囲に複数の言語が含まれている場合には、最初に見つかったテキストが評価対象となりますので注意！</br></p>
<pre><code>ASC(対象のセル)
</code></pre>
<p>ASC関数は文字列を半角にします。</p>
<p>今回はIFNOTを使って、「対象のセル(文字列を想定)が、日本語じゃなければ、半角にする」としています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/how-to-change-non-japanese-characters-in-a-spreadsheet-to-half-width-characters.png" alt="スプレッドシートで日本語以外を半角にしたい" loading="lazy"/></p>
<p>これでスッキリ！</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感]]></title><description><![CDATA[Amazon Honeycodeとは
Amazonによるフルマネージド型NoCodeサービス。
スプレッドシートモデルを採用していて爆速でアプリを作れるらしいので早速触ってみました。本稿記載時(2020/06/26)ではまだベータ版です。
詳しくは公式ブログ
[https://aws.amazon.com/jp/blogs/news/introducing-amazon-honeycode-build-web-mobile-apps-without-writing-code/]
をご覧ください。

登録


「Try for free」を押下。



HoneyCode用にアカウントを作成しましょう。



アカウントを作成するとメールで承認を求められるので承認します。



ログイン！！

Todoアプリを作ってみる
Amazon Honeycodeには一般的なアプリケーションのテンプレートが用意されていました。



今回はSimple To-doを作ってみます。

「Use a template」から選んでいきましょう。



すると早速テーブルが作成されます。スプレッドシートモ]]></description><link>https://tech.anti-pattern.co.jp/using-amazon-honeycode/</link><guid isPermaLink="false">Ghost__Post__610148893986b000013a3ff4</guid><category><![CDATA[AmazonHoneycode]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Fri, 26 Jun 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/amazon-honeycode-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="amazon-honeycode%E3%81%A8%E3%81%AF">Amazon Honeycodeとは</h1>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/amazon-honeycode-1-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感"/><p>Amazonによるフルマネージド型NoCodeサービス。<br>
スプレッドシートモデルを採用していて爆速でアプリを作れるらしいので早速触ってみました。本稿記載時(2020/06/26)ではまだベータ版です。<br>
詳しくは<a href="https://aws.amazon.com/jp/blogs/news/introducing-amazon-honeycode-build-web-mobile-apps-without-writing-code/">公式ブログ</a>をご覧ください。</br></br></p>
<h1 id="%E7%99%BB%E9%8C%B2">登録</h1>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-1-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>「Try for free」を押下。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-2-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>HoneyCode用にアカウントを作成しましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-3-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>アカウントを作成するとメールで承認を求められるので承認します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-4-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>ログイン！！</p>
<h1 id="todo%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">Todoアプリを作ってみる</h1>
<p>Amazon Honeycodeには一般的なアプリケーションのテンプレートが用意されていました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-5-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>今回はSimple To-doを作ってみます。</p>
<p>「Use a template」から選んでいきましょう。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-6-1.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>すると早速テーブルが作成されます。スプレッドシートモデルを採用しているとはいえ、ちょっと読み解かないとなりませんね。</p>
<p>この時点で心が折れてしまう人がいないか少し心配になりました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-7.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>デフォルトのアプリケーション作成画面はこちら。Mobile画面が優先的に表示されているあたり時代を感じさせてくれます。</p>
<p>データを表示しながら画面を作れるのは素敵です！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-8.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>雷アイコンのところを押下するとアクションの設定画面へ。</p>
<p>To-doアプリということで通知設定がすでになされています。すごい！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-9.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>アプリケーションの画面としてはこんな感じです。</p>
<p>タスクが並んでいてチェックを入れると下段のCOMLETEDに移動います。</p>
<h1 id="%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%84%E3%81%98%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">ちょっといじってみる</h1>
<p>デフォルトの構成は分かったので、少しいじってみたいと思います。<br>
To-doに複数タグを付与して表示する。簡単そうですね。</br></p>
<p>...</p>
<p>すごく難しい。</p>
<p>単純に考えるとリレーションテーブルを作ってN:Nの関係を表現すればいい気がしていたんですが、なかなかうまくいきません。</p>
<p>サンプルにもなかったしそもそもIdを振って挙動を制御するといった発想自体切り替えなくてはならないのかと思いました。</p>
<p>To-doアプリの中で、特に新鮮だったのはReminderOptionsテーブルです。</p>
<p>フィルタ機能を使ってTasksテーブルにある該当データ数を表示しています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-10.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p>このRemind OnカラムはTasksテーブルにも存在しており、入力規制などに活用されています。</p>
<p>一旦作戦を変えてデータを作ってみます。</p>
<h2 id="tags%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">Tagsテーブルの作成</h2>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-11.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-12.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<h2 id="task%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%ABtags%E3%82%AB%E3%83%A9%E3%83%A0%E3%82%92%E8%BF%BD%E5%8A%A0">TaskテーブルにTagsカラムを追加</h2>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-13.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<h2 id="%E3%81%82%E3%81%A8%E3%81%AF%E7%94%BB%E9%9D%A2%E3%81%A0%E3%81%91">あとは画面だけ</h2>
<p>あとはTagsのデータをリストっぽく表示できればいいかと思ったんですが、どうやら一つのセグメントに対してリストは一個しか設定できない。=リストの中にリストは作れない、ようでした……。(違ったらどなたか教えてください)</p>
<p>仕方ないので諦めて、とりあえず紐づいているタグの数を表示させることに。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-14.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/amazon-honeycode-15.png" alt="ソフトウェアエンジニアがAmazon製NoCodeサービスの「Amazon Honeycode」を触ってみた所感" loading="lazy"/></p>
<h1 id="%E6%89%80%E6%84%9F">所感</h1>
<p>かなり制約があるがある感じはしますが、アプリを作っている時とコーディングしている時と感覚が近いです。</p>
<p>むしろ様々な制約によって安全にアプリ開発できるのかもしれないなと思いました。</p>
<p>が、やはりエンジニアリングの知識なくして触るのは厳しいですね。</p>
<p>NoCode(コーディングできなくていいとは言ってない)</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Terraformを使いAWSにSSL通信と独自ドメインを使ったStatic websiteを構築する話し(GitHub Actionsもあるよ)]]></title><description><![CDATA[
ざっくりしたいこと
Vue.js でできたStatic websiteを独自ドメイン with SSLで公開する

SSL証明書の発行、サブドメイン作成などもすべて、できる限りTerraformで作成する

使用技術:
・Vue.js

・Terraform(v0.12.26)

・GitHub Actions

その他実行環境:
 * aws-cli/2.0.19
 * Python/3.8.3
 * Linux/5.4.0–37-generic botocore/2.0.0dev23

Vue.js
Static websiteの作成

Terraform
前提: State用のS3は作成済み。ドメインはRoute53で取得済み。
Deployで作ったものはすべて壊せるようにしたい

S3,Cloud Front,ACM,Route53あたりをTerraformで触っていく。

以下のことをすべてTerraformで自動化する

S3:Privateで作成＆Force Deleteの有効化

blog-terraform-aws-static-site-s3.tfGitHub G]]></description><link>https://tech.anti-pattern.co.jp/untitled-2/</link><guid isPermaLink="false">Ghost__Post__60faaf3a3986b000013a3ba2</guid><category><![CDATA[Terraform]]></category><category><![CDATA[AWS]]></category><category><![CDATA[GitHub Actions]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 24 Jun 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<h3/><h3 id="%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%97%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">ざっくりしたいこと</h3><p>Vue.js でできたStatic websiteを独自ドメイン with SSLで公開する</p><p>SSL証明書の発行、サブドメイン作成などもすべて、できる限りTerraformで作成する</p><h3 id="%E4%BD%BF%E7%94%A8%E6%8A%80%E8%A1%93">使用技術:</h3><p>・Vue.js</p><p>・Terraform(v0.12.26)</p><p>・GitHub Actions</p><h4 id="%E3%81%9D%E3%81%AE%E4%BB%96%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83">その他実行環境:</h4><!--kg-card-begin: markdown--><ul>
<li>aws-cli/2.0.19</li>
<li>Python/3.8.3</li>
<li>Linux/5.4.0–37-generic botocore/2.0.0dev23</li>
</ul>
<!--kg-card-end: markdown--><h4 id="vuejs">Vue.js</h4><p>Static websiteの作成</p><h4 id="terraform">Terraform</h4><p>前提: State用のS3は作成済み。ドメインはRoute53で取得済み。<br>Deployで作ったものはすべて壊せるようにしたい</br></p><p>S3,Cloud Front,ACM,Route53あたりをTerraformで触っていく。</p><p>以下のことをすべてTerraformで自動化する</p><p>S3:Privateで作成＆Force Deleteの有効化</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/1d6e4b92f7990002307589b3c4f8421d"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-terraform-aws-static-site-s3.tf</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a><figcaption>]</figcaption></figure><!--kg-card-begin: markdown--><pre><code class="language-tf">resource &quot;aws_s3_bucket&quot; &quot;site&quot; {
  bucket = var.bucket_name
  acl    = &quot;private&quot;
  tags = {
    name = var.tag
  }
  force_destroy = true
  versioning {
    enabled = true
  }
}

resource &quot;aws_s3_bucket_policy&quot; &quot;site&quot; {
  bucket = aws_s3_bucket.site.id
  policy = data.aws_iam_policy_document.s3_site_policy.json
}

data &quot;aws_iam_policy_document&quot; &quot;s3_site_policy&quot; {
  statement {
    actions   = [&quot;s3:GetObject&quot;]
    resources = [&quot;${aws_s3_bucket.site.arn}/*&quot;]

    principals {
      type        = &quot;AWS&quot;
      identifiers = [aws_cloudfront_origin_access_identity.site.iam_arn]
    }
  }
}

</code></pre>
<!--kg-card-end: markdown--><p>CloudFront:作成した(S3,証明書,Domain)と紐づけていく、存在しないページはすべて/index.htmlにリダイレクト</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/183a76378bfcae4b83378336741e4514"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-terraform-aws-static-site-cloud-front.tf</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>locals {
  s3_origin_id = &quot;s3-origin-${var.site_domain}&quot;
}

resource &quot;aws_cloudfront_origin_access_identity&quot; &quot;site&quot; {
  comment = var.site_domain
}

resource &quot;aws_cloudfront_distribution&quot; &quot;site&quot; {
  tags = {
    name = var.tag
  }
  origin {

    domain_name = aws_s3_bucket.site.bucket_regional_domain_name
    origin_id   = local.s3_origin_id

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.site.cloudfront_access_identity_path
    }
  }

  enabled             = true
  is_ipv6_enabled     = true
  comment             = var.site_domain
  default_root_object = &quot;index.html&quot;

  default_cache_behavior {
    allowed_methods  = [&quot;GET&quot;, &quot;HEAD&quot;]
    cached_methods   = [&quot;GET&quot;, &quot;HEAD&quot;]
    target_origin_id = local.s3_origin_id

    forwarded_values {
      query_string = false
      cookies {
        forward = &quot;none&quot;
      }
    }

    viewer_protocol_policy = &quot;redirect-to-https&quot;
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
  }

  restrictions {
    geo_restriction {
      restriction_type = &quot;none&quot;
    }
  }

  custom_error_response {
    error_caching_min_ttl = 3000
    error_code            = 404
    response_code         = 200
    response_page_path    = &quot;/index.html&quot;
  }

  custom_error_response {
    error_caching_min_ttl = 3000
    error_code            = 403
    response_code         = 200
    response_page_path    = &quot;/index.html&quot;
  }



  price_class = &quot;PriceClass_200&quot;

  # CloudFrontドメインの証明書を利用
  //viewer_certificate {
  //  cloudfront_default_certificate = true
  //}


  aliases = [var.site_domain]

  viewer_certificate {
    acm_certificate_arn      = aws_acm_certificate_validation.acm_cert.certificate_arn
    ssl_support_method       = &quot;sni-only&quot;
    minimum_protocol_version = &quot;TLSv1&quot;
  }
}
</code></pre>
<!--kg-card-end: markdown--><p>Route53: 取得済みの独自ドメインから指定のサブドメインのHost Zoneを作成し、NSレコードを追加する。その後、作成したCloud Frontへ</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/b71e48d6d645cbcf28fe47d40cc79c43"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-terraform-aws-static-site-dns.tf</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-tf">data &quot;aws_route53_zone&quot; &quot;root_domain&quot; {
  name = var.root_domain
}

resource &quot;aws_route53_zone&quot; &quot;sub_domain&quot; {
  name = var.site_domain
  tags = {
    name = var.tag
  }
}

resource &quot;aws_route53_record&quot; &quot;root_domain&quot; {
  depends_on      = [aws_route53_zone.sub_domain]
  allow_overwrite = true
  name            = var.site_domain
  ttl             = 30
  type            = &quot;NS&quot;
  zone_id         = data.aws_route53_zone.root_domain.zone_id

  records = [
    aws_route53_zone.sub_domain.name_servers.0,
    aws_route53_zone.sub_domain.name_servers.1,
    aws_route53_zone.sub_domain.name_servers.2,
    aws_route53_zone.sub_domain.name_servers.3,
  ]
}

resource &quot;aws_route53_record&quot; &quot;sub_domain&quot; {
  zone_id = aws_route53_zone.sub_domain.zone_id
  name    = aws_route53_zone.sub_domain.name
  type    = &quot;A&quot;

  alias {
    name                   = aws_cloudfront_distribution.site.domain_name
    zone_id                = aws_cloudfront_distribution.site.hosted_zone_id
    evaluate_target_health = false
  }
}

</code></pre>
<!--kg-card-end: markdown--><p>ACM:ワイルドカード証明書を発行し、認証する</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/219bff811fa617a4d7e7f636b82874fe"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-terraform-aws-static-site-acm.tf</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-tf">
resource &quot;aws_acm_certificate&quot; &quot;acm_cert&quot; {
  provider                  = aws.us-east-1
  domain_name               = var.root_domain
  subject_alternative_names = [&quot;*.${var.root_domain}&quot;]
  validation_method         = &quot;DNS&quot;

  lifecycle {
    create_before_destroy = true
  }

  tags = {
    name = var.tag
  }
}


resource &quot;aws_route53_record&quot; &quot;cert_validation&quot; {
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.root_domain.id
  name            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_name
  type            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_type
  records         = [aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_value]
  ttl             = 60
}

resource &quot;aws_route53_record&quot; &quot;cert_validation_alt&quot; {
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.root_domain.id
  name            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_name
  type            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_type
  records         = [aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_value]
  ttl             = 60
}



resource &quot;aws_acm_certificate_validation&quot; &quot;acm_cert&quot; {
  provider                = aws.us-east-1
  certificate_arn         = aws_acm_certificate.acm_cert.arn
  validation_record_fqdns = [aws_route53_record.cert_validation.fqdn, aws_route53_record.cert_validation_alt.fqdn]
}
</code></pre>
<!--kg-card-end: markdown--><h3 id="%E5%AE%8C%E6%88%90%E7%89%A9">完成物</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/aws-static-site-terraform"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/aws-static-site-terraform</div><div class="kg-bookmark-description">Contribute to kooooohe/aws-static-site-terraform development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/80f9b6cf88eb523cba6c991040b6304a4474352493743ce1d8e891d3fbe167d7/kooooohe/aws-static-site-terraform"/></div></a></figure><p/><p>Stateはローカルに保存するように作ってあるので、下記のようなファイルを作れば作成済みのS3に保存されるようになる</p><p>main.tf</p><pre><code>```json
terraform {
  backend "s3" {
      bucket = "mybucket"
      key    = "path/to/my/key"
      region = "us-east-1"
      }
   }
```</code></pre><p>特にModule化とかはしていないが、variables.tfの値を変更すればそれぞれのドメインで同等の環境を誰でも作ることができるようにはしてある。</p><h3 id="github-actions">GitHub Actions</h3><p>S3のファイル更新とCloud Frontのキャッシュ削除をGitHub Actionsで行う。</p><p>※S3の更新からのLambda発火でinvalidation作成とかもやろうと思ったのだが、こっちのほうがシンプルなので採用</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/2ce9cc174d29fae4f8ea92b8e8fd536c"><div class="kg-bookmark-content"><div class="kg-bookmark-title">blog-terraform-aws-static-site-actions.yml</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-yaml">name: Deploy Production

on:
  push:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x]

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - run: yarn install
    - run: yarn build

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1
    - run: aws s3 sync ./dist/ s3://${{ secrets.BUCKET_NAME }}/ --delete --exact-timestamps
    - run: aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID}} --paths &quot;/*&quot; 

</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Rust！]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

プログラミング言語のRust(ラスト)について勉強した記事になります。

突然、Rust(ラスト)かと言いますと、この辺の記述に興味を持ちまして。

ドキュメント(https://doc.rust-lang.org/book/foreword.html)のForewordの抜粋です。

> the language is designed to guide you naturally towards reliable code that is
efficient in terms of speed and memory usage.


この言語は、速度とメモリ使用量の点で効率的な信頼性の高いコードに自然に導くように設計されています。

壮大！

> introducing parallelism in Rust is a relatively low-risk operation: the compiler
will catch the classical mistakes for you. And you can tackle m]]></description><link>https://tech.anti-pattern.co.jp/rust/</link><guid isPermaLink="false">Ghost__Post__610e2b373986b000013a54de</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Sat, 06 Jun 2020 06:46:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-8.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-8.jpg" alt="Rust！"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>プログラミング言語のRust(ラスト)について勉強した記事になります。</p>
<p>突然、Rust(ラスト)かと言いますと、この辺の記述に興味を持ちまして。</p>
<p>ドキュメント(<a href="https://doc.rust-lang.org/book/foreword.html">https://doc.rust-lang.org/book/foreword.html</a>)のForewordの抜粋です。</p>
<blockquote>
<p>the language is designed to guide you naturally towards reliable code that is efficient in terms of speed and memory usage.</p>
</blockquote>
<p>この言語は、速度とメモリ使用量の点で効率的な信頼性の高いコードに自然に導くように設計されています。</p>
<p>壮大！</p>
<blockquote>
<p>introducing parallelism in Rust is a relatively low-risk operation: the compiler will catch the classical mistakes for you. And you can tackle more aggressive optimizations in your code with the confidence that you won’t accidentally introduce crashes or vulnerabilities</p>
</blockquote>
<p>Rustに並列処理を導入することは、比較的リスクの低い操作です。コンパイラーが古典的な間違いをキャッチします。また、クラッシュや脆弱性を誤って導入しないという自信を持って、コードのより積極的な最適化に取り組むことができます。</p>
<p>比較的リスクを低く並列処理を導入・・・。</p>
<p>これは勉強するしかないと思った次第です。</p>
<h4 id="%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89%EF%BC%81">ドキュメントはこちら！</h4>
<p>日本語のドキュメントがまとまってます。</p>
<blockquote>
<p><a href="https://doc.rust-jp.rs/book/second-edition/">https://doc.rust-jp.rs/book/second-edition/</a></p>
<p><a href="https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/">https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/</a></p>
</blockquote>
<h3 id="%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9Ahelloworld%EF%BC%81">とりあえずHelloWorld！</h3>
<p>①rustのインストール</p>
<pre><code>brew install rust
</code></pre>
<p>②hello_worldの作成<br>
マニュアルに通り以下の内容で記述したファイルを、.rcファイルとして保存します。</br></p>
<pre><code>fn main() {  
  println!(&quot;Hello World!&quot;);  
}
</code></pre>
<p>③hello_worldのコンパイル<br>
rustcコマンドでコンパイルします。コンパイルが成功するとhello_worldというバイナリファイルが生成されます。</br></p>
<pre><code>rustc ./hello\_world.rs
</code></pre>
<p>④hello_worldの実行</p>
<pre><code>./hello\_worldHello World!
</code></pre>
<p>取り敢えず環境はできました。</p>
<p>今回は初めてなのでドキュメントを読み進めます。</p>
<h3 id="%E5%A4%89%E6%95%B0%E5%AE%9A%E7%BE%A9">変数定義</h3>
<p>マニュアルの[2.数当てゲームをプログラムする]をみると、変数定義が記載されてます。</p>
<pre><code>let foo = 5; // immutable   
let mut bar = 5; // mutable
</code></pre>
<blockquote>
<p>この行では、<code>foo</code>という名前の新しい変数を作成し、<code>bar</code>の値に束縛しています。 Rustでは、変数は標準で不変(immutable)です。この概念について詳しくは、 第3章の「変数と可変性」節で議論します。以下の例には、 変数名の前に<code>mut</code>をつけて変数を可変にする方法が示されています:</p>
</blockquote>
<p>変数は標準で全て不変？</p>
<p>ムムム。</p>
<p>最初から気になるので、“第3章の「変数と可変性」節”を確認</p>
<blockquote>
<p>第2章で触れた通り、変数は標準で不変になります。これは、 Rustが提供する安全性や簡便な並行性の利点を享受する形でコードを書くための選択の1つです。</p>
</blockquote>
<p>安全性や簡便な並行性の利点を教授するための一つ！</p>
<p>気になる。</p>
<pre><code>let x = 5;  
x = 6;
</code></pre>
<p>これはNG。不変変数xに2回代入できません。</p>
<pre><code>let mut x = 5;  
x = 6;
</code></pre>
<p>こっちはOK。変数xは、mut宣言で可変となっているため。</p>
<p>マニュアルにはこの様に説明されてます。</p>
<blockquote>
<p>コードのある部分は、 値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。①コードの安全性担保する（不変変数が前提なので、書き換えない事をコンパイラで担保</p>
</blockquote>
<p>変数をコピーして、書き換えるという方が安全って事か？ここについてはまだ理解できてません。</p>
<blockquote>
<p><code>mut</code>により、未来の読者に対してコードの別の部分がこの変数の値を変える可能性を示すことで、その意図を汲ませることができるのです。</p>
</blockquote>
<p>これは、同意です。</p>
<p>そのコードを書いた人の意図が、変数宣言で理解できるのは良いと思います。</p>
<p>そして、こんな書き方ができます。シャドーイングといいます。</p>
<pre><code>let x = 5;  
let x = x + 1;  
let x = x \* 2;
</code></pre>
<p>同じ変数名定義が可能です。1行目と2行目のlet xは別のメモリで、2行目のx+1のxに、1行目のxのインスタンスのコピーが設定されるのか？と想像しています。</p>
<p>そして、これもOKです。</p>
<p>1行目は文字列型で、2行目は数値型だからです。</p>
<pre><code>let spaces = &quot;   &quot;;   
let spaces = spaces.len();
</code></pre>
<p>でも、こっちはNG。</p>
<pre><code>let mut spaces = &quot;   &quot;;  
spaces = spaces.len();
</code></pre>
<p>これは、文字列型に数値型を代入するのでダメなのは理解できます。</p>
<h4 id="%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A">振り返り</h4>
<p>目的は、“比較的リスクを低く並列処理を導入”に惹かれたからです。</p>
<p>残念ながら今回、全くそこまで行き着きませんでした。</p>
<p>“変数は標準で不変”がキーかしら？</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた]]></title><description><![CDATA[
クリーンアーキテクチャをTypeScriptで実装する際のDIをInversifyJSを使ってみた
 * Firebase & Firestore & Hosting
 * Nuxt.js & TypeScript

を使い、サービスを実装する際にクリーンアーキテクチャを採用した。

その際のDIライブラリとしてInverstifyJSを選定

InversifyJSInversifyJS is a lightweight inversion of control (IoC) container
for
TypeScript and JavaScript apps.http://inversify.io/Remo H. Jansen
[https://inversify.io/]

想定サービス
レストランの一覧を取得するもの

Firestore
とりあえず今回はPublicなRestaurantデータを取得するものを作成、

データモデルはこんな感じ

Clean Architecture
有名な図

これをもとにフロント側を実装

Inverstify JS
GitHub - ]]></description><link>https://tech.anti-pattern.co.jp/untitled/</link><guid isPermaLink="false">Ghost__Post__60faac7e3986b000013a3b31</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[Dialogflow]]></category><category><![CDATA[Clean Archittecture]]></category><category><![CDATA[Nuxt.js]]></category><category><![CDATA[Firebase]]></category><category><![CDATA[Firestore]]></category><category><![CDATA[Firebase Hosting]]></category><category><![CDATA[InversifyJS]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Fri, 29 May 2020 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_072.png" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%82%92typescript%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AEdi%E3%82%92inversifyjs%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F">クリーンアーキテクチャをTypeScriptで実装する際のDIをInversifyJSを使ってみた</h3><ul><li>Firebase &amp; Firestore &amp; Hosting</li><li>Nuxt.js &amp; TypeScript</li></ul><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/Selection_072.png" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/><p>を使い、サービスを実装する際にクリーンアーキテクチャを採用した。</p><p>その際のDIライブラリとしてInverstifyJSを選定</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://inversify.io/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">InversifyJS</div><div class="kg-bookmark-description">InversifyJS is a lightweight inversion of control (IoC) container for TypeScript and JavaScript apps.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://inversify.io/img/favicon/android-icon-192x192.png" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"><span class="kg-bookmark-author">http://inversify.io/</span><span class="kg-bookmark-publisher">Remo H. Jansen</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="http://inversify.io/img/logo_inverse.png" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/></div></a></figure><p/><h3 id="%E6%83%B3%E5%AE%9A%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">想定サービス</h3><p>レストランの一覧を取得するもの</p><h4 id="firestore">Firestore</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*VMLKsIqV7S72q7eCOFHL5g.png" class="kg-image" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた" loading="lazy"/></figure><p>とりあえず今回はPublicなRestaurantデータを取得するものを作成、</p><p>データモデルはこんな感じ</p><h3 id="clean-architecture">Clean Architecture</h3><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*0rkoPLX31HWlD3Lr" class="kg-image" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた" loading="lazy"/></figure><p>有名な図</p><p>これをもとにフロント側を実装</p><h3 id="inverstify-js">Inverstify JS</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/inversify/InversifyJS"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - inversify/InversifyJS: A powerful and lightweight inversion of control container for JavaScript &amp; Node.js apps powered by TypeScript.</div><div class="kg-bookmark-description">A powerful and lightweight inversion of control container for JavaScript &amp;amp; Node.js apps powered by TypeScript. - GitHub - inversify/InversifyJS: A powerful and lightweight inversion of control...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">inversify</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/7c0a779d10ed7ec73e6293687c7e1fec334f67823ffc64335de86d3dae368459/inversify/InversifyJS" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/></div></a></figure><blockquote/><blockquote>InversifyJS is a lightweight inversion of control (IoC) container for TypeScript and JavaScript apps. An IoC container uses a class constructor to identify and inject its dependencies. InversifyJS has a friendly API and encourages the usage of the best OOP and IoC practices.</blockquote><p>TS, JSのための軽量なIoCコンテナーである</p><p>Install方法は簡単</p><p><code>yarn add inversify reflect-metadata</code></p><p>として ts.config.jsonを下記の様にする</p><!--kg-card-begin: markdown--><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
  &quot;target&quot;: &quot;es5&quot;,
  &quot;lib&quot;: [&quot;es6&quot;],
  &quot;types&quot;: [&quot;reflect-metadata&quot;],
  &quot;module&quot;: &quot;commonjs&quot;,
  &quot;moduleResolution&quot;: &quot;node&quot;,
  &quot;experimentalDecorators&quot;: true,
  &quot;emitDecoratorMetadata&quot;: true
  }
}
</code></pre>
<!--kg-card-end: markdown--><h3 id="code">Code</h3><p>全コードはここに</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/28a50823f94a2360e3001cc519bc3c29"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Clean Architecture with InversifyJS</div><div class="kg-bookmark-description">Clean Architecture with InversifyJS. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-ts">
import { firestore } from 'firebase'
import { injectable, inject, Container } from 'inversify'
import { db } from '@/plugins/firebase'
import 'reflect-metadata'

class RestaurantDataModel {
  constructor(init: any) {
    this.id = init.id || this.id
    this.clientUID = init.clientUID || this.clientUID
    this.content = init.content || this.content
    this.status = init.status || this.status
    this.tags = init.tags || this.tags
    this.name = init.name || this.name
  }
  readonly id: string = ''
  readonly clientUID: string | null = null
  readonly content: string | null = null
  readonly status: string | null = null
  readonly tags: string[] | null = null
  readonly name: string | null = null
}

class RestaurantEntity {
  constructor(init: any) {
    this.id = init.id || this.id
    this.clientUID = init.clientUID || this.clientUID
    this.content = init.content || this.content
    this.status = init.status || this.status
    this.tags = init.tags || this.tags
    this.name = init.name || this.name
  }
  readonly id: string = ''
  readonly clientUID: string | null = null
  readonly content: string | null = null
  readonly status: string | null = null
  readonly tags: string[] | null = null
  readonly name: string | null = null
}

const TYPES = {
  IResutaurantUseCasae: Symbol.for('IResutaurantUseCasae'),
  IRestaurantRepository: Symbol.for('IRestaurantRepository'),
  RestaurantController: Symbol.for('RestaurantController'),
}

interface IResutaurantUseCasae {
  Handle(request: RestaurantGetRequest): Promise&lt;RestaurantEntity[]&gt;
}
class RestaurantGetRequest {
  public tags: string[] = []
  public limit: number = 0
  constructor(tags: string[], limit: number) {
    this.tags = tags
    this.limit = limit
  }
} interface IRestaurantRepository {
  GetByTags(tags: string[], limit: number): Promise&lt;RestaurantEntity[]&gt;
}

@injectable()
class RestaurantRepository implements IRestaurantRepository {
  private readonly db!: firestore.Firestore
  private readonly collectionPath: string = 'public/v1/restaurants'
  
  constructor(connection: firestore.Firestore = db) {
    this.db = connection
  }
  
  public async GetByTags(
    tags: string[],
    limit: number
  ): Promise&lt;RestaurantEntity[]&gt; {
    const docs = await this.db.collection(this.collectionPath).limit(limit).get()
    const restaurants: RestaurantEntity[] = []
    docs.forEach((doc) =&gt; {
      const restaurant = doc.data()
      const dataModel = new RestaurantDataModel(restaurant)
      restaurants.push(new RestaurantEntity(dataModel))
    })
    return restaurants
  }
}

@injectable()
class RestaurantGetInteractor implements IResutaurantUseCasae {
  private readonly restaurantRepository: IRestaurantRepository
  constructor(
    @inject(TYPES.IRestaurantRepository) restaurantRepository: IRestaurantRepository
  ) {
    this.restaurantRepository = restaurantRepository
  }
  Handle(request: RestaurantGetRequest): Promise&lt;RestaurantEntity[]&gt; {
    const tags = request.tags
    const res = this.restaurantRepository.GetByTags(tags, 1)
    return res
  }
}

@injectable()
class RestaurantController {
  private readonly usecase: IResutaurantUseCasae
  constructor(@inject(TYPES.IResutaurantUseCasae) usecase: IResutaurantUseCasae) {
    this.usecase = usecase
  }
  Get(tags: string[], limit: number) {
    const request = new RestaurantGetRequest(tags, limit)
    const res = this.usecase.Handle(request)
    return res
  }
}

// move inversify.config.ts
const myContainer = new Container()
myContainer
  .bind&lt;IResutaurantUseCasae&gt;(TYPES.IResutaurantUseCasae)
  .to(RestaurantGetInteractor)
myContainer.bind&lt;IRestaurantRepository&gt;(TYPES.IRestaurantRepository).to(RestaurantRepository)
myContainer.bind&lt;RestaurantController&gt;(TYPES.RestaurantController).to(RestaurantController)

const restaurantController = myContainer.get&lt;RestaurantController&gt;(TYPES.RestaurantController)
export { restaurantController }
</code></pre>
<!--kg-card-end: markdown--><p><code>@injectable() decorator</code> をDIしているClassとInterfaceを実装しているClassへとつけていく</p><h4 id="type">Type</h4><p>InjectifyJSではruntime時にSymbolを使いそれぞれを識別する方法もある</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">const TYPES = {
  IResutaurantUseCasae: Symbol.for('IResutaurantUseCasae'),
  IRestaurantRepository: Symbol.for('IRestaurantRepository'),
  RestaurantController: Symbol.for('RestaurantController'),
}
</code></pre>
<!--kg-card-end: markdown--><p>なので今回はこのような方法で実装</p><h4 id="container%E3%81%AE%E8%A8%AD%E5%AE%9A">Containerの設定</h4><p>各Interfaceの実装先の設定をしていく</p><!--kg-card-begin: markdown--><pre><code class="language-typescript">const myContainer = new Container()
myContainer
.bind&lt;IResutaurantUseCasae&gt;(TYPES.IResutaurantUseCasae)
.to(RestaurantGetInteractor)
myContainer
.bind&lt;IRestaurantRepository&gt;(TYPES.IRestaurantRepository).to(RestaurantRepository)
myContainer.bind&lt;RestaurantController&gt;(TYPES.RestaurantController).to(RestaurantController
</code></pre>
<!--kg-card-end: markdown--><h4 id="%E4%BE%9D%E5%AD%98%E3%81%AE%E8%A7%A3%E6%B1%BA">依存の解決</h4><!--kg-card-begin: markdown--><pre><code class="language-typescript">const restaurantController = myContainer.get&lt;RestaurantController&gt;(TYPES.RestaurantController)
export { restaurantController }

</code></pre>
<!--kg-card-end: markdown--><p>Containerインスタスからgetメソッドを呼ぶことによって依存を解決したインスタンスを返してくれる</p><p>注意:</p><p>GitHubにもあるように <code>Compotion Root</code> でのみこの処理はしてください</p><p>でないと、Sevice locator Anti-Pattern になる可能性がでてきます</p><p>このようなライブラリなどを使い、このような設計で構築することにより、テスト可能なロジックをフロントサイドにも書くことができ、中規模・大規模システムもFirestore, Nuxt.jsで対応できるようになるでしょう。</p><h4 id="%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%9C%AC">おすすめ本</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3-ebook/dp/B082WXZVPC/ref&#x3D;sr_1_1?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;keywords&#x3D;ddd%E5%85%A5%E9%96%80&amp;qid&#x3D;1585468449&amp;s&#x3D;books&amp;sr&#x3D;1-1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本 | 成瀬 允宣 | コンピュータ・IT | Kindleストア | Amazon</div><div class="kg-bookmark-description">Amazonで成瀬 允宣のドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">成瀬允宣</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:358-2001841-2259610:AKQ0FM0VNJT329C7G6F2$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3DAKQ0FM0VNJT329C7G6F2%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/></div></a></figure><h4 id="%E5%8F%82%E8%80%83%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E8%A8%98%E4%BA%8B">参考&amp;おすすめ記事</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://nrslib.com/clean-architecture/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">実践クリーンアーキテクチャ</div><div class="kg-bookmark-description">2020年5月06日 YouTube追加 2018年9月17日 URL 変更 目次 1. YouTube での解説2. Qiita 版3. はじめに3.1. ソース4. レイヤー4.1. Enterprise Business Rules4</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://nrslib.com/wp-content/uploads/2019/03/cropped-nrslib-270x270.png" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"><span class="kg-bookmark-author">nrslib</span><span class="kg-bookmark-publisher">nrs</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://nrslib.com/wp-content/uploads/2018/04/clean-730x410.jpg" alt="InversifyJSを使ってフロントエンドのTypeScriptでDIを実装してみた"/></div></a></figure><p/><figure class="kg-card kg-embed-card"><iframe src="https://www.slideshare.net/slideshow/embed_code/key/koGWguFcscb84X" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen=""> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/AtsushiNakamura4/clean-architecture-release" title="世界一わかりやすいClean Architecture" target="_blank">世界一わかりやすいClean Architecture</a> </strong> from <strong><a href="https://www.slideshare.net/AtsushiNakamura4" target="_blank">Atsushi Nakamura</a></strong> </div>

</figure><p/>]]></content:encoded></item><item><title><![CDATA[Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす]]></title><description><![CDATA[
構成
全体のソースコードはこちら

GitHub - kooooohe/notify-github-todoContribute to kooooohe/notify-github-todo
development by creating an account on GitHub.GitHubkooooohe
[https://github.com/kooooohe/notify-github-todo/tree/master]まずは開発環境で試してみる
docker-compose.yaml

medium-blog-cloud-run-docker-compose.jsmedium-blog-cloud-run-docker-compose.js.
GitHub Gist: instantly share code, notes, and snippets.Gist262588213843476
[https://gist.github.com/kooooohe/03d99ac8d08c7ee46dd894c122fd1d41]version: "3"
services:
  n]]></description><link>https://tech.anti-pattern.co.jp/cloud-scheduler-to-cloud-runwoshi-yong-si-qi-xian-qie-reno-githubnoissuewoslackhefei-basu/</link><guid isPermaLink="false">Ghost__Post__60faab283986b000013a3b08</guid><category><![CDATA[CCP]]></category><category><![CDATA[Cloud Scheduler]]></category><category><![CDATA[Cloud Run]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Cloud Build]]></category><category><![CDATA[Slack]]></category><category><![CDATA[Cloud Shell]]></category><category><![CDATA[Cloud Source Repositories]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Fri, 22 May 2020 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_RuUyoAF0e6WUOlX2vf1sSg.png" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="%E6%A7%8B%E6%88%90">構成</h3><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*RuUyoAF0e6WUOlX2vf1sSg.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_RuUyoAF0e6WUOlX2vf1sSg.png" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"/><p>全体のソースコードはこちら</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/notify-github-todo/tree/master"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/notify-github-todo</div><div class="kg-bookmark-description">Contribute to kooooohe/notify-github-todo development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b8bf37e2a3ec5a5ce03bb66d1c8ac9d8513936c9f29208203022ec7c37600244/kooooohe/notify-github-todo" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"/></div></a></figure><h3 id="%E3%81%BE%E3%81%9A%E3%81%AF%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">まずは開発環境で試してみる</h3><p><code>docker-compose.yaml</code></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/03d99ac8d08c7ee46dd894c122fd1d41"><div class="kg-bookmark-content"><div class="kg-bookmark-title">medium-blog-cloud-run-docker-compose.js</div><div class="kg-bookmark-description">medium-blog-cloud-run-docker-compose.js. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>version: &quot;3&quot;
services:
  node:
    image: node:13
    volumes:
      - ./app:/app:cached
    working_dir: /app
    env_file:
      - .env
    tty: true
    ports: 
      - 8080:8080
    command: [&quot;node&quot;, &quot;index.js&quot;]
    ```</code></pre>
<!--kg-card-end: markdown--><ul><li>GitHubのAccess Tokenを取得</li><li>SlackAppの <a href="https://api.slack.com/incoming-webhooks#posting_with_webhooks" rel="noopener">Incoming Webhook URL</a> を取得</li><li>取得したいGitHub IssueのAPI URL</li></ul><p>それらをdokcer-compose.yaml と同じ階層の.envにおいておく</p><pre><code>GITHUB_API=XXXXGITHUB_TOKEN=XXXXTARGET_SLACK_API=XXXX</code></pre><p>IssueのTitleに YYYY/MM/DD形式で期限をつける</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*Jx2yqKHtG2SREIryzh177w.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><p>そして, <code>docker-compose up</code> として、コンテナの中に入り、 <code>yarn install &amp;&amp; node index.js</code> とし、</p><p><code>localhost:8080</code> にアクセスするとslack通知がとぶ</p><p>※index.jsは <a href="https://github.com/kooooohe/notify-github-todo" rel="noopener">GitHub</a> にありますので、コードの確認は各自お願いします</p><h3 id="cloud-run%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%9F%E3%82%81%E3%81%AEimage%E3%81%AEdockerfile%E3%82%92%E6%BA%96%E5%82%99">Cloud Runで動かすためのImageのDockerfileを準備</h3><p>今回は <code>Dockerfile.prod</code>という名前で準備する</p><!--kg-card-begin: markdown--><pre><code>FROM node:13

WORKDIR /app

COPY ./app/package*.json ./
COPY ./app/yarn.lock ./

# Install production dependencies.
RUN yarn install --production

# Copy local code to the container image.
COPY ./app/index.js ./

# Run the web service on container startup.
CMD [ &quot;node&quot;, &quot;index.js&quot; ]
</code></pre>
<!--kg-card-end: markdown--><h3 id="gcp%E3%81%A7%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B">GCPで環境を構築する</h3><h4 id="api%E8%A8%B1%E5%8F%AF">API許可</h4><ul><li>Cloud Run</li><li>Cloud Container Registry</li><li>Cloud Build</li></ul><p>のAPIを許可しておく</p><p>次に、Cloud BuildからCloud RunへDeployするために、サービスアカウントの設定をする</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*VSC1UZDrZIFJIRz3z2LgLA.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><h4 id="cloudbuildyaml">cloudbuild.yaml</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/5897d8992f05ac6bf486c50424efa95c"><div class="kg-bookmark-content"><div class="kg-bookmark-title">cloudbuild.yaml</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>steps:
# Build the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/todo-notify', '-f', 'Dockerfile.prod', '.']
# Push the image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/todo-notify']
# Deploy image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['beta', 'run', 'deploy', 'todo-notify', '--image', 'gcr.io/$PROJECT_ID/todo-notify', '--region', 'us-central1', '--platform', 'managed']
images:
- gcr.io/$PROJECT_ID/todo-notify
</code></pre>
<!--kg-card-end: markdown--><p>Dockerfile.prodのBuildからCloud RunへのDeployまでを行う</p><p>todo-notifyという名前でCloud Runを作成する</p><p>そして、Cloud Runは<strong>非認証からのリクエストは受け付けない</strong>ようにする</p><p>ここまで準備すると、 <code>gcloud builds submit</code> でCloud RunへDeployできる</p><p>その後、Cloud Runの環境変数に</p><pre><code>GITHUB_API=XXXXGITHUB_TOKEN=XXXXTARGET_SLACK_API=XXXX</code></pre><p>を設定する</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*0QpAe1zQiwE0O57e2tafjw.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><h3 id="cloud-scheduler%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">Cloud Schedulerを設定する</h3><h4 id="cloud-scheduler%E3%81%8B%E3%82%89cloud-run%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEservice-account%E3%82%92%E4%BD%9C%E6%88%90">Cloud SchedulerからCloud Runを実行するためのService Accountを作成</h4><p>今回は<a href="https://console.cloud.google.com/iam-admin/serviceaccounts/details/115121697651703409418?hl=ja&amp;project=utilities-260805" rel="noopener">invoke-cloud-ru</a>nという名前で作成</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*O77KqgrXjkGb1hJEI5SSTg.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><p>そして、Cloud Runの今回のサービス詳細から、 <em>Cloud Run 起動元 </em>権限を付与</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*Q9ICY-QCb06A6R_o4ZygFg.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><h4 id="cloud-scheduler-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">Cloud Scheduler を設定する</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*kgzgPZoo0i3GK0OcXjlrNQ.png" class="kg-image" alt="Cloud Scheduler と Cloud Runを使用し、期限切れの GitHubのISSUEをSlackへ飛ばす" loading="lazy"/></figure><p>Auth header でOIDC tokenを選択し、</p><p>先程作成したService Accountを入力する</p><p>※今回はテストのため、1hごとに実行されるように設定しました</p><p>画面上で <code>RUN NOW</code> 通すと、Cloud Schedulerを実行し試すことができる</p><p>便利！</p><p>これでよいGitHub Issue TODO ライフを！！</p><p>ちなみに、GitHubのProject 機能を使って、カンバンを使うのもおすすめ</p>]]></content:encoded></item><item><title><![CDATA[強いABC予想とフェルマーの最終定理]]></title><description><![CDATA[望月教授のIUT理論を使用した、ABC予想の証明査定が終わったというニュースが流れてきた。

もともと、証明が終わったというニュース自体は数年前から知っていた。

エンジニアリングも数学も何でもこういった、新しい概念やモノが生まれてくるのはワクワクする。

それの影響を受けて、一般向けにその内容を噛み砕いてくださっている下記の本を購入し読んでいる。

宇宙と宇宙をつなぐ数学 IUT理論の衝撃 | 加藤 文元 |本 | 通販 | AmazonAmazonで加藤 文元の宇宙と宇宙をつなぐ数学
IUT理論の衝撃。アマゾンならポイント還元本が多数。加藤 文元作品ほか、お急ぎ便対象商品は当日お届けも可能。また宇宙と宇宙をつなぐ数学
IUT理論の衝撃もアマゾン配送商品なら通常配送無料。Amazon加藤 文元
[https://www.amazon.co.jp/%E5%AE%87%E5%AE%99%E3%81%A8%E5%AE%87%E5%AE%99%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%E6%95%B0%E5%AD%A6-IUT%E7%90%86%E8%AB%96]]></description><link>https://tech.anti-pattern.co.jp/qiang-iabcyu-xiang-tohuerumanozui-zhong-ding-li/</link><guid isPermaLink="false">Ghost__Post__60faae913986b000013a3b8b</guid><category><![CDATA[math]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 22 Apr 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>望月教授のIUT理論を使用した、ABC予想の証明査定が終わったというニュースが流れてきた。</p><p>もともと、証明が終わったというニュース自体は数年前から知っていた。</p><p>エンジニアリングも数学も何でもこういった、新しい概念やモノが生まれてくるのはワクワクする。</p><p>それの影響を受けて、一般向けにその内容を噛み砕いてくださっている下記の本を購入し読んでいる。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/%E5%AE%87%E5%AE%99%E3%81%A8%E5%AE%87%E5%AE%99%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%E6%95%B0%E5%AD%A6-IUT%E7%90%86%E8%AB%96%E3%81%AE%E8%A1%9D%E6%92%83-%E5%8A%A0%E8%97%A4-%E6%96%87%E5%85%83/dp/404400417X/ref&#x3D;sr_1_1?__mk_ja_JP&#x3D;%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;dchild&#x3D;1&amp;keywords&#x3D;iut&amp;qid&#x3D;1587202528&amp;s&#x3D;books&amp;sr&#x3D;1-1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">宇宙と宇宙をつなぐ数学 IUT理論の衝撃 | 加藤 文元 |本 | 通販 | Amazon</div><div class="kg-bookmark-description">Amazonで加藤 文元の宇宙と宇宙をつなぐ数学 IUT理論の衝撃。アマゾンならポイント還元本が多数。加藤 文元作品ほか、お急ぎ便対象商品は当日お届けも可能。また宇宙と宇宙をつなぐ数学 IUT理論の衝撃もアマゾン配送商品なら通常配送無料。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">加藤 文元</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:355-5561861-4507418:16J1K0YJXEN2SN8YSXM1$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3D16J1K0YJXEN2SN8YSXM1%26pty%3DError%26spty%3DPageNotFound%26pti%3DB07VPHRVPP:1000"/></div></a></figure><p>今回言葉や表現を変え説明してあり、大変面白い。</p><p>IUT理論は異世界から来た論文とも言われている。</p><p>足し算と掛け算を分離すべく、新しい数学（宇宙）を生み出し、それをもとに戻す際にどれくらいの差が出るか(どれくらいの精度で復元できるのか）と言うのがざっくりした話。</p><p>さて、それの派生として <code>強いABC予想</code> が証明されると <code>フェルマーの最終定理</code> が簡単に証明できてしまうということを知り、どういうことなのか調べてみた</p><p>※強いABC予想は今回証明したものではないので注意</p><h3 id="abc%E4%BA%88%E6%83%B3">ABC予想</h3><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*U6c8u3WBMOH8Up6mL2R8fw.png" class="kg-image" alt="" loading="lazy"/></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/ABC%E4%BA%88%E6%83%B3"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ABC予想 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Question_mark2.svg/40px-Question_mark2.svg.png"/></div></a></figure><h4 id="%E5%BC%B7%E3%81%84abc%E4%BA%88%E6%83%B3">強いABC予想</h4><p>上記のABC予想の素因数の積を2乗すると それよりcは小さいということである</p><p>簡単に書くとこんな感じでしょうか。</p><p><em>a</em> + <em>b</em> = <em>c</em>を満たす、互いに素な自然数の組 (<em>a</em>, <em>b</em>, <em>c</em>) に対し、rad(abc)を<em>d</em> と表す。このとき、d² &gt; cとなる</p><p>フェールマーの最終定理</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E6%9C%80%E7%B5%82%E5%AE%9A%E7%90%86"><div class="kg-bookmark-content"><div class="kg-bookmark-title">フェルマーの最終定理 - Wikipedia</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://ja.wikipedia.org/static/apple-touch/wikipedia.png"><span class="kg-bookmark-author">ウィキメディア財団</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/commons/4/47/Diophantus-II-8-Fermat.jpg"/></div></a></figure><p>3 以上の<a href="https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E6%95%B0" rel="noopener">自然数</a> <em>n</em> について、<em>x^n</em>+ <em>y^n</em> = <em>z^n</em> となる自然数の組 (<em>x</em>, <em>y</em>, <em>z</em>) は存在しない</p><h3 id="%E8%A8%BC%E6%98%8E">証明</h3><p>互いに素な x,y,zが存在し、 x^n + y^n = z^n が存在すると仮定する。強いABC予想より z^n &lt; rad(xyz)²よって z^n &lt; z⁶ (x,yはz未満のため）となる仮定より3 ≦ n ＜ 6</p><p>※nが3,4,5の場合は個別に証明がすでになされている(wikiを参照)<br>と、nが６未満だといとも簡単に証明できる。</br></p><h3 id="%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</h3><p>数多くの数学者が破れていったとされるフェルマーの最終定理、それがかこんなに簡単に証明できてしまうのは面白いですね。</p><p>数学の発見から現実への応用のパターンは数多あるなか、IUT理論がどう現実に使われ、変えて、便利にしていくのかが非常に楽しみです。</p>]]></content:encoded></item><item><title><![CDATA[フルリモートでスクラム開発やっている話]]></title><description><![CDATA[はじめに
感染症拡大防止のため、
弊社では原則在宅勤務となってまして、みなリモートで開発を進めています。

全メンバー全イベントフルリモートでスクラムを実践するのは初めての経験なので、フィードバックをもらえたら、または誰かの役に立てばと思い、筆を執った次第です。

本ブログではイベントごとにどう進めているのかを紹介します。

事前準備/プロジェクトキックオフ
まず、プロジェクトの目的や実行体制などを共有しておく必要があるでしょう。

インセプションデッキやカスタマージャーニーマップ、リーンキャンバスなど様々なツールを活用できます。

今回のプロジェクトが全社戦略の中でどういった意味があるのか説明するようにしました。

また、アジャイルがどんな経緯のもと生まれたのか、どんな思想なのかインプットするための資料を準備しました。具体的にはアジャイルソフトウェア開発宣言などを取りあげています。

その上で、スクラム開発はどう進めるものなのかを伝えました。

様々な書籍のエッセンスをブレンドして資料を仕上げました。現時点で100ページくらいのスライドになっています。

とはいえ、一気にインプットし]]></description><link>https://tech.anti-pattern.co.jp/the-story-of-scrum-development-with-full-remote-control/</link><guid isPermaLink="false">Ghost__Post__610143bd3986b000013a3f6a</guid><category><![CDATA[Scrum]]></category><category><![CDATA[Agile]]></category><category><![CDATA[RemoteWork]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Fri, 17 Apr 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/remote-scrum-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/remote-scrum-1-1.png" alt="フルリモートでスクラム開発やっている話"/><p>感染症拡大防止のため、<br>
弊社では原則在宅勤務となってまして、みなリモートで開発を進めています。</br></p>
<p>全メンバー全イベントフルリモートでスクラムを実践するのは初めての経験なので、フィードバックをもらえたら、または誰かの役に立てばと思い、筆を執った次第です。</p>
<p>本ブログではイベントごとにどう進めているのかを紹介します。</p>
<h3 id="%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%AD%E3%83%83%E3%82%AF%E3%82%AA%E3%83%95">事前準備/プロジェクトキックオフ</h3>
<p>まず、プロジェクトの目的や実行体制などを共有しておく必要があるでしょう。</p>
<p>インセプションデッキやカスタマージャーニーマップ、リーンキャンバスなど様々なツールを活用できます。</p>
<p>今回のプロジェクトが全社戦略の中でどういった意味があるのか説明するようにしました。</p>
<p>また、アジャイルがどんな経緯のもと生まれたのか、どんな思想なのかインプットするための資料を準備しました。具体的にはアジャイルソフトウェア開発宣言などを取りあげています。</p>
<p>その上で、スクラム開発はどう進めるものなのかを伝えました。</p>
<p>様々な書籍のエッセンスをブレンドして資料を仕上げました。現時点で100ページくらいのスライドになっています。</p>
<p>とはいえ、一気にインプットしてもメンバーもお腹いっぱいになってしまうので、イベント毎などタイミングタイミングで知識は小出しにするよう意識しています。</p>
<p>また、プロダクトオーナーと共に優先順位をつけたリストを作っていきました。</p>
<p>議論の時にはGoogle Spread Sheetを活用しました。最終的にはユーザーストーリの形式で表現し、GitHubのISSUEを作成しました。Project機能を使って優先順位で並べておきます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/remote-scrum-1.png" alt="フルリモートでスクラム開発やっている話" loading="lazy"/></p>
<p><em>利用ツール</em><br>
<a href="https://discordapp.com/"><em>Discord</em></a><br>
<a href="https://github.co.jp/"><em>GitHub</em></a><br>
<a href="https://www.google.com/intl/ja_jp/slides/about/"><em>Google Slide</em></a><br>
<a href="https://www.google.com/intl/ja_jp/sheets/about/"><em>Google Spread Sheet</em></a></br></br></br></br></p>
<h3 id="%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88">プロダクトバックログリファインメント</h3>
<p>プロダクトバックログをReadyな状態にする作業です。</p>
<p>プロダクトオーナーと開発チームとともに、プロダクトバックログの不明点の洗い出しや分割、見積もりまでやっていきました。</p>
<p>肝はあまり先のことまでやりすぎないことです。</p>
<p>プロダクトバックログの優先順位は、変動する可能性が大きく、あまり先のことまでやってしまっても、ムダになる可能性が高いためです。</p>
<p>次のスプリントプランニングが、ゴールを決めるぐらいで済むって塩梅が良いと思ってます。</p>
<p>今回は1週間スプリントでやっているので、1週間分+ちょっとくらいを作っておくと安心って感じですね。</p>
<p>プロダクトバックログはGithubのISSUE、スプリントバックログはGithubのISSUEとGoogle Spread Sheetで管理しています。Google Spread Sheetを活用しているのは、後から出てくるバーンダウンチャートを活用したいためです。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/remote-scrum-2.png" alt="フルリモートでスクラム開発やっている話" loading="lazy"/></p>
<p><em>利用ツール</em><br>
<a href="https://discordapp.com/"><em>Discord</em></a><br>
<a href="https://github.co.jp/"><em>GitHub</em></a><br>
<a href="https://www.google.com/intl/ja_jp/sheets/about/"><em>Google Spread Sheet</em></a></br></br></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%97%E3%83%A9%E3%83%B3%E3%83%8B%E3%83%B3%E3%82%B0">スプリントプランニング</h3>
<p>プロダクトバックログの優先順位を確認しつつ、開発チームがどれくらいできそうかを元に、今回のスプリントのゴールを決めていきます。</p>
<p>個人的にはリファインメントが良い感じにできていれば、そんなに時間がかかるものではないと思ってます。</p>
<p>また、一番最初のスプリントではベロシティが分かってないはずなので、キャパシティ計算をしてえいやってやる感じで良いと思ってます。</p>
<p><em>利用ツール</em><br>
<a href="https://discordapp.com/"><em>Discord</em></a><br>
Google Spread Sheet</br></br></p>
<h3 id="%E3%83%87%E3%82%A4%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0">デイリースクラム</h3>
<p>このままいってスプリントゴールが達成できそうか検査していきます。</p>
<p>下記の項目を各人が答えていきます。</p>
<p>1.昨日やったこと<br>
2.今日やること<br>
3.困っていること/障害になっていること<br>
4.今日の自分のお天気</br></br></br></p>
<p>割り込みやプロジェクト以外のタスクが発生した場合、Google Spread Sheetの「追加/障害タスク」用シートに記入してもらうなどして、スプリントの仔細を把握していきます。</p>
<p>最近ではバーンアウトチャートも活用し予測をもとに対応を議論できるように整え始めています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/remote-scrum-3.png" alt="フルリモートでスクラム開発やっている話" loading="lazy"/></p>
<p>ちなみに、4はプロジェクトの途中からやるようにしました。<br>
一人暮らしでなおかつずっと在宅でいると鬱屈としてしまうことがあります。そうすると健康によくありませんし、生産性が下がるリスクもあります。<br>
なので、必要に応じて散歩を要請したり、1on1を実施できる体制を整えるため始めました。腰が悪いメンバーがいるのでいつも心配です。</br></br></p>
<p><em>利用ツール</em><br>
<a href="https://discordapp.com/"><em>Discord</em></a><br>
<a href="https://www.google.com/intl/ja_jp/sheets/about/"><em>Google Spread Sheet</em></a></br></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC">スプリントレビュー</h3>
<p>成果のお披露目会です。ステークホルダーからフィードバックをもらいます。</p>
<p>開発者がDiscordで画面共有をしながらデモをしていきます。</p>
<p>デモする人/フィードバックの内容をメモする人など役割を事前に分けておくとスムーズに進行できます。</p>
<p><em>利用ツール</em><br>
<a href="https://discordapp.com/"><em>Discord</em></a></br></p>
<h3 id="%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%83%AC%E3%83%88%E3%83%AD%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96">スプリントレトロスペクティブ</h3>
<p>所謂ふりかえりです。次のスプリントが楽しく効果的になるようチームで話し合いましょう。</p>
<p>リモート環境では、<br>
Miro + Discordの組み合わせがとてもやりやすかったです。</br></p>
<p>付箋にタグを付けられるので誰が書いたか一目瞭然ですし、どこにカーソルがあるのか相手にも分かるので指示語が使えます。</p>
<p>個人的には字が汚いのがバレないってのが嬉しいですね。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/remote-scrum-4.jpeg" alt="フルリモートでスクラム開発やっている話" loading="lazy"/></p>
<p>一度にやるにはTRYが多く見えますが、「オンラインヨガをする」など、ラフな内容も混じっているためです。</p>
<p>この辺りはチームの雰囲気に合わせていくのが良いでしょう。</p>
<p><em>利用ツール</em><br>
<a href="https://miro.com/"><em>Miro</em></a><br>
<a href="https://discordapp.com/"><em>Discord</em></a></br></br></p>
<h3 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h3>
<p>スプリントは繰り返していきます。<br>
変化もどんどんしていくので、この情報も今の断面を切り取ったものに過ぎません。</br></p>
<p>大変な現況ですが、それでも楽しいスクラム生活を！</p>
<h4 id="20220915%E8%BF%BD%E8%A8%98">2022/09/15追記</h4>
<p>Miroにスクラム関連のツールが増えているみたいです！しかも日本語、是非見てみてくださいね</p>
<p><a href="https://miro.com/ja/online-scrum-agile-tool/">https://miro.com/ja/online-scrum-agile-tool/</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Janomeを使って自分たちの理念を形態素解析にかける]]></title><description><![CDATA[ご挨拶
こんにちは。小笹です。

ソフトウェアエンジニアとしてのリハビリと、
自分たちの理念について考えるためにも、
理念を形態素解析してみることにしました。

今回はGraphvizを使って、
形態素解析の様子を視覚的に捉えられるようにしてみます。

1.Graphviz本体のインストール

brew install graphviz

2.PythonでGraphvizを使うためのラッパーをインストール

pip3 install graphviz

ここまでで一旦Graphvizの公式サイトにあるサンプルコードを、
sample.pyとして保存&実行してみます。

from graphviz import Digraph  
dot = Digraph(comment='The Round Table')  
dot  
dot.node('A', 'King Arthur')  
dot.node('B', 'Sir Bedevere the Wise')  
dot.node('L', 'Sir Lancelot the Brave')  
dot.edges(\['AB',]]></description><link>https://tech.anti-pattern.co.jp/using-janome-to-apply-morphological-analysis-to-their-ideas/</link><guid isPermaLink="false">Ghost__Post__610142613986b000013a3f0d</guid><category><![CDATA[Janome]]></category><category><![CDATA[Graphviz]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Thu, 02 Apr 2020 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/janome-2-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="%E3%81%94%E6%8C%A8%E6%8B%B6">ご挨拶</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/janome-2-1.png" alt="Janomeを使って自分たちの理念を形態素解析にかける"/><p>こんにちは。小笹です。</p>
<p>ソフトウェアエンジニアとしてのリハビリと、<br>
自分たちの理念について考えるためにも、<br>
理念を形態素解析してみることにしました。</br></br></p>
<p>今回はGraphvizを使って、<br>
形態素解析の様子を視覚的に捉えられるようにしてみます。</br></p>
<p>1.Graphviz本体のインストール</p>
<p><code>brew install graphviz</code></p>
<p>2.PythonでGraphvizを使うためのラッパーをインストール</p>
<p><code>pip3 install graphviz</code></p>
<p>ここまでで一旦Graphvizの公式サイトにあるサンプルコードを、<br>
sample.pyとして保存&amp;実行してみます。</br></p>
<pre><code>from graphviz import Digraph  
dot = Digraph(comment='The Round Table')  
dot  
dot.node('A', 'King Arthur')  
dot.node('B', 'Sir Bedevere the Wise')  
dot.node('L', 'Sir Lancelot the Brave')  
dot.edges(\['AB', 'AL'\])  
dot.edge('B', 'L', constraint='false')  
print(dot.source)  
dot.render('test-output/round-table.gv', view=True)
</code></pre>
<p>いけっ！</p>
<p><code>python3 sample.py</code></p>
<p>test-outputというフォルダ内にround-table.gv.pngができていたら成功。<br>
以下のような画像です。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/janome-1.png" alt="Janomeを使って自分たちの理念を形態素解析にかける" loading="lazy"/></p>
<p>かっこいいサンプルですね。</p>
<p>3.Python製の形態素解析器Janomeのインストール</p>
<p><code>pip3 install janome</code></p>
<p>では早速理念を形態素解析にかけてみましょう。</p>
<p><code>echo &quot;日本のソフトウェアエンジニアを憧れの職業へ&quot; | janome -g</code></p>
<p>出力</p>
<pre><code>日本 名詞,固有名詞,地域,国,\*,\*,日本,ニッポン,ニッポン  
の 助詞,連体化,\*,\*,\*,\*,の,ノ,ノ  
ソフトウェア 名詞,一般,\*,\*,\*,\*,ソフトウェア,ソフトウェア,ソフトウェア  
エンジニア 名詞,一般,\*,\*,\*,\*,エンジニア,エンジニア,エンジニア  
を 助詞,格助詞,一般,\*,\*,\*,を,ヲ,ヲ  
憧れ 動詞,自立,\*,\*,一段,連用形,憧れる,アコガレ,アコガレ  
の 助詞,連体化,\*,\*,\*,\*,の,ノ,ノ  
職業 名詞,一般,\*,\*,\*,\*,職業,ショクギョウ,ショクギョー  
へ 助詞,格助詞,一般,\*,\*,\*,へ,ヘ,エ
</code></pre>
<p>いい感じですね！</p>
<p>辞書の兼ね合いでしょうが、<br>
「ソフトウェアエンジニア」は一個の名詞ではない判定ですね。</br></p>
<p>画像はというと</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/janome-2.png" alt="Janomeを使って自分たちの理念を形態素解析にかける" loading="lazy"/></p>
<p>細かい！</p>
<p>日本語の特徴として、<br>
単語が分かれて表現されないので、<br>
結構なパターンを推定していることが分かります。</br></br></p>
<p>今回の品詞推定には、<br>
「隠れマルコフモデル」と「ビタビ・アルゴリズム」について、<br>
勉強をする必要があるのですが、<br>
解説できるほどじゃないので、思い切って割愛。</br></br></br></p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Firestore Local Emulator のデータを擬似的に永続化する]]></title><description><![CDATA[Firestore Local Emulator にimport/export機能が追加されたらしいので、それを利用して擬似的に永続化しました。

Dockerを落とすたびにリセットされるデータ
最近、業務でFirestoreを使用した開発をしています。ローカルではエミュレータを起動し、それに接続しています。このエミュレータには個人的に不便なことがあり、データをメモリ上に保存しています。ローカルの開発にはDockerを使用しており、エミュレータもDocker上で動かしています。そのため、Dockerを落とすたびにデータが全消去されてしまいます。

何とかしたいなーと思いつつもいい方法が見つからず放置していましたが、少し前にこちらの記事を見つけ、最近import/export機能が実装されたことを知りました。

Firestore エミュレータのデータをローカル環境で import/export する - Qiita概要 Firebase エミュレータで
Firestore の import/export
ができるようになったので、導入方法について紹介します。これまで、エミュレータを再起]]></description><link>https://tech.anti-pattern.co.jp/firestore-local-emulator/</link><guid isPermaLink="false">Ghost__Post__6102ba4a3986b000013a43c1</guid><category><![CDATA[Firestore]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 18 Mar 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Firestore Local Emulator にimport/export機能が追加されたらしいので、それを利用して擬似的に永続化しました。</p>
<h2 id="docker%E3%82%92%E8%90%BD%E3%81%A8%E3%81%99%E3%81%9F%E3%81%B3%E3%81%AB%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF">Dockerを落とすたびにリセットされるデータ</h2>
<p>最近、業務でFirestoreを使用した開発をしています。ローカルではエミュレータを起動し、それに接続しています。このエミュレータには個人的に不便なことがあり、データをメモリ上に保存しています。ローカルの開発にはDockerを使用しており、エミュレータもDocker上で動かしています。そのため、Dockerを落とすたびにデータが全消去されてしまいます。</p>
<p>何とかしたいなーと思いつつもいい方法が見つからず放置していましたが、少し前にこちらの記事を見つけ、最近import/export機能が実装されたことを知りました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/tanabee/items/2ce4d50e5ea320beb0cf"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Firestore エミュレータのデータをローカル環境で import/export する - Qiita</div><div class="kg-bookmark-description">概要 Firebase エミュレータで Firestore の import/export ができるようになったので、導入方法について紹介します。これまで、エミュレータを再起動する度にデータが初期化されていていましたが、特定のタ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">tanabee</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1SbWx5WlhOMGIzSmxJT09DcU9PRG4tT0RwZU9Eck9PRHZPT0N2LU9CcnVPRGgtT0R2T09Ddi1PQ2t1T0RyZU9Edk9PQ3EtT0RxLWVTc09XaWctT0JweUJwYlhCdmNuUXZaWGh3YjNKMElPT0JtZU9DaXcmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NCZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249Y2VudGVyJTJDbWlkZGxlJnM9ZjQ0MjNkYWNjYTAzNGFlZTIxOGM4MTE0OTVhNGI2NDQ&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RSFJoYm1GaVpXVSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTZjYmIxOGM0OWUwZjBjNTQxODJjMGQ3NTZlNWUwYzY4&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;d32d1ff0669a0536ccd619159f78c1e2"/></div></a></figure><!--kg-card-begin: markdown--><p>この機能を使えばデータを擬似的に永続化できるのでは？と思い、試してみました。</p>
<h2 id="gcloud%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%EF%BC%9F">gcloudコマンドでの起動に対応していない？</h2>
<p>上の記事ではfirebaseコマンドでエミュレータを起動していますが、自分の業務ではGolangで書かれたサーバーサイドから接続する関係でgcloudコマンドで起動していました。ところが、ドキュメントを見るとimportやexportの記述が見つかりませんでした。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/sdk/gcloud/reference/beta/emulators/firestore/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">gcloud beta emulators firestore | Cloud SDK Documentation</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/cloud/images/favicons/onecloud/super_cloud.png"><span class="kg-bookmark-author">Google Cloud</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png"/></div></a></figure><!--kg-card-begin: markdown--><p>gcloudコマンドでは対応していないのかなと思いつつ、以下のfirebaseコマンドのソースを見てみると、</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/firebase/firebase-tools"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - firebase/firebase-tools: The Firebase Command Line Tools</div><div class="kg-bookmark-description">The Firebase Command Line Tools. Contribute to firebase/firebase-tools development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">firebase</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/5b76cef810fc61498b44820034749fbcebfa1d07a1a0985bc2ced301b196d8db/firebase/firebase-tools"/></div></a></figure><!--kg-card-begin: markdown--><ul>
<li>export：エミュレータに対してPOSTリクエストする</li>
<li>import：exportしたファイルを起動時にパラメータで渡す</li>
</ul>
<p>という処理になっていました。</p>
<p>これならシェルスクリプトで無理やり実行できるのでは？と思いやってみました。</p>
<h2 id="%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE">できたもの</h2>
<p>以下の構成で進めます。</p>
<pre><code>.  
├── docker-compose.yml  
├── firestore  
│   ├── Dockerfile  
│   ├── firestore_export &lt;- exportファイルの保存先  
│   └── start.sh         &lt;- Docker起動時の実行スクリプト  
└── go  
    └── src  
        └── main.go      &lt;- アプリケーション
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/0a6a01f3a7bf32c93ce09a304e7f440c.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist101868295" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore-emulator-persistence-docker-compose" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC1" class="blob-code blob-code-inner js-file-line">version: &quot;3.7&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC3" class="blob-code blob-code-inner js-file-line">  firestore:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC4" class="blob-code blob-code-inner js-file-line">    build:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC5" class="blob-code blob-code-inner js-file-line">      context: ./firestore</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC6" class="blob-code blob-code-inner js-file-line">    environment:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC7" class="blob-code blob-code-inner js-file-line">      - PROJECT_ID=test-project-id</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC8" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC9" class="blob-code blob-code-inner js-file-line">      - ./firestore:/firestore</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC10" class="blob-code blob-code-inner js-file-line">    command: /bin/bash /firestore/start.sh</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC12" class="blob-code blob-code-inner js-file-line">  go:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC13" class="blob-code blob-code-inner js-file-line">    image: golang:1.14</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC14" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC15" class="blob-code blob-code-inner js-file-line">    environment:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC16" class="blob-code blob-code-inner js-file-line">      - PROJECT_ID=test-project-id</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC17" class="blob-code blob-code-inner js-file-line">      - FIRESTORE_EMULATOR_HOST=firestore:8812</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC18" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC19" class="blob-code blob-code-inner js-file-line">      - ./go/src:/go/src</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-docker-compose-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-firestore-emulator-persistence-docker-compose-LC20" class="blob-code blob-code-inner js-file-line">    working_dir: /go/src</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/0a6a01f3a7bf32c93ce09a304e7f440c/raw/5dc1dc3cbbd05b6d1eb192b6615eb3f479ff5aa1/firestore-emulator-persistence-docker-compose" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/0a6a01f3a7bf32c93ce09a304e7f440c#file-firestore-emulator-persistence-docker-compose">firestore-emulator-persistence-docker-compose</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2be69fa604716d2c5dd2ed3ba8ffe07f.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist101868343" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore-emulator-persistence-dockerfile" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore-emulator-persistence-dockerfile-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore-emulator-persistence-dockerfile-LC1" class="blob-code blob-code-inner js-file-line">FROM google/cloud-sdk:alpine</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-dockerfile-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore-emulator-persistence-dockerfile-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-dockerfile-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore-emulator-persistence-dockerfile-LC3" class="blob-code blob-code-inner js-file-line">RUN apk add --update --no-cache openjdk8 \</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-dockerfile-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore-emulator-persistence-dockerfile-LC4" class="blob-code blob-code-inner js-file-line">    &amp;&amp; gcloud components update \</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-dockerfile-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore-emulator-persistence-dockerfile-LC5" class="blob-code blob-code-inner js-file-line">    &amp;&amp; gcloud components install cloud-firestore-emulator beta --quiet</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2be69fa604716d2c5dd2ed3ba8ffe07f/raw/fe0b644905e2312776df6ea6ed57d49b91e1292d/firestore-emulator-persistence-dockerfile" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2be69fa604716d2c5dd2ed3ba8ffe07f#file-firestore-emulator-persistence-dockerfile">firestore-emulator-persistence-dockerfile</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/275bf9890fd79bfe7afd7f7ee2d305ef.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist101868361" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore-emulator-persistence-start" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-shell  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore-emulator-persistence-start-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore-emulator-persistence-start-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">#!</span>/bin/bash</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore-emulator-persistence-start-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore-emulator-persistence-start-LC3" class="blob-code blob-code-inner js-file-line">export_path=<span class="pl-s"><span class="pl-pds">&quot;</span>/firestore/firestore_export/firestore_export.overall_export_metadata<span class="pl-pds">&quot;</span></span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore-emulator-persistence-start-LC4" class="blob-code blob-code-inner js-file-line">start_command=<span class="pl-s"><span class="pl-pds">&quot;</span>/google-cloud-sdk/platform/cloud-firestore-emulator/cloud_firestore_emulator start --host=0.0.0.0 --port=8812<span class="pl-pds">&quot;</span></span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore-emulator-persistence-start-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore-emulator-persistence-start-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> [ <span class="pl-k">-e</span> <span class="pl-smi">$export_path</span> ]<span class="pl-k">;</span> <span class="pl-k">then</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore-emulator-persistence-start-LC7" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">$start_command</span> --seed_from_export=<span class="pl-smi">$export_path</span> <span class="pl-k">&amp;</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore-emulator-persistence-start-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">else</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore-emulator-persistence-start-LC9" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">$start_command</span> <span class="pl-k">&amp;</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore-emulator-persistence-start-LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fi</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore-emulator-persistence-start-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore-emulator-persistence-start-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-k">while</span> <span class="pl-c1">true</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore-emulator-persistence-start-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">do</span></td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore-emulator-persistence-start-LC14" class="blob-code blob-code-inner js-file-line">    curl -XPOST -H <span class="pl-s"><span class="pl-pds">&quot;</span>Content-Type: application/json<span class="pl-pds">&quot;</span></span> -d <span class="pl-s"><span class="pl-pds">&quot;</span>{<span class="pl-cce">\&quot;</span>database<span class="pl-cce">\&quot;</span>: <span class="pl-cce">\&quot;</span>projects/<span class="pl-smi">$PROJECT_ID</span>/databases/(default)<span class="pl-cce">\&quot;</span>, <span class="pl-cce">\&quot;</span>export_directory<span class="pl-cce">\&quot;</span>: <span class="pl-cce">\&quot;</span>/firestore<span class="pl-cce">\&quot;</span>, <span class="pl-cce">\&quot;</span>export_name<span class="pl-cce">\&quot;</span>: <span class="pl-cce">\&quot;</span>firestore_export<span class="pl-cce">\&quot;</span>}<span class="pl-pds">&quot;</span></span> http://0.0.0.0:8812/emulator/v1/projects/<span class="pl-smi">$PROJECT_ID</span>:export</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore-emulator-persistence-start-LC15" class="blob-code blob-code-inner js-file-line">    sleep 5</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-start-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore-emulator-persistence-start-LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">done</span></td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/275bf9890fd79bfe7afd7f7ee2d305ef/raw/aa7c496cfe8b5dd46ed87894a66806048e353530/firestore-emulator-persistence-start" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/275bf9890fd79bfe7afd7f7ee2d305ef#file-firestore-emulator-persistence-start">firestore-emulator-persistence-start</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Docker起動時に実行する<code>start.sh</code> では以下のことをしています。</p>
<ol>
<li>exportファイルの存在確認をし、あれば引数にセットする</li>
<li>gcloudコマンドではなく、gcloudコマンドで使われている（と思われる）実行ファイルを直接実行する</li>
<li>5秒毎にデータをexportし、マウントしたディレクトリに保存</li>
</ol>
<p>これによってexportしたデータは5秒毎にローカルに保存され、Dockerを落としてもデータをある程度維持できます。5秒毎にcurlを叩くのでローカル環境への負荷が少し気になりましたが、1日つけっぱなしでも特に重くなったりはしなかったので多分大丈夫だと思います。</p>
<p>試しに以下のファイルを用意し、</p>
<p>main.go実行 → Firestoreコンテナの再起動 → main.go実行</p>
<p>としてみました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/ff7aa71180703bedb65f63673e299414.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist101868459" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-firestore-emulator-persistence-main" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-firestore-emulator-persistence-main-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-firestore-emulator-persistence-main-LC1" class="blob-code blob-code-inner js-file-line">package main</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-firestore-emulator-persistence-main-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-firestore-emulator-persistence-main-LC3" class="blob-code blob-code-inner js-file-line">import (</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-firestore-emulator-persistence-main-LC4" class="blob-code blob-code-inner js-file-line">	&quot;context&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-firestore-emulator-persistence-main-LC5" class="blob-code blob-code-inner js-file-line">	&quot;fmt&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-firestore-emulator-persistence-main-LC6" class="blob-code blob-code-inner js-file-line">	&quot;log&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-firestore-emulator-persistence-main-LC7" class="blob-code blob-code-inner js-file-line">	&quot;os&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-firestore-emulator-persistence-main-LC8" class="blob-code blob-code-inner js-file-line">	&quot;strconv&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-firestore-emulator-persistence-main-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-firestore-emulator-persistence-main-LC10" class="blob-code blob-code-inner js-file-line">	&quot;cloud.google.com/go/firestore&quot;</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-firestore-emulator-persistence-main-LC11" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-firestore-emulator-persistence-main-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-firestore-emulator-persistence-main-LC13" class="blob-code blob-code-inner js-file-line">func main() {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-firestore-emulator-persistence-main-LC14" class="blob-code blob-code-inner js-file-line">	ctx := context.Background()</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-firestore-emulator-persistence-main-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-firestore-emulator-persistence-main-LC16" class="blob-code blob-code-inner js-file-line">	client, err := firestore.NewClient(ctx, os.Getenv(&quot;PROJECT_ID&quot;))</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-firestore-emulator-persistence-main-LC17" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-firestore-emulator-persistence-main-LC18" class="blob-code blob-code-inner js-file-line">		log.Fatal(err)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-firestore-emulator-persistence-main-LC19" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-firestore-emulator-persistence-main-LC20" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-firestore-emulator-persistence-main-LC21" class="blob-code blob-code-inner js-file-line">	create(ctx, client)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-firestore-emulator-persistence-main-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-firestore-emulator-persistence-main-LC23" class="blob-code blob-code-inner js-file-line">	print(ctx, client)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-firestore-emulator-persistence-main-LC24" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-firestore-emulator-persistence-main-LC25" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-firestore-emulator-persistence-main-LC26" class="blob-code blob-code-inner js-file-line">func create(ctx context.Context, client *firestore.Client) {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-firestore-emulator-persistence-main-LC27" class="blob-code blob-code-inner js-file-line">	ref, _, err := client.Collection(&quot;companies&quot;).Add(ctx, map[string]interface{}{</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-firestore-emulator-persistence-main-LC28" class="blob-code blob-code-inner js-file-line">		&quot;name&quot;: &quot;test_company&quot;,</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-firestore-emulator-persistence-main-LC29" class="blob-code blob-code-inner js-file-line">	})</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-firestore-emulator-persistence-main-LC30" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-firestore-emulator-persistence-main-LC31" class="blob-code blob-code-inner js-file-line">		log.Fatal(err)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-firestore-emulator-persistence-main-LC32" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-firestore-emulator-persistence-main-LC33" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-firestore-emulator-persistence-main-LC34" class="blob-code blob-code-inner js-file-line">	for i := 0; i &lt; 5; i++ {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-firestore-emulator-persistence-main-LC35" class="blob-code blob-code-inner js-file-line">		_, _, err := client.Collection(&quot;users&quot;).Add(ctx, map[string]interface{}{</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-firestore-emulator-persistence-main-LC36" class="blob-code blob-code-inner js-file-line">			&quot;name&quot;:       &quot;test_&quot; + strconv.Itoa(i),</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-firestore-emulator-persistence-main-LC37" class="blob-code blob-code-inner js-file-line">			&quot;company_id&quot;: ref.ID,</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-firestore-emulator-persistence-main-LC38" class="blob-code blob-code-inner js-file-line">		})</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-firestore-emulator-persistence-main-LC39" class="blob-code blob-code-inner js-file-line">		if err != nil {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-firestore-emulator-persistence-main-LC40" class="blob-code blob-code-inner js-file-line">			log.Fatal(err)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-firestore-emulator-persistence-main-LC41" class="blob-code blob-code-inner js-file-line">		}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-firestore-emulator-persistence-main-LC42" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-firestore-emulator-persistence-main-LC43" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-firestore-emulator-persistence-main-LC44" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-firestore-emulator-persistence-main-LC45" class="blob-code blob-code-inner js-file-line">func print(ctx context.Context, client *firestore.Client) {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-firestore-emulator-persistence-main-LC46" class="blob-code blob-code-inner js-file-line">	companies, err := client.Collection(&quot;companies&quot;).Documents(ctx).GetAll()</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-firestore-emulator-persistence-main-LC47" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-firestore-emulator-persistence-main-LC48" class="blob-code blob-code-inner js-file-line">		log.Fatal(err)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-firestore-emulator-persistence-main-LC49" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-firestore-emulator-persistence-main-LC50" class="blob-code blob-code-inner js-file-line">	for _, company := range companies {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-firestore-emulator-persistence-main-LC51" class="blob-code blob-code-inner js-file-line">		fmt.Println(company.Data())</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-firestore-emulator-persistence-main-LC52" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-firestore-emulator-persistence-main-LC53" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-firestore-emulator-persistence-main-LC54" class="blob-code blob-code-inner js-file-line">	users, err := client.Collection(&quot;users&quot;).Documents(ctx).GetAll()</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-firestore-emulator-persistence-main-LC55" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-firestore-emulator-persistence-main-LC56" class="blob-code blob-code-inner js-file-line">		log.Fatal(err)</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-firestore-emulator-persistence-main-LC57" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-firestore-emulator-persistence-main-LC58" class="blob-code blob-code-inner js-file-line">	for _, user := range users {</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-firestore-emulator-persistence-main-LC59" class="blob-code blob-code-inner js-file-line">		fmt.Println(user.Data())</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-firestore-emulator-persistence-main-LC60" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-firestore-emulator-persistence-main-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-firestore-emulator-persistence-main-LC61" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/ff7aa71180703bedb65f63673e299414/raw/1954cfe98da6c979ebfef903447ad5478de49aaf/firestore-emulator-persistence-main" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/ff7aa71180703bedb65f63673e299414#file-firestore-emulator-persistence-main">firestore-emulator-persistence-main</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>root@bde17f5d8780:/go/src# go run main.go   
map[name:test_company]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_4]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_1]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_0]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_3]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_2]

--- Firestore再起動 ---

root@bde17f5d8780:/go/src# go run main.go   
map[name:test_company]  
map[name:test_company]  
map[company_id:VZu8kWTjTd_36LaSJKxqqCTulZl9SXsahUAKvzvqIjw name:test_2]  
map[company_id:VZu8kWTjTd_36LaSJKxqqCTulZl9SXsahUAKvzvqIjw name:test_0]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_4]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_1]  
map[company_id:VZu8kWTjTd_36LaSJKxqqCTulZl9SXsahUAKvzvqIjw name:test_4]  
map[company_id:VZu8kWTjTd_36LaSJKxqqCTulZl9SXsahUAKvzvqIjw name:test_1]  
map[company_id:VZu8kWTjTd_36LaSJKxqqCTulZl9SXsahUAKvzvqIjw name:test_3]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_0]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_3]  
map[company_id:EEG48ivVXqwjOgHDY8lJ7IiO9bRekcClGJ6Y0ljh9co name:test_2]
</code></pre>
<p>2回目に実行した時に1回目で保存したレコードも取得できているので、無事に永続化できました。</p>
<p>データを消したいときは、コンテナを止めて<code>firestore/firestore_export</code> フォルダを削除してから起動し直せばOKです。</p>
<h2 id="%E6%B3%A8%E6%84%8F%E7%82%B9">注意点</h2>
<p>この方法でimportしたデータは、全てのProjectIDに対して初期データとして扱われるようです。</p>
<p>上の例では<code>test-project-id</code> というProjectIDでexportしていますが、importすると<code>test-project-id-1</code> でも、<code>test-project-id-2</code> でも、どんなProjectIDを指定しても同じ初期データが入った状態になります。</p>
<p>ランダムなProjectIDを使ってUTを書いている場合は気をつけましょう。<br>
自分は2時間ハマりました。</br></p>
<!--kg-card-end: markdown--></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[複数のdocker-compose間で通信する]]></title><description><![CDATA[異なるdocker-composeで動く環境に接続したくなったので調べてみました。

準備
まず、以下のようなdocker-compose.ymlで定義された2つの環境があるとします。

.  
├── app_a  
│   ├── app/...  
│   └── docker-compose.yml  
└── app_b  
    ├── app/...  
    └── docker-compose.yml


version: '3.7' services: app_a: image: golang:latest tty: true db_a: image:
postgres:latest view raw
[https://gist.github.com/yutakahashi114/f79ff6c5501c7509bf79bcc50c50ebe5/raw/3f9b33438bc4e9a4c7d9120c7566933abb9b8e27/multi-docker-compose-a-base]
 multi-docker-compose-a-base
[https:]]></description><link>https://tech.anti-pattern.co.jp/docker-compose/</link><guid isPermaLink="false">Ghost__Post__6102b73c3986b000013a4372</guid><category><![CDATA[docker-compose]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sun, 09 Feb 2020 15:01:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>異なるdocker-composeで動く環境に接続したくなったので調べてみました。</p>
<h2 id="%E6%BA%96%E5%82%99">準備</h2>
<p>まず、以下のようなdocker-compose.ymlで定義された2つの環境があるとします。</p>
<pre><code>.  
├── app_a  
│   ├── app/...  
│   └── docker-compose.yml  
└── app_b  
    ├── app/...  
    └── docker-compose.yml
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/f79ff6c5501c7509bf79bcc50c50ebe5.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937816" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-a-base" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-a-base-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-a-base-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-a-base-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-a-base-LC3" class="blob-code blob-code-inner js-file-line">  app_a:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-a-base-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-a-base-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-a-base-LC6" class="blob-code blob-code-inner js-file-line">  db_a:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-a-base-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-a-base-LC7" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/f79ff6c5501c7509bf79bcc50c50ebe5/raw/3f9b33438bc4e9a4c7d9120c7566933abb9b8e27/multi-docker-compose-a-base" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/f79ff6c5501c7509bf79bcc50c50ebe5#file-multi-docker-compose-a-base">multi-docker-compose-a-base</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/400abec1fdfec4ae0a0c7e14c9d85989.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937823" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-b-base" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-b-base-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-b-base-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-b-base-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-b-base-LC3" class="blob-code blob-code-inner js-file-line">  app_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-b-base-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-b-base-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-b-base-LC6" class="blob-code blob-code-inner js-file-line">  db_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-base-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-b-base-LC7" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/400abec1fdfec4ae0a0c7e14c9d85989/raw/e305fc53ca5d9a2f0c4bba828696fa22072d5c40/multi-docker-compose-b-base" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/400abec1fdfec4ae0a0c7e14c9d85989#file-multi-docker-compose-b-base">multi-docker-compose-b-base</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>この状態で app_a のコンテナと app_b のコンテナで通信することを考えます。</p>
<h2 id="%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82docker-compose%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE%EF%BC%9F">そもそもdocker-composeのネットワークってどうなってるの？</h2>
<p>先ほどのapp_aのdocker-composeを起動すると以下のようなログが出ます。</p>
<pre><code>~/app_a$ docker-compose up -d  
Creating network &quot;app_a_default&quot; with the default driver  
Creating app_a_db_a_1  ... done  
Creating app_a_app_a_1 ... done
</code></pre>
<p>コンテナを立ち上げる前に<code>app_a_default</code> というネットワークが作られています。このネットワークの詳細を見ると、以下のようになっています。</p>
<pre><code>~/app_a$ docker network inspect app_a_default   
[  
    {  
        &quot;Name&quot;: &quot;app_a_default&quot;,  
        &quot;Id&quot;: &quot;2c3cc9e7edaa5f54371d12299eaa6e26e710c45d5baca8196eeae67054e5fc53&quot;,  
        &quot;Created&quot;: &quot;2020-02-01T11:53:37.0174152Z&quot;,  
        &quot;Scope&quot;: &quot;local&quot;,  
        &quot;Driver&quot;: &quot;bridge&quot;,  
        &quot;EnableIPv6&quot;: false,  
        &quot;IPAM&quot;: {  
            &quot;Driver&quot;: &quot;default&quot;,  
            &quot;Options&quot;: null,  
            &quot;Config&quot;: [  
                {  
                    &quot;Subnet&quot;: &quot;192.168.80.0/20&quot;,  
                    &quot;Gateway&quot;: &quot;192.168.80.1&quot;  
                }  
            ]  
        },  
        &quot;Internal&quot;: false,  
        &quot;Attachable&quot;: true,  
        &quot;Ingress&quot;: false,  
        &quot;ConfigFrom&quot;: {  
            &quot;Network&quot;: &quot;&quot;  
        },  
        &quot;ConfigOnly&quot;: false,  
        &quot;Containers&quot;: {  
            &quot;0688a9b74b6dab1b2b85113f0bc535c585cb7bd48b659f0f00081f3d183ee310&quot;: {  
                &quot;Name&quot;: &quot;app_a_db_a_1&quot;,  
                &quot;EndpointID&quot;: &quot;5442fa856c1c3e6c81bb2e10fcb424ae10c22287c43a198c3bc7b8fdf2dd2fa6&quot;,  
                &quot;MacAddress&quot;: &quot;02:42:c0:a8:50:03&quot;,  
                &quot;IPv4Address&quot;: &quot;192.168.80.3/20&quot;,  
                &quot;IPv6Address&quot;: &quot;&quot;  
            },  
            &quot;a7d712117e7c243437269eb29f83f0ea453c5ba9201639218d9993f45c06e1bb&quot;: {  
                &quot;Name&quot;: &quot;app_a_app_a_1&quot;,  
                &quot;EndpointID&quot;: &quot;8cb0d595d775ed385bd9a6ff30d988631261cd0f3e634f98b38ace7432af0afd&quot;,  
                &quot;MacAddress&quot;: &quot;02:42:c0:a8:50:02&quot;,  
                &quot;IPv4Address&quot;: &quot;192.168.80.2/20&quot;,  
                &quot;IPv6Address&quot;: &quot;&quot;  
            }  
        },  
        &quot;Options&quot;: {},  
        &quot;Labels&quot;: {  
            &quot;com.docker.compose.network&quot;: &quot;default&quot;,  
            &quot;com.docker.compose.project&quot;: &quot;app_a&quot;,  
            &quot;com.docker.compose.version&quot;: &quot;1.24.1&quot;  
        }  
    }  
]
</code></pre>
<p><code>&quot;Containers&quot;</code> という項目を見ると、2つのコンテナがネットワーク上にあるのが分かります。</p>
<p>このように、<code>docker-compose up</code> で起動すると、ネットワークを自動で作り、そのネットワークにコンテナがアタッチされた状態になります。<br>
そのため、docker-composeを使用していると、自分で何も設定しなくてもコンテナ間で通信ができます。</br></p>
<p>Dockerのネットワークに関しては以下の記事が参考になりました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/zembutsu/items/1da05cb6a60e1c5acc25"><div class="kg-bookmark-content"><div class="kg-bookmark-title">参考訳：Docker コンテナ・ネットワークの理解 - Qiita</div><div class="kg-bookmark-description">Docker container networkinghttp://docs.docker.com/engine/userguide/networking/dockernetworks/ Docker コンテナ・ネットワーク...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">zembutsu</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND01WS1DNklDRDZLaXo3N3lhUkc5amEyVnlJT09Dcy1PRHMtT0RodU9EaXVPRHUtT0RqZU9EZy1PRGlPT0RyLU9Edk9PQ3ItT0JydWVRaHVpbm93JnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTQmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWNlbnRlciUyQ21pZGRsZSZzPWU1MTQ0YWJiMGQzOGU5OGM0NDY2ODMyMzMyYmNhZDY0&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RSHBsYldKMWRITjEmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT00NSZ0eHQtYWxpZ249cmlnaHQlMkNib3R0b20mcz0zYTM4MGVjZGMxZDI5MDkyMWNkZDI5ZTkwODA4YTY1Zg&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;c215e97c9311d5783e75239a4cf9706d"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="%E7%95%B0%E3%81%AA%E3%82%8Bdocker-compose%E9%96%93%E3%81%A7%E3%81%AE%E9%80%9A%E4%BF%A1">異なるdocker-compose間での通信</h2>
<p>別のdocker-composeであろうと、同一のネットワーク上に存在するコンテナどうしなら通信ができます。</p>
<p>以下の記事を参考に設定をしてみました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/reneice/items/20e981062b093264cd0a"><div class="kg-bookmark-content"><div class="kg-bookmark-title">docker-compose で別の docker-compose.yml で作ったコンテナとリンクする (ネットワークを繋げる) - Qiita</div><div class="kg-bookmark-description">バーチャルホストのように、１つのサーバーに複数のWebアプリを置いておきたい場合があります。その際に、nginxと各アプリにはそれぞれの docker-compose.yml を作って別々に管理したいと思います。 nginx (...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">reneice</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1aRzlqYTJWeUxXTnZiWEJ2YzJVZzQ0R241WWlsNDRHdUlHUnZZMnRsY2kxamIyMXdiM05sTG5sdGJDRGpnYWZrdlp6amdhUGpnWl9qZ3JQamc3UGpnNGJqZzRyamdhampnNnJqZzdQamdxX2pnWm5qZ29zZ0tPT0RqZU9EZy1PRGlPT0RyLU9Edk9PQ3ItT0NrdWU1aS1PQmt1T0NpeWsmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NCZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249Y2VudGVyJTJDbWlkZGxlJnM9NjVmZTlhYWUzYTVlODdkYzhmNjY5ZGU2Zjg0ODk5Yzg&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RSEpsYm1WcFkyVSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTlkNGUxZWI0ZWM5YmY4YmY1N2Y3N2EyMmVjYTY0NzI0&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;57c02911a13ac21413fd564ad1a8c508"/></div></a></figure><!--kg-card-begin: markdown--><p>以下のようにdocker-compose.ymlを修正します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937762" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-muilt-docker-compose-a" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-muilt-docker-compose-a-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-muilt-docker-compose-a-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-muilt-docker-compose-a-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-muilt-docker-compose-a-LC3" class="blob-code blob-code-inner js-file-line">  app_a:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-muilt-docker-compose-a-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-muilt-docker-compose-a-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-muilt-docker-compose-a-LC6" class="blob-code blob-code-inner js-file-line">    networks:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-muilt-docker-compose-a-LC7" class="blob-code blob-code-inner js-file-line">      - default</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-muilt-docker-compose-a-LC8" class="blob-code blob-code-inner js-file-line">      - shared-network</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-muilt-docker-compose-a-LC9" class="blob-code blob-code-inner js-file-line">  db_a:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-muilt-docker-compose-a-LC10" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-muilt-docker-compose-a-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-muilt-docker-compose-a-LC12" class="blob-code blob-code-inner js-file-line">networks:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-muilt-docker-compose-a-LC13" class="blob-code blob-code-inner js-file-line">  shared-network:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-muilt-docker-compose-a-LC14" class="blob-code blob-code-inner js-file-line">    external: true</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76/raw/c881f3da4a57b0d813a7a7387c1deaae076fdaab/muilt-docker-compose-a" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76#file-muilt-docker-compose-a">muilt-docker-compose-a</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937765" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-b" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-b-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-b-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-b-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-b-LC3" class="blob-code blob-code-inner js-file-line">  app_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-b-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-b-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-b-LC6" class="blob-code blob-code-inner js-file-line">    networks:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-b-LC7" class="blob-code blob-code-inner js-file-line">      - default</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-multi-docker-compose-b-LC8" class="blob-code blob-code-inner js-file-line">      - shared-network</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-multi-docker-compose-b-LC9" class="blob-code blob-code-inner js-file-line">  db_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-multi-docker-compose-b-LC10" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-multi-docker-compose-b-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-multi-docker-compose-b-LC12" class="blob-code blob-code-inner js-file-line">networks:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-multi-docker-compose-b-LC13" class="blob-code blob-code-inner js-file-line">  shared-network:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-multi-docker-compose-b-LC14" class="blob-code blob-code-inner js-file-line">    external: true</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048/raw/5eeb17842bd8209e4da652d716e0fb82c9a7ac0c/multi-docker-compose-b" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048#file-multi-docker-compose-b">multi-docker-compose-b</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>それぞれのdocker-composeのapp_a,app_bの設定に<code>networks</code> という項目を設定しています。これは各コンテナに接続するネットワークを指定できます。この項目を何も設定しなければ、自動でdefaultのネットワークにセットされます。<br>
app_a,app_bの<code>networks</code> に共通のネットワーク（<code>shared-network</code>）を追加することで、コンテナ間の通信が可能になります。<br>
<code>shared-network</code> はdocker-composeで管理されていないので、<code>networks</code> の設定が必要です（<code>services</code> と同じ階層）。<br>
<code>external: true</code> はdocker-composeで管理されていない外部のネットワーク、という意味です。</br></br></br></p>
<p>そして、docker-compose起動前に以下のコマンドを実行し、ネットワークを作成しておきます。</p>
<pre><code>docker network create shared-network
</code></pre>
<p>これで<code>shared-netowork</code> というネットワークが作成されます。このネットワークを作成した状態で上の2つのdocker-composeを起動します。</p>
<pre><code>~/app_a$ docker network create shared-network  
1eb174ca4efc48e20e8210a443d7b9c371fedb7b18bb6fa20ce34234da1bf7df

~/app_a$ docker-compose up -d  
Creating network &quot;app_a_default&quot; with the default driver  
Creating app_a_app_a_1 ... done  
Creating app_a_db_a_1  ... done~/app_a$ cd ../app_b/  

~/app_b$ docker-compose up -d  
Creating network &quot;app_b_default&quot; with the default driver  
Creating app_b_app_b_1 ... done  
Creating app_b_db_b_1  ... done
</code></pre>
<p>app_bのコンテナに入り、app_aに対してpingを打ってみます。</p>
<pre><code>~/app_b$ docker-compose exec app_b bash

root@ec898649299c:/go# ping app_a  
PING app_a (192.168.96.2) 56(84) bytes of data.  
64 bytes from app_a_app_a_1.shared-network (192.168.96.2): icmp_seq=1 ttl=64 time=0.508 ms  
64 bytes from app_a_app_a_1.shared-network (192.168.96.2): icmp_seq=2 ttl=64 time=0.209 ms
</code></pre>
<p>きちんと通信できています。</p>
<p>ちなみに、app_bとdb_aは別のネットワークなので通信はできません。</p>
<pre><code>root@ec898649299c:/go# ping db_a   
ping: db_a: Name or service not known
</code></pre>
<h2 id="docker-compose%E5%A4%96%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E7%AE%A1%E7%90%86%E3%81%8C%E9%9D%A2%E5%80%92">docker-compose外のネットワークの管理が面倒</h2>
<p>これで通信自体はできますが、<code>shared-network</code> を作成せずに<code>docker-compose up</code> するとエラーになったり、<code>docker-compose down</code>しても<code>shared-network</code> は消えないので残ったままになったりと、色々と面倒です。<br>
そこで、Makefileにそのあたりの設定を追加することにしました。<br>
（たまたま自分が今のプロジェクトでMakefileを使っていたのでMakefileでやりましたが、普通のシェルスクリプトでも良いと思います）</br></br></p>
<p>Makefileに以下を追加します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937773" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-makefile" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-makefile-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-makefile-LC1" class="blob-code blob-code-inner js-file-line">NETWORK_NAME = shared-network</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-makefile-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-makefile-LC3" class="blob-code blob-code-inner js-file-line">up:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-makefile-LC4" class="blob-code blob-code-inner js-file-line">	@if [ -z &quot;`docker network ls | grep $(NETWORK_NAME)`&quot; ]; then docker network create $(NETWORK_NAME); fi</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-makefile-LC5" class="blob-code blob-code-inner js-file-line">	docker-compose up -d</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-makefile-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-makefile-LC7" class="blob-code blob-code-inner js-file-line">down:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-multi-docker-compose-makefile-LC8" class="blob-code blob-code-inner js-file-line">	docker-compose down</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-multi-docker-compose-makefile-LC9" class="blob-code blob-code-inner js-file-line">	@if [ -n &quot;`docker network inspect $(NETWORK_NAME) | grep \&quot;\\&quot;Containers\\&quot;: {}\&quot;`&quot; ]; then docker network rm $(NETWORK_NAME); fi</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea/raw/2bd3ba6265ccdba2854f3fe6d91ae80622b20c47/multi-docker-compose-makefile" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea#file-multi-docker-compose-makefile">multi-docker-compose-makefile</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>これで <code>make up</code> を実行すると、<code>shared-network</code> が作成されていなければ作成してから<code>docker-compose up</code> されます。<br>
また、<code>make down</code> を実行すると、<code>docker-compose down</code> した後に<code>shared-network</code> 上のコンテナを確認し、1つもなければ<code>shared-network</code> を削除します。</br></p>
<pre><code>`docker network inspect $(NETWORK\_NAME) | grep \&quot;\\&quot;Containers\\&quot;: {}\&quot;`
</code></pre>
<p>のあたりが若干強引なので、何かいい方法があると良いのですが…</p>
<h2 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h2>
<p>以下のような構成だった場合、</p>
<pre><code>.  
├── app_a  
│   ├── app/...  
│   ├── Makefile  
│   └── docker-compose.yml  
└── app_b  
    ├── app/...  
    ├── Makefile  
    └── docker-compose.yml
</code></pre>
<p>以下のように設定すると、異なるdocker-composeのコンテナ間で通信ができます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937762" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-muilt-docker-compose-a" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-muilt-docker-compose-a-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-muilt-docker-compose-a-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-muilt-docker-compose-a-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-muilt-docker-compose-a-LC3" class="blob-code blob-code-inner js-file-line">  app_a:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-muilt-docker-compose-a-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-muilt-docker-compose-a-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-muilt-docker-compose-a-LC6" class="blob-code blob-code-inner js-file-line">    networks:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-muilt-docker-compose-a-LC7" class="blob-code blob-code-inner js-file-line">      - default</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-muilt-docker-compose-a-LC8" class="blob-code blob-code-inner js-file-line">      - shared-network</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-muilt-docker-compose-a-LC9" class="blob-code blob-code-inner js-file-line">  db_a:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-muilt-docker-compose-a-LC10" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-muilt-docker-compose-a-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-muilt-docker-compose-a-LC12" class="blob-code blob-code-inner js-file-line">networks:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-muilt-docker-compose-a-LC13" class="blob-code blob-code-inner js-file-line">  shared-network:</td>
      </tr>
      <tr>
        <td id="file-muilt-docker-compose-a-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-muilt-docker-compose-a-LC14" class="blob-code blob-code-inner js-file-line">    external: true</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76/raw/c881f3da4a57b0d813a7a7387c1deaae076fdaab/muilt-docker-compose-a" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2b4e5f9530aef9fbf417683334729b76#file-muilt-docker-compose-a">muilt-docker-compose-a</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937765" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-b" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-b-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-b-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-b-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-b-LC3" class="blob-code blob-code-inner js-file-line">  app_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-b-LC4" class="blob-code blob-code-inner js-file-line">    image: golang:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-b-LC5" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-b-LC6" class="blob-code blob-code-inner js-file-line">    networks:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-b-LC7" class="blob-code blob-code-inner js-file-line">      - default</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-multi-docker-compose-b-LC8" class="blob-code blob-code-inner js-file-line">      - shared-network</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-multi-docker-compose-b-LC9" class="blob-code blob-code-inner js-file-line">  db_b:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-multi-docker-compose-b-LC10" class="blob-code blob-code-inner js-file-line">    image: postgres:latest</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-multi-docker-compose-b-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-multi-docker-compose-b-LC12" class="blob-code blob-code-inner js-file-line">networks:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-multi-docker-compose-b-LC13" class="blob-code blob-code-inner js-file-line">  shared-network:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-b-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-multi-docker-compose-b-LC14" class="blob-code blob-code-inner js-file-line">    external: true</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048/raw/5eeb17842bd8209e4da652d716e0fb82c9a7ac0c/multi-docker-compose-b" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/bda43eeb394d3e889d0603c5bb837048#file-multi-docker-compose-b">multi-docker-compose-b</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937773" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-multi-docker-compose-makefile" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-multi-docker-compose-makefile-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-multi-docker-compose-makefile-LC1" class="blob-code blob-code-inner js-file-line">NETWORK_NAME = shared-network</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-multi-docker-compose-makefile-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-multi-docker-compose-makefile-LC3" class="blob-code blob-code-inner js-file-line">up:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-multi-docker-compose-makefile-LC4" class="blob-code blob-code-inner js-file-line">	@if [ -z &quot;`docker network ls | grep $(NETWORK_NAME)`&quot; ]; then docker network create $(NETWORK_NAME); fi</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-multi-docker-compose-makefile-LC5" class="blob-code blob-code-inner js-file-line">	docker-compose up -d</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-multi-docker-compose-makefile-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-multi-docker-compose-makefile-LC7" class="blob-code blob-code-inner js-file-line">down:</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-multi-docker-compose-makefile-LC8" class="blob-code blob-code-inner js-file-line">	docker-compose down</td>
      </tr>
      <tr>
        <td id="file-multi-docker-compose-makefile-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-multi-docker-compose-makefile-LC9" class="blob-code blob-code-inner js-file-line">	@if [ -n &quot;`docker network inspect $(NETWORK_NAME) | grep \&quot;\\&quot;Containers\\&quot;: {}\&quot;`&quot; ]; then docker network rm $(NETWORK_NAME); fi</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea/raw/2bd3ba6265ccdba2854f3fe6d91ae80622b20c47/multi-docker-compose-makefile" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/62cd2b4010015dc5116bc488fe3fd1ea#file-multi-docker-compose-makefile">multi-docker-compose-makefile</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--></link></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[GolangのORM、Xormの使い方ざっくりまとめ]]></title><description><![CDATA[最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。

自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。

環境
 * Go : 1.13.1
 * Xorm : 0.7.9
 * PostgreSQL : 11.6

使用するテーブル
create table users( id BIGSERIAL, first_name VARCHAR(20) NOT NULL, last_name
VARCHAR(20) NOT NULL, first_name_kana VARCHAR(20), last_name_kana VARCHAR(20), 
version BIGINT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAM]]></description><link>https://tech.anti-pattern.co.jp/xorm/</link><guid isPermaLink="false">Ghost__Post__6102b00b3986b000013a42cb</guid><category><![CDATA[golang]]></category><category><![CDATA[Xorm]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Sun, 09 Feb 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。</p>
<p>自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。</p>
<h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>Go : 1.13.1</li>
<li>Xorm : 0.7.9</li>
<li>PostgreSQL : 11.6</li>
</ul>
<h2 id="%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">使用するテーブル</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672078" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-table" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-table-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-table-LC1" class="blob-code blob-code-inner js-file-line">create table users(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-table-LC2" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-table-LC3" class="blob-code blob-code-inner js-file-line">    first_name VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-table-LC4" class="blob-code blob-code-inner js-file-line">    last_name  VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-table-LC5" class="blob-code blob-code-inner js-file-line">    first_name_kana VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-table-LC6" class="blob-code blob-code-inner js-file-line">    last_name_kana  VARCHAR(20),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-table-LC7" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-table-LC8" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-table-LC9" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-table-LC10" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-table-LC11" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-table-LC12" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-table-LC13" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-table-LC14" class="blob-code blob-code-inner js-file-line">create table friends(</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-table-LC15" class="blob-code blob-code-inner js-file-line">    id         BIGSERIAL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-table-LC16" class="blob-code blob-code-inner js-file-line">    user_id    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-table-LC17" class="blob-code blob-code-inner js-file-line">    friend_id  BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-table-LC18" class="blob-code blob-code-inner js-file-line">    version    BIGINT NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-table-LC19" class="blob-code blob-code-inner js-file-line">    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-table-LC20" class="blob-code blob-code-inner js-file-line">    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-table-LC21" class="blob-code blob-code-inner js-file-line">    deleted_at TIMESTAMP,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-table-LC22" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-table-LC23" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (user_id) REFERENCES users (id),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-table-LC24" class="blob-code blob-code-inner js-file-line">    FOREIGN KEY (friend_id) REFERENCES users (id)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-table-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-table-LC25" class="blob-code blob-code-inner js-file-line">);</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888/raw/6e33d4b70a32903c250790a3b71d9cd72a2e16ea/go-xorm-table" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8e1af26fd43aa4b0537ce929d42e3888#file-go-xorm-table">go-xorm-table</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>ユーザー情報を保存するusersテーブルと、ユーザー同士のフレンド関係を登録するfiriendsテーブルを作成しました 。</p>
<h2 id="%E6%8E%A5%E7%B6%9A">接続</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/8fb9e6df8b4079878a0dc3e5c25c9ee1.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671995" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-main" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-main-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-main-LC1" class="blob-code blob-code-inner js-file-line">package main</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-main-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-main-LC3" class="blob-code blob-code-inner js-file-line">import (</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-main-LC4" class="blob-code blob-code-inner js-file-line">	&quot;log&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-main-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-main-LC6" class="blob-code blob-code-inner js-file-line">	&quot;github.com/go-xorm/xorm&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-main-LC7" class="blob-code blob-code-inner js-file-line">	_ &quot;github.com/lib/pq&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-main-LC8" class="blob-code blob-code-inner js-file-line">	&quot;xorm.io/core&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-main-LC9" class="blob-code blob-code-inner js-file-line">)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-main-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-main-LC11" class="blob-code blob-code-inner js-file-line">func main() {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-main-LC12" class="blob-code blob-code-inner js-file-line">	engine, err := xorm.NewEngine(&quot;postgres&quot;, &quot;postgres://user:password@db/database?sslmode=disable&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-main-LC13" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-main-LC14" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-main-LC15" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-main-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-main-LC17" class="blob-code blob-code-inner js-file-line">	defer engine.Close()</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-main-LC18" class="blob-code blob-code-inner js-file-line">	engine.ShowSQL(true)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-main-LC19" class="blob-code blob-code-inner js-file-line">	engine.SetMapper(core.GonicMapper{})</td>
      </tr>
      <tr>
        <td id="file-go-xorm-main-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-main-LC20" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/8fb9e6df8b4079878a0dc3e5c25c9ee1/raw/a49fbe615412a5312e200926d11cde5a4ad0ff1a/go-xorm-main" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/8fb9e6df8b4079878a0dc3e5c25c9ee1#file-go-xorm-main">go-xorm-main</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>engine.ShowSQL(true)</code> を設定すると、実行されたSQLを標準出力に出すことができます。<code>engine.SetMapper(core.GonicMapper{})</code> は、後述するフィールド名とカラム名のマッピングに影響します。</p>
<h2 id="create">Create</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/26217937503b3d1b4bbc6f62783d2586.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100666258" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-create" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-create-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-create-LC1" class="blob-code blob-code-inner js-file-line">type user struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-create-LC2" class="blob-code blob-code-inner js-file-line">	ID            uint64 `xorm:&quot;autoincr&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-create-LC3" class="blob-code blob-code-inner js-file-line">	FirstName     string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-create-LC4" class="blob-code blob-code-inner js-file-line">	LastName      string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-create-LC5" class="blob-code blob-code-inner js-file-line">	FirstNameKana string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-create-LC6" class="blob-code blob-code-inner js-file-line">	LastNameKana  string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-create-LC7" class="blob-code blob-code-inner js-file-line">	Version       uint64    `xorm:&quot;version&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-create-LC8" class="blob-code blob-code-inner js-file-line">	CreatedAt     time.Time `xorm:&quot;created&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-create-LC9" class="blob-code blob-code-inner js-file-line">	UpdatedAt     time.Time `xorm:&quot;updated&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-create-LC10" class="blob-code blob-code-inner js-file-line">	DeletedAt     time.Time `xorm:&quot;deleted&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-create-LC11" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-create-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-create-LC13" class="blob-code blob-code-inner js-file-line">func (user) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-create-LC14" class="blob-code blob-code-inner js-file-line">	return &quot;users&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-create-LC15" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-create-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-create-LC17" class="blob-code blob-code-inner js-file-line">func create(engine *xorm.Engine) {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-create-LC18" class="blob-code blob-code-inner js-file-line">	u := user{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-create-LC19" class="blob-code blob-code-inner js-file-line">		FirstName: &quot;太郎&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-create-LC20" class="blob-code blob-code-inner js-file-line">		LastName:  &quot;テスト&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-create-LC21" class="blob-code blob-code-inner js-file-line">	}  </td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-create-LC22" class="blob-code blob-code-inner js-file-line">	affected, err := engine.Insert(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-create-LC23" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-create-LC24" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-create-LC25" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-xorm-create-LC26" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-xorm-create-LC27" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-xorm-create-LC28" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;No Affected&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-xorm-create-LC29" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-xorm-create-LC30" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-xorm-create-LC31" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/26217937503b3d1b4bbc6f62783d2586/raw/500a5f960da267434bb0205500a5927489a63f06/go-xorm-create" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/26217937503b3d1b4bbc6f62783d2586#file-go-xorm-create">go-xorm-create</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>INSERT INTO &quot;users&quot;(  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;  
)  
VALUES(  
    $1,  
    $2,  
    $3,  
    $4,  
    $5,  
    $6,  
    $7  
) RETURNING &quot;id&quot;
</code></pre>
<p>構造体のフィールド名をスネークケースに変換したものがカラム名に対応しています<code>(FirstName -&gt; first_name)</code>。通常はフィールド名を<code>ID</code> とすると<code>i_d</code> というカラムにマッピングしてしまいますが、<code>engine.SetMapper(core.GonicMapper{})</code> を指定すると<code>id</code> にマッピングできます。フィールド名を<code>Id</code> にすると<code>GonicMapper</code>は不要になりますが、Go のlintで警告が出てしまいます。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gobook.io/read/gitea.com/xorm/manual-en-US/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Page |</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://gobook.io/read/gitea.com/xorm/manual-en-US/gitbook/images/apple-touch-icon-precomposed-152.png"/></div></div></a></figure><!--kg-card-begin: markdown--><p><code>`xorm:&quot;first_name&quot;`</code>のようにタグでカラム名を指定することもできますが、全てのフィールドに指定するのは面倒なのでフィールド名を合わせた方が良いと思います。</p>
<p><code>version</code>カラムは楽観的ロックのために使用します。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc"><div class="kg-bookmark-content"><div class="kg-bookmark-title">排他制御（楽観ロック・悲観ロック）の基礎 - Qiita</div><div class="kg-bookmark-description">排他制御とは 共有資源（データやファイル）に対して複数のアクセスが見込まれる場合に、同時アクセスにより不整合が発生することを防ぐため、あるトランザクションが共有資源（データやファイル）にアクセスしている時は他トランザクションから...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">NagaokaKenichi</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND01bzZTNUx1VzVZaTI1YjZoNzd5STVxVzk2S2F6NDRPdDQ0T0Q0NEt2NDRPNzVvS3k2S2F6NDRPdDQ0T0Q0NEt2Nzd5SjQ0R3U1Wi02NTZTTzQ0Q0EmdHh0LWNvbG9yPSUyMzMzMyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NCZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249Y2VudGVyJTJDbWlkZGxlJnM9NTI3NWU0MWI5YTZmMTRmZWIyNjZiMTcyZGRmMDJiOGY&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RRTVoWjJGdmEyRkxaVzVwWTJocCZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTM3M2Y5N2NjY2E1ODdkOGU4NzEwMjI1OWMyNmExZGM1&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;359b05d07421fe72fe0c88b8107d9ac0"/></div></a></figure><!--kg-card-begin: markdown--><p>xormではDBに<code>version</code>カラムを設定し、フィールドに <code>`xorm:&quot;version&quot;`</code> を指定するとupdate時に自動で判定してくれます。</p>
<p>大抵のテーブルで<code>id</code>カラムは自動採番だと思います。構造体のIDフィールドのタグに <code>`xorm:&quot;autoincr&quot;`</code> をつけると、insert対象のカラムから<code>id</code>が外され、SQLに<code>RETURNING &quot;id&quot;</code> が追加され、insert後のインスタンスにinsert結果の<code>id</code>が自動で設定されます。自動採番された<code>id</code>を別のテーブルに登録する際に使えます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/a988c1ba79d0a25763bc242da2976024.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671958" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-create-autoincr" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-create-autoincr-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-create-autoincr-LC1" class="blob-code blob-code-inner js-file-line">type friend struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-create-autoincr-LC2" class="blob-code blob-code-inner js-file-line">	ID        uint64 `xorm:&quot;autoincr&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-create-autoincr-LC3" class="blob-code blob-code-inner js-file-line">	UserID    uint64</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-create-autoincr-LC4" class="blob-code blob-code-inner js-file-line">	FriendID  uint64</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-create-autoincr-LC5" class="blob-code blob-code-inner js-file-line">	Version   uint64    `xorm:&quot;version&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-create-autoincr-LC6" class="blob-code blob-code-inner js-file-line">	CreatedAt time.Time `xorm:&quot;created&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-create-autoincr-LC7" class="blob-code blob-code-inner js-file-line">	UpdatedAt time.Time `xorm:&quot;updated&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-create-autoincr-LC8" class="blob-code blob-code-inner js-file-line">	DeletedAt time.Time `xorm:&quot;deleted&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-create-autoincr-LC9" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-create-autoincr-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-create-autoincr-LC11" class="blob-code blob-code-inner js-file-line">func (friend) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-create-autoincr-LC12" class="blob-code blob-code-inner js-file-line">	return &quot;friends&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-create-autoincr-LC13" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-create-autoincr-LC14" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-create-autoincr-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-create-autoincr-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-create-autoincr-LC17" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-create-autoincr-LC18" class="blob-code blob-code-inner js-file-line">	u2 := user{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-create-autoincr-LC19" class="blob-code blob-code-inner js-file-line">		FirstName: &quot;太郎2&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-create-autoincr-LC20" class="blob-code blob-code-inner js-file-line">		LastName:  &quot;テスト&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-create-autoincr-LC21" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-create-autoincr-LC22" class="blob-code blob-code-inner js-file-line">	affected, err = engine.Insert(&amp;u2)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-create-autoincr-LC23" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-create-autoincr-LC24" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-create-autoincr-LC25" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-xorm-create-autoincr-LC26" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-xorm-create-autoincr-LC27" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-xorm-create-autoincr-LC28" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;No Affected&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-xorm-create-autoincr-LC29" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-xorm-create-autoincr-LC30" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-xorm-create-autoincr-LC31" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-xorm-create-autoincr-LC32" class="blob-code blob-code-inner js-file-line">	f := friend{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-xorm-create-autoincr-LC33" class="blob-code blob-code-inner js-file-line">		UserID:   u.ID,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-xorm-create-autoincr-LC34" class="blob-code blob-code-inner js-file-line">		FriendID: u2.ID,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-go-xorm-create-autoincr-LC35" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-go-xorm-create-autoincr-LC36" class="blob-code blob-code-inner js-file-line">	affected, err = engine.Insert(&amp;f)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-go-xorm-create-autoincr-LC37" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-go-xorm-create-autoincr-LC38" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-go-xorm-create-autoincr-LC39" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-go-xorm-create-autoincr-LC40" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-go-xorm-create-autoincr-LC41" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-go-xorm-create-autoincr-LC42" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;No Affected&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-go-xorm-create-autoincr-LC43" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-go-xorm-create-autoincr-LC44" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-autoincr-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-go-xorm-create-autoincr-LC45" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/a988c1ba79d0a25763bc242da2976024/raw/f68c8c4b5b55be8f51fe3f366cf9a83609cdfbd1/go-xorm-create-autoincr" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/a988c1ba79d0a25763bc242da2976024#file-go-xorm-create-autoincr">go-xorm-create-autoincr</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>insertでスライスを渡せば、一括登録もできます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/0e666a5d1a7b8264d636ad478cecf38c.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671965" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-create-bulk" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-create-bulk-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-create-bulk-LC1" class="blob-code blob-code-inner js-file-line">	us := []user{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-create-bulk-LC2" class="blob-code blob-code-inner js-file-line">		{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-create-bulk-LC3" class="blob-code blob-code-inner js-file-line">			FirstName: &quot;太郎3&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-create-bulk-LC4" class="blob-code blob-code-inner js-file-line">			LastName:  &quot;テスト&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-create-bulk-LC5" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-create-bulk-LC6" class="blob-code blob-code-inner js-file-line">		{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-create-bulk-LC7" class="blob-code blob-code-inner js-file-line">			FirstName: &quot;太郎4&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-create-bulk-LC8" class="blob-code blob-code-inner js-file-line">			LastName:  &quot;テスト&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-create-bulk-LC9" class="blob-code blob-code-inner js-file-line">		},</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-create-bulk-LC10" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-create-bulk-LC11" class="blob-code blob-code-inner js-file-line">	affected, err = engine.Insert(&amp;us)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-create-bulk-LC12" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-create-bulk-LC13" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-create-bulk-LC14" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-create-bulk-LC15" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-create-bulk-LC16" class="blob-code blob-code-inner js-file-line">	if affected != 2 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-create-bulk-LC17" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Unexpected Affected&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-create-bulk-LC18" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-create-bulk-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-create-bulk-LC19" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/0e666a5d1a7b8264d636ad478cecf38c/raw/91332f2015a7002875664a629cfaed93260e4867/go-xorm-create-bulk" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/0e666a5d1a7b8264d636ad478cecf38c#file-go-xorm-create-bulk">go-xorm-create-bulk</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>INSERT INTO &quot;users&quot;(  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;  
)  
VALUES(  
    $1,  
    $2,  
    $3,  
    $4,  
    $5,  
    $6,  
    $7  
),  
(  
    $8,  
    $9,  
    $10,  
    $11,  
    $12,  
    $13,  
    $14  
)
</code></pre>
<p>一括の場合はidがインスタンスに自動でセットされないので、必要であれば検索するか、単一のinsertを使用することになります。</p>
<h2 id="read">Read</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/63073d867d693e8900e45b91c3eff918.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672003" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-LC1" class="blob-code blob-code-inner js-file-line">func read(engine *xorm.Engine) {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-LC2" class="blob-code blob-code-inner js-file-line">	t := time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-LC3" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-LC4" class="blob-code blob-code-inner js-file-line">	// 1件取得</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-LC5" class="blob-code blob-code-inner js-file-line">	u := user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-LC6" class="blob-code blob-code-inner js-file-line">	has, err := engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-LC7" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-LC8" class="blob-code blob-code-inner js-file-line">		Where(&quot;last_name LIKE ?&quot;, &quot;テスト&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-LC9" class="blob-code blob-code-inner js-file-line">		In(&quot;last_name&quot;, &quot;テスト&quot;, &quot;テスト2&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-LC10" class="blob-code blob-code-inner js-file-line">		In(&quot;last_name&quot;, []string{&quot;テスト&quot;, &quot;テスト2&quot;}).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-read-LC11" class="blob-code blob-code-inner js-file-line">		Where(&quot;first_name = ? OR first_name = ?&quot;, &quot;太郎&quot;, &quot;太郎2&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-read-LC12" class="blob-code blob-code-inner js-file-line">		Where(&quot;created_at &gt;= ?&quot;, t).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-read-LC13" class="blob-code blob-code-inner js-file-line">		Get(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-read-LC14" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-read-LC15" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-read-LC16" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-read-LC17" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-read-LC18" class="blob-code blob-code-inner js-file-line">	if !has {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-read-LC19" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-read-LC20" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-read-LC21" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-read-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-read-LC23" class="blob-code blob-code-inner js-file-line">	// 複数取得</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-read-LC24" class="blob-code blob-code-inner js-file-line">	us := []user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-read-LC25" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-xorm-read-LC26" class="blob-code blob-code-inner js-file-line">		Limit(10, 10).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-xorm-read-LC27" class="blob-code blob-code-inner js-file-line">		Asc(&quot;id&quot;, &quot;first_name&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-xorm-read-LC28" class="blob-code blob-code-inner js-file-line">		Desc(&quot;last_name&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-xorm-read-LC29" class="blob-code blob-code-inner js-file-line">		Find(&amp;us)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-xorm-read-LC30" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-xorm-read-LC31" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-xorm-read-LC32" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-xorm-read-LC33" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-xorm-read-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/63073d867d693e8900e45b91c3eff918/raw/47b0d02c8a56cb9a67abbc2b784730445604ec64/go-xorm-read" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/63073d867d693e8900e45b91c3eff918#file-go-xorm-read">go-xorm-read</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>Get</code> で1件のみ、<code>Find</code> で複数検索です。</p>
<p>Get</p>
<pre><code>SELECT  
    &quot;id&quot;,  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;,  
    &quot;deleted_at&quot;  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        id = $1  
    )  
AND (last_name LIKE $2)  
AND &quot;last_name&quot; IN($3, $4)  
AND &quot;last_name&quot; IN($5, $6)  
AND (  
        first_name = $7  
    OR  first_name = $8  
    )  
AND (  
        created_at &gt;= $9  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $10  
    )  
LIMIT 1
</code></pre>
<p>Find</p>
<pre><code>SELECT  
    &quot;id&quot;,  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;,  
    &quot;deleted_at&quot;  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $1  
    )  
ORDER BY  
    &quot;id&quot; ASC,  
    &quot;first_name&quot; ASC,  
    &quot;last_name&quot; DESC  
LIMIT 10 OFFSET 10
</code></pre>
<p>構造体のフィールドに <code>`xorm:&quot;deleted&quot;`</code> があれば、where句に自動で</p>
<pre><code>(&quot;deleted_at&quot; IS NULL OR &quot;deleted_at&quot; = '0001-01-01 00:00:00')
</code></pre>
<p>が追加されます。<code>deleted_at</code>が(NULL or ゼロ値)であることを確認しています。</p>
<p><code>Unscoped()</code> でdeleted_atを無視できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3e9d712c757f6111fc70df6323eb7d7c.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672071" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-unscoped" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-unscoped-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-unscoped-LC1" class="blob-code blob-code-inner js-file-line">	us := []user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-unscoped-LC2" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-unscoped-LC3" class="blob-code blob-code-inner js-file-line">		Unscoped().</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-unscoped-LC4" class="blob-code blob-code-inner js-file-line">		Find(&amp;us)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-unscoped-LC5" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-unscoped-LC6" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-unscoped-LC7" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-unscoped-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-unscoped-LC8" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3e9d712c757f6111fc70df6323eb7d7c/raw/b094f4ea31780b73ef3f705f772e1906d084ba78/go-xorm-read-unscoped" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3e9d712c757f6111fc70df6323eb7d7c#file-go-xorm-read-unscoped">go-xorm-read-unscoped</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    &quot;id&quot;,  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;,  
    &quot;deleted_at&quot;  
FROM  
    &quot;users&quot;
</code></pre>
<p>countもできます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2b5fd65b566c6180715b5a1b7a7c0279.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672008" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-count" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-count-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-count-LC1" class="blob-code blob-code-inner js-file-line">	u := user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-count-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-count-LC2" class="blob-code blob-code-inner js-file-line">	count, err := engine.Count(&amp;u2)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-count-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-count-LC3" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-count-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-count-LC4" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-count-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-count-LC5" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-count-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-count-LC6" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2b5fd65b566c6180715b5a1b7a7c0279/raw/faf8e41df8b131091d70af6befdbe570f0077d78/go-xorm-read-count" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2b5fd65b566c6180715b5a1b7a7c0279#file-go-xorm-read-count">go-xorm-read-count</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    count(*)  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $1  
    )
</code></pre>
<p><code>FindAndCount()</code> でFindとCountを同時に実行できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/5d986d04aeffc3b63173f6e3608719fd.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672014" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-find-count" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-find-count-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-find-count-LC1" class="blob-code blob-code-inner js-file-line">	us := []user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-find-count-LC2" class="blob-code blob-code-inner js-file-line">	count, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-find-count-LC3" class="blob-code blob-code-inner js-file-line">		Limit(10, 10).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-find-count-LC4" class="blob-code blob-code-inner js-file-line">		Asc(&quot;id&quot;, &quot;first_name&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-find-count-LC5" class="blob-code blob-code-inner js-file-line">		Desc(&quot;last_name&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-find-count-LC6" class="blob-code blob-code-inner js-file-line">		FindAndCount(&amp;us3)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-find-count-LC7" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-find-count-LC8" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-find-count-LC9" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-find-count-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-find-count-LC10" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/5d986d04aeffc3b63173f6e3608719fd/raw/ebb2f79de5fb71193109c87e8006d25b7363a12f/go-xorm-read-find-count" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/5d986d04aeffc3b63173f6e3608719fd#file-go-xorm-read-find-count">go-xorm-read-find-count</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    &quot;id&quot;,  
    &quot;first_name&quot;,  
    &quot;last_name&quot;,  
    &quot;first_name_kana&quot;,  
    &quot;last_name_kana&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;,  
    &quot;deleted_at&quot;  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $1  
    )  
ORDER BY  
    &quot;id&quot; ASC,  
    &quot;first_name&quot; ASC,  
    &quot;last_name&quot; DESC  
LIMIT 10 OFFSET 10

SELECT  
    count(*)  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $1  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $2  
    )
</code></pre>
<p>2つのSQLが実行されます。limitやoffsetを設定していてもcountでは無視されます。countのdeleted_atの部分が重複しているのはバグな気がしますが、結果には影響ないので多分大丈夫です。</p>
<p>joinした結果を取得したい場合、新たに構造体を定義します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/4896c8640224e8805ff2f2204dda1cf3.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672039" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-join" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-join-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-join-LC1" class="blob-code blob-code-inner js-file-line">type joinedUser struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-join-LC2" class="blob-code blob-code-inner js-file-line">	User   user   `xorm:&quot;extends&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-join-LC3" class="blob-code blob-code-inner js-file-line">	Friend friend `xorm:&quot;extends&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-join-LC4" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-join-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-join-LC6" class="blob-code blob-code-inner js-file-line">func (joinedUser) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-join-LC7" class="blob-code blob-code-inner js-file-line">	return &quot;friends&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-join-LC8" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-join-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-join-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-read-join-LC11" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-read-join-LC12" class="blob-code blob-code-inner js-file-line">	jus := []joinedUser{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-read-join-LC13" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-read-join-LC14" class="blob-code blob-code-inner js-file-line">		Join(&quot;INNER&quot;, &quot;users&quot;, &quot;users.id = friends.friend_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-read-join-LC15" class="blob-code blob-code-inner js-file-line">		Find(&amp;jus)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-read-join-LC16" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-read-join-LC17" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-read-join-LC18" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-read-join-LC19" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-read-join-LC20" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/4896c8640224e8805ff2f2204dda1cf3/raw/48feef16869d01de58e907f217175c764e2818c2/go-xorm-read-join" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/4896c8640224e8805ff2f2204dda1cf3#file-go-xorm-read-join">go-xorm-read-join</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    *  
FROM  
    &quot;friends&quot;  
    INNER JOIN  
        users  
    ON  users.id = friends.friend_id  
WHERE  
    (  
        &quot;friends&quot;.&quot;deleted_at&quot; IS NULL  
    OR  &quot;friends&quot;.&quot;deleted_at&quot; = $1  
    )
</code></pre>
<p>フィールドに<code>`xorm:&quot;extends&quot;`</code> を設定します。from句のdeleted_atは自動で確認してくれますが、join先のdeleted_atは確認してくれないので、自分で追加する必要があります。</p>
<p>サブクエリを設定する場合は<code>&quot;xorm.io/builder&quot;</code> を使います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/a8c56da28b65e9ad1469ca6098e2f5f2.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672067" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-subquery" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-subquery-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-subquery-LC1" class="blob-code blob-code-inner js-file-line">	subQuery := builder.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-subquery-LC2" class="blob-code blob-code-inner js-file-line">		Select(&quot;id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-subquery-LC3" class="blob-code blob-code-inner js-file-line">		From(&quot;users&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-subquery-LC4" class="blob-code blob-code-inner js-file-line">		Where(builder.Eq{&quot;last_name&quot;: &quot;テスト&quot;}).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-subquery-LC5" class="blob-code blob-code-inner js-file-line">		Where(builder.Like{&quot;last_name&quot;, &quot;テスト&quot;}).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-subquery-LC6" class="blob-code blob-code-inner js-file-line">		Where(builder.In(&quot;last_name&quot;, &quot;テスト&quot;, &quot;テスト2&quot;)).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-subquery-LC7" class="blob-code blob-code-inner js-file-line">		Where(builder.In(&quot;last_name&quot;, []string{&quot;テスト&quot;, &quot;テスト2&quot;})).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-subquery-LC8" class="blob-code blob-code-inner js-file-line">		Where(builder.Eq{&quot;first_name&quot;: &quot;太郎2&quot;}.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-subquery-LC9" class="blob-code blob-code-inner js-file-line">			Or(builder.Eq{&quot;first_name&quot;: &quot;太郎3&quot;}).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-subquery-LC10" class="blob-code blob-code-inner js-file-line">			Or(builder.Eq{&quot;first_name&quot;: &quot;太郎4&quot;}),</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-read-subquery-LC11" class="blob-code blob-code-inner js-file-line">		).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-read-subquery-LC12" class="blob-code blob-code-inner js-file-line">		Where(builder.Gte{&quot;created_at&quot;: t}).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-read-subquery-LC13" class="blob-code blob-code-inner js-file-line">		Where(builder.IsNull{&quot;deleted_at&quot;})</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-read-subquery-LC14" class="blob-code blob-code-inner js-file-line">	fs := []friend{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-read-subquery-LC15" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-read-subquery-LC16" class="blob-code blob-code-inner js-file-line">		In(&quot;friend_id&quot;, subQuery).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-read-subquery-LC17" class="blob-code blob-code-inner js-file-line">		Limit(10, 10).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-read-subquery-LC18" class="blob-code blob-code-inner js-file-line">		Asc(&quot;id&quot;, &quot;friend_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-read-subquery-LC19" class="blob-code blob-code-inner js-file-line">		Desc(&quot;user_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-read-subquery-LC20" class="blob-code blob-code-inner js-file-line">		Find(&amp;fs)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-read-subquery-LC21" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-read-subquery-LC22" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-read-subquery-LC23" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-subquery-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-read-subquery-LC24" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/a8c56da28b65e9ad1469ca6098e2f5f2/raw/6fb09093db7f4eaca24d647cc88dee7957da4244/go-xorm-read-subquery" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/a8c56da28b65e9ad1469ca6098e2f5f2#file-go-xorm-read-subquery">go-xorm-read-subquery</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    &quot;id&quot;,  
    &quot;user_id&quot;,  
    &quot;friend_id&quot;,  
    &quot;version&quot;,  
    &quot;created_at&quot;,  
    &quot;updated_at&quot;,  
    &quot;deleted_at&quot;  
FROM  
    &quot;friends&quot;  
WHERE  
    &quot;friend_id&quot; IN(  
        SELECT  
            id  
        FROM  
            users  
        WHERE  
            last_name = $1  
        AND last_name LIKE $2  
        AND last_name IN($3, $4)  
        AND last_name IN($5, $6)  
        AND (  
                first_name = $7  
            OR  first_name = $8  
            OR  first_name = $9  
            )  
        AND created_at &gt;= $10  
        AND deleted_at IS NULL  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $11  
    )  
ORDER BY  
    &quot;id&quot; ASC,  
    &quot;friend_id&quot; ASC,  
    &quot;user_id&quot; DESC  
LIMIT 10 OFFSET 10
</code></pre>
<p>サブクエリはjoin句にも設定できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/9ae0281a654ec5cef7ef133c4c75866e.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672051" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-join-subquery" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-join-subquery-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-join-subquery-LC1" class="blob-code blob-code-inner js-file-line">	jus := []joinedUser{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-join-subquery-LC2" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-join-subquery-LC3" class="blob-code blob-code-inner js-file-line">		Join(&quot;INNER&quot;, subQuery, &quot;users.id = friends.friend_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-join-subquery-LC4" class="blob-code blob-code-inner js-file-line">		Find(&amp;jus)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-join-subquery-LC5" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-join-subquery-LC6" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-join-subquery-LC7" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-join-subquery-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-join-subquery-LC8" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/9ae0281a654ec5cef7ef133c4c75866e/raw/4719b42374ac418b55fb3048bd7aa120b62c83f0/go-xorm-read-join-subquery" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/9ae0281a654ec5cef7ef133c4c75866e#file-go-xorm-read-join-subquery">go-xorm-read-join-subquery</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    *  
FROM  
    &quot;friends&quot;  
    INNER JOIN  
        (  
            SELECT  
                id  
            FROM  
                users  
            WHERE  
                last_name = $1  
            AND last_name LIKE $2  
            AND last_name IN($3, $4)  
            AND last_name IN($5, $6)  
            AND (  
                    first_name = $7  
                OR  first_name = $8  
                OR  first_name = $9  
                )  
            AND created_at &gt;= $10  
            AND deleted_at IS NULL  
        ) users  
    ON  users.id = friends.friend_id  
WHERE  
    (  
        &quot;friends&quot;.&quot;deleted_at&quot; IS NULL  
    OR  &quot;friends&quot;.&quot;deleted_at&quot; = $11  
    )
</code></pre>
<p>集約してcountする場合も構造体を定義します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/b7e3ee4778f8f7d71daa685b99701a05.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672022" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-group-count" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-group-count-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-group-count-LC1" class="blob-code blob-code-inner js-file-line">type countPerUserID struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-group-count-LC2" class="blob-code blob-code-inner js-file-line">	Count  uint</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-group-count-LC3" class="blob-code blob-code-inner js-file-line">	UserID uint64</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-group-count-LC4" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-group-count-LC5" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-group-count-LC6" class="blob-code blob-code-inner js-file-line">func (countPerUserID) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-group-count-LC7" class="blob-code blob-code-inner js-file-line">	return &quot;friends&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-group-count-LC8" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-group-count-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-group-count-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-read-group-count-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-read-group-count-LC12" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-read-group-count-LC13" class="blob-code blob-code-inner js-file-line">	cpuis := []countPerUserID{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-read-group-count-LC14" class="blob-code blob-code-inner js-file-line">	err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-read-group-count-LC15" class="blob-code blob-code-inner js-file-line">		Select(&quot;count(*) as count, user_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-read-group-count-LC16" class="blob-code blob-code-inner js-file-line">		Where(&quot;deleted_at IS NULL&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-read-group-count-LC17" class="blob-code blob-code-inner js-file-line">		GroupBy(&quot;user_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-read-group-count-LC18" class="blob-code blob-code-inner js-file-line">		Find(&amp;cpuis)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-read-group-count-LC19" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-read-group-count-LC20" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-read-group-count-LC21" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-read-group-count-LC22" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-group-count-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-read-group-count-LC23" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/b7e3ee4778f8f7d71daa685b99701a05/raw/970974a5407a77132e0f0bf454b6e0316de8498f/go-xorm-read-group-count" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/b7e3ee4778f8f7d71daa685b99701a05#file-go-xorm-read-group-count">go-xorm-read-group-count</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    count(*) as count,  
    user_id  
FROM  
    &quot;friends&quot;  
WHERE  
    (deleted_at IS NULL)  
GROUP BY  
    user_id
</code></pre>
<p>欲しいカラムが1つだけの場合はプリミティブ型をそのまま使うこともできます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/cf8e493cfdaca60e408c2e23af3773e2.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672060" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-read-only-column" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-read-only-column-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-read-only-column-LC1" class="blob-code blob-code-inner js-file-line">	var friendID uint64</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-read-only-column-LC2" class="blob-code blob-code-inner js-file-line">	has, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-read-only-column-LC3" class="blob-code blob-code-inner js-file-line">		Table(&quot;friends&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-read-only-column-LC4" class="blob-code blob-code-inner js-file-line">		Where(&quot;user_id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-read-only-column-LC5" class="blob-code blob-code-inner js-file-line">		Where(&quot;deleted_at IS NULL&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-read-only-column-LC6" class="blob-code blob-code-inner js-file-line">		Desc(&quot;created_at&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-read-only-column-LC7" class="blob-code blob-code-inner js-file-line">		Cols(&quot;friend_id&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-read-only-column-LC8" class="blob-code blob-code-inner js-file-line">		Get(&amp;friendID)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-read-only-column-LC9" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-read-only-column-LC10" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-read-only-column-LC11" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-read-only-column-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-read-only-column-LC13" class="blob-code blob-code-inner js-file-line">	if !has {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-read-only-column-LC14" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-read-only-column-LC15" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-read-only-column-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-read-only-column-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/cf8e493cfdaca60e408c2e23af3773e2/raw/56b0ca4c243ea05a91789bc6148a8e273eb17218/go-xorm-read-only-column" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/cf8e493cfdaca60e408c2e23af3773e2#file-go-xorm-read-only-column">go-xorm-read-only-column</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>SELECT  
    &quot;friend_id&quot;  
FROM  
    &quot;friends&quot;  
WHERE  
    (  
        user_id = $1  
    )  
AND (deleted_at IS NULL)  
ORDER BY  
    &quot;created_at&quot; DESC  
LIMIT 1
</code></pre>
<h2 id="update">Update</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/7f8f0af1b27d5f2fda446aa7b1e6227a.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672085" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-update-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-update-LC1" class="blob-code blob-code-inner js-file-line">	u := user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-update-LC2" class="blob-code blob-code-inner js-file-line">	has, err := engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-update-LC3" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-update-LC4" class="blob-code blob-code-inner js-file-line">		Get(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-update-LC5" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-update-LC6" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-update-LC7" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-update-LC8" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-update-LC9" class="blob-code blob-code-inner js-file-line">	if !has {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-update-LC10" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-update-LC11" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-update-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-update-LC13" class="blob-code blob-code-inner js-file-line">  </td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-update-LC14" class="blob-code blob-code-inner js-file-line">	u.FirstName = &quot;太郎更新&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-update-LC15" class="blob-code blob-code-inner js-file-line">	u.LastName = &quot;テスト更新&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-update-LC16" class="blob-code blob-code-inner js-file-line">	u.FirstNameKana = &quot;タロウコウシン&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-update-LC17" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-update-LC18" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-update-LC19" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-update-LC20" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-update-LC21" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-update-LC22" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-update-LC23" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-update-LC24" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-update-LC25" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-xorm-update-LC26" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-xorm-update-LC27" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/7f8f0af1b27d5f2fda446aa7b1e6227a/raw/6f25f8e66698c078b455c134c64867c36e5fe24c/go-xorm-update" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/7f8f0af1b27d5f2fda446aa7b1e6227a#file-go-xorm-update">go-xorm-update</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name&quot; = $1,  
    &quot;last_name&quot; = $2,  
    &quot;first_name_kana&quot; = $3,  
    &quot;updated_at&quot; = $4,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $5  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $6  
    )  
AND &quot;version&quot; = $7
</code></pre>
<p><code>version</code> を自動で確認・更新してくれます。更新後のインスタンスは<code>u.Version</code> と<code>u.UpdatedAt</code> が更新されています。</p>
<p>DBの<code>version</code> が変わっていた場合は更新対象が0件<code>(affected == 0)</code>になります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/6ef11108ebefe5fd3d732f1b14d4d7a0.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672112" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-lock" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-update-lock-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-update-lock-LC1" class="blob-code blob-code-inner js-file-line">	u.Version = 9999</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-update-lock-LC2" class="blob-code blob-code-inner js-file-line">  </td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-update-lock-LC3" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-update-lock-LC4" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-update-lock-LC5" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-update-lock-LC6" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-update-lock-LC7" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-update-lock-LC8" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-update-lock-LC9" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-update-lock-LC10" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-update-lock-LC11" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Optimistic Lock&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-lock-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-update-lock-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/6ef11108ebefe5fd3d732f1b14d4d7a0/raw/51665e93ce0edff00e982fef26b2007b91704df9/go-xorm-update-lock" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/6ef11108ebefe5fd3d732f1b14d4d7a0#file-go-xorm-update-lock">go-xorm-update-lock</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>楽観的ロックを使用せず、<code>version</code> がない場合は普通に更新されます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/dedf7f98153f9bc3525dcc90d2ae9983.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672121" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-nolock" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-update-nolock-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-update-nolock-LC1" class="blob-code blob-code-inner js-file-line">type userForNoLock struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-update-nolock-LC2" class="blob-code blob-code-inner js-file-line">	ID            uint64 `xorm:&quot;autoincr&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-update-nolock-LC3" class="blob-code blob-code-inner js-file-line">	FirstName     string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-update-nolock-LC4" class="blob-code blob-code-inner js-file-line">	LastName      string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-update-nolock-LC5" class="blob-code blob-code-inner js-file-line">	FirstNameKana string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-update-nolock-LC6" class="blob-code blob-code-inner js-file-line">	LastNameKana  string</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-update-nolock-LC7" class="blob-code blob-code-inner js-file-line">	CreatedAt     time.Time `xorm:&quot;created&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-update-nolock-LC8" class="blob-code blob-code-inner js-file-line">	UpdatedAt     time.Time `xorm:&quot;updated&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-update-nolock-LC9" class="blob-code blob-code-inner js-file-line">	DeletedAt     time.Time `xorm:&quot;deleted&quot;`</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-update-nolock-LC10" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-update-nolock-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-update-nolock-LC12" class="blob-code blob-code-inner js-file-line">func (userForNoLock) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-update-nolock-LC13" class="blob-code blob-code-inner js-file-line">	return &quot;users&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-update-nolock-LC14" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-update-nolock-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-update-nolock-LC16" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-update-nolock-LC17" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-update-nolock-LC18" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-update-nolock-LC19" class="blob-code blob-code-inner js-file-line">	ufnl := userForNoLock{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-update-nolock-LC20" class="blob-code blob-code-inner js-file-line">		FirstName:     &quot;太郎更新&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-update-nolock-LC21" class="blob-code blob-code-inner js-file-line">		FirstNameKana: &quot;タロウコウシン&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-update-nolock-LC22" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-update-nolock-LC23" class="blob-code blob-code-inner js-file-line">	affected, err := engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-update-nolock-LC24" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-xorm-update-nolock-LC25" class="blob-code blob-code-inner js-file-line">		Update(&amp;ufnl)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-xorm-update-nolock-LC26" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-xorm-update-nolock-LC27" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-xorm-update-nolock-LC28" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-xorm-update-nolock-LC29" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-xorm-update-nolock-LC30" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-xorm-update-nolock-LC31" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-xorm-update-nolock-LC32" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-xorm-update-nolock-LC33" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nolock-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-xorm-update-nolock-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/dedf7f98153f9bc3525dcc90d2ae9983/raw/01a0d57d7c53120f39640bc85c677602ca0abbe8/go-xorm-update-nolock" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/dedf7f98153f9bc3525dcc90d2ae9983#file-go-xorm-update-nolock">go-xorm-update-nolock</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name&quot; = $1,  
    &quot;first_name_kana&quot; = $2,  
    &quot;updated_at&quot; = $3  
WHERE  
    (  
        id = $4  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $5  
    )
</code></pre>
<p>インスタンスのフィールドがゼロ値の場合は、更新対象のカラムに含まれません。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/c8c833ee64d036d2f2407bdc1ef1c384.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100672161" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-zero" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-update-zero-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-update-zero-LC1" class="blob-code blob-code-inner js-file-line">	u.FirstName = &quot;&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-update-zero-LC2" class="blob-code blob-code-inner js-file-line">	u.LastName = &quot;&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-update-zero-LC3" class="blob-code blob-code-inner js-file-line">	u.FirstNameKana = &quot;&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-update-zero-LC4" class="blob-code blob-code-inner js-file-line">	</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-update-zero-LC5" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-update-zero-LC6" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-update-zero-LC7" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-update-zero-LC8" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-update-zero-LC9" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-update-zero-LC10" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-update-zero-LC11" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-update-zero-LC12" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-update-zero-LC13" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-update-zero-LC14" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-zero-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-update-zero-LC15" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/c8c833ee64d036d2f2407bdc1ef1c384/raw/d6dfcc46ca2f0bc44eb253e11bd5efa0d0697ac1/go-xorm-update-zero" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/c8c833ee64d036d2f2407bdc1ef1c384#file-go-xorm-update-zero">go-xorm-update-zero</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;updated_at&quot; = $1,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $2  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $3  
    )  
AND &quot;version&quot; = $4
</code></pre>
<p><code>Cols</code> で指定すると、インスタンスのフィールドがゼロ値でも更新できます。ただし、指定したカラムと<code>updated_at</code>,<code>version</code>しか更新されなくなります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/efa6b14ed4708b323037edaea691ae3d.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-af025c24ed40.css">
<div id="gist100672107" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-cols" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  <template class="js-file-alert-template">
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
  
    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">      <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">  Show hidden characters
  
</a>
</div>
</div></template>
<template class="js-line-alert-template">
  <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
</span></template>

  <table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="" data-tagsearch-path="go-xorm-update-cols">
        <tr>
          <td id="file-go-xorm-update-cols-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"/>
          <td id="file-go-xorm-update-cols-LC1" class="blob-code blob-code-inner js-file-line">	u.FirstName = &quot;&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"/>
          <td id="file-go-xorm-update-cols-LC2" class="blob-code blob-code-inner js-file-line">	u.LastName = &quot;&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"/>
          <td id="file-go-xorm-update-cols-LC3" class="blob-code blob-code-inner js-file-line">	u.FirstNameKana = &quot;更新されない&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"/>
          <td id="file-go-xorm-update-cols-LC4" class="blob-code blob-code-inner js-file-line">	</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"/>
          <td id="file-go-xorm-update-cols-LC5" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"/>
          <td id="file-go-xorm-update-cols-LC6" class="blob-code blob-code-inner js-file-line">		Cols(&quot;first_name&quot;).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"/>
          <td id="file-go-xorm-update-cols-LC7" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"/>
          <td id="file-go-xorm-update-cols-LC8" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"/>
          <td id="file-go-xorm-update-cols-LC9" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"/>
          <td id="file-go-xorm-update-cols-LC10" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"/>
          <td id="file-go-xorm-update-cols-LC11" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"/>
          <td id="file-go-xorm-update-cols-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"/>
          <td id="file-go-xorm-update-cols-LC13" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"/>
          <td id="file-go-xorm-update-cols-LC14" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"/>
          <td id="file-go-xorm-update-cols-LC15" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-cols-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"/>
          <td id="file-go-xorm-update-cols-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
  </table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/efa6b14ed4708b323037edaea691ae3d/raw/152103a2fdbac54b117c909beb3be7e27f09f8aa/go-xorm-update-cols" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/efa6b14ed4708b323037edaea691ae3d#file-go-xorm-update-cols">
          go-xorm-update-cols
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name&quot; = $1,  
    &quot;updated_at&quot; = $2,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $3  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $4  
    )  
AND &quot;version&quot; = $5
</code></pre>
<p><code>AllCols()</code> で全カラムを更新できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/ce9aed6bb430b332fedb158d28f66aaf.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-af025c24ed40.css">
<div id="gist100672096" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-allcols" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  <template class="js-file-alert-template">
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
  
    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">      <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">  Show hidden characters
  
</a>
</div>
</div></template>
<template class="js-line-alert-template">
  <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
</span></template>

  <table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="" data-tagsearch-path="go-xorm-update-allcols">
        <tr>
          <td id="file-go-xorm-update-allcols-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"/>
          <td id="file-go-xorm-update-allcols-LC1" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"/>
          <td id="file-go-xorm-update-allcols-LC2" class="blob-code blob-code-inner js-file-line">	u.FirstName = &quot;&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"/>
          <td id="file-go-xorm-update-allcols-LC3" class="blob-code blob-code-inner js-file-line">	u.LastName = &quot;&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"/>
          <td id="file-go-xorm-update-allcols-LC4" class="blob-code blob-code-inner js-file-line">	u.FirstNameKana = &quot;&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"/>
          <td id="file-go-xorm-update-allcols-LC5" class="blob-code blob-code-inner js-file-line"> </td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"/>
          <td id="file-go-xorm-update-allcols-LC6" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"/>
          <td id="file-go-xorm-update-allcols-LC7" class="blob-code blob-code-inner js-file-line">		AllCols().</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"/>
          <td id="file-go-xorm-update-allcols-LC8" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"/>
          <td id="file-go-xorm-update-allcols-LC9" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"/>
          <td id="file-go-xorm-update-allcols-LC10" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"/>
          <td id="file-go-xorm-update-allcols-LC11" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"/>
          <td id="file-go-xorm-update-allcols-LC12" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-allcols-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"/>
          <td id="file-go-xorm-update-allcols-LC13" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
  </table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/ce9aed6bb430b332fedb158d28f66aaf/raw/b2cf336eb1d116595929022396c2932c3136a290/go-xorm-update-allcols" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/ce9aed6bb430b332fedb158d28f66aaf#file-go-xorm-update-allcols">
          go-xorm-update-allcols
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name&quot; = $1,  
    &quot;last_name&quot; = $2,  
    &quot;first_name_kana&quot; = $3,  
    &quot;last_name_kana&quot; = $4,  
    &quot;updated_at&quot; = $5,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $6  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $7  
    )  
AND &quot;version&quot; = $8
</code></pre>
<p>構造体のフィールドをポインタで定義すると (ゼロ値 = nil) となるため、空文字や0のポインタをセットすれば更新できるようになります。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/31596635831aee9ba25d700fe2cd38df.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-af025c24ed40.css">
<div id="gist100672148" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-pointer" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  <template class="js-file-alert-template">
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
  
    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">      <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">  Show hidden characters
  
</a>
</div>
</div></template>
<template class="js-line-alert-template">
  <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
</span></template>

  <table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="" data-tagsearch-path="go-xorm-update-pointer">
        <tr>
          <td id="file-go-xorm-update-pointer-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"/>
          <td id="file-go-xorm-update-pointer-LC1" class="blob-code blob-code-inner js-file-line">type userForEnableEmpty struct {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"/>
          <td id="file-go-xorm-update-pointer-LC2" class="blob-code blob-code-inner js-file-line">	ID            uint64 `xorm:&quot;autoincr&quot;`</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"/>
          <td id="file-go-xorm-update-pointer-LC3" class="blob-code blob-code-inner js-file-line">	FirstName     *string</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"/>
          <td id="file-go-xorm-update-pointer-LC4" class="blob-code blob-code-inner js-file-line">	LastName      *string</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"/>
          <td id="file-go-xorm-update-pointer-LC5" class="blob-code blob-code-inner js-file-line">	FirstNameKana *string</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"/>
          <td id="file-go-xorm-update-pointer-LC6" class="blob-code blob-code-inner js-file-line">	LastNameKana  *string</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"/>
          <td id="file-go-xorm-update-pointer-LC7" class="blob-code blob-code-inner js-file-line">	Version       uint64    `xorm:&quot;version&quot;`</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"/>
          <td id="file-go-xorm-update-pointer-LC8" class="blob-code blob-code-inner js-file-line">	CreatedAt     time.Time `xorm:&quot;created&quot;`</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"/>
          <td id="file-go-xorm-update-pointer-LC9" class="blob-code blob-code-inner js-file-line">	UpdatedAt     time.Time `xorm:&quot;updated&quot;`</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"/>
          <td id="file-go-xorm-update-pointer-LC10" class="blob-code blob-code-inner js-file-line">	DeletedAt     time.Time `xorm:&quot;deleted&quot;`</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"/>
          <td id="file-go-xorm-update-pointer-LC11" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"/>
          <td id="file-go-xorm-update-pointer-LC12" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"/>
          <td id="file-go-xorm-update-pointer-LC13" class="blob-code blob-code-inner js-file-line">func (userForEnableEmpty) TableName() string {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"/>
          <td id="file-go-xorm-update-pointer-LC14" class="blob-code blob-code-inner js-file-line">	return &quot;users&quot;</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"/>
          <td id="file-go-xorm-update-pointer-LC15" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"/>
          <td id="file-go-xorm-update-pointer-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"/>
          <td id="file-go-xorm-update-pointer-LC17" class="blob-code blob-code-inner js-file-line">{</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"/>
          <td id="file-go-xorm-update-pointer-LC18" class="blob-code blob-code-inner js-file-line">	ufee := userForEnableEmpty{}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"/>
          <td id="file-go-xorm-update-pointer-LC19" class="blob-code blob-code-inner js-file-line">	has, err = engine.</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"/>
          <td id="file-go-xorm-update-pointer-LC20" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"/>
          <td id="file-go-xorm-update-pointer-LC21" class="blob-code blob-code-inner js-file-line">		Get(&amp;ufee)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"/>
          <td id="file-go-xorm-update-pointer-LC22" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"/>
          <td id="file-go-xorm-update-pointer-LC23" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"/>
          <td id="file-go-xorm-update-pointer-LC24" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"/>
          <td id="file-go-xorm-update-pointer-LC25" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"/>
          <td id="file-go-xorm-update-pointer-LC26" class="blob-code blob-code-inner js-file-line">	if !has {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"/>
          <td id="file-go-xorm-update-pointer-LC27" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"/>
          <td id="file-go-xorm-update-pointer-LC28" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"/>
          <td id="file-go-xorm-update-pointer-LC29" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"/>
          <td id="file-go-xorm-update-pointer-LC30" class="blob-code blob-code-inner js-file-line">  </td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"/>
          <td id="file-go-xorm-update-pointer-LC31" class="blob-code blob-code-inner js-file-line">	ufee.FirstName = &amp;u.FirstName</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"/>
          <td id="file-go-xorm-update-pointer-LC32" class="blob-code blob-code-inner js-file-line">	ufee.LastName = &amp;u.LastName</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"/>
          <td id="file-go-xorm-update-pointer-LC33" class="blob-code blob-code-inner js-file-line">	ufee.FirstNameKana = &amp;u.FirstNameKana</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"/>
          <td id="file-go-xorm-update-pointer-LC34" class="blob-code blob-code-inner js-file-line">  </td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"/>
          <td id="file-go-xorm-update-pointer-LC35" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"/>
          <td id="file-go-xorm-update-pointer-LC36" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"/>
          <td id="file-go-xorm-update-pointer-LC37" class="blob-code blob-code-inner js-file-line">		Update(&amp;ufee)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"/>
          <td id="file-go-xorm-update-pointer-LC38" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"/>
          <td id="file-go-xorm-update-pointer-LC39" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"/>
          <td id="file-go-xorm-update-pointer-LC40" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"/>
          <td id="file-go-xorm-update-pointer-LC41" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"/>
          <td id="file-go-xorm-update-pointer-LC42" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"/>
          <td id="file-go-xorm-update-pointer-LC43" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"/>
          <td id="file-go-xorm-update-pointer-LC44" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"/>
          <td id="file-go-xorm-update-pointer-LC45" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-pointer-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"/>
          <td id="file-go-xorm-update-pointer-LC46" class="blob-code blob-code-inner js-file-line"> }</td>
        </tr>
  </table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/31596635831aee9ba25d700fe2cd38df/raw/68e274fc7f6bf0ca655fd373be553b3728586130/go-xorm-update-pointer" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/31596635831aee9ba25d700fe2cd38df#file-go-xorm-update-pointer">
          go-xorm-update-pointer
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name&quot; = $1,  
    &quot;last_name&quot; = $2,  
    &quot;first_name_kana&quot; = $3,  
    &quot;last_name_kana&quot; = $4,  
    &quot;updated_at&quot; = $5,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $6  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $7  
    )  
AND &quot;version&quot; = $8
</code></pre>
<p>ポインタと<code>Cols()</code> を組み合わせるとNULLで更新できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/39ad5f9391cc7ba7ccdc6367303a7de5.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-af025c24ed40.css">
<div id="gist100672131" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-null" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  <template class="js-file-alert-template">
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
  
    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">      <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">  Show hidden characters
  
</a>
</div>
</div></template>
<template class="js-line-alert-template">
  <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"/>
</svg>
</span></template>

  <table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="" data-tagsearch-path="go-xorm-update-null">
        <tr>
          <td id="file-go-xorm-update-null-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"/>
          <td id="file-go-xorm-update-null-LC1" class="blob-code blob-code-inner js-file-line">	ufee.FirstName = nil</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"/>
          <td id="file-go-xorm-update-null-LC2" class="blob-code blob-code-inner js-file-line">	ufee.LastName = nil</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"/>
          <td id="file-go-xorm-update-null-LC3" class="blob-code blob-code-inner js-file-line">	ufee.FirstNameKana = nil</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"/>
          <td id="file-go-xorm-update-null-LC4" class="blob-code blob-code-inner js-file-line">	</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"/>
          <td id="file-go-xorm-update-null-LC5" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"/>
          <td id="file-go-xorm-update-null-LC6" class="blob-code blob-code-inner js-file-line">		Cols(&quot;first_name_kana&quot;).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"/>
          <td id="file-go-xorm-update-null-LC7" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"/>
          <td id="file-go-xorm-update-null-LC8" class="blob-code blob-code-inner js-file-line">		Update(&amp;ufee)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"/>
          <td id="file-go-xorm-update-null-LC9" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"/>
          <td id="file-go-xorm-update-null-LC10" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"/>
          <td id="file-go-xorm-update-null-LC11" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"/>
          <td id="file-go-xorm-update-null-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"/>
          <td id="file-go-xorm-update-null-LC13" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"/>
          <td id="file-go-xorm-update-null-LC14" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"/>
          <td id="file-go-xorm-update-null-LC15" class="blob-code blob-code-inner js-file-line">		return</td>
        </tr>
        <tr>
          <td id="file-go-xorm-update-null-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"/>
          <td id="file-go-xorm-update-null-LC16" class="blob-code blob-code-inner js-file-line">	}</td>
        </tr>
  </table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/39ad5f9391cc7ba7ccdc6367303a7de5/raw/c31a8365e2eadf4cbc8e6684dc9680ba37e4d620/go-xorm-update-null" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/39ad5f9391cc7ba7ccdc6367303a7de5#file-go-xorm-update-null">
          go-xorm-update-null
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name_kana&quot; = $1,  
    &quot;updated_at&quot; = $2,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $3  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $4  
    )  
AND &quot;version&quot; = $5
</code></pre>
<p><code>Cols()</code>と<code>Nullable()</code>を組み合わせてもNULL更新できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/f5fccb8cf44c0ffa03a39bef9dcd729c.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937554" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-update-nullable" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-update-nullable-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-update-nullable-LC1" class="blob-code blob-code-inner js-file-line">	u.FirstNameKana = &quot;&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-update-nullable-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-update-nullable-LC3" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-update-nullable-LC4" class="blob-code blob-code-inner js-file-line">		Cols(&quot;first_name_kana&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-update-nullable-LC5" class="blob-code blob-code-inner js-file-line">		Nullable(&quot;first_name_kana&quot;).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-update-nullable-LC6" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-update-nullable-LC7" class="blob-code blob-code-inner js-file-line">		Update(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-update-nullable-LC8" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-update-nullable-LC9" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-update-nullable-LC10" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-update-nullable-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-update-nullable-LC11" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/f5fccb8cf44c0ffa03a39bef9dcd729c/raw/b67de36075f9061b25934af8f00aeb401a3324b4/go-xorm-update-nullable" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/f5fccb8cf44c0ffa03a39bef9dcd729c#file-go-xorm-update-nullable">go-xorm-update-nullable</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;first_name_kana&quot; = $1,  
    &quot;updated_at&quot; = $2,  
    &quot;version&quot; = &quot;version&quot; + 1  
WHERE  
    (  
        id = $3  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $4  
    )  
AND &quot;version&quot; = $5
</code></pre>
<h2 id="delete">Delete</h2>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/a87ab3c2cc44bf6b36968e339f16e070.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671972" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-delete" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-delete-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-delete-LC1" class="blob-code blob-code-inner js-file-line">func delete(engine *xorm.Engine) {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-delete-LC2" class="blob-code blob-code-inner js-file-line">	u := user{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-delete-LC3" class="blob-code blob-code-inner js-file-line">	affected, err := engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-delete-LC4" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-delete-LC5" class="blob-code blob-code-inner js-file-line">		Delete(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-delete-LC6" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-delete-LC7" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-delete-LC8" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-delete-LC9" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-delete-LC10" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-delete-LC11" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-delete-LC12" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-delete-LC13" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-delete-LC14" class="blob-code blob-code-inner js-file-line"> }</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/a87ab3c2cc44bf6b36968e339f16e070/raw/3fcb1f450b0e89e314365e6146642713d01ddec2/go-xorm-delete" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/a87ab3c2cc44bf6b36968e339f16e070#file-go-xorm-delete">go-xorm-delete</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>UPDATE  
    &quot;users&quot;  
SET  
    &quot;deleted_at&quot; = $1  
WHERE  
    (  
        id = $2  
    )  
AND (  
        &quot;deleted_at&quot; IS NULL  
    OR  &quot;deleted_at&quot; = $3  
    )
</code></pre>
<p>構造体に<code>`xorm:&quot;deleted&quot;`</code> があれば論理削除、なければ物理削除になります。フィールドのタグで判定しているので、<code>DeletedAt</code> というフィールドがあっても、タグがなければ物理削除です。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/388cbc9bb7481d1e3a090088cad1769f.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671979" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-delete-no-deleted" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-delete-no-deleted-LC1" class="blob-code blob-code-inner js-file-line">type friendForPhysicalDelete struct {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-delete-no-deleted-LC2" class="blob-code blob-code-inner js-file-line">	DeletedAt time.Time</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-delete-no-deleted-LC3" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-delete-no-deleted-LC4" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-delete-no-deleted-LC5" class="blob-code blob-code-inner js-file-line">func (friendForPhysicalDelete) TableName() string {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-delete-no-deleted-LC6" class="blob-code blob-code-inner js-file-line">	return &quot;friends&quot;</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-delete-no-deleted-LC7" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-delete-no-deleted-LC8" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-delete-no-deleted-LC9" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-delete-no-deleted-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-delete-no-deleted-LC11" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-delete-no-deleted-LC12" class="blob-code blob-code-inner js-file-line">	f := friendForPhysicalDelete{}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-xorm-delete-no-deleted-LC13" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-xorm-delete-no-deleted-LC14" class="blob-code blob-code-inner js-file-line">		Where(&quot;user_id = ? OR friend_id = ?&quot;, id, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-xorm-delete-no-deleted-LC15" class="blob-code blob-code-inner js-file-line">		Delete(&amp;f)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-xorm-delete-no-deleted-LC16" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-xorm-delete-no-deleted-LC17" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-xorm-delete-no-deleted-LC18" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-xorm-delete-no-deleted-LC19" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-xorm-delete-no-deleted-LC20" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-xorm-delete-no-deleted-LC21" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-xorm-delete-no-deleted-LC22" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-xorm-delete-no-deleted-LC23" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-no-deleted-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-xorm-delete-no-deleted-LC24" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/388cbc9bb7481d1e3a090088cad1769f/raw/210bbc532bae08f72578f5cffa991b12bb60d962/go-xorm-delete-no-deleted" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/388cbc9bb7481d1e3a090088cad1769f#file-go-xorm-delete-no-deleted">go-xorm-delete-no-deleted</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>DELETE  
FROM  
    &quot;friends&quot;  
WHERE  
    (  
        user_id = $1  
    OR  friend_id = $2  
    )
</code></pre>
<p><code>Unscoped()</code> でも物理削除できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3555bf6d9a0acb967c680060f803b278.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100671983" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-delete-unscoped" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-delete-unscoped-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-delete-unscoped-LC1" class="blob-code blob-code-inner js-file-line">	affected, err = engine.</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-delete-unscoped-LC2" class="blob-code blob-code-inner js-file-line">		Unscoped().</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-delete-unscoped-LC3" class="blob-code blob-code-inner js-file-line">		Where(&quot;id = ?&quot;, id).</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-delete-unscoped-LC4" class="blob-code blob-code-inner js-file-line">		Delete(&amp;u)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-delete-unscoped-LC5" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-delete-unscoped-LC6" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-delete-unscoped-LC7" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-delete-unscoped-LC8" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-delete-unscoped-LC9" class="blob-code blob-code-inner js-file-line">	if affected == 0 {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-delete-unscoped-LC10" class="blob-code blob-code-inner js-file-line">		log.Println(&quot;Not Found&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-xorm-delete-unscoped-LC11" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-delete-unscoped-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-xorm-delete-unscoped-LC12" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3555bf6d9a0acb967c680060f803b278/raw/a8818d7b71848ec375408c5febf5dc2452427002/go-xorm-delete-unscoped" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3555bf6d9a0acb967c680060f803b278#file-go-xorm-delete-unscoped">go-xorm-delete-unscoped</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>DELETE  
FROM  
    &quot;users&quot;  
WHERE  
    (  
        id = $1  
    )  
AND &quot;deleted_at&quot; = $2
</code></pre>
<h2 id="%E3%81%9D%E3%81%AE%E4%BB%96">その他</h2>
<p><code>Exec()</code>でCRUD以外も実行できます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/3ef75a0ee22a4a1c1c268f9b72a9689f.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist100937662" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-xorm-other" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-xorm-other-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-xorm-other-LC1" class="blob-code blob-code-inner js-file-line">	_, err := engine.Exec(&quot;CREATE ROLE role_name LOGIN PASSWORD &#39;password&#39;&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-xorm-other-LC2" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-xorm-other-LC3" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-xorm-other-LC4" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-xorm-other-LC5" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-xorm-other-LC6" class="blob-code blob-code-inner js-file-line">	_, err = engine.Exec(&quot;DROP ROLE role_name&quot;)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-xorm-other-LC7" class="blob-code blob-code-inner js-file-line">	if err != nil {</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-xorm-other-LC8" class="blob-code blob-code-inner js-file-line">		log.Println(err)</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-xorm-other-LC9" class="blob-code blob-code-inner js-file-line">		return</td>
      </tr>
      <tr>
        <td id="file-go-xorm-other-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-xorm-other-LC10" class="blob-code blob-code-inner js-file-line">	}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/3ef75a0ee22a4a1c1c268f9b72a9689f/raw/0508309a5191daf086a255c69ba4a1df7c8a8d20/go-xorm-other" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/3ef75a0ee22a4a1c1c268f9b72a9689f#file-go-xorm-other">go-xorm-other</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>CREATE ROLE role_name LOGIN PASSWORD 'password'

DROP ROLE role_name
</code></pre>
<p>以上です。他にいい感じの機能ががあれば追記するかもです。</p>
<h2 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h2>
<ul>
<li><a href="http://gobook.io/read/gitea.com/xorm/manual-en-US/">http://gobook.io/read/gitea.com/xorm/manual-en-US/</a></li>
<li><a href="https://github.com/go-xorm/xorm">https://github.com/go-xorm/xorm</a></li>
<li><a href="https://github.com/go-xorm/builder">https://github.com/go-xorm/builder</a></li>
<li><a href="https://sgswtky.github.io/post/golang-orm-xorm/">https://sgswtky.github.io/post/golang-orm-xorm/</a></li>
</ul>
<!--kg-card-end: markdown--></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[GCPを使い、GoogleHomeを受付としてSlackに通知する]]></title><description><![CDATA[受付がチャイムである
Anti-Pattern Inc.の受付は11月に引っ越したばかりということもあり、ベルの音で来客の有無を把握していた。

→GoogleHomeを受付にしてSlackに飛ばし、また、SlackからGoogleHomeを喋らし、双方向の会話を可能にしよう！

今回はGoogleHomeからSlack通知までをCloud Functionsなどを使い実装する。

※Slack→GoogleHomeは別の機会に執筆する

使うもの
 * Dialogflow
 * Actions on Googl [https://developers.google.com/assistant]e (The developer
   platform for the Google Assistant.)
 * Cloud Shell (開発用）
 * Cloud Function
 * Cloud Build
 * Cloud Source Repositories

こんな流れで処理をする。

まず、Actions on GoogleでDevelopから Add Action bu]]></description><link>https://tech.anti-pattern.co.jp/gcpwoshi-i-googlehomewoshou-fu-tositeslacknitong-zhi-suru/</link><guid isPermaLink="false">Ghost__Post__60faa8753986b000013a3ac2</guid><category><![CDATA[GCP]]></category><category><![CDATA[GoogleHome]]></category><category><![CDATA[Cloud Build]]></category><category><![CDATA[Cloud Shell]]></category><category><![CDATA[Cloud Function]]></category><category><![CDATA[Dialogflow]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Sun, 22 Dec 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_dh5PW5Zvnrob9I7xaAxmDg.png" medium="image"/><content:encoded><![CDATA[<h3 id="%E5%8F%97%E4%BB%98%E3%81%8C%E3%83%81%E3%83%A3%E3%82%A4%E3%83%A0%E3%81%A7%E3%81%82%E3%82%8B">受付がチャイムである</h3><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_dh5PW5Zvnrob9I7xaAxmDg.png" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する"/><p>Anti-Pattern Inc.の受付は11月に引っ越したばかりということもあり、ベルの音で来客の有無を把握していた。</p><p>→GoogleHomeを受付にしてSlackに飛ばし、また、SlackからGoogleHomeを喋らし、双方向の会話を可能にしよう！</p><p>今回はGoogleHomeからSlack通知までをCloud Functionsなどを使い実装する。</p><p>※Slack→GoogleHomeは別の機会に執筆する</p><h3 id="%E4%BD%BF%E3%81%86%E3%82%82%E3%81%AE">使うもの</h3><ul><li>Dialogflow</li><li><a href="https://developers.google.com/assistant" rel="noopener">Actions on Googl</a>e (The developer platform for the Google Assistant.)</li><li>Cloud Shell (開発用）</li><li>Cloud Function</li><li>Cloud Build</li><li>Cloud Source Repositories</li></ul><p>こんな流れで処理をする。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*dh5PW5Zvnrob9I7xaAxmDg.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>まず、Actions on GoogleでDevelopから <code>Add Action</code> buttonを押して、Customを選択し、それぞれ入力していく。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*mgHPgB6A6yoaHwArXCV89g.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>そうすると、DialogFlowに飛ばされるので、色々作っていく。</p><h3 id="dialogflow">DialogFlow</h3><p>最初にIntentに移動し、defaultで入っているWelcomeを編集していく。</p><p>受付という単語に反応して、固定のレスポンスを返すようにし、</p><p>Fulfillmentの <em>Enable webhook call for this intent </em>を有効化しておく</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/600/1*r2CqefK1mC06NAqwYvQy3Q.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*Ig13I4ypy7PbL9dITIrEyQ.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>次にアプリ終了の言葉を決める。これは新たにIntentを追加し、設定していく。それとともに、この指定の言葉を言ったら、終了する設定もする。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/600/1*GasPe5yg3D8FLptARGOlDw.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/600/1*fSeBn8ApQOr0-B1ouZLScQ.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/400/1*I7ifALPKqDWAUhg4iTqs6Q.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>最後にどんな言葉を話したとしても、それがすべてSlackに届くように変数化しておく。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/400/1*LTr3Tv6mP4g5jiiJix-OqA.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/600/1*WlUc87NzJr8E2UKdnynW4w.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/400/1*ceuTZo69PCO164VaTkujxg.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><h3 id="cloud-functions">Cloud Functions</h3><p>まずはCloud Functionsを新規で作成し、一般公開し、メモリも最低の128MBで作っておく。</p><p>DialogFlowからCloud Functionにリクエストを投げ、そこからSlackへ通知する。</p><p>とりあえず、Cloud Functionsを作るとURLが発行されるのでそれをDialogFlowのFulfillmentのURL欄に登録する。</p><p>この時点で、Google Homeで動かせばCloud Functionが動きログを吐いてくれる。</p><p>さて、実際にSlackに飛ばすためのコードをCloud Shellで書いていく。</p><p>基本ブラウザで開発していく。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*1WrVo8sk8UNpaPtcudzQ-g.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>本来はベーシック認証などを入れるべきだが一旦それは後で実装。</p><p>※エラー処理等も後で実装</p><p>※URLはSlack APPを作って、そこのoutgoingで発行されるURLを使用する。</p><p>index.js</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">var request = require('request');
exports.sendToSlack = (req, res) =&gt; {
  const msg = req.body.queryResult.queryTextrequest.post({
  url:'XXXXXXXXX',
  headers: { 'Content-Type': 'application/json' },
  json: {
    username:
    'GoogleHome',
    icon_emoji:
    ':ghost:',
    text: msg
  }
}, 
function(error, response, body) {
  if (!error &amp;&amp; response.statusCode === 200) {
  console.log(body);
} else {
  console.log('error');
}})

res.status(200).send(message);};
</code></pre>
<!--kg-card-end: markdown--><p>package.json</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">{
  &quot;name&quot;: &quot;notify-to-slack&quot;,
  &quot;version&quot;: &quot;0.0.18&quot;,
  &quot;dependencies&quot;: {
    &quot;request&quot;: &quot;^2.81.0&quot;
   }
}
</code></pre>
<!--kg-card-end: markdown--><p>Cloud Build 用にこれも書いておく。</p><p>cloudbuild.yaml</p><!--kg-card-begin: markdown--><pre><code class="language-yaml">steps:
  - name: 'gcr.io/cloud-builders/gcloud'
args:
  - functions
  - deploy
  - XXCLOUD FUNCTION NAMEXX
</code></pre>
<!--kg-card-end: markdown--><h3 id="cloud-source-repositories">Cloud Source Repositories</h3><p>今回はGitHubではなくCloud Source Repositoriesでソースを管理していく。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*sg2t7B_4CzU4vJ0rTfmPGA.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>これにより、master branchの変更を検知してCloud Buildを実行するようにする。</p><h3 id="cloud-build">Cloud Build</h3><p>こんな感じに設定すると、master branchの変更を検知してcloudbuild.yamlの情報をもとに動いてくれる。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*Q0UUO26aCGTftPuGYJ7W_Q.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><h4 id="%E3%81%9D%E3%81%97%E3%81%A6%E3%81%84%E3%81%96%E3%80%81master-branch%E3%81%B8push">そしていざ、master branchへpush!!</h4><p>そうするとCloud Build が動き、Cloud FunctionsにDeployされる。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*zfwgGMyG45Z5Ua-_ClqVZQ.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>その後、Google Homeに喋ると、その内容がSlackに通知される。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*xMEwhoNxTVL6c0ExjT3rDw.png" class="kg-image" alt="GCPを使い、GoogleHomeを受付としてSlackに通知する" loading="lazy"/></figure><p>成功！</p>]]></content:encoded></item><item><title><![CDATA[GitHub ActionsでS3にデプロイする！]]></title><description><![CDATA[Photo by Hal Gatewood
[https://unsplash.com/@halacious?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit] 
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
2019年11月にGitHub Actionsが正式リリースされました！
GitHubでベータ版として公開されていたGitHub Actionsという機能が、GitHub主催のイベントGitHub Universe
2019で正式版としてリリースされました。
GitHub Actionsとは、GitHub上でワークフローを動かせるというものです。
ymlファイルでワークフローを定義し、pushやissue作成などをトリガーとして起動することができます。
リポジトリページのここにあるやつです↓

コワーキングスペースHarborS表参道オープンしました！
時を同じくし]]></description><link>https://tech.anti-pattern.co.jp/github_actions/</link><guid isPermaLink="false">Ghost__Post__610518523986b000013a499a</guid><category><![CDATA[GitHub Actions]]></category><category><![CDATA[S3]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Cloudfront]]></category><category><![CDATA[Github Pages]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Wed, 18 Dec 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-21.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHx3ZWJzaXRlfGVufDB8fHx8MTY1MjY5NDg2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="5184" height="3456" srcset="https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHx3ZWJzaXRlfGVufDB8fHx8MTY1MjY5NDg2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=600 600w, https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHx3ZWJzaXRlfGVufDB8fHx8MTY1MjY5NDg2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1000 1000w, https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHx3ZWJzaXRlfGVufDB8fHx8MTY1MjY5NDg2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1600 1600w, https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDE0fHx3ZWJzaXRlfGVufDB8fHx8MTY1MjY5NDg2OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2400 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Photo by <a href="https://unsplash.com/@halacious?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Hal Gatewood</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></img></figure><h2 id="2019%E5%B9%B411%E6%9C%88%E3%81%ABgithub-actions%E3%81%8C%E6%AD%A3%E5%BC%8F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81">2019年11月にGitHub Actionsが正式リリースされました！</h2><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-21.png" alt="GitHub ActionsでS3にデプロイする！"/><p>GitHubでベータ版として公開されていたGitHub Actionsという機能が、GitHub主催のイベントGitHub Universe 2019で正式版としてリリースされました。<br>GitHub Actionsとは、GitHub上でワークフローを動かせるというものです。<br>ymlファイルでワークフローを定義し、pushやissue作成などをトリガーとして起動することができます。<br>リポジトリページのここにあるやつです↓</br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_4c-blUayuxZgxJPSR10N9A.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="162" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_4c-blUayuxZgxJPSR10N9A.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_4c-blUayuxZgxJPSR10N9A.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_4c-blUayuxZgxJPSR10N9A.png 1400w" sizes="(min-width: 720px) 720px"/></figure><h1 id="%E3%82%B3%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9harbors%E8%A1%A8%E5%8F%82%E9%81%93%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81">コワーキングスペースHarborS表参道オープンしました！</h1><p>時を同じくしてアンチパターン社のオフィス兼コワーキングスペースが表参道にオープンしました！<br><a href="https://harbors.anti-pattern.co.jp/" rel="noopener nofollow">https://harbors.anti-pattern.co.jp/</a></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_sf7FE87XxTO4tKVZF4aq7w.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="940" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_sf7FE87XxTO4tKVZF4aq7w.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_sf7FE87XxTO4tKVZF4aq7w.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_sf7FE87XxTO4tKVZF4aq7w.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>とにかくキレイでおしゃれ！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_8afXv71xbPo0ZXuN_kFi4w.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="934" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_8afXv71xbPo0ZXuN_kFi4w.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_8afXv71xbPo0ZXuN_kFi4w.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_8afXv71xbPo0ZXuN_kFi4w.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>働きやすくて</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_LAA4P_g7onAIUEl-pX6vdg.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="932" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_LAA4P_g7onAIUEl-pX6vdg.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_LAA4P_g7onAIUEl-pX6vdg.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_LAA4P_g7onAIUEl-pX6vdg.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>カフェもあって</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_h_LNtmyJ7yiMU6_xRdl1cw.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="858" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_h_LNtmyJ7yiMU6_xRdl1cw.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_h_LNtmyJ7yiMU6_xRdl1cw.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_h_LNtmyJ7yiMU6_xRdl1cw.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>テラス席もある！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_HlhYqGMUpY8bbPrPic6WXA.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="567" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_HlhYqGMUpY8bbPrPic6WXA.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_HlhYqGMUpY8bbPrPic6WXA.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_HlhYqGMUpY8bbPrPic6WXA.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>テラスからの夜景は最高なんです！！（個人の感想です）</p><p>エンジニアにとって働きやすい環境を提供するために、コワーキングスペースとしても運営しており、<a href="https://harbors.anti-pattern.co.jp/" rel="noopener nofollow">会員募集のサイト</a>を作ったのですが、毎回のデプロイが大変なので、GitHub Actionsで自動化をしました！</p><h2 id="github-actions%E3%81%A7s3%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B">GitHub ActionsでS3にデプロイする</h2><p>会員募集サイトの構成は、CloudFrontでS3をオリジンに設定した構成ですので、S3の更新と、CloudFrontのキャッシュクリアの作業が必要です。</p><p>まず、AWSでデプロイ専用のS3とCloudFrontの権限を付与したIAM ユーザーを作成します。<br>アクセスキーとシークレットキーを控えておきます。</br></p><p><a href="https://github.com/marketplace" rel="noopener nofollow">GitHub MarketPlaceページ</a>に、ワークフローのテンプレートが多数用意されているのでそれを利用します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_XHlJFeaP2UWcQ-OAYXiVxw.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="982" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_XHlJFeaP2UWcQ-OAYXiVxw.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_XHlJFeaP2UWcQ-OAYXiVxw.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_XHlJFeaP2UWcQ-OAYXiVxw.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>AWS S3 Syncというのがちょうど良さそうです。<br>ワークフローを追加したいリポジトリーのActionページを開きます。<br>Set up workflow yourself をクリック</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_BQ9a92TTYm87q33lxJHk4Q.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="589" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_BQ9a92TTYm87q33lxJHk4Q.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_BQ9a92TTYm87q33lxJHk4Q.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_BQ9a92TTYm87q33lxJHk4Q.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>リポジトリ/.github/workflows 配下にymlファイルが作られるので、そこにワークフローを設定します。ファイル名は拡張子が.ymlであればお好きな名前でOKです。</p><!--kg-card-begin: markdown--><pre><code>name: AWS S3 Sync

on: 
  push:
    branches:
      - master_for_aws

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
        with:
          fetch-depth: 1

      - name: Publish to AWS S3
        uses: opspresso/action-s3-sync@master
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: &quot;ap-northeast-1&quot;
          FROM_PATH: &quot;./docs&quot;
          DEST_PATH: &quot;s3://{s３のバケット名・パスを入れる}&quot;
          OPTIONS: &quot;--acl public-read&quot;
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_-w4ZGAIwINUHYiZeXSa_Qw.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="198" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/1_-w4ZGAIwINUHYiZeXSa_Qw.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/1_-w4ZGAIwINUHYiZeXSa_Qw.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/1_-w4ZGAIwINUHYiZeXSa_Qw.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>3行目〜<br>master_for_awsブランチにpush（merge、commit）されたときにワークフローを動かす という設定。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="104" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>20行目・21行目は、AWSで作成したIAMユーザのシークレットキー、アクセスキーをGitHubのSecretsから登録します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-1.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="870" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-1.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-1.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-1.png 1400w" sizes="(min-width: 720px) 720px"/></figure><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-2.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="115" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-2.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-2.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-2.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>22行目はS3に利用しているリージョンを入力<br>23行目はGitHubのどこのディレクトリ配下をS3に配布するかを入力します。<br>「docs」というディレクトリ配下にしておくと、GitHub Pagesを利用するときにちょっと便利になります。</br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-3.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="882" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-3.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-3.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-3.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>masterからブランチを切って追記修正、masterにマージ、GitHub Pagesで修正内容を確認、master_for_awsにマージしてワークフローが発火、デプロイされるという流れで運用しています。</p><p>master_for_awsブランチにマージすると、Actionsタブでワークフローが動き出しているのを確認できます。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-4.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="493" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-4.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-4.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-4.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>どこかで失敗しても、ログで確認できます。<br>今回使ったワークフローは、S3バケットからたどってCloudFrontのキャッシュクリアをしてくれているので、CloudFrontを設定していないとエラーが発生します。</br></p><h1 id="%E5%A4%A2%E5%BA%83%E3%81%8C%E3%82%8Bgithub-actions">夢広がるGitHub Actions</h1><p>ワークフローのトリガーはとにかく沢山あるみたいでして、色々と活用できそうです。</p><p>■<a href="https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows" rel="noopener nofollow">ワークフローのトリガー</a><br>■<a href="https://qiita.com/osakiy/items/dd77a31bf25d27dd0679" rel="noopener nofollow">GitHub Actions を用いて issue が更新されたら LINE に通知する方法</a><br>■<a href="https://dev.classmethod.jp/tool/github/github-actions-pull-request-labeler/" rel="noopener nofollow">GitHub ActionsでPull Requestに自動的にラベルを付与してレビューをしやすくする</a></br></br></p><h1 id="%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</h1><p>とにかく、エンジニア向けコワーキングスペースHarborS表参道は最高ですので、（個人の感想です）皆さんぜひ見学に来てみてください！<br><a href="https://harbors.anti-pattern.co.jp/" rel="noopener nofollow">HarborS表参道</a></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-5.png" class="kg-image" alt="GitHub ActionsでS3にデプロイする！" loading="lazy" width="1400" height="936" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-5.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-5.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-5.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>おしまい</p>]]></content:encoded></item><item><title><![CDATA[CirqでBB84を実装してみた]]></title><description><![CDATA[量子プログラミングのライブラリCirqを使って、量子鍵配送プロトコルBB84を実装してみました。

Cirq
Googleが公開している量子プログラミングのライブラリです。（https://cirq.readthedocs.io/en/stable/）

以前Cirqでフーリエ変換を実装したことがあるので、興味のある方はそちらもどうぞ。（
http://tech.innovation.co.jp/2019/03/16/Cirq.html）

BB84
量子鍵配送のプロトコルです。（https://ja.wikipedia.org/wiki/BB84）

BB84をざっくり説明するとこんな感じです（間違ってたら教えてください）

 * 送信者はランダムにビット列を生成する
 * それぞれのビットをqubitにエンコードして受信者に送信する。その際、X基底・H基底のどちらをランダムに選択してエンコードする
 * 受信者はそれぞれのqubitをデコードして値を読み取る。その際、X基底・H基底のどちらをランダムに選択してデコードする
 * 送信者と受信者は何番目のビットをどちらの基底でエンコー]]></description><link>https://tech.anti-pattern.co.jp/cirq-bb84/</link><guid isPermaLink="false">Ghost__Post__6102a68e3986b000013a428b</guid><category><![CDATA[Cirq]]></category><category><![CDATA[BB84]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Wed, 04 Dec 2019 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>量子プログラミングのライブラリCirqを使って、量子鍵配送プロトコルBB84を実装してみました。</p>
<h2 id="cirq">Cirq</h2>
<p>Googleが公開している量子プログラミングのライブラリです。（<a href="https://cirq.readthedocs.io/en/stable/">https://cirq.readthedocs.io/en/stable/</a>）</p>
<p>以前Cirqでフーリエ変換を実装したことがあるので、興味のある方はそちらもどうぞ。（<a href="http://tech.innovation.co.jp/2019/03/16/Cirq.html">http://tech.innovation.co.jp/2019/03/16/Cirq.html</a>）</p>
<h2 id="bb84">BB84</h2>
<p>量子鍵配送のプロトコルです。（<a href="https://ja.wikipedia.org/wiki/BB84">https://ja.wikipedia.org/wiki/BB84</a>）</p>
<p>BB84をざっくり説明するとこんな感じです（間違ってたら教えてください）</p>
<ul>
<li>送信者はランダムにビット列を生成する</li>
<li>それぞれのビットをqubitにエンコードして受信者に送信する。その際、X基底・H基底のどちらをランダムに選択してエンコードする</li>
<li>受信者はそれぞれのqubitをデコードして値を読み取る。その際、X基底・H基底のどちらをランダムに選択してデコードする</li>
<li>送信者と受信者は何番目のビットをどちらの基底でエンコード・デコードしたか教え合う（この通信は量子以外の、通常の通信でよい）</li>
<li>送信者は基底が一致したビットを最初に生成したビット列から抽出し、秘密鍵とする</li>
<li>受信者は基底が一致したビットを読み取ったビット列から抽出し、秘密鍵とする</li>
</ul>
<p>このプロトコルは、量子の通信経路・古典の通信経路のどちらを盗聴されても安全に鍵を配送できるように設計されています。</p>
<h2 id="%E5%AE%9F%E8%A3%85">実装</h2>
<p>これをCirqで普通に実装すると</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_OCGARsgVUDXRSnwMMBnyiw.png" alt="1_OCGARsgVUDXRSnwMMBnyiw" loading="lazy"/></p>
<p>こんな感じの回路がずらっと並ぶだけで、いまいち面白みに欠けます。そこで、量子テレポーテーションで送るように実装してみました。</p>
<p>量子テレポーテーション : <a href="https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%86%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%86%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3</a></p>
<h2 id="%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE">できたもの</h2>
<p>main.py で全体の処理を実行します。alice.py が送信者で bob.py が受信者になります。network.py が量子テレポーテーションで送信する部分です。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/c6be0bee4f90ca0a2d9ea9c93220b124.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist99628817" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cirq-bb84-main" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cirq-bb84-main-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cirq-bb84-main-LC1" class="blob-code blob-code-inner js-file-line">import cirq</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cirq-bb84-main-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cirq-bb84-main-LC3" class="blob-code blob-code-inner js-file-line">from alice import Alice</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cirq-bb84-main-LC4" class="blob-code blob-code-inner js-file-line">from bob import Bob</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cirq-bb84-main-LC5" class="blob-code blob-code-inner js-file-line">from network import Network</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cirq-bb84-main-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cirq-bb84-main-LC7" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cirq-bb84-main-LC8" class="blob-code blob-code-inner js-file-line">def main():</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cirq-bb84-main-LC9" class="blob-code blob-code-inner js-file-line">    # 使用するbit数を決める</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cirq-bb84-main-LC10" class="blob-code blob-code-inner js-file-line">    bit_count = int(input(&#39;Bit count : &#39;))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cirq-bb84-main-LC11" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cirq-bb84-main-LC12" class="blob-code blob-code-inner js-file-line">    alice = Alice(bit_count)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cirq-bb84-main-LC13" class="blob-code blob-code-inner js-file-line">    bob = Bob()</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cirq-bb84-main-LC14" class="blob-code blob-code-inner js-file-line">    network = Network()</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cirq-bb84-main-LC15" class="blob-code blob-code-inner js-file-line">    for index in range(bit_count):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cirq-bb84-main-LC16" class="blob-code blob-code-inner js-file-line">        # ビットの初期値を決め、ランダムな基底でエンコードする</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cirq-bb84-main-LC17" class="blob-code blob-code-inner js-file-line">        circuit, qubits = network.send(alice.encode_function(index))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cirq-bb84-main-LC18" class="blob-code blob-code-inner js-file-line">        # アリスの手元のビットを観測する</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cirq-bb84-main-LC19" class="blob-code blob-code-inner js-file-line">        alice.measure_qubits(circuit, qubits[0:2])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cirq-bb84-main-LC20" class="blob-code blob-code-inner js-file-line">        # ボブに送ったビットに反映させる</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cirq-bb84-main-LC21" class="blob-code blob-code-inner js-file-line">        network.reflect_measure_results(circuit, qubits)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cirq-bb84-main-LC22" class="blob-code blob-code-inner js-file-line">        # ランダムな基底でデコードする</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cirq-bb84-main-LC23" class="blob-code blob-code-inner js-file-line">        bob.measure_qubits(circuit, qubits[2])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cirq-bb84-main-LC24" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cirq-bb84-main-LC25" class="blob-code blob-code-inner js-file-line">    # アリスとボブは互いに何番目のビットをどちらの基底でエンコード・デコードしたか教え合う</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cirq-bb84-main-LC26" class="blob-code blob-code-inner js-file-line">    # 基底が一致したビットを抽出し、秘密鍵とする</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cirq-bb84-main-LC27" class="blob-code blob-code-inner js-file-line">    alice.set_secret_key(bob.decode_gates)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cirq-bb84-main-LC28" class="blob-code blob-code-inner js-file-line">    bob.set_secret_key(alice.encode_gates)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cirq-bb84-main-LC29" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cirq-bb84-main-LC30" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cirq-bb84-main-LC31" class="blob-code blob-code-inner js-file-line">if __name__ == &#39;__main__&#39;:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-main-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cirq-bb84-main-LC32" class="blob-code blob-code-inner js-file-line">    main()</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/c6be0bee4f90ca0a2d9ea9c93220b124/raw/636bf262745e40c40cbf3fe6d24ad3a0658dfcdc/cirq-bb84-main" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/c6be0bee4f90ca0a2d9ea9c93220b124#file-cirq-bb84-main">cirq-bb84-main</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/ee6c475adf7c436b660402275b22b0e3.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist99632160" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cirq-bb84-alice" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cirq-bb84-alice-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cirq-bb84-alice-LC1" class="blob-code blob-code-inner js-file-line">import cirq</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cirq-bb84-alice-LC2" class="blob-code blob-code-inner js-file-line">import random</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cirq-bb84-alice-LC3" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cirq-bb84-alice-LC4" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cirq-bb84-alice-LC5" class="blob-code blob-code-inner js-file-line">class Alice:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cirq-bb84-alice-LC6" class="blob-code blob-code-inner js-file-line">    def __init__(self, bit_count):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cirq-bb84-alice-LC7" class="blob-code blob-code-inner js-file-line">        self._initial_bits = [random.choice([0, 1]) for _ in range(bit_count)]</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cirq-bb84-alice-LC8" class="blob-code blob-code-inner js-file-line">        self.encode_gates = [random.choice([0, 1]) for _ in range(bit_count)]</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cirq-bb84-alice-LC9" class="blob-code blob-code-inner js-file-line">        self._secret_key = &#39;&#39;</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cirq-bb84-alice-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cirq-bb84-alice-LC11" class="blob-code blob-code-inner js-file-line">    def encode_function(self, index):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cirq-bb84-alice-LC12" class="blob-code blob-code-inner js-file-line">        def encode_function(qubit):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cirq-bb84-alice-LC13" class="blob-code blob-code-inner js-file-line">            initial_bit = self._initial_bits[index]</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cirq-bb84-alice-LC14" class="blob-code blob-code-inner js-file-line">            if initial_bit == 1:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cirq-bb84-alice-LC15" class="blob-code blob-code-inner js-file-line">                yield cirq.X(qubit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cirq-bb84-alice-LC16" class="blob-code blob-code-inner js-file-line">            gate = self.encode_gates[index]</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cirq-bb84-alice-LC17" class="blob-code blob-code-inner js-file-line">            # 0:X基底、1:H基底</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cirq-bb84-alice-LC18" class="blob-code blob-code-inner js-file-line">            if gate == 0:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cirq-bb84-alice-LC19" class="blob-code blob-code-inner js-file-line">                yield cirq.X(qubit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cirq-bb84-alice-LC20" class="blob-code blob-code-inner js-file-line">            else:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cirq-bb84-alice-LC21" class="blob-code blob-code-inner js-file-line">                yield cirq.H(qubit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cirq-bb84-alice-LC22" class="blob-code blob-code-inner js-file-line">        return encode_function</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cirq-bb84-alice-LC23" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cirq-bb84-alice-LC24" class="blob-code blob-code-inner js-file-line">    def measure_qubits(self, circuit, qubits):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cirq-bb84-alice-LC25" class="blob-code blob-code-inner js-file-line">        # qubitを測定する</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cirq-bb84-alice-LC26" class="blob-code blob-code-inner js-file-line">        circuit.append(cirq.measure(*[qubits[0], qubits[1]], key=&#39;alice&#39;))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cirq-bb84-alice-LC27" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cirq-bb84-alice-LC28" class="blob-code blob-code-inner js-file-line">    def set_secret_key(self, decode_gates):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cirq-bb84-alice-LC29" class="blob-code blob-code-inner js-file-line">        self._secret_key = &#39;&#39;</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cirq-bb84-alice-LC30" class="blob-code blob-code-inner js-file-line">        for index, gate in enumerate(self.encode_gates):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cirq-bb84-alice-LC31" class="blob-code blob-code-inner js-file-line">            # エンコードしたゲートとデコードしたゲートが同じであれば、</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cirq-bb84-alice-LC32" class="blob-code blob-code-inner js-file-line">            # 対応するinitial_bitを秘密鍵のbitに追加</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cirq-bb84-alice-LC33" class="blob-code blob-code-inner js-file-line">            if gate == decode_gates[index]:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-cirq-bb84-alice-LC34" class="blob-code blob-code-inner js-file-line">                self._secret_key += str(self._initial_bits[index])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-alice-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-cirq-bb84-alice-LC35" class="blob-code blob-code-inner js-file-line">        print(&#39;alice_secret_key : &#39; + self._secret_key)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/ee6c475adf7c436b660402275b22b0e3/raw/6c721e2b238fdc6fff3d7b4d375c26ea995e0607/cirq-bb84-alice" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/ee6c475adf7c436b660402275b22b0e3#file-cirq-bb84-alice">cirq-bb84-alice</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/6c625166d976128093dd392c76e724f5.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist99632205" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cirq-bb84-bob" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cirq-bb84-bob-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cirq-bb84-bob-LC1" class="blob-code blob-code-inner js-file-line">import cirq</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cirq-bb84-bob-LC2" class="blob-code blob-code-inner js-file-line">import random</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cirq-bb84-bob-LC3" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cirq-bb84-bob-LC4" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cirq-bb84-bob-LC5" class="blob-code blob-code-inner js-file-line">class Bob:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cirq-bb84-bob-LC6" class="blob-code blob-code-inner js-file-line">    def __init__(self):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cirq-bb84-bob-LC7" class="blob-code blob-code-inner js-file-line">        self._result_bits = []</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cirq-bb84-bob-LC8" class="blob-code blob-code-inner js-file-line">        self.decode_gates = []</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cirq-bb84-bob-LC9" class="blob-code blob-code-inner js-file-line">        self._secret_key = &#39;&#39;</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cirq-bb84-bob-LC10" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cirq-bb84-bob-LC11" class="blob-code blob-code-inner js-file-line">    def measure_qubits(self, circuit, qubit):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cirq-bb84-bob-LC12" class="blob-code blob-code-inner js-file-line">        # 0:X基底、1:H基底</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cirq-bb84-bob-LC13" class="blob-code blob-code-inner js-file-line">        bit = random.choice([0, 1])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cirq-bb84-bob-LC14" class="blob-code blob-code-inner js-file-line">        self.decode_gates.append(bit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cirq-bb84-bob-LC15" class="blob-code blob-code-inner js-file-line">        if bit == 0:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cirq-bb84-bob-LC16" class="blob-code blob-code-inner js-file-line">            circuit.append(cirq.X(qubit))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cirq-bb84-bob-LC17" class="blob-code blob-code-inner js-file-line">        else:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cirq-bb84-bob-LC18" class="blob-code blob-code-inner js-file-line">            circuit.append(cirq.H(qubit))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cirq-bb84-bob-LC19" class="blob-code blob-code-inner js-file-line">        # qubitを測定する</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cirq-bb84-bob-LC20" class="blob-code blob-code-inner js-file-line">        circuit.append(cirq.measure(*[qubit], key=&#39;bob&#39;))</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cirq-bb84-bob-LC21" class="blob-code blob-code-inner js-file-line">        result = cirq.Simulator().run(circuit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cirq-bb84-bob-LC22" class="blob-code blob-code-inner js-file-line">        self._result_bits.append(result.measurements[&#39;bob&#39;][0][0])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cirq-bb84-bob-LC23" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cirq-bb84-bob-LC24" class="blob-code blob-code-inner js-file-line">        print(circuit)</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-cirq-bb84-bob-LC25" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-cirq-bb84-bob-LC26" class="blob-code blob-code-inner js-file-line">    def set_secret_key(self, encode_gates):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-cirq-bb84-bob-LC27" class="blob-code blob-code-inner js-file-line">        self._secret_key = &#39;&#39;</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-cirq-bb84-bob-LC28" class="blob-code blob-code-inner js-file-line">        for index, gate in enumerate(self.decode_gates):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-cirq-bb84-bob-LC29" class="blob-code blob-code-inner js-file-line">            # エンコードしたゲートとデコードしたゲートが同じであれば、</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-cirq-bb84-bob-LC30" class="blob-code blob-code-inner js-file-line">            # 対応するresult_bitを秘密鍵のbitに追加</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-cirq-bb84-bob-LC31" class="blob-code blob-code-inner js-file-line">            if gate == encode_gates[index]:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-cirq-bb84-bob-LC32" class="blob-code blob-code-inner js-file-line">                self._secret_key += str(self._result_bits[index])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-bob-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-cirq-bb84-bob-LC33" class="blob-code blob-code-inner js-file-line">        print(&#39;bob_secret_key   : &#39; + self._secret_key)</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/6c625166d976128093dd392c76e724f5/raw/d1332f63938dbbdd0974414f07375ff2d1ae1834/cirq-bb84-bob" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/6c625166d976128093dd392c76e724f5#file-cirq-bb84-bob">cirq-bb84-bob</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2984877ce85775919205c3441d7dca95.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist99632218" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-cirq-bb84-network" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-cirq-bb84-network-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-cirq-bb84-network-LC1" class="blob-code blob-code-inner js-file-line">import cirq</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-cirq-bb84-network-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-cirq-bb84-network-LC3" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-cirq-bb84-network-LC4" class="blob-code blob-code-inner js-file-line">class Network:</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-cirq-bb84-network-LC5" class="blob-code blob-code-inner js-file-line">    def send(self, encode_function):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-cirq-bb84-network-LC6" class="blob-code blob-code-inner js-file-line">        qubits = [cirq.LineQubit(i) for i in range(3)]</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-cirq-bb84-network-LC7" class="blob-code blob-code-inner js-file-line">        circuit = cirq.Circuit(</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-cirq-bb84-network-LC8" class="blob-code blob-code-inner js-file-line">            encode_function(qubits[0]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-cirq-bb84-network-LC9" class="blob-code blob-code-inner js-file-line">            cirq.H(qubits[1]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-cirq-bb84-network-LC10" class="blob-code blob-code-inner js-file-line">            cirq.CNOT(qubits[1], qubits[2]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-cirq-bb84-network-LC11" class="blob-code blob-code-inner js-file-line">            cirq.CNOT(qubits[0], qubits[1]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-cirq-bb84-network-LC12" class="blob-code blob-code-inner js-file-line">            cirq.H(qubits[0])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-cirq-bb84-network-LC13" class="blob-code blob-code-inner js-file-line">        )</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-cirq-bb84-network-LC14" class="blob-code blob-code-inner js-file-line">        return circuit, qubits</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-cirq-bb84-network-LC15" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-cirq-bb84-network-LC16" class="blob-code blob-code-inner js-file-line">    def reflect_measure_results(self, circuit, qubits):</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-cirq-bb84-network-LC17" class="blob-code blob-code-inner js-file-line">        # 測定結果が1ならボブのqubitにXゲートを追加</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-cirq-bb84-network-LC18" class="blob-code blob-code-inner js-file-line">        circuit.append([</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-cirq-bb84-network-LC19" class="blob-code blob-code-inner js-file-line">            cirq.CX(qubits[1], qubits[2]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-cirq-bb84-network-LC20" class="blob-code blob-code-inner js-file-line">        ])</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-cirq-bb84-network-LC21" class="blob-code blob-code-inner js-file-line">        # 測定結果が1ならボブのqubitにZゲートを追加</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-cirq-bb84-network-LC22" class="blob-code blob-code-inner js-file-line">        circuit.append([</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-cirq-bb84-network-LC23" class="blob-code blob-code-inner js-file-line">            cirq.CZ(qubits[0], qubits[2]),</td>
      </tr>
      <tr>
        <td id="file-cirq-bb84-network-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-cirq-bb84-network-LC24" class="blob-code blob-code-inner js-file-line">        ])</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2984877ce85775919205c3441d7dca95/raw/b7558d20fb8817e8902576890f46cb7bf1d55fa5/cirq-bb84-network" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2984877ce85775919205c3441d7dca95#file-cirq-bb84-network">cirq-bb84-network</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>main.py を実行し、鍵生成に使用するビット数を入力します。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_MKwohWeXr3Lh8ex6Kz40yw.png" alt="1_MKwohWeXr3Lh8ex6Kz40yw" loading="lazy"/></p>
<p>試しに4ビットを使用して鍵を生成すると、以下のようになりました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_f9PSNOCfMISuQsiO5RJrbA.png" alt="1_f9PSNOCfMISuQsiO5RJrbA" loading="lazy"/></p>
<p>生成された鍵が表示されています。元のビット数が少ないので、できた鍵が1ビットしかありません。</p>
<p>以下の部分で1ビット分の情報をAliceからBobに送信しています。複雑に見えますが、殆どがテレポーテーションの為のゲートです。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_Ad6oYzwGGySux2d-Bji6CQ.png" alt="1_Ad6oYzwGGySux2d-Bji6CQ" loading="lazy"/></p>
<p>256ビットを使って生成してみました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_S6_yA-aBcjjt4y1L5r6MdA.png" alt="1_S6_yA-aBcjjt4y1L5r6MdA" loading="lazy"/></p>
<p>このビット数でも互いの鍵が一致しているので、正常に動いているようです。</p>
<h2 id="%E9%80%9A%E4%BF%A1%E3%82%92%E7%9B%97%E8%81%B4%E3%81%95%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88">通信を盗聴された場合</h2>
<p>量子の通信経路を盗聴者Eveによって盗聴された場合、以下のような出力になります。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/1_zoUFHI4PE-ia3SCRdgsJLg.png" alt="1_zoUFHI4PE-ia3SCRdgsJLg" loading="lazy"/></p>
<p>このように互いの鍵がバラバラになります。これはEveがqubitを観測した時に、ビットの状態が確定したためです。これによって盗聴されたことを検知することができます。</p>
<p>そのため、「鍵を使用する前に先頭の数ビットをお互いに公開し、一致してなければその鍵を使うのをやめる、一致していれば公開していない部分を鍵として通信を行う」という決まりを設けておけば、安全に通信ができます。</p>
<h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2>
<p>CirqでBB84を実装してみました。回路自体は単純なので、思ったより簡単に実装できました。今後はもう少し難しい回路にも挑戦してみたいと思います。</p>
<!--kg-card-end: markdown--></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[Visual Studio Onlineを使ってみた]]></title><description><![CDATA[次はタブレットで仕事をする時代が来ると確信を持っており。

私自身もそのように仕事をしたいと考えている。

そのためにCloud IDEは必須なのである。

なぜVisual Studio Onlineか？
VS Code likeでVimのキーバインドを使いたい…

Gitpodなど有名なCloud IDEはあるがVimのキーバインドのプラグインを入れたところ、うまく動かなかった…

準備
現在(2019/11/16)パブリックプレビューなので、サインアップして使う必要がある。

実際に使うとAzureのアカウントを作れと言われるので、言われるがままに作成。

現時点では、最低のインスタンスタイプはStandardらしい…

GAしたときにはもっと小さいサイズのインスタンスも作れるようになってほしいが…。

作成が終わるとこんな感じ!

めちゃくちゃ簡単！！

そして無事Vimのプラグインも入れることができVimのキーバインドで操作することができました。

ただ、control + [ でEscapeできなくそこが非常に残念…

普段escボタンは打たない派なので…]]></description><link>https://tech.anti-pattern.co.jp/visual-studio-onlinewoshi-tutemita/</link><guid isPermaLink="false">Ghost__Post__60fa85223986b000013a3ab2</guid><category><![CDATA[VSCode]]></category><category><![CDATA[Visual Studio Online]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 20 Nov 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_D_kf9T0t2rrFB5VrFdKOZA.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_D_kf9T0t2rrFB5VrFdKOZA.png" alt="Visual Studio Onlineを使ってみた"/><p>次はタブレットで仕事をする時代が来ると確信を持っており。</p><p>私自身もそのように仕事をしたいと考えている。</p><p>そのためにCloud IDEは必須なのである。</p><h4 id="%E3%81%AA%E3%81%9Cvisual-studio-online%E3%81%8B%EF%BC%9F">なぜVisual Studio Onlineか？</h4><p>VS Code likeでVimのキーバインドを使いたい…</p><p>Gitpodなど有名なCloud IDEはあるがVimのキーバインドのプラグインを入れたところ、うまく動かなかった…</p><h4 id="%E6%BA%96%E5%82%99">準備</h4><p>現在(2019/11/16)パブリックプレビューなので、サインアップして使う必要がある。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*D_kf9T0t2rrFB5VrFdKOZA.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*t9rCKfUXTvK1qNnzHsOALw.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>実際に使うとAzureのアカウントを作れと言われるので、言われるがままに作成。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*2-c1g_rrfDgZYbZDF1liAA.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>現時点では、最低のインスタンスタイプはStandardらしい…</p><p>GAしたときにはもっと小さいサイズのインスタンスも作れるようになってほしいが…。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*DjHsGKhBOWCaFU5oiu-FEQ.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>作成が終わるとこんな感じ!</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*JHtpIj0TrrO8EOPLahx0yg.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>めちゃくちゃ簡単！！</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*uvR7ilPiw9l4X7yhYRQc2g.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>そして無事Vimのプラグインも入れることができVimのキーバインドで操作することができました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*nJSSmgb69jGwpEh5hnSL-w.png" class="kg-image" alt="Visual Studio Onlineを使ってみた" loading="lazy"/></figure><p>ただ、control + [ でEscapeできなくそこが非常に残念…</p><p>普段escボタンは打たない派なので…</p>]]></content:encoded></item><item><title><![CDATA[Golangへのマイグレーション！]]></title><description><![CDATA[こんにちは、Anti-Patternの塚本です。

今回のブログは、タイトル通り、あるマイグレーションについて書きたいと思います。

そもそもマイグレーションとは？

> プログラミングやソフトウェア開発で、古いプログラミング言語や開発環境で記述・開発されたソフトウェアを、別の言語や新しい環境に適合するよう変換することをマイグレーションという。

http://e-words.jp/w/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html


そのものズバリ！だったので引用してます。

そして、マイグレーション対象はバッチプログラムなのですが、この様な状態でして。

マイグレーション前
 * サポートが切れそうなPHP
 * ZendFrameworkをカスタマイズした独自フレームワークを使用
 * 仕様書なし

リリースから結構年数がたっているので仕方ない部分はあります。

マイグレーション後
 * オープンソースのGolang10.x
 * フレームワーク未使用。ORMライブラリに]]></description><link>https://tech.anti-pattern.co.jp/golanghenomaiguresiyon/</link><guid isPermaLink="false">Ghost__Post__610e31643986b000013a5526</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Mon, 11 Nov 2019 07:11:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-10.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-10.jpg" alt="Golangへのマイグレーション！"/><p>こんにちは、Anti-Patternの塚本です。</p>
<p>今回のブログは、タイトル通り、あるマイグレーションについて書きたいと思います。</p>
<p>そもそもマイグレーションとは？</p>
<blockquote>
<p>プログラミングやソフトウェア開発で、古いプログラミング言語や開発環境で記述・開発されたソフトウェアを、別の言語や新しい環境に適合するよう変換することをマイグレーションという。</p>
<p><a href="http://e-words.jp/w/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html">http://e-words.jp/w/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html</a></p>
</blockquote>
<p>そのものズバリ！だったので引用してます。</p>
<p>そして、マイグレーション対象はバッチプログラムなのですが、この様な状態でして。</p>
<h3 id="%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%89%8D">マイグレーション前</h3>
<ul>
<li>サポートが切れそうなPHP</li>
<li>ZendFrameworkをカスタマイズした独自フレームワークを使用</li>
<li>仕様書なし</li>
</ul>
<p>リリースから結構年数がたっているので仕方ない部分はあります。</p>
<h3 id="%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%BE%8C">マイグレーション後</h3>
<ul>
<li>オープンソースのGolang10.x</li>
<li>フレームワーク未使用。ORMライブラリにgormを使用</li>
<li>GoDoc</li>
</ul>
<p>Golangの採用理由ですが、オープンソースというのが大きいです。</p>
<p>他にも色々あるのですが、</p>
<ul>
<li>処理が軽量で早い</li>
</ul>
<blockquote>
<p><a href="http://sairoutine.hatenablog.com/entry/2017/12/02/182827">http://sairoutine.hatenablog.com/entry/2017/12/02/182827</a></p>
</blockquote>
<ul>
<li>並行処理の仕組み（goroutine）が標準パッケージ</li>
<li>ユニットテストの仕組み（testing）が標準パッケージ</li>
<li>プロファイリングツールの仕組み（pprof）が標準パッケージ</li>
<li>プログラムの自動整形（gofmt）が標準パッケージで提供</li>
<li>生産性の高さ</li>
</ul>
<h3 id="%E3%83%99%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">ベースプログラム</h3>
<p>1ヶ月位検証して作ったプログラムの概要がこちらになります。（DBアクセスなど省いてます）</p>
<p>sync.WaitGroupとchannel利用して、並行処理を実装してます。</p>
<pre><code>package main
import (&quot;sync&quot;)
// エンドポイント
func main() {
 var wg sync.WaitGroup
 executionChannel := make(chan struct{}, 2)
 processErrorChannel := make(chan bool, 2)
 resultStatusChannel := make(chan bool)
 doneChannel := make(chan struct{})
 targets := []string{&quot;orange&quot;,&quot;Apple&quot;,&quot;peach&quot;,&quot;watermelon&quot;}
 go resultReceptionWorker(processErrorChannel, resultStatusChannel, doneChannel)
 for _, v := range targets {
   wg.Add(1)
   executionChannel &lt;- struct{}{}
   go processA(&amp;wg, executionChannel, processErrorChannel, v)
 }
 wg.Wait()
 doneChannel &lt;- struct{}{}
 if &lt;-resultStatusChannel {
 }
 close(executionChannel)
 close(processErrorChannel)
 close(doneChannel)
 close(resultStatusChannel)
 return
}
// 業務処理処理関数
func processA(wg *sync.WaitGroup, executionChannel chan struct{}, processErrorChannel chan bool, v string) {
 processErr := false
 defer func() {
  processErrorChannel &lt;- processErr
  &lt;-executionChannel
  wg.Done()
 }()
 if err := processB(); err != nil {
   processErr = true
 }
 return
}
// 業務処理処理サブ関数
func processB() (err error) {
 return
}
// 並行処理結果を受け付け
func resultReceptionWorker(processErrorChannel, resultStatusChannel chan bool, doneChannel chan struct{}) {
 allStatus := false
 for {
  select {
  case ng := &lt;-processErrorChannel:
   if ng {
    allStatus = true
   }
  case &lt;-doneChannel:
   resultStatusChannel &lt;- allStatus
   return
  default:
  }
 }
}
</code></pre>
<h3 id="%E3%81%AF%E3%81%BE%E3%82%8A%E3%81%A9%E3%81%93%E3%82%8D">はまりどころ</h3>
<p>・詰まるgoroutine<br>
Channelに対する適切なバッファサイズの設定、何故かブロックされるChannelへの送受信。色々な方がブログで書かれてますが、仕組みを理解するまでははハマりました。</br></p>
<p>・荒ぶるCPU<br>
resultReceptionWorkerは全てのgoroutineが終わるまでループします。goroutineの処理時間に比例してここが高負荷になります。pprofで確認してsleepを入れました。</br></p>
<p>・Stackされていないerror？<br>
github.com/pkg/errorsをimport<br>
errors.WithStack(error)関数でerrorをラップして返却し、Stackをログに出力してます。</br></br></p>
<h3 id="%E3%81%BE%E3%81%A8%E3%82%81">まとめ</h3>
<p>Golangを使いましたが、良い言語だと思います。処理速度も問題なし。</p>
<p>簡易ステートメントや型推論など、直感的にコーティングできると思いますし、とてもシンプルに感じました。</p>
<p>個人的な意見ですが、ステップ数を減らすためのテクニカルなコード嫌いです。であれば、少し長くてもシンプルな方が可読性が良いですし、他の人にも理解しやすいと思ってます。</p>
<p>最後に、以下のブログの記事にとても共感しました。</p>
<blockquote>
<p>非知的なプログラマのためにデザインされている (Designed for non-intelligent programmers)</p>
<p><a href="https://www.yunabe.jp/docs/why_golang_is_good.html">https://www.yunabe.jp/docs/why_golang_is_good.html</a></p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！]]></title><description><![CDATA[
v2.5.0よりの新機能
Features
・ introduces ARRAY_CONTAINS_ANY and IN to operator enum (2c8869d
[https://www.github.com/googleapis/nodejs-firestore/commit/2c8869d23ad1aef024273b640579624cde97849f]
)

Release v2.5.0 · googleapis/nodejs-firestoreFeatures introduces
ARRAY_CONTAINS_ANY and IN to operator enum (2c8869d) Bug Fixes deps: bump
google-gax to 1.7.5 (#786) (e5763ba)GitHubgoogleapis
[https://github.com/googleapis/nodejs-firestore/releases/tag/v2.5.0]何が革命的か？？
例えば、自分が今持っている材料を条件に、料理一覧から対象の料理を持ってくるシステ]]></description><link>https://tech.anti-pattern.co.jp/dai-tinidai-tutafirestoreniarray_contains_anytoinjian-suo-gakita/</link><guid isPermaLink="false">Ghost__Post__60fa83b63986b000013a3a94</guid><category><![CDATA[Firestore]]></category><category><![CDATA[Firebase]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 07 Nov 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_vz9T8gBZPsoHx8TjvCQ5JQ.png" medium="image"/><content:encoded><![CDATA[<h3/><h3 id="v250%E3%82%88%E3%82%8A%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD">v2.5.0よりの新機能</h3><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_vz9T8gBZPsoHx8TjvCQ5JQ.png" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！"/><p>Features<br>・ introduces ARRAY_CONTAINS_ANY and IN to operator enum (<a href="https://www.github.com/googleapis/nodejs-firestore/commit/2c8869d23ad1aef024273b640579624cde97849f" rel="noopener">2c8869d</a>)</br></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/googleapis/nodejs-firestore/releases/tag/v2.5.0"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Release v2.5.0 · googleapis/nodejs-firestore</div><div class="kg-bookmark-description">Features introduces ARRAY_CONTAINS_ANY and IN to operator enum (2c8869d) Bug Fixes deps: bump google-gax to 1.7.5 (#786) (e5763ba)</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">googleapis</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/bab37b54f754e27806751e379e86d2f56d9eec470d9a574fe3956a67add204be/googleapis/nodejs-firestore" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！"/></div></a></figure><h3 id="%E4%BD%95%E3%81%8C%E9%9D%A9%E5%91%BD%E7%9A%84%E3%81%8B%EF%BC%9F%EF%BC%9F">何が革命的か？？</h3><p>例えば、自分が今持っている材料を条件に、料理一覧から対象の料理を持ってくるシステムがあるとする。</p><blockquote>例：人参と玉葱が余っているから、どちらかか、またはその両方が 使える料理を探したい。</blockquote><p>構成:</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*Li06ZsknJ7LXWNKIJ37BSQ.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><h4 id="%E4%BB%8A%E3%81%BE%E3%81%A7">今まで</h4><h4 id="%E3%80%8C%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B31%E3%80%8D-%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E8%A4%87%E6%95%B0%E5%9B%9E%E6%8A%95%E3%81%92%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E9%87%8D%E8%A4%87%E3%82%92%E5%BE%8C%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">「パターン1」: クエリを複数回投げ、プログラムで重複を後で削除する</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*OkMVnxua87SPzrAQCFujrA.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><!--kg-card-begin: markdown--><pre><code class="language-javascript">db.collection(&quot;FoodList&quot;).where(&quot;材料&quot;, &quot;array-contains&quot;, &quot;玉ねぎ&quot;).get()
db.collection(&quot;FoodList&quot;).where(&quot;材料&quot;, &quot;array-contains&quot;, &quot;人参&quot;).get()
</code></pre>
<!--kg-card-end: markdown--><p>検索したい材料の分クエリを投げ、その結果をプログラムで結合する。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*jgxSavujN4H4AnS86wsSmg.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><p>問題:人参と玉ねぎを両方使う料理は重複して取れてしまう。</p><p>検索する材料の種類が増えれば増えるほど、重複が増える。</p><h4 id="%E3%80%8C%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B32%E3%80%8D-%E3%81%99%E3%81%B9%E3%81%A6%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E5%AF%BE%E8%B1%A1%E5%A4%96%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">「パターン2」: すべて取得し、プログラムで対象外のデータを削除する</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*aOp7M_anIakgVDYvghds_g.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><p>db.collection("FoodList").get()</p><p>最初に対象のCollectionのデータを取得し、後でプログラム側で指定の材料が入っていないデータを削除する。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*79eeWD6EgYmVt8Hk_7votg.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><p>問題:毎回すべてのデータを取得するので、データの量が増えれば増えるほど、転送量が増えるため遅くなる。</p><p>また、パターン２とパターン３の問題として、ページネーションを実装しにくい点にある。</p><p>例えば,１ページ１０件のみデータを出すページネーションを実装した際に、事前に１０件だけとってくるということができない。</p><p>※queryを発行して、プログラムで削ってみるまで全文で対象のデータが何件あるかを把握できないため</p><p>よって双方とも、最初の検索でネットワーク転送量が余分にかかってしまう。</p><h4 id="%E3%80%8C%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B33%E3%80%8Dalgolia%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%86">「パターン3」Algoliaなどのサードパーティーサービスを使う</h4><p>これまでであれば、このパターンが一番多かったであろう。</p><h3 id="%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E8%A9%B1%E3%81%97%E3%82%92%E3%81%97%E3%82%88%E3%81%86">これからの話しをしよう</h3><h4 id="array-contains-any-%E3%82%92%E4%BD%BF%E3%81%84%EF%BC%91%E7%99%BA%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">array-contains-any を使い１発で取得する</h4><!--kg-card-begin: markdown--><pre><code class="language-javascript">db.collection(&quot;FoodList&quot;).where(&quot;材料&quot;, &quot;array-contains-any&quot;, [&quot;人参&quot;, &quot;玉ねぎ&quot;]).get()
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*vz9T8gBZPsoHx8TjvCQ5JQ.png" class="kg-image" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！" loading="lazy"/></figure><p>こうすることにより、材料配列に<strong>人参か玉ねぎ</strong>があるドキュメントを一発で取得することができる。</p><p>※ただし、2019/11/08時点では 最大10種類の値でしか検索できないので注意。</p><p>この機能をまっていたんだ！</p><p>IN検索については別途追記していきます。</p><p>参考</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cloud Firestore Now Supports IN Queries!</div><div class="kg-bookmark-description">Hello, Cloud Firestore developers! We wanted to let you know about some useful new querying features we’ve added to Cloud Firestore this week. Starting with… in queries! With the in query, you can query a specific field for multiple values (up to 10) in a single query. You do this by passing a list…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://firebase.googleblog.com/favicon.ico" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！"><span class="kg-bookmark-author">The Firebase Blog</span><span class="kg-bookmark-publisher">Google</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://4.bp.blogspot.com/-nvBVi2yLt3Y/XcMujJPL5FI/AAAAAAAAEYw/tWnb5OEzKBUf_CyalJjrP9qlDMtSJ18SgCLcBGAsYHQ/s1600/IN%2BQuery%2Bexample.png" alt="待ちに待ったFirestoreにARRAY_CONTAINS_ANYとIN検索がキタ！！"/></div></a></figure><p/>]]></content:encoded></item><item><title><![CDATA[PHP(parse_url) VS Golang(url.Parse)の挙動の違い！]]></title><description><![CDATA[はじめまして。塚本です。

とあるシステムを、PHPからGolangにマイグレーションした時に

幾つかやらかしたので、忘れない様にメモっときます。

PHP(parse_url)
php -r “echo var_dump(parse_url(‘http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment'));"
array(8) {
[“scheme”]=> string(4) “http”
[“host”]=> string(11) “example.com”
[“port”]=> int(81)
[“user”]=> string(3) “usr”
[“pass”]=> string(3) “pss”
[“path”]=> string(19) “/mypath/myfile.html”
[“query”]=> string(15) “a=b&b[]=2&b[]=3”
[“fragment”]=> string(10) “myfragment”
}


> https://www.php]]></description><link>https://tech.anti-pattern.co.jp/php-parse_url-vs-golang-url-parse-noju-dong-nowei-i/</link><guid isPermaLink="false">Ghost__Post__610e328f3986b000013a5543</guid><dc:creator><![CDATA[takeshi tsukamoto]]></dc:creator><pubDate>Thu, 10 Oct 2019 07:18:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-11.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/08/29791364_1246754985456610_5906763196705800192_n-11.jpg" alt="PHP(parse_url) VS Golang(url.Parse)の挙動の違い！"/><p>はじめまして。塚本です。</p>
<p>とあるシステムを、PHPからGolangにマイグレーションした時に</p>
<p>幾つかやらかしたので、忘れない様にメモっときます。</p>
<h4 id="phpparseurl">PHP(parse_url)</h4>
<pre><code>php -r “echo var_dump(parse_url(‘http://usr:pss@example.com:81/mypath/myfile.html?a=b&amp;b[]=2&amp;b[]=3#myfragment'));&quot;
array(8) {
[“scheme”]=&gt; string(4) “http”
[“host”]=&gt; string(11) “example.com”
[“port”]=&gt; int(81)
[“user”]=&gt; string(3) “usr”
[“pass”]=&gt; string(3) “pss”
[“path”]=&gt; string(19) “/mypath/myfile.html”
[“query”]=&gt; string(15) “a=b&amp;b[]=2&amp;b[]=3”
[“fragment”]=&gt; string(10) “myfragment”
}
</code></pre>
<blockquote>
<p><a href="https://www.php.net/manual/ja/function.parse-url.php">https://www.php.net/manual/ja/function.parse-url.php</a></p>
</blockquote>
<h4 id="golangurlparse">Golang(url.Parse)</h4>
<pre><code>u, _ := url.Parse(&quot;http://usr:pss@example.com:81/mypath/myfile.html?a=b&amp;b[]=2&amp;b[]=3#myfragment&quot;)
fmt.Printf(&quot;%v&quot;, u.Scheme) // outPut -&gt; http
fmt.Printf(&quot;%v&quot;, u.Opaque) // outPut -&gt; &quot;&quot;
fmt.Printf(&quot;%v&quot;, u.User) // outPut -&gt; usr:pss
fmt.Printf(&quot;%v&quot;, u.Host) // outPut -&gt; example.com:81
fmt.Printf(&quot;%v&quot;, u.Path) // outPut -&gt; /mypath/myfile.html
fmt.Printf(&quot;%v&quot;, u.RawPath) // outPut -&gt; &quot;&quot;
fmt.Printf(&quot;%v&quot;, u.ForceQuery) // outPut -&gt; false
fmt.Printf(&quot;%v&quot;, u.RawQuery) // outPut -&gt; a=b&amp;b[]=2&amp;b[]=3
fmt.Printf(&quot;%v&quot;, u.Fragment) // outPut -&gt; myfragment
</code></pre>
<blockquote>
<p>URL構造体定義</p>
<p><a href="https://golang.org/src/net/url/url.go?s=9835:10351#L346">https://golang.org/src/net/url/url.go?s=9835:10351#L346</a></p>
</blockquote>
<p>URLをそれぞれの要素に分解してくれます。</p>
<p>ここまでは想定通り。</p>
<p>検証済みだったのでこれで実装。</p>
<p>後で問題となったのは、pathの一部がURLエンコードされている場合。</p>
<p>今思うと、APIしっかり読んでおけばよかった・・・</p>
<h4 id="phpparseurl">PHP(parse_url)</h4>
<pre><code>php -r &quot;echo var_dump(parse_url('http://www.sample.com/sample/test-%e3%83%86%e3%82%b9%e3%83%88/index.html'));&quot;
array(3) {
[&quot;scheme&quot;]=&gt; string(4) &quot;http&quot;
[&quot;host&quot;]=&gt; string(14) &quot;www.sample.com&quot;
[&quot;path&quot;]=&gt; string(51) &quot;/sample/test-%e3%83%86%e3%82%b9%e3%83%88/index.html&quot;
}
</code></pre>
<p>pathに格納されている値は、URLエンコードされた値</p>
<h4 id="golangurlparse">Golang(url.Parse)</h4>
<pre><code>u, _ := url.Parse(&quot;http://usr:pss@example.com:81/mypath/myfile.html?a=b&amp;b[]=2&amp;b[]=3#myfragment&quot;)
fmt.Printf(&quot;%v&quot;, u.Scheme) // outPut -&gt; http
fmt.Printf(&quot;%v&quot;, u.Opaque) // outPut -&gt; &quot;&quot;
fmt.Printf(&quot;%v&quot;, u.User) // outPut -&gt; &quot;&quot;
fmt.Printf(&quot;%v&quot;, u.Host) // outPut -&gt; www.sample.com
fmt.Printf(&quot;%v&quot;, u.Path) // outPut -&gt; /sample/test-テスト/index.html
fmt.Printf(&quot;%v&quot;, u.RawPath) // outPut -&gt; /sample/test-%e3%83%86%e3%82%b9%e3%83%88/index.html
fmt.Printf(&quot;%v&quot;, u.ForceQuery) // outPut -&gt; false
fmt.Printf(&quot;%v&quot;, u.RawQuery) // outPut -&gt; 
fmt.Printf(&quot;%v&quot;, u.Fragment) // outPut -&gt; 
</code></pre>
<p>Pathの値はURLデコードされてる・・・</p>
<p>そしてRawPathにも値が設定されていて、こっちはURLエンコードされている元の値が！</p>
<p>url.setPathでやってました。正確にはエスケープした文字列とエスケープしない文字列を設定してます。</p>
<pre><code>// setPath sets the Path and RawPath fields of the URL based on the provided
// escaped path p. It maintains the invariant that RawPath is only specified
// when it differs from the default encoding of the path.
// For example:
// - setPath(&quot;/foo/bar&quot;)   will set Path=&quot;/foo/bar&quot; and RawPath=&quot;&quot;
// - setPath(&quot;/foo%2fbar&quot;) will set Path=&quot;/foo/bar&quot; and RawPath=&quot;/foo%2fbar&quot;
// setPath will return an error only if the provided path contains an invalid
// escaping.
func (u *URL) setPath(p string) error {
path, err := unescape(p, encodePath)
if err != nil {
return err
}
u.Path = path
if escp := escape(path, encodePath); p == escp {
// Default encoding is fine.
u.RawPath = &quot;&quot;
} else {
u.RawPath = p
}
return nil
}
</code></pre>
<blockquote>
<p><a href="https://golang.org/src/net/url/url.go?s=19478:19515#L663">https://golang.org/src/net/url/url.go?s=19478:19515#L663</a></p>
</blockquote>
<p>プログラム的には正しい挙動なので、テストケース漏れですね。</p>
<p>改めてマイグレーションの厳しさを知った43才の夏でした。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Chart.jsでグラフを描画してみよう]]></title><description><![CDATA[Chart.jsを使ってグラフを描画してみたいと思います。

Chart.jsを使うための準備としてCDNで提供されているChart.jsを用意して記述しましょう。

①<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>

書き込んだら次はChartを描画するために<canvas>を用意します。

ついでに、idも振っておきましょう。

<canvas id="myChart"></canvas>

ここまでで準備が完了です。

あとは描画したいChartの中身を設定していくだけです。

まずは描画する<canvas>要素を取得してきます。

② 
let myChart = document.getElementById('myChart').getContext('2d');

次にグラフで使う要素などをまとめておきます。

今回は会社とか採用する人の欲しがっているスキルプログラミング言語top5にしてみました。

③
let language = ["]]></description><link>https://tech.anti-pattern.co.jp/chart-jsdegurahuwomiao-hua-sitemiyou/</link><guid isPermaLink="false">Ghost__Post__6103e9e43986b000013a4497</guid><dc:creator><![CDATA[Jun Iwamura]]></dc:creator><pubDate>Sun, 06 Oct 2019 15:41:00 GMT</pubDate><content:encoded><![CDATA[<p>Chart.jsを使ってグラフを描画してみたいと思います。</p><p>Chart.jsを使うための準備としてCDNで提供されているChart.jsを用意して記述しましょう。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/1600/1*RmUaY0Rr5VHYdy4-fYugSg.png" class="kg-image" alt="" loading="lazy"/></figure><pre><code class="language-JavaScript">①&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"&gt;&lt;/script&gt;</code></pre><p>書き込んだら次はChartを描画するために&lt;canvas&gt;を用意します。</p><p>ついでに、idも振っておきましょう。</p><pre><code class="language-HTML">&lt;canvas id="myChart"&gt;&lt;/canvas&gt;</code></pre><p>ここまでで準備が完了です。</p><p>あとは描画したいChartの中身を設定していくだけです。</p><p>まずは描画する&lt;canvas&gt;要素を取得してきます。</p><pre><code class="language-JavaScript">② 
let myChart = document.getElementById('myChart').getContext('2d');</code></pre><p>次にグラフで使う要素などをまとめておきます。</p><p>今回は会社とか採用する人の欲しがっているスキルプログラミング言語top5にしてみました。</p><pre><code class="language-JavaScript">③
let language = ["Python","JS","Go","Kotlin","TS"];
let rating   = [25.1, 19.0, 16.2, 12.4, 11.9];
let color = ["#3572A5", "#F1E05A", "#00ADD8", "#F18E33", "#2B7489"];</code></pre><p>#参考: <a href="https://insights.stackoverflow.com/survey/2018#technology-_-most-loved-dreaded-and-wanted-frameworks-libraries-and-tools" rel="noopener">https://insights.stackoverflow.com/survey/2018#technology-_-most-loved-dreaded-and-wanted-frameworks-libraries-and-tools</a></p><p>④で使っているlanguage,color,ratingは③で定義している変数です。</p><pre><code class="language-JavaScript">let config = {
    type: 'doughnut',
    data: {
        labels: language,
        datasets: [
            {
                label: "Programming Language",
                backgroundColor: color,
                data: rating
            }
        ]
    },
}</code></pre><p>その次にChartのオブジェクトインスタンスを生成して、引数に事前に用意していた要素とグラフの設定をわたしてあげます。</p><pre><code class="language-JavaScirpt">⑤
let sampleChart = new Chart(myChart, config);</code></pre><p>1~5までを順々に並べたら完成です！</p><pre><code>&lt;body&gt;
&lt;canvas id="myChart"&gt;&lt;/canvas&gt;
①
&lt;script&gt;
②
③
④
⑤
&lt;/script&gt;
&lt;/body&gt;</code></pre><p>これで指定したグラフが描画され完成です！</p><p>オプションを付け足した状態で下記リンクにて完成形を公開してます！</p><p><a href="https://jsfiddle.net/soipon05/oy2emb98/" rel="noopener">https://jsfiddle.net/soipon05/oy2emb98/</a></p>]]></content:encoded></item><item><title><![CDATA[表示しているサイトのコンテンツをブラウザ上で比較的簡単にイジれるChrome拡張機能を作ってみた]]></title><description><![CDATA[やりたいこと
閲覧しているサイトの文字を変えて遊んだりしてみたい時、ありますよね。
勿論ChromeのDeveloperモードを使えば実現できるのは知っているのですが、もっと手軽にイジイジしてみたい気がします。
なので右クリックで簡単にイジイジできるChrome拡張機能を作ったのです。

※本稿では拡張機能の基本的な説明(インストール方法など)は割愛しています。



(タイプミスはご愛嬌ということで)

manifest.json

{  
  "manifest\_version": 2,  
  "name": "designExtesion",  
  "version": "1.0",  
  "background": {  
    "scripts": \["event.js"\],  
    "persistent": false  
  },  
  "content\_scripts": \[{  
    "matches": \["<all\_urls>"\],  
    "js": \["content.js"\]  
  }\],  
  "permi]]></description><link>https://tech.anti-pattern.co.jp/chrome-extension-design/</link><guid isPermaLink="false">Ghost__Post__610140f53986b000013a3ea6</guid><category><![CDATA[ChromeExtension]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 01 Oct 2019 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/chorme-extension-design-1-1.gif" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8">やりたいこと</h1>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/chorme-extension-design-1-1.gif" alt="表示しているサイトのコンテンツをブラウザ上で比較的簡単にイジれるChrome拡張機能を作ってみた"/><p>閲覧しているサイトの文字を変えて遊んだりしてみたい時、ありますよね。<br>
勿論ChromeのDeveloperモードを使えば実現できるのは知っているのですが、もっと手軽にイジイジしてみたい気がします。<br>
なので右クリックで簡単にイジイジできるChrome拡張機能を作ったのです。</br></br></p>
<p>※本稿では拡張機能の基本的な説明(インストール方法など)は割愛しています。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/chorme-extension-design-1.gif" alt="表示しているサイトのコンテンツをブラウザ上で比較的簡単にイジれるChrome拡張機能を作ってみた" loading="lazy"/></p>
<p>(タイプミスはご愛嬌ということで)</p>
<p><strong>manifest.json</strong></p>
<pre><code>{  
  &quot;manifest\_version&quot;: 2,  
  &quot;name&quot;: &quot;designExtesion&quot;,  
  &quot;version&quot;: &quot;1.0&quot;,  
  &quot;background&quot;: {  
    &quot;scripts&quot;: \[&quot;event.js&quot;\],  
    &quot;persistent&quot;: false  
  },  
  &quot;content\_scripts&quot;: \[{  
    &quot;matches&quot;: \[&quot;&lt;all\_urls&gt;&quot;\],  
    &quot;js&quot;: \[&quot;content.js&quot;\]  
  }\],  
  &quot;permissions&quot;: \[&quot;activeTab&quot;,&quot;contextMenus&quot;\]  
}
</code></pre>
<p><strong><em>■ポイント</em></strong></p>
<p><strong>・backgroundのpersistentをfalseに設定</strong><br>
これにより無駄にevent.jsが常駐するのではなく、何かしら設定したイベント実行時などに発火するようにします。</br></p>
<p><strong>event.js</strong></p>
<pre><code>// 右クリックのメニューを追加  
chrome.runtime.onInstalled.addListener(function(){  
  chrome.contextMenus.create({  
    id: &quot;designModeExtesion&quot;,  
    type: &quot;normal&quot;,  
    contexts: \['all'\],  
    &quot;title&quot;: &quot;designModeExtesion&quot;  
  });  
});// クリック時の挙動を設定  
chrome.contextMenus.onClicked.addListener(function(){  
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {  
    chrome.tabs.sendMessage(tabs\[0\].id, {message: &quot;I want to change to designMode!!&quot;}, function(response) {  
      console.log(response);  
    });  
  });  
});
</code></pre>
<p><em>■ポイント</em></p>
<p><strong>・CSSやDOM操作などはcontent.jsに寄せる</strong><br>
executeScriptなどを利用すればevent.jsから任意のスクリプトを実行することも可能ですが、難読化するので役割ごとにファイルが分かれている方が良いかと思います。</br></p>
<p><strong>content.js</strong></p>
<pre><code>chrome.runtime.onMessage.addListener(  
  function(request, sender, sendResponse) {  
    if (request.message == &quot;I want to change to designMode!!&quot;) {  
      document.designMode = &quot;on&quot;;  
      var elements = document.querySelectorAll('a');  
      elements.forEach(function (element) {  
        element.addEventListener(&quot;click&quot;, function(event) {  
          event.preventDefault();  
        }, false);  
      });  
      sendResponse({message: &quot;designMode changed!!&quot;});  
    }  
  }  
);
</code></pre>
<p><em>■ポイント</em></p>
<p><strong>・document.designModeをon！</strong></p>
<p>デフォルトではoffになっているのですが、これをonにセットするとコンテンツをブラウザ上からイジイジできるようになります。</p>
<p>(ブラウザ上で動作するエディタを作ったりする際に用いるっぽいのですが、用途がまだ具体的にイメージできません・・・誰か知っている方いたらご教示いただけると嬉しいです)</p>
<p><strong>・aタグのイベントをpreventDefaultで無効化している</strong></p>
<p>document.designModeをonにした時点から文字をイジイジすることは実現するのですが、aタグが有効なままだとaタグをクリックした際にページ遷移が発生し、折角イジイジしたものがなくなるという哀しい事件が起きます(起きました)。</p>
<p>ので、なんとかしてaタグのイベントを無効化したかったので、最初は下記の記述をしました。</p>
<pre><code>var target = document.getElementsByTagName(&quot;body&quot;);

// 「要素.style.プロパティ」と指定する際にはプロパティをlowerCamelCaseで記述します  
target\[0\].style.pointerEvents = &quot;none&quot;;
</code></pre>
<p>しかし、pointer-eventsをnoneにすると、 ポインターが要素を通過してしまい、編集したい場所を指定できない状態になってしまいました。</p>
<p>なので、document内の全てのaタグに対してクリック処理が走らないように書き換えた次第です。</p>
<p><em>参考URL</em><br>
<a href="https://developer.chrome.com/extensions/runtime">https://developer.chrome.com/extensions/runtime</a><br>
<a href="https://developer.chrome.com/extensions/contextMenus">https://developer.chrome.com/extensions/contextMenus</a><br>
<a href="https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events">https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events</a><br>
<a href="https://qiita.com/dulltz/items/eada79ee82be34490c2b">https://qiita.com/dulltz/items/eada79ee82be34490c2b</a><br>
<a href="https://qiita.com/howdy39/items/9ac0564da56246472fc5">https://qiita.com/howdy39/items/9ac0564da56246472fc5</a><br>
<a href="https://stackoverflow.com/questions/16492401/javascript-setting-pointer-events">https://stackoverflow.com/questions/16492401/javascript-setting-pointer-events</a><br>
<a href="https://github.com/1000ch/chrome-extension-hands-on/wiki/3.2.%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89ContentScript%E3%81%AB%E4%BC%9D%E3%81%88%E3%82%8B">https://github.com/1000ch/chrome-extension-hands-on/wiki/3.2.%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89ContentScript%E3%81%AB%E4%BC%9D%E3%81%88%E3%82%8B</a><br>
<a href="https://www.eisbahn.jp/yoichiro/2013/02/chrome-extension-event-page.html">https://www.eisbahn.jp/yoichiro/2013/02/chrome-extension-event-page.html</a></br></br></br></br></br></br></br></br></p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Go,Nuxt,MySQLの環境をGCPにデプロイしてみた]]></title><description><![CDATA[開発環境から本番環境まで構築し、Google Cloud Platform(GCP)にデプロイしてみました。

環境
 * フロントエンド：Nuxt.js (Firebase Hosting)
 * バックエンド：Go (Cloud Run)
 * DB：MySQL (Cloud SQL)

()内は使用するGCPのサービスです。

ブラウザからユーザーの氏名を送信するとDBに登録され、画面に全ユーザーの氏名を表示するだけの単純なアプリケーションを作成し、GCPにデプロイしました。最終的なソースは以下です。

GitHub - yutakahashi114/go_nuxt_mysqlContribute to yutakahashi114/go_nuxt_mysql
development by creating an account on GitHub.GitHubyutakahashi114
[https://github.com/yutakahashi114/go_nuxt_mysql]ディレクトリ構成はこんな感じです。

.  
├── client/  
│   └── va]]></description><link>https://tech.anti-pattern.co.jp/go-nuxt-mysql/</link><guid isPermaLink="false">Ghost__Post__61027fd53986b000013a4190</guid><category><![CDATA[golang]]></category><category><![CDATA[Nuxt.js]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[GCP]]></category><dc:creator><![CDATA[Yu Takahashi]]></dc:creator><pubDate>Mon, 30 Sep 2019 15:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>開発環境から本番環境まで構築し、Google Cloud Platform(GCP)にデプロイしてみました。</p>
<h2 id="%E7%92%B0%E5%A2%83">環境</h2>
<ul>
<li>フロントエンド：Nuxt.js (Firebase Hosting)</li>
<li>バックエンド：Go (Cloud Run)</li>
<li>DB：MySQL (Cloud SQL)</li>
</ul>
<p>()内は使用するGCPのサービスです。</p>
<p>ブラウザからユーザーの氏名を送信するとDBに登録され、画面に全ユーザーの氏名を表示するだけの単純なアプリケーションを作成し、GCPにデプロイしました。最終的なソースは以下です。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yutakahashi114/go_nuxt_mysql"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yutakahashi114/go_nuxt_mysql</div><div class="kg-bookmark-description">Contribute to yutakahashi114/go_nuxt_mysql development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yutakahashi114</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/9e05f7b8a8319cfd71b0450c6221b8d9ad7446dfb8bff2af5bf0ad6bb5316374/yutakahashi114/go_nuxt_mysql"/></div></a></figure><!--kg-card-begin: markdown--><p>ディレクトリ構成はこんな感じです。</p>
<pre><code>.  
├── client/  
│   └── var/  
│       └── www/  
│           └── project/  &lt;- Nuxtのプロジェクト  
├── go/  
│   ├── .env  
│   ├── Dockerfile  
│   └── src/  
│       └── app/          &lt;- Goのサーバーのコード  
├── mysql/  
│   ├── data/  
│   ├── init/  
│   └── my.cnf  
└── docker-compose.yml
</code></pre>
<p>docker-compose.ymlを書きます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/bec5074931e5f5674e1902081c7ce2e4.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98608833" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-docker-compose-1" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC3" class="blob-code blob-code-inner js-file-line">  go:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC4" class="blob-code blob-code-inner js-file-line">    build:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC5" class="blob-code blob-code-inner js-file-line">      context: ./go/</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC6" class="blob-code blob-code-inner js-file-line">      target: dev</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC7" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC8" class="blob-code blob-code-inner js-file-line">      - ./go/src:/go/src:cached</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC9" class="blob-code blob-code-inner js-file-line">    working_dir: /go/src/app</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC10" class="blob-code blob-code-inner js-file-line">    ports:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC11" class="blob-code blob-code-inner js-file-line">      - 8080:8080</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC12" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC13" class="blob-code blob-code-inner js-file-line">    env_file:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC14" class="blob-code blob-code-inner js-file-line">      - ./go/.env</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC15" class="blob-code blob-code-inner js-file-line">  mysql:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC16" class="blob-code blob-code-inner js-file-line">    image: mysql:latest</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC17" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC18" class="blob-code blob-code-inner js-file-line">      - ./mysql/data:/var/lib/mysql</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC19" class="blob-code blob-code-inner js-file-line">      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC20" class="blob-code blob-code-inner js-file-line">      - ./mysql/init:/docker-entrypoint-initdb.d</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC21" class="blob-code blob-code-inner js-file-line">    environment:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC22" class="blob-code blob-code-inner js-file-line">      MYSQL_ROOT_PASSWORD: password</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC23" class="blob-code blob-code-inner js-file-line">      MYSQL_DATABASE: database</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC24" class="blob-code blob-code-inner js-file-line">      MYSQL_USER: user</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC25" class="blob-code blob-code-inner js-file-line">      MYSQL_PASSWORD: password</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC26" class="blob-code blob-code-inner js-file-line">      TZ: &#39;Asia/Tokyo&#39;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC27" class="blob-code blob-code-inner js-file-line">  node:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC28" class="blob-code blob-code-inner js-file-line">    image: node:latest</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC29" class="blob-code blob-code-inner js-file-line">    ports:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC30" class="blob-code blob-code-inner js-file-line">      - 3000:3000</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC31" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC32" class="blob-code blob-code-inner js-file-line">      - ./client/var/www:/var/www:cached</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC33" class="blob-code blob-code-inner js-file-line">    working_dir: /var/www/project</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC34" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC35" class="blob-code blob-code-inner js-file-line">    depends_on:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC36" class="blob-code blob-code-inner js-file-line">      - go</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-1-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-go-nuxt-mysql-docker-compose-1-LC37" class="blob-code blob-code-inner js-file-line">      - mysql</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/bec5074931e5f5674e1902081c7ce2e4/raw/b5cad3e193ac5a803a0b944532229f1e9192276a/go-nuxt-mysql-docker-compose-1" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/bec5074931e5f5674e1902081c7ce2e4#file-go-nuxt-mysql-docker-compose-1">go-nuxt-mysql-docker-compose-1</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>GoのDockerfileです。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/a5dad722390d3780269bb47c7f485a4e.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98608913" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-dockerfile-1" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-1-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-dockerfile-1-LC1" class="blob-code blob-code-inner js-file-line">FROM golang:latest as dev</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-1-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-dockerfile-1-LC2" class="blob-code blob-code-inner js-file-line">RUN apt-get update \</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-1-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-dockerfile-1-LC3" class="blob-code blob-code-inner js-file-line"> &amp;&amp; apt-get install -y vim \</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-1-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-dockerfile-1-LC4" class="blob-code blob-code-inner js-file-line"> &amp;&amp; curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/a5dad722390d3780269bb47c7f485a4e/raw/21c7ee09a13fd68f1658d4d1ce3a9bdb895eaf1c/go-nuxt-mysql-dockerfile-1" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/a5dad722390d3780269bb47c7f485a4e#file-go-nuxt-mysql-dockerfile-1">go-nuxt-mysql-dockerfile-1</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="db">DB</h2>
<p>以下の記事を参考に設定ファイルを作成しました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/A-Kira/items/f401aea261693c395966"><div class="kg-bookmark-content"><div class="kg-bookmark-title">docker-compose でMySQL環境簡単構築 - Qiita</div><div class="kg-bookmark-description">はじめに docker-composeを使って、MySQL環境を構築します。サンプルとしてtestテーブル作成〜phpMyAdminで確認できるまでの手順をご紹介します。なるべく、シンプルにという事で、MySQLとphpMyAd...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">A-Kira</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1aRzlqYTJWeUxXTnZiWEJ2YzJVZzQ0R25UWGxUVVV6bmtyRGxvb1Buc0tIbGpaam1wNHZucjRrJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTQmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWNlbnRlciUyQ21pZGRsZSZzPTYxNjQzODMzN2NjMzJmMzY5NjY1NTgxYzU4ZGFlMzky&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RRUV0UzJseVlRJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NDUmdHh0LWFsaWduPXJpZ2h0JTJDYm90dG9tJnM9YWJhMzIwNDhiYWFiZTFhNmYzOGY2NmQ0MzAzNzhhNDU&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;6b28dbbbfd708ee483687ef4d157f741"/></div></a></figure><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/ba7df93c721a15f9f1411d101c35e4ff.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98619139" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-mycnf" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-mycnf-LC1" class="blob-code blob-code-inner js-file-line">[mysqld]</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-mycnf-LC2" class="blob-code blob-code-inner js-file-line">character-set-server=utf8mb4</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-mycnf-LC3" class="blob-code blob-code-inner js-file-line">collation-server=utf8mb4_unicode_ci</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-mycnf-LC4" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-mycnf-LC5" class="blob-code blob-code-inner js-file-line">[client]</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-mycnf-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-mycnf-LC6" class="blob-code blob-code-inner js-file-line">default-character-set=utf8mb4</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/ba7df93c721a15f9f1411d101c35e4ff/raw/1cb72a8af4b34bba217939b52c2e3ca75e19f007/go-nuxt-mysql-mycnf" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/ba7df93c721a15f9f1411d101c35e4ff#file-go-nuxt-mysql-mycnf">go-nuxt-mysql-mycnf</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>以下のファイルを作成し、マウントしておくと、DBの初回起動時にusersテーブルが自動で作成されます。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/6f4ba6bef86dee7509d45c93324e832e.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609063" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-db-init" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-db-init-LC1" class="blob-code blob-code-inner js-file-line">create table IF not exists `users`</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-db-init-LC2" class="blob-code blob-code-inner js-file-line">(</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-db-init-LC3" class="blob-code blob-code-inner js-file-line">    `id`               INT(20) AUTO_INCREMENT,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-db-init-LC4" class="blob-code blob-code-inner js-file-line">    `first_name`       VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-db-init-LC5" class="blob-code blob-code-inner js-file-line">    `last_name`        VARCHAR(20) NOT NULL,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-db-init-LC6" class="blob-code blob-code-inner js-file-line">    PRIMARY KEY (`id`)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-db-init-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-db-init-LC7" class="blob-code blob-code-inner js-file-line">) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/6f4ba6bef86dee7509d45c93324e832e/raw/138af1b0bf1317fba6cefbd701c6d26aedc005bd/go-nuxt-mysql-db-init" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/6f4ba6bef86dee7509d45c93324e832e#file-go-nuxt-mysql-db-init">go-nuxt-mysql-db-init</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89">バックエンド</h2>
<p>以下の記事を参考に、GoでAPIサーバーを実装しました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://qiita.com/hirotakan/items/698c1f5773a3cca6193e"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Clean ArchitectureでAPI Serverを構築してみる - Qiita</div><div class="kg-bookmark-description">この記事では、アーキテクチャを採用する理由、次にClean Architectureの概要、最後にアプリケーションの構築をしていきます。 この後詳しく見ていきますが、Clean architectureの概念は比較的シンプルでわかり...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png"><span class="kg-bookmark-author">Qiita</span><span class="kg-bookmark-publisher">hirotakan</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1RMnhsWVc0Z1FYSmphR2wwWldOMGRYSmw0NEduUVZCSklGTmxjblpsY3VPQ2t1YW5pLWV2aWVPQmwtT0JwdU9Cdi1PQ2l3JnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTQmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWNlbnRlciUyQ21pZGRsZSZzPWQ0MWQ2MTk4NWU5M2VkMTBiYTQxMjAwMzQ3MzFkYmUy&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RR2hwY205MFlXdGhiZyZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTQ1JnR4dC1hbGlnbj1yaWdodCUyQ2JvdHRvbSZzPTczNWZlYTUwN2ZjMTNiOTc1MDBjNDM1NTQzMzdlY2Ri&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;9623c9061c7a071783562d829a100ab3"/></div></a></figure><!--kg-card-begin: markdown--><p>基本的に上の記事と同じものを書きましたが、APIのパスを少し変えています。</p>
<pre><code>api := router.Group(&quot;/api&quot;)  
{  
    api.POST(&quot;/users&quot;, ...)  
    api.GET(&quot;/users/:id&quot;, ...)  
    api.GET(&quot;/users&quot;, ...)  
}  
Router = router
</code></pre>
<p>DBへの接続部分は、以下のように環境変数でセットするようにしました。</p>
<pre><code>user := os.Getenv(&quot;DB_USER&quot;)  
pass := os.Getenv(&quot;DB_PASSWORD&quot;)  
host := os.Getenv(&quot;DB_HOST&quot;)  
name := os.Getenv(&quot;DB_DATABASE&quot;)  
sock := os.Getenv(&quot;DB_SOCKET&quot;)  
dns := fmt.Sprintf(&quot;%s:%s@%s(%s)/%s&quot;, user, pass, sock, host, name)  
conn, err := sql.Open(&quot;mysql&quot;, dns)
</code></pre>
<p>DBの設定に合わせて <code>.env</code>を作成します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/386f37a734559a7356e56c843d3e17fc.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609969" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-env" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-env-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-env-LC1" class="blob-code blob-code-inner js-file-line">DB_USER=user</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-env-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-env-LC2" class="blob-code blob-code-inner js-file-line">DB_PASSWORD=password</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-env-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-env-LC3" class="blob-code blob-code-inner js-file-line">DB_HOST=mysql:3306</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-env-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-env-LC4" class="blob-code blob-code-inner js-file-line">DB_DATABASE=database</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-env-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-env-LC5" class="blob-code blob-code-inner js-file-line">DB_SOCKET=tcp</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/386f37a734559a7356e56c843d3e17fc/raw/e896fb6c3a0e7eb3158b096b2da67d082d4d4ebf/go-nuxt-mysql-env" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/386f37a734559a7356e56c843d3e17fc#file-go-nuxt-mysql-env">go-nuxt-mysql-env</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Goのコンテナに入り、<code>go run server.go</code>でサーバー立ち上げると、以下のエンドポイントができます。</p>
<pre><code>POST   /api/users  
GET    /api/users/:id  
GET    /api/users
</code></pre>
<h2 id="%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89">フロントエンド</h2>
<p>Nuxtのプロジェクトを作成し、氏名の入力フォームとユーザー情報を表示するページを作成します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/0f5f60c34a59e83416fba93789da2458.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609088" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-pages-index" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-pages-index-LC1" class="blob-code blob-code-inner js-file-line">&lt;template&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-pages-index-LC2" class="blob-code blob-code-inner js-file-line">    &lt;div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-pages-index-LC3" class="blob-code blob-code-inner js-file-line">        &lt;input v-model=&quot;lastName&quot; placeholder=&quot;姓&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-pages-index-LC4" class="blob-code blob-code-inner js-file-line">        &lt;input v-model=&quot;firstName&quot; placeholder=&quot;名&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-pages-index-LC5" class="blob-code blob-code-inner js-file-line">        &lt;button @click=&quot;addUserFromForm&quot; class=&quot;button&quot;&gt;登録&lt;/button&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-pages-index-LC6" class="blob-code blob-code-inner js-file-line">        &lt;div class=&quot;table&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-pages-index-LC7" class="blob-code blob-code-inner js-file-line">            &lt;div class=&quot;table-row&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-pages-index-LC8" class="blob-code blob-code-inner js-file-line">                &lt;div class=&quot;table-column table-column-1&quot;&gt;ID&lt;/div&gt;&lt;div class=&quot;table-column table-column-2&quot;&gt;名前&lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-pages-index-LC9" class="blob-code blob-code-inner js-file-line">            &lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-pages-index-LC10" class="blob-code blob-code-inner js-file-line">            &lt;template v-for=&quot;user in users&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-pages-index-LC11" class="blob-code blob-code-inner js-file-line">                &lt;div :key=&quot;user.ID&quot; class=&quot;table-row&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-pages-index-LC12" class="blob-code blob-code-inner js-file-line">                    &lt;div class=&quot;table-column table-column-1&quot;&gt;{{user.ID}}&lt;/div&gt;&lt;div class=&quot;table-column table-column-2&quot;&gt;{{user.LastName}} {{user.FirstName}}&lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-pages-index-LC13" class="blob-code blob-code-inner js-file-line">                &lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-pages-index-LC14" class="blob-code blob-code-inner js-file-line">            &lt;/template&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-pages-index-LC15" class="blob-code blob-code-inner js-file-line">        &lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-pages-index-LC16" class="blob-code blob-code-inner js-file-line">    &lt;/div&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-pages-index-LC17" class="blob-code blob-code-inner js-file-line">&lt;/template&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-pages-index-LC18" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-pages-index-LC19" class="blob-code blob-code-inner js-file-line">&lt;script&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-pages-index-LC20" class="blob-code blob-code-inner js-file-line">import axios from &#39;axios&#39;;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-pages-index-LC21" class="blob-code blob-code-inner js-file-line">import { mapState, mapActions } from &#39;vuex&#39;;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-pages-index-LC22" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-pages-index-LC23" class="blob-code blob-code-inner js-file-line">export default {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-pages-index-LC24" class="blob-code blob-code-inner js-file-line">    created() {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-nuxt-mysql-pages-index-LC25" class="blob-code blob-code-inner js-file-line">        this.getAllUsers()</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-nuxt-mysql-pages-index-LC26" class="blob-code blob-code-inner js-file-line">    },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-nuxt-mysql-pages-index-LC27" class="blob-code blob-code-inner js-file-line">    data() {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-nuxt-mysql-pages-index-LC28" class="blob-code blob-code-inner js-file-line">        return {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-nuxt-mysql-pages-index-LC29" class="blob-code blob-code-inner js-file-line">            lastName: &quot;&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-nuxt-mysql-pages-index-LC30" class="blob-code blob-code-inner js-file-line">            firstName: &quot;&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-nuxt-mysql-pages-index-LC31" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-nuxt-mysql-pages-index-LC32" class="blob-code blob-code-inner js-file-line">    },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-nuxt-mysql-pages-index-LC33" class="blob-code blob-code-inner js-file-line">    computed: mapState({</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-nuxt-mysql-pages-index-LC34" class="blob-code blob-code-inner js-file-line">        users: &#39;users&#39;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-go-nuxt-mysql-pages-index-LC35" class="blob-code blob-code-inner js-file-line">    }),</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L36" class="blob-num js-line-number" data-line-number="36"/>
        <td id="file-go-nuxt-mysql-pages-index-LC36" class="blob-code blob-code-inner js-file-line">    methods: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L37" class="blob-num js-line-number" data-line-number="37"/>
        <td id="file-go-nuxt-mysql-pages-index-LC37" class="blob-code blob-code-inner js-file-line">        ...mapActions([</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L38" class="blob-num js-line-number" data-line-number="38"/>
        <td id="file-go-nuxt-mysql-pages-index-LC38" class="blob-code blob-code-inner js-file-line">            &#39;getAllUsers&#39;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L39" class="blob-num js-line-number" data-line-number="39"/>
        <td id="file-go-nuxt-mysql-pages-index-LC39" class="blob-code blob-code-inner js-file-line">            &#39;addUser&#39;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L40" class="blob-num js-line-number" data-line-number="40"/>
        <td id="file-go-nuxt-mysql-pages-index-LC40" class="blob-code blob-code-inner js-file-line">        ]),</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L41" class="blob-num js-line-number" data-line-number="41"/>
        <td id="file-go-nuxt-mysql-pages-index-LC41" class="blob-code blob-code-inner js-file-line">        async addUserFromForm() {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L42" class="blob-num js-line-number" data-line-number="42"/>
        <td id="file-go-nuxt-mysql-pages-index-LC42" class="blob-code blob-code-inner js-file-line">            await this.addUser({</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L43" class="blob-num js-line-number" data-line-number="43"/>
        <td id="file-go-nuxt-mysql-pages-index-LC43" class="blob-code blob-code-inner js-file-line">                firstName: this.firstName,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L44" class="blob-num js-line-number" data-line-number="44"/>
        <td id="file-go-nuxt-mysql-pages-index-LC44" class="blob-code blob-code-inner js-file-line">                lastName: this.lastName,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L45" class="blob-num js-line-number" data-line-number="45"/>
        <td id="file-go-nuxt-mysql-pages-index-LC45" class="blob-code blob-code-inner js-file-line">            })</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L46" class="blob-num js-line-number" data-line-number="46"/>
        <td id="file-go-nuxt-mysql-pages-index-LC46" class="blob-code blob-code-inner js-file-line">            this.firstName = &quot;&quot;;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L47" class="blob-num js-line-number" data-line-number="47"/>
        <td id="file-go-nuxt-mysql-pages-index-LC47" class="blob-code blob-code-inner js-file-line">            this.lastName = &quot;&quot;;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L48" class="blob-num js-line-number" data-line-number="48"/>
        <td id="file-go-nuxt-mysql-pages-index-LC48" class="blob-code blob-code-inner js-file-line">            this.getAllUsers()</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L49" class="blob-num js-line-number" data-line-number="49"/>
        <td id="file-go-nuxt-mysql-pages-index-LC49" class="blob-code blob-code-inner js-file-line">        },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L50" class="blob-num js-line-number" data-line-number="50"/>
        <td id="file-go-nuxt-mysql-pages-index-LC50" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L51" class="blob-num js-line-number" data-line-number="51"/>
        <td id="file-go-nuxt-mysql-pages-index-LC51" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L52" class="blob-num js-line-number" data-line-number="52"/>
        <td id="file-go-nuxt-mysql-pages-index-LC52" class="blob-code blob-code-inner js-file-line">&lt;/script&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L53" class="blob-num js-line-number" data-line-number="53"/>
        <td id="file-go-nuxt-mysql-pages-index-LC53" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L54" class="blob-num js-line-number" data-line-number="54"/>
        <td id="file-go-nuxt-mysql-pages-index-LC54" class="blob-code blob-code-inner js-file-line">&lt;style lang=&quot;scss&quot;&gt;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L55" class="blob-num js-line-number" data-line-number="55"/>
        <td id="file-go-nuxt-mysql-pages-index-LC55" class="blob-code blob-code-inner js-file-line">.table {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L56" class="blob-num js-line-number" data-line-number="56"/>
        <td id="file-go-nuxt-mysql-pages-index-LC56" class="blob-code blob-code-inner js-file-line">    margin: 10px;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L57" class="blob-num js-line-number" data-line-number="57"/>
        <td id="file-go-nuxt-mysql-pages-index-LC57" class="blob-code blob-code-inner js-file-line">    .table-row {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L58" class="blob-num js-line-number" data-line-number="58"/>
        <td id="file-go-nuxt-mysql-pages-index-LC58" class="blob-code blob-code-inner js-file-line">        display: flex;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L59" class="blob-num js-line-number" data-line-number="59"/>
        <td id="file-go-nuxt-mysql-pages-index-LC59" class="blob-code blob-code-inner js-file-line">        align-items: center;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L60" class="blob-num js-line-number" data-line-number="60"/>
        <td id="file-go-nuxt-mysql-pages-index-LC60" class="blob-code blob-code-inner js-file-line">        height: 30px;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L61" class="blob-num js-line-number" data-line-number="61"/>
        <td id="file-go-nuxt-mysql-pages-index-LC61" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L62" class="blob-num js-line-number" data-line-number="62"/>
        <td id="file-go-nuxt-mysql-pages-index-LC62" class="blob-code blob-code-inner js-file-line">    .table-column {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L63" class="blob-num js-line-number" data-line-number="63"/>
        <td id="file-go-nuxt-mysql-pages-index-LC63" class="blob-code blob-code-inner js-file-line">        text-align: center;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L64" class="blob-num js-line-number" data-line-number="64"/>
        <td id="file-go-nuxt-mysql-pages-index-LC64" class="blob-code blob-code-inner js-file-line">        &amp;.table-column-1 {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L65" class="blob-num js-line-number" data-line-number="65"/>
        <td id="file-go-nuxt-mysql-pages-index-LC65" class="blob-code blob-code-inner js-file-line">            width: 50px;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L66" class="blob-num js-line-number" data-line-number="66"/>
        <td id="file-go-nuxt-mysql-pages-index-LC66" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L67" class="blob-num js-line-number" data-line-number="67"/>
        <td id="file-go-nuxt-mysql-pages-index-LC67" class="blob-code blob-code-inner js-file-line">        &amp;.table-column-2 {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L68" class="blob-num js-line-number" data-line-number="68"/>
        <td id="file-go-nuxt-mysql-pages-index-LC68" class="blob-code blob-code-inner js-file-line">            width: 150px;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L69" class="blob-num js-line-number" data-line-number="69"/>
        <td id="file-go-nuxt-mysql-pages-index-LC69" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L70" class="blob-num js-line-number" data-line-number="70"/>
        <td id="file-go-nuxt-mysql-pages-index-LC70" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L71" class="blob-num js-line-number" data-line-number="71"/>
        <td id="file-go-nuxt-mysql-pages-index-LC71" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L72" class="blob-num js-line-number" data-line-number="72"/>
        <td id="file-go-nuxt-mysql-pages-index-LC72" class="blob-code blob-code-inner js-file-line">.button {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L73" class="blob-num js-line-number" data-line-number="73"/>
        <td id="file-go-nuxt-mysql-pages-index-LC73" class="blob-code blob-code-inner js-file-line">    margin: 10px;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L74" class="blob-num js-line-number" data-line-number="74"/>
        <td id="file-go-nuxt-mysql-pages-index-LC74" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-pages-index-L75" class="blob-num js-line-number" data-line-number="75"/>
        <td id="file-go-nuxt-mysql-pages-index-LC75" class="blob-code blob-code-inner js-file-line">&lt;/style&gt;</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/0f5f60c34a59e83416fba93789da2458/raw/b26ca13e49772377ef67f7f50adc70119530d605/go-nuxt-mysql-pages-index" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/0f5f60c34a59e83416fba93789da2458#file-go-nuxt-mysql-pages-index">go-nuxt-mysql-pages-index</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/2053a2d3d9ad5e918b8ed8215a4e8e42.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609094" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-store-index" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-store-index-LC1" class="blob-code blob-code-inner js-file-line">import axios from &#39;axios&#39;;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-store-index-LC2" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-store-index-LC3" class="blob-code blob-code-inner js-file-line">export const state = () =&gt; ({</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-store-index-LC4" class="blob-code blob-code-inner js-file-line">    users: []</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-store-index-LC5" class="blob-code blob-code-inner js-file-line">})</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-store-index-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-store-index-LC7" class="blob-code blob-code-inner js-file-line">export const mutations = {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-store-index-LC8" class="blob-code blob-code-inner js-file-line">    setUsers(state, users) {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-store-index-LC9" class="blob-code blob-code-inner js-file-line">        state.users = users;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-store-index-LC10" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-store-index-LC11" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-store-index-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-store-index-LC13" class="blob-code blob-code-inner js-file-line">export const actions = {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-store-index-LC14" class="blob-code blob-code-inner js-file-line">    async getAllUsers(context) {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-store-index-LC15" class="blob-code blob-code-inner js-file-line">        try {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-store-index-LC16" class="blob-code blob-code-inner js-file-line">            const { data } = await axios.get(&#39;/api/users&#39;)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-store-index-LC17" class="blob-code blob-code-inner js-file-line">            context.commit(&#39;setUsers&#39;, data)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-store-index-LC18" class="blob-code blob-code-inner js-file-line">        } catch (error) {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-store-index-LC19" class="blob-code blob-code-inner js-file-line">            console.log(error)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-store-index-LC20" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-store-index-LC21" class="blob-code blob-code-inner js-file-line">    },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-store-index-LC22" class="blob-code blob-code-inner js-file-line">    async addUser(context, params) {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-store-index-LC23" class="blob-code blob-code-inner js-file-line">        try {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-store-index-LC24" class="blob-code blob-code-inner js-file-line">            await axios.post(&#39;/api/users&#39;, params)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-nuxt-mysql-store-index-LC25" class="blob-code blob-code-inner js-file-line">        } catch (error) {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-nuxt-mysql-store-index-LC26" class="blob-code blob-code-inner js-file-line">            console.log(error)</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-nuxt-mysql-store-index-LC27" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-nuxt-mysql-store-index-LC28" class="blob-code blob-code-inner js-file-line">    }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-store-index-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-nuxt-mysql-store-index-LC29" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/2053a2d3d9ad5e918b8ed8215a4e8e42/raw/996562572e59876ba116be3a1d498e9ca5602b35/go-nuxt-mysql-store-index" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/2053a2d3d9ad5e918b8ed8215a4e8e42#file-go-nuxt-mysql-store-index">go-nuxt-mysql-store-index</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>package.json</code>です。 docker内で起動するので、scripts.devを <code>HOST=0.0.0.0 PORT=3000 nuxt</code> としています。<br>
Firebaseにデプロイするので、そのためのツールも追加しています。</br></p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/4c1628a608ab1087c0ca0180fae2c7d0.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609308" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-package" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-package-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-package-LC1" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-package-LC2" class="blob-code blob-code-inner js-file-line">  &quot;name&quot;: &quot;project&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-package-LC3" class="blob-code blob-code-inner js-file-line">  &quot;version&quot;: &quot;1.0.0&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-package-LC4" class="blob-code blob-code-inner js-file-line">  &quot;description&quot;: &quot;My kickass Nuxt.js project&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-package-LC5" class="blob-code blob-code-inner js-file-line">  &quot;author&quot;: &quot;&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-package-LC6" class="blob-code blob-code-inner js-file-line">  &quot;private&quot;: true,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-package-LC7" class="blob-code blob-code-inner js-file-line">  &quot;scripts&quot;: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-package-LC8" class="blob-code blob-code-inner js-file-line">    &quot;dev&quot;: &quot;HOST=0.0.0.0 PORT=3000 nuxt&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-package-LC9" class="blob-code blob-code-inner js-file-line">    &quot;build&quot;: &quot;nuxt build&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-package-LC10" class="blob-code blob-code-inner js-file-line">    &quot;start&quot;: &quot;nuxt start&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-package-LC11" class="blob-code blob-code-inner js-file-line">    &quot;generate&quot;: &quot;nuxt generate&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-package-LC12" class="blob-code blob-code-inner js-file-line">  },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-package-LC13" class="blob-code blob-code-inner js-file-line">  &quot;dependencies&quot;: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-package-LC14" class="blob-code blob-code-inner js-file-line">    &quot;@nuxtjs/axios&quot;: &quot;^5.3.6&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-package-LC15" class="blob-code blob-code-inner js-file-line">    &quot;firebase&quot;: &quot;^6.6.1&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-package-LC16" class="blob-code blob-code-inner js-file-line">    &quot;firebase-tools&quot;: &quot;^7.3.2&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-package-LC17" class="blob-code blob-code-inner js-file-line">    &quot;nuxt&quot;: &quot;^2.0.0&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-package-LC18" class="blob-code blob-code-inner js-file-line">    &quot;ress&quot;: &quot;^1.2.2&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-package-LC19" class="blob-code blob-code-inner js-file-line">  },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-package-LC20" class="blob-code blob-code-inner js-file-line">  &quot;devDependencies&quot;: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-package-LC21" class="blob-code blob-code-inner js-file-line">    &quot;node-sass&quot;: &quot;^4.12.0&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-package-LC22" class="blob-code blob-code-inner js-file-line">    &quot;sass-loader&quot;: &quot;^8.0.0&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-package-LC23" class="blob-code blob-code-inner js-file-line">  }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-package-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-package-LC24" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/4c1628a608ab1087c0ca0180fae2c7d0/raw/c3e6004d2ed7d7fac8c8f0053ed0241bb5d3e8aa/go-nuxt-mysql-package" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/4c1628a608ab1087c0ca0180fae2c7d0#file-go-nuxt-mysql-package">go-nuxt-mysql-package</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p><code>nuxt.config.js</code> のproxy部分の設定を以下のようにします。</p>
<pre><code>axios: {  
  proxy: true  
},  
proxy: {  
  '/api': 'http://go:8080'  
},
</code></pre>
<p>Nodeコンテナに入り、<code>yarn run dev</code>を実行すると、 <code>localhost:3000</code>にアクセスできます。</p>
<p>ここまで終わったらdocker-composeを少し修正しました。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/90dc914795166dea1650df951b586b11.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609612" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-docker-compose-2" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC1" class="blob-code blob-code-inner js-file-line">version: &#39;3.7&#39;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC2" class="blob-code blob-code-inner js-file-line">services:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC3" class="blob-code blob-code-inner js-file-line">  go:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC4" class="blob-code blob-code-inner js-file-line">    build:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC5" class="blob-code blob-code-inner js-file-line">      context: ./go/</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC6" class="blob-code blob-code-inner js-file-line">      target: dev</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC7" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC8" class="blob-code blob-code-inner js-file-line">      - ./go/src:/go/src:cached</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC9" class="blob-code blob-code-inner js-file-line">    working_dir: /go/src/app</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC10" class="blob-code blob-code-inner js-file-line">    tty: true</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC11" class="blob-code blob-code-inner js-file-line">    env_file:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC12" class="blob-code blob-code-inner js-file-line">      - ./go/.env</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC13" class="blob-code blob-code-inner js-file-line">  mysql:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC14" class="blob-code blob-code-inner js-file-line">    image: mysql:latest</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC15" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC16" class="blob-code blob-code-inner js-file-line">      - ./mysql/data:/var/lib/mysql</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC17" class="blob-code blob-code-inner js-file-line">      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC18" class="blob-code blob-code-inner js-file-line">      - ./mysql/init:/docker-entrypoint-initdb.d</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC19" class="blob-code blob-code-inner js-file-line">    environment:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC20" class="blob-code blob-code-inner js-file-line">      MYSQL_ROOT_PASSWORD: password</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC21" class="blob-code blob-code-inner js-file-line">      MYSQL_DATABASE: database</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC22" class="blob-code blob-code-inner js-file-line">      MYSQL_USER: user</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC23" class="blob-code blob-code-inner js-file-line">      MYSQL_PASSWORD: password</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC24" class="blob-code blob-code-inner js-file-line">      TZ: &#39;Asia/Tokyo&#39;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC25" class="blob-code blob-code-inner js-file-line">  node:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC26" class="blob-code blob-code-inner js-file-line">    image: node:latest</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC27" class="blob-code blob-code-inner js-file-line">    ports:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC28" class="blob-code blob-code-inner js-file-line">      - 3000:3000</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC29" class="blob-code blob-code-inner js-file-line">    volumes:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC30" class="blob-code blob-code-inner js-file-line">      - ./client/var/www:/var/www:cached</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC31" class="blob-code blob-code-inner js-file-line">    working_dir: /var/www/project</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC32" class="blob-code blob-code-inner js-file-line">    command: [&quot;yarn&quot;, &quot;run&quot;, &quot;dev&quot;]</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC33" class="blob-code blob-code-inner js-file-line">    depends_on:</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC34" class="blob-code blob-code-inner js-file-line">      - go</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-docker-compose-2-L35" class="blob-num js-line-number" data-line-number="35"/>
        <td id="file-go-nuxt-mysql-docker-compose-2-LC35" class="blob-code blob-code-inner js-file-line">      - mysql</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/90dc914795166dea1650df951b586b11/raw/c6814e69818891fa2fcb49f398147ca3db7e35fe/go-nuxt-mysql-docker-compose-2" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/90dc914795166dea1650df951b586b11#file-go-nuxt-mysql-docker-compose-2">go-nuxt-mysql-docker-compose-2</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>goのportsとnodeのttyを削除し、nodeのcommandを追加しました。</p>
<h2 id="cloud-run">Cloud Run</h2>
<p>デプロイ用のDockerfileを作成します。開発用のDockerfileに追記しましたが、分けて書いても良いと思います。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/e55976d40aa096b10cef97e3fe391363.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98609749" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-dockerfile-2" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC1" class="blob-code blob-code-inner js-file-line"># 開発</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC2" class="blob-code blob-code-inner js-file-line">FROM golang:latest as dev</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC3" class="blob-code blob-code-inner js-file-line">RUN apt-get update \</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC4" class="blob-code blob-code-inner js-file-line"> &amp;&amp; apt-get install -y vim \</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC5" class="blob-code blob-code-inner js-file-line"> &amp;&amp; curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC6" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC7" class="blob-code blob-code-inner js-file-line"># 本番ビルド用</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC8" class="blob-code blob-code-inner js-file-line">FROM golang:latest as builder</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC9" class="blob-code blob-code-inner js-file-line">WORKDIR /go/src/app/</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC10" class="blob-code blob-code-inner js-file-line">COPY ./src/app .</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC11" class="blob-code blob-code-inner js-file-line">RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build server.go</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC12" class="blob-code blob-code-inner js-file-line">
</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC13" class="blob-code blob-code-inner js-file-line"># 本番</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC14" class="blob-code blob-code-inner js-file-line">FROM alpine:latest as prod</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC15" class="blob-code blob-code-inner js-file-line">EXPOSE 8080</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC16" class="blob-code blob-code-inner js-file-line">WORKDIR /api</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC17" class="blob-code blob-code-inner js-file-line">COPY --from=builder /go/src/app/server .</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-dockerfile-2-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-dockerfile-2-LC18" class="blob-code blob-code-inner js-file-line">CMD [&quot;./server&quot;]</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/e55976d40aa096b10cef97e3fe391363/raw/094c39336bcb540b4f04bdf61248386caac9fda2/go-nuxt-mysql-dockerfile-2" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/e55976d40aa096b10cef97e3fe391363#file-go-nuxt-mysql-dockerfile-2">go-nuxt-mysql-dockerfile-2</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>buildし、Container Registryにpushします。</p>
<pre><code>docker build -t us.gcr.io/go-nuxt-mysql-b35d9/go-nuxt-mysql --target prod ./go/  
docker push us.gcr.io/go-nuxt-mysql-b35d9/go-nuxt-mysql
</code></pre>
<p>GCPのコンソールでCloud Runのサービスを新規作成します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>DB_HOSTは <code>/cloudsql/&lt;project-id&gt;:&lt;region&gt;:&lt;instance-id&gt;</code> です。<br>
<code>/cloudsql/</code>以下は「Cloud SQL 接続」で表示されている文字列をそのまま設定すればOKです。詳しくは公式ドキュメントを参照下さい。</br></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://cloud.google.com/sql/docs/mysql/connect-functions?hl&#x3D;ja#functions_sql_mysql-go"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cloud Functions から Cloud SQL への接続 | Cloud SQL for MySQL | Google Cloud</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/cloud/images/favicons/onecloud/super_cloud.png"><span class="kg-bookmark-author">Google Cloud</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png?hl&#x3D;ja"/></div></a></figure><!--kg-card-begin: markdown--><h2 id="firebase-hosting">Firebase Hosting</h2>
<p>ローカルでNodeのコンテナに入り、<br>
<code>yarn firebase login --no-localhost</code><br>
でFirebaseにログインします。Firebaseのコマンドに<code>yarn</code>を毎回つけるのが地味に面倒なので、Dockerfileを書いてグローバルに追加する等した方が良いかもしれません。</br></br></p>
<p><code>yarn firebase init</code><br>
でプロジェクトを作成し、適当に設定します。デプロイするディレクトリは <code>dist</code> としておきます。</br></p>
<p>自動で作成された<code>firebase.json</code>を、以下のように修正します。</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src="https://gist.github.com/yutakahashi114/30a759144b9ff8bf026536e45669ec29.js"></script>-->
<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css">
<div id="gist98610157" class="gist">
    <div class="gist-file" translate="no">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-go-nuxt-mysql-firebase" class="file my-2">
    
  <div itemprop="text" class="Box-body p-0 blob-wrapper data type-text  ">

      
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L1" class="blob-num js-line-number" data-line-number="1"/>
        <td id="file-go-nuxt-mysql-firebase-LC1" class="blob-code blob-code-inner js-file-line">{</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L2" class="blob-num js-line-number" data-line-number="2"/>
        <td id="file-go-nuxt-mysql-firebase-LC2" class="blob-code blob-code-inner js-file-line">  &quot;hosting&quot;: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L3" class="blob-num js-line-number" data-line-number="3"/>
        <td id="file-go-nuxt-mysql-firebase-LC3" class="blob-code blob-code-inner js-file-line">    &quot;public&quot;: &quot;dist&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L4" class="blob-num js-line-number" data-line-number="4"/>
        <td id="file-go-nuxt-mysql-firebase-LC4" class="blob-code blob-code-inner js-file-line">    &quot;ignore&quot;: [</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L5" class="blob-num js-line-number" data-line-number="5"/>
        <td id="file-go-nuxt-mysql-firebase-LC5" class="blob-code blob-code-inner js-file-line">      &quot;firebase.json&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L6" class="blob-num js-line-number" data-line-number="6"/>
        <td id="file-go-nuxt-mysql-firebase-LC6" class="blob-code blob-code-inner js-file-line">      &quot;**/.*&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L7" class="blob-num js-line-number" data-line-number="7"/>
        <td id="file-go-nuxt-mysql-firebase-LC7" class="blob-code blob-code-inner js-file-line">      &quot;**/node_modules/**&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L8" class="blob-num js-line-number" data-line-number="8"/>
        <td id="file-go-nuxt-mysql-firebase-LC8" class="blob-code blob-code-inner js-file-line">    ],</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L9" class="blob-num js-line-number" data-line-number="9"/>
        <td id="file-go-nuxt-mysql-firebase-LC9" class="blob-code blob-code-inner js-file-line">    &quot;headers&quot;: [</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L10" class="blob-num js-line-number" data-line-number="10"/>
        <td id="file-go-nuxt-mysql-firebase-LC10" class="blob-code blob-code-inner js-file-line">      {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L11" class="blob-num js-line-number" data-line-number="11"/>
        <td id="file-go-nuxt-mysql-firebase-LC11" class="blob-code blob-code-inner js-file-line">        &quot;source&quot;: &quot;/api/**&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L12" class="blob-num js-line-number" data-line-number="12"/>
        <td id="file-go-nuxt-mysql-firebase-LC12" class="blob-code blob-code-inner js-file-line">        &quot;headers&quot;: [</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L13" class="blob-num js-line-number" data-line-number="13"/>
        <td id="file-go-nuxt-mysql-firebase-LC13" class="blob-code blob-code-inner js-file-line">          {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L14" class="blob-num js-line-number" data-line-number="14"/>
        <td id="file-go-nuxt-mysql-firebase-LC14" class="blob-code blob-code-inner js-file-line">            &quot;key&quot;: &quot;Cache-Control&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L15" class="blob-num js-line-number" data-line-number="15"/>
        <td id="file-go-nuxt-mysql-firebase-LC15" class="blob-code blob-code-inner js-file-line">            &quot;value&quot;: &quot;no-cache, no-store, must-revalidate&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L16" class="blob-num js-line-number" data-line-number="16"/>
        <td id="file-go-nuxt-mysql-firebase-LC16" class="blob-code blob-code-inner js-file-line">          }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L17" class="blob-num js-line-number" data-line-number="17"/>
        <td id="file-go-nuxt-mysql-firebase-LC17" class="blob-code blob-code-inner js-file-line">        ]</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L18" class="blob-num js-line-number" data-line-number="18"/>
        <td id="file-go-nuxt-mysql-firebase-LC18" class="blob-code blob-code-inner js-file-line">      }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L19" class="blob-num js-line-number" data-line-number="19"/>
        <td id="file-go-nuxt-mysql-firebase-LC19" class="blob-code blob-code-inner js-file-line">    ],</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L20" class="blob-num js-line-number" data-line-number="20"/>
        <td id="file-go-nuxt-mysql-firebase-LC20" class="blob-code blob-code-inner js-file-line">    &quot;rewrites&quot;: [</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L21" class="blob-num js-line-number" data-line-number="21"/>
        <td id="file-go-nuxt-mysql-firebase-LC21" class="blob-code blob-code-inner js-file-line">      {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L22" class="blob-num js-line-number" data-line-number="22"/>
        <td id="file-go-nuxt-mysql-firebase-LC22" class="blob-code blob-code-inner js-file-line">        &quot;source&quot;: &quot;/api/**&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L23" class="blob-num js-line-number" data-line-number="23"/>
        <td id="file-go-nuxt-mysql-firebase-LC23" class="blob-code blob-code-inner js-file-line">        &quot;run&quot;: {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L24" class="blob-num js-line-number" data-line-number="24"/>
        <td id="file-go-nuxt-mysql-firebase-LC24" class="blob-code blob-code-inner js-file-line">          &quot;serviceId&quot;: &quot;go-nuxt-mysql&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L25" class="blob-num js-line-number" data-line-number="25"/>
        <td id="file-go-nuxt-mysql-firebase-LC25" class="blob-code blob-code-inner js-file-line">          &quot;region&quot;: &quot;us-central1&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L26" class="blob-num js-line-number" data-line-number="26"/>
        <td id="file-go-nuxt-mysql-firebase-LC26" class="blob-code blob-code-inner js-file-line">        }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L27" class="blob-num js-line-number" data-line-number="27"/>
        <td id="file-go-nuxt-mysql-firebase-LC27" class="blob-code blob-code-inner js-file-line">      },</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L28" class="blob-num js-line-number" data-line-number="28"/>
        <td id="file-go-nuxt-mysql-firebase-LC28" class="blob-code blob-code-inner js-file-line">      {</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L29" class="blob-num js-line-number" data-line-number="29"/>
        <td id="file-go-nuxt-mysql-firebase-LC29" class="blob-code blob-code-inner js-file-line">        &quot;source&quot;: &quot;**&quot;,</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L30" class="blob-num js-line-number" data-line-number="30"/>
        <td id="file-go-nuxt-mysql-firebase-LC30" class="blob-code blob-code-inner js-file-line">        &quot;destination&quot;: &quot;/index.html&quot;</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L31" class="blob-num js-line-number" data-line-number="31"/>
        <td id="file-go-nuxt-mysql-firebase-LC31" class="blob-code blob-code-inner js-file-line">      }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L32" class="blob-num js-line-number" data-line-number="32"/>
        <td id="file-go-nuxt-mysql-firebase-LC32" class="blob-code blob-code-inner js-file-line">    ]</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L33" class="blob-num js-line-number" data-line-number="33"/>
        <td id="file-go-nuxt-mysql-firebase-LC33" class="blob-code blob-code-inner js-file-line">  }</td>
      </tr>
      <tr>
        <td id="file-go-nuxt-mysql-firebase-L34" class="blob-num js-line-number" data-line-number="34"/>
        <td id="file-go-nuxt-mysql-firebase-LC34" class="blob-code blob-code-inner js-file-line">}</td>
      </tr>
</table>


  </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/yutakahashi114/30a759144b9ff8bf026536e45669ec29/raw/b43ec855bc9569640b5aa9d7cf686cce678ea7b8/go-nuxt-mysql-firebase" style="float:right">view raw</a>
        <a href="https://gist.github.com/yutakahashi114/30a759144b9ff8bf026536e45669ec29#file-go-nuxt-mysql-firebase">go-nuxt-mysql-firebase</a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>

<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>これで <code>/api/...</code>へのアクセスが全てCloud Runにリダイレクトされます。詳しくは公式ドキュメントを参照下さい。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://firebase.google.com/docs/hosting/cloud-run?hl&#x3D;ja"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cloud Run を使用した動的コンテンツの配信とマイクロサービスのホスティング | Firebase</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/touchicon-180.png"><span class="kg-bookmark-author">Firebase</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/lockup.png"/></div></a></figure><!--kg-card-begin: markdown--><p><code>yarn build</code> でデプロイ用のファイルを作成します。</p>
<p>最後に<br>
<code>yarn firebase deploy</code>でデプロイします。</br></p>
<p>発行されたURLにアクセスすると、ページが表示されます。</p>
<p>以上で全ての設定が完了しました。<br>
セキュリティ関連を何も気にせず作成したので、その辺はもう少し勉強しようと思います。</br></p>
<h2 id="%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D">ハマったところ</h2>
<p>備忘録も兼ねて、主に本番環境にデプロイする時にハマった箇所についていくつか挙げておきます。</p>
<h3 id="cloud-sql-%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1">Cloud SQL への接続情報</h3>
<p>・tcpでなくunix<br>
・ポート番号はセットしない</br></p>
<p>最初、ローカルと同じノリで接続情報を以下のように設定していました。</p>
<pre><code>user:password@tcp(/cloudsql/go-nuxt-mysql-b35d9:us-central1:go-nuxt-mysql:3306)/database
</code></pre>
<p>が、何度試しても接続できず。<br>
正しくは以下になります。</br></p>
<pre><code>user:password@unix(/cloudsql/go-nuxt-mysql-b35d9:us-central1:go-nuxt-mysql)/database
</code></pre>
<p>公式ドキュメントはきちんと読みましょう！</p>
<h3 id="go%E3%81%AE%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB">Goのクロスコンパイル</h3>
<p>・alpine用のビルドには<code>GOOS=linux GOARCH=amd64 CGO_ENABLED=0</code></p>
<p>今回、軽量なイメージを作るためにmulti stage buildを使用し、デプロイ用のbaseイメージにはalpineを使用しました。最初はGoのビルドに以下のコマンドを実行していました。</p>
<pre><code>GOOS=linux GOARCH=amd64 go build server.go
</code></pre>
<p>が、これでCloud Runにデプロイしても動きませんでした。alpineイメージで動かすためには設定が足りなかったようです。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://infraya.work/posts/alpine_with_go-singlebinary/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">alpineイメージにgo build済みのバイナリを載せて実行 | infraya.work</div><div class="kg-bookmark-description">概要 alpineイメージにgo build済みのシングルバイナリだけを載せて動かす結論 alpineで動かすには…go build時に CGO_ENABLED&#x3D;0オプションをつけて、cgo を無効にする必要がある1 &gt; GOOS&#x3D;linux GOARCH&#x3D;amd64 CGO_ENABLED&#x3D;0 go build main.go 目的 alpineイメージにGoのシングルバイナリ一発構成をやってみたかったTCPサーバを作る Goを始めたばかりなので参考サイト見ながら簡素な作りなもの作った1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://infraya.work/fox.png"><span class="kg-bookmark-author">infraya.work</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://infraya.work/fox.png"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build server.go
</code></pre>
<p>これで動くようになりました。</p>
<h3 id="firebase%E3%81%AE%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E8%A8%AD%E5%AE%9A">Firebaseのリダイレクト設定</h3>
<p>・上から順に判定</p>
<p>初めは<code>firebase.json</code>に以下のようなリダイレクトの設定を書いていました。</p>
<pre><code>&quot;rewrites&quot;: [  
    {  
        &quot;source&quot;: &quot;**&quot;,  
        &quot;destination&quot;: &quot;/index.html&quot;  
    },  
    {  
        &quot;source&quot;: &quot;/api/**&quot;,  
        &quot;run&quot;: {  
            &quot;serviceId&quot;: &quot;go-nuxt-mysql&quot;,  
            &quot;region&quot;: &quot;us-central1&quot;  
        }  
    }  
]
</code></pre>
<p>今思うと当然ですが、これだと全てのリクエストが<code>&quot;**&quot;</code>に引っかかり、Cloud Runにリダイレクトされません。ステータスは200で返ってくるのに正常に取得できず、地味に混乱しました。</p>
<p>以下のように逆に書きます。</p>
<pre><code>&quot;rewrites&quot;: [  
    {  
        &quot;source&quot;: &quot;/api/**&quot;,  
        &quot;run&quot;: {  
            &quot;serviceId&quot;: &quot;go-nuxt-mysql&quot;,  
            &quot;region&quot;: &quot;us-central1&quot;  
        }  
    },  
    {  
        &quot;source&quot;: &quot;**&quot;,  
        &quot;destination&quot;: &quot;/index.html&quot;  
    }  
]
</code></pre>
<h3 id="firebase%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5">Firebaseのキャッシュ</h3>
<p>・リクエストヘッダに <code>Cache-Control</code>を追加する</p>
<p>DBのデータは更新しているのに、画面に表示する情報が全く変わりませんでした。Cloud Runへ直接アクセスすると、正常に取得できていました。</p>
<p>どうやらCloud Runへのリクエスト結果がFirebase側でキャッシュされていたようです。</p>
<p>以下のページを参考に、<code>firebase.json</code> でヘッダ情報を追加すると回避できました。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://stackoverflow.com/questions/48589821/firebase-hosting-how-to-prevent-caching-for-the-index-html-of-an-spa"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Firebase hosting: How to prevent caching for the index.html of an SPA</div><div class="kg-bookmark-description">I’m hosting an SPA on firebase where almost all paths get rewritten to index.html. I’m using webpack hash based cache busting, so I want to always prevent caching of my index.html but not any other</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v&#x3D;c78bd457575a"><span class="kg-bookmark-author">Stack Overflow</span><span class="kg-bookmark-publisher">zevdg</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v&#x3D;73d79a89bded"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>&quot;headers&quot;: [  
    {  
        &quot;source&quot;: &quot;/api/**&quot;,  
        &quot;headers&quot;: [  
            {  
                &quot;key&quot;: &quot;Cache-Control&quot;,  
                &quot;value&quot;: &quot;no-cache, no-store, must-revalidate&quot;  
            }  
        ]  
    }  
],
</code></pre>
<h3 id="firebase%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%EF%BC%9F">Firebaseのキャッシュ？</h3>
<p>Firebaseへのデプロイ直後、ブラウザからアクセスすると、APIのレスポンスが404になることが何度かありました。ブラウザのキャッシュを消してもダメでしたが、Cloud Runへ直接アクセスしたり、FirebaseのURL(…firebaseapp.com/api/users 等)に対してローカルからcurlを叩いたりすると正常に取得できました。</p>
<p>しばらく放置した後にリロードすると、正常に取得できるようになっていました。おそらくこれもキャッシュが原因ぽいです。何度か同じ状況を再現できた時に試しましたが、デプロイ後30分くらい待つと正常に取れるようになりました。</p>
<p>回避方法があれば教えていただきたいです。</p>
<h2 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h2>
<p><a href="https://qiita.com/hirotakan/items/698c1f5773a3cca6193e">https://qiita.com/hirotakan/items/698c1f5773a3cca6193e</a><br>
<a href="https://qiita.com/Azizim_A/items/66564b5dc7597717932b">https://qiita.com/Azizim_A/items/66564b5dc7597717932b</a><br>
<a href="https://infraya.work/posts/alpine_with_go-singlebinary/">https://infraya.work/posts/alpine_with_go-singlebinary/</a><br>
<a href="https://ja.nuxtjs.org/guide/installation">https://ja.nuxtjs.org/guide/installation</a><br>
<a href="https://qiita.com/reflet/items/e7c33f84ab43ab237ee4">https://qiita.com/reflet/items/e7c33f84ab43ab237ee4</a><br>
<a href="https://qiita.com/at-946/items/08de3c9d7611f62b1894">https://qiita.com/at-946/items/08de3c9d7611f62b1894</a><br>
<a href="https://qiita.com/Statham/items/046649bff81c00ba275e">https://qiita.com/Statham/items/046649bff81c00ba275e</a><br>
<a href="https://qiita.com/A-Kira/items/f401aea261693c395966">https://qiita.com/A-Kira/items/f401aea261693c395966</a><br>
<a href="https://qiita.com/moaikids/items/f7c0db2c98425094ef10">https://qiita.com/moaikids/items/f7c0db2c98425094ef10</a><br>
<a href="https://firebase.google.com/docs/hosting/full-config#rewrites">https://firebase.google.com/docs/hosting/full-config#rewrites</a><br>
<a href="https://stackoverflow.com/questions/48589821/firebase-hosting-how-to-prevent-caching-for-the-index-html-of-an-spa">https://stackoverflow.com/questions/48589821/firebase-hosting-how-to-prevent-caching-for-the-index-html-of-an-spa</a><br>
<a href="https://firebase.google.com/docs/hosting/cloud-run?hl=ja">https://firebase.google.com/docs/hosting/cloud-run?hl=ja</a><br>
<a href="https://cloud.google.com/functions/docs/sql?hl=ja#functions_sql_mysql-go">https://cloud.google.com/functions/docs/sql?hl=ja#functions_sql_mysql-go</a></br></br></br></br></br></br></br></br></br></br></br></br></p>
<!--kg-card-end: markdown--></link></link></link></link></link></link></link></link></link></link></link>]]></content:encoded></item><item><title><![CDATA[Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う]]></title><description><![CDATA[Top down operator precedence(再帰下降構文解析 Pratt
Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う
Goで作る インタプリタ
Go言語でつくるインタプリタ | Thorsten Ball, 設樂 洋爾 |本 | 通販 | AmazonAmazonでThorsten Ball, 設樂
洋爾のGo言語でつくるインタプリタ。アマゾンならポイント還元本が多数。Thorsten Ball, 設樂
洋爾作品ほか、お急ぎ便対象商品は当日お届けも可能。またGo言語でつくるインタプリタもアマゾン配送商品なら通常配送無料。AmazonThorsten Ball
[https://www.amazon.co.jp/dp/4873118220/ref=cm_sw_r_tw_dp_U_x_E91IDbNW6D0K4]

死ぬほどおすすめなので是非、

Goの基礎とTDDの基礎、簡単なデザインパターンの理解があるとよりよい。むしろそれらを知っている人にかなりおすすめの本である。

この本に出てくる Pratt ParserによるAS]]></description><link>https://tech.anti-pattern.co.jp/top-down-operator-precedence-zai-gui-xia-jiang-gou-wen-jie-xi-pratt-parser-niokeruexpression-shi-nojie-xi-ast-chou-xiang-gou-wen-mu-gou-zhu-chu-li-wozhui-u/</link><guid isPermaLink="false">Ghost__Post__60fa7eeb3986b000013a3a22</guid><category><![CDATA[Go]]></category><category><![CDATA[golang]]></category><category><![CDATA[interpreter]]></category><category><![CDATA[TopDownOperatorPrecednce]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 25 Sep 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_eDvHceZDIDp2m1XbK8RFJg.png" medium="image"/><content:encoded><![CDATA[<h3 id="top-down-operator-precedence%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90-pratt-parser%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bexpression%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%9E%90%E3%80%81ast%E6%8A%BD%E8%B1%A1%E6%A7%8B%E6%96%87%E6%9C%A8%E6%A7%8B%E7%AF%89-%E5%87%A6%E7%90%86%E3%82%92%E8%BF%BD%E3%81%86">Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う</h3><h3 id="go%E3%81%A7%E4%BD%9C%E3%82%8B-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF">Goで作る インタプリタ</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.amazon.co.jp/dp/4873118220/ref&#x3D;cm_sw_r_tw_dp_U_x_E91IDbNW6D0K4"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Go言語でつくるインタプリタ | Thorsten Ball, 設樂 洋爾 |本 | 通販 | Amazon</div><div class="kg-bookmark-description">AmazonでThorsten Ball, 設樂 洋爾のGo言語でつくるインタプリタ。アマゾンならポイント還元本が多数。Thorsten Ball, 設樂 洋爾作品ほか、お急ぎ便対象商品は当日お届けも可能。またGo言語でつくるインタプリタもアマゾン配送商品なら通常配送無料。</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">Amazon</span><span class="kg-bookmark-publisher">Thorsten Ball</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://fls-fe.amazon.co.jp/1/batch/1/OP/A1VC38T7YXB528:355-7793533-7478131:899XFQE92VHK1KCJXXJ6$uedata&#x3D;s:%2Frd%2Fuedata%3Fstaticb%26id%3D899XFQE92VHK1KCJXXJ6%26pty%3DError%26spty%3DPageNotFound%26pti%3D:1000" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_eDvHceZDIDp2m1XbK8RFJg.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/><p/><p>死ぬほどおすすめなので是非、</p><p>Goの基礎とTDDの基礎、簡単なデザインパターンの理解があるとよりよい。むしろそれらを知っている人にかなりおすすめの本である。</p><h4 id="%E3%81%93%E3%81%AE%E6%9C%AC%E3%81%AB%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B-pratt-parser%E3%81%AB%E3%82%88%E3%82%8Bast%E3%81%AE%E6%A7%8B%E7%AF%89%E3%81%AE%E7%90%86%E8%A7%A3%E3%81%8C%E5%A4%9A%E5%B0%91%E9%9B%A3%E8%A7%A3%E3%81%AB%E6%84%9F%E3%81%98%E3%81%9F%E3%81%AE%E3%81%A7%E3%80%81%E5%87%A6%E7%90%86%E3%82%92%E5%9B%B3%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E8%BF%BD%E3%81%A3%E3%81%A6%E3%81%84%E3%81%93%E3%81%86%E3%81%A8%E6%80%9D%E3%81%86%E3%80%82">この本に出てくる Pratt ParserによるASTの構築の理解が多少難解に感じたので、処理を図とともに追っていこうと思う。</h4><h3 id="%E5%89%8D%E6%8F%90">前提</h3><p>lexical Analyze（字句解析）は完了している。</p><p>今回作っている言語には、</p><p>Prefix Operator(前置演算子)とInfix Operator(中置演算子)は存在し、</p><p>Postfix Operator(後置演算子）は存在しない。</p><h3 id="top-down-operator-precedence-%E3%81%A8%E3%81%AF">Top down operator precedence とは?</h3><p><em>&gt;情報科学の分野において、 </em><strong><em>Prattパーサ</em></strong><em> は文法規則の代わりにトークンの意味ごとに関連付けを作るように改良された</em><a href="https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E4%B8%8B%E9%99%8D%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90" rel="noopener"><em>再帰下降構文解析</em></a><em>のひとつ。 </em><a href="https://ja.wikipedia.org/wiki/Pratt%E3%83%91%E3%83%BC%E3%82%B5" rel="noopener"><em>https://ja.wikipedia.org/wiki/Prattパーサ</em></a><em> より</em></p><p>簡単に説明するとTokeのタイプごとに構文解析の関数を呼び出し、Abstruct Syntax Tree(抽象構文木)(以下 AST)を形成する</p><h3 id="expression-%E5%BC%8F%E3%81%A8%E3%81%AF">Expression (式)とは</h3><p>名前の通り式のことを指す。</p><p>例: <strong>3+ 2+ 1;</strong></p><p><strong>8</strong> 単体でも式となる。</p><p>ちなみに、let x = 5 + 3 + 5;の場合は 式が 5 + 3 + 5;であり</p><p>文が let x = 5 + 3 + 5; となる。</p><h4 id="%E4%BB%8A%E5%9B%9E%E3%81%AEast%E3%81%AF%E3%81%93%E3%82%8C%E3%82%92-321%E3%81%A8%E8%A1%A8%E7%8F%BE%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82">今回のASTはこれを ((3+2)+1)と表現したいのである。</h4><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*SA7D_V7eKkzxCsF45YQhKw.png" class="kg-image" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う" loading="lazy"/></figure><p>今回見ていく例は</p><p><strong>-3 + 10 * 2 + 1;</strong></p><p>の構文解析となる。</p><p><strong>(((-3) + (10 * 2)) + 1);を表すASTを作っていく。</strong></p><p>図式すると。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://cdn-images-1.medium.com/max/1200/1*eDvHceZDIDp2m1XbK8RFJg.png" class="kg-image" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う" loading="lazy"/></figure><h3 id="main-codes">Main Codes</h3><h4 id="precedence-%E5%84%AA%E5%85%88%E5%BA%A6">Precedence (優先度)</h4><p>例： +(SUM)より *(PRODUCT)のほうが数値が高いので優先度が高い。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/4a9852c5b9c7c44dde9e1a709c7ab75b"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go - precedence.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">const (
	LOWEST iota + 1 
	EQUALS          // ==
	LESSGRETER      // &gt; or &lt;
	SUM             // +
	PRODUCT         // *
	PREFIX          // -X or !X
	CALL            // myFunction(X)
)
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/bafc9452d3b921a586015d0ce82cb737"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] token precedences</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] token precedences - tokenprecedences.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">var precedences = map[token.TokenType]int{
	token.EQ:       EQUALS,
	token.NOT_EQ:   EQUALS,
	token.LT:       LESSGRETER,
	token.GT:       LESSGRETER,
	token.PLUS:     SUM,
	token.MINUS:    SUM,
	token.SLASH:    PRODUCT,
	token.ASTERISK: PRODUCT,
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="%E6%9C%80%E5%88%9D%E3%81%AB%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89">最初に呼ばれるコード</h4><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/57fcf2b867adb0a940f8918dff385470"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] parseExpressionStatement.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] parseExpressionStatement.go - parseExpressionStatement.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a><figcaption>[</figcaption></figure><!--kg-card-begin: markdown--><pre><code class="language-go">
func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement {
	stmt := &amp;ast.ExpressionStatement{Token: p.curToken}

	stmt.Expression = p.parseExpression(LOWEST)

	if p.peekTokenIs(token.SEMICOLON) {
		p.nextToken()
	}

	return stmt
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/4ae9c18205aaa33128d65df9c5cf306c"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]parseExpression.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]parseExpression.go - parseExpression.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code class="language-go">func (p *Parser) parseExpression(precedence int) ast.Expression {
	prefix := p.prefixParseFns[p.curToken.Type]
	if prefix == nil {
		p.noPrefixParseFnError(p.curToken.Type)
		return nil
	}
	leftExp := prefix()

	for !p.peekTokenIs(token.SEMICOLON) &amp;&amp; precedence &lt; p.peekPrecedence() {
		infix := p.infixParseFns[p.peekToken.Type]
		if infix == nil {
			return leftExp
		}

		p.nextToken()
		leftExp = infix(leftExp)
	}
	return leftExp
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/07c088ac44e4aaf9d6ddd184657d2cc3"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.goparseInfixExpression.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.goparseInfixExpression.go - parseInfixExpression.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
	expression := &amp;ast.InfixExpression{
		Token:    p.curToken,
		Operator: p.curToken.Literal,
		Left:     left,
	}

	precedence := p.curPrecedence()
	p.nextToken()
	expression.Right = p.parseExpression(precedence)

	return expression
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/15318939da38846f73a562affc8a00c3"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parsePrefixExpression.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parsePrefixExpression.go - parsePrefixExpression.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>func (p *Parser) parsePrefixExpression() ast.Expression {
	expression := &amp;ast.PrefixExpression{
		Token:    p.curToken,
		Operator: p.curToken.Literal,
	}

	p.nextToken()

	expression.Right = p.parseExpression(PREFIX)

	return expression
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/c91d7f5f9480da4c54058846663a1962"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parseIntegerLiteral.go</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う]precedence.go parseIntegerLiteral.go - parseIntegerLiteral.go</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>func (p *Parser) parseIntegerLiteral() ast.Expression {
	lit := &amp;ast.IntegerLiteral{Token: p.curToken}

	value, err := strconv.ParseInt(p.curToken.Literal, 0, 64)
	if err != nil {
		msg := fmt.Sprintf(&quot;could not parse %q as integer&quot;, p.curToken.Literal)
		p.errors = append(p.errors, msg)
		return nil
	}
	lit.Value = value
	return lit
}
</code></pre>
<!--kg-card-end: markdown--><p>PeekTokenは次のToken</p><p>curTokenは現在のTokenを見る</p><p>ちなみに <code>3 + 2 + 1;</code> を動かすと</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/kooooohe/4da4341e2c6d2c2989859bf373874a98"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] called functions</div><div class="kg-bookmark-description">[Blog][TopDownOperatorPrecedence(再帰下降構文解析)におけるExpression(式)の解析処理を追う] called functions - called functions</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う"/></div></a></figure><!--kg-card-begin: markdown--><pre><code>BEGIN parseExpresssionStatement
	BEGIN parseExpresssion
		BEGIN parseIntegerLiteral
		END parseIntegerLiteral
		BEGIN parseInfixExpression
			BEGIN parseExpresssion
				BEGIN parseIntegerLiteral
				END parseIntegerLiteral
			END parseExpresssion
		END parseInfixExpression
		BEGIN parseInfixExpression
			BEGIN parseExpresssion
				BEGIN parseIntegerLiteral
				END parseIntegerLiteral
			END parseExpresssion
		END parseInfixExpression
	END parseExpresssion
END parseExpresssionStatement
</code></pre>
<!--kg-card-end: markdown--><p>こんな順番で関数が呼ばれASTが作成される。</p><p>結論から言うと、このgifの流れでASTが作成されていく</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*225yN9t3tAIlFl6rsUapyA.gif" class="kg-image" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う" loading="lazy"/></figure><p>では実際に<strong>3 + 10 * 2 + 1; </strong>を解析しASTを作っていく処理の流れを見ていく。実際に関数の呼ばれる順番は以下の通りとなる</p><p><code>parseExpression</code> が読んでいる <code>paseIndexExpression</code> などが <code>parseExpression</code> を読んでいる点に注目してほしい。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*ml5_oyjI3goD6gSDPzkwaA.png" class="kg-image" alt="Top down operator precedence(再帰下降構文解析 Pratt Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う" loading="lazy"/></figure><p>実際にどの箇所の <code>parseExpression</code> が呼ばれいているかこんがらがらないようにIDとして <code>parseExpression</code> に数値を降っておいた。</p><p>以下のSlideに細かい流れは乗ってある。</p><figure class="kg-card kg-embed-card"><iframe id="talk_frame_556716" src="//speakerdeck.com/player/a367a5e9e5dd4c89a8fb4c4d0a8a9bd0" width="710" height="399" style="border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen" mozallowfullscreen="true" webkitallowfullscreen="true"/>
</figure><p/>]]></content:encoded></item><item><title><![CDATA[Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた]]></title><description><![CDATA[~OBON編~

【やりたいこと】
お手軽に市場やサービスの調査をしたい！
そんなに時間もかけたくない！

何よりスプレッドシートの関数使ってみたい！

【できたもの】
調査対象のURLからテーブル形式のデータを抽出して表にまとめてくれるやつ。

サンプルとして「全国法人情報データベース [https://xn--zcklx7evic7044c1qeqrozh7c.com/]
」の弊社ページを対象にしてみました。



式は以下な感じ。

\=TRANSPOSE(INDEX(IMPORTHTML(\[対象URL\],”table”,\[何個目のtableか\]),\[対象行\],\[対象列\]))


【解説】
・IMPORTHTML(https://support.google.com/docs/answer/3093339?hl=ja)

対象のURLからデータを取ってきてくれます。データ形式をlistかtableか指定するのですが、今回はtableで、そのサイト上最初のtableです。

\=IMPORTHTML(対象URL,”table”,0)


これだけ書くとtableの状]]></description><link>https://tech.anti-pattern.co.jp/using-multiple-google-spreadsheet-summarize-website-scraping-results/</link><guid isPermaLink="false">Ghost__Post__61013eff3986b000013a3e83</guid><category><![CDATA[GoogleSpreadSheet]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 13 Aug 2019 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/gas-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/gas-1-1.png" alt="Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた"/><p>~OBON編~</p>
<h2 id="%E3%80%90%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8%E3%80%91">【やりたいこと】</h2>
<p>お手軽に市場やサービスの調査をしたい！<br>
そんなに時間もかけたくない！</br></p>
<p>何よりスプレッドシートの関数使ってみたい！</p>
<h2 id="%E3%80%90%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE%E3%80%91">【できたもの】</h2>
<p>調査対象のURLからテーブル形式のデータを抽出して表にまとめてくれるやつ。</p>
<p>サンプルとして「<a href="https://xn--zcklx7evic7044c1qeqrozh7c.com/"><strong>全国法人情報データベース</strong></a>」の弊社ページを対象にしてみました。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/gas-1.png" alt="Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた" loading="lazy"/></p>
<p>式は以下な感じ。</p>
<pre><code>\=TRANSPOSE(INDEX(IMPORTHTML(\[対象URL\],”table”,\[何個目のtableか\]),\[対象行\],\[対象列\]))
</code></pre>
<h2 id="%E3%80%90%E8%A7%A3%E8%AA%AC%E3%80%91">【解説】</h2>
<p>・IMPORTHTML(<a href="https://support.google.com/docs/answer/3093339?hl=ja">https://support.google.com/docs/answer/3093339?hl=ja</a>)</p>
<p>対象のURLからデータを取ってきてくれます。データ形式をlistかtableか指定するのですが、今回はtableで、そのサイト上最初のtableです。</p>
<pre><code>\=IMPORTHTML(対象URL,”table”,0)
</code></pre>
<p>これだけ書くとtableの状態でデータが取れます。<br>
これだと比較とかソートとかしにくいので、もう少し加工していきましょう。</br></p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/gas-2.png" alt="Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた" loading="lazy"/></p>
<p>・INDEX(<a href="https://support.google.com/docs/answer/3098242?hl=ja">https://support.google.com/docs/answer/3098242?hl=ja</a>)</p>
<p>INDEX関数を使って「項目」の列でなく「内容」の列を取得しましょう。</p>
<pre><code>\=INDEX(IMPORTHTML(対象URL,”table”,0),0,2)
</code></pre>
<p>これで2列目の内容をマルッと取ってくることができます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/gas-3.png" alt="Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた" loading="lazy"/></p>
<p>・TRANSPOSE(<a href="https://support.google.com/docs/answer/3094262?hl=ja">https://support.google.com/docs/answer/3094262?hl=ja</a>)</p>
<p>比較したりする時に、同じ行にデータが並んでいて欲しいので、TRANSPOSE関数で行と列を入れ替えてあげます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/gas-4.png" alt="Googleスプレッドシートの関数を複数使ってWebサイトのスクレイピング結果を表にまとめてみた" loading="lazy"/></p>
<p>うん！</p>
<p>こちらからは以上です！</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Laravel6をCloud RunでServerlessで動かす]]></title><description><![CDATA[
コスパが良いインフラを作るのが好きすぎるので、

Laravel6とCloud Runを使いServerlessにJust In Timeで動く Laravelを作って見ました。

Laravel
今回はLaravel6を使用。

いつもはNginxとLaravelでコンテナを分けて、それらが連携する形で動かすのですが。

今回は、Cloud Runの特性上1コンテナしか扱えないということで、

Apache & Laravel の組み合わせて作っていく。

Dockerfile
FROM composer:latest as build
WORKDIR /app
RUN composer create-project --prefer-dist laravel/laravel blog
FROM php:7.3-apacheEXPOSE 8080
COPY --from=build /app /var/www/COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
RUN chmod 777 -R /v]]></description><link>https://tech.anti-pattern.co.jp/laravel6wocloud-rundeserverlessdedong-kasu/</link><guid isPermaLink="false">Ghost__Post__60fa81623986b000013a3a5a</guid><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Cloud Run]]></category><category><![CDATA[GCP]]></category><category><![CDATA[Apache]]></category><category><![CDATA[Serverless]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Thu, 25 Jul 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_eX1HQKkSdXZbn6szEW5vBA.png" medium="image"/><content:encoded><![CDATA[<h3/><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_eX1HQKkSdXZbn6szEW5vBA.png" alt="Laravel6をCloud RunでServerlessで動かす"/><p>コスパが良いインフラを作るのが好きすぎるので、</p><p>Laravel6とCloud Runを使いServerlessにJust In Timeで動く Laravelを作って見ました。</p><h3 id="laravel">Laravel</h3><p>今回はLaravel6を使用。</p><p>いつもはNginxとLaravelでコンテナを分けて、それらが連携する形で動かすのですが。</p><p>今回は、Cloud Runの特性上1コンテナしか扱えないということで、</p><p>Apache &amp; Laravel の組み合わせて作っていく。</p><h3 id="dockerfile">Dockerfile</h3><!--kg-card-begin: markdown--><pre><code>FROM composer:latest as build
WORKDIR /app
RUN composer create-project --prefer-dist laravel/laravel blog
FROM php:7.3-apacheEXPOSE 8080
COPY --from=build /app /var/www/COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
RUN chmod 777 -R /var/wwwRUN echo &quot;Listen 8080&quot; &gt;&gt; /etc/apache2/ports.conf
RUN chown -R www-data:www-data /var/www

</code></pre>
<!--kg-card-end: markdown--><p>できる限り小さいimageにしたいため、composerはMulti Stage Buildを使い必要なライブラリの中身だけをDeploy Imageに含めるようにした。</p><p>あとはCloud Runは8080ポートで受けるコンテナである必要があるため、それ用に設定していく。</p><h4 id="000-defaultconf">000-default.conf</h4><!--kg-card-begin: markdown--><pre><code>&lt;VirtualHost *:8080&gt;

ServerAdmin webmaster@localhost
    DocumentRoot /var/www/blog/public
    
ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost&gt;
</code></pre>
<!--kg-card-end: markdown--><h4 id="docker-composeyml">docker-compose.yml</h4><!--kg-card-begin: markdown--><pre><code>version: &quot;3.7&quot;
  services:
    php:
      build:
        context: .
      ports:
        - 8080:8080
</code></pre>
<!--kg-card-end: markdown--><p>ローカルで挙動を確認したいときはこのようなdocker-compose.ymlファイルを書いておいて、確認する。</p><h3 id="gcr%E3%81%ABpush">GCRにPUSH</h3><!--kg-card-begin: markdown--><p><code>gcloud builds submit --tag gcr.io/YOUR-PROJECT-ID/laravel-cloud-run</code></p>
<!--kg-card-end: markdown--><p>Dockerfileと同一Dirで上記コマンドを実行してGCRにImageをpushする。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*wlBQwGwrUu6MaJK2G61Tpw.png" class="kg-image" alt="Laravel6をCloud RunでServerlessで動かす" loading="lazy"/></figure><h3 id="cloud-run%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">Cloud Runにデプロイ</h3><p>これで準備完了。</p><p>あとはCloud Runにデプロイするだけ、</p><p>Image URLとRegion、Authなしでアクセスできるように設定しておく。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*IAoDlRYt6BqrSg1G0GVC4A.png" class="kg-image" alt="Laravel6をCloud RunでServerlessで動かす" loading="lazy"/></figure><p>そして、出てくるURLにアクセスすると…</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*eX1HQKkSdXZbn6szEW5vBA.png" class="kg-image" alt="Laravel6をCloud RunでServerlessで動かす" loading="lazy"/></figure><p>表示できました。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*KpnK21IIADQVI7kZCqrLyw.gif" class="kg-image" alt="Laravel6をCloud RunでServerlessで動かす" loading="lazy"/></figure><p>コールドスタンバイからのアクセスも申し分ない。</p><h3 id="%E9%96%8B%E7%99%BA%E8%80%85kit%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F">開発者Kit作りました</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kooooohe/LaravelOnCloudRunDevKit"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kooooohe/LaravelOnCloudRunDevKit: This is a kit to deploy and develop Laravel on Cloud run</div><div class="kg-bookmark-description">This is a kit to deploy and develop Laravel on Cloud run - GitHub - kooooohe/LaravelOnCloudRunDevKit: This is a kit to deploy and develop Laravel on Cloud run</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" alt="Laravel6をCloud RunでServerlessで動かす"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kooooohe</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/864dbe0c62a1236cc922d435939ecb14af33fb8b279f347454f69075a9f93af1/kooooohe/LaravelOnCloudRunDevKit" alt="Laravel6をCloud RunでServerlessで動かす"/></div></a></figure><p/><p>Laravel を Cloud Runで動かすための開発者Kitを作りました。</p><p>もっとCloud Runが世の中に広まりますように。</p>]]></content:encoded></item><item><title><![CDATA[Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する]]></title><description><![CDATA[Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する
下準備
reCAPTCHAreCAPTCHA is a security service that protects your websites from fraud
and abuse.reCAPTCHA [https://www.google.com/recaptcha/about/]

から登録をする。（ローカル環境で実行したければ、ローカルで動かす用のドメインを登録する）

hostsに

127.0.0.1 koooohe.development

と書いてkooooohe.developmentを登録するなど。

.env
.envに取得した、SITE_KEYとSECRET_KEYを書いていく。

MIX_RECAPTCHA_KEY=XXXXXX
RECAPTCHA_SECRET=XXXXXX


MIXというprefixをつけておくと、Vue.jsからも読み込めるようになる。

Compiling Assets (Mix) - Laravel - The PHP Framework]]></description><link>https://tech.anti-pattern.co.jp/laravel5-8-vue-js-huan-jing-nigoogle-recaptcha-v2woshi-zhuang-suru/</link><guid isPermaLink="false">Ghost__Post__60fa77ac3986b000013a3971</guid><category><![CDATA[PHP]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[reCAPCHA]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Tue, 09 Jul 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_qH5wPVMTKyBw7tA0A-2urg.png" medium="image"/><content:encoded><![CDATA[<h3 id="laravel58-vuejs-%E7%92%B0%E5%A2%83%E3%81%ABgoogle-recaptcha-v2%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B">Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する</h3><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*qH5wPVMTKyBw7tA0A-2urg.png" class="kg-image" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する" loading="lazy"/></figure><h3 id="%E4%B8%8B%E6%BA%96%E5%82%99">下準備</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.google.com/recaptcha/about/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">reCAPTCHA</div><div class="kg-bookmark-description">reCAPTCHA is a security service that protects your websites from fraud and abuse.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.google.com/recaptcha/about/images/favicon.png" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する"><span class="kg-bookmark-author">reCAPTCHA</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.google.com/recaptcha/about/images/reCAPTCHA-enterprise.png" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する"/></div></a></figure><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_qH5wPVMTKyBw7tA0A-2urg.png" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する"/><p/><p>から登録をする。（ローカル環境で実行したければ、ローカルで動かす用のドメインを登録する）</p><p>hostsに</p><p>127.0.0.1 koooohe.development</p><p>と書いてkooooohe.developmentを登録するなど。</p><h3 id="env">.env</h3><p>.envに取得した、SITE_KEYとSECRET_KEYを書いていく。</p><!--kg-card-begin: markdown--><pre><code>MIX_RECAPTCHA_KEY=XXXXXX
RECAPTCHA_SECRET=XXXXXX
</code></pre>
<!--kg-card-end: markdown--><p>MIXというprefixをつけておくと、Vue.jsからも読み込めるようになる。</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://laravel.com/docs/5.7/mix#environment-variables"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Compiling Assets (Mix) - Laravel - The PHP Framework For Web Artisans</div><div class="kg-bookmark-description"/><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://laravel.com/img/favicon/apple-touch-icon.png" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する"><span class="kg-bookmark-author">Laravel</span></img></div></div><div class="kg-bookmark-thumbnail"><img src="https://laravel.com/img/logomark.min.svg" alt="Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する"/></div></a></figure><p/><h3 id="vuejs">Vue.js</h3><h4 id="recaptcha%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B">reCAPTCHAの情報を取得する</h4><!--kg-card-begin: markdown--><pre><code class="language-php">recaptcha_site_key() {
  return process.env.MIX_RECAPTCHA_KEY;
}

</code></pre>
<!--kg-card-end: markdown--><p>といった感じで、.envの内容を取得する。</p><p>そして、recaptchaをVue.jsで使うためのpluginをinstall</p><!--kg-card-begin: markdown--><p><code>yarn add vue-recaptcha</code></p>
<!--kg-card-end: markdown--><p>created methodで最初に、reCAPRCHA必要な情報を読み込むscriptタグを作成</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">components: { VueRecaptcha },
created() {        
  let recaptchaScript = document.createElement('script');  
  recaptchaScript.setAttribute('src','https://www.google.com/recaptcha/api.js?onload=vueRecaptchaApiLoaded&amp;render=explicit');
  document.head.appendChild(recaptchaScript); 
},
</code></pre>
<!--kg-card-end: markdown--><p>そして、HTMLを記述</p><!--kg-card-begin: markdown--><pre><code class="language-html">&lt;template&gt;    
  &lt;vue-recaptcha class=&quot;g-recaptcha&quot;
                 ref=&quot;recaptcha&quot;     
                 :sitekey=&quot;recaptcha_site_key&quot;
                 @verify=&quot;onVerify&quot;
                 @expired=&quot;onExpired&quot;/&gt;
&lt;/template&gt;
</code></pre>
<!--kg-card-end: markdown--><p>そして、ライブラリで用意されているmethodを準備する。</p><p>このrecaptcha_tokenをサーバに投げるのである。</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">data() {
  return {    recaptcha_token: '',  }
  },
  methods: {
  onVerify(response) {
  this.recaptcha_token = response;
  },
  onExpired() {
    this.recaptcha_token = ''; //レスポンスのトークンを空に戻す
  },
  resetRecaptcha() {
  this.$refs.recaptcha.reset();
  }}
</code></pre>
<!--kg-card-end: markdown--><p>POSTはこんな感じで適当に各自の実装に合わせてください。</p><p>このtokenとは別に本来ならpasswordとemailなども送ると思います。</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">axios
.post('/api/login', {token:this.recaptcha_token})
.then(response =&gt; {})axios
.post('/api/login', {token:this.recaptcha_token})
.then(response =&gt; {})

</code></pre>
<!--kg-card-end: markdown--><h3 id="laravel">Laravel</h3><h4 id="guzzle%E3%82%92install">Guzzleをinstall</h4><!--kg-card-begin: markdown--><p><code>composer require guzzlehttp/guzzle</code></p>
<!--kg-card-end: markdown--><p/><h3 id="appvalidationrecaptchaphp%E3%82%92%E4%BD%9C%E6%88%90">app/Validation/ReCaptcha.phpを作成</h3><p>これで、validtionをしていく。</p><!--kg-card-begin: markdown--><pre><code class="language-php">&lt;?phpnamespace App\Validators;use GuzzleHttp\Client;
  class ReCaptcha{
    public function validate($attribute, $value, $parameters, $validator)
    {
        $client = new Client;
        $response = $client-&gt;post(
            'https://www.google.com/recaptcha/api/siteverify',
            [
                'form_params' =&gt;
                [
                    'secret' =&gt; env('RECAPTCHA_SECRET'),
                    'response' =&gt; $value
                ]
            ]
        );
        $body = json_decode((string) $response-&gt;getBody());
        return $body-&gt;success;
    }
}
</code></pre>
<!--kg-card-end: markdown--><h4 id="appprovidersappserviceproviderphp%E3%81%AB%E8%BF%BD%E5%8A%A0">app/Providers/AppServiceProvider.phpに追加</h4><!--kg-card-begin: markdown--><pre><code>&lt;?phpnamespace App\Providers;use Illuminate\Support\ServiceProvider;
useApp\Validation\CustomValidator;
class AppServiceProvider
extends ServiceProvider{
  /**
  * Bootstrap any application services.
  *
  * @return void
  */
  public function boot()
  {
    Validator::extendImplicit('recaptcha','App\\Validators\\ReCaptcha@validate');
  }_/**
  * Register any application services.
  *
  * @return void
  */
  public function register()
  {
    //
  }}
</code></pre>
<!--kg-card-end: markdown--><p>extendではなく、extedImplictを使うことによって、暗黙のrequiredになる。(valueが空でもこの関数が呼ばれる）</p><h4 id="rule%E3%82%92%E8%BF%BD%E5%8A%A0">Ruleを追加</h4><!--kg-card-begin: markdown--><pre><code class="language-php">/**
*
Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
  return [
    'token' =&gt; [
      'recaptcha'
    ]
  ];
}
</code></pre>
<!--kg-card-end: markdown--><p>もしうまく動かなければ</p><!--kg-card-begin: markdown--><p><code>compser dumpautoload</code></p>
<!--kg-card-end: markdown--><p>を実行する。</p><p>参考</p><blockquote><a href="https://laravel.com/docs/5.7/mix#environment-variables" rel="nofollow noopener noopener noopener"><em>https://laravel.com/docs/5.7/mix#environment-variables</em></a><br><a href="https://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5" rel="nofollow noopener"><em>https://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5</em></a><br><a href="https://codeday.me/jp/qa/20190301/341325.html" rel="nofollow noopener noopener noopener"><em>https://codeday.me/jp/qa/20190301/341325.html</em></a><br><a href="https://blog.capilano-fw.com/?p=3545" rel="nofollow noopener noopener noopener"><em>https://blog.capilano-fw.com/?p=3545</em></a><br><a href="https://medium.com/@dennissmink/laravel-google-recaptcha-a0e2d8b2d03b" rel="nofollow noopener"><em>https://medium.com/@dennissmink/laravel-google-recaptcha-a0e2d8b2d03b</em></a></br></br></br></br></blockquote>]]></content:encoded></item><item><title><![CDATA[AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話]]></title><description><![CDATA[Cloud9を使ってみたい
気軽にアプリを作ったりなんだりしたいときに、
なんとなく自分の環境にはあんまりを手を加えたくない上、
他の人にも見せたいなと思った時に便利そうなので調べてみました。

今回の環境とかは下記の通り。

 * t2.micro (1 GiB RAM + 1 vCPU)
 * Amazon Linux
 * PHP 5.6.40
 * Laravel Framework 5.4.36

AWSのアカウントを作ったりするところは割愛しますが、



こんな



感じで



ぽちぽちとお好きなものを指定していくと



もうできます！！！


--------------------------------------------------------------------------------

Laravelをインストールしてみる
Composer

今回Composerを使うので、まずは使える状態にしましょう。
下記を参照してください。

https://getcomposer.org/doc/00-intro.md

Laravel5.4

Comp]]></description><link>https://tech.anti-pattern.co.jp/aws-cloud9-php5-6-laravel5-4/</link><guid isPermaLink="false">Ghost__Post__6101395a3986b000013a3e3c</guid><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Cloud9]]></category><dc:creator><![CDATA[YukiOzasa]]></dc:creator><pubDate>Tue, 11 Jun 2019 11:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/aws-cloud9-1-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="cloud9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%84">Cloud9を使ってみたい</h2>
<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/aws-cloud9-1-1.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話"/><p>気軽にアプリを作ったりなんだりしたいときに、<br>
なんとなく自分の環境にはあんまりを手を加えたくない上、<br>
他の人にも見せたいなと思った時に便利そうなので調べてみました。</br></br></p>
<p>今回の環境とかは下記の通り。</p>
<ul>
<li>t2.micro (1 GiB RAM + 1 vCPU)</li>
<li>Amazon Linux</li>
<li>PHP 5.6.40</li>
<li>Laravel Framework 5.4.36</li>
</ul>
<p>AWSのアカウントを作ったりするところは割愛しますが、</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-1.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>こんな</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-2.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>感じで</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-3.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>ぽちぽちとお好きなものを指定していくと</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-4.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>もうできます！！！</p>
<hr>
<h2 id="laravel%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">Laravelをインストールしてみる</h2>
<p><strong>Composer</strong></p>
<p>今回Composerを使うので、まずは使える状態にしましょう。<br>
下記を参照してください。</br></p>
<p><a href="https://getcomposer.org/doc/00-intro.md">https://getcomposer.org/doc/00-intro.md</a></p>
<p><strong>Laravel5.4</strong></p>
<p>Composerを入れたら次にLaravelのインストールをします。</p>
<p>今回はなんとなくPHPのバージョンを上げないままにしておくので、推奨されているVer5.4をインストールします。</p>
<p>下記を参考にしつつ、</p>
<p><a href="https://getcomposer.org/doc/00-intro.md">https://getcomposer.org/doc/00-intro.md</a></p>
<p><code>composer create-project — prefer-dist laravel/laravel myApp “5.4.\*”</code></p>
<p>と打ち込みますと、</p>
<p><code>Your requirements could not be resolved to an installable set of packages.</code></p>
<p>とエラーが出てしまうので、php56-mbstringをインストールします。</p>
<p><code>sudo yum install php56-mbstring</code></p>
<p>ここでもう一度先ほどのcomposerコマンドを打つと今度はメモリ不足のエラーが出てしまいます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-5.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>t2.microだとswap領域が足りなくなってしまうみたいなので、領域を確保してあげましょう。</p>
<p>下記を参考に領域を確保したら今度こそインストール成功です。<br>
<a href="https://qiita.com/miyapei/items/6db13b142cacba0522fc">https://qiita.com/miyapei/items/6db13b142cacba0522fc</a></br></p>
<hr>
<p>環境はここで一旦いい感じになりました。</p>
<p>ので、</p>
<pre><code>cd myApp

php artisan serve
</code></pre>
<p>そして管理画面からアプリにアクセスしてみます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-6.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>すると、割とでかめのOopsと出ます。</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-7.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>AWS Cloud9では</p>
<p>実行中のアプリケーションをプレビューする際にはポートとして8080,8081,8082を使うようで、プレビュー画面自体は8080を使うようになっているようです。</p>
<p><a href="https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html">https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html</a></p>
<p>なのでポートを指定してあげます。</p>
<p><code>php artisan serve — port=8080</code></p>
<p>これで再度アクセスすると見られますね！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-8.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>この部分を人にシェアしてあげればすぐに開発中の画面が見せられますね！</p>
<p><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/aws-cloud9-10.png" alt="AWSのCloud9でPHP5.6/Laravel5.4の環境を作ってみた時のお話" loading="lazy"/></p>
<p>ちなみにPHP7.2にあげてから同じような手順を踏むと特にメモリ不足になりませんでした。奥が深っそう！</p>
<p>こちらからは以上です。</p>
<!--kg-card-end: markdown--></hr></hr>]]></content:encoded></item><item><title><![CDATA[GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう]]></title><description><![CDATA[
--------------------------------------------------------------------------------

Ubuntu Desktopが欲しくなったのでGCPで従量課金のGUIPCを作ってみました。

まずは、GCEインスタンスを作成する。

もう1,2段階スペックの低いCPUでもいいのだが、今回はリモートなのに最高のヌルヌル感が欲しいため、ちょいとオーバスペック気味のものを選択。

ここが地味に重要ポイントなのだが

Boot Dist TypeがデフォルトのママだとHDDになるので、SSDに変更しておく。

これをしないといくらCPUやメモリのスペックを上げたとろこでカクカクのものになってしまいげんなりする。

bashsudo apt update -y && sudo apt upgrade -ysudo adduser new_user_xxxsudo
gpasswd -a new_user_xxx sudosudo apt -y install ubuntu-desktopsudo apt install
-y x]]></description><link>https://tech.anti-pattern.co.jp/gcpdeubuntu-desktopnohuan-jing-wozuo-ri-cong-liang-ke-jin-zhi-10yuan-h-nogui-pcwozuo-rou/</link><guid isPermaLink="false">Ghost__Post__60fa6e093986b000013a38fa</guid><category><![CDATA[GCP]]></category><category><![CDATA[kohe]]></category><category><![CDATA[Ubuntu]]></category><dc:creator><![CDATA[Kohei Kondo]]></dc:creator><pubDate>Wed, 29 May 2019 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_yPtxaSnZ0h4pZoF01VtFpg.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_yPtxaSnZ0h4pZoF01VtFpg.png" alt="GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう"/><p>Ubuntu Desktopが欲しくなったのでGCPで従量課金のGUIPCを作ってみました。</p><p>まずは、GCEインスタンスを作成する。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*dHSFgoIxYh_W_5bD0QvOkQ.png" class="kg-image" alt="GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう" loading="lazy"/></figure><p>もう1,2段階スペックの低いCPUでもいいのだが、今回はリモートなのに最高のヌルヌル感が欲しいため、ちょいとオーバスペック気味のものを選択。</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*IQ6uRq4J88kS2eYbkZYLTA.png" class="kg-image" alt="GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう" loading="lazy"/></figure><p>ここが地味に重要ポイントなのだが</p><p><strong>Boot Dist TypeがデフォルトのママだとHDDになるので、SSDに変更しておく。</strong></p><p>これをしないといくらCPUやメモリのスペックを上げたとろこでカクカクのものになってしまいげんなりする。</p><!--kg-card-begin: markdown--><p><code>bashsudo apt update -y &amp;&amp; sudo apt upgrade -ysudo adduser new_user_xxxsudo gpasswd -a new_user_xxx sudosudo apt -y install ubuntu-desktopsudo apt install -y xrdp</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h1 id="newcursors%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96">new_cursorsの無効化</h1>
<pre><code class="language-bash">sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
</code></pre>
<h1 id="xrdp%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%86%8D%E8%B5%B7%E5%8B%95%E3%80%81%E6%9C%89%E5%8A%B9%E5%8C%96">xrdpサービスの再起動、有効化</h1>
<pre><code class="language-bash">sudo systemctl restart xrdpsudo systemctl enable xrdp.service sudo systemctl enable xrdp-sesman.service
</code></pre>
<h1 id="xsession%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">xsessionファイルの作成</h1>
<pre><code class="language-bash">su user_namecd ~ DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
vim ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=${DESKTOP}
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
</code></pre>
<h1 id="authentication-required%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%81%AE%E5%9B%9E%E9%81%BF">Authentication Requiredダイアログの回避</h1>
<pre><code class="language-bash">sudo vim /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
</code></pre>
<pre><code>[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
</code></pre>
<pre><code>sudo systemctl restart polkit
</code></pre>
<!--kg-card-end: markdown--><blockquote><a href="https://qiita.com/osugizmo/items/21578272ae2db05ab001" rel="noopener">https://qiita.com/osugizmo/items/21578272ae2db05ab001</a></blockquote><p>今回はMS Remote DesktopでMACからアクセスする</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*KfHa7JQyoQOMpX612R5etg.png" class="kg-image" alt="GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう" loading="lazy"/></figure><p>IPと今回作成したユーザ名とパスワードを打ってログイン！！</p><hr><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*yPtxaSnZ0h4pZoF01VtFpg.png" class="kg-image" alt="GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう" loading="lazy"/></figure><p>ヌルヌル動いていい感じ！</p><p>これで使うときだけ起動すれば、1hあたり10円弱で利用できる！！</p><p>次は通信の暗号化やら、wineのインストールやらを色々やっていこうと思う。</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[slackからの自動打刻システムをサーバレスで作る]]></title><description><![CDATA[slackのメッセージを送ると勤怠管理システムに打刻ができる仕組みを作りました。
構成図は以下の通りです。

「開始」や「終了」のメッセージを送ると、その時刻で打刻が完了する仕組みです。
slackとAWSで完結するのものでも良いかとも思いましたが、スプレッドシートへの記録を挟むことでメンバーみんなが確認しやすかったり、無料で利用できるというのもあったためGAS・スプレッドシートも利用しました。

【作成の手順】
１ slackに送った勤怠情報をスプレッドシートに記録させる
２ lambdaから勤怠管理システムに打刻する
３ GASからLambdaを起動する

slackに送った勤怠情報をスプレッドシートに記録させる
slackのout going webhookと、GASのWebアプリケーションとして導入を利用して連携させる。
まずはスプレッドシートとGASの設定をする。
Google ドライブからスプレッドシートを開き、ツール > スクリプトエディタからGASプロジェクトを作成し、以下のようにコードを保存する。

function doPost(e) {
  var sheet =]]></description><link>https://tech.anti-pattern.co.jp/slack_lambda/</link><guid isPermaLink="false">Ghost__Post__61051add3986b000013a49ef</guid><category><![CDATA[AWS]]></category><category><![CDATA[AWS Lambda]]></category><category><![CDATA[Puppeteer]]></category><category><![CDATA[Nodejs]]></category><category><![CDATA[GoogleAppsScript]]></category><dc:creator><![CDATA[Ami Yamamoto]]></dc:creator><pubDate>Mon, 17 Sep 2018 15:00:00 GMT</pubDate><media:content url="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-31.png" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-31.png" alt="slackからの自動打刻システムをサーバレスで作る"/><p>slackのメッセージを送ると勤怠管理システムに打刻ができる仕組みを作りました。<br>構成図は以下の通りです。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-45.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="1400" height="657" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-45.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-45.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-45.png 1400w" sizes="(min-width: 720px) 720px"/></figure><p>「開始」や「終了」のメッセージを送ると、その時刻で打刻が完了する仕組みです。<br>slackとAWSで完結するのものでも良いかとも思いましたが、スプレッドシートへの記録を挟むことでメンバーみんなが確認しやすかったり、無料で利用できるというのもあったためGAS・スプレッドシートも利用しました。</br></p><p><strong><strong>【作成の手順】</strong></strong><br>１ slackに送った勤怠情報をスプレッドシートに記録させる<br>２ lambdaから勤怠管理システムに打刻する<br>３ GASからLambdaを起動する</br></br></br></p><h2 id="slack%E3%81%AB%E9%80%81%E3%81%A3%E3%81%9F%E5%8B%A4%E6%80%A0%E6%83%85%E5%A0%B1%E3%82%92%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%95%E3%81%9B%E3%82%8B">slackに送った勤怠情報をスプレッドシートに記録させる</h2><p>slackのout going webhookと、GASのWebアプリケーションとして導入を利用して連携させる。<br>まずはスプレッドシートとGASの設定をする。<br>Google ドライブからスプレッドシートを開き、ツール &gt; スクリプトエディタからGASプロジェクトを作成し、以下のようにコードを保存する。</br></br></p><!--kg-card-begin: markdown--><pre><code>function doPost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  sheet.getRange(1,1).setValue(e);
}
</code></pre>
<!--kg-card-end: markdown--><p>「Webアプリケーションとして導入」を選択して、URLを叩いたとき、POSTリクエストの場合はdoPost、GETリクエストの場合はdo<br>Getという関数が呼ばれます。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-46.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="1250" height="488" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-46.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-46.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-46.png 1250w" sizes="(min-width: 720px) 720px"/></figure><p>slackからGASの関数を呼び出せられるように、公開 &gt; ウェブアプリケーションとして導入を選択する。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-47.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="782" height="764" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-47.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-47.png 782w" sizes="(min-width: 720px) 720px"/></figure><p>アクセスできるユーザーで「全員（匿名ユーザーを含む）」を選択し、「導入」をクリックする。</p><p>表示された「現在のウェブ アプリケーションの URL:」をどこかに控えておいてください。</p><p>次にslackのoutgoing Webhookの設定をします。<br><a href="https://anti-patterninc.slack.com/apps/A0F7VRG6Q-outgoing-webhook" rel="noopener nofollow">https://slack.com/apps/A0F7VRG6Q-outgoing-webhook</a><br>上記URLから「設定を追加」します。<br>インテグレーションの設定から、お好きな「チャンネル」を選択し、「引き金となる言葉」に「開始, 終了」と入力、「URL」には先程GASで生成したウェブ アプリケーションの URLを入力してください。<br>入力が完了したら保存をします。<br>「トークン」の項目に入っている文字列は、後で使うのでどこかに控えておきます。<br>ここまで設定をして、slackの該当チャンネルで「開始」と送ると・・・</br></br></br></br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-48.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="634" height="416" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-48.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-48.png 634w"/></figure><p>A1セルに値が入っているのがわかります！これで連携成功です！</p><p>A1セルの中には、slackから送られた内容を含むevent Objectが記録されているので、その情報をもとに必要な内容を抜き出します。</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-27.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="700" height="60" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2021/07/img-27.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/2021/07/img-27.png 700w"/></figure><p>年、月、日、時間・・・などちょっとしつこい感じで記録しようと思います・・・・</p><!--kg-card-begin: markdown--><pre><code>/**
 * POSTリクエストの場合の処理
 **/
function doPost(e) {
  var json_params = JSON.stringify(e);
  //jsonを配列に変換
  var arr_params = JSON.parse(json_params);
  var token = arr_params['parameter']['token'];
  var slack_token = 'XXXXXXXXXXXXXXXXXXXXXXXX';//outgoing webhookで取得したトークンを入力する
  
  //Slackからのリクエストの場合の処理
  if (token == slack_token) {
    var stamping_json_data = stamping_from_slack(arr_params);
    return;
  }

}

/**
 * Slackからの打刻をスプレッドシートに記録する
 **/
function stamping_from_slack(arr_params){
  var sheet        = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet');//スプレッドシートのシート名を「sheet」に変更する
  var timestamp    = arr_params['parameter']['timestamp'];
  var datetime     = new Date();
  var year         = datetime.getFullYear();
  var month        = ('0' + (datetime.getMonth() + 1)).slice(-2);
  var day          = ('0' + datetime.getDate()).slice(-2);
  var hour         = ('0' + datetime.getHours()).slice(-2);
  var minute       = ('0' + datetime.getMinutes()).slice(-2);
  var command      = arr_params['parameter']['trigger_word'];
  var user_name    = arr_params['parameter']['user_name'];
  var slackuser_id = arr_params['parameter']['user_id'];
  
  //user_idからメールアドレスを取得する
  var email = getUserEmail(slackuser_id);
  
  //従業員IDを取得する
  var employee_id = getEmployeeId(email);
  
  //スプレッドシート入力
  var last_row_num    = sheet.getLastRow();
  var last_column_num = sheet.getLastColumn();
  var updated_row     = sheet.getRange(last_row_num + 1, 1, 1, last_column_num);
  var insert_data     = updated_row.getValues();
  
  insert_data[0][0]  = datetime;
  insert_data[0][1]  = year;
  insert_data[0][2]  = month;
  insert_data[0][3]  = day;
  insert_data[0][4]  = hour;
  insert_data[0][5]  = minute;
  insert_data[0][6]  = timestamp;
  insert_data[0][7]  = user_name;
  insert_data[0][8]  = slackuser_id;
  insert_data[0][9]  = email;
  insert_data[0][10] = command;
  insert_data[0][11] = employee_id;
  
  updated_row.setValues(insert_data);
  
  //連想配列を生成する
  var arr_data = {};
  var keys = sheet.getRange(1, 1, 1, last_column_num).getValues()[0];
  keys.forEach(function(key, index){
              arr_data[key] = insert_data[0][index];
              });
  var json_data = JSON.stringify(arr_data);
  return json_data;
}


/**
 * SlackIDからメールアドレスを取得する
 **/
function getUserEmail(slackuser_id) {
  var ids = {
    XXXXXXXXX:'XXXX@anti-pattern.co.jp',
 };
  return ids[slackuser_id];
}


/**
 * メールアドレスから勤怠管理システムのアカウントIDを取得する
 **/
function getEmployeeId(email) {
  var employee_ids = {
    'XXXX@anti-pattern.co.jp':'00000',
  };
  return employee_ids[email];
}
</code></pre>
<!--kg-card-end: markdown--><p>slack_token →outgoing webhookで取得したトークンを入力します。<br>WebhookURLは、知っていれば誰でもリクエストを送ることができてしまうので、このトークンの文字列を判定することでslackからのリクエスト以外は処理を行わないようにできます。</br></p><p>ここで改めてslackのチャンネルで「開始」と送るとこのようにうまく記録できました！</p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-49.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="1400" height="162" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-49.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-49.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-49.png 1400w" sizes="(min-width: 720px) 720px"/></figure><h2 id="lambda%E3%81%8B%E3%82%89%E5%8B%A4%E6%80%A0%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E6%89%93%E5%88%BB%E3%81%99%E3%82%8B">lambdaから勤怠管理システムに打刻する</h2><p>次にlambdaの設定<br>puppeteerというChromeのヘッドレスブラウザを使い、スクレイピングをする<br>lambdaにはLayersと関数というものがある。<br>関数には実行したい処理を書きます。</br></br></br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-50.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="1130" height="572" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-50.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-50.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-50.png 1130w" sizes="(min-width: 720px) 720px"/></figure><p>Layerには関数で使うライブラリやモジュールを登録できます。 一つの関数に5つLayerを登録でき、一つのLayerを他の関数に登録することもできます。</p><p>今回、関数にはスクレイピングの処理を書くindex.jsと、パスワード情報などを保管するconfig.jsonの2つを設定。<br>また、関数内で利用するchrome-aws-lambda、puppeteer-core、requestの3つのモジュールが入ったLayerを一つ紐付ける。</br></p><figure class="kg-card kg-image-card"><img src="https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-51.png" class="kg-image" alt="slackからの自動打刻システムをサーバレスで作る" loading="lazy" width="1034" height="536" srcset="https://ghost.tech.anti-pattern.co.jp/content/images/size/w600/2022/05/image-51.png 600w, https://ghost.tech.anti-pattern.co.jp/content/images/size/w1000/2022/05/image-51.png 1000w, https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/image-51.png 1034w" sizes="(min-width: 720px) 720px"/></figure><p>lambdaでは関数とすべてのレイヤーの解凍後の合計サイズが、解凍後のデプロイパッケージのサイズ制限 250 MB を超えることはできません。nodejsで利用するpuppeteerは普段ブラウザにChromiumを使っていますが、Chromiumを内包したpuppeteerは容量が大きすぎるため、Chromiumを含まないpuppeteer-coreを利用します。</p><p>lambdaでpuppeteerを利用する方法は以下の記事がとてもわかりやすかったのでおすすめです↓<br><a href="https://qiita.com/kodai-saito/items/9051d2b30a29c7d64f7d" rel="noopener nofollow">AWS LambdaでPuppeteerを動かす</a></br></p><p>モジュールが入ったzipファイルをローカルで作成する際は、<strong><strong>nodejs</strong></strong>という名前のディレクトリにしなければうまく動きません。<br>また、Layer登録時と、関数で利用するランタイムにNode10を利用するとうまく動かない問題があるようですので、<strong><strong>Node8</strong></strong>を利用してください。</br></p><p>関数にはこのようなコードを登録します。</p><!--kg-card-begin: markdown--><pre><code>const puppeteer = require('puppeteer-core');
const chromium  = require('chrome-aws-lambda');
const request   = require('request');
const {SITE_ID, SITE_PW, GAS_URL, SLACK_URL, SHEET_URL, BASE_URL} = require('./config.json');
exports.handler = async (event, context) =&gt; {
  
  let browser       = null;
  let page          = null;
  const year        = event.year;
  const month       = event.month;
  const day         = event.day;
  const date        = year + '-' + month + '-' + day;
  const hour        = event.hour;
  const minute      = event.minute;
  const time        = hour + ':' + minute;
  const command     = event.command == '開始' ? 'clock_in_at': 'clock_out_at';
  const employee_id = event.employee_id;
  const next_month  = month == '12' ? (Number(year) + 1)  + '/1' : year + '/' + (Number(month) + 1);
try {
    
    browser = await puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
    });
    
    page = await browser.newPage();
    
    await page.goto(BASE_URL + next_month +'/employees/' + employee_id);
    
    await page.focus('input[name=email]');
    await page.type('input[name=email]',SITE_ID);
    await page.focus('input[name=password]');
    await page.type('input[name=password]',SITE_PW);
const input_element = await page.$('input[type=submit]');
    await input_element.click();
    await page.waitFor(5000);
let calendar = await page.$('[data-date=&quot;' + date + '&quot;]');
    await calendar.click();
    await page.waitFor(2000);
await page.focus('input[name=' + command + ']');
    await page.keyboard.press('Backspace');
    await page.keyboard.press('Backspace');
    await page.keyboard.press('Backspace');
    await page.keyboard.press('Backspace');
    await page.keyboard.press('Backspace');
await page.type('input[name=' + command + ']', time);
    
    const remove_break_buttons = await page.$$('.break-records-editor__remove-break-button');
    for (let i = 0; i &lt; remove_break_buttons.length; i++) {
      await remove_break_buttons[0].click();
    }
if (command == 'clock_out_at') {
      //勤務時間を取得する
      const work_time_tag = await page.$('span.time-range-input__diff');
      let work_time       = await (await work_time_tag.getProperty('textContent')).jsonValue();
      work_time = work_time.match(/^\d+/g);
      
      //勤務時間が6時間以上の場合は休憩時間を入力する
      if (work_time &gt;= 6) {
        const add_break_button = await page.$('div.break-records-editor &gt; .sw-button');
        await add_break_button.click();
        
        await page.focus('input[name=break_record_0_clock_in_at]');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.type('input[name=break_record_0_clock_in_at]', (Number(hour) - 4) + ':' + minute);
        
        await page.focus('input[name=break_record_0_clock_out_at]');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.keyboard.press('Backspace');
        await page.type('input[name=break_record_0_clock_out_at]', (Number(hour) - 3) + ':' + minute);
      }
    }
    
    const save_button = await page.$('.work-record-edit-modal__footer-control.sw-button-primary');
    //const save_button = await page.$('.work-record-edit-modal__footer-control.sw-button');//デバッグ用の閉じるボタン
    console.log('セーブ前');
    await save_button.click();
    
  } catch (e) {
    
    //スプレッドシートに記録
    var options = {
      url: GAS_URL,
      method: 'POST',
      headers: 'Content-Type:application/json',
      json: {
        message: '',
        event: ''
      }
    }
    
    //eventを文字列にしてtextにつなげる
    var event_json = JSON.stringify(event);
options['json']['message'] = String(e).replace(/:|\\\'/g, '、') + ' email→' + event.email + ' timestamp→' + event.timestamp;
    options['json']['event'] = event_json;
    
    request(options, function (error, response, body) {});
//slackに通知
    var slack_options = {
      url: SLACK_URL,
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      json: {
        username: 'freee打刻',
        icon_emoji: ':alarm_clock:'
      }
    }
    slack_options['json']['text'] = '打刻が失敗しました！[email→' + event.email + '] エラーログを確認してください。' + SHEET_URL;
    request(slack_options, function (error, response, body) {});
    await page.waitFor(5000);
return context.fail(e);
    
  } finally {
    if (browser !== null) {
      await browser.close();
    }
  }
return event.user_name;
};
</code></pre>
<!--kg-card-end: markdown--><p>※github:<a href="https://github.com/amiamiyamamoto/slack_stamp" rel="noopener nofollow">https://github.com/amiamiyamamoto/slack_stamp</a></p><!--kg-card-begin: markdown--><pre><code>{
  &quot;SITE_ID&quot;: &quot;勤怠管理システムにログインするID&quot;,
  &quot;SITE_PW&quot;: &quot;勤怠管理システムにログインするパスワード&quot;,
  &quot;GAS_URL&quot;: &quot;https://script.google.com/※GASのWebhookURL&quot;,
  &quot;SLACK_URL&quot;: &quot;https://hooks.slack.com/services/※slackのincomingWebhookのURL&quot;,
  &quot;SHEET_URL&quot;: &quot;https://docs.google.com/spreadsheets/スプレッドシートのURL&quot;,
  &quot;BASE_URL&quot; : &quot;https://勤怠管理システムURL&quot;
}
</code></pre>
<!--kg-card-end: markdown--><p>ご利用の勤怠管理システムに合わせて作成してください！</p><p>関数の登録ができたら、GASから呼び出しができるよう、API Gatewayの登録を行います。<br>↓こちらのページがとても分かりやすかったので、おすすめです！<br><a href="https://dev.classmethod.jp/cloud/aws/getting-start-api-gateway/" rel="noopener nofollow">ゼロから作りながら覚えるAPI Gateway環境構築</a></br></br></p><p><strong><strong>lambdaやAPIゲートウェイは初期設定がリソース少なめに設定されてます。</strong></strong><br>lambdaだったら、起動時間上限が少なかったり、API Gatewayは呼び出し上限回数が少なかったりなどなどです。<br>うまく動かない場合でも、設定が制限されていないか確認してみてくださいね。</br></br></p><h2 id="gas%E3%81%8B%E3%82%89lambda%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">GASからLambdaを起動する</h2><p>最後にGASコードからLambdaに勤怠情報を送る処理と、エラーを受信する処理を記述して終わりです。</p><!--kg-card-begin: markdown--><pre><code>/**
 * POSTリクエストの場合の処理
 **/
function doPost(e) {
  var json_params = JSON.stringify(e);
    //jsonを配列に変換
  var arr_params = JSON.parse(json_params);
  var token = arr_params['parameter']['token'];
  var slack_token = 'XXXXXXXXXXXXXXXXXXXXXXXX';//outgoing webhookで取得したトークンを入力する
  
  //Slackからのリクエストの場合の処理
  if (token == slack_token) {
    var stamping_json_data = stamping_from_slack(arr_params);    
    var response = sendLambda(stamping_json_data);
    return;
  }
  
  //lambdaからのリクエストの場合
  if ('lambdaからのリクエストの場合の判定を書く') {
    var error_log_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('error_log');
    var last_low = error_log_sheet.getLastRow();
    error_log_sheet.getRange(last_low + 1, 1).setValue('打刻が失敗しました：' + json_params);
    return;
  }


}

/**
 * Slackからの打刻をスプレッドシートに記録する
 **/
function stamping_from_slack(arr_params){
  var sheet        = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet');//スプレッドシートのシート名を「sheet」に変更する
  var timestamp    = arr_params['parameter']['timestamp'];
  var datetime     = new Date();
  var year         = datetime.getFullYear();
  var month        = ('0' + (datetime.getMonth() + 1)).slice(-2);
  var day          = ('0' + datetime.getDate()).slice(-2);
  var hour         = ('0' + datetime.getHours()).slice(-2);
  var minute       = ('0' + datetime.getMinutes()).slice(-2);
  var command      = arr_params['parameter']['trigger_word'];
  var user_name    = arr_params['parameter']['user_name'];
  var slackuser_id = arr_params['parameter']['user_id'];
  
  //user_idからメールアドレスを取得する
  var email = getUserEmail(slackuser_id);
  
  //従業員IDを取得する
  var employee_id = getEmployeeId(email);
  
  //スプレッドシート入力
  var last_row_num    = sheet.getLastRow();
  var last_column_num = sheet.getLastColumn();
  var updated_row     = sheet.getRange(last_row_num + 1, 1, 1, last_column_num);
  var insert_data     = updated_row.getValues();
  
  insert_data[0][0]  = datetime;
  insert_data[0][1]  = year;
  insert_data[0][2]  = month;
  insert_data[0][3]  = day;
  insert_data[0][4]  = hour;
  insert_data[0][5]  = minute;
  insert_data[0][6]  = timestamp;
  insert_data[0][7]  = user_name;
  insert_data[0][8]  = slackuser_id;
  insert_data[0][9]  = email;
  insert_data[0][10] = command;
  insert_data[0][11] = employee_id;
  
  updated_row.setValues(insert_data);
  
  //連想配列を生成する
  var arr_data = {};
  var keys = sheet.getRange(1, 1, 1, last_column_num).getValues()[0];
  keys.forEach(function(key, index){
              arr_data[key] = insert_data[0][index];
              });
  var json_data = JSON.stringify(arr_data);
  return json_data;
}


/**
 * SlackIDからメールアドレスを取得する
 **/
function getUserEmail(slackuser_id) {
  var ids = {
    XXXXXXXXX:'XXXX@anti-pattern.co.jp',
 };
  return ids[slackuser_id];
}


/**
 * メールアドレスから勤怠管理システムのアカウントIDを取得する
 **/
function getEmployeeId(email) {
  var employee_ids = {
    'XXXX@anti-pattern.co.jp':'00000',
  };
  return employee_ids[email];
}

/* 
* 打刻情報をlambdaへpostする関数
*/
function sendLambda(message){
  
  var headers = {
    'x-api-key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'//API GatewayのPAIキーを記載する
  };
  var api_gateway_url = 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';//API GatewayのURLを記載する

   var options =
   {
     &quot;method&quot; : &quot;post&quot;,
     &quot;payload&quot; : message,
     &quot;headers&quot; : headers,
     &quot;muteHttpExceptions&quot; : true,
   };
  
  var res = UrlFetchApp.fetch(api_gateway_url, options);
  return res;
}
</code></pre>
<!--kg-card-end: markdown--><h2 id="%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</h2><p>勤務開始、終了の時間を記録する仕組みはできましたが、細かいところは粗いままです。勤務終了を忘れていたらアラートを上げるなどの機能も付けられたらいいかもなーと思います。</p>]]></content:encoded></item></channel></rss>