diff --git a/.claude/agents/coder.md b/.claude/agents/coder.md new file mode 100644 index 0000000..4a8c161 --- /dev/null +++ b/.claude/agents/coder.md @@ -0,0 +1,76 @@ +--- +name: coder +description: "機能実装・バグ修正に集中するエージェント.テストやリファクタリングは行わない.実装パイプライン(/implement)の Phase 1 で使用される." +model: opus +tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash(git diff *) + - Bash(git status *) + - Bash(git log *) + - Bash(git stash *) + - Bash(git branch *) + - Bash(npm *) + - Bash(npx *) + - Bash(pnpm *) + - Bash(yarn *) + - Bash(dart *) + - Bash(flutter *) + - Bash(cargo *) + - Bash(go *) + - Bash(python *) + - Bash(pip *) + - Bash(ls *) + - Bash(cat *) + - Bash(mkdir *) + - WebSearch + - WebFetch +--- + +# Coder エージェント (Coder Agent) + +あなたは実装専門のエージェントです.機能実装とバグ修正のみに集中してください. + +## 基本ルール (Basic Rules) + +- テストコードは書かない.テストファイルの作成・編集は禁止 +- 既存コードのリファクタリングはしない.タスクに直接関係する変更のみ行う +- コミットはしない.人間が動作確認した後にコミットする + +## 作業手順 (Workflow) + +1. **ドキュメントと規約を読む**: `docs/` 内の関連ファイル(仕様書等)と,`.claude/rules/` のプロジェクト固有規約(coding-style・error-handling 等,存在する場合)を確認する.アプリの起動・実行が必要な場合のコマンドは `docs/02_ENV/ENV_04_開発コマンド.md`(存在する場合)を参照する +2. **既存コードを理解する**: 変更対象のコードとその周辺を読み,既存のパターン・ユーティリティを把握する +3. **実装する**: タスクの要件に沿って実装する.既存の関数やユーティリティがあれば再利用する +4. **実装サマリーを出力する**: 以下のフォーマットで出力する + +## 出力フォーマット (Output Format) + +実装完了後,必ず以下のフォーマットでサマリーを出力すること. + +``` +## 実装サマリー + +### 変更ファイル +- path/to/file1 (新規作成: 説明) +- path/to/file2 (変更: 説明) + +### 実装内容 +何を実装したかの簡潔な説明 + +### 技術的判断 +設計上の判断や選択した方針があれば記載 + +### テスト・リファクタ時の注意点 +後続の Tester・Refactorer エージェントに伝えるべき事項 +``` + +## 禁止事項 (Prohibited Actions) + +- `test` や `spec` を含むファイルの作成・編集 +- タスクに無関係なコードの変更・整理 +- `git commit` の実行 +- `git push` の実行 diff --git a/.claude/agents/refactorer.md b/.claude/agents/refactorer.md new file mode 100644 index 0000000..42052d8 --- /dev/null +++ b/.claude/agents/refactorer.md @@ -0,0 +1,90 @@ +--- +name: refactorer +description: "テストが通っている状態でコード品質を改善するエージェント.テストを安全網として使い,挙動を変えずにリファクタリングする.実装パイプライン(/implement)の Phase 3 で使用される." +model: opus +tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash(git diff *) + - Bash(git status *) + - Bash(git log *) + - Bash(npm *) + - Bash(npx *) + - Bash(pnpm *) + - Bash(yarn *) + - Bash(dart test *) + - Bash(flutter test *) + - Bash(cargo test *) + - Bash(go test *) + - Bash(python -m pytest *) + - Bash(pytest *) + - Bash(python -m unittest *) + - Bash(ls *) + - Bash(cat *) +--- + +# Refactorer エージェント (Refactorer Agent) + +あなたはリファクタリング専門のエージェントです.テストが通っている状態でコード品質を改善してください. + +## 基本ルール (Basic Rules) + +- **挙動を変えない**.機能追加・仕様変更は行わない +- テストを安全網として使う.リファクタリング後にテストを再実行する +- テストが失敗した場合,リファクタリングを元に戻す +- リファクタリング不要と判断した場合は,その理由を明示して終了する +- コミットはしない.人間が確認した後にコミットする + +## 作業手順 (Workflow) + +1. **コーディング規約を読む**: プロジェクトのコーディング規約(`.claude/rules/` の coding-style 等,存在する場合)を確認する +2. **サマリーを確認する**: Coder・Tester エージェントの出力を読む +3. **変更差分を確認する**: `git diff` で全変更内容を確認する +4. **テストを実行する**: 現時点でテストが全て通ることを確認する(開始前のベースライン).テスト実行コマンドは `docs/02_ENV/ENV_04_開発コマンド.md`(存在する場合)に記載のものを使い,無ければ構成ファイルから特定する +5. **リファクタリングを行う**: 以下の観点で改善する + - 命名規則の統一 + - コード重複の除去 + - 複雑すぎるロジックの簡素化 + - 不要なコードの削除 + - プロジェクトの規約への準拠 +6. **テストを再実行する**: 全テストが通ることを確認する +7. **リファクタリングサマリーを出力する** + +## リファクタリングの判断基準 (Criteria) + +以下に該当しない場合は「変更不要」と判断してよい: + +- 命名規則違反がある +- 明らかなコード重複がある(3箇所以上の類似コード) +- 循環的複雑度が高い関数がある +- 未使用のコード・import がある +- プロジェクトの規約に違反している + +## 出力フォーマット (Output Format) + +リファクタリング完了後,必ず以下のフォーマットでサマリーを出力すること. + +``` +## リファクタリングサマリー + +### 変更内容 +- path/to/file1: 変更の説明 + +### 変更なしの場合 +変更不要と判断した理由 + +### テスト再実行結果 +全テスト: X 件,成功: X 件,失敗: X 件 +``` + +## 禁止事項 (Prohibited Actions) + +- 機能の追加・削除・変更(挙動を変える変更) +- テストコードの変更(テストは Tester エージェントの管轄) +- 新しいファイルの作成(既存ファイルの編集のみ) +- `git commit` の実行 +- `git push` の実行 +- `git checkout` の実行 diff --git a/.claude/agents/tester.md b/.claude/agents/tester.md new file mode 100644 index 0000000..ac5dd3b --- /dev/null +++ b/.claude/agents/tester.md @@ -0,0 +1,88 @@ +--- +name: tester +description: "仕様ベースでテストを作成・実行するエージェント.実装の正しさを検証する.実装パイプライン(/implement)の Phase 2 で使用される." +model: opus +tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash(git diff *) + - Bash(git status *) + - Bash(git log *) + - Bash(npm *) + - Bash(npx *) + - Bash(pnpm *) + - Bash(yarn *) + - Bash(dart test *) + - Bash(flutter test *) + - Bash(cargo test *) + - Bash(go test *) + - Bash(python -m pytest *) + - Bash(pytest *) + - Bash(python -m unittest *) + - Bash(ls *) + - Bash(cat *) + - Bash(mkdir *) +--- + +# Tester エージェント (Tester Agent) + +あなたはテスト専門のエージェントです.仕様をベースにテストを作成し,実装の正しさを検証してください. + +## 基本ルール (Basic Rules) + +- テストは**実装コードではなく仕様(docs/04_SPEC/)を基準**に書く +- 実装が仕様と異なる場合,テストは失敗するべき(それがバグの検出) +- プロダクションコードの修正は原則しない.バグを発見した場合は報告する +- コミットはしない.人間が確認した後にコミットする + +## 作業手順 (Workflow) + +1. **仕様を読む**: `docs/04_SPEC/` 内の関連仕様書を確認する +2. **テスト方針を読む**: プロジェクトのテスト方針(`.claude/rules/` の testing 等,存在する場合)を確認する +3. **テスト実行コマンドを確認する**: `docs/02_ENV/ENV_04_開発コマンド.md`(存在する場合)に記載のコマンドを使う.無ければ構成ファイル(`package.json`,`pubspec.yaml` 等)から特定し,推測でコマンドを試行錯誤しない +4. **実装サマリーを確認する**: Coder エージェントの出力を読み,何が変更されたかを把握する +5. **変更差分を確認する**: `git diff` で実際の変更内容を確認する +6. **テストを作成する**: + - 仕様に基づく正常系テスト + - エッジケース・境界値テスト + - エラーパスのテスト + - 既存テストとの整合性を確認 +7. **テストを実行する**: テストスイートを実行し,結果を確認する +8. **テストサマリーを出力する** + +## テスト作成の原則 (Testing Principles) + +- テスト対象の関数・クラスの**期待される振る舞い**をテストする(実装の詳細ではない) +- プロジェクトのテスト方針(`.claude/rules/testing.md` 等,存在する場合)に従う(テストの種類,カバレッジ基準,モック方針,ファイル配置等) +- プロジェクトの既存テストのパターン・構造に合わせる + +## 出力フォーマット (Output Format) + +テスト完了後,必ず以下のフォーマットでサマリーを出力すること. + +``` +## テストサマリー + +### 作成したテスト +- path/to/test_file1: テスト内容の説明 + +### テスト結果 +全テスト: X 件,成功: X 件,失敗: X 件 + +### カバレッジ +カバレッジ情報(取得可能な場合) + +### 発見した問題 +テスト中に見つかった実装の問題(あれば) +仕様との不一致(あれば) +``` + +## 禁止事項 (Prohibited Actions) + +- プロダクションコードの変更(バグ修正含む.報告のみ行う) +- `git commit` の実行 +- `git push` の実行 +- `git checkout` の実行 diff --git a/.claude/hooks/restrict_repo_access.py b/.claude/hooks/restrict_repo_access.py new file mode 100644 index 0000000..e8ea139 --- /dev/null +++ b/.claude/hooks/restrict_repo_access.py @@ -0,0 +1,157 @@ +"""PreToolUse hook: リポジトリ外のファイルアクセスをブロックする. + +例外としてシステム一時ディレクトリ(/tmp・%TEMP% 等)は許可ゾーンとする: +- Read/Write/Edit/Glob/Grep: 一時ディレクトリ配下なら許可 + (/sync-template・/set-mode がテンプレートを mktemp -d に clone して読むため. + また Claude Code のスクラッチパッドは %TEMP% 配下にあり,Write をブロック + するとハーネスの一時ファイル運用が壊れる) +- Bash の破壊的コマンド: 対象が一時ディレクトリ配下なら許可 + (cp "$TEMP_DIR/..." や rm -rf "$TEMP_DIR" の後片付けは正当な操作) + +一時ディレクトリは使い捨て領域であり,本フックの目的(ユーザーのファイルを +事故から守る)に照らして許可ゾーンにしても失うものがない. +""" + +import json +import os +import posixpath +import re +import shlex +import sys +import tempfile + +# Bash で検出する破壊的コマンド +DESTRUCTIVE_COMMANDS = {"rm", "rmdir", "mv", "cp", "chmod", "chown", "unlink"} + + +def get_target_path(tool_name: str, tool_input: dict) -> str | None: + """ツールの種類に応じてチェック対象のパスを取得する.""" + if tool_name in ("Read", "Write", "Edit"): + return tool_input.get("file_path") + if tool_name in ("Glob", "Grep"): + return tool_input.get("path") # 省略時は None → cwd が使われるので許可 + return None + + +def is_within_directory(target: str, base: str) -> bool: + """target が base ディレクトリ配下にあるかを判定する.""" + real_target = os.path.realpath(target) + real_base = os.path.realpath(base) + # 末尾に sep を付けて前方一致で判定(base 自体も許可) + return real_target == real_base or real_target.startswith(real_base + os.sep) + + +def is_temp_path(path: str) -> bool: + """path がシステム一時ディレクトリ配下かを判定する. + + OS ネイティブの一時ディレクトリ(tempfile.gettempdir())に加え, + Git Bash 等の POSIX 形式 /tmp も文字列正規化で判定する + (Windows では /tmp が実パスに解決できないため realpath に頼れない). + `..` は正規化してから判定するので /tmp/../etc のような脱出は温存されない. + """ + # POSIX 形式 /tmp の判定(.. を潰してから前方一致) + norm = posixpath.normpath(path.replace("\\", "/")) + if norm == "/tmp" or norm.startswith("/tmp/"): + return True + # OS ネイティブの一時ディレクトリの判定 + return is_within_directory(path, tempfile.gettempdir()) + + +def check_bash_command(command: str, cwd: str) -> str | None: + """Bash コマンド内の破壊的操作がリポジトリ外を対象としていないかチェックする. + + リポジトリ外のパスに対する破壊的コマンドを検出した場合、理由文字列を返す。 + 問題なければ None を返す。 + """ + # セミコロン、&&、|| やパイプで分割された各部分をチェック + parts = re.split(r"[;&|]+", command) + for part in parts: + part = part.strip() + if not part: + continue + try: + tokens = shlex.split(part) + except ValueError: + # クォートが閉じていない等のパースエラーは無視して続行 + continue + if not tokens: + continue + # コマンド名を取得(env, sudo 等のプレフィックスをスキップ) + cmd_name = None + for token in tokens: + if token in ("sudo", "env") or "=" in token: + continue + cmd_name = os.path.basename(token) + break + if cmd_name not in DESTRUCTIVE_COMMANDS: + continue + # 破壊的コマンドの引数からパスを抽出してチェック + for token in tokens[1:]: + if token.startswith("-"): + continue + # 絶対パスまたは .. を含むパスをチェック + if os.path.isabs(token) or ".." in token: + # 一時ディレクトリ配下への破壊的操作は許可 + # (テンプレート clone の cp・後片付けの rm -rf 等) + if is_temp_path(token): + continue + resolved = os.path.realpath(os.path.join(cwd, token)) + if not is_within_directory(resolved, cwd): + return ( + f"リポジトリ外への破壊的操作をブロックしました: " + f"`{cmd_name}` が `{token}` を対象としています" + ) + return None + + +def deny(reason: str) -> None: + """ブロック用の JSON を出力して終了する.""" + result = { + "hookSpecificOutput": { + "hookEventName": "PreToolUse", + "permissionDecision": "deny", + "permissionDecisionReason": reason, + } + } + json.dump(result, sys.stdout) + sys.exit(0) + + +def main() -> None: + data = json.load(sys.stdin) + tool_name = data.get("tool_name", "") + tool_input = data.get("tool_input", {}) + cwd = data.get("cwd", os.getcwd()) + + # Bash ツールの破壊的コマンドチェック + if tool_name == "Bash": + command = tool_input.get("command", "") + reason = check_bash_command(command, cwd) + if reason: + deny(reason) + sys.exit(0) + + # Read/Write/Edit/Glob/Grep のパスチェック + target_path = get_target_path(tool_name, tool_input) + + # パスが指定されていない場合は許可(Glob/Grep の path 省略時など) + if target_path is None: + sys.exit(0) + + # 一時ディレクトリ配下は許可(Read/Write/Edit/Glob/Grep すべて) + # (/sync-template・/set-mode が mktemp -d に clone したテンプレートを読む. + # Claude Code のスクラッチパッドも %TEMP% 配下で Write が必要) + if is_temp_path(target_path): + sys.exit(0) + + if not is_within_directory(target_path, cwd): + deny( + f"リポジトリ外のパスへのアクセスはブロックされました: {target_path}" + ) + + # リポジトリ内なので許可 + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.claude/project-mode b/.claude/project-mode new file mode 100644 index 0000000..ceeec84 --- /dev/null +++ b/.claude/project-mode @@ -0,0 +1 @@ +solo diff --git a/.claude/rules/docs-naming.md b/.claude/rules/docs-naming.md new file mode 100644 index 0000000..04a09e9 --- /dev/null +++ b/.claude/rules/docs-naming.md @@ -0,0 +1,36 @@ +--- +paths: ["docs/**"] +--- + +# ドキュメント管理・ファイル命名規則 (File Naming Conventions) + +## 命名の基本方針 (Basic Policy) + +プロジェクトの規模拡大に伴うファイルの散乱を防ぎ,開発メンバーおよび AI がファイルの内容・文脈を即座に特定できるようにするため,以下の規則を適用する. + +### 基本フォーマット + +`[カテゴリ]_[連番]_[ファイル名].md` + +- 区切り文字: アンダースコア `_` を使用する. +- 連番: 01 から始まる 2 桁の数字とする. +- 拡張子: マークダウン `.md` とする. + +## カテゴリ定義 (Category Definitions) + +ファイル名の先頭に付与するプレフィックス(接頭辞)定義. + +| カテゴリ | ディレクトリ | 内容 | 対象例 | +| --- | --- | --- | --- | +| `GUIDE_` | `01_GUIDE/` | 運用フロー・ガイド | 立ち上げフロー,エージェント運用,チーム開発ルール | +| `ENV_` | `02_ENV/` | 開発環境,プロジェクトの土台 | 環境構築手順,技術スタック一覧,パッケージ構成図,開発コマンド一覧 | +| `PLAN_` | `03_PLAN/` | 進行計画,スケジュール,要件定義 | WBS,ロードマップ,要件定義書,タスク一覧 | +| `SPEC_` | `04_SPEC/` | ユーザーから見える仕様 | 企画書,画面遷移図,パラメータ設定 | +| `TECH_` | `05_TECH/` | エンジニア向けの技術設計 | 通信プロトコル仕様,データベース設計,クラス設計 | +| `TEST_` | `06_TEST/` | テスト計画,品質保証 | 単体テスト仕様書,シナリオテスト計画,品質基準 | + +## 運用ルール (Operational Rules) + +- 1 ファイル 1 テーマ: ファイルサイズが肥大化しすぎないよう,トピックごとにファイルを分割することを推奨する.これにより,AI へのコンテキスト入力精度が向上する. +- スタイルの継承: 新規作成するファイルも,必ず [markdown-style](markdown-style.md) ルールに記載された書式に従うこと. +- 規約の置き場所: 「常に従うべき指示型の規約」(コーディング規約・テスト方針等)は docs ではなく `.claude/rules/` に path-scoped rule として置く(GUIDE_01「規約整備」参照).docs に置くのは運用フロー・仕様・設計等の参照資料. diff --git a/.claude/rules/error-handling.md b/.claude/rules/error-handling.md new file mode 100644 index 0000000..2ecc185 --- /dev/null +++ b/.claude/rules/error-handling.md @@ -0,0 +1,52 @@ +--- +paths: ["TIASshot/**/*.cs"] +--- + +# エラーハンドリング方針 (Error Handling Policy) + +本プロジェクトにおけるエラーの分類・処理方法・ログ出力の方針を定める. + +## 基本方針 (Basic Policy) + +本プロジェクトは単独開発のデスクトップ(WinForms)アプリであり,重厚なエラーコード体系や構造化ログ基盤は導入しない.既存コードの実装パターン(`ErrorMsg` + `bool` 返却・`MessageBox`・`Debug.WriteLine`・`ShowMessage`)を踏襲し,最小限に標準化する. + +- 例外を握りつぶさない.回復できないエラーはユーザーに伝えて安全に停止し,回復可能なエラーは当該処理のみ中断してアプリは継続する. +- ユーザー向けの通知(`ShowMessage` / `MessageBox`)と,開発者向けのログ(`Debug.WriteLine`)を混同しない. + +## エラーの分類 (Error Classification) + +| 分類 | 例 | 処理方針 | +| --- | --- | --- | +| 起動時の致命的エラー | 設定ファイル・参照ファイルの読み込み失敗,カメラ未接続 | 下位層で `ErrorMsg` に日本語の理由を設定し `bool` で失敗を返す.最終的に `Form` 層が `MessageBox` で通知して起動を中止する | +| 処理中の回復可能エラー | 撮影・保存・色変換中の一時的な失敗 | 例外境界で捕捉し,`ShowMessage` でユーザーに通知して当該処理のみ中断する(アプリは継続).UI 状態を適切に復帰させる | +| プログラミングエラー(バグ) | null 参照,配列範囲外,想定外の状態 | 握りつぶさない.`Debug.WriteLine` で記録し,原則そのまま伝播させて開発中に検知する | + +## エラーの処理方法 (Handling) + +### 起動時のエラー + +- `Connect()` / `Open()` 等の初期化メソッドは `bool` を返し,失敗時は `ErrorMsg` に日本語の理由を設定する. +- ユーザーへの通知は `Form` 層の `MessageBox.Show` に集約する.下位層(カメラ・光源・設定)は UI を直接呼び出さない. + +### 処理中のエラー + +- 撮影・保存・色変換など,失敗が想定される境界で例外を捕捉し,`_form.ShowMessage` で通知して当該処理を中断する. +- 中断時は UI 状態(`EnableShots` 等)を必ず復帰させる. +- スレッド同期に関わる資源は,例外時にも `finally` で確実に終端する(例: `BlockingCollection` の `CompleteAdding()` を `finally` で呼び,消費側スレッドを停止させる). + +### 共通ルール + +- 例外を握りつぶす空の `catch` を禁止する.`catch` する場合は必ず「ログ出力+ユーザー通知」または「再スロー」のいずれかを行う. +- `Mat`・`StreamWriter`・スレッド同期資源などは `using` または `try-finally` で確実に解放する. + +## ログ出力 (Logging) + +- **ログは `Debug.WriteLine` のみを使用する**.永続ログファイルは作成しない(リリースビルドでは出力されない点を許容する). +- 用途は開発・デバッグ時のトレース(パラメータ値,処理の節目,捕捉した例外の内容)とする. +- ユーザーに見せるメッセージは `ShowMessage` / `MessageBox` で行い,`Debug.WriteLine` と役割を分ける(ログ=開発者向け,メッセージ=利用者向け). + +※ 将来,撮影現場でのトラブル解析のために永続的な記録が必要になった場合は,ログファイル方式への変更を別途検討し,本方針を更新する. + +## 関連 (Related) + +- テストとの関係は [testing](testing.md) を参照する(エラー処理のうち純粋ロジックで検証可能な部分は自動テストの対象とする). diff --git a/.claude/rules/git-conventions.md b/.claude/rules/git-conventions.md new file mode 100644 index 0000000..8c4dd97 --- /dev/null +++ b/.claude/rules/git-conventions.md @@ -0,0 +1,67 @@ +# Git 運用ルール (Git Conventions) + +Git 操作(ブランチ作成・コミット・PR)を行うときは常に本ルールに従うこと. +push・PR 作成・マージ・クリーンアップの具体的な手順とトラブルシューティング(コンフリクト解消・誤コミット復旧)は `.claude/skills/commit/reference.md` を参照する. + +## 基本方針 (Basic Policy) + +コードの整合性を保ち,手戻りを防ぐために,開発モード(solo / team)を問わず以下の運用を徹底する. + +- **メインブランチ (main)**: + - 本番環境または常に動作可能な状態を維持するブランチ. + - 直接のコミット(直プッシュ)は禁止する.必ずプルリクエスト(PR)経由でマージする. +- **作業ブランチ (Feature Branch)**: + - 機能追加やバグ修正ごとに `main` から派生させて作成する. + - 作業完了後,`main` へマージし,原則として削除する. +- **`.gitignore`**: + - リポジトリ作成時に必ず整備する. + - ビルド成果物,依存パッケージ(`node_modules/` 等),環境変数ファイル(`.env` 等)は必ず除外する. + - `git add .` を安全に使うための前提条件であるため,メンバー追加時にも確認する. + +## ブランチ命名規則 (Branch Naming) + +### プレフィックス (Prefix) + +作業の種類を一目で判別するために,以下のプレフィックスを使用する. + +| プレフィックス | 用途 | +| --- | --- | +| `feature/` | 新機能の実装,仕様変更 | +| `fix/` | バグ修正 | +| `refactor/` | コードの整理(挙動は変えない) | +| `docs/` | ドキュメントの追記・修正 | +| `chore/` | ビルド設定やツール導入など,雑多な作業 | + +### 書式 (Format) + +- 書式: `[プレフィックス][概要]` +- 区切り: スラッシュ `/` を使用する.概要内の単語区切りはハイフン `-` を使用する. +- 概要: 作業内容を端的に表す英単語 2〜4 語程度(小文字)とする. +- 例: + - `feature/player-jump` + - `fix/collision-bug` + - `docs/guide-update` + +## コミットメッセージ (Commit Messages) + +### 書式 + +- 書式: `[タグ] 内容` +- 言語: 日本語 +- 句読点: 末尾に句点は不要 + +### タグ一覧 + +| タグ | 用途 | +| --- | --- | +| `[add]` | ファイルや機能の追加 | +| `[update]` | 機能やデータの更新・修正 | +| `[fix]` | バグ修正 | +| `[remove]` | 削除 | +| `[clean]` | 整理,リファクタリング | + +## コミットの粒度 (Commit Granularity) + +- 作業単位(意味のあるまとまり)ごとにコミットする. +- 巨大なコミットは避け,レビューしやすい粒度を心がける. +- PR の `--title` はコミットメッセージと同じ書式(`[タグ] 内容`)とする. diff --git a/.claude/rules/markdown-style.md b/.claude/rules/markdown-style.md new file mode 100644 index 0000000..b05a532 --- /dev/null +++ b/.claude/rules/markdown-style.md @@ -0,0 +1,118 @@ +--- +paths: ["**/*.md"] +--- + +# ドキュメント作成ガイドライン (Documentation Style Guide) + +本ルールはプロジェクト内のマークダウンドキュメントの書式を統一するためのルールを定める.Markdown ファイルを作成・編集するときは必ず従うこと. +基本方針として [Google Markdown Style Guide](https://google.github.io/styleguide/docguide/style.html) および [markdownlint](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md) のルールに準拠し,本ガイドで上書きする項目のみ以下に記載する. + +## 基本フォーマット (Basic Format) + +- 文字コード: UTF-8 +- 改行コード: LF(推奨)または CRLF +- ファイル拡張子: `.md` +- ファイル末尾: 空行を 1 行入れて終了する(MD047) + +## 句読点・約物 (Punctuation) + +- 句読点: 「,」(全角カンマ)と「.」(全角ピリオド)を使用する. + - 「、」「。」は使用しない. +- コロン: 半角コロン+半角スペース「: 」を使用する. + - NG: 全角コロン「:」,スペースなし「:」 +- 括弧: 原則として半角 `( )` を使用する.強調や補足には全角 `( )` や `「 」` も許容する. +- 注釈: 補足には「※」(全角米印)+半角スペースを使用する. + - 例: ※ shared は client/server 両方から import して使用する. + +## 見出し (Headings) + +ATX スタイル(`#`)を使用する.Setext スタイル(`===` / `---` の下線)は使用しない. + +- `#` の後に半角スペースを 1 つ入れる(MD018) +- 見出しの前後に空行を 1 行入れる(MD022) +- 見出しレベルは飛ばさない(MD001) + - NG: `#` の直下に `###` +- ドキュメント内の `#`(H1)は 1 つだけにする(MD025) +- 見出しには番号を付けない.マークダウンの見出し構造で階層を表現する. +- 見出しの書式: `タイトル (English Title)` + - 例: `## 基本設計 (Basic Design)` + +### 見出しレベルの対応表 + +| レベル | 記法 | 用途 | +| --- | --- | --- | +| H1 | `#` | ドキュメントタイトル(ファイルに 1 つ) | +| H2 | `##` | 大見出し(セクション) | +| H3 | `###` | 中見出し(サブセクション) | +| H4 | `####` | 小見出し(トピック) | + +## リスト (Lists) + +- 箇条書きには `- `(半角ハイフン+半角スペース)を使用する(MD004) + - `*` `+` `・` は使用しない. +- ネストは 2 スペースでインデントする(MD007) +- 順序付きリストは `1.` の連番で記述する. +- リストの前後に空行を 1 行入れる(MD032) + +## 強調 (Emphasis) + +- 太字: `**テキスト**` を使用する.`__テキスト__` は使用しない(MD050) +- 斜体: `*テキスト*` を使用する.`_テキスト_` は使用しない(MD049) +- 太字斜体: `***テキスト***` を使用する. + +## コードブロック・インラインコード (Code) + +- コードブロックにはフェンス(` ``` `)を使用し,言語名を明記する(MD040) + + ````markdown + ```dart + final name = 'DxNavi'; + ``` + ```` + +- インラインコードにはバッククォート `` ` `` を使用する. + - 例: `build_runner` コマンドを実行する. +- コマンド例にはシェル言語を指定する. + + ````markdown + ```bash + dart run build_runner build --delete-conflicting-outputs + ``` + ```` + +## リンク・画像 (Links & Images) + +- リンク: `[テキスト](URL)` 形式を使用する. +- 画像: `![代替テキスト](パス)` 形式を使用し,代替テキストを必ず記述する(MD045) +- プロジェクト内リンクは相対パスを使用する. + +## テーブル (Tables) + +- ヘッダー行とセパレータ行を必ず含める. +- セル内は簡潔に記述し,長い場合はリンクや脚注で補足する. + +```markdown +| 項目 | 説明 | +| --- | --- | +| 名前 | 値 | +``` + +## 空行・余白 (Spacing) + +- 連続する空行は最大 1 行までとする(MD012) +- 見出し・リスト・コードブロックの前後に空行を 1 行入れる(MD022, MD031, MD032) +- 行末の不要な空白は削除する(MD009) + +## その他 (Miscellaneous) + +- HTML タグは原則使用しない.マークダウン記法で表現できない場合のみ許容する. +- 1 行の長さに厳密な上限は設けないが,可読性のために適度に改行する. +- ディレクトリ構造の表現にはコードブロック内でツリー記号(`├──`,`│`,`└──`)を使用する. + +```text +project/ +├── lib/ +│ ├── core/ +│ └── features/ +└── test/ +``` diff --git a/.claude/rules/progress-log.md b/.claude/rules/progress-log.md new file mode 100644 index 0000000..cd788a3 --- /dev/null +++ b/.claude/rules/progress-log.md @@ -0,0 +1,64 @@ +--- +paths: ["CLAUDE.md", "docs/PROGRESS.md"] +--- + +# 進捗記録の運用ルール (Progress Log Rules) + +`CLAUDE.md` の「開発進捗」セクションと `docs/PROGRESS.md` を更新するときは本ルールに従うこと. + +> ⚠ **チーム開発モード(team)では本ルールは上書きされる**.team プロジェクトでは進捗を `CLAUDE.md`・`docs/PROGRESS.md` に書かず,GitHub Issues と git 履歴で追う([GUIDE_03](../../docs/01_GUIDE/GUIDE_03_チーム開発ルール.md)).以下は個人開発モード(solo)の既定ルールである.team モードでは Phase 4 の進捗更新を Issue コメント(`/task-handoff` 等)に置き換える. + +## 二段構成 (Two-tier Structure) + +進捗記録は **2 ファイルの二段構成**で管理する.`/implement` の Phase 4 や `/setup` 中断時にこれらを更新する. + +| ファイル | 役割 | 更新方法 | +| --- | --- | --- | +| `CLAUDE.md` の「開発進捗」セクション | **最新ステップ 1 行のみ**(毎ターン読み込まれる薄い目印) | 上書き | +| `docs/PROGRESS.md` | **追記型のフル進捗ログ**(動機・設計判断・失敗パターン含む) | 末尾に追記 | + +**背景**: CLAUDE.md は毎ターン読み込まれるため,追記型運用にするとコンテキスト圧迫の原因になる.一方で進捗の経緯・失敗パターン・設計判断はタスクを跨いで価値があるため捨てたくない.そこで「常に読まれる薄いポインタ(CLAUDE.md)」と「必要な時だけ読む厚いログ(PROGRESS.md)」に分離する.関数名・引数・テスト件数等の実装詳細は `git log` とコミットメッセージに完全な形で残るため,どちらにも書かない. + +## CLAUDE.md「開発進捗」の書き方 + +- **最新 1 行のみ**.古い行は上書きで消す(履歴は PROGRESS.md に残るので消えてよい) +- 基本形式: `最新: <ステップ見出し>` +- 関数名・テスト件数・実装手順詳細は書かない(PROGRESS.md と `git log` に任せる) + +## docs/PROGRESS.md の書き方 + +`docs/PROGRESS.md` は追記型.最新エントリを**末尾に追記**する(時系列順.古いものが上,新しいものが下). + +**書く(PROGRESS.md に残す価値が高いもの)**: + +以下は PROGRESS.md に置く価値があるが,全て書く必要はない.シンプルなステップなら状況の 1 行だけで十分.書くことが少ない時に無理に伸ばさない. + +- 状況: 何が完了したか(1 行) +- 動機・原因: なぜそれをやったか(既存の問題点・要件変更・前バージョンの欠点など) +- 重要な設計判断: 他案との比較が必要な場合のみ.「A 案ではなく B 案を選んだ理由」が将来の判断材料になるとき +- 失敗パターンの圧縮サマリ: 「① X 案 → Y で破綻 / ② Z 案で解決」のような 1〜2 行.同じ轍を踏まないための知識として残す.試行錯誤を時系列で全部書かず,本質的に異なるアプローチの失敗だけを並列項目として記録する +- 未実装・後段: 「次に何をすべきか」を思い出すための短いメモ + +**書かない(コミットメッセージと `git log` に任せる)**: + +以下は `git log ` または `git show ` で完全な情報が取れる.PROGRESS.md に書くと重複・陳腐化する. + +- 関数名・引数・型シグネチャ +- テスト件数の内訳(合計件数のみなら可だが数字は陳腐化するので省略推奨) +- リファクタリングの手順詳細 +- 撤去・新規追加の関数リスト +- 具体的な定数値・閾値(設計判断の核心に関わるものを除く) +- 数値範囲の細部(実装パラメータ等) +- 後方互換性の細かい仕様 +- 「全テスト N passed」の報告(pass している前提のため不要) + +**長さと書式**: + +- 1 エントリの長さは内容次第で可変.書くことが少なければ **1 行で十分**.複数系統の作業を 1 ステップにまとめた等で必要なら長くなってもよい.無理に伸ばさず無理に削らず,「未来の自分(または他人)が辿れるか」だけを基準にする +- 基本形式: `- [x] **<簡潔な見出し>**: <1〜2 文の要約>`.必要に応じて下に動機・設計判断・失敗パターンを 1〜2 行ずつ追加 +- 太字は**見出しに使う**(目次の項目として目立たせる).本文中で多用しない +- 長い箇条書きを避ける.箇条書きは「失敗パターン ① ② ③」のような本質的に異なる選択肢の並列項目に限定する + +**既存エントリの長文化に気付いたとき**: + +過去のエントリで「詳細をベタ書きしていて目次として機能しなくなっている」ものを見つけたら,ユーザーに圧縮を提案する.自動で削らない(背景情報の価値判断はユーザーが行う).提案時は「この情報は `git log` にあるので削れる / これは失敗パターンなので残すべき」のように切り分けて示すこと. diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 0000000..7134d93 --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,104 @@ +--- +paths: ["TIASshot.Tests/**", "TIASshot/**/*.cs"] +--- + +# テスト方針 (Testing Policy) + +本プロジェクトのテストの種類・粒度・対象範囲・実行タイミングを定める. +具体的な回帰テスト手順は [TEST_01_テスト仕様](../../docs/06_TEST/TEST_01_テスト仕様.md) を参照する(本 rule は方針,TEST_01 は具体手順という役割分担). + +## 基本方針 (Basic Policy) + +本プロジェクトは実機カメラ(Lucam / ImagingSource)・光源・ネイティブライブラリ(OpenCvSharp)に強く依存する一方で,画像処理・色補正・設定読み込み等のハードウェアに依存しない純粋ロジックも含む.この性質に合わせ,コードを 2 層に分けてテストする. + +- **ピュアロジック層**: ハードウェア・UI・スレッドに依存しない計算/変換ロジック.**自動テスト(単体テスト)で回帰を担保する**. +- **ハードウェア結合層**: カメラ SDK・`Form1`(WinForms UI)・撮影/プレビューのスレッド・コールバックに密結合した処理.**自動テストの対象外**とし,ビルドテスト+手動テスト+実機回帰テストで担保する. + +「テストできない」と「テストしていない」を混同しない.ハードウェア結合層は原理的に自動テストが困難なため対象外とするが,ピュアロジック層は自動テスト可能であり,必ずテストを書く. + +標準に則る.NUnit の慣例(AAA: Arrange-Act-Assert)に従い,テストは実装のなぞり書きではなく**仕様(期待される入出力)を基準**に書く. + +## テストの種類 (Test Types) + +| 種類 | 対象 | 自動化 | 実行タイミング | +| --- | --- | --- | --- | +| 単体テスト | ピュアロジック層 | 自動(NUnit) | コミット前・`/implement` Phase 2 | +| ビルドテスト | ソリューション全体 | 自動(MSBuild) | 全コミット前 | +| 回帰テスト | 色補正・チャート検出の出力 | 半自動(基準データ比較) | リファクタ・修正の前後 | +| 手動テスト | 起動〜撮影〜保存の一連動作 | 手動(実機) | 機能追加・修正の完了時 | + +回帰テスト・手動テストの具体手順は [TEST_01_テスト仕様](../../docs/06_TEST/TEST_01_テスト仕様.md) に記載する. + +## テスト対象の切り分け (Test Scope) + +どのクラス・処理を自動テストの対象とするかを明示する.新しいコードを追加した際は,この表に従って対象/対象外を判断する. + +### 自動テスト対象(ピュアロジック層) + +| 対象 | テスト内容の例 | +| --- | --- | +| `ColorCorrection/ColorCorrector` | 次元拡張(`ExtendMat`)・変換行列算出・色変換の入出力.既知の入力 Mat に対する出力 Mat/数値の検証 | +| `ChartDetection/ChartDetector` | 既知のチャート画像を入力したときのマスク位置・検出結果の幾何的検証 | +| `Config` | 設定 XML のパース・型変換・範囲フィルタ(例: チャネル数の `4〜17` 絞り込み) | +| `Utils/IoUtil` | CSV の読み書き往復(`SaveMatToCsv` → `LoadMatFromCsv`)で値が保たれること | +| ゲイン更新比率の計算(`GetRatio` 相当) | 入力値・目標値・更新レートに対する比率計算 | + +### 自動テスト対象外(ハードウェア結合層) + +| 対象 | 対象外の理由 | +| --- | --- | +| `Cameras/CameraBase`・`IScam`・`Lucam` のカメラ制御・撮影/プレビュー | カメラ SDK(`dll.*` / `TIS.Imaging.*`)・フレームコールバック・実機に依存 | +| 撮影/保存のスレッド連携(`RunShotLoop` / `SaveThread`) | カメラフレーム取得・`Form1` に依存.スレッド安全性は設計レビューと実機で担保 | +| `UI/Form1`・`UI/PreviewMonitor` | WinForms UI スレッド・画面描画に依存 | +| `LightSource` | 光源のシリアル通信(実機)に依存 | + +※ ハードウェア結合層に手を入れた場合は,自動テストの代わりに**設計レビュー+実機回帰**で挙動を確認する.`/implement` の Tester フェーズでは,対象がハードウェア結合層の場合,無理にモックを作らず設計レビューで判断してよい. + +## フレームワークと配置 (Framework & Layout) + +- **フレームワーク**: NUnit(`NUnit3TestAdapter` で Visual Studio / `dotnet test` から実行). +- **テストプロジェクト**: `TIASshot.Tests`(**x64 / .NET Framework 4.8**.本体と同一ターゲット). +- **ネイティブ依存**: `ColorCorrector` 等のテストは OpenCvSharp のネイティブ DLL をロードするため,テストプロジェクトも **x64 必須**かつ OpenCvSharp ランタイムを参照すること(プラットフォームを `AnyCPU` にすると Mat 演算が実行時に失敗する). +- **配置**: ソリューションルート直下にテストプロジェクトを置く. + +```text +TIASshot/ ← ソリューションルート +├── TIASshot.sln +├── TIASshot/ ← 本体プロジェクト +└── TIASshot.Tests/ ← テストプロジェクト(NUnit) + ├── ColorCorrectorTests.cs + ├── ConfigTests.cs + └── ... +``` + +- **命名**: テストクラスは `<対象クラス>Tests`,テストメソッドは「対象_条件_期待結果」が分かる名前にする(日本語名も可). +- **粒度**: 1 テストにつき 1 つの検証観点とする.1 メソッドで多数の `Assert` を詰め込まない. +- **テストデータ**: 入力画像・基準 CSV 等は `TIASshot.Tests` 配下の専用フォルダ(例: `TestData/`)に置き,テストから相対参照する. + +## テストの実行 (Running Tests) + +テストプロジェクトは本体に合わせたレガシー形式(packages.config)のため `dotnet test` は使えない.ビルド後に `vstest.console.exe` を **x64** で実行する(ネイティブ DLL を x64 でロードするため). + +```powershell +& "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe" TIASshot.sln /t:Build /p:Configuration=Debug /p:Platform=x64 +& "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" /Platform:x64 +``` + +Visual Studio 上ではテストエクスプローラーから実行できる(プラットフォームを x64 にすること). + +## モック方針 (Mocking) + +- **過剰なモックを避ける**.ピュアロジックは実値(実際の Mat・数値)で検証する. +- **静的依存の扱い**: `Config` のような静的クラスへの依存がテストの妨げになる場合,テスト容易化のための最小限のシーム(引数化・依存の注入)を導入してよい.ただし**本番の挙動は変えない**こと. +- **ハードウェア SDK はモックしない**.モックしてまでテストする価値が低く,対象外(ハードウェア結合層)とする方針と整合させる. + +## カバレッジ方針 (Coverage) + +- **数値的なカバレッジノルマは課さない**.カバレッジ率の達成自体を目的化しない. +- 代わりに,**重要な計算経路を網羅する**ことを定性的な目標とする.具体的には,色変換行列の算出・次元拡張・CSV 往復・ゲイン更新比率といった「誤ると出力が壊れる中核ロジック」にテストを行き渡らせる. + +## 既存ドキュメントとの関係 (Relation to Existing Docs) + +- 本 rule(`.claude/rules/testing.md`)は**テストの方針**を定める. +- [TEST_01_テスト仕様](../../docs/06_TEST/TEST_01_テスト仕様.md) は**回帰テスト・手動テストの具体手順**(基準データの作成・比較方法・合格条件)を定める. +- 自動テスト(単体テスト)の具体的なケースが増えた場合は,`docs/06_TEST/` に追記する(本 rule には方針のみ残し,個別ケースは重複させない). diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..3b0ffd7 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,15 @@ +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Read|Write|Edit|Glob|Grep|Bash", + "hooks": [ + { + "type": "command", + "command": "python .claude/hooks/restrict_repo_access.py" + } + ] + } + ] + } +} diff --git a/.claude/skills/auto-audit/SKILL.md b/.claude/skills/auto-audit/SKILL.md new file mode 100644 index 0000000..3137e70 --- /dev/null +++ b/.claude/skills/auto-audit/SKILL.md @@ -0,0 +1,255 @@ +--- +name: auto-audit +model: opus +description: "放置中(無人)に自律的に回り続け,空き時間をコードベース全体の「バグ発見」と「脆弱性発見」に充てる巡回ループ.メインは薄い司令塔として振る舞い,各指摘の裏取り〜修正〜検証を「1指摘=1体の項目オーケストレータ」に隔離コンテキストで完走させる(内部で tester/coder 等の専門エージェントを使い分ける).見つけた指摘を独立検証(裏取り)した上で,バグを再現して落ちるテスト(赤→緑)で修正の正しさを担保できるものだけを積極的に自動修正し,再現テストが書けない/挙動判断が要るものは台帳に報告する.影響範囲を解析し,各修正について人間が行うべき動作確認を添えて報告する.専用ブランチ(fix/)へ自律コミットするが push・PR・マージはしない." +argument-hint: "[bug|security|all(省略時 all)] [対象ディレクトリ/モジュールの絞り込み(省略可)]" +--- + +あなたは**自律バグ/脆弱性 監査ループの制御層(オーケストレータ)**です. +ユーザーが席を外している無人時間に,空いた稼働枠を「コードベース全体を巡回してバグ・脆弱性を発見し,安全に直せるものを直す」ことに充てるために起動されました. +Git 規約(`.claude/rules/git-conventions.md`),GUIDE_02(エージェント運用)を読み,書式・規約・パイプラインのルールを理解した上で,以下の不変条件を厳守してループを回してください. + +このループが扱う作業は,入口の「発見の観点」が **2 種類**あるだけで,後段の「修正の機械」は共通です. + +- **バグ観点 (bug)**:null 参照・境界値/オフバイワン・条件式の反転・誤った演算子・例外未処理・リソースリーク・競合・型の取り違え・戻り値の取り違え等,**実装が意図に反して壊れている**箇所. +- **脆弱性観点 (security)**:インジェクション(SQL/コマンド/パス),入力検証欠如,認証・認可の抜け,秘匿情報のハードコード/ログ漏れ,安全でない乱数/暗号,既知 CVE を持つ依存等,**セキュリティ上の欠陥**. + +いずれで見つけた指摘も,後述の **4 ゲート(裏取り → 再現テスト先行 → 影響範囲解析 → 影響評価つき報告)** を通す.違いは「何を探すか」だけで,「どう安全に直すか」は同じ. + +## 二層構造 — 誰が何をするか(重要・このコマンドの核) + +このループは**コンテキストを薄く保ったまま長時間回す**ために,責務を階層で分ける.メインは自分でコードやテストを触らず,指摘1件ごとに専用の作業体を起動し,**その最終報告(構造化サマリ)だけ**を受け取って台帳に反映する.こうするとメインには各指摘の詳細な読み込み・思考が積もらず,長時間・大規模でも司令塔のコンテキストが一定に保たれる.一方で専門エージェントの役割分担(独立したテスト作成・修正)はそのまま維持される(サブエージェントの内部コンテキストはメインに戻らないため,両立できる). + +- **① ループ制御層(あなた=メイン)**:セットアップ,台帳の読み書き,発見の起動,指摘の選定,**項目オーケストレータの起動**,返ってきた構造化サマリの台帳反映,収束判定,完了報告のみを行う.**自分でコード・テストを編集しない.指摘の詳細な裏取り・修正・検証はすべて下層に委ねる**(メインを薄く保つため). +- **② 項目オーケストレータ(1指摘=1体)**:メインから渡された**1つの指摘**について,4 ゲートを隔離コンテキストで**丸ごと完走**する司令塔.内部で下層の専門エージェントを使い分け,最後に**構造化サマリ1通**をメインへ返す.自動修正できたものは自分で `fix/` ブランチへコミットする. +- **③ 専門エージェント(項目オーケストレータが内部で使う)**: + - **発見**:`Explore`(読み取り専用で候補箇所を広く洗い出す). + - **裏取り(反証)**:独立した検証役(別エージェント)に「これは誤検知だ」と反証を試みさせる(adversarial verify). + - **再現テスト・特性化テスト**:`tester`. + - **修正**:`coder`. + - ※ 専門エージェントへの委譲が使えない環境では,項目オーケストレータが同じ手順(別ステップ・赤→緑規律)を自分で行ってよい.ただし**テスト作成と修正は必ず別ステップ**とし,独立性と赤→緑の規律を崩さない. + +### 二層で回すときの鉄則 + +- **メインは逐次に1体ずつ**項目オーケストレータを起動する(並行起動しない).同一の作業ツリー・`fix/` ブランチを共有するため,同時にコミットすると競合するため. +- メインが下層へ渡すのは「1つの指摘」と,本コマンドの**不変条件・4 ゲート・検証コマンド・除外リスト・観点フィルタ・既存台帳の要点(既にスキップ/報告済みで再処理不要なもの)**.渡した後はメインは待ち,**返ってきたサマリだけ**を信じて台帳を更新する(下層の詳細をメインが読み返さない=薄さを保つ). +- 発見(`Explore`)はメイン自身の起動でも,項目オーケストレータ内でもよいが,**メインが自分でコードを精読して候補を作らない**(読み込みは `Explore` に出す). + +## このコマンドの位置づけ(重要) + +- 本コマンドは **CLAUDE.md の「`/commit` 自発実行禁止」ルールに対する,ユーザー承認済みの明示的な例外**である(`/auto-refactor` と同格の例外). + - ただし例外が認められるのは **`fix/` 専用ブランチへのコミットに限る**(コミットは項目オーケストレータが行うが,制約は同じ). + - **`git push`・PR 作成・マージ・`main` への操作は一切行わない**(取り込み可否の判断は後で人間が行う). +- 「無人で回り続ける」ことが目的のため,各修正での人間確認は挟まない.これが許される根拠は次の通り: + - **自動修正するのは「再現テストで正しさを証明できたバグ/脆弱性」だけ**である(後述ゲート②).赤→緑になる再現テストと,緑を保つ既存スイートが,人間確認の代わりの安全網を果たす. + - **証明できないもの(正しい挙動が仕様判断になる/テスト基盤が無い UI 層等)は自動で直さず,報告のみに落とす**(後述ゲート②の歯止め).挙動を推測して塗り替えると,間違った仕様に固定してしまうため. + +## 不変条件 (Invariants) — 1つでも破れそうなら停止する + +1. **メインは手を動かさない(二層の分離)**:メイン(制御層)は自分でコード・テストを編集せず,指摘の詳細な裏取り・修正・検証は必ず**項目オーケストレータ**に委ねる.メインが保持するのは台帳・選定・収束判定・報告だけに限る(コンテキストを薄く保ち長時間運転を可能にするため). +2. **項目オーケストレータは逐次1体ずつ**:メインは項目オーケストレータを**並行起動しない**.作業ツリー・`fix/` ブランチを共有するため,同時コミットは競合し破損を招く.1体が完了して返ってから次を起動する. +3. **再現テストで証明できた修正だけを自動適用する**:どんな修正も「そのバグ/脆弱性を再現して**落ちるテスト(修正前は赤)**を書く → 修正 → **そのテストが緑になり,かつ既存の検証スイート全体も緑**」を満たした場合にのみコミットする.再現テストが書けない/緑にできないものは自動修正しない(ゲート②へ). +4. **裏取りしてから触る**:発見した指摘は,独立した視点で「本当にバグ/脆弱性か」を検証し,**誤検知(false positive)を修正対象から除外**してから着手する(ゲート①).確度が低いものは報告のみに落とす. +5. **影響範囲を保護してから直す**:修正するシンボルの呼び出し元・依存先を洗い出し,**テスト未カバーの影響先には先に特性化テスト(現状固定)を足して保護**してから修正する.影響が広すぎて無人で追い切れない場合は自動修正せず報告に落とす(ゲート③). +6. **挙動を戻さない安全網**:修正後に検証スイート(テスト+あればビルド/型チェック/リンタ)が**完全に緑**であること.赤が1つでも出たら,その修正は破棄(revert/stash)して対象を報告に落とす. +7. **専用ブランチのみ**:作業は `fix/` ブランチ上でのみ行う.`main` には絶対にコミットしない. +8. **push/PR しない**:リモート操作は一切しない. +9. **1修正 = 1コミット(テストは別コミット可)**:意味のあるまとまり(1バグ修正/1脆弱性修正)単位でこまめにコミットし,巨大な未コミット差分を溜めない.再現テスト・特性化テストの追加は `[add]`,修正本体は `[fix]` に分けてよい. +10. **除外領域に触れない**:後述の「対象外の領域(除外リスト)」に該当する箇所は修正対象に選ばない. +11. **疑わしきは報告に落とす**:判断に迷う・裏取りで確信が持てない・再現テストが書けない・影響が追い切れない・テストコマンドが特定できない場合は,**無理に直さず報告のみ**にする(報告台帳へ).修正よりも「新規バグを埋め込まないこと」を優先する. +12. **仕様・意図を推測で塗り替えない**:「これは仕様かバグか」の判断が要るものは自動修正しない.コードのコメントやドキュメントが示す意図に明確に反している場合のみ「バグ」と扱い,判断が割れるものは報告に回す. + +## 対象外の領域(除外リスト) — 修正対象に選ばない + +以下は無人で触ると事故りやすい,あるいは本コマンドの責務外のため,**自動修正の対象に選ばない**.発見フェーズで指摘が出ても,修正はせず(重大なら報告のみに落とし)スキップする. + +- 自動生成コード(コードジェネレータ出力,`*.g.dart`,`*.pb.go`,スナップショット等) +- 依存・サードパーティ(`node_modules/`,`vendor/`,`.dart_tool/`,`target/`,ベンダリングされた外部ソース) + - ただし**依存の既知 CVE**(脆弱性観点)は,コードを書き換えるのではなく「どの依存をどのバージョンに上げるべきか」を**報告**する(バージョン更新の自動適用はしない.挙動変化・破壊的変更のリスクがあるため). +- ロックファイル・依存マニフェスト(`package-lock.json`,`yarn.lock`,`pubspec.lock`,`Cargo.lock`,`go.sum` 等) +- マイグレーション・スキーマ履歴(適用済みの DB マイグレーション等) +- 設定・秘匿情報ファイル(`.env*`,CI 設定,各種 config):秘匿情報のハードコード等を見つけた場合は**報告のみ**(無人でのローテーション・秘匿値の書き換えはしない). +- ビルド成果物・キャッシュ(`dist/`,`build/`,`.next/`,`coverage/` 等) +- ドキュメント全般(`docs/`,`CLAUDE.md`,`.claude/` 配下) + +判断に迷うファイルは「触らない(=報告に落とす)」側に倒す(不変条件 10). + +## セットアップ (Pre-check) — ループ開始前に一度だけ(メインが行う) + +1. **観点フィルタと対象範囲の確定**:`$ARGUMENTS` を解釈する. + - 先頭トークンが `bug` / `security` / `all` なら**観点フィルタ**とする(省略時は `all`=バグ+脆弱性の両観点).`bug` はバグ観点のみ,`security` は脆弱性観点のみ. + - 残りのトークンにディレクトリ/モジュールの絞り込みがあればその範囲に限定する.無ければプロジェクト全体を対象候補とする. +2. **ブランチの準備**: + - `git status` で作業ツリーがクリーンか確認する.未コミットの変更があれば,無人で巻き込むのは危険なので**停止して報告**する. + - 現在のブランチを確認する.`main` にいる場合は `.claude/rules/git-conventions.md` のブランチ命名規則に従い `fix/<英単語2〜4語(kebab-case)>` ブランチを作成して移動する(例: `fix/auto-audit`). + - 既に `fix/` ブランチにいる場合はそれを使う.`feature/`・`refactor/` 等の他作業ブランチにいる場合は,混在を避けるため**停止して確認を求める**. +3. **検証スイートの特定**:`docs/02_ENV/ENV_04_開発コマンド.md` が存在すればまずそれを参照する.無ければ(または記載が不足していれば)構成ファイル(`package.json`,`pubspec.yaml`,`Cargo.toml`,`go.mod`,`pyproject.toml`/`pytest.ini` 等)から,以下を特定する. + - **テスト実行コマンドとフレームワーク**(必須). + - 利用可能なら **ビルド/型チェック/リンタのコマンド**(例: `tsc --noEmit`,`cargo build`,`go build ./...`,`flutter analyze`,`npm run lint` 等). + - 以降,**「検証スイート」= テスト+(あれば)ビルド/型チェック/リンタ** をまとめて指す. + - **テストフレームワーク自体が存在せず特定できない場合**は,再現テスト先行(不変条件 3)が成立しないため**自動修正は一切行わず**,発見した指摘を**すべて報告のみ**にするモードで動く(この場合でもループは有用).その旨をセットアップ時に明示し,各項目オーケストレータにも「報告のみモード」を伝える. +4. **ベースラインの確認**:既存テストがある場合は検証スイートを実行し,**開始時点で全て緑**であることを確認する.赤がある場合は,修正の前提(緑からの出発)が崩れているため**停止して報告**する.既存テストが0件でも,フレームワークが特定できていれば「新規に再現テストを書いて流せる」ので開始してよい.ビルド/型チェックがあれば実行して緑を確認する. +5. **台帳の読み込み**:以下のローカル台帳が存在すれば読み込む(無ければ空として扱う).いずれも**ローカルな運用状態であり成果物ではないため `.gitignore` 対象**とする(追跡されていなければ `.gitignore` に追記する).メインは各項目オーケストレータへ「既にスキップ/報告済みの指摘(=再処理不要)」の要点を渡し,二重処理を防ぐ. + - `.claude/auto-audit-report.md`(報告台帳):自動修正しなかった指摘(要人間対応).**既出は再記録しない**(重複・トークン浪費防止).形式は1行1エントリ,先頭にカテゴリを付ける: + - `- [バグ] <箇所> | <重大度: 高/中/低> | <症状/再現手順> | <推定原因> | <提案する修正> | <自動修正しなかった理由> | <日付>` + - `- [脆弱性] <箇所> | <重大度: 高/中/低> | <脆弱性の種別と攻撃シナリオ> | <提案する対策> | <自動修正しなかった理由> | <日付>` + - `.claude/auto-audit-fixed.md`(修正済み台帳):自動修正できた項目の記録(`/loop` で複数回起動されても最終報告を積み上げられるように永続化する).形式は1行1エントリ: + - `- [修正] <箇所> | <バグ/脆弱性の内容> | <加えた変更> | <影響範囲(呼び出し元/依存先)> | <推奨する動作確認> | <コミットハッシュ or 概要> | <日付>` + - `.claude/auto-audit-skip.md`(スキップ台帳):裏取りで**誤検知**と判断した指摘や,安全に扱えず再挑戦しない対象.**再スキャンで同じものを何度も検証しない**ために記録する.形式は1行1エントリ `- <箇所/指摘> | <理由(誤検知/対処不能 等)> | <日付>`. + +## ループ本体 (Loop Body) — メインは薄い司令塔として回す + +メインは自分で指摘を精査せず,**「発見 → 1指摘を選ぶ → 項目オーケストレータに完走委譲 → 返り値を台帳へ」**を繰り返す. + +### ステップ M1: 発見(候補キューの作成) + +- セットアップで確定した範囲・観点フィルタの中から,`Explore` エージェント(読み取り専用)に**候補となる指摘を広く洗い出させ**,短い候補キュー(各エントリ=箇所・一言・観点)を作る.**メイン自身はコードを精読しない**(読み込みは `Explore` に委譲し,メインは一覧だけ保持する). +- 発見は多角的に依頼する(1つの探し方に依存しない):バグ観点なら「境界値・null・例外経路」「並行/状態管理」「戻り値・型」,脆弱性観点なら「入力の流れ(source→sink)」「認証認可」「秘匿情報」「依存 CVE」をそれぞれ探させる. +- **報告台帳・スキップ台帳に既出**の候補はキューから除外する(同じものを再処理しない). +- 候補が1つも無ければ**この回は空振り**として完了報告(収束判定)へ. + +### ステップ M2: 1指摘を選ぶ + +- キューから**未処理の指摘を1つ**選ぶ.優先度の目安(高い順):**セキュリティ高**(インジェクション・認可欠如・秘匿漏れ)→ **バグ高**(データ破壊・クラッシュ・誤った計算結果)→ 中 → 低. +- 選んだらステップ M3 へ.キューが空になったら完了報告へ. + +### ステップ M3: 項目オーケストレータを1体起動(1指摘を完走委譲) + +選んだ指摘について,項目オーケストレータを**1体だけ**(逐次)起動する.次を渡す: + +- **対象の指摘**(箇所・観点・`Explore` が挙げた根拠) +- **不変条件(本コマンドの全項目)・4 ゲートの手順**(下記「項目オーケストレータの憲章」) +- **検証スイートのコマンド**(テスト+あればビルド/型チェック/リンタ),**除外リスト**,**観点フィルタ**,**報告のみモードか否か** +- **既存台帳の要点**(既にスキップ/報告済みで再処理不要な指摘) +- **作業ブランチ名**(`fix/...`)と「push/PR/マージ禁止・`fix/` へのみコミット」の制約 + +起動後はメインは待ち,**返ってきた構造化サマリ(下記フォーマット)だけ**を受け取る.下層の詳細をメインが読み返さない(薄さの維持). + +### ステップ M4: 返り値を台帳へ反映・収束カウント + +項目オーケストレータのサマリに従い,メインが台帳を更新する: + +- **fixed**:`.claude/auto-audit-fixed.md` に返ってきた1行を追記(コミットは項目オーケストレータが実施済み). +- **reported**:`.claude/auto-audit-report.md` に返ってきた1行を追記. +- **skipped**:`.claude/auto-audit-skip.md` に返ってきた1行を追記. +- **stopped**(異常):停止条件に該当.ループを止めて報告へ. + +この回で「実質作業をした件数」(自動修正+**新規に**報告/スキップへ記録した件数)を数え,収束判定に使う.反映したらステップ M2 へ戻る(キューに残りがあれば次の指摘).キューが尽きたら,必要なら M1 を1回だけ再実行して取りこぼしを拾い,それでも候補が無ければ完了報告へ. + +--- + +## 項目オーケストレータの憲章(メインが各指摘とともに渡す) + +あなたは**1つの指摘を担当する項目オーケストレータ**である.渡された指摘について,以下の 4 ゲートを隔離コンテキストで完走し,最後に**構造化サマリ1通**を返す.内部で `tester`/`coder` 等の専門エージェントに委譲してよい(委譲できない場合も,テスト作成と修正は必ず別ステップとし赤→緑規律を守る).本コマンドの不変条件・除外リストを厳守し,`fix/` ブランチにのみコミットする(push/PR/マージ禁止). + +### ゲート①: 裏取り(誤検知を先に殺す・独立検証つき) + +- 指摘が**本当にバグ/脆弱性か**を,コードの実際の挙動・前後の文脈・呼び出され方から確認する. +- さらに**独立した検証役(別エージェント)に「これは誤検知だ」と反証を試みさせる**(adversarial verify).反証役には「デフォルトで誤検知寄りに判断せよ」と指示し,確度を厳しく見る. +- **誤検知,または確度が低い(反証が成立する/判断が割れる)** → 修正しない.`skipped` として返す(スキップ台帳行:`- <箇所> | <理由(誤検知/対処不能 等)> | <日付>`).確度が低いだけで実害があり得るものは `reported`(重大度「低〜中」)で返してもよい. +- **反証を退けて確かにバグ/脆弱性である** → ゲート②へ. + +### ゲート②: 再現テスト先行(修正の正しさを担保する核) + +修正の正しさを証明できるかを,**先にテストで確かめる**.`tester` に委譲してよい. + +1. **再現テストを書く**:その不具合を突く「**修正前は落ちる(赤)**」テストを作る. + - バグ観点:バグを踏む入力を与え,**あるべき正しい結果**をアサートする(現状は誤った結果を返すので赤になる). + - 脆弱性観点:攻撃シナリオを与え,**安全な挙動(拒否・エスケープ・検証エラー等)**をアサートする(現状は脆弱なので赤になる). +2. **赤を確認する**:修正前の現状コードでこのテストが**実際に落ちる**ことを確認する(=バグ/脆弱性が確かに存在する証拠). + - **落ちない(赤にできない)** → 再現できていない.裏取りが甘かった可能性があるため,修正せず `reported` として返す(「再現テストで赤にできなかった」旨を報告行に含める). +3. **正しい挙動が一意に決められるか**を判断する: + - **一意に決められる**(例: off-by-one,null 参照,条件反転,パラメタ化で防げる SQL インジェクション,パスの正規化で防げるトラバーサル等) → 再現テストを `[add]` でコミットしてゲート③へ. + - **仕様判断になる/挙動が割れる/テスト基盤の無い UI 層で観測できない** → **自動修正しない**(不変条件 11).`reported` として返す(「提案する修正・自動修正しなかった理由」を報告行に含める). + - ※ セットアップが「報告のみモード」(テストフレームワーク無し)なら,ここで一律 `reported` として返す. + +### ゲート③: 影響範囲(blast radius)の解析と保護 + +- 修正対象のシンボル(関数/メソッド/クラス)の**呼び出し元・依存先を洗い出す**(参照検索+呼び出し追跡). +- 影響先が**テストで守られていない**箇所 → 先に**特性化テスト(現状の挙動を固定するテスト)**を足して保護する(`tester` に委譲).追加したら `[add]` でコミットする. + - 特性化テストが緑にできない(挙動を固定できない)ほど影響先が不安定 → 無人で安全に直せないため,修正せず `reported` として返す. +- 影響が**広すぎて無人で追い切れない**(多数のモジュール・外部 I/O・非同期経路にまたがる等) → 自動修正せず `reported` として返す. +- 影響先が保護できた → ゲート④の修正実行へ. + +### ゲート④: 修正の実行・検証・影響評価つき記録 + +#### 修正の実行(`coder` に委譲してよい) + +- ゲート②で確認したバグ/脆弱性を修正する.**最小の変更**にとどめ,ついでのリファクタや無関係な整形を混ぜない(影響範囲を絞るため). +- 修正後,**検証スイート全体**(テスト+あればビルド/型チェック/リンタ)を実行する. + +#### 検証(安全網の確認) + +- 次の**両方**を満たすことを確認する: + - ゲート②で書いた**再現テストが緑**になった(=直したいものが直った証拠). + - **既存の検証スイート全体も緑のまま**(=他を壊していない証拠.ゲート③で足した特性化テストも含む). +- **両方満たす** → コミットへ. +- **再現テストが緑にならない/既存スイートに赤が出た** → その修正を破棄(`git checkout -- .` または `git stash`)し,`reported` として返す(「自動修正を試みたが安全に直せなかった/提案する修正」を報告行に含める).追加済みの再現テストは残してよい(後の人間修正の助けになる). + +#### コミット(`fix/` ブランチへ) + +- `git add` で当該変更をステージングする(`.env`・クレデンシャル・ビルド成果物は含めない). +- `.claude/rules/git-conventions.md` のコミット書式に従い,タグ **`[fix]`** でコミットする. + - バグ例: `[fix] 〇〇の境界値でインデックスが1つずれる不具合を修正` + - 脆弱性例: `[fix] 〇〇クエリをパラメタ化して SQL インジェクションを防止` +- **push・PR はしない.** + +#### 影響評価つきサマリを返す(`fixed`) + +修正済み台帳に積むべき1行を含めて `fixed` を返す: +`- [修正] <箇所> | <内容> | <加えた変更> | <影響範囲(呼び出し元/依存先)> | <推奨する動作確認> | <コミット概要> | <日付>` + +- **推奨する動作確認**には,テストで担保しきれない確認を具体的に書く.特に CLAUDE.md の「手動確認が必要な作業」に該当するもの(**実機・ブラウザでの動作確認,外部サービスの挙動**)は名指しで「ここは自動テストで確認できないので人間が確認してほしい」と記す. + +### 項目オーケストレータの返却フォーマット(メインはこれだけで台帳を更新できる) + +作業完了後,次の構造化サマリ**だけ**をメインへ返す(詳細な思考ログは返さない=メインを薄く保つ): + +- **結果種別**:`fixed` / `reported` / `skipped` / `stopped` +- **台帳行**:追記すべき1行(どの台帳か= fixed/report/skip も明示).`stopped` の場合は停止理由. +- **コミット**:作成したコミットのタグと要約(`fixed` のとき,`[add]` の再現/特性化テストと `[fix]` を列挙) +- **作業有無**:この指摘で実質作業をしたか(収束カウント用の真偽) +- **一言**:メインが完了報告に使える要約 + +--- + +## 停止条件 (Stop Conditions) + +以下のいずれかでループを止める. + +- **選べる指摘(バグ/脆弱性)が尽きた** → **正常終了**. +- 項目オーケストレータが `stopped` を返した/同じ箇所で修正が繰り返し赤になる/検証スイートが途中で失敗するようになった → **異常として停止し報告**. +- 未コミットの変更が残ったまま先に進めない状況になった → **停止して報告**. +- 不変条件を満たせない状況になった → **停止して報告**. +- ユーザーが割り込んで中断した → その時点までの成果(コミット済み)は `fix/` ブランチに残る. + +## /loop との併用(推奨される使い方) + +このコマンドは単体で「安全に扱える指摘が尽きるまで」連続実行するが,ユーザーが `/loop` でラップして起動すると,放置中の空き枠を使って自律的に再トリガーし続けられる(本コマンドの本来の目的). +`/loop /auto-audit` で全観点巡回,`/loop /auto-audit security` でセキュリティだけ巡回,のように使い分けられる.`/loop` で回す場合も上記の不変条件・停止条件は同じく厳守すること.長い待機を挟む場合はキャッシュとコストを意識した間隔を選ぶ. + +### 収束条件(loop-until-dry)— 空回りでトークンを浪費しない + +`/loop` で回すと,指摘が尽きた後もウェイクのたびに「対象なし → 即終了」を繰り返し,**無駄にトークンを消費**しうる.これを防ぐため,以下の収束ルールを守る. + +- 各ウェイクの発見(ステップ M1)で候補を洗い出し,**この回で実施した作業の件数**を数える(自動修正した件数+**新規に**報告台帳/スキップ台帳に記録した件数.既出項目の再確認は作業に数えない). +- **作業件数が 0 だった回**を「空振り」とカウントする. +- **空振りが 2 回連続**したら,もう安全に拾える指摘は出尽くしたとみなし,**`/loop` 自体を終了する**(次のウェイクをスケジュールしない). + - 1 回の空振りで即終了しないのは,「順序やコミットの巡り合わせで一時的に拾えなかっただけ」のケースを 1 回分許容するため. +- 1 件でも作業した回が出たら,空振りカウントは 0 にリセットする. +- 終了時は「空振りが続いたため収束した」旨を完了報告に明記する. + +## 完了報告 (Reporting) + +ループ終了時,メインがユーザーに以下を報告する(`.claude/auto-audit-fixed.md` / `-report.md` / `-skip.md` を根拠にする). + +- 作業ブランチ名と,適用した観点フィルタ(bug / security / all)・対象範囲 +- **自動修正した件数と一覧**(`[fix]` コミット).各項目について「加えた変更・影響範囲・**人間が行うべき推奨動作確認**」を添える(修正済み台帳の内容). + - 特に **実機・ブラウザ・外部サービスでの確認**が要るものは名指しで案内する(自動テストで担保できないため). +- 追加した再現テスト・特性化テストの件数(`[add]` コミット) +- **⚠ 自動修正しなかった指摘(要人間対応)**:報告台帳 `.claude/auto-audit-report.md` の `[バグ]`/`[脆弱性]` の件数と概要(重大度順).「正しい挙動が仕様判断になる/影響が追い切れない/再現できなかった」等の**自動修正しなかった理由**を明記し,`/implement` 等での対応を促す. + - 依存の既知 CVE は「どの依存をどのバージョンへ」の形で提示する(バージョン更新は自動適用していない旨も添える). +- 誤検知としてスキップした件数(`.claude/auto-audit-skip.md`) +- 収束理由(指摘が尽きた/空振りが続いた/停止条件に該当,など) +- 次のアクションの案内:「内容を確認の上,問題なければ `/commit push`(または `merge`)で `main` に取り込めます」 + - **本コマンドからは push・PR・マージを行わない.** 取り込みは必ずユーザーの明示指示(`/commit push` 等)で行う. diff --git a/.claude/skills/auto-refactor/SKILL.md b/.claude/skills/auto-refactor/SKILL.md new file mode 100644 index 0000000..ebd9ecb --- /dev/null +++ b/.claude/skills/auto-refactor/SKILL.md @@ -0,0 +1,330 @@ +--- +name: auto-refactor +model: opus +description: "放置中(無人)に自律的に回り続け,空き時間をコード/ドキュメント/テストの整理に充てるループ.メインは薄い司令塔として振る舞い,各作業項目を「1項目=1体の項目オーケストレータ」に隔離コンテキストで完走させる(内部で tester/refactorer 等の専門エージェントを使い分ける).テスト保護下のコードリファクタ,実装を真としたドキュメント追記・整形(矛盾は報告のみ),ミューテーション保護下のテストリファクタを,対象が尽きるまで繰り返し,専用ブランチへ自律コミットする." +argument-hint: "<対象ディレクトリ/モジュールの絞り込み(省略可)>" +--- + +あなたは**自律リファクタリング&ドキュメント同期ループの制御層(オーケストレータ)**です. +ユーザーが席を外している無人時間に,空いた稼働枠を「コードの大規模リファクタリング」と「実装とドキュメントのズレ解消」に充てるために起動されました. +Git 規約(`.claude/rules/git-conventions.md`),GUIDE_02(エージェント運用)と,ドキュメント書式・命名のルール(`.claude/rules/markdown-style.md`・`.claude/rules/docs-naming.md`)を読み,書式・規約・パイプラインのルールを理解した上で,以下の不変条件を厳守してループを回してください. + +このループが扱う作業は **4 種類**ある.前の3種をすべて拾い尽くした後にだけ,最後の「テストリファクタ系」を行う(最も安全網が特殊で危険なため,最後に回す). + +- **コードリファクタ系**:挙動を変えずにコード品質を改善する(安全網=テスト). +- **ドキュメント同期系**:実装を真として `docs/` の記述を実態に近づける.ただし「ドキュメントに無い事項の追記」は自動で行い,「ドキュメントと実装の矛盾」は自動で書き換えず報告のみ(後述). +- **ドキュメントリファクタ系**:ドキュメントの**意味を変えずに**読みやすさ・品質を上げる(冗長表現の簡潔化,表記統一,書式整形,リンク修正等).コードリファクタにおけるテストに相当する「意味が保たれたかの自動検証手段が無い」ため,**情報を削るより残す側に倒す**のが原則(後述の不変条件 11). +- **テストリファクタ系**(前3種が尽きた後のテールフェーズ):肥大化・重複・無意味なテストを整理する.**テストを再実行しても「検証力を弱めた」ことに気づけない**のが根本問題なので,安全網としてミューテーションテストの差分を使う(後述の不変条件 12).使えない場合は構造改善のみ自動・削除/弱体化は提案に落とす. + +## 二層構造 — 誰が何をするか(重要・このコマンドの核) + +このループは**コンテキストを薄く保ったまま長時間回す**ために,責務を階層で分ける.メインは自分でコードやテストを触らず,作業項目1件ごとに専用の作業体を起動し,**その最終報告(構造化サマリ)だけ**を受け取ってコミット結果・要確認リストに反映する.こうするとメインには各項目の詳細な読み込み・思考が積もらず,長時間・大規模でも司令塔のコンテキストが一定に保たれる.一方で専門エージェントの役割分担(独立したテスト作成・リファクタ)はそのまま維持される(サブエージェントの内部コンテキストはメインに戻らないため,両立できる). + +- **① ループ制御層(あなた=メイン)**:セットアップ,台帳の読み書き,発見の起動,作業項目の選定,**項目オーケストレータの起動**,返ってきた構造化サマリの反映(要確認リストへの追記等),収束判定,完了報告のみを行う.**自分でコード・ドキュメント・テストを編集しない.詳細な保護・リファクタ・検証はすべて下層に委ねる**(メインを薄く保つため). +- **② 項目オーケストレータ(1項目=1体)**:メインから渡された**1つの作業項目**について,種別(R/D/DR/T)に応じた処理を隔離コンテキストで**丸ごと完走**する司令塔.内部で下層の専門エージェントを使い分け,最後に**構造化サマリ1通**をメインへ返す.自動で行えたものは自分で `refactor/` ブランチへコミットする. +- **③ 専門エージェント(項目オーケストレータが内部で使う)**: + - **発見**:`Explore`(読み取り専用でリファクタ候補・ドキュメントドリフト・テストスメルを広く洗い出す). + - **特性化テスト**:`tester`. + - **コードリファクタ**:`refactorer`. + - **ドキュメント同期・整形(D/DR)とテストリファクタ(T)**:項目オーケストレータが自身で行ってよい(Dは追記,DRは意味保存の整形,Tは慎重な整理.いずれもテスト/ミューテーションの安全網手順に従う). + - ※ 専門エージェントへの委譲が使えない環境では,項目オーケストレータが同じ手順を自分で行ってよい.ただし**リファクタは必ず「緑のテストで保護された状態」でのみ**行い,安全網の規律を崩さない. + +### 二層で回すときの鉄則 + +- **メインは逐次に1体ずつ**項目オーケストレータを起動する(並行起動しない).同一の作業ツリー・`refactor/` ブランチを共有するため,同時にコミットすると競合するため. +- メインが下層へ渡すのは「1つの作業項目」と,本コマンドの**不変条件・種別ごとの処理手順(R/D/DR/T)・検証コマンド・除外リスト・既存台帳の要点(既にスキップ/記録済みで再処理不要なもの)**.渡した後はメインは待ち,**返ってきたサマリだけ**を信じて反映する(下層の詳細をメインが読み返さない=薄さを保つ). +- 発見(`Explore`)はメイン自身の起動でも,項目オーケストレータ内でもよいが,**メインが自分でコード/ドキュメントを精読して候補を作らない**(読み込みは `Explore` に出す). + +## このコマンドの位置づけ(重要) + +- 本コマンドは **CLAUDE.md の「`/commit` 自発実行禁止」ルールに対する,ユーザー承認済みの明示的な例外**である. + - ただし例外が認められるのは **`refactor/` 専用ブランチへのコミットに限る**(リファクタ・ドキュメント同期いずれの成果もこのブランチに積む). + - **`git push`・PR 作成・マージ・`main` への操作は一切行わない**(マージ可否の判断は後で人間が行う). +- 「無人で回り続ける」ことが目的のため,各 Phase での人間確認は挟まない.これが許される根拠は作業種別ごとに異なる: + - **コードリファクタ系**:リファクタは「挙動を変えない」作業であり,**テストが安全網として人間確認の代わりを果たす**から(テスト無しの箇所には触らない). + - **ドキュメント同期系**:**追記(事実の補完)に限定**し,かつ**矛盾の自動上書きをしない**から.意図的に書かれた記述を壊さず,バグを仕様に固定しない(後述の不変条件 10). + +## 不変条件 (Invariants) — 1つでも破れそうなら停止する + +1. **メインは手を動かさない(二層の分離)**:メイン(制御層)は自分でコード・ドキュメント・テストを編集せず,詳細な保護・リファクタ・検証は必ず**項目オーケストレータ**に委ねる.メインが保持するのは台帳・選定・収束判定・報告だけに限る(コンテキストを薄く保ち長時間運転を可能にするため). +2. **項目オーケストレータは逐次1体ずつ**:メインは項目オーケストレータを**並行起動しない**.作業ツリー・`refactor/` ブランチを共有するため,同時コミットは競合し破損を招く.1体が完了して返ってから次を起動する. +3. **挙動を変えない**:リファクタ前後で**検証スイートが完全に緑のまま**であること(検証スイート=テスト+利用可能ならビルド/型チェック/リンタ.後述).赤が1つでも出たら,その変更は破棄(revert/stash)して対象をスキップする. +4. **テスト保護下で着手する**:リファクタは必ず**安全網(緑のテスト)がある状態**で行う.対象にテストが無い場合は,**まず特性化テスト(現状の挙動を固定するテスト)を生成して保護下にしてから**着手する(後述のステップ R2).テストフレームワーク自体が特定できない/生成テストを流せない箇所は対象にしない. +5. **専用ブランチのみ**:作業は `refactor/` ブランチ上でのみ行う.`main` には絶対にコミットしない. +6. **push/PR しない**:リモート操作は一切しない. +7. **1作業 = 1コミット**:意味のあるまとまり(1リファクタ/1ドキュメント更新)単位でこまめにコミットし,巨大な未コミット差分を溜めない. +8. **除外領域に触れない**:後述の「対象外の領域(除外リスト)」に該当する箇所はリファクタ対象に選ばない. +9. **疑わしきは停止**:判断に迷う・安全網が確認できない・テストコマンドが特定できない場合は,無理に進めず停止して状況を報告する(項目オーケストレータは当該項目を `skipped`/`stopped` として返す). +10. **ドキュメントは「追記は自動・矛盾は報告のみ」**:実装を真としてよいのは**ドキュメントに記載が無い事項の追記**だけ.ドキュメントと実装が**食い違う**箇所は**自動で書き換えず**,要確認リストに記録して報告する(矛盾は実装バグの兆候かもしれず,無人で塗り潰すと検出機会を失うため).`docs/01_GUIDE/`(規約),`CLAUDE.md`,`docs/03_PLAN/`・`docs/PROGRESS.md`(計画・進捗)は実装を真とする対象に**含めない**. +11. **ドキュメントリファクタは「意味保存」が絶対条件**:自動で行ってよいのは**意味・情報を保ったままの品質改善**だけ.具体的には ①無損失整形(表記揺れの統一・書式/見出し/表の整形・リンクや参照の修正・明らかなタイポ)と,②**意味を保った簡潔化・重複の集約**(冗長な言い回しを短くする,同一内容の重複を1か所に集約して他はリンクする).**消してはいけないもの**=事実・決定事項・設計判断(なぜその案にしたか)・失敗パターン・具体的な制約や閾値.これらが落ちる「陳腐化記述の削除」や「大規模な再編」は自動で行わず,要確認リストに**提案として記録**する.意味保存を自動検証する手段は無いため,迷ったら削らない(残す側に倒す). +12. **テストリファクタは「検証力を落とさない」が絶対条件**:テストの整理では「検証スイートが緑」は安全網にならない(削除・弱体化したテストも緑のまま).そこで**ミューテーションテストの差分**を安全網にする — リファクタ前に対象テストが守る本番コード範囲で「殺せるミュータント集合」を基準として取り,リファクタ後も**その全てを殺せたまま**なら検証力は保たれた=安全(削除・統合・簡略化も可).1つでも生存に転じたら検証力低下なので破棄する.ミューテーションテストが**走らせられない**場合(対応ツールが無い/恒久的な依存追加が必要/コスト非現実的)は,**構造改善(extract・共通化・命名・AAA 整理など検証を減らさないもの)のみ自動**とし,**テストの削除・アサーション弱体化・統合は提案として記録**する.テストコードへの自動編集はこのテストリファクタ処理(T)でのみ行う(コードリファクタ R はテストを触らない). + +## 対象外の領域(除外リスト) — コードリファクタの対象に選ばない + +以下は無人で触ると事故りやすく,かつリファクタの価値が薄いため,**コードリファクタの対象に選ばない**.発見・選定時に必ず除外する. + +- 自動生成コード(コードジェネレータ出力,`*.g.dart`,`*.pb.go`,スナップショット等) +- 依存・サードパーティ(`node_modules/`,`vendor/`,`.dart_tool/`,`target/`,ベンダリングされた外部ソース) +- ロックファイル・依存マニフェスト(`package-lock.json`,`yarn.lock`,`pubspec.lock`,`Cargo.lock`,`go.sum` 等) +- マイグレーション・スキーマ履歴(適用済みの DB マイグレーション等,後から書き換えてはいけないもの) +- 設定・秘匿情報(`.env*`,CI 設定,各種 config ファイル) +- ビルド成果物・キャッシュ(`dist/`,`build/`,`.next/`,`coverage/` 等) +- ドキュメント全般(`docs/`,`CLAUDE.md`,`.claude/` 配下) +- テストコード(テストファイル):コードリファクタ R は**本番コードのみ**を対象とし,テストには触らない(テストは安全網のため).テストの整理は専用の**テストリファクタ処理 (T)** で扱う. + +※ ドキュメントはコードリファクタの対象にはしないが,**ドキュメント同期系の処理(D)/ドキュメントリファクタ系の処理(DR)**では `docs/02_ENV/`・`docs/04_SPEC/`・`docs/05_TECH/` を更新対象とする(不変条件 10・11 の範囲で).`docs/01_GUIDE/`・`CLAUDE.md`・`.claude/`・進捗系(`docs/03_PLAN/`・`docs/PROGRESS.md`)は自動編集の対象に**含めない**. + +判断に迷うファイルは「触らない」側に倒す(不変条件 9). + +## セットアップ (Pre-check) — ループ開始前に一度だけ(メインが行う) + +1. **対象範囲の確認**:`$ARGUMENTS` に絞り込み(ディレクトリ/モジュール)があればその範囲に限定する.無ければプロジェクト全体を対象候補とする. +2. **ブランチの準備**: + - `git status` で作業ツリーがクリーンか確認する.未コミットの変更があれば,無人で巻き込むのは危険なので**停止して報告**する. + - 現在のブランチを確認する.`main` にいる場合は `.claude/rules/git-conventions.md` のブランチ命名規則に従い `refactor/<英単語2〜4語(kebab-case)>` ブランチを作成して移動する(例: `refactor/auto-cleanup`). + - 既に `refactor/` ブランチにいる場合はそれを使う.`feature/` 等の他作業ブランチにいる場合は,混在を避けるため**停止して確認を求める**. +3. **検証スイートの特定**:`docs/02_ENV/ENV_04_開発コマンド.md` が存在すればまずそれを参照する.無ければ(または記載が不足していれば)プロジェクトの構成ファイル(`package.json`,`pubspec.yaml`,`Cargo.toml`,`go.mod`,`pyproject.toml`/`pytest.ini` 等)から,以下を特定する. + - **テスト実行コマンドとフレームワーク**(必須). + - 利用可能なら **ビルド/型チェック/リンタのコマンド**(例: `tsc --noEmit`,`cargo build`,`go build ./...`,`flutter analyze`,`npm run lint` 等).これらは「テスト緑」だけでは拾えないコンパイル破壊やリンタ違反を検出する追加の安全網になる. + - 以降,**「検証スイート」= テスト+(あれば)ビルド/型チェック/リンタ** をまとめて指す.緑の判定はこの検証スイート全体で行う. + - テストが1つも無くても,**テストフレームワークが特定でき新規テストを書いて流せる**なら開始してよい(無い箇所は特性化テストを生成して保護下にする). + - テストフレームワーク自体が存在せず特定できない場合は,どの土台でテストを書くかは設計判断が要るため,**無人で土台を新設せず停止して報告**する.ただしこの場合でも**ドキュメント同期系(D)は実行してよい**(テスト不要のため). +4. **ベースラインの確認**:既存テストがある場合は検証スイートを実行し,**開始時点で全て緑**であることを確認する.赤がある場合は,リファクタの前提(緑からの出発)が崩れているため**停止して報告**する.既存テストが0件の場合はテスト実行を省略してよいが,ビルド/型チェックがあれば実行して緑を確認する. +5. **台帳の読み込み**:以下のローカル台帳が存在すれば読み込む(無ければ空として扱う).いずれも**ローカルな運用状態であり成果物ではないため `.gitignore` 対象**とする(追跡されていなければ `.gitignore` に追記する).メインは各項目オーケストレータへ「既にスキップ/記録済みの項目(=再処理不要)」の要点を渡し,二重処理を防ぐ. + - `.claude/auto-refactor-skip.md`(スキップ台帳):過去に安全に扱えなかったリファクタ対象.今回も**再挑戦せず除外**する.形式は1行1エントリ `- <対象> | <理由> | <日付>`. + - `.claude/auto-refactor-doc-review.md`(ドキュメント要確認リスト):過去に検出した「ドキュメントと実装の矛盾」および「自動では行わない簡潔化・再編の提案」.**既出の項目は再記録しない**(重複・トークン浪費防止).形式は1行1エントリ,先頭にカテゴリを付ける: + - 矛盾: `- [矛盾] <箇所> | <ドキュメントの記述> | <実装の挙動> | <推定原因> | <日付>` + - 提案: `- [提案] <箇所> | <提案内容(どう簡潔化/再編したいか)> | <自動で行わない理由> | <日付>` + - `.claude/auto-refactor-test-review.md`(テスト要確認リスト):テストリファクタで「自動では行わなかった削除・統合・弱体化の提案」.**既出は再記録しない**.形式は1行1エントリ `- [提案] <対象テスト> | <提案内容> | <自動で行わない理由(ミューテーション未実施 等)> | <日付>`. + +## ループ本体 (Loop Body) — メインは薄い司令塔として回す + +メインは自分で対象を精査せず,**「発見 → 1項目を選ぶ → 項目オーケストレータに完走委譲 → 返り値を反映」**を繰り返す. + +### ステップ M1: 発見(候補キューの作成) + +- セットアップで確定した範囲の中から,`Explore` エージェント(読み取り専用)に**候補となる作業項目を広く洗い出させ**,短い候補キュー(各エントリ=種別 R/D/DR/T・箇所・一言)を作る.**メイン自身はコード/ドキュメントを精読しない**(読み込みは `Explore` に委譲し,メインは一覧だけ保持する). + - コード(R):重複コード,過度に長い関数,命名の乱れ,デッドコード,複雑な構造(除外リスト・スキップ台帳を除く). + - ドキュメント(D):`docs/02_ENV`・`04_SPEC`・`05_TECH` と実装の**記載漏れ/矛盾**(要確認リスト既出の矛盾は除外). + - ドキュメント整形(DR):同ドキュメント群の冗長・表記揺れ・書式乱れ・重複・リンク切れ. + - テスト(T):肥大化・重複・無意味なテスト(test smells). +- **報告台帳・スキップ台帳・要確認リストに既出**の候補はキューから除外する. +- 候補が1つも無ければ**この回は空振り**として完了報告(収束判定)へ. + +### ステップ M2: 1項目を選ぶ(種別の優先順位を守る) + +- **前3種(R/D/DR)を優先**し,それらが尽きた後にだけ**テストリファクタ(T)**を選ぶ(Tは最も安全網が特殊で危険なため最後に回す). +- 同種内の優先度(コードR):重複コードの集約 → 過度に長い関数の分割 → 命名の改善 → デッドコード除去 → 構造の単純化. +- 選んだらステップ M3 へ.4種すべてに項目が無くなったら完了報告へ. + +### ステップ M3: 項目オーケストレータを1体起動(1項目を完走委譲) + +選んだ作業項目について,項目オーケストレータを**1体だけ**(逐次)起動する.次を渡す: + +- **対象の作業項目**(種別 R/D/DR/T・箇所・`Explore` が挙げた根拠) +- **不変条件(本コマンドの全項目)・種別ごとの処理手順**(下記「項目オーケストレータの憲章」) +- **検証スイートのコマンド**(テスト+あればビルド/型チェック/リンタ),**除外リスト** +- **既存台帳の要点**(既にスキップ/記録済みで再処理不要な項目) +- **作業ブランチ名**(`refactor/...`)と「push/PR/マージ禁止・`refactor/` へのみコミット」の制約 + +起動後はメインは待ち,**返ってきた構造化サマリ(下記フォーマット)だけ**を受け取る.下層の詳細をメインが読み返さない(薄さの維持). + +### ステップ M4: 返り値を反映・収束カウント + +項目オーケストレータのサマリに従い,メインが反映する: + +- **done**:コミットは項目オーケストレータが実施済み(`[add]`/`[clean]`/`[update]`).メインは件数・概要を完了報告用に記録する. +- **doc-review**:`.claude/auto-refactor-doc-review.md` に返ってきた1行(`[矛盾]`/`[提案]`)を追記. +- **test-review**:`.claude/auto-refactor-test-review.md` に返ってきた1行(`[提案]`)を追記. +- **skipped**:`.claude/auto-refactor-skip.md` に返ってきた1行を追記. +- **stopped**(異常):停止条件に該当.ループを止めて報告へ. + +この回で「実質作業をした件数」(コードリファクタ+特性化テスト生成+ドキュメント追記+ドキュメントリファクタ+テストリファクタ+**新規に記録した**矛盾・提案)を数え,収束判定に使う.反映したらステップ M2 へ戻る.キューが尽きたら,必要なら M1 を1回だけ再実行して取りこぼしを拾い,それでも候補が無ければ完了報告へ. + +--- + +## 項目オーケストレータの憲章(メインが各項目とともに渡す) + +あなたは**1つの作業項目を担当する項目オーケストレータ**である.渡された項目の種別(R/D/DR/T)に応じて,以下の処理を隔離コンテキストで完走し,最後に**構造化サマリ1通**を返す.内部で `tester`/`refactorer` に委譲してよい(委譲できない場合も安全網の手順を自分で守る).本コマンドの不変条件・除外リストを厳守し,`refactor/` ブランチにのみコミットする(push/PR/マージ禁止). + +### リファクタ処理 (R) + +#### ステップ R1: 保護状態の確認 + +- 「その箇所を変更したときに失敗するテストが存在するか」を確認する. + - **保護下にある** → ステップ R3 へ. + - **テストが無い** → ステップ R2(特性化テストの生成)へ. + +#### ステップ R2: 特性化テストの生成(テストが無い対象のみ/`tester` に委譲) + +テストが無い対象は,まず安全網を作る.`tester` に以下を委譲する: + +「次の対象に対し,**現状の挙動をそのまま固定する特性化テスト(characterization test)**を作成してください.理想の仕様ではなく,**今のコードが実際に返す挙動**を観測してアサーションに落とすこと(バグも含めて現状を固定する).境界値・主要な分岐・代表的な入出力を網羅してください.作成後にテストを実行し,**現状コードで全て緑**になることを確認してください.緑にできない(=挙動が固定できない)場合は,その旨を報告してください. + +対象: {渡された対象} +テストコマンド: {渡されたコマンド}」 + +- `tester` の報告と実テスト結果を確認する. + - **生成テストが現状コードで全て緑** → これを安全網として `git add` し,タグ **`[add]`** でコミットする(例: `[add] 〇〇モジュールに特性化テストを追加`).**この時点ではまだリファクタしない**.コミット後,この対象を「保護下になった」状態でステップ R3 へ進む. + - **緑にできなかった/挙動が固定できない** → この対象は安全に触れないため変更を破棄し,`skipped` として返す(スキップ台帳行:`- <対象> | <理由> | <日付>`). + +#### ステップ R3: リファクタ前の緑確認 + +- 検証スイート(テスト+あればビルド/型チェック/リンタ)を実行し,緑であることを確認する(ベースライン/生成した特性化テストの再確認). + +#### ステップ R4: リファクタリング実行(`refactorer` に委譲) + +`refactorer` に以下を委譲する: + +「次の対象を,挙動を変えずにリファクタリングしてください.テストを安全網とし,リファクタ後に検証スイートを再実行して**全て緑のまま**であることを必ず確認してください.緑にできない場合は変更を破棄し,その旨を報告してください. + +対象: {渡された対象} +検証コマンド: {渡されたテスト+ビルド/型チェック/リンタのコマンド}」 + +#### ステップ R5: リファクタ後の緑確認 + +- `refactorer` の報告と実際の検証スイートの結果を確認する. +- **全て緑** → ステップ R6 へ. +- **赤がある/緑にできなかった** → その変更を破棄(`git checkout -- .` または `git stash`)し,`skipped` として返す(スキップ台帳行を含める).同じ対象は再選択されない. + +#### ステップ R6: 専用ブランチへコミット + +- `git add` で当該変更をステージングする(`.env`・クレデンシャル・ビルド成果物は含めない). +- `.claude/rules/git-conventions.md` のコミット書式に従い,タグ **`[clean]`** でコミットする(例: `[clean] 重複した入力バリデーションを共通関数に集約`). +- **push・PR はしない.** `done` として返す. + +--- + +### ドキュメント同期処理 (D) + +#### ステップ D1: 実装とドキュメントの突き合わせ + +- 選んだ項目について,**実装(コード)を読み,対応する `docs/02_ENV/`・`docs/04_SPEC/`・`docs/05_TECH/` の記述**を確認する. +- 食い違いの種別を判定する: + - **追記型**:ドキュメントに記載が無いが実装にある(例:新しい環境変数・依存,新規モジュール/API,コードで確定した技術選定や制約) → ステップ D2 へ. + - **矛盾型**:ドキュメントの記述と実装の挙動が**食い違う**(例:仕様では戻り値 A だがコードは B を返す) → ステップ D3 へ. + +#### ステップ D2: 追記(自動/実装を真とする) + +- 実装を真として,該当ドキュメント(`02_ENV`/`04_SPEC`/`05_TECH` の適切な場所)に**事実を追記・補足**する.書式は `.claude/rules/markdown-style.md`,命名は `.claude/rules/docs-naming.md` に従う. +- **既存の意図的な記述は消さない**.追記・補完にとどめ,全面書き換えはしない. +- コミット(`.claude/rules/git-conventions.md` 準拠): + - 新規セクション/新規ドキュメントファイルの追加 → タグ **`[add]`**(例: `[add] 04_SPEC に〇〇APIの仕様を追記`). + - 既存記述への事実追記・補足 → タグ **`[update]`**(例: `[update] 02_ENV に新規環境変数 FOO を追記`). +- `done` として返す. + +#### ステップ D3: 矛盾は報告のみ(自動で書き換えない) + +- **ドキュメントは書き換えない**(不変条件 10).矛盾は実装バグの兆候かもしれず,無人で「実装に合わせて」塗り潰すと検出機会を失う. +- `doc-review` として返す(要確認リスト行:`- [矛盾] <箇所> | <ドキュメントの記述> | <実装の挙動> | <推定原因(仕様が古い/実装バグの疑い 等)> | <日付>`). +- **既に記録済みの矛盾は再記録しない**(既出なら「作業なし」で返す). + +--- + +### ドキュメントリファクタ処理 (DR) + +#### ステップ DR1: 改善方針の判定(意味保存が絶対条件) + +選んだ箇所について,意味・情報を保ったまま改善できるかを判定する(不変条件 11). + +- **無損失整形 or 意味を保った簡潔化/集約** → ステップ DR2 へ(自動で実施). + - 例:冗長な言い回しを短くする,表記揺れ・カタカナ/英字のゆれを統一,見出しレベル・表・コードフェンス・箇条書きの整形,重複説明を1か所に集約して他はリンク,切れたリンクや古い参照(`.claude/rules/docs-naming.md` の命名に照らす)を実在パスに修正,明らかなタイポ修正. +- **情報が落ちる削除・大規模再編**(陳腐化記述の削除,ファイル分割/統合,節の大幅な並べ替え等) → ステップ DR3 へ(自動では行わず提案のみ). + +#### ステップ DR2: ドキュメントリファクタ実施(自動) + +- 該当ドキュメントを,**意味・決定事項・設計判断・失敗パターン・具体的制約を一切落とさずに**整形・簡潔化する.`.claude/rules/markdown-style.md`(書式)・`.claude/rules/docs-naming.md`(命名)に従う. +- 迷ったら削らない(残す側に倒す).少しでも情報が落ちる懸念があれば DR3 に回す. +- `.claude/rules/git-conventions.md` のコミット書式に従い,タグ **`[clean]`** でコミットする(例: `[clean] 04_SPEC の冗長な説明を簡潔化`).`done` として返す. + +#### ステップ DR3: 削除・大規模再編は提案のみ(自動で行わない) + +- 本文は書き換えない.`doc-review` として返す(要確認リスト行:`- [提案] <箇所> | <提案内容(どう簡潔化/再編したいか)> | <自動で行わない理由(情報が落ちうる 等)> | <日付>`). +- **既出の提案は再記録しない**(既出なら「作業なし」で返す). + +--- + +### テストリファクタ処理 (T) — 前3種が尽きた後のテールフェーズ + +テストコードを整理する.**「検証スイートが緑」は安全網にならない**(削除・弱体化したテストも緑のまま)ため,ミューテーションテストの差分を安全網とする(不変条件 12). + +#### ステップ T1: ミューテーション安全網が使えるか判定 + +- 選んだテストと,それが守る**本番コード範囲**を特定する. +- その範囲に対し,**ミューテーションテストを一時的に走らせられるか**を判定する: + - 言語/スタックに対応するツール(例: JS/TS の Stryker,Python の `mutmut`/`cosmic-ray`,Java の PITest,Go の `go-mutesting` 等)を,**依存を恒久追加せず**に実行できるか(`npx`/`uvx`/`pipx run` 等のエフェメラル実行を優先). + - **走らせられる** → ステップ T2(ミューテーション保護下の全自動)へ. + - **走らせられない**(対応ツールが無い/恒久的な依存・設定の追加が必要/リポ規模的にコストが非現実的) → ステップ T3(構造改善のみ自動)へ.恒久セットアップが要る場合は**無人で導入せず**,`test-review` として「ミューテーションテスト導入の提案」を返す. +- コスト対策として,ミューテーションは**対象テストが守る本番コード範囲に限定**して実行する(リポ全体には走らせない). + +#### ステップ T2: ミューテーション保護下のテストリファクタ(全自動) + +1. **基準取得**:対象範囲でミューテーションテストを実行し,現在のテスト群が**殺せるミュータント集合**を基準(baseline)として記録する. +2. **リファクタ実施**:肥大化・重複・無意味なテストを整理する(**削除・統合・簡略化を含めてよい**). +3. **検証**: + - 通常の検証スイートが**緑**であること,かつ + - ミューテーションを再実行し,**baseline で殺せていたミュータントが1つも生存に転じていない**こと(=検証力が落ちていない). + - 両方満たす → タグ **`[clean]`** でコミット(例: `[clean] 重複した〇〇のテストを集約`).**一時的に作成/設定したミューテーション関連の成果物はコミットに含めない**(後始末する).`done` として返す. + - 1つでも生存に転じた/検証スイートが赤 → その変更を破棄(revert/stash)し,検証力が落ちる変更は行わない(必要なら `test-review` として `[提案]` を返す). + +#### ステップ T3: ミューテーションが使えない場合(構造改善のみ自動) + +- **自動でよいのは検証を減らさない構造改善のみ**:共通セットアップの extract,ヘルパー/ビルダーへの集約,テーブル駆動化(パラメタライズ),命名・AAA 構造の整理など.アサーションの数・強さを変えないこと. + - 実施後に検証スイートが緑であることを確認 → タグ **`[clean]`** でコミット.`done` として返す. +- **テストの削除・アサーション弱体化・検証が減りうる統合は自動で行わない**.`test-review` として返す(要確認リスト行:`- [提案] <対象テスト> | <提案内容> | <自動で行わない理由> | <日付>`.既出は再記録しない). + +--- + +### 項目オーケストレータの返却フォーマット(メインはこれだけで反映できる) + +作業完了後,次の構造化サマリ**だけ**をメインへ返す(詳細な思考ログは返さない=メインを薄く保つ): + +- **結果種別**:`done` / `doc-review` / `test-review` / `skipped` / `stopped` +- **コミット**:作成したコミットのタグと要約(`done` のとき,`[add]`/`[clean]`/`[update]` を列挙) +- **リスト行**:`doc-review`/`test-review`/`skipped` のとき,該当台帳へ追記すべき1行.`stopped` の場合は停止理由. +- **作業有無**:この項目で実質作業をしたか(収束カウント用の真偽) +- **一言**:メインが完了報告に使える要約(種別・対象・内容) + +--- + +## 停止条件 (Stop Conditions) + +以下のいずれかでループを止める. + +- **4種すべて(コードリファクタ/ドキュメント同期/ドキュメントリファクタ/テストリファクタ)の作業項目が尽きた** → **正常終了**. +- 項目オーケストレータが `stopped` を返した/同じ箇所で繰り返しテストが赤になる/テストコマンドが途中で失敗するようになった → **異常として停止し報告**. +- 不変条件を満たせない状況になった → **停止して報告**. +- ユーザーが割り込んで中断した → その時点までの成果(コミット済み)は `refactor/` ブランチに残る. + +## /loop との併用(推奨される使い方) + +このコマンドは単体で「作業が尽きるまで」連続実行するが,ユーザーが `/loop` でラップして起動すると,放置中の空き枠を使って自律的に再トリガーし続けられる(本コマンドの本来の目的). +`/loop` で回す場合も上記の不変条件・停止条件は同じく厳守すること.長い待機を挟む場合はキャッシュとコストを意識した間隔を選ぶ. + +### 収束条件(loop-until-dry)— 空回りでトークンを浪費しない + +`/loop` で回すと,作業が尽きた後もウェイクのたびに「対象なし → 即終了」を繰り返し,**無駄にトークンを消費**しうる.これを防ぐため,以下の収束ルールを守る. + +- 各ウェイクの発見(ステップ M1)で候補を洗い出し,**この回で実施した作業の件数**を数える(コードリファクタ+特性化テスト生成+ドキュメント追記+ドキュメントリファクタ+テストリファクタ+**新規に記録した**矛盾・提案.既出項目の再確認は作業に数えない). +- **作業件数が 0 だった回**を「空振り」とカウントする. +- **空振りが 2 回連続**したら,もう安全に拾える作業は出尽くしたとみなし,**`/loop` 自体を終了する**(次のウェイクをスケジュールしない). + - 1 回の空振りで即終了しないのは,「順序やコミットの巡り合わせで一時的に拾えなかっただけ」のケースを 1 回分許容するため. +- 1 件でも作業した回が出たら,空振りカウントは 0 にリセットする. +- 終了時は「空振りが続いたため収束した」旨を完了報告に明記する. + +## 完了報告 (Reporting) + +ループ終了時,メインがユーザーに以下を報告する. + +- 作業ブランチ名 +- 追加した特性化テストの件数(= `[add]` のテストコミット数)と対象モジュールの一覧 +- 実施したリファクタリングの件数(= `[clean]` コミット数)と概要の一覧 +- 更新したドキュメントの件数と内容(`02_ENV`/`04_SPEC`/`05_TECH` への**追記**と,意味を保った**簡潔化・整形**(`[clean]`)の箇所一覧) +- **⚠ ドキュメントと実装の矛盾**:要確認リスト `.claude/auto-refactor-doc-review.md` の `[矛盾]` の件数と概要.**実装バグの可能性があるため自動では直していない**ので,1件ずつ「仕様を直す/実装を直す」を人間が判断してほしい旨を明記する +- **簡潔化・再編の提案**:同リストの `[提案]` の件数と概要(情報が落ちうるため自動では行わなかったもの.採否は人間が判断) +- 整理したテストの件数と概要(`[clean]`).ミューテーションテストを**安全網に使えたか/使えず構造改善のみに留めたか**を明記する +- **テストリファクタの提案**:`.claude/auto-refactor-test-review.md` の `[提案]` の件数と概要(削除・統合・弱体化など自動では行わなかったもの.ミューテーション導入の提案を含む場合はそれも) +- スキップした対象とその理由(挙動が固定できずテスト生成に失敗/検証スイートが緑にできなかった 等).詳細はスキップ台帳 `.claude/auto-refactor-skip.md` に追記済み +- ⚠ 自動生成した特性化テストは**現状の挙動(バグを含む)を固定**したもの.後で内容を一度目視確認することを推奨する旨を添える +- 次のアクションの案内:「内容を確認の上,問題なければ `/commit push`(または `merge`)で `main` に取り込めます」 + - **本コマンドからは push・PR・マージを行わない**.取り込みは必ずユーザーの明示指示(`/commit push` 等)で行う. diff --git a/.claude/skills/commit/SKILL.md b/.claude/skills/commit/SKILL.md new file mode 100644 index 0000000..9e95832 --- /dev/null +++ b/.claude/skills/commit/SKILL.md @@ -0,0 +1,90 @@ +--- +name: commit +model: inherit +description: "Git 規約(.claude/rules/git-conventions.md)に従い,変更内容の確認 → コミットを行う." +argument-hint: "<コミット内容の補足(省略可)>" +disable-model-invocation: true +--- + +あなたは Git 運用の担当者です.Git 規約 `.claude/rules/git-conventions.md` に従い,現在の変更をコミットしてください. +push・PR・マージの詳細手順とトラブル対応は本スキルの `reference.md`(`.claude/skills/commit/reference.md`)を参照する. +確認は不要.すべてのステップを一気に実行すること. + +## ステップ 1: 状態確認 + +以下のコマンドで現在の状態を把握する. + +- `git branch --show-current` で現在のブランチを確認 +- `git status` で変更ファイルの一覧を確認 +- `git diff` および `git diff --cached` で変更内容を確認 + +**main ブランチにいる場合は自動でブランチを作成する:** + +1. 変更内容から `.claude/rules/git-conventions.md` のブランチ命名規則に従い,適切なプレフィックスと英単語 2〜4 語のブランチ名を決定する +2. `git checkout -b {ブランチ名}` で作業ブランチを作成する +3. 以降のステップを続行する + +## ステップ 2: docs/ 更新漏れチェック + +`.claude/commit-context.md` が存在し `docs_updated` が記録されている場合,このステップをスキップする. + +ファイルが存在しない場合(`/implement` を経由していない場合),変更内容を確認し,以下に該当するにもかかわらず docs/ が更新されていない場合は警告する: + +- API やデータ構造の変更 +- 環境設定の変更 +- 開発計画の進捗に関わる変更 +- 規約やルールに関わる変更 + +該当がある場合,「⚠ docs/ の更新が必要かもしれません.確認してください.」と警告する. +更新自体は行わず,ユーザーの判断に委ねる. + +## ステップ 3: コミットメッセージの生成 + +変更内容と $ARGUMENTS(指定がある場合)をもとに,`.claude/rules/git-conventions.md` の「コミットメッセージ」セクションに従ってコミットメッセージを生成する. + +## ステップ 4: CLAUDE.md / PROGRESS.md 更新漏れチェック + +`.claude/commit-context.md` が存在し `claude_md_updated` と `progress_md_updated` が記録されている場合,このステップをスキップする. + +ファイルが存在しない場合(`/implement` を経由していない場合),変更内容に応じて以下の更新が必要か判断する: + +- CLAUDE.md の「開発進捗」セクション(最新 1 行) +- `docs/PROGRESS.md`(追記型フルログ) + +更新されていない場合は「⚠ CLAUDE.md の開発進捗 / docs/PROGRESS.md の更新が必要かもしれません.確認してください.」と警告する. +更新自体は行わず,ユーザーの判断に委ねる. + +## ステップ 5: コミット + +以下を実行する: + +1. `git add` で関連ファイルをステージングする(CLAUDE.md / `docs/PROGRESS.md` の変更がある場合はそれも含める) +2. `git commit -m "{コミットメッセージ}"` でコミットする +3. `.claude/commit-context.md` が存在する場合は削除する + +## ステップ 6: プッシュ・PR・マージ + +$ARGUMENTS に以下のキーワードが含まれる場合のみ,該当する操作を実行する. +**いずれも含まれない場合はこのステップ全体をスキップする.** + +| キーワード | 実行する操作 | +| --- | --- | +| `push` | プッシュ・PR 作成 | +| `merge` | プッシュ・PR 作成・マージ・プル(`push` を含む全操作) | + +### プッシュ・PR 作成 + +1. `git push origin {ブランチ名}` でリモートにプッシュする +2. PR の状態を確認する: + - **既存の PR がある場合**: PR の URL を表示して完了 + - **PR がない場合**: `reference.md` の「プルリクエスト (PR) の作成」に従い PR を作成し,URL を表示する + +### マージ・プル(`merge` の場合のみ) + +1. `reference.md` の「マージの実行」に従いマージする +2. `reference.md` の「ローカル環境のクリーンアップ」に従いローカルを最新化する + +## 注意事項 + +- `.env` やクレデンシャルファイルはステージングしない +- 変更がない場合(`git status` がクリーン)は空コミットせず,その旨を伝えて終了する diff --git a/.claude/skills/commit/reference.md b/.claude/skills/commit/reference.md new file mode 100644 index 0000000..ce0dd41 --- /dev/null +++ b/.claude/skills/commit/reference.md @@ -0,0 +1,115 @@ +# Git 開発フロー・トラブルシューティング (Git Workflow Reference) + +`/commit` の push・PR・マージ処理で参照する詳細手順と,問題発生時の対処手順. +ブランチ命名・コミットメッセージ等の規約は `.claude/rules/git-conventions.md` に従う. + +## 開発フロー (Development Workflow) + +作業ブランチをリモートへ送り,`main` にマージされるまでの手順. + +### リモートへのプッシュ + +作業ブランチをリモートリポジトリへ送信する. + +```bash +git push origin feature/new-function +``` + +### プルリクエスト (PR) の作成 + +GitHub CLI (`gh`) を使用して PR を作成する. + +```bash +gh pr create --title "[add] 新機能を実装" --body "概要" +``` + +- `--title` はコミットメッセージと同じ書式(`[タグ] 内容`)とする. +- 必要に応じて `--reviewer` でレビュワーを指定する. + +### レビューと修正の対応 + +- レビュワーのコメントを確認し,修正が必要な場合はローカルで修正・コミット・プッシュを繰り返す. +- 全ての指摘に対応し,レビュワーから Approve をもらう. + +### マージの実行 + +- マージ方式は「Create a merge commit」を使用する(作業ブランチの全コミット履歴が `main` に残る). + - 「Squash and merge」「Rebase and merge」は使用しない. + +```bash +gh pr merge --merge --delete-branch +``` + +### ローカル環境のクリーンアップ + +マージ完了後はローカル環境も最新状態に戻し,古いブランチを削除する. + +```bash +git checkout main +git pull origin main +git branch -d feature/new-function +``` + +## トラブルシューティング (Troubleshooting) + +### コンフリクトが発生した場合 + +他メンバーの変更と競合した場合の対処手順. + +**main の取り込み** + +作業ブランチに `main` の最新内容をリベースして競合箇所を洗い出す.`merge` ではなく `rebase` を使うことで,履歴が線形に保たれレビューしやすくなる. + +```bash +git checkout main +git pull origin main +git checkout feature/new-function +git rebase main +``` + +**競合の解消** + +エディタ上で `<<<<<<<`,`=======`,`>>>>>>>` で囲まれた箇所を手動で修正する.修正後,以下のコマンドでリベースを続行する. + +```bash +git add [修正したファイル] +git rebase --continue +``` + +**AI 補助によるコンフリクト解消** + +Claude Code にコンフリクトを解消させる場合は,衝突の種類に応じて進め方を変える. + +- **自明・テキスト的な衝突**(import の競合,隣接行の変更など,双方の意図が両立するもの) + - AI が解消してよい.人間は解消結果の要点を確認するだけでよい. +- **意味的な衝突**(両側がロジックを非互換に変更しているもの) + - AI に単一の解決結果を提示させて追認してはならない.AI は以下を提示し,人間が選択する. + - 両側が各々何をしたかったか(自分の Issue と,相手のコミット・Issue の目的) + - 解決候補を 2 つ以上と,各案を採った場合の帰結 + - 影響範囲と壊れうる箇所 + +解消後は衝突の種類によらず,必ずテスト(`/implement` の Tester)と作者による Phase 1 動作確認を行う.人間の判断は「どの意図が正しいか」を,テストは「実際に動くか」を担保するものであり,どちらか一方を省略してはならない. + +**プッシュ** + +全ての競合が解消されたらプッシュする.リベース後は履歴が書き換わるため通常の push は拒否されるが,他メンバーが push 済みの履歴を誤って上書きしないよう,`-f` ではなく `--force-with-lease` を用いる(自分が最後に fetch した時点のリモート状態と一致する場合のみ上書きし,ズレていれば拒否される). + +```bash +git push --force-with-lease origin feature/new-function +``` + +### 間違えて main にコミットしてしまった場合 + +**まだプッシュしていない場合** + +コミットを取り消し,変更内容を保持したまま新しいブランチへ移動する. + +```bash +git reset --soft HEAD^ +git checkout -b feature/new-function +git commit -m "[add] ..." +``` + +**すでにプッシュしてしまった場合** + +`main` への force push はチーム全員の履歴を壊す危険があるため,自分では対処しない.直ちにチームメンバーに報告し,全員で対応方針を決める. diff --git a/.claude/skills/implement/SKILL.md b/.claude/skills/implement/SKILL.md new file mode 100644 index 0000000..0b02744 --- /dev/null +++ b/.claude/skills/implement/SKILL.md @@ -0,0 +1,111 @@ +--- +name: implement +model: opus +description: "実装パイプラインを開始する.コーディング → テスト → リファクタリングの順で 3 つのエージェントを実行し,必要に応じて人間の確認を挟む." +argument-hint: "<タスク内容>" +--- + +あなたはオーケストレーターです. +GUIDE_02(エージェント運用ルール)を読み,パイプラインのルールを理解した上で以下の手順を実行してください. + +## 前提確認 (Pre-check) + +1. 現在のブランチを確認する(`git branch --show-current`) +2. `main` ブランチにいる場合,Git 規約 `.claude/rules/git-conventions.md` に従い作業ブランチを作成する + - 同ルールのブランチ命名規則に従い,適切なプレフィックスとタスク内容を表す英単語 2〜4 語(kebab-case)でブランチ名を決定する +3. 実装対象のタスクを確認する: $ARGUMENTS + +## Phase 1: コーディング (Coder) + +coder エージェントに以下を委譲する: + +「以下のタスクを実装してください: $ARGUMENTS」 + +Coder の出力(実装サマリー)を記録し,ユーザーに提示する: + +「**Phase 1(コーディング)が完了しました.** + +{Coder の実装サマリー} + +ブラウザや実機で動作を確認してください. +- **OK** → 次のフェーズ(テスト)に進みます +- **NG** → 問題点を教えてください.修正します」 + +ユーザーの OK を得るまで Phase 2 に進まないこと. +NG の場合は coder エージェントに修正を委譲し,再度確認を依頼する. + +## Phase 2: テスト (Tester) + +tester エージェントに以下を委譲する: + +「直前の実装に対するテストを,仕様(`docs/04_SPEC/`)を基準に作成・実行してください.テストは実装コードではなく仕様を基準に書くこと. + +実装サマリー: +{Coder の出力}」 + +Tester の出力(テストサマリー)を記録し,テスト結果に応じて分岐する: + +- **全テスト成功**: テストサマリーを表示し,自動的に Phase 3 に進む. +- **テスト失敗あり**: ユーザーに以下を提示し,判断を仰ぐ. + +「**Phase 2(テスト)でテスト失敗がありました.** + +{Tester のテストサマリー} + +テスト失敗の原因を判断してください: +- **仕様の問題** → 仕様の修正方針を教えてください +- **実装の問題** → coder エージェントに修正を委譲します +- **テストの問題** → tester エージェントに修正を委譲します」 + +ユーザーの指示に従い対応した後,再度テストを実行して全テスト成功を確認してから Phase 3 に進む. + +## Phase 3: リファクタリング (Refactorer) + +refactorer エージェントに以下を委譲する: + +「直前の実装・テスト後のコードをリファクタリングしてください. + +実装サマリー: +{Coder の出力} + +テストサマリー: +{Tester の出力}」 + +Refactorer の出力(リファクタリングサマリー)を記録し,確認を挟まず Phase 4 に進む. + +## Phase 4: ドキュメント更新 (Documentation) + +実装内容を以下のチェック観点で確認し,`docs/`, `CLAUDE.md`, `docs/PROGRESS.md` を必要に応じて更新する: + +- API・データ構造の変更 → `docs/04_SPEC/` の該当仕様を更新 +- 環境・依存関係の変更 → `docs/02_ENV/` を更新 +- 起動・テスト・lint 等の開発コマンドの追加・変更 → `docs/02_ENV/ENV_04_開発コマンド.md` を更新(無ければ作成し,CLAUDE.md のドキュメント一覧にリンクを追記する) +- 開発ステップの進捗 → `docs/03_PLAN/` や進捗記録(`CLAUDE.md` の進捗欄+ `docs/PROGRESS.md`)を更新(書式は進捗記録ルール `.claude/rules/progress-log.md` に従う.CLAUDE.md は最新 1 行に上書き,`docs/PROGRESS.md` に詳細を末尾追記.`git log` で取れる詳細は書かない) +- 規約・運用ルールの変更 → `docs/01_GUIDE/` を更新 +- 該当なし(軽微なバグ修正,リファクタリングのみ等)→ 更新をスキップしてよい + +Phase 4 の結果を `.claude/commit-context.md` に書き出す: + +```markdown +# commit-context +- docs_updated: true/false +- claude_md_updated: true/false +- progress_md_updated: true/false +- note: (更新不要の理由や更新内容の要約) +``` + +ドキュメントを更新した場合のみ,ユーザーに提示する: + +「**Phase 4(ドキュメント更新)が完了しました.** + +{更新したドキュメントの一覧と変更内容の要約} + +確認をお願いします. +- **OK** → `/commit` でコミットできます +- **NG** → 修正点を教えてください」 + +更新不要と判断した場合は,確認を挟まず完了処理に進む. + +## 完了処理 (Finalization) + +「全フェーズが完了しました.`/commit` でコミットしてください.」 diff --git a/.claude/skills/set-mode/SKILL.md b/.claude/skills/set-mode/SKILL.md new file mode 100644 index 0000000..8db463a --- /dev/null +++ b/.claude/skills/set-mode/SKILL.md @@ -0,0 +1,174 @@ +--- +name: set-mode +model: inherit +description: "開発モード(solo / team)を切り替える.チーム層ファイル・settings.json・CLAUDE.md・.claude/project-mode を一括で整合させる." +argument-hint: "" +--- + +あなたは開発モード切替の担当者です. +プロジェクトの開発モードを **solo(個人開発)↔ team(チーム開発)** で切り替え,モードに紐づくファイル一式を過不足なく整合させてください. + +`/sync-template` は「テンプレートの版を追従する」道具であり,モード遷移(ファイルの追加・削除,CLAUDE.md/settings.json の書き換え)は行いません.本コマンドがその遷移を担います. + +実行環境: bash(Git Bash または Unix シェル)が必要.`mktemp`, `rm -rf`, `cp`, シェル変数展開を使用する. + +テンプレート URL: `https://github.com/rintoHasegawa/programming-template.git` + +## チーム層ファイル (Team-layer Files) + +モードに応じて配置/削除する対象.`/sync-template` の「モード依存ファイル」と同一のリストに保つこと. + +``` +docs/01_GUIDE/GUIDE_03_チーム開発ルール.md +.claude/skills/task-create/SKILL.md +.claude/skills/task-start/SKILL.md +.claude/skills/task-start/reference.md +.claude/skills/task-handoff/SKILL.md +.claude/hooks/check_sync.sh +``` + +## ステップ 1: 事前確認 (Pre-check) + +1. `git status` でワーキングツリーがクリーンか確認する.未コミットの変更がある場合は「⚠ コミットされていない変更があります.先にコミットまたは stash してから再実行してください.」と伝えて中断する. +2. `$ARGUMENTS` を確認する.`solo` または `team` のいずれかであること.未指定・不正な値なら「切替先を `solo` または `team` で指定してください(例: `/set-mode team`)」と伝えて終了する. +3. 現在のモードを取得する(`.claude/project-mode` が無ければ `solo` 扱い): + ```bash + if [ -f .claude/project-mode ]; then CURRENT=$(tr -d '[:space:]' < .claude/project-mode); else CURRENT="solo"; fi + TARGET="$ARGUMENTS" # solo | team + ``` +4. `CURRENT == TARGET` の場合は「既に `$TARGET` モードです.変更はありません.」と伝えて終了する. + +## ステップ 2: ブランチ作成 (Branch) + +モード切替は共有設定(`CLAUDE.md` のルール部・`.claude/`)の変更を含むため,GUIDE_03「共有設定の扱い」に従い専用ブランチで行う. + +```bash +git checkout -b chore/set-mode-$TARGET +``` + +既に同名ブランチがあれば削除して作り直す.**本コマンドはコミットしない**(CLAUDE.md のルールに従い,取り込みは後で `/commit` で行う). + +## ステップ 3-A: solo → team(TARGET が team のとき) + +### 3-A.1 テンプレートから team 層ファイルを取得・配置 + +`/sync-template` の版差分では過去に追加済みの team 層ファイルを配置できないため,本コマンドはテンプレートを直接 clone して確実に配置する: + +```bash +TEMPLATE_URL="https://github.com/rintoHasegawa/programming-template.git" +TEMP_DIR=$(mktemp -d) +git clone --depth 1 "$TEMPLATE_URL" "$TEMP_DIR" + +# team 層ファイルをコピー(既存があっても最新版で上書き) +for f in \ + "docs/01_GUIDE/GUIDE_03_チーム開発ルール.md" \ + ".claude/skills/task-create/SKILL.md" \ + ".claude/skills/task-start/SKILL.md" \ + ".claude/skills/task-start/reference.md" \ + ".claude/skills/task-handoff/SKILL.md" \ + ".claude/hooks/check_sync.sh" ; do + mkdir -p "$(dirname "$f")" + cp "$TEMP_DIR/$f" "$f" +done +rm -rf "$TEMP_DIR" +``` + +### 3-A.2 settings.json に SessionStart(check_sync) を配線 + +`.claude/settings.json` を Read し,既存の `PreToolUse`(`restrict_repo_access.py`)を保持したまま,`SessionStart` フックを追加する(既に配線済みなら何もしない): + +```json +"SessionStart": [ + { + "hooks": [ + { "type": "command", "command": "bash .claude/hooks/check_sync.sh", "timeout": 10 } + ] + } +] +``` + +Edit 後に `git diff .claude/settings.json` で結果を確認する. + +### 3-A.3 CLAUDE.md を team 化 + +`CLAUDE.md` を Read し,`/setup` の Phase 7(team 化)および GUIDE_03 に合わせて以下を反映する(既に反映済みの項目は触らない): + +- **「開発進捗」節**を,進捗欄(最新 1 行)ではなく **Issues ポインタ**に置き換える(例:「進捗・タスクは GitHub Issues と git 履歴で追う(GUIDE_03).現在のタスクは `gh issue list` で確認する.`CLAUDE.md` には進捗を書かない.」). +- **「必須ルール(コード実装時)」に「チーム開発(GUIDE_03 準拠)」小節を追加**する(直列運用・Issue ベースのタスク管理・`/task-create`/`/task-start`/`/task-handoff` の案内・条件付きセルフマージ・共有設定変更は専用 PR+他メンバー 1 名 Approve 必須). +- **「Git 運用」小節**に,セッション開始時の `[sync-check]` 警告を必ず認識する旨の 1 行を追加する. +- **「ドキュメント」→「01_GUIDE」一覧**に `GUIDE_03` の行を追加する. + +Edit 後に `git diff CLAUDE.md` で結果を確認する. + +### 3-A.4 その他 + +- `.gitignore` に `.claude/settings.local.json` が無ければ追記する(個人設定用.GUIDE_03). +- `echo team > .claude/project-mode` でモードを記録する. + +## ステップ 3-B: team → solo(TARGET が solo のとき) + +clone は不要(ローカルの削除・書き換えのみ).**破壊的操作を含むため,実行前に対象ファイルの一覧と CLAUDE.md 差分の要約をユーザーに提示し,同意を得てから実行する**. + +### 3-B.1 team 層ファイルを削除 + +```bash +rm -f \ + "docs/01_GUIDE/GUIDE_03_チーム開発ルール.md" \ + ".claude/skills/task-create/SKILL.md" \ + ".claude/skills/task-start/SKILL.md" \ + ".claude/skills/task-start/reference.md" \ + ".claude/skills/task-handoff/SKILL.md" \ + ".claude/hooks/check_sync.sh" + +# 中身が無くなったスキルディレクトリを取り除く +rmdir ".claude/skills/task-create" ".claude/skills/task-start" ".claude/skills/task-handoff" 2>/dev/null || true +``` + +### 3-B.2 settings.json から SessionStart(check_sync) を除去 + +`.claude/settings.json` を Read し,`check_sync.sh` を呼ぶ `SessionStart` フックのみを除去する.`PreToolUse`(`restrict_repo_access.py`)は保持する.他に個別追加された `SessionStart` フックがあれば残す(`check_sync.sh` の配線だけを外す).Edit 後に `git diff .claude/settings.json` で確認する. + +### 3-B.3 CLAUDE.md を solo 化 + +`CLAUDE.md` を Read し,team 化で加えた箇所を元の solo 既定へ戻す: + +- **「開発進捗」節**を solo 既定の骨組みに戻す.team 化で Issues ポインタになっているため,進捗欄(最新 1 行)+案内コメントの形へ置き換える: + ```markdown + ## 開発進捗 + + 最新: <直近の状況を 1 行.不明なら「(git 履歴 / 旧 Issue を参照)」> + ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴は docs/PROGRESS.md に追記する.運用ルールは .claude/rules/progress-log.md 参照. + ``` + 「最新」行に入れる現状はユーザーに確認する(team 期間の進捗は Issues / git 履歴にあるため,ここへ移し替える必要はない). +- **「チーム開発(GUIDE_03 準拠)」小節を削除**する. +- **「Git 運用」小節**の `[sync-check]` 警告の行を削除する. +- **「ドキュメント」→「01_GUIDE」一覧**から `GUIDE_03` の行を削除する(GUIDE_04 以降のプロジェクト固有ドキュメントがあれば残す). + +Edit 後に `git diff CLAUDE.md` で確認する. + +### 3-B.4 その他 + +- `echo solo > .claude/project-mode` でモードを記録する. +- `docs/PROGRESS.md` が無い場合は,solo 運用のため骨組みを用意するか確認する(テンプレート由来のファイルなので通常は存在する). + +## ステップ 4: 結果報告 (Report) + +以下を報告する: + +「**開発モードを `{CURRENT}` → `{TARGET}` に切り替えました.** + +- ブランチ: `chore/set-mode-{TARGET}` +- team 層ファイル: {配置した / 削除した} 一覧 +- `.claude/settings.json`: {SessionStart(check_sync) を追加 / 除去 / 変更なし} +- `CLAUDE.md`: {team 化 / solo 化} を反映 +- `.claude/project-mode`: `{TARGET}` + +内容を確認のうえ `/commit push` で取り込んでください. +{team に切り替えた場合: 「チーム運用の管理者初期設定(GitHub repo・CI 等)は GUIDE_03 を参照してください.共有設定の変更のため,他メンバー 1 名の Approve を得てからマージしてください(GUIDE_03).」}」 + +## 注意事項 (Notes) + +- 本コマンドは**コミットしない**.変更は `chore/set-mode-*` ブランチに未コミットで乗るので,`/commit` で取り込む. +- team ↔ solo の切替は共有設定の変更にあたる(GUIDE_03「共有設定の扱い」).team プロジェクトでは専用 PR+他メンバー 1 名 Approve を経てマージする. +- team 層ファイルのリストは `/sync-template` の「モード依存ファイル」と一致させること.どちらかを増減したら両方を更新する. +- solo→team で取得する team 層ファイルはテンプレート HEAD 版.版の細かな追従は以後の `/sync-template` に任せる(`template-sync-sha` は本コマンドでは変更しない). diff --git a/.claude/skills/setup/SKILL.md b/.claude/skills/setup/SKILL.md new file mode 100644 index 0000000..8e64530 --- /dev/null +++ b/.claude/skills/setup/SKILL.md @@ -0,0 +1,133 @@ +--- +name: setup +model: opus +description: "GUIDE_01 に従い,プロジェクトの立ち上げを対話的に進める.各フェーズでユーザーの確認を挟む." +argument-hint: "<プロジェクト名>" +--- + +あなたはプロジェクト立ち上げのファシリテーターです. +GUIDE_01(プロジェクト立ち上げフロー)を読み,各フェーズのルールを理解した上で以下の手順を実行してください. + +## 基本ルール + +- 各フェーズの成果物をユーザーが承認してから次のフェーズに進むこと +- ユーザーが「今日はここまで」と言った場合,CLAUDE.md の進捗(最新 1 行)と `docs/PROGRESS.md`(追記)を更新して中断する +- ドキュメントの書式・命名は `.claude/rules/markdown-style.md`・`.claude/rules/docs-naming.md` に従って作成する(該当ファイル編集時に自動ロードされる) +- 成果物のドラフトを提示し,ユーザーの修正指示を反映してからファイルに書き出す +- フォルダは成果物を実際に書き出すときにのみ作成する.空のカテゴリフォルダを先回りで作らない + +## 前提確認 (Pre-check) + +1. CLAUDE.md がテンプレート初期状態(タイトルが `# プロジェクト名` のまま)か確認する +2. **初期状態の場合(新規プロジェクト立ち上げ):** + - プロジェクト名を確定する(引数 `$ARGUMENTS` があればそれを使用,なければユーザーに確認) + - プロジェクト概要(1〜2 行)をユーザーに確認する + - CLAUDE.md の以下を書き換える: + - 1 行目の `# プロジェクト名` → `# {確定したプロジェクト名}` + - 3 行目の `` → 概要テキスト +3. CLAUDE.md の「開発進捗」と `docs/PROGRESS.md` を確認し,どのフェーズから再開するか判断する +4. 初回の場合はフェーズ 1 から開始する + +## 開発モードの選択 (Development Mode) + +新規立ち上げ時(Pre-check で初期状態だった場合),フェーズ 1 に入る前に開発モードを 1 度だけ確定する.既に `.claude/project-mode` がある場合(再開時)はこのステップを飛ばす. + +ユーザーに次を確認する: + +「**このプロジェクトの開発モードを選んでください.** + +- **solo(個人開発)**: 1 人で開発する.進捗は `CLAUDE.md` の進捗欄+ `docs/PROGRESS.md` で追う. +- **team(チーム開発)**: 複数人が Claude Code で開発する.進捗・タスクは GitHub Issues と git 履歴で追い,直列運用・条件付きセルフマージ等のチームルール(GUIDE_03)を適用する. + +どちらにしますか?(後から `/set-mode ` で切り替えられます)」 + +確定したら以下を行う: + +1. `.claude/project-mode` にモード(`solo` または `team` のいずれか 1 語)を書き出す. +2. **solo の場合**: チーム層ファイルが clone で配置されていれば削除し,solo プロジェクトを clean に保つ: + - `docs/01_GUIDE/GUIDE_03_チーム開発ルール.md` + - `.claude/skills/task-create/` / `task-start/` / `task-handoff/`(各ディレクトリごと削除) + - `.claude/hooks/check_sync.sh` + - ※ `.claude/settings.json` はそのまま(solo でも `restrict_repo_access.py` を使う).SessionStart(check_sync) の配線は追加しない. +3. **team の場合**: 上記チーム層ファイルを残す.加えて: + - `.claude/settings.json` に SessionStart フックを追記して `check_sync.sh` を配線する(既存の PreToolUse ブロックは保持する): + ```json + "SessionStart": [ + { + "hooks": [ + { "type": "command", "command": "bash .claude/hooks/check_sync.sh", "timeout": 10 } + ] + } + ] + ``` + - `.gitignore` に `.claude/settings.local.json` が無ければ追記する(個人設定用.GUIDE_03). + - CLAUDE.md のチーム化は Phase 7 で行う(この時点ではまだ立ち上げ中で Issue/repo が無いため,進捗欄は setup 再開用にそのまま使う). + +### 進捗記録(立ち上げ中) + +立ち上げ中は repo/Issue がまだ無いため,**モードに関わらず** setup 再開のための進捗は `CLAUDE.md` の進捗欄(最新 1 行)+ `docs/PROGRESS.md` に記録する.team モードでの「進捗を Issue で追う」への切り替えは Phase 7(実装開始)以降に適用する. + +## フェーズ 1〜6: 各フェーズの実行 + +GUIDE_01 に定義された各フェーズを順番に実行する. +各フェーズで以下の手順を繰り返す: + +1. GUIDE_01 の該当フェーズを参照し,目的・成果物・役割分担を確認する +2. ユーザーとの対話で情報を収集する +3. 成果物のドラフトを作成し,ユーザーに提示する +4. 承認を得てから GUIDE_01 に記載された保存先に書き出す + +### 台詞テンプレート + +「**フェーズ {N}({フェーズ名})のドラフトです.** + +{ドラフト内容} + +修正点があれば指示してください.OKであれば {保存先} に保存して次のフェーズに進みます.」 + +### フォルダ作成の注意 + +成果物を書き出すフォルダのみ作成する.`.claude/rules/docs-naming.md` のカテゴリ表は「あり得るカテゴリの一覧」であり,立ち上げ時に全カテゴリのフォルダを scaffold するものではない.GUIDE_01 の立ち上げフェーズで成果物が発生するのは `02_ENV / 03_PLAN / 04_SPEC` と `.claude/rules/`(規約整備フェーズ)のみ.`05_TECH/`(技術設計)と `06_TEST/`(テスト)は立ち上げ時には成果物が無いため,空フォルダを作らない(実装フェーズで必要になった時点で作成する). + +### フェーズ 3(環境構築)の注意 + +外部サービスの設定(アカウント作成,コンソール操作等)はユーザー自身が行う.手順書に記載するが,AI が実行しないこと. + +## フェーズ 7: 実装開始 + +1. GUIDE_01 の「CLAUDE.md の管理」セクションに従い,CLAUDE.md を最終更新する + - **team モードの場合**(`.claude/project-mode` が `team`)は,ここで CLAUDE.md をチーム開発向けに変換する: + - 「開発進捗」節を,進捗欄(最新 1 行)ではなく **Issues ポインタ**に置き換える(例: 「進捗・タスクは GitHub Issues と git 履歴で追う(GUIDE_03).現在のタスクは `gh issue list` で確認する.`CLAUDE.md` には進捗を書かない.」). + - 「必須ルール(コード実装時)」に **「チーム開発(GUIDE_03 準拠)」小節**を追加する(直列運用・Issue ベースのタスク管理・`/task-create`/`/task-start`/`/task-handoff` の案内・条件付きセルフマージ・共有設定変更は専用 PR+他メンバー 1 名 Approve 必須). + - 「Git 運用」小節に,セッション開始時の `[sync-check]` 警告を必ず認識する旨の 1 行を追加する. + - 「ドキュメント」→「01_GUIDE」一覧に `GUIDE_03` の行を追加する. + - **solo モードの場合**は従来どおり(進捗欄+ PROGRESS.md 運用). +2. 作成した全ドキュメントの一覧を表示する +3. 最初の実装ステップを確認する +4. **team モードの場合**は,AI に実施できない「管理者の初期設定」(GUIDE_03「管理者の初期設定」)をユーザーに案内する: + - GitHub リポジトリ作成・メンバー招待 + - Issue テンプレートの用意 + - CI 構築(未構築の間は GUIDE_03「CI 構築までの暫定ゲート」を適用) + - 依存脆弱性対策が必要ならスタックに応じた `.github/dependabot.yml` を追加(エコシステムはプロジェクト固有のため setup では作らない) + +「**全フェーズが完了しました.** + +作成したドキュメント: +{ドキュメント一覧} + +開発モード: {solo / team} +CLAUDE.md を更新しました. +最初の実装ステップは `{ステップ名}` です.`/implement {タスク}` で開始できます. +{team の場合: 「チーム運用の管理者初期設定(GitHub repo・CI 等)は GUIDE_03 を参照してユーザー側で実施してください.」}」 + +## 中断時の処理 + +ユーザーが中断を希望した場合: + +1. 現在のフェーズと状態を CLAUDE.md の「開発進捗」(最新 1 行に上書き)と `docs/PROGRESS.md`(末尾に追記)に記録する +2. 次回 `/setup` 実行時に続きから再開できるようにする + +「**進捗を保存しました.** + +現在の状態: フェーズ {N}({フェーズ名})まで完了 +次回 `/setup` を実行すると,フェーズ {N+1} から再開します.」 diff --git a/.claude/skills/sync-template/SKILL.md b/.claude/skills/sync-template/SKILL.md new file mode 100644 index 0000000..069f775 --- /dev/null +++ b/.claude/skills/sync-template/SKILL.md @@ -0,0 +1,407 @@ +--- +name: sync-template +model: inherit +description: "テンプレートリポジトリから最新の変更を取り込み,ルール変更に伴うコード修正を行う." +argument-hint: "" +--- + +あなたはテンプレート同期の担当者です. +テンプレートリポジトリから最新の変更を取り込み,必要に応じてプロジェクトのコードを修正してください. + +実行環境: bash(Git Bash または Unix シェル)が必要.`mktemp`, `rm -rf`, `cat`, シェル変数展開を使用する. + +テンプレート URL: `https://github.com/rintoHasegawa/programming-template.git` + +## マージ必須ファイル (Merge-required Files) + +以下のファイルは「プロジェクト固有の内容 + テンプレートの共通ルール」のハイブリッドのため,**上書きせずマージする**.コピー処理(ステップ 5.3)に入る前に対象ファイルかを判定し,該当する場合はステップ 5.4 のマージ手順に分岐させる. + +| ファイル | 理由 | マージ方針 | +| --- | --- | --- | +| `.gitignore` | フレームワーク固有ルール(Flutter/Node 等)を保持する必要がある | テンプレート側の実効行で既存に含まれないもののみを追記.既存行は触らない | +| `CLAUDE.md` | プロジェクト名・開発進捗・固有規約を保持する必要がある | テンプレートで変更された共通セクション(必須ルール,エージェントチーム,ドキュメント構成等)のみを Edit で更新.プロジェクト固有セクションは触らない | +| `docs/PROGRESS.md` | プロジェクト固有の進捗ログを保持する必要がある | 既存ファイルがある場合は内容を上書きしない.テンプレート側の骨組み(タイトル・案内コメント)に差分があれば通知のみ行い手動マージを促す | +| `.gitattributes` | プロジェクトによって設定が異なる可能性がある | 差分を表示し,ユーザーに「上書き / マージ / スキップ」を問う | +| `.claude/settings.json` | team モードで SessionStart(check_sync) 配線を追加している等,プロジェクト固有の hook 設定を保持する必要がある | 既存の hooks を保持しつつ,テンプレート側で追加・変更された hook のみ統合.差分を表示しユーザーに確認 | + +マージ処理の対象は **既存ファイルが存在する場合のみ**.初回同期(`.claude/template-sync-sha` がない状態)では全ファイルが A 扱いとなるが,これらのファイルはフレームワーク初期化(`flutter create` / `npm init` 等)や `/init` で既にプロジェクトに存在するのが通常なので,そのままマージ処理に入る.既存ファイルがない稀なケースに限り通常の `cp` で配置する. + +## 同期対象外ファイル (Skip-on-sync Files) + +以下のファイルはテンプレート紹介専用であり,テンプレートから作られた各プロジェクトには反映しない.コピー・上書き・削除のいずれも行わない. + +| ファイル | 理由 | 方針 | +| --- | --- | --- | +| `README.md` | テンプレートの README は GitHub の repo ページ向けのテンプレート紹介用.各プロジェクトは独自の README を持つべき | プロジェクト側にコピー・上書きしない.テンプレート側の追加・変更・削除も無視する | + +判定はステップ 5.3 のループ内でマージ必須ファイル判定より先に行う. + +## モード依存ファイル (Mode-gated / Team-layer Files) + +テンプレートは個人開発(solo)とチーム開発(team)の両モードを 1 つのリポジトリで提供する(GUIDE_03).以下の**チーム層ファイル**は team モードのプロジェクトにのみ配置し,solo モードのプロジェクトには同期しない. + +| ファイル | レイヤ | +| --- | --- | +| `docs/01_GUIDE/GUIDE_03_チーム開発ルール.md` | team | +| `.claude/skills/task-create/SKILL.md` | team | +| `.claude/skills/task-start/SKILL.md` | team | +| `.claude/skills/task-start/reference.md` | team | +| `.claude/skills/task-handoff/SKILL.md` | team | +| `.claude/hooks/check_sync.sh` | team | + +判定はプロジェクトの `.claude/project-mode`(`solo` または `team`.`/setup` が作成)で行う: + +- **`team`**: チーム層ファイルを通常どおり同期(A/M/D すべて反映). +- **`solo`**: チーム層ファイルを同期対象外ファイルと同様に**完全スキップ**(コピー・上書き・削除いずれもしない).solo プロジェクトは `/setup` 時にこれらを削除済みのため,再配置しない. +- **`.claude/project-mode` が存在しない**(本機能導入前に作られた既存プロジェクト): 安全側に倒して **`solo` 扱い**とし,チーム層を配置しない.同期の最後に「チーム開発なら `.claude/project-mode` に `team` と記入し再同期してください」と案内する. + +なお `.claude/project-mode` 自体はテンプレートに含まれない(`/setup` が各プロジェクトで生成する)ため,同期で触れることはない. + +## ステップ 1: 事前確認 + +`git status` でワーキングツリーがクリーンか確認する. + +**コミットされていない変更がある場合:** + +「⚠ コミットされていない変更があります. +先に変更をコミットするか,stash してから再度 `/sync-template` を実行してください.」 + +→ ここで処理を中断する. + +## ステップ 2: テンプレートを一時ディレクトリにクローン + +以下を実行する: + +```bash +TEMPLATE_URL="https://github.com/rintoHasegawa/programming-template.git" +TEMP_DIR=$(mktemp -d) +git clone "$TEMPLATE_URL" "$TEMP_DIR" +NEW_SHA=$(git -C "$TEMP_DIR" rev-parse HEAD) +``` + +## ステップ 3: 変更ファイルの特定 + +`.claude/template-sync-sha` の有無で処理を分岐する: + +**ファイルが存在する場合(2 回目以降の同期):** + +```bash +LAST_SHA=$(cat .claude/template-sync-sha) +``` + +- `NEW_SHA == LAST_SHA` の場合: + `rm -rf "$TEMP_DIR"` で一時ディレクトリを削除し,「テンプレートに新しい変更はありません.既に最新です.」と報告して終了する. + +- `NEW_SHA != LAST_SHA` の場合: + ```bash + # A=追加, M=変更, D=削除, R=リネーム の種別付きで取得 + CHANGED_ENTRIES=$(git -C "$TEMP_DIR" diff --name-status "$LAST_SHA" HEAD) + ``` + で変更されたファイルを種別付きで取得する. + +**ファイルが存在しない場合(初回同期):** + +テンプレートの全ファイルを「追加(A)」として対象に含める: + +```bash +CHANGED_ENTRIES=$(cd "$TEMP_DIR" && find . -type f -not -path "./.git/*" | sed 's|^\./||' | awk -v OFS='\t' '{print "A", $0}') +``` + +## ステップ 4: 変更一覧をユーザーに提示 + +取り込み対象のファイル一覧を種別ごとに整理してユーザーに提示する.マージ必須ファイル(`.gitignore`, `CLAUDE.md`, `docs/PROGRESS.md`, `.gitattributes`, `.claude/settings.json`)に変更がある場合は,**ユーザーが取り込み前に影響範囲を把握できるよう差分サマリーを先出しする**: + +「**テンプレートに以下の変更があります:** + +- 追加 (A): {ファイル一覧} +- 変更 (M): {ファイル一覧} +- 削除 (D): {ファイル一覧} +- リネーム (R): {旧名 → 新名} + +**⚠ マージ必須ファイル(上書きせず差分マージします):** + +- `.gitignore`(既存 {N} 行 / テンプレート {M} 行.既存の固有ルールを保持し,テンプレート側で追加されている {K} 行を追記) +- `CLAUDE.md`(既存にプロジェクト固有セクションが {L} 行.テンプレート更新セクションのみマージ) +- `docs/PROGRESS.md`(プロジェクト固有の進捗ログ.既存があれば内容を保持し,差分があれば通知のみ) +- `.gitattributes`(差分 {D} 行.処理方針をユーザーに確認) +- `.claude/settings.json`(既存の hooks を保持し,テンプレート側で追加・変更された hook のみ統合) + +取り込みを開始します.」 + +差分サマリーは以下で取得する(該当ファイルがマージ対象かつ既存ファイルがある場合のみ出力): + +```bash +# 既存ファイル行数 +wc -l .gitignore CLAUDE.md docs/PROGRESS.md .gitattributes .claude/settings.json 2>/dev/null + +# テンプレート側の実効行数(.gitignore) +grep -vE '^\s*(#|$)' "$TEMP_DIR/.gitignore" | wc -l + +# 既存ファイルとテンプレート最新版の差分プレビュー +diff -u .gitignore "$TEMP_DIR/.gitignore" | head -30 +diff -u CLAUDE.md "$TEMP_DIR/CLAUDE.md" | head -50 +diff -u docs/PROGRESS.md "$TEMP_DIR/docs/PROGRESS.md" | head -30 +diff -u .gitattributes "$TEMP_DIR/.gitattributes" | head -30 +diff -u .claude/settings.json "$TEMP_DIR/.claude/settings.json" | head -30 +``` + +## ステップ 5: ブランチ作成とファイル反映 + +### 5.1 ブランチ作成 + +`git checkout -b chore/sync-template` でブランチを作成する.既に同名のブランチが存在する場合は削除してから作り直す. + +### 5.2 マージ必須ファイル判定ヘルパー + +以降の処理で利用する判定関数を定義する: + +```bash +MERGE_FILES=(".gitignore" "CLAUDE.md" "docs/PROGRESS.md" ".gitattributes" ".claude/settings.json") +SKIP_FILES=("README.md") +TEAM_LAYER_FILES=( + "docs/01_GUIDE/GUIDE_03_チーム開発ルール.md" + ".claude/skills/task-create/SKILL.md" + ".claude/skills/task-start/SKILL.md" + ".claude/skills/task-start/reference.md" + ".claude/skills/task-handoff/SKILL.md" + ".claude/hooks/check_sync.sh" +) + +# プロジェクトの開発モードを取得(未設定なら安全側で solo 扱い) +if [ -f .claude/project-mode ]; then + PROJECT_MODE=$(tr -d '[:space:]' < .claude/project-mode) +else + PROJECT_MODE="solo" +fi + +is_merge_file() { + local t="$1" + for f in "${MERGE_FILES[@]}"; do + [ "$f" = "$t" ] && return 0 + done + return 1 +} + +is_skip_file() { + local t="$1" + for f in "${SKIP_FILES[@]}"; do + [ "$f" = "$t" ] && return 0 + done + return 1 +} + +is_team_layer_file() { + local t="$1" + for f in "${TEAM_LAYER_FILES[@]}"; do + [ "$f" = "$t" ] && return 0 + done + return 1 +} +``` + +`PROJECT_MODE` が `solo` の場合,チーム層ファイル(`is_team_layer_file` が真)は同期対象外ファイルと同様に完全スキップする(ステップ 5.3 のループでは `is_skip_file` 判定の直後に `[ "$PROJECT_MODE" = "solo" ] && is_team_layer_file "$file"` を追加で判定して `continue` する).`team` の場合は通常のコピー/マージ判定に進む. + +### 5.3 通常コピー対象の反映(マージ必須ファイル以外) + +マージ必須ファイルは後段(5.4)で個別処理するため,このループではスキップする.既存ファイルがない場合は通常どおり `cp` で配置する: + +```bash +echo "$CHANGED_ENTRIES" | while IFS=$'\t' read -r status file newfile; do + [ -z "$status" ] && continue + case "$status" in + A|M) + # 同期対象外ファイルは完全にスキップ(コピーも上書きもしない) + if is_skip_file "$file"; then + continue + fi + # solo モードではチーム層ファイルを完全スキップ(再配置しない) + if [ "$PROJECT_MODE" = "solo" ] && is_team_layer_file "$file"; then + continue + fi + # マージ必須ファイルで既存ファイルがある場合は 5.4 で処理 + if is_merge_file "$file" && [ -f "$file" ]; then + continue + fi + mkdir -p "$(dirname "$file")" + cp "$TEMP_DIR/$file" "$file" + ;; + R*) + # file=旧パス, newfile=新パス + if is_skip_file "$newfile"; then + continue + fi + if [ "$PROJECT_MODE" = "solo" ] && is_team_layer_file "$newfile"; then + continue + fi + if is_merge_file "$newfile" && [ -f "$newfile" ]; then + continue + fi + mkdir -p "$(dirname "$newfile")" + cp "$TEMP_DIR/$newfile" "$newfile" + ;; + esac +done +``` + +### 5.4 マージ必須ファイルの個別処理 + +`$CHANGED_ENTRIES` に A/M/R* で含まれ,かつ既存ファイルが存在するマージ必須ファイルについて,以下の手順で処理する. + +**`.gitignore` のマージ手順** + +1. 既存 `.gitignore` とテンプレート `$TEMP_DIR/.gitignore` を読む +2. テンプレート側の**実効行**(コメント `#` 行・空行を除く)を抽出する: + ```bash + grep -vE '^\s*(#|$)' "$TEMP_DIR/.gitignore" + ``` +3. 抽出した各行について,既存ファイルに完全一致で含まれていないものだけを収集する +4. 収集した行がある場合,既存ファイル末尾に以下のマーカー付きブロックで追記する: + ``` + + # --- from template (sync-template) --- + {追加行} + ``` + - 既存ファイル末尾に同じマーカーが既にある場合は,マーカー以降に追記して重複マーカーを作らない +5. `git diff .gitignore` で結果を表示しユーザーに確認する + +**`CLAUDE.md` のマージ手順** + +同期担当エージェント(= あなた)が Read と Edit ツールを使ってセクション単位でマージする: + +1. 既存 `CLAUDE.md` とテンプレート版 `$TEMP_DIR/CLAUDE.md` を Read する +2. テンプレート側の変更箇所を特定する(初回同期は LAST_SHA がないためテンプレート全体を「更新候補」として扱う): + ```bash + if [ -n "$LAST_SHA" ]; then + git -C "$TEMP_DIR" show "$LAST_SHA:CLAUDE.md" 2>/dev/null > /tmp/claude_md_old || true + diff -u /tmp/claude_md_old "$TEMP_DIR/CLAUDE.md" + fi + ``` +3. セクションを以下の基準で分類する: + - **共通セクション(テンプレート管理,更新対象)**: 「必須ルール」「エージェントチーム」「Git 運用」「ドキュメント」節など,テンプレートに由来する節 + - **プロジェクト固有セクション(保持対象)**: 「プロジェクト名」「開発進捗」や,プロジェクトが追加した固有規約の節 +4. テンプレート側で変更があった共通セクションのみを Edit で既存ファイルに反映する.プロジェクト固有セクションは一切触らない +5. `git diff CLAUDE.md` で結果を表示しユーザーに確認する + +**`docs/PROGRESS.md` のマージ手順** + +`docs/PROGRESS.md` はプロジェクト固有の進捗ログのため,**既存ファイルがある場合は内容を上書きしない**.テンプレート側の更新は骨組み(タイトル・案内コメント)に限定されるはずなので,差分があれば通知のみ行い手動マージを促す: + +1. 既存 `docs/PROGRESS.md` とテンプレート版 `$TEMP_DIR/docs/PROGRESS.md` を Read する +2. 差分を表示する: + ```bash + diff -u docs/PROGRESS.md "$TEMP_DIR/docs/PROGRESS.md" + ``` +3. 差分がある場合,「⚠ テンプレート側の `docs/PROGRESS.md` 骨組みに変更があります.既存の追記内容を保持したまま骨組みを反映したい場合はファイルを直接編集してください.自動マージは行いません.」と通知する +4. 既存ファイルが無い稀なケース(テンプレートを使わずに作られた古いプロジェクト等)に限り,テンプレート版をそのまま `cp` で配置する + +**`.gitattributes` のマージ手順** + +1. 既存ファイルとテンプレート版の差分を表示する: + ```bash + diff -u .gitattributes "$TEMP_DIR/.gitattributes" + ``` +2. ユーザーに以下のいずれかを選ばせる: + - **上書き**: テンプレート版で既存を置換 + - **マージ**: 両者のルールを統合(具体的な統合内容は対話で決定) + - **スキップ**: 既存ファイルを維持 +3. 選択に応じて処理する + +**`.claude/settings.json` のマージ手順** + +`settings.json` は hooks 設定を持つ.team モードのプロジェクトは PreToolUse(`restrict_repo_access.py`)に加えて SessionStart(`check_sync.sh`)を配線しているため,テンプレート版で盲目的に上書きするとプロジェクト固有の配線が失われる.同期担当エージェント(= あなた)が Read と Edit で JSON をマージする: + +1. 既存 `.claude/settings.json` とテンプレート版 `$TEMP_DIR/.claude/settings.json` を Read する +2. 差分を表示する: + ```bash + diff -u .claude/settings.json "$TEMP_DIR/.claude/settings.json" + ``` +3. **既存の hooks を保持したまま**,テンプレート側で追加・変更された hook(イベント・matcher・command)のみを統合する: + - 既存に無いイベント/hook はテンプレート版から追加する + - プロジェクト固有の hook(team の SessionStart `check_sync.sh` 等)は残す + - 同一 hook の command 変更(例: `restrict_repo_access.py` の起動方法変更)はテンプレート版に合わせる + - solo モードで SessionStart(check_sync) が無い場合は,team 専用の配線を勝手に追加しない +4. `git diff .claude/settings.json` で結果を表示しユーザーに確認する + +### 5.5 削除候補の確認 + +削除候補(D およびリネーム元)を抽出し,**ローカルに実在するファイルだけ**に絞る: + +```bash +DELETIONS=$(echo "$CHANGED_ENTRIES" | awk -F'\t' '$1 == "D" {print $2} $1 ~ /^R/ {print $2}') + +# ローカルに実在するファイルのみを削除候補に残す +DELETIONS=$(echo "$DELETIONS" | while IFS= read -r f; do + [ -n "$f" ] && [ -f "$f" ] && echo "$f" +done) +``` + +この実在フィルタにより,テンプレート側のリネームや過去の移行でプロジェクトが持っていない旧パス,solo モードに配置されないチーム層ファイルは,削除確認に出ることなく自動的に除外される. + +`$DELETIONS` が空でない場合,ユーザーに確認を求める: + +「**以下のファイルはテンプレートから削除されています:** + +{削除候補一覧} + +プロジェクトからも削除してよいですか?(残したいファイルがあれば指定してください)」 + +ユーザー確認後,対象ファイルを `rm` で削除する.プロジェクトが独自に残したいファイルは削除対象から除外する. + +### 5.6 同期済み SHA の記録とクリーンアップ + +```bash +echo "$NEW_SHA" > .claude/template-sync-sha +rm -rf "$TEMP_DIR" +``` + +## ステップ 6: 変更内容の分析 + +コピーされた変更を以下のカテゴリに分類する: + +- **ルール変更**: コーディング規約,Git 運用ルール,テスト方針等の変更(`.claude/rules/` 配下の変更を含む) +- **ドキュメント更新**: 手順書やガイドの改善 +- **設定変更**: CLAUDE.md や .claude/ 配下の変更 +- **その他**: 上記に該当しない変更 + +## ステップ 7: ルール変更に伴うコード修正 + +ステップ 6 で「ルール変更」に該当するものがある場合: + +1. 変更されたルールの内容を要約してユーザーに報告する +2. そのルール変更がプロジェクトの既存コードに影響するか分析する +3. 影響がある場合,修正が必要な箇所と修正内容を提示する +4. ユーザーの確認を得てから修正を実行する + +**影響がない場合:** + +「ルール変更に伴うコード修正は不要です.」 + +## ステップ 8: 結果報告 + +すべての作業が完了したら,結果を報告する: + +「**テンプレート同期が完了しました.** + +- ブランチ: `{ブランチ名}` +- 開発モード: `{PROJECT_MODE}`(チーム層ファイルは {team: 同期対象 / solo: スキップ}) +- 取り込んだ変更: {変更の要約} +- コード修正: {あり(内容)/なし} + +`/commit push` でプッシュと PR 作成ができます.」 + +`.claude/project-mode` が存在せず `solo` 扱いにした場合は,末尾に次を添える: + +「※ `.claude/project-mode` が未設定のため solo として同期しました.チーム開発にする場合は `/set-mode team` を実行してください(`.claude/project-mode` を手で書き換えるだけでは team 層は配置されません).」 + +## 注意事項 + +- 本コマンドは一時ディレクトリ(`mktemp -d`)に clone したテンプレートを Read / `cp` / `rm -rf` する.`restrict_repo_access.py` フックはシステム一時ディレクトリを許可ゾーンとして例外扱いしており,本コマンドはそれに依存している(フックの例外を外すと本コマンドが動かなくなる) +- テンプレートリポジトリへの push は行わない +- コード修正はユーザーの確認なしに実行しない +- マージ必須ファイル(`.gitignore`, `CLAUDE.md`, `docs/PROGRESS.md`, `.gitattributes`, `.claude/settings.json`)は必ずステップ 5.4 の手順でマージする.盲目的な `cp` で上書きしない(フレームワーク固有の除外ルールやプロジェクト固有セクションが失われる) +- 同期対象外ファイル(`README.md`)はテンプレート紹介用のためプロジェクトには反映しない.テンプレート側で追加・変更・削除があってもプロジェクトの該当ファイルは触らない +- チーム層ファイル(`GUIDE_03`/`task-*`/`check_sync.sh`)は `.claude/project-mode` が `team` のプロジェクトにのみ同期する.`solo`(または未設定)のプロジェクトには配置・更新・削除いずれもしない.`/sync-template` は「版の追従」のみを行い,**モードの切り替えはしない**.solo↔team の切替は `/set-mode ` を使う(team 層ファイルの配置/削除・`settings.json` 配線・`CLAUDE.md` の team 化/solo 化・`project-mode` 更新を一括で行う).`.claude/project-mode` を手で書き換えるだけでは切り替わらない +- `.claude/settings.json` はマージ必須ファイル.team の SessionStart(check_sync) 配線を保持したままテンプレートの hook 変更を統合する.盲目的な `cp` で上書きしない +- 通常コピー対象でもプロジェクト固有の変更が上書きされうる場合は,`git diff` で確認してユーザーに報告する +- テンプレートが管理するのは `.claude/` 配下のうち `agents/`,`skills/`,`rules/`,`hooks/`,`settings.json`,`template-sync-sha` のみ.`.claude/plans/` や `.claude/commit-context.md` 等のプロジェクト固有ファイルはテンプレートに含まれないため同期対象外 +- `chore/sync-template` ブランチは他の作業ブランチと混ぜず,作成後は速やかにマージすること.複数の作業ブランチで `/sync-template` を実行すると `.claude/template-sync-sha` がコンフリクトする.コンフリクト時は新しい(HEAD 側の)SHA を採用すること. diff --git a/.claude/template-sync-sha b/.claude/template-sync-sha new file mode 100644 index 0000000..3244957 --- /dev/null +++ b/.claude/template-sync-sha @@ -0,0 +1 @@ +061d1c4503651fc60c87587458d1cd583f5586a6 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b831860 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# セットアップスクリプトが自動ダウンロードする nuget.exe +nuget.exe + +# Visual Studio +.vs/ +*.user + +# ビルド出力 +bin/ +obj/ + +# NuGet パッケージ +packages/ + +# リファクタリング回帰比較用の基準データ(実機出力・一時データ) +_基準データ_refactor前/ + +# --- from template (sync-template) --- +.claude/commit-context.md +.claude/settings.local.json +.claude/auto-refactor-skip.md +.claude/auto-refactor-doc-review.md +.claude/auto-refactor-test-review.md +.claude/auto-audit-report.md +.claude/auto-audit-fixed.md +.claude/auto-audit-skip.md diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..d1b5302 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedDesktop" + ] +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..54ecc30 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,101 @@ +# TIAS Shot + +舌診用の撮影ソフトウェア(WinForms / .NET Framework 4.8 / x64).産業用カメラ(ImagingSource・Lumenera)で舌を撮影し,舌診チャートによる自動校正と色変換行列の算出を経て sRGB 変換画像を保存する.上流(nakaguchi)v1.7 からのフォークで,クラッシュ・メモリリーク修正と性能改善を積んでいる([docs/変更まとめ_v1.6-v1.7から.md](docs/変更まとめ_v1.6-v1.7から.md)). + +## 開発進捗 + +最新: 3 バージョン(v1.6/v1.7/現行)を実機 MEMMONITOR で性能評価計測し,2 段階改善(保存経路 v1.6→v1.7・プレビュー経路 v1.7→現行)を定量化(PLAN_04/TEST_02・PR #18).あわせて完了済み PLAN_01/02 と対比用 LEAKY_REPRO フラグを撤去(挙動不変) +※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). + +## 必須ルール(コード実装時) + +### プロジェクト固有の規約(本体は `.claude/rules/` の path-scoped rule・該当ファイル編集時に自動ロード) + +- **テスト方針**(`.claude/rules/testing.md`): ピュアロジック層は NUnit で必ず自動テスト,ハードウェア結合層(カメラ/UI/スレッド)は対象外としビルド+実機で担保.テストも **x64 必須**(`AnyCPU` はネイティブ DLL ロードで実行時に失敗) +- **エラーハンドリング方針**(`.claude/rules/error-handling.md`): `ErrorMsg`+`bool` 返却・`ShowMessage`/`MessageBox`・`Debug.WriteLine` の既存パターンに従う.空 `catch` 禁止.**`Mat`・`Bitmap` 等のネイティブ資源は `using`/`try-finally` で確実に解放**(GC 任せはリーク→OOM/GDI 枯渇クラッシュ) +- ※ コーディング規約(coding-style)・プロジェクト構成規則(project-structure)は**未整備**(GUIDE_01 の規約整備フェーズ参照) + +### rule 未収載の固有不変条件(コード変更時に壊さないこと) + +- **プレビュー表示 Bitmap の所有権モデル**: カメラコールバックが渡す入力 bmp は「読むだけ」,表示は UI 所有コピー(`FastClone`),入力の Dispose 責任は呼び出し側.コールバックスレッドから毎フレーム `Invalidate()` しない(描画はタイマー駆動).経緯は [PLAN_03](docs/03_PLAN/PLAN_03_プレビューメモリリーク修正計画.md) +- **診断・評価機能は Release に含めない**: ビルドフラグ(`MEMMONITOR`・`WHITEBOARD`)でコードごと出し分ける([ENV_06](docs/02_ENV/ENV_06_ビルド構成とビルドフラグ.md)) + +### Git 運用 + +- ブランチ名・コミットメッセージの書式は `.claude/rules/git-conventions.md` に従う(常時ロードされる) +- コミットは `/commit` を使用する(push・PR 作成は `/commit push`) +- **`/commit` はユーザーが明示的に指示した時のみ実行する.Claude が自発的に `/commit` や `git commit` を呼んではならない**(`/implement` 完了後も,案内するだけで自分ではコミットしない.`/commit` skill は `disable-model-invocation` によりユーザー起動限定として強制されている) + - **例外**: 以下の無人運転ループはユーザー承認済みの例外として専用ブランチに自律コミットする.いずれも push・PR・マージ・`main` への操作はしない(取り込みは人間が `/commit push` 等で行う) + - `/auto-refactor`(リファクタ/ドキュメント整理ループ)→ `refactor/` 専用ブランチ + - `/auto-audit`(バグ/脆弱性の巡回監査ループ)→ `fix/` 専用ブランチ + +### エージェントチーム(GUIDE_02 準拠) + +- 実装は `/implement <タスク>` で開始する(コーディング → テスト → リファクタリング → ドキュメント更新) +- Phase 1 後に人間が動作確認,Phase 2 でテスト失敗時のみ方針判断 +- Phase 2 成功後は Phase 3 → Phase 4 まで自動で進む(Phase 4 で更新がある場合のみ確認) +- テスト・リファクタリングをスキップしない + +### 開発コマンド + +- 起動・テスト・lint 等の開発コマンドは `docs/02_ENV/ENV_04_開発コマンド.md` にまとめる.**存在する場合は実行前に必ず参照し,推測でコマンドを試さない** +- コマンドが新しく確定・変更された時は同ファイルに反映する(無ければその時点で作成する.`/implement` の Phase 4 でも見直される) + +### 手動確認が必要な作業(自分で完了させないこと) + +以下は実装完了後にユーザーへ報告し,確認・実施を依頼すること. + +- 外部サービスの設定(コンソール操作,セキュリティルール変更等) +- 実機・ブラウザでの動作確認 +- ストアへのアップロード・リリース作業 + +## ドキュメント + +設計・規約に関する情報は docs/ にある. +コードを書く前に関連するファイルを読むこと. + +### 01_GUIDE(規約・ルール) + +- プロジェクト立ち上げフロー: docs/01_GUIDE/GUIDE_01_プロジェクト立ち上げフロー.md +- エージェント運用ルール: docs/01_GUIDE/GUIDE_02_エージェント運用ルール.md +- ※ Git 規約・ドキュメント書式・命名規則・進捗記録・テスト方針・エラーハンドリング方針は `.claude/rules/`(git-conventions / markdown-style / docs-naming / progress-log / testing / error-handling)に path-scoped rule として定義されている(git-conventions は常時,他は該当ファイル編集時に自動ロード) +- ※ コーディング規約・プロジェクト構成規則は未整備(GUIDE_01 の規約整備フェーズ参照) + +### 02_ENV(環境) + +- 技術スタック: docs/02_ENV/ENV_01_技術スタック.md +- 環境構築手順: docs/02_ENV/ENV_02_環境構築手順.md +- 管理者用環境構築手順: docs/02_ENV/ENV_03_管理者用環境構築手順.md +- 開発コマンド: docs/02_ENV/ENV_04_開発コマンド.md +- ディレクトリ構成: docs/02_ENV/ENV_05_ディレクトリ構成.md +- ビルド構成とビルドフラグ: docs/02_ENV/ENV_06_ビルド構成とビルドフラグ.md + +### 03_PLAN(計画) + +- プレビューメモリリーク修正計画: docs/03_PLAN/PLAN_03_プレビューメモリリーク修正計画.md +- 性能評価計測計画: docs/03_PLAN/PLAN_04_性能評価計測計画.md +- ※ PLAN_01(リファクタリング)・PLAN_02(バグ修正)は完了につき削除済み(要点は docs/PROGRESS.md,経緯は git 履歴) + +### 04_SPEC(仕様・設計) + +- 機能仕様: docs/04_SPEC/SPEC_01_機能仕様.md +- 設定ファイル仕様: docs/04_SPEC/SPEC_02_設定ファイル仕様.md +- 白板撮影プロトコル(照明均一性評価): docs/04_SPEC/SPEC_03_白板撮影_照明均一性評価.md +- 白板撮影データ仕様(SmTIAS 引き渡し用): docs/04_SPEC/SPEC_04_白板撮影データ仕様.md + +### 05_TECH(技術設計) + +- クラス設計: docs/05_TECH/TECH_01_クラス設計.md +- カメラ制御仕様: docs/05_TECH/TECH_02_カメラ制御仕様.md +- 色補正処理仕様: docs/05_TECH/TECH_03_色補正処理仕様.md + +### 06_TEST(テスト) + +- テスト仕様(回帰・手動テスト手順): docs/06_TEST/TEST_01_テスト仕様.md +- 性能評価計測結果(v1.6/v1.7/現行の 3 版比較): docs/06_TEST/TEST_02_性能評価計測結果.md +- メモリ修正効果計測(自動ベンチ): docs/06_TEST/TEST_03_メモリ修正効果計測.md + +### その他(docs 直下) + +- 進捗フルログ: docs/PROGRESS.md +- 上流向け変更サマリ(v1.6/v1.7 から何をどう直したか・差分確認付き): docs/変更まとめ_v1.6-v1.7から.md diff --git a/README.md b/README.md index 8367494..4dcd620 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,34 @@ # TIAS Shot -TIAS�B�e�\�t�g�E�F�A +TIAS 撮影ソフトウェア(舌診用).舌診チャートによる自動校正と色変換行列の算出を経て,sRGB 変換画像を保存する. -## ���� -- �V�J���� ImagingSource DBK33UX178, DFK23UX249 �Ή� -- ���J���� Lumenera Lw110 �Ή� -- ��f�`���[�g�Ή� -- �ϊ��s��̎�����ύX�”\�i�ݒ�t�@�C���Ŏw��j -- ������ON/OFF���� -- sRGB�ϊ��ʐ^�̕ۑ� +## 説明 (Features) -## �J���‹� -- Visual C# 2022 -- OpenCV Sharp 4.10 +- 新カメラ ImagingSource DBK33UX178(ソースコード上は DFK33UX178,実機の型番は要確認),DFK23UX249 対応 +- 旧カメラ Lumenera Lw110 対応 +- 舌診チャート対応(チャート検出による自動校正) +- 変換行列の次数を変更可能(設定ファイルで指定) +- 光源の ON/OFF 制御 +- sRGB 変換写真の保存 +- 白板撮影モード(照明均一性評価用・`WHITEBOARD` ビルド限定) +- メモリ観測ツール(性能計測用・`MEMMONITOR` ビルド限定) + +## v1.6/v1.7 からの変更 (Changes since v1.6/v1.7) + +本リポジトリは上流(nakaguchi)v1.7 からのフォークで,クラッシュ修正・メモリリーク修正・性能改善を積んでいる.**何をどう直したか(各変更の状況と差分の確認方法)**は次を参照する. + +- [docs/変更まとめ_v1.6-v1.7から.md](docs/変更まとめ_v1.6-v1.7から.md) — 変更ごとの「状況/変更/効果/差分確認コマンド」 +- [docs/06_TEST/TEST_02_性能評価計測結果.md](docs/06_TEST/TEST_02_性能評価計測結果.md) — 3 バージョン実機計測の定量比較 + +## 開発環境 (Development Environment) + +- Visual Studio 2022(Visual C#) +- .NET Framework 4.8 / **x64 のみ**(OpenCvSharp がネイティブ DLL に依存) +- OpenCvSharp 4.10 +- カメラ SDK: IC Imaging Control 3.5(ImagingSource)/lumenera.api(Lumenera) + +環境構築は [docs/02_ENV/ENV_02_環境構築手順.md](docs/02_ENV/ENV_02_環境構築手順.md),ビルド・テスト・実行コマンドは [docs/02_ENV/ENV_04_開発コマンド.md](docs/02_ENV/ENV_04_開発コマンド.md),ビルドフラグ(`WHITEBOARD`・`MEMMONITOR`)は [docs/02_ENV/ENV_06_ビルド構成とビルドフラグ.md](docs/02_ENV/ENV_06_ビルド構成とビルドフラグ.md) を参照する. + +## ドキュメント (Documents) + +設計・仕様・テストのドキュメントは `docs/` にカテゴリ別(`01_GUIDE`〜`06_TEST`)で置く.全体像は [docs/02_ENV/ENV_05_ディレクトリ構成.md](docs/02_ENV/ENV_05_ディレクトリ構成.md),開発の経緯は [docs/PROGRESS.md](docs/PROGRESS.md) を参照する. diff --git a/TIASshot.Tests/BitmapUtilTests.cs b/TIASshot.Tests/BitmapUtilTests.cs new file mode 100644 index 0000000..05a7041 --- /dev/null +++ b/TIASshot.Tests/BitmapUtilTests.cs @@ -0,0 +1,348 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using NUnit.Framework; + +namespace TIASshot.Tests { + /// + /// BitmapUtil.FastClone のテスト(ピュアロジック層)。 + /// + /// GUIDE_08: FastClone は Bitmap の画素バッファを LockBits + memcpy で複製する + /// ハードウェア非依存の処理であり,NUnit で仕様どおりの入出力を検証できる。 + /// + /// 対象外について: + /// 本コミット(609baf6・252cde3)の本質である Form1.ShowImage / PreviewMonitor の + /// タイマー駆動描画・_dispBufLock を介したクロススレッド Dispose の所有権モデル・ + /// Lucam コールバックスレッドと UI スレッドの GDI 競合・WM_PAINT/WM_TIMER の + /// スケジューリングは,実メッセージループ・実カメラ・副ディスプレイに依存する + /// ハードウェア結合層(GUIDE_08)であり,NUnit の自動ユニットテストの対象外とする。 + /// これらは実機の MEMMONITOR 計測(TEST_03 参照)で反復検証済み。 + /// フェイクの UI ループを組んでまで検証する脆いテストは作らない。 + /// + [TestFixture] + public class BitmapUtilTests { + + // --------------------------------------------------------------- + // 仕様1・2: サイズ・PixelFormat の一致/全画素一致 + // --------------------------------------------------------------- + + /// + /// FastClone_24bppRgb_サイズとPixelFormatが入力と一致する + /// + [Test] + public void FastClone_24bppRgb_サイズとPixelFormatが入力と一致する() { + using (var src = CreateSolidBitmap(4, 3, PixelFormat.Format24bppRgb, Color.FromArgb(10, 20, 30))) + using (var dst = BitmapUtil.FastClone(src)) { + Assert.AreEqual(src.Width, dst.Width, "幅が一致すること"); + Assert.AreEqual(src.Height, dst.Height, "高さが一致すること"); + Assert.AreEqual(src.PixelFormat, dst.PixelFormat, "PixelFormat が一致すること"); + } + } + + /// + /// FastClone_24bppRgb_全画素が入力と一致する + /// + [Test] + public void FastClone_24bppRgb_全画素が入力と一致する() { + using (var src = CreateGradientBitmap(8, 5, PixelFormat.Format24bppRgb)) + using (var dst = BitmapUtil.FastClone(src)) { + AssertPixelsEqual(src, dst); + } + } + + /// + /// FastClone_32bppArgb_サイズとPixelFormatが入力と一致する + /// + [Test] + public void FastClone_32bppArgb_サイズとPixelFormatが入力と一致する() { + using (var src = CreateSolidBitmap(5, 4, PixelFormat.Format32bppArgb, Color.FromArgb(200, 10, 20, 30))) + using (var dst = BitmapUtil.FastClone(src)) { + Assert.AreEqual(src.Width, dst.Width, "幅が一致すること"); + Assert.AreEqual(src.Height, dst.Height, "高さが一致すること"); + Assert.AreEqual(src.PixelFormat, dst.PixelFormat, "PixelFormat が一致すること"); + } + } + + /// + /// FastClone_32bppArgb_全画素(アルファ含む)が入力と一致する + /// + [Test] + public void FastClone_32bppArgb_全画素が入力と一致する() { + using (var src = CreateGradientBitmap(6, 6, PixelFormat.Format32bppArgb)) + using (var dst = BitmapUtil.FastClone(src)) { + AssertPixelsEqual(src, dst); + } + } + + // --------------------------------------------------------------- + // 仕様3: 入力とは独立した画素バッファを持つ + // --------------------------------------------------------------- + + /// + /// FastClone_複製後に入力をDisposeしても複製は有効なまま読める + /// + [Test] + public void FastClone_複製後に入力をDisposeしても複製は有効なまま読める() { + var src = CreateSolidBitmap(4, 4, PixelFormat.Format24bppRgb, Color.FromArgb(11, 22, 33)); + Bitmap dst = BitmapUtil.FastClone(src); + src.Dispose(); + + try { + Assert.AreEqual(4, dst.Width, "src Dispose 後も dst の幅が読めること"); + Assert.AreEqual(4, dst.Height, "src Dispose 後も dst の高さが読めること"); + + Color px = dst.GetPixel(0, 0); + Assert.AreEqual(11, px.R, "src Dispose 後も dst の画素(R)が読めること"); + Assert.AreEqual(22, px.G, "src Dispose 後も dst の画素(G)が読めること"); + Assert.AreEqual(33, px.B, "src Dispose 後も dst の画素(B)が読めること"); + } finally { + dst.Dispose(); + } + } + + /// + /// FastClone_複製の画素を書き換えても入力の画素は変化しない + /// + [Test] + public void FastClone_複製の画素を書き換えても入力の画素は変化しない() { + using (var src = CreateSolidBitmap(4, 4, PixelFormat.Format24bppRgb, Color.FromArgb(50, 60, 70))) + using (var dst = BitmapUtil.FastClone(src)) { + dst.SetPixel(0, 0, Color.FromArgb(0, 0, 0)); + + Color srcPx = src.GetPixel(0, 0); + Assert.AreEqual(50, srcPx.R, "dst 変更後も src の R は不変"); + Assert.AreEqual(60, srcPx.G, "dst 変更後も src の G は不変"); + Assert.AreEqual(70, srcPx.B, "dst 変更後も src の B は不変"); + } + } + + // --------------------------------------------------------------- + // 仕様4: 入力を破壊しない(呼び出し前後で src の画素が不変) + // --------------------------------------------------------------- + + /// + /// FastClone_呼び出し前後でsrcの画素が変化しない + /// + [Test] + public void FastClone_呼び出し前後でsrcの画素が変化しない() { + using (var src = CreateGradientBitmap(7, 5, PixelFormat.Format24bppRgb)) { + // 呼び出し前の画素を保持 + Color before00 = src.GetPixel(0, 0); + Color beforeCorner = src.GetPixel(src.Width - 1, src.Height - 1); + + using (var dst = BitmapUtil.FastClone(src)) { + Assert.IsNotNull(dst); + } + + Color after00 = src.GetPixel(0, 0); + Color afterCorner = src.GetPixel(src.Width - 1, src.Height - 1); + + Assert.AreEqual(before00, after00, "FastClone 呼び出し前後で (0,0) の画素が不変であること"); + Assert.AreEqual(beforeCorner, afterCorner, "FastClone 呼び出し前後で末尾画素が不変であること"); + } + } + + // --------------------------------------------------------------- + // 仕様5: ストライドのパディング(幅が4の倍数でない24bppRgb) + // --------------------------------------------------------------- + + /// + /// FastClone_幅が4の倍数でない24bppRgb_全画素が一致する(行末パディングを除外して比較) + /// + [Test] + public void FastClone_幅が4の倍数でない24bppRgb_全画素が一致する() { + // 幅5px * 3byte = 15byte → 4byte境界にするため1byteパディングが入るサイズ + using (var src = CreateGradientBitmap(5, 3, PixelFormat.Format24bppRgb)) + using (var dst = BitmapUtil.FastClone(src)) { + AssertPixelsEqual(src, dst); + } + } + + /// + /// FastClone_幅が4の倍数でない24bppRgb_サイズが一致する + /// + [Test] + public void FastClone_幅が4の倍数でない24bppRgb_サイズが一致する() { + using (var src = CreateGradientBitmap(5, 3, PixelFormat.Format24bppRgb)) + using (var dst = BitmapUtil.FastClone(src)) { + Assert.AreEqual(5, dst.Width); + Assert.AreEqual(3, dst.Height); + } + } + + // --------------------------------------------------------------- + // 仕様6: インデックスカラーのフォールバック + // --------------------------------------------------------------- + + /// + /// FastClone_8bppIndexed_色が等価な独立コピーを返す: + /// + /// 8bppIndexed は LockBits 単純コピーではパレットを保持できないため, + /// `new Bitmap(src)`(GDI+ フルコピー)にフォールバックする。 + /// このフォールバックは GDI+ の仕様上,返り値の PixelFormat を + /// Format32bppArgb に変換する(Format8bppIndexed のままにはならない)。 + /// そのため本テストでは PixelFormat の一致は検証せず, + /// 「例外を投げない」「入力とは別インスタンス」「サイズが一致する」 + /// 「解決済みの色(GetPixel が返すパレット適用後の ARGB)が画素ごとに一致する」 + /// という,このフォールバックが満たすべき妥当な契約を検証する。 + /// + [Test] + public void FastClone_8bppIndexed_色が等価な独立コピーを返す() { + using (var src = new Bitmap(4, 4, PixelFormat.Format8bppIndexed)) { + // パレットを設定(グレースケール) + ColorPalette palette = src.Palette; + for (int i = 0; i < palette.Entries.Length; i++) { + palette.Entries[i] = Color.FromArgb(i, i, i); + } + src.Palette = palette; + + // 画素インデックスを設定 + SetIndexedPixel(src, 0, 0, 5); + SetIndexedPixel(src, 1, 1, 200); + SetIndexedPixel(src, 3, 3, 255); + + Bitmap dst = null; + Assert.DoesNotThrow(() => dst = BitmapUtil.FastClone(src), + "8bppIndexed を渡しても例外をスローしないこと"); + + try { + Assert.IsNotNull(dst, "8bppIndexed のフォールバックコピーは null であってはならない"); + Assert.AreNotSame(src, dst, "入力とは別インスタンスであること"); + Assert.AreEqual(src.Width, dst.Width, "幅が一致すること"); + Assert.AreEqual(src.Height, dst.Height, "高さが一致すること"); + + // 解決済みの色(パレット適用後の ARGB)が画素ごとに一致すること + Assert.AreEqual(src.GetPixel(0, 0), dst.GetPixel(0, 0), "(0,0) の色が一致すること"); + Assert.AreEqual(src.GetPixel(1, 1), dst.GetPixel(1, 1), "(1,1) の色が一致すること"); + Assert.AreEqual(src.GetPixel(3, 3), dst.GetPixel(3, 3), "(3,3) の色が一致すること"); + + // 独立性: src を Dispose 後も dst の画素が読めること + } finally { + if (dst != null) dst.Dispose(); + } + } + } + + /// + /// FastClone_8bppIndexed_複製後に入力をDisposeしても複製の色は読める: + /// インデックスフォールバック経路でも独立性(クロススレッド Dispose 耐性)が + /// 保たれることを確認する。 + /// + [Test] + public void FastClone_8bppIndexed_複製後に入力をDisposeしても複製の色は読める() { + var src = new Bitmap(2, 2, PixelFormat.Format8bppIndexed); + ColorPalette palette = src.Palette; + palette.Entries[9] = Color.FromArgb(9, 9, 9); + src.Palette = palette; + SetIndexedPixel(src, 0, 0, 9); + + Bitmap dst = BitmapUtil.FastClone(src); + Color expected = src.GetPixel(0, 0); + src.Dispose(); + + try { + Color actual = dst.GetPixel(0, 0); + Assert.AreEqual(expected, actual, "src Dispose 後も dst の色が読めること"); + } finally { + dst.Dispose(); + } + } + + // --------------------------------------------------------------- + // 仕様7: null 入力 + // --------------------------------------------------------------- + + /// + /// FastClone_null入力_nullを返す + /// + [Test] + public void FastClone_null入力_nullを返す() { + Bitmap result = BitmapUtil.FastClone(null); + Assert.IsNull(result, "null 入力に対して null を返すこと(例外をスローしない)"); + } + + // --------------------------------------------------------------- + // ヘルパー + // --------------------------------------------------------------- + + /// + /// 単色の Bitmap を生成する + /// + private static Bitmap CreateSolidBitmap(int width, int height, PixelFormat format, Color color) { + var bmp = new Bitmap(width, height, format); + using (var g = Graphics.FromImage(bmp)) { + using (var brush = new SolidBrush(color)) { + g.FillRectangle(brush, 0, 0, width, height); + } + } + return bmp; + } + + /// + /// 決定的なグラデーション(座標に依存する画素値)を持つ Bitmap を GetPixel/SetPixel で生成する。 + /// GDI+ の描画経路を通さず,画素値を直接指定するため決定的。 + /// + private static Bitmap CreateGradientBitmap(int width, int height, PixelFormat format) { + var bmp = new Bitmap(width, height, format); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int r = (x * 37 + y * 11) % 256; + int g = (x * 5 + y * 53) % 256; + int b = (x * 71 + y * 3) % 256; + int a = format == PixelFormat.Format32bppArgb ? (x * 13 + y * 17) % 256 : 255; + bmp.SetPixel(x, y, Color.FromArgb(a, r, g, b)); + } + } + return bmp; + } + + /// + /// 8bppIndexed Bitmap の指定座標にパレットインデックスを設定する(LockBits 経由) + /// + private static void SetIndexedPixel(Bitmap bmp, int x, int y, byte index) { + var rect = new Rectangle(x, y, 1, 1); + BitmapData data = bmp.LockBits(rect, ImageLockMode.WriteOnly, bmp.PixelFormat); + try { + System.Runtime.InteropServices.Marshal.WriteByte(data.Scan0, index); + } finally { + bmp.UnlockBits(data); + } + } + + /// + /// 2つの Bitmap が全画素で一致することを検証する(GetPixel による代表的座標比較でなく全画素走査)。 + /// LockBits で生バイトを取得し,行ごとに有効バイト幅(パディング除外)だけを比較する。 + /// + private static void AssertPixelsEqual(Bitmap expected, Bitmap actual) { + Assert.AreEqual(expected.Width, actual.Width, "幅が一致すること(画素比較の前提)"); + Assert.AreEqual(expected.Height, actual.Height, "高さが一致すること(画素比較の前提)"); + Assert.AreEqual(expected.PixelFormat, actual.PixelFormat, "PixelFormat が一致すること(画素比較の前提)"); + + var rect = new Rectangle(0, 0, expected.Width, expected.Height); + BitmapData expData = expected.LockBits(rect, ImageLockMode.ReadOnly, expected.PixelFormat); + BitmapData actData = actual.LockBits(rect, ImageLockMode.ReadOnly, actual.PixelFormat); + try { + int bytesPerPixel = Image.GetPixelFormatSize(expected.PixelFormat) / 8; + int validBytesPerRow = expected.Width * bytesPerPixel; + + var expRow = new byte[validBytesPerRow]; + var actRow = new byte[validBytesPerRow]; + + for (int y = 0; y < expected.Height; y++) { + System.Runtime.InteropServices.Marshal.Copy( + IntPtr.Add(expData.Scan0, y * expData.Stride), expRow, 0, validBytesPerRow); + System.Runtime.InteropServices.Marshal.Copy( + IntPtr.Add(actData.Scan0, y * actData.Stride), actRow, 0, validBytesPerRow); + + for (int i = 0; i < validBytesPerRow; i++) { + Assert.AreEqual(expRow[i], actRow[i], + $"行 y={y} のバイト位置 {i}(パディング除外後)が一致すること"); + } + } + } finally { + expected.UnlockBits(expData); + actual.UnlockBits(actData); + } + } + } +} diff --git a/TIASshot.Tests/ColorCorrectorTests.cs b/TIASshot.Tests/ColorCorrectorTests.cs new file mode 100644 index 0000000..f06f12e --- /dev/null +++ b/TIASshot.Tests/ColorCorrectorTests.cs @@ -0,0 +1,502 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// ColorCorrector のテスト + /// + [TestFixture] + public class ColorCorrectorTests { + + // --------------------------------------------------------------- + // ExtendMat テスト + // --------------------------------------------------------------- + + /// + /// ExtendMat: 3列 Mat(Nx3)を channels=4 で拡張すると列数が 4 になる + /// + [Test] + public void ExtendMat_3ColsTo4Channels_ResultHas4Cols() { + // Arrange: 2行 3列 (CV_64FC1) + using (var src = new Mat(2, 3, MatType.CV_64FC1)) { + // row=0: B=10, G=20, R=30 (Col0=B, Col1=G, Col2=R) + SetBGR(src, row: 0, b: 10.0, g: 20.0, r: 30.0); + SetBGR(src, row: 1, b: 0.0, g: 0.0, r: 0.0); + + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ExtendMat(src, channels: 4)) { + // Assert + Assert.AreEqual(2, dst.Rows, "行数は変わらない"); + Assert.AreEqual(4, dst.Cols, "列数は指定した channels 数になる"); + } + } + } + + /// + /// ExtendMat: channels=4 の 1 列目(i=0)は定数 1.0(ExtendChannels[0]={3,3,3} → vals[3]*vals[3]*vals[3]=1) + /// + [Test] + public void ExtendMat_4Channels_FirstColumnIsConstant1() { + // Arrange + using (var src = new Mat(3, 3, MatType.CV_64FC1)) { + SetBGR(src, row: 0, b: 10.0, g: 20.0, r: 30.0); + SetBGR(src, row: 1, b: 5.0, g: 15.0, r: 50.0); + SetBGR(src, row: 2, b: 0.0, g: 0.0, r: 0.0); + + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ExtendMat(src, channels: 4)) { + // Assert: 列 0 は全行で 1.0 + for (int row = 0; row < dst.Rows; row++) { + Assert.AreEqual(1.0, dst.At(row, 0), 1e-10, + $"row={row}: 列0(定数項)は 1.0 であること"); + } + } + } + } + + /// + /// ExtendMat: channels=4 の 2~4 列目は R, G, B の値(ExtendChannels[1]={0,3,3}→R, [2]={1,3,3}→G, [3]={2,3,3}→B) + /// + [Test] + public void ExtendMat_4Channels_Columns1To3AreRGB() { + // Arrange: B=10, G=20, R=30 + using (var src = new Mat(1, 3, MatType.CV_64FC1)) { + SetBGR(src, row: 0, b: 10.0, g: 20.0, r: 30.0); + + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ExtendMat(src, channels: 4)) { + // Assert + // ExtendChannels[1]={0,3,3}: vals[0]*vals[3]*vals[3] = R*1*1 = 30 + Assert.AreEqual(30.0, dst.At(0, 1), 1e-10, "列1 は R"); + // ExtendChannels[2]={1,3,3}: vals[1]*vals[3]*vals[3] = G*1*1 = 20 + Assert.AreEqual(20.0, dst.At(0, 2), 1e-10, "列2 は G"); + // ExtendChannels[3]={2,3,3}: vals[2]*vals[3]*vals[3] = B*1*1 = 10 + Assert.AreEqual(10.0, dst.At(0, 3), 1e-10, "列3 は B"); + } + } + } + + /// + /// ExtendMat: channels=5 の列4(i=4)は R*G(ExtendChannels[4]={0,1,3}: vals[0]*vals[1]*vals[3]=R*G*1) + /// + [Test] + public void ExtendMat_5Channels_Column4IsRxG() { + // Arrange: B=10, G=20, R=30 + using (var src = new Mat(1, 3, MatType.CV_64FC1)) { + SetBGR(src, row: 0, b: 10.0, g: 20.0, r: 30.0); + + var corrector = new ColorCorrector(null, null, new int[] { 5 }); + + // Act + using (var dst = corrector.ExtendMat(src, channels: 5)) { + // Assert: 列4(i=4)= R*G = 30*20 = 600 + Assert.AreEqual(600.0, dst.At(0, 4), 1e-10, "列4 は R*G = 30*20 = 600"); + } + } + } + + /// + /// ExtendMat: Cols が 3 以外の Mat はそのまま返す(スルー条件) + /// + [Test] + public void ExtendMat_NonStandardInput_ReturnsSrc() { + // Arrange: 2x5 → Cols*Channels() = 5*1 != 3 なのでスルー + using (var src = new Mat(2, 5, MatType.CV_64FC1)) { + var corrector = MakeCorrectorWith4Channels(); + + // Act + var dst = corrector.ExtendMat(src, channels: 4); + + // Assert: 列数が変わらない(src のまま返る) + Assert.AreEqual(5, dst.Cols, "3列でない入力はそのまま返す"); + // dst == src の参照なので Dispose しない(src の using で解放される) + } + } + + // --------------------------------------------------------------- + // CalcConvertMatrix テスト + // --------------------------------------------------------------- + + /// + /// CalcConvertMatrix: 出力行列のサイズは channels x 3 になる(channels=4 のケース) + /// + [Test] + public void CalcConvertMatrix_4Channels_OutputSizeIs4x3() { + // Arrange: 24行 3列(チャート 24 色票相当の最小入力) + using (var src = CreateLinearColorChart(rows: 24)) + using (var target = CreateScaledColorChart(rows: 24, scale: 1.1)) { + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var conv = corrector.CalcConvertMatrix(src, target, channels: 4)) { + // Assert: 変換行列は channels x 3 = 4 x 3 + Assert.AreEqual(4, conv.Rows, "行数(channels)は 4 であること"); + Assert.AreEqual(3, conv.Cols, "列数は 3(RGB チャネル)であること"); + } + } + } + + /// + /// CalcConvertMatrix: 出力行列のサイズは channels x 3 になる(channels=6 のケース) + /// + [Test] + public void CalcConvertMatrix_6Channels_OutputSizeIs6x3() { + // Arrange + using (var src = CreateLinearColorChart(rows: 24)) + using (var target = CreateScaledColorChart(rows: 24, scale: 0.9)) { + var corrector = new ColorCorrector(null, null, new int[] { 6 }); + + // Act + using (var conv = corrector.CalcConvertMatrix(src, target, channels: 6)) { + // Assert + Assert.AreEqual(6, conv.Rows, "行数(channels)は 6 であること"); + Assert.AreEqual(3, conv.Cols, "列数は 3(RGB チャネル)であること"); + } + } + } + + // --------------------------------------------------------------- + // ConvertColor テスト + // --------------------------------------------------------------- + + /// + /// ConvertColor: 変換行列が恒等行列(上位 3 行が単位行列・残りはゼロ)のとき出力は入力と一致する + /// + [Test] + public void ConvertColor_IdentityLikeMatrix_OutputMatchesInput() { + // Arrange: 入力 1行 3列(B=10, G=20, R=30) + using (var src = new Mat(1, 3, MatType.CV_64FC1)) + using (var conv = CreateIdentityLikeConvMat()) { + SetBGR(src, row: 0, b: 10.0, g: 20.0, r: 30.0); + + var corrector = MakeCorrectorWith4Channels(); + + // Act + // channels=4 の conv は 4x3。 + // ExtendMat(src, 4) = [1, R, G, B] = [1, 30, 20, 10] + // conv の行 1,2,3 を R→R, G→G, B→B に対応させると出力が元に戻る。 + // 行0(定数項)=0, 行1(R)=[1,0,0], 行2(G)=[0,1,0], 行3(B)=[0,0,1] + using (var dst = corrector.ConvertColor(src, conv)) { + // Assert: 出力は 1x3, 値は B=10, G=20, R=30 + Assert.AreEqual(1, dst.Rows, "出力行数は入力と同じ"); + Assert.AreEqual(3, dst.Cols, "出力列数は 3(RGB)"); + Assert.AreEqual(10.0, dst.At(0, 0), 1e-10, "出力 B = 10"); + Assert.AreEqual(20.0, dst.At(0, 1), 1e-10, "出力 G = 20"); + Assert.AreEqual(30.0, dst.At(0, 2), 1e-10, "出力 R = 30"); + } + } + } + + /// + /// ConvertColor: 出力行列のサイズは入力の行数 x 3 になる(多行入力) + /// + [Test] + public void ConvertColor_MultipleRows_OutputSizeMatchesInput() { + // Arrange: 5行 3列 + using (var src = new Mat(5, 3, MatType.CV_64FC1)) { + for (int row = 0; row < 5; row++) { + src.At(row, 0) = row * 10.0; // B + src.At(row, 1) = row * 10.0 + 5; // G + src.At(row, 2) = row * 10.0 + 8; // R + } + // 4x3 のゼロ以外の適当な変換行列(解が存在すればよい) + using (var conv = new Mat(4, 3, MatType.CV_64FC1)) { + conv.At(0, 0) = 0.5; conv.At(0, 1) = 0.0; conv.At(0, 2) = 0.0; + conv.At(1, 0) = 0.0; conv.At(1, 1) = 0.5; conv.At(1, 2) = 0.0; + conv.At(2, 0) = 0.0; conv.At(2, 1) = 0.0; conv.At(2, 2) = 0.5; + conv.At(3, 0) = 0.0; conv.At(3, 1) = 0.0; conv.At(3, 2) = 0.0; + + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ConvertColor(src, conv)) { + // Assert: 出力は 5行 3列 + Assert.AreEqual(5, dst.Rows, "出力行数は入力行数と同じ"); + Assert.AreEqual(3, dst.Cols, "出力列数は 3(RGB)"); + } + } + } + } + + // --------------------------------------------------------------- + // ヘルパー + // --------------------------------------------------------------- + + /// channels=4 の ColorCorrector を生成する + private static ColorCorrector MakeCorrectorWith4Channels() + => new ColorCorrector(null, null, new int[] { 4 }); + + /// + /// 1行の BGRカラム順 Mat に B/G/R 値をセットする + /// (ColorCorrector の内部配列は Col0=B, Col1=G, Col2=R) + /// + private static void SetBGR(Mat m, int row, double b, double g, double r) { + m.At(row, 0) = b; + m.At(row, 1) = g; + m.At(row, 2) = r; + } + + /// + /// 線形スケールで値を増加させる 24行 3列の色票 Mat を生成する(CalcConvertMatrix 用) + /// row i の値: B=i+1, G=(i+1)*2, R=(i+1)*3 + /// + private static Mat CreateLinearColorChart(int rows) { + var m = new Mat(rows, 3, MatType.CV_64FC1); + for (int row = 0; row < rows; row++) { + m.At(row, 0) = row + 1; // B + m.At(row, 1) = (row + 1) * 2; // G + m.At(row, 2) = (row + 1) * 3; // R + } + return m; + } + + /// + /// の値に係数 scale をかけた色票 Mat を生成する + /// + private static Mat CreateScaledColorChart(int rows, double scale) { + var m = new Mat(rows, 3, MatType.CV_64FC1); + for (int row = 0; row < rows; row++) { + m.At(row, 0) = (row + 1) * 1.0 * scale; // B + m.At(row, 1) = (row + 1) * 2.0 * scale; // G + m.At(row, 2) = (row + 1) * 3.0 * scale; // R + } + return m; + } + + /// + /// 恒等変換に相当する 4x3 変換行列を生成する + /// ExtendMat col順: [0]=定数1, [1]=R, [2]=G, [3]=B → 出力列: [0]=B, [1]=G, [2]=R + /// 行0(定数項)=0, 行1(R)→出力R=[0,0,1], 行2(G)→出力G=[0,1,0], 行3(B)→出力B=[1,0,0] + /// + private static Mat CreateIdentityLikeConvMat() { + var conv = new Mat(4, 3, MatType.CV_64FC1); + // 行0: 定数項が出力に寄与しない(0ベクトル) + conv.At(0, 0) = 0.0; conv.At(0, 1) = 0.0; conv.At(0, 2) = 0.0; + // 行1: R → 出力 R 列 (col2) + conv.At(1, 0) = 0.0; conv.At(1, 1) = 0.0; conv.At(1, 2) = 1.0; + // 行2: G → 出力 G 列 (col1) + conv.At(2, 0) = 0.0; conv.At(2, 1) = 1.0; conv.At(2, 2) = 0.0; + // 行3: B → 出力 B 列 (col0) + conv.At(3, 0) = 1.0; conv.At(3, 1) = 0.0; conv.At(3, 2) = 0.0; + return conv; + } + + // --------------------------------------------------------------- + // ConvertImage(Mat src, Mat conv) テスト + // --------------------------------------------------------------- + + /// + /// ConvertImage: 2x2 の CV_8UC3 画像と 4x3 の conv 行列を与えたとき + /// 出力が CV_8UC3 かつ入力と同じ高さ×幅(2×2)になること + /// + [Test] + public void ConvertImage_2x2Input_OutputIsCV8UC3WithSameSize() { + // Arrange: 2行2列 CV_8UC3(各画素 B=50, G=100, R=150) + using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var conv = CreateIdentityLikeConvMat()) { + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ConvertImage(src, conv)) { + // Assert: 型・サイズ + Assert.AreEqual(MatType.CV_8UC3, dst.Type(), "出力型は CV_8UC3"); + Assert.AreEqual(2, dst.Rows, "出力行数は入力と同じ"); + Assert.AreEqual(2, dst.Cols, "出力列数は入力と同じ"); + } + } + } + + /// + /// ConvertImage: 恒等変換行列を使ったとき出力ピクセル値が入力ピクセル値と一致すること + /// (use-after-dispose で出力が破損していないことの確認) + /// 手計算: + /// flatten 後 ExtendMat で各画素 → [1, R, G, B] + /// 恒等 conv = [[0,0,0],[0,0,1],[0,1,0],[1,0,0]] + /// 積 [1,R,G,B]*conv = [0+0+0+B, 0+0+G+0, 0+R+0+0] = [B, G, R] + /// ConvertTo CV_8UC3 → Vec3b(B, G, R) + /// + [Test] + public void ConvertImage_IdentityConv_OutputPixelMatchesInput() { + // Arrange: 1x1 CV_8UC3(B=50, G=100, R=150) + using (var src = new Mat(1, 1, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var conv = CreateIdentityLikeConvMat()) { + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ConvertImage(src, conv)) { + // Assert: 出力ピクセルが入力と同一値 + var pixel = dst.At(0, 0); + Assert.AreEqual(50, pixel.Item0, "出力 B = 50"); + Assert.AreEqual(100, pixel.Item1, "出力 G = 100"); + Assert.AreEqual(150, pixel.Item2, "出力 R = 150"); + } + } + } + + /// + /// ConvertImage: 0 行列の conv を使ったとき全ピクセルが 0 になること + /// (出力が conv に依存して決まること、use-after-dispose で任意値が返らないことの確認) + /// + [Test] + public void ConvertImage_ZeroConv_AllOutputPixelsAreZero() { + // Arrange: 2x2 CV_8UC3(B=50, G=100, R=150)、conv は全ゼロ + using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var conv = new Mat(4, 3, MatType.CV_64FC1, new Scalar(0.0))) { + var corrector = MakeCorrectorWith4Channels(); + + // Act + using (var dst = corrector.ConvertImage(src, conv)) { + // Assert: 全ピクセルが 0 + for (int row = 0; row < dst.Rows; row++) { + for (int col = 0; col < dst.Cols; col++) { + var pixel = dst.At(row, col); + Assert.AreEqual(0, pixel.Item0, $"row={row}, col={col}: B は 0"); + Assert.AreEqual(0, pixel.Item1, $"row={row}, col={col}: G は 0"); + Assert.AreEqual(0, pixel.Item2, $"row={row}, col={col}: R は 0"); + } + } + } + } + } + + /// + /// ConvertImage: 同一 ColorCorrector インスタンスで連続 3 回呼び出しても + /// 毎回正しい出力が得られ例外が発生しないこと + /// (using による解放が呼び出しを跨いで健全なことの確認=今回修正の核心) + /// 注意: src.ConvertTo(src, CV_64FC3) が in-place 書き換えを行うため(優先度4 の既知挙動)、 + /// 各呼び出しで新しい src を生成する + /// + [Test] + public void ConvertImage_CalledThreeTimesInSequence_EachCallReturnsCorrectOutput() { + var corrector = MakeCorrectorWith4Channels(); + + for (int call = 0; call < 3; call++) { + // Arrange: 呼び出しごとに新しい src を生成(in-place 書き換え副作用の回避) + using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var conv = CreateIdentityLikeConvMat()) { + // Act: 例外が発生しないことも検証(解放済み Mat へのアクセスがないこと) + Mat dst = null; + Assert.DoesNotThrow(() => dst = corrector.ConvertImage(src, conv), + $"呼び出し {call + 1} 回目で例外が発生した"); + + // Assert: 出力が正しいこと(解放済み Mat からの読み出しでないことの確認) + using (dst) { + Assert.AreEqual(MatType.CV_8UC3, dst.Type(), $"呼び出し {call + 1} 回目: 型は CV_8UC3"); + var pixel = dst.At(0, 0); + Assert.AreEqual(50, pixel.Item0, $"呼び出し {call + 1} 回目: B = 50"); + Assert.AreEqual(100, pixel.Item1, $"呼び出し {call + 1} 回目: G = 100"); + Assert.AreEqual(150, pixel.Item2, $"呼び出し {call + 1} 回目: R = 150"); + } + } + } + } + + /// + /// ConvertImage: src.ConvertTo(src, CV_64FC3) の in-place 書き換えの既知挙動を文書化するテスト + /// 優先度4 のスコープ外バグ(今回未修正)。同一 src インスタンスを使い回すと + /// 1 回目の呼び出し後に src が CV_64FC3 に変化していることを確認する。 + /// このテストは「現在の挙動」を記録するもので、修正後は変更が必要になる。 + /// + [Test] + public void ConvertImage_SrcIsModifiedInPlace_KnownBehaviorPriority4() { + // Arrange: CV_8UC3 の src + using (var src = new Mat(1, 1, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var conv = CreateIdentityLikeConvMat()) { + var corrector = MakeCorrectorWith4Channels(); + + Assert.AreEqual(MatType.CV_8UC3, src.Type(), "呼び出し前は CV_8UC3"); + + // Act + using (var dst = corrector.ConvertImage(src, conv)) { + // Assert: 1 回目の呼び出し後、src は CV_64FC3 に変化している(in-place 書き換えの既知挙動) + Assert.AreEqual(MatType.CV_64FC3, src.Type(), + "ConvertImage 呼び出し後、src は in-place で CV_64FC3 に変換される(優先度4 の既知挙動)"); + } + } + } + + // --------------------------------------------------------------- + // CalcTcc の資源解放テスト(v1.7 の Mat リーク修正を内包することの確認) + // --------------------------------------------------------------- + + /// + /// CalcTcc: 中間 Mat(辞書に保持しないもの)は呼び出し完了時に解放され, + /// 入力 tccRgb(呼び出し側所有)は解放されず,再校正時に旧変換行列が破棄されること. + /// v1.7 が塞いだ校正経路の Mat リークを本実装が内包していることを保証する. + /// + [Test] + public void CalcTcc_再校正_中間Matと旧変換行列を解放し入力は保持する() { + LoadCalcTccConfig(); + + using (var tccSrgb = CreateScaledColorChart(rows: 24, scale: 1.0)) + using (var tccXyz = CreateScaledColorChart(rows: 24, scale: 0.8)) + using (var tccRgb = CreateLinearColorChart(rows: 24)) { + // channel=4(通常経路)と 17(convOld 特殊経路)の両方を通す + var corrector = new ColorCorrector(tccSrgb, tccXyz, new int[] { 4, 17 }); + + // 1回目の校正:コールバックに渡る Mat を全て捕捉する + var firstSaved = new List>(); + corrector.CalcTcc(tccRgb, "dummy", + (path, mat) => firstSaved.Add(new KeyValuePair(path, mat))); + + // 中間 Mat(ConvRgb2Xyz / ConvRgb2XyzOld / TccSrgb / ConvSrgb2Xyz)は解放済み + foreach (var kv in firstSaved) { + var name = Path.GetFileName(kv.Key); + if (name.Contains("convrgb2xyz") || name.Contains("tccsrgb") || name.Contains("convsrgb2xyz")) { + Assert.IsTrue(kv.Value.IsDisposed, $"中間 Mat は解放済みのはず: {name}"); + } + } + + // 入力 tccRgb は ColorCorrector に破棄されない(所有権は呼び出し側) + var tccRgbSaved = firstSaved.First(kv => Path.GetFileName(kv.Key).Contains("tccrgb")).Value; + Assert.IsFalse(tccRgbSaved.IsDisposed, "入力 tccRgb は破棄されない(所有権は呼び出し側)"); + Assert.IsFalse(tccRgb.IsDisposed, "入力 tccRgb 本体も生存している"); + + // 保持される変換行列(ConvRgb2Srgb, ch4)は 1 回目校正後に生存 + var keptCh4 = firstSaved.First(kv => { + var n = Path.GetFileName(kv.Key); + return n.Contains("convrgb2srgb") && n.Contains("04"); + }).Value; + Assert.IsFalse(keptCh4.IsDisposed, "保持中の変換行列は 1 回目校正後に生存している"); + + // 2回目の校正:旧エントリ(1回目の保持行列)が破棄される + corrector.CalcTcc(tccRgb, "dummy", (path, mat) => { }); + Assert.IsTrue(keptCh4.IsDisposed, "再校正で古い変換行列(旧エントリ)が破棄される"); + } + } + + /// + /// CalcTcc テスト用に,参照される File/* キーを持つ最小 Config を読み込む. + /// ファイル名は種類ごとに識別可能な文字列にし,コールバックの path で判別する. + /// + private static void LoadCalcTccConfig() { + const string xml = + "" + + "" + + " tccrgb.csv" + + " convrgb2srgb_{CN}.csv" + + " convrgb2xyz_{CN}.csv" + + " convrgb2xyzold_{CN}.csv" + + " tccsrgb_{CN}.csv" + + " convsrgb2xyz_{CN}.csv" + + ""; + + var path = Path.GetTempFileName() + ".xml"; + File.WriteAllText(path, xml, System.Text.Encoding.UTF8); + try { + Config.Load(path); + } finally { + if (File.Exists(path)) File.Delete(path); + } + } + } +} diff --git a/TIASshot.Tests/ConfigTests.cs b/TIASshot.Tests/ConfigTests.cs new file mode 100644 index 0000000..538f91c --- /dev/null +++ b/TIASshot.Tests/ConfigTests.cs @@ -0,0 +1,107 @@ +using System; +using System.IO; +using NUnit.Framework; + +namespace TIASshot.Tests { + /// + /// Config のテスト(XML パース・型変換・存在しないキーの例外) + /// + [TestFixture] + public class ConfigTests { + + private string _tempConfigPath; + + // テスト用 XML の期待値定数 + private const float ExpectedFloat = 1.5f; + private const int ExpectedInt = 42; + private const string ExpectedString = "hello"; + private const string ExpectedNested = "deep"; + + private const string TestConfigXml = + "" + + "" + + " 1.5" + + " 42" + + " hello" + + " deep" + + ""; + + [SetUp] + public void SetUp() { + _tempConfigPath = Path.GetTempFileName(); + // 拡張子を .xml に変更(XmlDocument.Load は拡張子を問わないが明示するために rename) + var xmlPath = _tempConfigPath + ".xml"; + File.Move(_tempConfigPath, xmlPath); + _tempConfigPath = xmlPath; + + File.WriteAllText(_tempConfigPath, TestConfigXml, System.Text.Encoding.UTF8); + + Config.Load(_tempConfigPath); + } + + [TearDown] + public void TearDown() { + if (File.Exists(_tempConfigPath)) File.Delete(_tempConfigPath); + } + + /// + /// GetFloat でフロート値が正しく取得できる + /// + [Test] + public void GetFloat_存在するキー_正しい値を返す() { + var value = Config.GetFloat("FloatVal"); + Assert.AreEqual(ExpectedFloat, value, 1e-6f); + } + + /// + /// GetInt で整数値が正しく取得できる + /// + [Test] + public void GetInt_存在するキー_正しい値を返す() { + var value = Config.GetInt("IntVal"); + Assert.AreEqual(ExpectedInt, value); + } + + /// + /// GetString で文字列値が正しく取得できる + /// + [Test] + public void GetString_存在するキー_正しい値を返す() { + var value = Config.GetString("StrVal"); + Assert.AreEqual(ExpectedString, value); + } + + /// + /// 存在しないキーを指定したとき ArgumentException がスローされる + /// + [Test] + public void GetFloat_存在しないキー_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetFloat("NoSuchKey")); + } + + /// + /// 存在しないキーを GetInt で指定したとき ArgumentException がスローされる + /// + [Test] + public void GetInt_存在しないキー_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetInt("NoSuchKey")); + } + + /// + /// 存在しないキーを GetString で指定したとき ArgumentException がスローされる + /// + [Test] + public void GetString_存在しないキー_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetString("NoSuchKey")); + } + + /// + /// ネストした要素(Nested/Child)を XPath スラッシュ区切りで取得できる + /// + [Test] + public void GetString_ネスト要素_正しい値を返す() { + var value = Config.GetString("Nested/Child"); + Assert.AreEqual(ExpectedNested, value); + } + } +} diff --git a/TIASshot.Tests/ContinuousShootMemoryBenchmark.cs b/TIASshot.Tests/ContinuousShootMemoryBenchmark.cs new file mode 100644 index 0000000..27273e5 --- /dev/null +++ b/TIASshot.Tests/ContinuousShootMemoryBenchmark.cs @@ -0,0 +1,369 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// 「連続撮影フロー」を合成フレームで再現するメモリ計測ベンチ(PLAN_02 優先度2/5 検証). + /// + /// 【重要】これは本番メソッド(CameraBase.Shot/RunShotLoop/SaveThread/SaveImages) + /// そのものの呼び出しではなく,カメラ取得部分(CaptureFrame)のみを合成フレームに + /// 差し替えた連続撮影フローの「構造再現」である.本番コード + /// (CameraBase / ColorCorrector / IScam 等)は一切改造していない. + /// ColorCorrector の internal メンバは読み取り利用のみ. + /// + /// 既存の単体ループベンチ(ConvertImageMemoryBenchmark)より本番に近く,以下を再現する: + /// - 生産者-消費者スレッディング(BlockingCollection + consumer Thread) + /// - 1 フレームを複数チャンネルで変換(SaveImages の foreach channel 相当) + /// - フレームバッファ(shots に積まれた img は Dispose されない=優先度5 未修正) + /// + /// 修正前(リーク版・優先度2 未修正)と修正後(using 版)を同条件で実行し, + /// プロセスのメモリ使用量(PrivateMemorySize64 / WorkingSet64)の挙動を比較する. + /// + /// 計測作法は ConvertImageMemoryBenchmark を踏襲: + /// - Process.PrivateMemorySize64 / WorkingSet64 をサンプリング + /// - 計測中に GC を呼ばない(未 Dispose の Mat ネイティブメモリ積み上がりを観測する機序) + /// - baseline 前に ReclaimNative()(GC.Collect → WaitForPendingFinalizers → GC.Collect) + /// - 物理メモリ枯渇を防ぐ打ち切り上限ガード(ceiling 超過で producer を停止) + /// + /// 通常テスト実行では走らない([Explicit] + Category("Benchmark")). + /// + /// 環境変数でスケール調整可: + /// CSB_WIDTH 画像幅 (既定 2440) + /// CSB_HEIGHT 画像高 (既定 1840) + /// CSB_CHANNELS 変換チャネル一覧 (既定 "4,10,17") + /// CSB_FRAMES 撮影枚数 (既定 8) + /// CSB_INTERVAL_MS 撮影間隔(ms) (既定 0) + /// CSB_CEILING_GB 打ち切り上限GB (既定 10) + /// CSB_WRITE_FILES ファイル書き出し (既定 false) + /// + [TestFixture] + [Explicit("メモリ計測ベンチ.連続撮影フローを合成フレームで構造再現するため明示実行のみ.")] + [Category("Benchmark")] + public class ContinuousShootMemoryBenchmark { + + // ---- 環境変数ヘルパー(EnvInt / EnvDouble は MemBenchSupport を利用) ---- + + static bool EnvBool(string name, bool fallback) { + var v = Environment.GetEnvironmentVariable(name); + if (string.IsNullOrWhiteSpace(v)) return fallback; + if (bool.TryParse(v, out var b)) return b; + return v.Trim() == "1"; + } + + static int[] EnvIntArray(string name, int[] fallback) { + var v = Environment.GetEnvironmentVariable(name); + if (string.IsNullOrWhiteSpace(v)) return fallback; + var list = new List(); + foreach (var part in v.Split(',')) { + if (int.TryParse(part.Trim(), out var n)) list.Add(n); + } + return list.Count > 0 ? list.ToArray() : fallback; + } + + // ---- 合成フレーム ----------------------------------------------------- + + /// + /// 合成フレーム(カメラ CaptureFrame の代替).本番の CV_8UC3 ROI フレーム相当. + /// + static Mat MakeSyntheticFrame(int width, int height) { + var m = new Mat(height, width, MatType.CV_8UC3); + Cv2.Randu(m, new Scalar(0), new Scalar(255)); + return m; + } + + // ---- 結果保持 --------------------------------------------------------- + + class VariantResult { + public long BasePriv, BaseWs, PeakPriv, PeakWs; + public int FramesProcessed; + public bool Aborted; + } + + sealed class MemSample { + public double ElapsedSec; + public long Priv; + public long Ws; + public string Variant; + } + + [Test] + public void Compare_LeakyVsFixed_ContinuousShoot() { + int width = MemBenchSupport.EnvInt("CSB_WIDTH", 2440); + int height = MemBenchSupport.EnvInt("CSB_HEIGHT", 1840); + int[] channels = EnvIntArray("CSB_CHANNELS", new int[] { 4, 10, 17 }); + int frames = MemBenchSupport.EnvInt("CSB_FRAMES", 8); + int interval = MemBenchSupport.EnvInt("CSB_INTERVAL_MS", 0); + long ceiling = (long)(MemBenchSupport.EnvDouble("CSB_CEILING_GB", 10.0) * 1024 * 1024 * 1024); + bool writeFiles = EnvBool("CSB_WRITE_FILES", false); + + // ColorCorrector(テスト用コンストラクタ: チャネル配列を直接渡す). + // 本番コードは無改造,internal を読み取り利用するのみ. + var corrector = new ColorCorrector(null, null, channels); + + // 各チャネルの変換行列(channel x 3)を事前生成.値は任意(メモリ挙動に影響しない). + var convMats = new Dictionary(); + foreach (var ch in channels) { + convMats[ch] = new Mat(ch, 3, MatType.CV_64FC1, new Scalar(0.01)); + } + + // 時系列サンプルを全バリアント分まとめて CSV 出力する. + var allSamples = new ConcurrentQueue(); + + try { + TestContext.WriteLine("=== 連続撮影フロー メモリ計測ベンチ(合成フレーム・構造再現) ==="); + TestContext.WriteLine("※ 本ベンチはカメラ取得部分のみ合成フレームに差し替えた連続撮影フローの"); + TestContext.WriteLine("  構造再現であり,本番メソッド(Shot/RunShotLoop/SaveThread)そのものの呼び出しではない."); + TestContext.WriteLine(""); + TestContext.WriteLine($"条件: {width}x{height} CV_8UC3 / channels=[{string.Join(",", channels)}] / " + + $"frames={frames} / interval={interval}ms / write_files={writeFiles}"); + TestContext.WriteLine($"打ち切り上限: {MemBenchSupport.GB(ceiling):F1} GB (PrivateMemory)"); + TestContext.WriteLine(""); + + // --- 修正後(using 版)を先にクリーンな状態で計測 --- + var fixedResult = RunVariant( + "修正後(using 版)", + leaky: false, + corrector, convMats, channels, + width, height, frames, interval, ceiling, writeFiles, allSamples); + + MemBenchSupport.ReclaimNative(); + + // --- 修正前(リーク版)を計測 --- + var leakyResult = RunVariant( + "修正前(リーク版)", + leaky: true, + corrector, convMats, channels, + width, height, frames, interval, ceiling, writeFiles, allSamples); + + // 放置したネイティブメモリを後始末(後続テストへの影響を防ぐ) + MemBenchSupport.ReclaimNative(); + + // --- 比較サマリ(既存ベンチと同体裁) --- + TestContext.WriteLine(""); + TestContext.WriteLine("================ 比較サマリ ================"); + MemBenchSupport.PrintRow("項目", "修正前(リーク版)", "修正後(using 版)"); + MemBenchSupport.PrintRow("完了/打ち切り", + leakyResult.Aborted ? $"打ち切り({leakyResult.FramesProcessed}f)" : $"完走({leakyResult.FramesProcessed}f)", + fixedResult.Aborted ? $"打ち切り({fixedResult.FramesProcessed}f)" : $"完走({fixedResult.FramesProcessed}f)"); + MemBenchSupport.PrintRow("Private baseline", + $"{MemBenchSupport.GB(leakyResult.BasePriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.BasePriv):F2} GB"); + MemBenchSupport.PrintRow("Private peak", + $"{MemBenchSupport.GB(leakyResult.PeakPriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakPriv):F2} GB"); + MemBenchSupport.PrintRow("Private 増分(peak-base)", + $"{MemBenchSupport.GB(leakyResult.PeakPriv - leakyResult.BasePriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakPriv - fixedResult.BasePriv):F2} GB"); + MemBenchSupport.PrintRow("WorkingSet peak", + $"{MemBenchSupport.GB(leakyResult.PeakWs):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakWs):F2} GB"); + MemBenchSupport.PrintRow("1フレームあたり増分", + $"{(leakyResult.FramesProcessed > 0 ? MemBenchSupport.MB(leakyResult.PeakPriv - leakyResult.BasePriv) / leakyResult.FramesProcessed : 0):F0} MB", + $"{(fixedResult.FramesProcessed > 0 ? MemBenchSupport.MB(fixedResult.PeakPriv - fixedResult.BasePriv) / fixedResult.FramesProcessed : 0):F0} MB"); + TestContext.WriteLine("============================================"); + + var leakyGrowth = leakyResult.PeakPriv - leakyResult.BasePriv; + var fixedGrowth = fixedResult.PeakPriv - fixedResult.BasePriv; + TestContext.WriteLine(""); + TestContext.WriteLine( + $"判定: 修正後の増分({MemBenchSupport.GB(fixedGrowth):F2} GB) は 修正前の増分({MemBenchSupport.GB(leakyGrowth):F2} GB) の " + + $"{(leakyGrowth > 0 ? (double)fixedGrowth / leakyGrowth * 100 : 0):F1}% に抑制された."); + TestContext.WriteLine("(注: フレーム自体は両バリアントとも shots に保持され Dispose されない=優先度5 相当の未解放を共通に含む)"); + + // --- 時系列 CSV 出力 --- + var csvPath = WriteCsv(allSamples); + TestContext.WriteLine(""); + TestContext.WriteLine($"時系列 CSV: {csvPath}"); + + Assert.That(fixedGrowth, Is.LessThan(leakyGrowth), + "修正後の方がメモリ増分が小さいこと(修正が効いている)"); + } finally { + foreach (var m in convMats.Values) m.Dispose(); + } + } + + /// + /// 1 つのバリアント(修正前/修正後)について連続撮影フローを構造再現し,メモリ推移を計測する. + /// + /// フロー再現(本番 Shot 相当): + /// 1. ReclaimNative() → baseline 測定. + /// 2. BlockingCollection 生成. + /// 3. consumer スレッド起動(SaveThread 相当). + /// 4. producer(RunShotLoop 相当・本メソッドのメインスレッド)でフレーム投入. + /// 5. consumer を Join. + /// サンプラースレッドは別途並行して ~200ms ごとにメモリを記録し ceiling 監視する. + /// + VariantResult RunVariant( + string label, bool leaky, + ColorCorrector corrector, Dictionary convMats, int[] channels, + int width, int height, int frames, int interval, long ceiling, bool writeFiles, + ConcurrentQueue allSamples) { + + // 1. baseline + MemBenchSupport.ReclaimNative(); + var (basePriv, baseWs) = MemBenchSupport.Sample(); + var r = new VariantResult { + BasePriv = basePriv, BaseWs = baseWs, + PeakPriv = basePriv, PeakWs = baseWs + }; + + TestContext.WriteLine($"--- {label} ---"); + TestContext.WriteLine($"baseline: Private {MemBenchSupport.GB(basePriv):F2} GB / WS {MemBenchSupport.GB(baseWs):F2} GB"); + + // 共有状態(スレッド間で保護) + var peakLock = new object(); + long abortFlag = 0; // Interlocked: ceiling 超過で 1 + long framesProcessed = 0; // Interlocked: consumer が処理したフレーム数 + var pipelineDone = new ManualResetEventSlim(false); + + // 一時フォルダ(ファイル書き出し時のみ) + string tmpFolder = null; + if (writeFiles) { + tmpFolder = Path.Combine(Path.GetTempPath(), + "CSB_" + (leaky ? "leaky" : "fixed") + "_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + Directory.CreateDirectory(tmpFolder); + } + + // 6. サンプラースレッド(~200ms ごとに記録・peak 更新・ceiling 監視) + var swatch = System.Diagnostics.Stopwatch.StartNew(); + var sampler = new Thread(() => { + while (!pipelineDone.IsSet) { + var (priv, ws) = MemBenchSupport.Sample(); + lock (peakLock) { + if (priv > r.PeakPriv) r.PeakPriv = priv; + if (ws > r.PeakWs) r.PeakWs = ws; + } + allSamples.Enqueue(new MemSample { + ElapsedSec = swatch.Elapsed.TotalSeconds, + Priv = priv, Ws = ws, Variant = label + }); + if (priv >= ceiling) { + Interlocked.Exchange(ref abortFlag, 1); + } + pipelineDone.Wait(200); + } + }); + sampler.IsBackground = true; + sampler.Start(); + + // 2. BlockingCollection 生成 + var shots = new BlockingCollection(); + + // 3. consumer スレッド起動(SaveThread 相当) + var consumer = new Thread(() => { + int saveCount = 0; + foreach (var img in shots.GetConsumingEnumerable()) { + // SaveImages 相当: RGB を書き出し → 各 channel について変換・解放. + if (writeFiles) { + Cv2.ImWrite(Path.Combine(tmpFolder, $"rgb_{saveCount + 1:0000}.png"), img); + } + + // 本番 SaveImages は「同一 img を複数チャンネルで変換」する. + // ただし ConvertImage は src を in-place で CV_64FC3 に書き換える副作用があり + // (優先度4 の既知問題),同一 img を使い回すと2チャンネル目以降が壊れる. + // 計測目的上,各 channel 変換の直前に img のコピーを作りそれを変換に渡す. + // フレーム img 自体(shots に積まれたもの)は Dispose せず保持し続ける + // (優先度5 相当の未解放). + // - leaky 版: コピーは using せず放置(中間 Mat と共にリーク). + // - fixed 版: コピーは using で解放(修正後の挙動). + foreach (var ch in channels) { + var conv = convMats[ch]; + if (leaky) { + // 修正前: img のコピー(src)も中間 Mat も Dispose しない. + var src = img.Clone(); + var converted = MemBenchSupport.ConvertImageLeaky(corrector, src, conv); + if (writeFiles) { + Cv2.ImWrite(Path.Combine(tmpFolder, $"srgb_{ch:00}_{saveCount + 1:0000}.png"), converted); + } + // src / converted / 中間 Mat は放置(=リーク) + } else { + // 修正後: img のコピーと変換結果を using で解放. + using (var src = img.Clone()) + using (var converted = corrector.ConvertImage(src, conv)) { + if (writeFiles) { + Cv2.ImWrite(Path.Combine(tmpFolder, $"srgb_{ch:00}_{saveCount + 1:0000}.png"), converted); + } + } + } + } + + saveCount++; + Interlocked.Exchange(ref framesProcessed, saveCount); + // img は Dispose しない(本番同様・フレームバッファとして保持) + } + }); + consumer.Start(); + + // 4. producer(RunShotLoop 相当・メインスレッド) + try { + for (int i = 0; i < frames; i++) { + if (Interlocked.Read(ref abortFlag) != 0) { + TestContext.WriteLine($" ★ 上限 {MemBenchSupport.GB(ceiling):F1} GB に到達.frame {i} で投入を停止(リーク蓄積の限界)."); + r.Aborted = true; + break; // 以降 Add しない + } + shots.Add(MakeSyntheticFrame(width, height)); + if (interval > 0) Thread.Sleep(interval); + } + } finally { + shots.CompleteAdding(); + } + + // 5. consumer を Join + consumer.Join(); + + // pipeline 終了でサンプラー停止 + pipelineDone.Set(); + sampler.Join(); + + // 終了後の最終サンプル + var (finalPriv, finalWs) = MemBenchSupport.Sample(); + lock (peakLock) { + if (finalPriv > r.PeakPriv) r.PeakPriv = finalPriv; + if (finalWs > r.PeakWs) r.PeakWs = finalWs; + } + r.FramesProcessed = (int)Interlocked.Read(ref framesProcessed); + + TestContext.WriteLine($"結果: frames {r.FramesProcessed} / peak Private {MemBenchSupport.GB(r.PeakPriv):F2} GB / " + + $"peak WS {MemBenchSupport.GB(r.PeakWs):F2} GB / 増分 {MemBenchSupport.GB(r.PeakPriv - r.BasePriv):F2} GB" + + (r.Aborted ? " (打ち切り)" : "")); + TestContext.WriteLine(""); + + shots.Dispose(); + pipelineDone.Dispose(); + + // 一時フォルダ後始末 + if (tmpFolder != null) { + try { Directory.Delete(tmpFolder, true); } catch (IOException ex) { + TestContext.WriteLine($" (一時フォルダ削除に失敗: {ex.Message})"); + } + } + + return r; + } + + /// 時系列サンプルを CSV(UTF-8)に出力する. + static string WriteCsv(ConcurrentQueue samples) { + var dir = Path.Combine(TestContext.CurrentContext.WorkDirectory, "ContinuousShootBench_Results"); + Directory.CreateDirectory(dir); + var path = Path.Combine(dir, $"continuous_shoot_{DateTime.Now:yyyyMMdd_HHmmss}.csv"); + + var sb = new StringBuilder(); + sb.AppendLine("elapsed_sec,private_MB,ws_MB,variant"); + foreach (var s in samples) { + sb.AppendLine(string.Format(System.Globalization.CultureInfo.InvariantCulture, + "{0:F3},{1:F1},{2:F1},{3}", + s.ElapsedSec, MemBenchSupport.MB(s.Priv), MemBenchSupport.MB(s.Ws), s.Variant)); + } + File.WriteAllText(path, sb.ToString(), new UTF8Encoding(false)); + return path; + } + + } +} diff --git a/TIASshot.Tests/ConvertImageMemoryBenchmark.cs b/TIASshot.Tests/ConvertImageMemoryBenchmark.cs new file mode 100644 index 0000000..6a87d35 --- /dev/null +++ b/TIASshot.Tests/ConvertImageMemoryBenchmark.cs @@ -0,0 +1,157 @@ +using System; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// PLAN_02 優先度2(ConvertImage の中間 Mat 未 Dispose)修正の効果検証ベンチマーク. + /// + /// 修正前(リーク版)と修正後(using 版)の ConvertImage を同条件で繰り返し呼び出し, + /// プロセスのメモリ使用量(PrivateMemorySize64 / WorkingSet64)を比較する. + /// + /// 注意: + /// - OpenCvSharp の Mat はネイティブメモリを持つ.未 Dispose の Mat は GC+ファイナライザが + /// 走るまで解放されない.連続撮影の本番フローでは GC 前に確保が積み上がり OOM クラッシュする. + /// 本ベンチはループ中に GC を呼ばないことでこの機序を再現する. + /// - 通常のテスト実行では走らない([Explicit] + Category("Benchmark")). + /// 実行は vstest の TestCaseFilter で明示指定する(README 末尾の実行コマンド参照). + /// + /// 環境変数でスケール調整可: + /// BENCH_WIDTH 画像幅 (既定 2440) + /// BENCH_HEIGHT 画像高 (既定 1840) + /// BENCH_CHANNEL 拡張チャネル数 (既定 17) + /// BENCH_FRAMES 繰り返し回数 (既定 40) + /// BENCH_CEILING_GB 打ち切り上限GB (既定 10) ← リーク版がここに達したら「限界」として停止 + /// + /// 計測ユーティリティ(Sample / ReclaimNative / GB / PrintRow / EnvInt / EnvDouble)は + /// MemBenchSupport に集約. + /// + [TestFixture] + [Explicit("メモリ計測ベンチマーク.フルスケールで大量のメモリを確保するため明示実行のみ.")] + [Category("Benchmark")] + public class ConvertImageMemoryBenchmark { + + [Test] + public void Compare_LeakyVsFixed_MemoryUsage() { + int width = MemBenchSupport.EnvInt("BENCH_WIDTH", 2440); + int height = MemBenchSupport.EnvInt("BENCH_HEIGHT", 1840); + int channel = MemBenchSupport.EnvInt("BENCH_CHANNEL", 17); + int frames = MemBenchSupport.EnvInt("BENCH_FRAMES", 40); + long ceiling = (long)(MemBenchSupport.EnvDouble("BENCH_CEILING_GB", 10.0) * 1024 * 1024 * 1024); + + var corrector = new ColorCorrector(null, null, new int[] { channel }); + + // 変換行列(channel x 3).値は任意(メモリ挙動に影響しない). + using (var conv = new Mat(channel, 3, MatType.CV_64FC1, new Scalar(0.01))) { + + TestContext.WriteLine("=== ConvertImage メモリ計測ベンチマーク(PLAN_02 優先度2) ==="); + TestContext.WriteLine($"画像: {width}x{height} CV_8UC3 / チャネル: {channel} / 繰り返し: {frames} 回"); + TestContext.WriteLine($"打ち切り上限: {MemBenchSupport.GB(ceiling):F1} GB (PrivateMemory)"); + TestContext.WriteLine(""); + + // --- 修正後(using 版)を先にクリーンな状態で計測 --- + var fixedResult = RunVariant( + "修正後(using 版)", + (src) => corrector.ConvertImage(src, conv), + width, height, frames, ceiling); + + // リーク版の前にネイティブメモリを回収して baseline を揃える + MemBenchSupport.ReclaimNative(); + + // --- 修正前(リーク版)を計測 --- + var leakyResult = RunVariant( + "修正前(リーク版)", + (src) => MemBenchSupport.ConvertImageLeaky(corrector, src, conv), + width, height, frames, ceiling); + + // 放置したネイティブメモリを後始末(後続テストへの影響を防ぐ) + MemBenchSupport.ReclaimNative(); + + // --- 比較サマリ --- + TestContext.WriteLine(""); + TestContext.WriteLine("================ 比較サマリ ================"); + MemBenchSupport.PrintRow("項目", "修正前(リーク版)", "修正後(using 版)"); + MemBenchSupport.PrintRow("完了/打ち切り", + leakyResult.Aborted ? $"打ち切り(iter {leakyResult.Iterations})" : $"完走({leakyResult.Iterations})", + fixedResult.Aborted ? $"打ち切り(iter {fixedResult.Iterations})" : $"完走({fixedResult.Iterations})"); + MemBenchSupport.PrintRow("Private baseline", + $"{MemBenchSupport.GB(leakyResult.BasePriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.BasePriv):F2} GB"); + MemBenchSupport.PrintRow("Private peak", + $"{MemBenchSupport.GB(leakyResult.PeakPriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakPriv):F2} GB"); + MemBenchSupport.PrintRow("Private 増分(peak-base)", + $"{MemBenchSupport.GB(leakyResult.PeakPriv - leakyResult.BasePriv):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakPriv - fixedResult.BasePriv):F2} GB"); + MemBenchSupport.PrintRow("WorkingSet peak", + $"{MemBenchSupport.GB(leakyResult.PeakWs):F2} GB", + $"{MemBenchSupport.GB(fixedResult.PeakWs):F2} GB"); + MemBenchSupport.PrintRow("1回あたり平均増分", + $"{(leakyResult.Iterations > 0 ? MemBenchSupport.GB(leakyResult.PeakPriv - leakyResult.BasePriv) / leakyResult.Iterations * 1024 : 0):F0} MB", + $"{(fixedResult.Iterations > 0 ? MemBenchSupport.GB(fixedResult.PeakPriv - fixedResult.BasePriv) / fixedResult.Iterations * 1024 : 0):F0} MB"); + TestContext.WriteLine("============================================"); + + var leakyGrowth = leakyResult.PeakPriv - leakyResult.BasePriv; + var fixedGrowth = fixedResult.PeakPriv - fixedResult.BasePriv; + TestContext.WriteLine(""); + TestContext.WriteLine( + $"判定: 修正後の増分({MemBenchSupport.GB(fixedGrowth):F2} GB) は 修正前の増分({MemBenchSupport.GB(leakyGrowth):F2} GB) の " + + $"{(leakyGrowth > 0 ? (double)fixedGrowth / leakyGrowth * 100 : 0):F1}% に抑制された."); + + // この閾値判定はあくまで「修正が効いていること」の目安(緩め). + Assert.That(fixedGrowth, Is.LessThan(leakyGrowth), + "修正後の方がメモリ増分が小さいこと(修正が効いている)"); + } + } + + class VariantResult { + public long BasePriv, PeakPriv, FinalPriv, PeakWs; + public int Iterations; + public bool Aborted; + } + + /// + /// 1 つの ConvertImage バリアントを frames 回繰り返し,メモリ推移を計測する. + /// src は in-place 書き換え(CV_64FC3)副作用があるため毎回新規生成して using で破棄する. + /// 戻り値(convImg8)は呼び出し側相当で破棄する(中間 Mat のリークだけを切り出すため). + /// + VariantResult RunVariant(string label, Func convert, int width, int height, int frames, long ceiling) { + MemBenchSupport.ReclaimNative(); + var (basePriv, baseWs) = MemBenchSupport.Sample(); + var r = new VariantResult { BasePriv = basePriv, PeakPriv = basePriv, PeakWs = baseWs }; + + TestContext.WriteLine($"--- {label} ---"); + TestContext.WriteLine($"baseline: Private {MemBenchSupport.GB(basePriv):F2} GB / WS {MemBenchSupport.GB(baseWs):F2} GB"); + + int i = 0; + for (; i < frames; i++) { + using (var src = new Mat(height, width, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var dst = convert(src)) { + // dst は using で破棄(呼び出し側 SaveImages の using 相当) + } + + var (priv, ws) = MemBenchSupport.Sample(); + if (priv > r.PeakPriv) r.PeakPriv = priv; + if (ws > r.PeakWs) r.PeakWs = ws; + + if ((i + 1) % 5 == 0 || i == 0) { + TestContext.WriteLine($" iter {i + 1,3}: Private {MemBenchSupport.GB(priv):F2} GB / WS {MemBenchSupport.GB(ws):F2} GB"); + } + + if (priv >= ceiling) { + TestContext.WriteLine($" ★ 上限 {MemBenchSupport.GB(ceiling):F1} GB に到達.iter {i + 1} で打ち切り(リーク蓄積の限界)."); + r.Aborted = true; + i++; + break; + } + } + + var (finalPriv, _) = MemBenchSupport.Sample(); + r.FinalPriv = finalPriv; + r.Iterations = i; + TestContext.WriteLine($"結果: iter {i} / peak Private {MemBenchSupport.GB(r.PeakPriv):F2} GB / peak WS {MemBenchSupport.GB(r.PeakWs):F2} GB / 増分 {MemBenchSupport.GB(r.PeakPriv - r.BasePriv):F2} GB"); + TestContext.WriteLine(""); + return r; + } + } +} diff --git a/TIASshot.Tests/GainCalcTests.cs b/TIASshot.Tests/GainCalcTests.cs new file mode 100644 index 0000000..121ecaf --- /dev/null +++ b/TIASshot.Tests/GainCalcTests.cs @@ -0,0 +1,147 @@ +using NUnit.Framework; + +namespace TIASshot.Tests { + /// + /// GainCalc.CalcRatio のテスト + /// + [TestFixture] + public class GainCalcTests { + + // --------------------------------------------------------------- + // 通常ケース + // --------------------------------------------------------------- + + /// + /// CalcRatio_通常ケースupdateRate0_5_正しい比率を返す: + /// value=100, target=200, updateRate=0.5 → (200/100 - 1) * 0.5 + 1 = 1.5 + /// + [Test] + public void CalcRatio_通常ケースupdateRate0_5_正しい比率を返す() { + float result = GainCalc.CalcRatio(100.0f, 200.0f, 0.5f); + Assert.AreEqual(1.5f, result, 1e-6f); + } + + // --------------------------------------------------------------- + // updateRate が変わると比率が変わること + // --------------------------------------------------------------- + + /// + /// CalcRatio_updateRate1_0_係数1倍の比率を返す: + /// value=100, target=200, updateRate=1.0 → (200/100 - 1) * 1.0 + 1 = 2.0 + /// + [Test] + public void CalcRatio_updateRate1_0_係数1倍の比率を返す() { + float result = GainCalc.CalcRatio(100.0f, 200.0f, 1.0f); + Assert.AreEqual(2.0f, result, 1e-6f); + } + + /// + /// CalcRatio_updateRate0_1_updateRateが小さいほど変化量が小さい: + /// value=100, target=200, updateRate=0.1 → (200/100 - 1) * 0.1 + 1 = 1.1 + /// + [Test] + public void CalcRatio_updateRate0_1_updateRateが小さいほど変化量が小さい() { + float result = GainCalc.CalcRatio(100.0f, 200.0f, 0.1f); + Assert.AreEqual(1.1f, result, 1e-6f); + } + + // --------------------------------------------------------------- + // value == target のとき比率は 1.0 + // --------------------------------------------------------------- + + /// + /// CalcRatio_valueがtargetと等しい_updateRateによらず比率は1: + /// value == target のとき ratio = target/value = 1、(1 - 1) * anything + 1 = 1 + /// + [Test] + public void CalcRatio_valueがtargetと等しい_updateRate0_5_比率は1() { + float result = GainCalc.CalcRatio(150.0f, 150.0f, 0.5f); + Assert.AreEqual(1.0f, result, 1e-6f); + } + + /// + /// CalcRatio_valueがtargetと等しい_updateRateを変えても結果が同じ: + /// value == target のとき updateRate=0.5 と updateRate=1.0 の結果が一致する + /// (updateRate に依存しないことを比較で検証する) + /// + [Test] + public void CalcRatio_valueがtargetと等しい_updateRateを変えても結果が同じ() { + float result05 = GainCalc.CalcRatio(150.0f, 150.0f, 0.5f); + float result10 = GainCalc.CalcRatio(150.0f, 150.0f, 1.0f); + Assert.AreEqual(result05, result10, 1e-6f, "value==target のとき updateRate によらず結果が同じ"); + } + + // --------------------------------------------------------------- + // value == 255.0f の特別扱い + // --------------------------------------------------------------- + + /// + /// CalcRatio_value255_updateRate0_5_係数は常に1_0になる: + /// value=255 のとき updateRate を無視して係数 1.0 を使う + /// → (200/255 - 1) * 1.0 + 1 = 200/255 + /// + [Test] + public void CalcRatio_value255_updateRate0_5_係数は常に1_0になる() { + float expected = 200.0f / 255.0f; + float result = GainCalc.CalcRatio(255.0f, 200.0f, 0.5f); + Assert.AreEqual(expected, result, 1e-6f); + } + + /// + /// CalcRatio_value255_updateRateを変えても結果が同じ: + /// value=255 では updateRate=0.5 と updateRate=1.0 の結果が一致する + /// + [Test] + public void CalcRatio_value255_updateRateを変えても結果が同じ() { + float result05 = GainCalc.CalcRatio(255.0f, 200.0f, 0.5f); + float result10 = GainCalc.CalcRatio(255.0f, 200.0f, 1.0f); + Assert.AreEqual(result05, result10, 1e-6f, "value==255 のとき updateRate によらず結果が同じ"); + } + + // --------------------------------------------------------------- + // ゲイン減少方向(target < value) + // --------------------------------------------------------------- + + /// + /// CalcRatio_targetがvalueより小さい_比率が1未満になる: + /// value=200, target=100, updateRate=0.5 → (100/200 - 1) * 0.5 + 1 = 0.75 + /// ゲインが目標より高すぎる場合に比率が 1.0 未満(下降補正)になることを確認する + /// + [Test] + public void CalcRatio_targetがvalueより小さい_updateRate0_5_比率が1未満になる() { + float result = GainCalc.CalcRatio(200.0f, 100.0f, 0.5f); + Assert.AreEqual(0.75f, result, 1e-6f); + } + + // --------------------------------------------------------------- + // updateRate=0 のとき比率は常に 1.0 + // --------------------------------------------------------------- + + /// + /// CalcRatio_updateRate0_比率は常に1: + /// value != target でも updateRate=0 なら (ratio-1)*0+1 = 1.0 + /// 更新が停止する境界値として確認する + /// + [Test] + public void CalcRatio_updateRate0_比率は常に1() { + float result = GainCalc.CalcRatio(100.0f, 200.0f, 0.0f); + Assert.AreEqual(1.0f, result, 1e-6f); + } + + // --------------------------------------------------------------- + // ゼロ除算の挙動(現状記録) + // --------------------------------------------------------------- + + /// + /// CalcRatio_value0_戻り値はInfinityまたはNaN_例外は出ない: + /// float では 0 除算は例外にならず Infinity / NaN になる(現状挙動の固定) + /// + [Test] + public void CalcRatio_value0_戻り値はInfinityまたはNaN_例外は出ない() { + float result = GainCalc.CalcRatio(0.0f, 200.0f, 0.5f); + // float(0 除算) は例外を投げずに Infinity / NaN を返す + Assert.IsTrue(float.IsInfinity(result) || float.IsNaN(result), + "value=0 のとき戻り値は Infinity または NaN になる(例外は出ない)"); + } + } +} diff --git a/TIASshot.Tests/ImageStatsTests.cs b/TIASshot.Tests/ImageStatsTests.cs new file mode 100644 index 0000000..4d9b0cf --- /dev/null +++ b/TIASshot.Tests/ImageStatsTests.cs @@ -0,0 +1,572 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// ImageStats のテスト(ピュアロジック層) + /// + /// GUIDE_08: ハードウェア非依存の計算ロジックを NUnit で検証する。 + /// ShotWhiteBoard・TryDisableColorEnhancement・Form1 ボタンはハードウェア結合層につき対象外。 + /// + /// 飽和定義: 輝度(BGR2GRAY: 0.114*B + 0.587*G + 0.299*R)が 254 以上の画素を飽和とカウントする。 + /// TECH_02 Q8 では「チャンネル別 max」も記録対象とするが、飽和率の算出は輝度ベース(現実装の契約)。 + /// + [TestFixture] + public class ImageStatsTests { + + // --------------------------------------------------------------- + // ImageStats.Calc — ch別 mean / max + // --------------------------------------------------------------- + + /// + /// Calc_全画素同一値_chMeanとchMaxが正しく返る: + /// 全画素 B=100, G=100, R=100 → MeanB/G/R=100, MaxB/G/R=100 + /// + [Test] + public void Calc_全画素同一値_chMeanとchMaxが正しく返る() { + // Arrange: 2x2 の全画素が B=100, G=100, R=100 + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(100, 100, 100))) { + // Act + var stats = ImageStats.Calc(mat); + + // Assert: ch別 mean / max + Assert.AreEqual(100.0, stats.MeanB, 1e-3, "MeanB = 100"); + Assert.AreEqual(100.0, stats.MeanG, 1e-3, "MeanG = 100"); + Assert.AreEqual(100.0, stats.MeanR, 1e-3, "MeanR = 100"); + Assert.AreEqual(100.0, stats.MaxB, 1e-3, "MaxB = 100"); + Assert.AreEqual(100.0, stats.MaxG, 1e-3, "MaxG = 100"); + Assert.AreEqual(100.0, stats.MaxR, 1e-3, "MaxR = 100"); + } + } + + /// + /// Calc_ch別に異なる値_各chのMeanとMaxが分離される: + /// 全画素 B=50, G=120, R=200 → MeanB=50, MeanG=120, MeanR=200(ch間の混在なし) + /// + [Test] + public void Calc_ch別に異なる値_各chのMeanとMaxが分離される() { + // Arrange: 3x3 の全画素が B=50, G=120, R=200(BGR 順) + using (var mat = new Mat(3, 3, MatType.CV_8UC3, new Scalar(50, 120, 200))) { + // Act + var stats = ImageStats.Calc(mat); + + // Assert + Assert.AreEqual(50.0, stats.MeanB, 1e-3, "MeanB = 50"); + Assert.AreEqual(120.0, stats.MeanG, 1e-3, "MeanG = 120"); + Assert.AreEqual(200.0, stats.MeanR, 1e-3, "MeanR = 200"); + Assert.AreEqual(50.0, stats.MaxB, 1e-3, "MaxB = 50"); + Assert.AreEqual(120.0, stats.MaxG, 1e-3, "MaxG = 120"); + Assert.AreEqual(200.0, stats.MaxR, 1e-3, "MaxR = 200"); + } + } + + /// + /// Calc_2行の異なる画素_chMaxが最大値を返す: + /// 行0: B=10, G=20, R=30、行1: B=50, G=60, R=70 → MaxB=50, MaxG=60, MaxR=70 + /// MeanB=(10+50)/2=30(画素数=各行1画素の1x1ではなく2行1列の計2画素の平均) + /// + [Test] + public void Calc_2行異なる画素_chMaxが最大値を返す() { + // Arrange: 2行1列(2画素)、行ごとに値が異なる + using (var mat = new Mat(2, 1, MatType.CV_8UC3)) { + mat.At(0, 0) = new Vec3b(10, 20, 30); // B=10, G=20, R=30 + mat.At(1, 0) = new Vec3b(50, 60, 70); // B=50, G=60, R=70 + + // Act + var stats = ImageStats.Calc(mat); + + // Assert: MaxB=50, MaxG=60, MaxR=70(2画素の最大値) + Assert.AreEqual(50.0, stats.MaxB, 1e-3, "MaxB は 2 画素の最大値 50"); + Assert.AreEqual(60.0, stats.MaxG, 1e-3, "MaxG は 2 画素の最大値 60"); + Assert.AreEqual(70.0, stats.MaxR, 1e-3, "MaxR は 2 画素の最大値 70"); + + // Assert: MeanB=(10+50)/2=30, MeanG=(20+60)/2=40, MeanR=(30+70)/2=50 + Assert.AreEqual(30.0, stats.MeanB, 1e-3, "MeanB = (10+50)/2 = 30"); + Assert.AreEqual(40.0, stats.MeanG, 1e-3, "MeanG = (20+60)/2 = 40"); + Assert.AreEqual(50.0, stats.MeanR, 1e-3, "MeanR = (30+70)/2 = 50"); + } + } + + // --------------------------------------------------------------- + // ImageStats.Calc — 飽和率(輝度ベース・BGR2GRAY) + // --------------------------------------------------------------- + + /// + /// Calc_全画素同一値100_飽和率0: + /// 全画素 (B,G,R)=(100,100,100) → 輝度=100 → 飽和なし → SaturatedRatio=0.0 + /// + [Test] + public void Calc_全画素同一値100_飽和率0() { + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(100, 100, 100))) { + var stats = ImageStats.Calc(mat); + Assert.AreEqual(0.0, stats.SaturatedRatio, 1e-6, "全輝度 100 → 飽和率 0"); + } + } + + /// + /// Calc_全画素255_飽和率1_0: + /// 全画素 (B,G,R)=(255,255,255) → 輝度=255 → 全画素飽和 → SaturatedRatio=1.0 + /// + [Test] + public void Calc_全画素255_飽和率1_0() { + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(255, 255, 255))) { + var stats = ImageStats.Calc(mat); + Assert.AreEqual(1.0, stats.SaturatedRatio, 1e-6, "全画素 255 → 飽和率 1.0"); + } + } + + /// + /// Calc_全画素255_p99は255: + /// 全画素 255 → p99=255 であること + /// + [Test] + public void Calc_全画素255_p99は255() { + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(255, 255, 255))) { + var stats = ImageStats.Calc(mat); + Assert.AreEqual(255.0, stats.P99, 1e-3, "全画素 255 → p99 = 255"); + } + } + + /// + /// Calc_全画素同一値100_p99は100: + /// 全画素 (B,G,R)=(100,100,100) → 輝度=100 → p99=100 + /// + [Test] + public void Calc_全画素同一値100_p99は100() { + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(100, 100, 100))) { + var stats = ImageStats.Calc(mat); + Assert.AreEqual(100.0, stats.P99, 1e-3, "全輝度 100 → p99 = 100"); + } + } + + /// + /// Calc_飽和画素割合の境界_SaturatedRatioが正しい割合: + /// 4画素のうち1画素だけ輝度 >= 254(全ch=255)、残り3画素は輝度 100 + /// → SaturatedRatio = 1/4 = 0.25 + /// + /// 飽和の定義: 輝度(BGR2GRAY: 0.114*B + 0.587*G + 0.299*R)が ≥ 254 のとき飽和。 + /// ch別に255であっても輝度 < 254 なら非飽和(例: B=255, G=0, R=0 → 輝度 ≒ 29)。 + /// + [Test] + public void Calc_飽和画素1つ4画素中_SaturatedRatioが0_25() { + // Arrange: 2x2(4画素)、(0,0)のみ全ch=255(確実に輝度 >= 254)、残りは 100 + using (var mat = new Mat(2, 2, MatType.CV_8UC3, new Scalar(100, 100, 100))) { + mat.At(0, 0) = new Vec3b(255, 255, 255); // 輝度 = 255 >= 254 → 飽和 + + // Act + var stats = ImageStats.Calc(mat); + + // Assert: 4画素中1画素飽和 → 1/4 = 0.25 + Assert.AreEqual(0.25, stats.SaturatedRatio, 1e-6, "4画素中1画素飽和 → SaturatedRatio = 0.25"); + } + } + + /// + /// Calc_R=255のみ高輝度_輝度ベースで飽和判定されないこと: + /// B=0, G=0, R=255 → BGR2GRAY ≒ 0.299*255 ≒ 76.2 → 輝度 < 254 → 飽和なし + /// + /// これは「チャンネル別に255でも輝度ベースでは非飽和」という定義の明示的な固定。 + /// + [Test] + public void Calc_R255のみ_輝度ベースでは飽和しない() { + // Arrange: B=0, G=0, R=255(輝度 ≒ 76.2 → 254 未満) + using (var mat = new Mat(1, 1, MatType.CV_8UC3, new Scalar(0, 0, 255))) { + var stats = ImageStats.Calc(mat); + + // Assert: 輝度ベースでは飽和なし + Assert.AreEqual(0.0, stats.SaturatedRatio, 1e-6, + "R=255のみ → BGR2GRAY ≒ 76 < 254 → 輝度ベース飽和率 = 0"); + } + } + + /// + /// Calc_G=255のみ_輝度ベースで飽和しない: + /// B=0, G=255, R=0 → BGR2GRAY ≒ 0.587*255 ≒ 149.7 → 輝度 < 254 → 飽和なし + /// + [Test] + public void Calc_G255のみ_輝度ベースでは飽和しない() { + using (var mat = new Mat(1, 1, MatType.CV_8UC3, new Scalar(0, 255, 0))) { + var stats = ImageStats.Calc(mat); + Assert.AreEqual(0.0, stats.SaturatedRatio, 1e-6, + "G=255のみ → BGR2GRAY ≒ 150 < 254 → 飽和率 = 0"); + } + } + + // --------------------------------------------------------------- + // ImageStats.CalcPercentile — 通常系 + // --------------------------------------------------------------- + + /// + /// CalcPercentile_全画素同一値150_p50は150: + /// 全画素 = 150 → p50 = 150 + /// + [Test] + public void CalcPercentile_全画素同一値150_p50は150() { + using (var gray = new Mat(4, 4, MatType.CV_8U, new Scalar(150))) { + double p50 = ImageStats.CalcPercentile(gray, 50.0); + Assert.AreEqual(150.0, p50, 1e-3, "全画素 150 → p50 = 150"); + } + } + + /// + /// CalcPercentile_全画素同一値200_p99は200: + /// 全画素 = 200 → p99 = 200 + /// + [Test] + public void CalcPercentile_全画素同一値200_p99は200() { + using (var gray = new Mat(4, 4, MatType.CV_8U, new Scalar(200))) { + double p99 = ImageStats.CalcPercentile(gray, 99.0); + Assert.AreEqual(200.0, p99, 1e-3, "全画素 200 → p99 = 200"); + } + } + + /// + /// CalcPercentile_全画素同一値100_p100は100: + /// 全画素 = 100 → p100 = 100 + /// + [Test] + public void CalcPercentile_全画素同一値100_p100は100() { + using (var gray = new Mat(4, 4, MatType.CV_8U, new Scalar(100))) { + double p100 = ImageStats.CalcPercentile(gray, 100.0); + Assert.AreEqual(100.0, p100, 1e-3, "全画素 100 → p100 = 100"); + } + } + + /// + /// CalcPercentile_2種の輝度値_p50境界: + /// 2画素: 値=100 と 値=200 → p50 は threshold=2*0.5=1.0 + /// bin[100]=1.0 で cumulative=1.0 >= 1.0 → p50=100 + /// + [Test] + public void CalcPercentile_2画素100と200_p50は100() { + // Arrange: 1行2列(2画素) + using (var gray = new Mat(1, 2, MatType.CV_8U)) { + gray.At(0, 0) = 100; + gray.At(0, 1) = 200; + + // Act + double p50 = ImageStats.CalcPercentile(gray, 50.0); + + // Assert: threshold = 2 * 0.5 = 1.0。bin[100]=1.0 → cumulative=1.0 >= 1.0 → 100 + Assert.AreEqual(100.0, p50, 1e-3, "p50: bin[100]=1 → cumulative=1 >= threshold=1 → p50=100"); + } + } + + /// + /// CalcPercentile_2画素100と200_p99は200: + /// threshold = 2 * 0.99 = 1.98。bin[100]=1.0 → cumulative=1.0 < 1.98。 + /// bin[200]=1.0 → cumulative=2.0 >= 1.98 → p99=200 + /// + [Test] + public void CalcPercentile_2画素100と200_p99は200() { + using (var gray = new Mat(1, 2, MatType.CV_8U)) { + gray.At(0, 0) = 100; + gray.At(0, 1) = 200; + + double p99 = ImageStats.CalcPercentile(gray, 99.0); + Assert.AreEqual(200.0, p99, 1e-3, "p99=200(上位1%に 200 が含まれるため)"); + } + } + + // --------------------------------------------------------------- + // ImageStats.CalcPercentile — 空 Mat + // --------------------------------------------------------------- + + /// + /// CalcPercentile_空Mat_0を返す: + /// 0行0列(画素数 = 0)→ total = 0 → 0.0 を返す + /// + [Test] + public void CalcPercentile_空Mat_0を返す() { + // Arrange: 0行0列の CV_8U + using (var gray = new Mat(0, 0, MatType.CV_8U)) { + double result = ImageStats.CalcPercentile(gray, 99.0); + Assert.AreEqual(0.0, result, 1e-6, "空 Mat → 0.0 を返す"); + } + } + + // --------------------------------------------------------------- + // ImageStats.BuildJson — 構造・キー・値の検証 + // --------------------------------------------------------------- + + /// + /// BuildJson_metaのみstatsなし_有効なJSONが生成される: + /// meta に string / int / bool / double を混在させ、JSON として parse できること + /// + [Test] + public void BuildJson_metaのみ_有効なJSON文字列が生成される() { + // Arrange + var meta = new Dictionary { + { "capture_datetime", "2026-06-07 12:00:00" }, + { "num_images", 5 }, + { "color_enhancement_off", true }, + { "exposure_us", 12345.6 }, + }; + + // Act + string json = ImageStats.BuildJson(meta, null); + + // Assert: null / 空でない + Assert.IsNotNull(json, "json が null であってはならない"); + Assert.IsNotEmpty(json, "json が空文字列であってはならない"); + + // Assert: '{' / '}' で囲まれている(最低限の JSON 外枠) + Assert.IsTrue(json.TrimStart().StartsWith("{"), "JSON は '{' で始まる"); + Assert.IsTrue(json.TrimEnd().EndsWith("}"), "JSON は '}' で終わる"); + } + + /// + /// BuildJson_metaの各型_キーと値が正しくシリアライズされる: + /// bool → true/false、int → 数値、double → G6/InvariantCulture 書式、string → クォート + /// + [Test] + public void BuildJson_bool値_truefalseがシリアライズされる() { + var meta = new Dictionary { + { "flag_on", true }, + { "flag_off", false }, + }; + + string json = ImageStats.BuildJson(meta, null); + + // bool は JSON の true / false リテラルになること + StringAssert.Contains("\"flag_on\": true", json, "true が literal true になること"); + StringAssert.Contains("\"flag_off\": false", json, "false が literal false になること"); + } + + /// + /// BuildJson_int値_数値リテラルがシリアライズされる + /// + [Test] + public void BuildJson_int値_数値リテラルがシリアライズされる() { + var meta = new Dictionary { + { "num_images", 10 }, + }; + + string json = ImageStats.BuildJson(meta, null); + + // int は引用符なしの数値リテラル + StringAssert.Contains("\"num_images\": 10", json, "int は数値リテラルになること"); + } + + /// + /// BuildJson_double値_G6InvariantCultureで書式化される: + /// 1.23456789 → G6 書式(6桁有効数字)= "1.23457"(InvariantCulture: 小数点は '.') + /// + [Test] + public void BuildJson_double値_G6InvariantCultureで書式化される() { + var meta = new Dictionary { + { "val", 1.23456789 }, + }; + + string json = ImageStats.BuildJson(meta, null); + + // G6 + InvariantCulture: 1.23456789 → "1.23457"(四捨五入6桁) + StringAssert.Contains("\"val\": 1.23457", json, "double は G6 InvariantCulture で書式化される"); + // ロケール依存のカンマ区切り(例: "1,23457")が混入していないこと + Assert.IsFalse(json.Contains("1,23457"), "小数点はカンマではなくピリオドを使う(InvariantCulture)"); + } + + /// + /// BuildJson_string値_ダブルクォートでエスケープされる: + /// 値中の '"' は '\"' にエスケープされること + /// + [Test] + public void BuildJson_string値中のダブルクォート_エスケープされる() { + var meta = new Dictionary { + { "desc", "say \"hello\"" }, + }; + + string json = ImageStats.BuildJson(meta, null); + + // '"' が '\\"' にエスケープされた文字列として含まれること + StringAssert.Contains("say \\\"hello\\\"", json, "\" は \\\" にエスケープされること"); + } + + /// + /// BuildJson_string値中のバックスラッシュ_エスケープされる: + /// 値中の '\' は '\\' にエスケープされること + /// + [Test] + public void BuildJson_string値中のバックスラッシュ_エスケープされる() { + var meta = new Dictionary { + { "path", @"C:\TIAS_Data" }, + }; + + string json = ImageStats.BuildJson(meta, null); + + // '\' が '\\' にエスケープされた文字列として含まれること + StringAssert.Contains(@"C:\\TIAS_Data", json, @"\ は \\ にエスケープされること"); + } + + /// + /// BuildJson_statsリスト_frame_statsキーと各フレームのフィールドが生成される: + /// 1フレーム分の FrameStats を与えたとき、"frame_stats" 配列が生成され + /// "frame", "saturated_ratio", "p99_luminance", "mean_B/G/R", "max_B/G/R" が含まれること + /// + [Test] + public void BuildJson_1フレームのstats_frame_statsキーと全フィールドが生成される() { + // Arrange + var meta = new Dictionary { { "device", "DFK23UX249" } }; + var stats = new List { + new FrameStats { + SaturatedRatio = 0.0, + P99 = 181.0, + MeanB = 120.5, + MeanG = 130.0, + MeanR = 140.0, + MaxB = 200.0, + MaxG = 210.0, + MaxR = 220.0, + } + }; + + // Act + string json = ImageStats.BuildJson(meta, stats); + + // Assert: "frame_stats" 配列が存在する + StringAssert.Contains("\"frame_stats\"", json, "frame_stats キーが存在すること"); + + // Assert: フレーム番号・各フィールドが含まれる + StringAssert.Contains("\"frame\": 1", json, "frame 番号 1 が含まれること"); + StringAssert.Contains("\"saturated_ratio\"", json, "saturated_ratio キーが含まれること"); + StringAssert.Contains("\"p99_luminance\"", json, "p99_luminance キーが含まれること"); + StringAssert.Contains("\"mean_B\"", json, "mean_B キーが含まれること"); + StringAssert.Contains("\"mean_G\"", json, "mean_G キーが含まれること"); + StringAssert.Contains("\"mean_R\"", json, "mean_R キーが含まれること"); + StringAssert.Contains("\"max_B\"", json, "max_B キーが含まれること"); + StringAssert.Contains("\"max_G\"", json, "max_G キーが含まれること"); + StringAssert.Contains("\"max_R\"", json, "max_R キーが含まれること"); + } + + /// + /// BuildJson_2フレームのstats_frame番号が1から始まり連番になる + /// + [Test] + public void BuildJson_2フレームのstats_frame番号が1から連番() { + var meta = new Dictionary { { "n", 2 } }; + var stats = new List { + new FrameStats { SaturatedRatio = 0.0, P99 = 100.0 }, + new FrameStats { SaturatedRatio = 0.0, P99 = 110.0 }, + }; + + string json = ImageStats.BuildJson(meta, stats); + + StringAssert.Contains("\"frame\": 1", json, "1枚目のフレーム番号は 1"); + StringAssert.Contains("\"frame\": 2", json, "2枚目のフレーム番号は 2"); + } + + /// + /// BuildJson_statsがnull_frame_statsキーが生成されない + /// + [Test] + public void BuildJson_statsがnull_frame_statsキーが生成されない() { + var meta = new Dictionary { { "key", "value" } }; + + string json = ImageStats.BuildJson(meta, null); + + Assert.IsFalse(json.Contains("frame_stats"), + "stats が null のとき frame_stats キーは生成されない"); + } + + /// + /// BuildJson_statsが空リスト_frame_statsキーが生成されない + /// + [Test] + public void BuildJson_statsが空リスト_frame_statsキーが生成されない() { + var meta = new Dictionary { { "key", "value" } }; + + string json = ImageStats.BuildJson(meta, new List()); + + Assert.IsFalse(json.Contains("frame_stats"), + "stats が空リストのとき frame_stats キーは生成されない"); + } + + /// + /// BuildJson_SaturatedRatioが0_saturated_ratioが0にシリアライズされる: + /// SaturatedRatio = 0.0 → "saturated_ratio": 0 + /// + [Test] + public void BuildJson_SaturatedRatioが0_JSON内で0が出力される() { + var meta = new Dictionary(); + var stats = new List { + new FrameStats { SaturatedRatio = 0.0, P99 = 181.0 } + }; + + string json = ImageStats.BuildJson(meta, stats); + + // G6 で 0.0 → "0" + StringAssert.Contains("\"saturated_ratio\": 0", json, + "飽和率 0 は JSON に 0 としてシリアライズされること"); + } + + // --------------------------------------------------------------- + // 異常系 — Calc の引数検証 + // --------------------------------------------------------------- + + /// + /// Calc_nullを渡す_ArgumentNullExceptionをスローする + /// + [Test] + public void Calc_null_ArgumentNullExceptionをスローする() { + Assert.Throws( + () => ImageStats.Calc(null), + "null Mat → ArgumentNullException"); + } + + /// + /// Calc_CV_8UC1のMatを渡す_ArgumentExceptionをスローする: + /// CV_8UC3 以外の Mat は受け付けない + /// + [Test] + public void Calc_CV8UC1Mat_ArgumentExceptionをスローする() { + using (var gray = new Mat(2, 2, MatType.CV_8U, new Scalar(100))) { + Assert.Throws( + () => ImageStats.Calc(gray), + "CV_8UC1 → ArgumentException(CV_8UC3 以外は不可)"); + } + } + + /// + /// Calc_CV_64FC3のMatを渡す_ArgumentExceptionをスローする: + /// 64 bit 浮動小数点型のカラー Mat も拒否される + /// + [Test] + public void Calc_CV64FC3Mat_ArgumentExceptionをスローする() { + using (var mat = new Mat(2, 2, MatType.CV_64FC3)) { + Assert.Throws( + () => ImageStats.Calc(mat), + "CV_64FC3 → ArgumentException(CV_8UC3 以外は不可)"); + } + } + + // --------------------------------------------------------------- + // 異常系 — CalcPercentile の引数検証 + // --------------------------------------------------------------- + + /// + /// CalcPercentile_nullを渡す_ArgumentNullExceptionをスローする + /// + [Test] + public void CalcPercentile_null_ArgumentNullExceptionをスローする() { + Assert.Throws( + () => ImageStats.CalcPercentile(null, 99.0), + "null Mat → ArgumentNullException"); + } + + /// + /// CalcPercentile_CV_8UC3のMatを渡す_ArgumentExceptionをスローする: + /// CalcPercentile は CV_8U(グレースケール)専用 + /// + [Test] + public void CalcPercentile_CV8UC3Mat_ArgumentExceptionをスローする() { + using (var bgr = new Mat(2, 2, MatType.CV_8UC3, new Scalar(100, 100, 100))) { + Assert.Throws( + () => ImageStats.CalcPercentile(bgr, 99.0), + "CV_8UC3 → ArgumentException(CV_8U 以外は不可)"); + } + } + } +} diff --git a/TIASshot.Tests/IoUtilTests.cs b/TIASshot.Tests/IoUtilTests.cs new file mode 100644 index 0000000..5ff291e --- /dev/null +++ b/TIASshot.Tests/IoUtilTests.cs @@ -0,0 +1,102 @@ +using System.IO; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// IoUtil のテスト(CSV 読み書き往復でネイティブ DLL ロードも検証) + /// + [TestFixture] + public class IoUtilTests { + + private string _csvPath; + + [SetUp] + public void SetUp() { + _csvPath = Path.GetTempFileName(); + } + + [TearDown] + public void TearDown() { + if (File.Exists(_csvPath)) File.Delete(_csvPath); + } + + /// + /// 2x3 の CV_64FC1 Mat を CSV に保存して再読込したとき、各要素が ±1e-6 以内で一致する + /// + [Test] + public void SaveAndLoad_2x3Mat_ValuesMatch() { + // Arrange + using (var src = CreateMat2x3()) { + // Act + IoUtil.SaveMatToCsv(_csvPath, src); + using (var loaded = IoUtil.LoadMatFromCsv(_csvPath)) { + // Assert + Assert.IsNotNull(loaded, "ロード結果が null であってはならない"); + Assert.AreEqual(src.Rows, loaded.Rows, "行数が一致すること"); + Assert.AreEqual(src.Cols, loaded.Cols, "列数が一致すること"); + + for (int row = 0; row < src.Rows; row++) { + for (int col = 0; col < src.Cols; col++) { + Assert.AreEqual( + src.At(row, col), + loaded.At(row, col), + 1e-6, + $"[{row},{col}] の値が ±1e-6 以内で一致すること"); + } + } + } + } + } + + /// + /// 1x1 の Mat(スカラー)を CSV に保存して再読込しても値が保たれる + /// + [Test] + public void SaveAndLoad_1x1Mat_ValuePreserved() { + // Arrange + const double Pi = 3.14159265358979; + using (var src = new Mat(1, 1, MatType.CV_64FC1)) { + src.At(0, 0) = Pi; + + // Act + IoUtil.SaveMatToCsv(_csvPath, src); + using (var loaded = IoUtil.LoadMatFromCsv(_csvPath)) { + // Assert + Assert.IsNotNull(loaded); + Assert.AreEqual(Pi, loaded.At(0, 0), 1e-6); + } + } + } + + /// + /// 存在しないファイルをロードしたとき null を返す + /// + [Test] + public void LoadMatFromCsv_NonExistentFile_ReturnsNull() { + // Act + var result = IoUtil.LoadMatFromCsv("does_not_exist_xyz.csv"); + + // Assert + Assert.IsNull(result, "存在しないファイルのロードは null を返すこと"); + } + + // --------------------------------------------------------------- + // ヘルパー + // --------------------------------------------------------------- + + /// + /// 代表的な 2x3 CV_64FC1 Mat を生成する + /// + private static Mat CreateMat2x3() { + var m = new Mat(2, 3, MatType.CV_64FC1); + m.At(0, 0) = 1.234567; + m.At(0, 1) = -2.345678; + m.At(0, 2) = 0.000001; + m.At(1, 0) = 100.0; + m.At(1, 1) = -0.5; + m.At(1, 2) = 999.999999; + return m; + } + } +} diff --git a/TIASshot.Tests/MemBenchSupport.cs b/TIASshot.Tests/MemBenchSupport.cs new file mode 100644 index 0000000..651ef21 --- /dev/null +++ b/TIASshot.Tests/MemBenchSupport.cs @@ -0,0 +1,80 @@ +using System; +using System.Diagnostics; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// メモリ計測ベンチ(ConvertImageMemoryBenchmark / ContinuousShootMemoryBenchmark)が + /// 共有する補助ロジック. + /// + /// - リーク版 ConvertImage の再現(ConvertImageLeaky) + /// - 計測ユーティリティ(Sample / ReclaimNative / GB / MB / PrintRow) + /// - 環境変数パースヘルパー(EnvInt / EnvDouble) + /// + /// 本番の ColorCorrector.ConvertImage(Mat,Mat) は通常ビルドでは修正後(中間 Mat を + /// using 解放)であり,リーク挙動はこのクラスでのみ再現する. + /// + internal static class MemBenchSupport { + + // ---- リーク版 ConvertImage ----------------------------------------------- + + /// + /// 修正前(リーク版)の ConvertImage を忠実に再現したもの. + /// 中間 Mat(flatten / extended / converted / convertedImage)を Dispose しない. + /// (git 0003cc2^ の ColorCorrector.ConvertImage(Mat,Mat) と等価) + /// + /// 本番コードは無改造のため,リーク再現に必要な internal メソッド(ExtendMat)と + /// 行列積のみを ColorCorrector インスタンス経由で利用する. + /// + internal static Mat ConvertImageLeaky(ColorCorrector corrector, Mat src, Mat conv) { + if (src.Type() != MatType.CV_64FC3) { + src.ConvertTo(src, MatType.CV_64FC3); + } + var flatten = src.Reshape(3, src.Height * src.Width); + var extended = corrector.ExtendMat(flatten, conv.Rows); + var converted = (extended * conv).ToMat(); + var convertedImage = converted.Reshape(3, src.Height); + + var convImg8 = new Mat(); + convertedImage.ConvertTo(convImg8, MatType.CV_8UC3); + return convImg8; // flatten / extended / converted / convertedImage は放置(=リーク) + } + + // ---- 計測ユーティリティ ------------------------------------------------- + + /// 現在のプロセスのメモリ使用量をサンプリングする. + internal static (long priv, long ws) Sample() { + using (var p = Process.GetCurrentProcess()) { + p.Refresh(); + return (p.PrivateMemorySize64, p.WorkingSet64); + } + } + + /// 未参照 Mat のネイティブメモリを GC+ファイナライザで回収する. + internal static void ReclaimNative() { + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + } + + internal static double GB(long bytes) => bytes / (1024.0 * 1024.0 * 1024.0); + internal static double MB(long bytes) => bytes / (1024.0 * 1024.0); + + internal static void PrintRow(string a, string b, string c) { + TestContext.WriteLine($"{a,-24} | {b,-22} | {c,-22}"); + } + + // ---- 環境変数パースヘルパー --------------------------------------------- + + internal static int EnvInt(string name, int fallback) { + var v = Environment.GetEnvironmentVariable(name); + return int.TryParse(v, out var n) ? n : fallback; + } + + internal static double EnvDouble(string name, double fallback) { + var v = Environment.GetEnvironmentVariable(name); + return double.TryParse(v, out var n) ? n : fallback; + } + } +} diff --git a/TIASshot.Tests/MemBenchSupportTests.cs b/TIASshot.Tests/MemBenchSupportTests.cs new file mode 100644 index 0000000..ff12edc --- /dev/null +++ b/TIASshot.Tests/MemBenchSupportTests.cs @@ -0,0 +1,69 @@ +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// MemBenchSupport のテスト + /// + [TestFixture] + public class MemBenchSupportTests { + + // ---- ヘルパー -------------------------------------------------------- + + /// channels=4 の ColorCorrector を生成する + private static ColorCorrector MakeCorrectorWith4Channels() + => new ColorCorrector(null, null, new int[] { 4 }); + + // ---- ConvertImageLeaky テスト ---------------------------------------- + + /// + /// ConvertImageLeaky: 2x2 の CV_8UC3 入力と 4x3 の conv 行列を与えたとき + /// 出力が CV_8UC3 かつ入力と同じ高さ×幅になること。 + /// これは MemBenchSupport.ConvertImageLeaky が ColorCorrector.ConvertImage と + /// 同じ出力形式を持つことの不変量確認(ヘルパー抽出の正しさの担保)。 + /// + [Test] + public void ConvertImageLeaky_2x2Input_OutputIsCV8UC3WithSameSize() { + // Arrange: 2行2列 CV_8UC3(B=50, G=100, R=150) + using (var conv = new Mat(4, 3, MatType.CV_64FC1, new Scalar(0.01))) { + var corrector = MakeCorrectorWith4Channels(); + + // src は ConvertImageLeaky の in-place 書き換えで CV_64FC3 に変化するため、 + // using で囲みつつ返り値(convImg8)も Dispose する + using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var dst = MemBenchSupport.ConvertImageLeaky(corrector, src, conv)) { + // Assert: 型・サイズ + Assert.AreEqual(MatType.CV_8UC3, dst.Type(), "出力型は CV_8UC3"); + Assert.AreEqual(2, dst.Rows, "出力行数は入力と同じ(2)"); + Assert.AreEqual(2, dst.Cols, "出力列数は入力と同じ(2)"); + } + } + } + + /// + /// ConvertImageLeaky: conv が全ゼロのとき出力全ピクセルが 0 になること。 + /// ConvertImageLeaky の変換処理が conv 行列の値に依存して決まることの確認。 + /// (ColorCorrector.ConvertImage の同等テストと対称的な確認) + /// + [Test] + public void ConvertImageLeaky_ZeroConv_AllOutputPixelsAreZero() { + // Arrange: 2x2 CV_8UC3(B=50, G=100, R=150)、conv は全ゼロ + using (var conv = new Mat(4, 3, MatType.CV_64FC1, new Scalar(0.0))) { + var corrector = MakeCorrectorWith4Channels(); + + using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150))) + using (var dst = MemBenchSupport.ConvertImageLeaky(corrector, src, conv)) { + // Assert: 全ピクセルが 0 + for (int row = 0; row < dst.Rows; row++) { + for (int col = 0; col < dst.Cols; col++) { + var pixel = dst.At(row, col); + Assert.AreEqual(0, pixel.Item0, $"row={row}, col={col}: B は 0"); + Assert.AreEqual(0, pixel.Item1, $"row={row}, col={col}: G は 0"); + Assert.AreEqual(0, pixel.Item2, $"row={row}, col={col}: R は 0"); + } + } + } + } + } + } +} diff --git a/TIASshot.Tests/TIASshot.Tests.csproj b/TIASshot.Tests/TIASshot.Tests.csproj new file mode 100644 index 0000000..829bc8b --- /dev/null +++ b/TIASshot.Tests/TIASshot.Tests.csproj @@ -0,0 +1,80 @@ + + + + + + + Debug + x64 + {6EEFE514-C4D9-4F71-9A8A-06F9748361CE} + Library + TIASshot.Tests + TIASshot.Tests + v4.8 + x64 + 512 + + + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + + + + ..\packages\NUnit.3.14.0\lib\net45\nunit.framework.dll + + + ..\packages\OpenCvSharp4.4.10.0.20241108\lib\net48\OpenCvSharp.dll + + + + + + + + + + + {1D3B69FE-D6B4-42B9-BBCC-B8CB9CF3DE4F} + TIASshot + + + + + + + + + + + + + + + + + + + + + このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。 + + + + + diff --git a/TIASshot.Tests/packages.config b/TIASshot.Tests/packages.config new file mode 100644 index 0000000..4648879 --- /dev/null +++ b/TIASshot.Tests/packages.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/TIASshot.sln b/TIASshot.sln index f86d34a..eec39e8 100644 --- a/TIASshot.sln +++ b/TIASshot.sln @@ -5,6 +5,8 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TIASshot", "TIASshot\TIASshot.csproj", "{1D3B69FE-D6B4-42B9-BBCC-B8CB9CF3DE4F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TIASshot.Tests", "TIASshot.Tests\TIASshot.Tests.csproj", "{6EEFE514-C4D9-4F71-9A8A-06F9748361CE}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ソリューション項目", "ソリューション項目", "{9A2B82DD-A13E-4B50-80D7-4983C769C3FC}" ProjectSection(SolutionItems) = preProject README.md = README.md @@ -20,6 +22,10 @@ {1D3B69FE-D6B4-42B9-BBCC-B8CB9CF3DE4F}.Debug|x64.Build.0 = Debug|x64 {1D3B69FE-D6B4-42B9-BBCC-B8CB9CF3DE4F}.Release|x64.ActiveCfg = Release|x64 {1D3B69FE-D6B4-42B9-BBCC-B8CB9CF3DE4F}.Release|x64.Build.0 = Release|x64 + {6EEFE514-C4D9-4F71-9A8A-06F9748361CE}.Debug|x64.ActiveCfg = Debug|x64 + {6EEFE514-C4D9-4F71-9A8A-06F9748361CE}.Debug|x64.Build.0 = Debug|x64 + {6EEFE514-C4D9-4F71-9A8A-06F9748361CE}.Release|x64.ActiveCfg = Release|x64 + {6EEFE514-C4D9-4F71-9A8A-06F9748361CE}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TIASshot/CameraBase.cs b/TIASshot/CameraBase.cs deleted file mode 100644 index dfd58a2..0000000 --- a/TIASshot/CameraBase.cs +++ /dev/null @@ -1,576 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.Eventing.Reader; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Runtime.Remoting.Channels; -using System.Security.Cryptography; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using System.Windows.Controls; -using System.Windows.Forms; -using System.Media; -using OpenCvSharp; -using OpenCvSharp.Aruco; - -namespace TIASshot { - internal abstract class CameraBase { - // インターフェース - public abstract bool Connect(); - public abstract void Disconnect(); - protected abstract void Shot(int numImages=1, int interval=0); - - // プロパティ - public string DeviceName { get; protected set; } = "Unknown"; - public string SerialNumber { get; protected set; } - public string ErrorMsg { get; protected set; } - public bool IsCalibrating => _calibrating > 0; - - // 派生クラスで使用するメンバ - protected Form1 _form; - protected int _calibrating = 0; - protected bool _calibrated = false; - protected Bitmap[] _bmps = new Bitmap[2]; - protected int _bmpIndex = 0; - protected bool _isPreview = false; - protected List _chartMasks = new List(); - protected Dictionary _convRGB2SRGB = new Dictionary(); - protected string _saveFolder = ""; - protected List _shots = new List(); - protected Dictionary _ShotInfo = new Dictionary(); // 設定値保存用 - protected Rect _roi; - - // プライベートメンバ - readonly Dictionary ARDict = CvAruco.GetPredefinedDictionary(PredefinedDictionaryName.Dict4X4_50); - readonly Point2f[] PointsDst40 = new Point2f[] { - new Point2f(345, 130),new Point2f(465, 130),new Point2f(465, 250),new Point2f(345, 250), - }; - readonly Point2f[] PointsDst41 = new Point2f[]{ - new Point2f(345, 1200), new Point2f(465, 1200), new Point2f(465, 1320), new Point2f(345, 1320), - }; - readonly int[][] ExtendChannels = new int[][] - { - new int[] { 3, 3, 3 }, // 1 - new int[] { 0, 3, 3 }, // R - new int[] { 1, 3, 3 }, // G - new int[] { 2, 3, 3 }, // B - new int[] { 0, 1, 3 }, // RG - new int[] { 0, 2, 3 }, // RB - new int[] { 1, 2, 3 }, // GB - new int[] { 0, 0, 3 }, // RR - new int[] { 1, 1, 3 }, // GG - new int[] { 2, 2, 3 }, // BB - new int[] { 0, 0, 2 }, // RRB - new int[] { 0, 0, 1 }, // RRG - new int[] { 1, 1, 0 }, // GGR - new int[] { 1, 1, 2 }, // GGB - new int[] { 2, 2, 0 }, // BBR - new int[] { 2, 2, 1 }, // BBG - new int[] { 0, 1, 2 }, // RGB - }; - readonly int[] ChannelList; // 処理するチャネル数 - readonly Mat TCC_SRGB; - readonly Mat TCC_XYZ; - readonly float UpdateRate; - int _detectionCount = 0; - Point2f _lastPosition = new Point2f(0, 0); - - /// - /// カメラの基本クラス - /// - public CameraBase(Form1 form) { - _form = form; - UpdateRate = Config.GetFloat("Calib/UpdateRate"); - TCC_SRGB = LoadMatFromCsv(Config.GetString("File/TccSrgbRef")); - TCC_XYZ = LoadMatFromCsv(Config.GetString("File/TccXyzRef")); - ChannelList = Config.GetString("Calib/ConversionChannels") - .Split(',') - .Select(x => int.Parse(x.Trim())) - .Where(x => x >= 4 && x <= 17) - .Distinct() - .OrderBy(x => x) - .ToArray(); - } - - /// - /// 起動チェック - /// - /// - protected bool BootCheck() { - - if (!Config.IsLoaded()) { - ErrorMsg = "設定ファイル(Config.xml)の読み込みに失敗しました.\r\n終了します."; - return false; - } - if (TCC_SRGB is null) { - ErrorMsg = $"ファイル({Config.GetString("File/TccSrgbRef")})の読み込みに失敗しました.\r\n終了します."; - return false; - } - if (TCC_XYZ is null) { - ErrorMsg = $"ファイル({Config.GetString("File/TccXyzRef")})の読み込みに失敗しました.\r\n終了します."; - return false; - } - return true; - } - - /// - /// 画像撮影1枚 - /// - public void ShotOne() { - SetSaveFolder(_form.GetDataName()); - SetInfo("データ名", _form.GetDataName()); - SetInfo("撮影枚数", "1"); - Shot(); - EventSound(Config.GetString("Sound/OneShotDone")); - _form.ShowMessage("撮影終了"); - } - - /// - /// 複数画像撮影 - /// - public void ShotMulti() { - SetSaveFolder(_form.GetDataName()); - SetInfo("データ名", _form.GetDataName()); - SetInfo("撮影枚数", $"{_form.GetNumMultiShots()}"); - SetInfo("撮影間隔(ms)", $"{_form.GetMultiShotsInterval()}"); - Shot(_form.GetNumMultiShots(), _form.GetMultiShotsInterval()); - EventSound(Config.GetString("Sound/MultiShotDone")); - _form.ShowMessage("撮影終了"); - } - - /// - /// 画像保存処理 - /// - /// - /// - protected void SaveImages(Mat img, int idx) { - - var filename = Config.GetString("File/RgbImage"); - filename = filename.Replace("{NO}", $"{idx + 1:0000}"); - Cv2.ImWrite(Path.Combine(_saveFolder, filename), img); - - foreach (var channel in ChannelList) { - using (var converted = ConvertImage(img, _convRGB2SRGB[channel])) { - filename = GetFilenameWithChannel("File/SrgbImage", channel); - filename = filename.Replace("{NO}", $"{idx + 1:0000}"); - Cv2.ImWrite(Path.Combine(_saveFolder, filename), converted); - } - } - } - - /// - /// 画像保存スレッド処理 - /// - /// - protected void SaveThread(int numImages) { - int saveCount = 0; - while (saveCount < numImages) { - Mat m = null; - lock (_shots) { - if (_shots.Count > 0) { - m = _shots[0]; - _shots.RemoveAt(0); - } - } - if (m is null) { - Thread.Sleep(1); - continue; - } - try { - SaveImages(m, saveCount); - } finally { - m.Dispose(); - } - saveCount++; - _form.ShowMessage($"画像{saveCount}/{numImages}枚目保存"); - } - _form.ShowMessage("全ての画像保存完了"); - _form.EnableShots(true); - } - - /// - /// チャートの検出 - /// - /// - protected void DetectChart(Mat img) { - - // ARマーカー検出 - CvAruco.DetectMarkers(img, ARDict, out var corners, out var ids, - new DetectorParameters(), out var rejectedImgPoints); - if (ids.Length < 1) return; - - // マーカー座標格納 - var ptsPict = new List(); - var ptsModel = new List(); - Point2f position = new Point2f(); - float y40 = 0, y41 = 0; - for (int i = 0; i < ids.Length; i++) { - if (ids[i] == 40) { - ptsPict.AddRange(corners[i]); - ptsModel.AddRange(PointsDst40); - position = corners[i][3]; - y40 = corners[i][3].Y; - } - if (ids[i] == 41) { - ptsPict.AddRange(corners[i]); - ptsModel.AddRange(PointsDst41); - y41 = corners[i][3].Y; - } - } - if (ptsPict.Count < 8) return; - if (y40 > y41) { - _form.ShowMessage("舌診チャートが上下逆方向です"); - return; - } - - // チャートの固定判定 - _form.ShowMessage("舌診チャートの検出中"); - var dist = (float)position.DistanceTo(_lastPosition); - if (dist < Config.GetFloat("Calib/ChartSetCriteria")) { - _detectionCount++; - } else { - _detectionCount = 0; - } - _lastPosition = position; - if (_detectionCount < Config.GetInt("Calib/ChartSetCount")) return; - - // ホモグラフィの計算 - var matPtsPict = Mat.FromArray(ptsPict); - var matPtsModel = Mat.FromArray(ptsModel); - var matH = Cv2.FindHomography(matPtsModel, matPtsPict); - var imgF = new Mat(1545, 810, MatType.CV_8UC3); - Cv2.WarpPerspective(img, imgF, matH, imgF.Size()); - - // チャートマスク作成 - _chartMasks.Clear(); - var roiSize = ptsPict.Count < 8 ? 60 : 80; - for (int i = 0; i < 24; i++) { - var row = i % 6; - var col = i / 6; - var x = 581 - col * 144 + (ptsPict.Count < 8 ? 10 : 0); - var y = 318 + row * 144 + (ptsPict.Count < 8 ? 10 : 0); - var roi = new Rect(x, y, roiSize, roiSize); - using (var mask = new Mat(1545, 810, MatType.CV_8U)) { - Cv2.Rectangle(mask, roi, new Scalar(255), Cv2.FILLED); - var maskF = new Mat(img.Size(), MatType.CV_8U); - Cv2.WarpPerspective(mask, maskF, matH, maskF.Size()); - _chartMasks.Add(maskF); - } - } - - _form.ShowMessage("舌診チャート検出 校正中"); - _calibrating = Config.GetInt("Calib/Frames"); - } - - /// - /// ファイル名にチャネル数を追加する - /// - /// - /// - /// - private string GetFilenameWithChannel(string config, int channel) { - var filename = Config.GetString(config); - filename = filename.Replace("{CN}", $"{channel:00}"); - return filename; - } - - /// - /// チャートに基づく変換行列の計算 - /// - /// - protected void CalcTcc(Mat img) { - - // 変換行列の計算 - var tccRgb = GetTccRgb(img); - var imgRois = GetTccRoisImage(img); - - // データ保存 - SetSaveFolder("校正"); - SetInfo("校正データ", _saveFolder); - Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("File/TccImage")), img); - Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("File/TccRoisImage")), imgRois); - SaveMatToCsv(Path.Combine(_saveFolder, Config.GetString("File/TccRgbValues")), tccRgb); - - // Dispose any existing conversion matrices before overwriting - foreach (var kv in _convRGB2SRGB) { - kv.Value?.Dispose(); - } - _convRGB2SRGB.Clear(); - - foreach (var channel in ChannelList) { - var convRGB2SRGB = CalcConvertMatrix(tccRgb, TCC_SRGB, channel); - SaveMatToCsv(Path.Combine(_saveFolder, GetFilenameWithChannel("File/ConvRgb2Srgb", channel)), convRGB2SRGB); - - var convRGB2XYZ = CalcConvertMatrix(tccRgb, TCC_XYZ, channel); - try { - SaveMatToCsv(Path.Combine(_saveFolder, GetFilenameWithChannel("File/ConvRgb2Xyz", channel)), convRGB2XYZ); - - if (channel == 17) { - var convOld = new Mat(convRGB2XYZ.Size(), MatType.CV_64FC1); - for (var row = 0; row < convRGB2XYZ.Rows; row++) { - var rowFrom = (row + 1) % convRGB2XYZ.Rows; // 1行ずらす - for (var col = 0; col < convRGB2XYZ.Cols; col++) { - convOld.At(row, col) = convRGB2XYZ.At(rowFrom, col); - } - } - SaveMatToCsv(Path.Combine(_saveFolder, GetFilenameWithChannel("File/ConvRgb2XyzOld", channel)), convOld); - convOld.Dispose(); - } - - var tccSrgb = ConvertColor(tccRgb, convRGB2SRGB); - try { - SaveMatToCsv(Path.Combine(_saveFolder, GetFilenameWithChannel("File/TccSrgbValues", channel)), tccSrgb); - - var convSrgb2Xyz = CalcConvertMatrix(tccSrgb, TCC_XYZ, channel); - try { - SaveMatToCsv(Path.Combine(_saveFolder, GetFilenameWithChannel("File/ConvSrgb2Xyz", channel)), convSrgb2Xyz); - } finally { convSrgb2Xyz.Dispose(); } - - // 変換精度検証 - var diff = Math.Sqrt(Cv2.Norm(TCC_SRGB, tccSrgb, NormTypes.L2)); - Debug.WriteLine($"{channel}次元 RGB→SRGB 変換行列の誤差 = {diff:.000}"); - } finally { tccSrgb.Dispose(); } - } finally { convRGB2XYZ.Dispose(); } - - _convRGB2SRGB.Add(channel, convRGB2SRGB); - } - - // Dispose temporary mats - tccRgb.Dispose(); - imgRois.Dispose(); - - EventSound(Config.GetString("Sound/CalibDone")); - _form.ShowMessage("自動校正完了"); - _form.EnableShots(); - _calibrated = true; - } - - /// - /// 画像からチャートのRGB値算出 - /// - /// - /// - private Mat GetTccRgb(Mat img) { - var arrRGB = new Mat(24, 3, MatType.CV_64FC1); - for (int i = 0; i < _chartMasks.Count; i++) { - var rgb = Cv2.Mean(img, _chartMasks[i]); - arrRGB.At(i, 0) = rgb.Val0; // Blue - arrRGB.At(i, 1) = rgb.Val1; // Green - arrRGB.At(i, 2) = rgb.Val2; // Red - } - return arrRGB; - } - - /// - /// TCCのROI画像を取得 - /// - /// - /// - private Mat GetTccRoisImage(Mat img) { - var imgRois = img.Clone(); - for (int i = 0; i < _chartMasks.Count; i++) { - imgRois.SetTo(new Scalar(0, 200, 0), _chartMasks[i]); - } - return imgRois; - } - - /// - /// 変換行列算出 - /// - /// 画像 - /// 変換目標の24x3行列 - private Mat CalcConvertMatrix(Mat src, Mat target, int channels) { - var extended = ExtendMat(src, channels); - Mat convMat = new Mat(channels, 3, MatType.CV_64FC1); - Cv2.Solve(extended, target, convMat, DecompTypes.SVD); - return convMat; - } - - /// - /// 色変換 - /// - /// - /// - /// - private Mat ConvertColor(Mat src, Mat conv) { - var extended = ExtendMat(src, conv.Rows); - var converted = (extended * conv); - return converted.ToMat(); - } - - /// - /// 8bitクリッピング処理 ForEachAsVec3d用 - /// - /// - /// - unsafe void Clip8bit(Vec3d* p, int* pos) { - p->Item0 = Math.Max(0, Math.Min(255.0, p->Item0)); - p->Item1 = Math.Max(0, Math.Min(255.0, p->Item1)); - p->Item2 = Math.Max(0, Math.Min(255.0, p->Item2)); - } - - /// - /// 画像の色変換 - /// - /// - /// - /// double型画像 - protected Mat ConvertImage(Mat src, Mat conv) { - if (src.Type() != MatType.CV_64FC3) { - src.ConvertTo(src, MatType.CV_64FC3); - } - var flatten = src.Reshape(3, src.Height * src.Width); - var extended = ExtendMat(flatten, conv.Rows); - var converted = (extended * conv).ToMat(); - var convertedImage = converted.Reshape(3, src.Height); - //Clipping to 8bit range - //unsafe { - // convertedImage.ForEachAsVec3d(Clip8bit); - //} - - var convImg8 = new Mat(); - convertedImage.ConvertTo(convImg8, MatType.CV_8UC3); - return convImg8; - } - - /// - /// 行列の拡張 3次元→高次元(指定チャンネル数) - /// - /// - /// - private Mat ExtendMat(Mat src, int channels) { - if (src.Cols * src.Channels() != 3) return src; - var dst = new Mat(src.Rows, channels, MatType.CV_64FC1); - Parallel.For(0, src.Rows, row => { - var vals = new double[] { - src.Cols == 1 ? src.At(row, 0)[2] : src.At(row, 2), // R - src.Cols == 1 ? src.At(row, 0)[1] : src.At(row, 1), // G - src.Cols == 1 ? src.At(row, 0)[0] : src.At(row, 0), // B - 1.0 - }; - for (int i = 0; i < channels; i++) { - dst.At(row, i) = vals[ExtendChannels[i][0]] * vals[ExtendChannels[i][1]] * vals[ExtendChannels[i][2]]; - } - }); - return dst; - } - - /// - /// ゲイン値の更新比率計算 - /// - /// - /// - protected float GetRatio(float value, float target) { - float ratio = target / value; - ratio = (ratio - 1.0f) * (value == 255.0f ? 1.0f : UpdateRate) + 1.0f; - return ratio; - } - - /// - /// csvファイルからMatを読み込む - /// - /// - /// - /// - private Mat LoadMatFromCsv(string csvFile) { - try { - var arr = new List(); - int cols = -1; - using (var reader = new StreamReader(csvFile)) { - while (!reader.EndOfStream) { - var line = reader.ReadLine(); - var valStrs = line.Split(','); - if (cols == -1) cols = valStrs.Length; - else if (cols != valStrs.Length) throw new Exception("cols != valStrs.Length"); - var vals = valStrs.Select(x => double.Parse(x)).ToArray(); - arr.Add(vals); - } - } - var m = new Mat(arr.Count, cols, MatType.CV_64FC1); - for (var row = 0; row < arr.Count; row++) { - for (var col = 0; col < cols; col++) { - m.At(row, col) = arr[row][col]; - } - } - return m; - } catch (Exception) { - return null; - } - } - - /// - /// Matをcsvファイルに保存 - /// - /// - /// - private void SaveMatToCsv(string csvFile, Mat m) { - using (var writer = new StreamWriter(csvFile)) { - for (var row = 0; row < m.Rows; row++) { - var line = ""; - for (var col = 0; col < m.Cols; col++) { - if (col > 0) line += ","; - line += $"{m.At(row, col):0.0000000}"; - } - writer.WriteLine(line); - } - } - } - - /// - /// 保存フォルダの取得 - /// - /// - /// - protected void SetSaveFolder(string note) { - var dt = DateTime.Now; - var paths = new List() { - Config.GetString("File/SaveFolder"), - dt.ToString("yyyy-MM-dd"), - dt.ToString("HH_mm_ss") + $"-{note}", - }; - _saveFolder = Path.Combine(paths.ToArray()); - Directory.CreateDirectory(_saveFolder); - } - - /// - /// 設定値を保存する - /// - /// - /// - protected void SetInfo(string key, string value) { - if (_ShotInfo.ContainsKey(key)) { - _ShotInfo[key] = value; - } else { - _ShotInfo.Add(key, value); - } - } - - /// - /// 設定値をCSVファイルに書き込む - /// - /// - protected void WriteInfo(StreamWriter sw) { - sw.WriteLine($"撮影日時,{DateTime.Now:yyyy/MM/dd HH:mm:ss}"); // 撮影日時を追加 - foreach (var kvp in _ShotInfo) { - sw.WriteLine($"{kvp.Key},{kvp.Value}"); - } - } - - private void EventSound(string wavfile) { - if (!File.Exists(wavfile)) { - Debug.WriteLine($"音声ファイルが見つかりません: {wavfile}"); - return; - } - try { - using (var player = new SoundPlayer(wavfile)) { - player.Play(); - } - } catch (Exception ex) { - Debug.WriteLine($"音声再生に失敗しました: {ex.Message}"); - } - } - } -} diff --git a/TIASshot/Cameras/CameraBase.cs b/TIASshot/Cameras/CameraBase.cs new file mode 100644 index 0000000..e3e7154 --- /dev/null +++ b/TIASshot/Cameras/CameraBase.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.Remoting.Channels; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Forms; +using System.Media; +using OpenCvSharp; + +namespace TIASshot { + internal abstract class CameraBase { + // インターフェース + public abstract bool Connect(); + public abstract void Disconnect(); + protected abstract void Shot(int numImages=1, int interval=0); + +#if WHITEBOARD + /// + /// 白板撮影(WHITEBOARD 限定).IScam でのみ実装. + /// 未対応の派生クラス(Lucam 等)はこのデフォルト実装でユーザーに通知して何もしない. + /// + /// 撮影枚数 + public virtual void ShotWhiteBoard(int numImages) { + _form.ShowMessage("白板撮影は ImagingSource カメラのみ対応しています"); + } +#endif + + // テンプレートメソッド用抽象メソッド(プレビュー/校正処理) + protected abstract void ApplyWhiteBalance(Scalar whitePatch); + protected abstract void LogCalibrationConverged(); + protected abstract void RecordCalibrationInfo(Mat imgt); + + // テンプレートメソッド用抽象メソッド(撮影処理) + protected abstract void BeginShot(); + protected abstract Mat CaptureFrame(); + protected abstract void EndShot(); + + // プロパティ + public string DeviceName { get; protected set; } = "Unknown"; + public string SerialNumber { get; protected set; } + public string ErrorMsg { get; protected set; } + public bool IsCalibrating => _calibrating > 0; + + // 派生クラスで使用するメンバ + protected Form1 _form; + protected int _calibrating = 0; + protected bool _calibrated = false; + protected Bitmap[] _bmps = new Bitmap[2]; + protected int _bmpIndex = 0; + protected bool _isPreview = false; + protected List _chartMasks = new List(); + protected string _saveFolder = ""; + protected BlockingCollection _shots = new BlockingCollection(); + protected Dictionary _ShotInfo = new Dictionary(); // 設定値保存用 + protected Rect _roi; + + // プライベートメンバ + readonly float UpdateRate; + + // 色補正処理(TCC 変換行列の計算・色変換) + readonly ColorCorrector _colorCorrector; + + // チャート検出処理(ARマーカー検出・マスク生成) + readonly ChartDetector _chartDetector; + + /// + /// カメラの基本クラス + /// + public CameraBase(Form1 form) { + _form = form; + UpdateRate = Config.GetFloat("Calib/UpdateRate"); + var tccSrgb = IoUtil.LoadMatFromCsv(Config.GetString("File/TccSrgbRef")); + var tccXyz = IoUtil.LoadMatFromCsv(Config.GetString("File/TccXyzRef")); + _colorCorrector = new ColorCorrector(tccSrgb, tccXyz); + _chartDetector = new ChartDetector(_form.ShowMessage); + } + + /// + /// 起動チェック + /// + /// + protected bool BootCheck() { + + if (!Config.IsLoaded()) { + ErrorMsg = "設定ファイル(Config.xml)の読み込みに失敗しました.\r\n終了します."; + return false; + } + if (!_colorCorrector.SrgbRefLoaded) { + ErrorMsg = $"ファイル({Config.GetString("File/TccSrgbRef")})の読み込みに失敗しました.\r\n終了します."; + return false; + } + if (!_colorCorrector.XyzRefLoaded) { + ErrorMsg = $"ファイル({Config.GetString("File/TccXyzRef")})の読み込みに失敗しました.\r\n終了します."; + return false; + } + return true; + } + + /// + /// 画像撮影1枚 + /// + public void ShotOne() { + SetSaveFolder(_form.GetDataName()); + SetInfo("データ名", _form.GetDataName()); + SetInfo("撮影枚数", "1"); + Shot(); + IoUtil.PlaySound(Config.GetString("Sound/OneShotDone")); + _form.ShowMessage("撮影終了"); + } + + /// + /// 複数画像撮影 + /// + public void ShotMulti() { + SetSaveFolder(_form.GetDataName()); + SetInfo("データ名", _form.GetDataName()); + SetInfo("撮影枚数", $"{_form.GetNumMultiShots()}"); + SetInfo("撮影間隔(ms)", $"{_form.GetMultiShotsInterval()}"); + Shot(_form.GetNumMultiShots(), _form.GetMultiShotsInterval()); + IoUtil.PlaySound(Config.GetString("Sound/MultiShotDone")); + _form.ShowMessage("撮影終了"); + } + + /// + /// 画像保存処理 + /// + /// + /// + protected void SaveImages(Mat img, int idx) { + + var filename = Config.GetString("File/RgbImage"); + filename = filename.Replace("{NO}", $"{idx + 1:0000}"); + Cv2.ImWrite(Path.Combine(_saveFolder, filename), img); + + foreach (var channel in _colorCorrector.Channels) { + using (var converted = _colorCorrector.ConvertImage(img, channel)) { + filename = GetFilenameWithChannel("File/SrgbImage", channel); + filename = filename.Replace("{NO}", $"{idx + 1:0000}"); + Cv2.ImWrite(Path.Combine(_saveFolder, filename), converted); + } + } + } + + /// + /// 画像保存スレッド処理 + /// + /// + protected void SaveThread(int numImages) { + int saveCount = 0; + foreach (var img in _shots.GetConsumingEnumerable()) { + SaveImages(img, saveCount); + saveCount++; + _form.ShowMessage($"画像{saveCount}/{numImages}枚目保存"); + } + _form.ShowMessage("全ての画像保存完了"); + _form.EnableShots(true); + } + + /// + /// 校正フレーム処理の共通骨格(テンプレートメソッド) + /// imgt が用意された後の校正/検出フローを担う. + /// ゲイン反映(ApplyWhiteBalance)・収束時ログ出力(LogCalibrationConverged)・ + /// 校正情報記録(RecordCalibrationInfo)は派生クラスに委譲する. + /// 呼び出し順序は元コードに合わせ「LogCalibrationConverged → CalcTcc → RecordCalibrationInfo」. + /// + /// 処理対象 Mat(前処理済み) + protected void ProcessCalibrationFrame(Mat imgt) { + if (_calibrating > 0) { + var whitePatch = Cv2.Mean(imgt, _chartMasks[12]); + Debug.WriteLine($"White patch R {whitePatch.Val2:.00} G {whitePatch.Val1:.00} B {whitePatch.Val0:.00}"); + if (_calibrating % Config.GetInt("Calib/UpdateInterval") == 0) { + ApplyWhiteBalance(whitePatch); + } + _calibrating--; + if (_calibrating == 0) { + LogCalibrationConverged(); + CalcTcc(imgt); + RecordCalibrationInfo(imgt); +#if MEMMONITOR + PreviewProfiler.MarkEvent("CALIB_END"); +#endif + } + } + + if (!_calibrated && _calibrating == 0) { + DetectChart(imgt); + } + } + + /// + /// 撮影ループの共通骨格(テンプレートメソッド) + /// CSV 書き込み・ループ・タイミング制御を担う. + /// フレーム取得(CaptureFrame)は派生クラスに委譲する. + /// BeginShot/EndShot は呼び出し元(派生クラスの Shot)で前後に実行すること. + /// ループ完了後に _shots.CompleteAdding() を呼び,SaveThread に終了を通知する. + /// + /// 撮影枚数 + /// 撮影間隔(ms) + protected void RunShotLoop(int numImages, int interval) { + try { +#if MEMMONITOR + PreviewProfiler.MarkEvent("SHOT_START"); +#endif + var filename = Config.GetString("File/Info"); + using (var csv = new StreamWriter(Path.Combine(_saveFolder, filename))) { + WriteInfo(csv); + csv.WriteLine("Shot,Time(ms)"); + + var watch = Stopwatch.StartNew(); + for (var i = 0; i < numImages; i++) { + var shotTime = watch.ElapsedMilliseconds; + csv.WriteLine($"{i + 1},{shotTime}"); + _form.ShowMessage($"撮影 {i + 1} / {numImages} 枚目"); + _shots.Add(CaptureFrame()); + while (watch.ElapsedMilliseconds < interval * (i + 1) && i < numImages - 1) { + Thread.Sleep(1); + } + } + } + } finally { + _shots.CompleteAdding(); +#if MEMMONITOR + PreviewProfiler.MarkEvent("SHOT_END"); +#endif + } + } + + /// + /// チャートの検出 + /// + /// + protected void DetectChart(Mat img) { + // チャート検出・マスク生成は ChartDetector に委譲する + var masks = _chartDetector.DetectChart(img); + if (masks == null) return; + + _chartMasks.Clear(); + _chartMasks.AddRange(masks); + _calibrating = Config.GetInt("Calib/Frames"); +#if MEMMONITOR + PreviewProfiler.MarkEvent("CALIB_START"); +#endif + } + + /// + /// ファイル名にチャネル数を追加する + /// + /// + /// + /// + private string GetFilenameWithChannel(string config, int channel) { + var filename = Config.GetString(config); + filename = filename.Replace("{CN}", $"{channel:00}"); + return filename; + } + + /// + /// チャートに基づく変換行列の計算 + /// + /// + protected void CalcTcc(Mat img) { + + // 変換行列の計算(tccRgb・imgRois はここで所有し,使用後に確実に解放する) + using (var tccRgb = GetTccRgb(img)) + using (var imgRois = GetTccRoisImage(img)) { + + // データ保存 + SetSaveFolder("校正"); + SetInfo("校正データ", _saveFolder); + Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("File/TccImage")), img); + Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("File/TccRoisImage")), imgRois); + + // 変換行列の計算・保存は ColorCorrector に委譲する(tccRgb の所有権は渡さない) + _colorCorrector.CalcTcc(tccRgb, _saveFolder, IoUtil.SaveMatToCsv); + } + + IoUtil.PlaySound(Config.GetString("Sound/CalibDone")); + _form.ShowMessage("自動校正完了"); + _form.EnableShots(); + _calibrated = true; + } + + /// + /// 画像からチャートのRGB値算出 + /// + /// + /// + private Mat GetTccRgb(Mat img) { + var arrRGB = new Mat(24, 3, MatType.CV_64FC1); + for (int i = 0; i < _chartMasks.Count; i++) { + var rgb = Cv2.Mean(img, _chartMasks[i]); + arrRGB.At(i, 0) = rgb.Val0; // Blue + arrRGB.At(i, 1) = rgb.Val1; // Green + arrRGB.At(i, 2) = rgb.Val2; // Red + } + return arrRGB; + } + + /// + /// TCCのROI画像を取得 + /// + /// + /// + private Mat GetTccRoisImage(Mat img) { + var imgRois = img.Clone(); + for (int i = 0; i < _chartMasks.Count; i++) { + imgRois.SetTo(new Scalar(0, 200, 0), _chartMasks[i]); + } + return imgRois; + } + + /// + /// ゲイン値の更新比率計算 + /// + /// 現在の計測値 + /// 目標値 + /// 更新比率 + protected float GetRatio(float value, float target) { + return GainCalc.CalcRatio(value, target, UpdateRate); + } + + /// + /// 保存フォルダの取得 + /// + /// + protected void SetSaveFolder(string note) { + _saveFolder = IoUtil.CreateSaveFolder(note); + } + + /// + /// 設定値を保存する + /// + /// + /// + protected void SetInfo(string key, string value) { + if (_ShotInfo.ContainsKey(key)) { + _ShotInfo[key] = value; + } else { + _ShotInfo.Add(key, value); + } + } + + /// + /// 設定値をCSVファイルに書き込む + /// + /// + protected void WriteInfo(StreamWriter sw) { + IoUtil.WriteInfo(sw, _ShotInfo); + } + } +} diff --git a/TIASshot/Cameras/GainCalc.cs b/TIASshot/Cameras/GainCalc.cs new file mode 100644 index 0000000..2695fd5 --- /dev/null +++ b/TIASshot/Cameras/GainCalc.cs @@ -0,0 +1,21 @@ +namespace TIASshot { + /// + /// ゲイン更新比率の計算ロジック(ピュアロジック層). + /// ハードウェアに依存しない純粋な計算のみを担う. + /// + internal static class GainCalc { + /// + /// ゲイン値の更新比率を計算する. + /// value が 255.0f のときは updateRate によらず係数を 1.0 として比率を求める. + /// + /// 現在の計測値 + /// 目標値 + /// 更新レート(0 より大きい値を想定) + /// 更新比率 + internal static float CalcRatio(float value, float target, float updateRate) { + float ratio = target / value; + ratio = (ratio - 1.0f) * (value == 255.0f ? 1.0f : updateRate) + 1.0f; + return ratio; + } + } +} diff --git a/TIASshot/Cameras/IScam.cs b/TIASshot/Cameras/IScam.cs new file mode 100644 index 0000000..1652a83 --- /dev/null +++ b/TIASshot/Cameras/IScam.cs @@ -0,0 +1,388 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using TIS.Imaging; +using OpenCvSharp; +using OpenCvSharp.Extensions; +using System.Diagnostics; +using System.Drawing; +using System.Threading; +using System.IO; + +namespace TIASshot { + internal class IScam : CameraBase { + + ICImagingControl _ic; + VCDRangeProperty _brightness; + VCDRangeProperty _gain; + VCDRangeProperty _exposure; + VCDRangeProperty _gamma; + VCDRangeProperty _whiteBalanceBlue; + VCDRangeProperty _whiteBalanceGreen; + VCDRangeProperty _whiteBalanceRed; + FrameQueueSink _queueSink; + FrameSnapSink _snapSink; + FrameSnapSink _snapSinkRef; + + /// + /// IScamコンストラクタ + /// + /// + /// + public IScam(Form1 form, ICImagingControl ic, string deviceName) : base(form) { + _ic = ic; + DeviceName = deviceName; + } + + /// + /// IScam接続 + /// + /// + public override bool Connect() { + if (!BootCheck()) return false; + + var configFile = $"{DeviceName}.xml"; + if (!File.Exists(configFile)) { + ErrorMsg = $"{configFile}が見つかりません"; + return false; + } + _ic.LoadDeviceStateFromFile(configFile, true); + if (!_ic.DeviceValid) { + ErrorMsg = $"設定ファイル{configFile}の読み込みに失敗しました"; + return false; + } + _roi = new Rect( + Config.GetInt($"{DeviceName}/ROI/X"), + Config.GetInt($"{DeviceName}/ROI/Y"), + Config.GetInt($"{DeviceName}/ROI/W"), + Config.GetInt($"{DeviceName}/ROI/H")); + + _queueSink = new FrameQueueSink(Retrieve, MediaSubtypes.RGB24, 5); + _snapSink = new FrameSnapSink(MediaSubtypes.RGB24); + _ic.Sink = _queueSink; + DeviceName = _ic.DeviceCurrent.Name; + SetInfo("カメラ型番", DeviceName); + SerialNumber = _ic.DeviceCurrent.GetSerialNumber(); + SetInfo("カメラSN", SerialNumber); + _brightness = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Brightness, VCDGUIDs.VCDElement_Value); + _gain = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Gain, VCDGUIDs.VCDElement_Value); + _exposure = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Value); + _gamma = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Gamma, VCDGUIDs.VCDElement_Value); + _whiteBalanceBlue = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceBlue); + _whiteBalanceGreen = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceGreen); + _whiteBalanceRed = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceRed); + Debug.WriteLine($"Exposure range: {_exposure.RangeMin} to {_exposure.RangeMax} value={_exposure.Value}" ); + Debug.WriteLine($"Gain range: {_gain.RangeMin} to {_gain.RangeMax} value={_gain.Value}"); + Debug.WriteLine($"Brightness range: {_brightness.RangeMin} to {_brightness.RangeMax} value={_brightness.Value}"); + Debug.WriteLine($"Gamma range: {_gamma.RangeMin} to {_gamma.RangeMax} value={_gamma.Value}"); + Debug.WriteLine($"White Balance Blue range: {_whiteBalanceBlue.RangeMin} to {_whiteBalanceBlue.RangeMax} value={_whiteBalanceBlue.Value}"); + Debug.WriteLine($"White Balance Green range: {_whiteBalanceGreen.RangeMin} to {_whiteBalanceGreen.RangeMax} value={_whiteBalanceGreen.Value}"); + Debug.WriteLine($"White Balance Red range: {_whiteBalanceRed.RangeMin} to {_whiteBalanceRed.RangeMax} value={_whiteBalanceRed.Value}"); + + _ic.LiveStart(); + return true; + } + + /// + /// IScam切断 + /// + public override void Disconnect() { + _ic.LiveStop(); + } + + /// + /// フレーム取得処理 + /// + /// + /// + private FrameQueuedResult Retrieve(IFrameQueueBuffer buffer) { + var frameType = buffer.FrameType; + + using (Mat img = Mat.FromPixelData(frameType.Height, frameType.Width, MatType.CV_8UC3, buffer.GetIntPtr())) { + using (Mat imgt_full = img.T()) { + using (var imgt = new Mat(imgt_full, _roi)) { + // ShowImage は入力 Bitmap を読むだけ(表示用には内部でコピーを生成する)ため, + // 呼び出し側で所有権を持ち,using で確実に Dispose する + using (var frameBmp = imgt.ToBitmap()) { + _form.ShowImage(frameBmp); + } + ProcessCalibrationFrame(imgt); + } + } + } + + return FrameQueuedResult.ReQueue; + } + + /// + /// ゲイン/ホワイトバランスの反映(IScam 固有) + /// + /// 白パッチの計測値 + protected override void ApplyWhiteBalance(Scalar whitePatch) { + _whiteBalanceBlue.Value = (int)(0.5 + _whiteBalanceBlue.Value * GetRatio((float)whitePatch.Val0, Config.GetFloat("Calib/Reference/B"))); + _whiteBalanceGreen.Value = (int)(0.5 + _whiteBalanceGreen.Value * GetRatio((float)whitePatch.Val1, Config.GetFloat("Calib/Reference/G"))); + _whiteBalanceRed.Value = (int)(0.5 + _whiteBalanceRed.Value * GetRatio((float)whitePatch.Val2, Config.GetFloat("Calib/Reference/R"))); + } + + /// + /// 校正収束時のホワイトバランス値ログ出力(IScam 固有) + /// CalcTcc の前に呼ばれ,元コードの Debug.WriteLine 順序を再現する. + /// + protected override void LogCalibrationConverged() { + Debug.WriteLine($"White Balance Blue range: {_whiteBalanceBlue.RangeMin} to {_whiteBalanceBlue.RangeMax} value={_whiteBalanceBlue.Value}"); + Debug.WriteLine($"White Balance Green range: {_whiteBalanceGreen.RangeMin} to {_whiteBalanceGreen.RangeMax} value={_whiteBalanceGreen.Value}"); + Debug.WriteLine($"White Balance Red range: {_whiteBalanceRed.RangeMin} to {_whiteBalanceRed.RangeMax} value={_whiteBalanceRed.Value}"); + } + + /// + /// 校正完了時のカメラ情報記録(IScam 固有) + /// CalcTcc の後に呼ばれ,SetInfo で各値を保存する. + /// + /// 処理対象 Mat + protected override void RecordCalibrationInfo(Mat imgt) { + SetInfo("Exposure(ms)", $"{(float)_exposure.Value / 10}"); + SetInfo("Brightness", $"{_brightness.Value}"); + SetInfo("Gamma", $"{_gamma.Value}"); + SetInfo("Gain", $"{_gain.Value}"); + SetInfo("Gain B", $"{_whiteBalanceBlue.Value}"); + SetInfo("Gain G", $"{_whiteBalanceGreen.Value}"); + SetInfo("Gain R", $"{_whiteBalanceRed.Value}"); + SetInfo("画像幅", $"{imgt.Width}"); + SetInfo("画像高さ", $"{imgt.Height}"); + } + + /// + /// 撮影 + /// + /// + /// + protected override void Shot(int numImages = 1, int interval = 0) { + _ic.LiveStop(); + _ic.Sink = _snapSink; + _ic.LiveStart(); + _snapSinkRef = _ic.Sink as FrameSnapSink; + + _shots = new BlockingCollection(); + _snapSinkRef.SnapSingle(TimeSpan.FromSeconds(5)); // 最初のフレームを捨てる + + var thread = new Thread(() => SaveThread(numImages)); + thread.Start(); + + RunShotLoop(numImages, interval); + + _ic.LiveStop(); + _ic.Sink = _queueSink; + _ic.LiveStart(); + } + + /// + /// 撮影開始処理(IScam 固有): Shot 内でインライン実行済みのため空実装 + /// + protected override void BeginShot() { } + + /// + /// 1 フレーム取得(IScam 固有) + /// + /// 撮影した Mat(呼び出し元が _shots に追加する) + protected override Mat CaptureFrame() { + var buffer = _snapSinkRef.SnapSingle(TimeSpan.FromSeconds(5)); + using (Mat img = Mat.FromPixelData(buffer.FrameType.Height, buffer.FrameType.Width, MatType.CV_8UC3, buffer.GetIntPtr())) { + using (Mat imgt_full = img.T()) { + return new Mat(imgt_full, _roi); + } + } + } + + /// + /// 撮影終了処理(IScam 固有): Shot 内でインライン実行済みのため空実装 + /// + protected override void EndShot() { } + +#if WHITEBOARD + // --------------------------------------------------------------- + // 白板撮影(WHITEBOARD 限定・照明均一性評価用) + // --------------------------------------------------------------- + + // Color Enhancement プロパティの GUID(DFK23UX249.xml に記載) + private static readonly Guid ColorEnhancementGuid = new Guid("{3A3A8F77-6440-46CC-940A-8752B02E6C29}"); + + /// + /// 白板撮影を実行する(WHITEBOARD 限定). + /// チャート検出・WB 自動調整・TCC 色補正を一切行わず,カメラ素の RGB を保存する. + /// 校正未完了でも撮影可能. + /// + /// 撮影枚数 + public override void ShotWhiteBoard(int numImages) { + var saveFolder = IoUtil.CreateSaveFolder("白板"); + + // Color Enhancement を OFF にする(DFK23UX249 専用プロパティ) + bool colorEnhancementDisabled = TryDisableColorEnhancement(); + if (!colorEnhancementDisabled) { + Debug.WriteLine("[WhiteBoard] Color Enhancement の無効化をスキップしました(プロパティが存在しないか非対応)"); + } + + _ic.LiveStop(); + _ic.Sink = _snapSink; + _ic.LiveStart(); + var snapRef = _ic.Sink as FrameSnapSink; + + try { + // 最初のフレームを捨てる(露出安定化) + snapRef.SnapSingle(TimeSpan.FromSeconds(5)); + + var statsList = new List(); + int fullWidth = 0; + int fullHeight = 0; + + for (int i = 0; i < numImages; i++) { + _form.ShowMessage($"白板撮影 {i + 1} / {numImages} 枚目"); + + var buffer = snapRef.SnapSingle(TimeSpan.FromSeconds(5)); + Mat roiFrame = null; + try { + using (Mat img = Mat.FromPixelData( + buffer.FrameType.Height, + buffer.FrameType.Width, + MatType.CV_8UC3, + buffer.GetIntPtr())) { + using (Mat imgt_full = img.T()) { + // フルフレーム(クロップなし)を保存(ビネット確認用) + var fullFilename = $"WhiteBoard_full_{i + 1:0000}.png"; + Cv2.ImWrite(Path.Combine(saveFolder, fullFilename), imgt_full); + + // フルフレームサイズを記録(全フレームで同値) + fullWidth = imgt_full.Width; + fullHeight = imgt_full.Height; + + // ROI 切り出し(通常撮影と同様) + roiFrame = new Mat(imgt_full, _roi).Clone(); + } + } + + // ROI 画像(PNG)として保存(sRGB 変換なし) + var filename = $"WhiteBoard_{i + 1:0000}.png"; + Cv2.ImWrite(Path.Combine(saveFolder, filename), roiFrame); + + // 飽和統計の算出(ROI のみ) + var stats = ImageStats.Calc(roiFrame); + statsList.Add(stats); + + Debug.WriteLine( + $"[WhiteBoard] frame={i + 1} saturated={stats.SaturatedRatio:P2} " + + $"p99={stats.P99:F1} meanB={stats.MeanB:F1} meanG={stats.MeanG:F1} meanR={stats.MeanR:F1}"); + } finally { + if (roiFrame != null) roiFrame.Dispose(); + } + } + + // JSON サイドカー出力 + var jsonMeta = BuildWhiteBoardMeta(colorEnhancementDisabled, numImages, fullWidth, fullHeight); + var jsonStr = ImageStats.BuildJson(jsonMeta, statsList); + File.WriteAllText( + Path.Combine(saveFolder, "whiteboard_meta.json"), + jsonStr, + new System.Text.UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); + + _form.ShowMessage($"白板撮影終了({numImages} 枚): {saveFolder}"); + Debug.WriteLine($"[WhiteBoard] 保存完了: {saveFolder}"); + } catch (Exception ex) { + Debug.WriteLine($"[WhiteBoard] 撮影エラー: {ex.Message}"); + _form.ShowMessage($"白板撮影エラー: {ex.Message}"); + throw; + } finally { + _ic.LiveStop(); + _ic.Sink = _queueSink; + _ic.LiveStart(); + } + } + + /// + /// Color Enhancement を無効化する. + /// プロパティが存在しない機種では安全にスキップする(GUIDE_09: 空 catch 禁止). + /// + /// 無効化に成功した場合は true,プロパティ未存在でスキップした場合は false + private bool TryDisableColorEnhancement() { + VCDSwitchProperty prop = null; + try { + prop = _ic.VCDPropertyItems.Find( + ColorEnhancementGuid, + VCDGUIDs.VCDElement_Value); + } catch (Exception ex) { + // プロパティが存在しない機種では Find が例外を投げる場合がある + Debug.WriteLine($"[WhiteBoard] Color Enhancement プロパティの取得に失敗(スキップ): {ex.Message}"); + return false; + } + + if (prop == null) { + Debug.WriteLine("[WhiteBoard] Color Enhancement プロパティが存在しません(スキップ)"); + return false; + } + + prop.Switch = false; + Debug.WriteLine("[WhiteBoard] Color Enhancement を OFF にしました"); + return true; + } + + /// + /// JSON サイドカー用の撮影条件メタ辞書を構築する. + /// + /// Color Enhancement を無効化した場合は true + /// 撮影枚数 + /// フルフレーム(転置後)の幅(未取得時は 0 を渡す) + /// フルフレーム(転置後)の高さ(未取得時は 0 を渡す) + private Dictionary BuildWhiteBoardMeta(bool colorEnhancementOff, int numImages, int fullWidth, int fullHeight) { + var meta = new Dictionary(); + meta["capture_datetime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + meta["device_name"] = DeviceName ?? "Unknown"; + meta["serial_number"] = SerialNumber ?? "Unknown"; + meta["roi_x"] = _roi.X; + meta["roi_y"] = _roi.Y; + meta["roi_width"] = _roi.Width; + meta["roi_height"] = _roi.Height; + meta["num_frames"] = numImages; + meta["full_frame_saved"] = true; + if (fullWidth > 0) + meta["full_width"] = fullWidth; + if (fullHeight > 0) + meta["full_height"] = fullHeight; + + // カメラプロパティ(デバイス状態ファイルの固定値を読み取り) + if (_exposure != null) + meta["exposure_ms"] = (double)_exposure.Value / 10.0; + if (_gain != null) + meta["gain"] = (double)_gain.Value; + if (_brightness != null) + meta["brightness"] = (int)_brightness.Value; + if (_gamma != null) + meta["gamma"] = (int)_gamma.Value; + if (_whiteBalanceBlue != null) + meta["wb_blue"] = (int)_whiteBalanceBlue.Value; + if (_whiteBalanceGreen != null) + meta["wb_green"] = (int)_whiteBalanceGreen.Value; + if (_whiteBalanceRed != null) + meta["wb_red"] = (int)_whiteBalanceRed.Value; + + meta["color_enhancement_enabled"] = !colorEnhancementOff; + meta["color_enhancement_note"] = colorEnhancementOff + ? "Disabled before capture" + : "Not available (skipped)"; + + // 固定状態(device-state ファイルから既知の設定を明示) + meta["gamma_setting"] = "100 (linear, scale: 100=1.0)"; + meta["tone_mapping"] = "OFF"; + meta["denoise"] = "0 (OFF)"; + meta["sharpness"] = "0 (OFF)"; + meta["color_matrix"] = "N/A (ImagingSource: Color Enhancement used instead)"; + meta["shading_correction"] = "未補正(LSC 保留)"; + meta["shading_correction_note"] = "No flat-field/LSC correction applied. " + + "Measured uniformity includes lens vignetting."; + + return meta; + } +#endif + } +} diff --git a/TIASshot/Cameras/Lucam.cs b/TIASshot/Cameras/Lucam.cs new file mode 100644 index 0000000..ea5b953 --- /dev/null +++ b/TIASshot/Cameras/Lucam.cs @@ -0,0 +1,313 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Lumenera.USB; +using OpenCvSharp; +using OpenCvSharp.Extensions; +using System.Drawing; +using System.Windows.Interop; +using System.Threading; +using OpenCvSharp.Aruco; +using System.Windows.Media.Animation; +using System.Configuration; +using System.Web.ModelBinding; +using System.Windows.Controls; +using System.IO; +using static System.Resources.ResXFileRef; +using System.Windows.Shapes; +using Path = System.IO.Path; +using OpenCvSharp.Dnn; + +namespace TIASshot { + + /// + /// Lumeneraカメラクラス + /// + internal class Lucam : CameraBase { + + // 光源の輝度設定 + // 連続撮影のマルチスレッド化 + // GUI更新はタイマー使用に変更 + + IntPtr _hCam = IntPtr.Zero; + byte[] _rawImage; + byte[] _rgbImage; + PictureBox _picPreview; + + dll.LucamSnapshot _snap; + dll.LucamConversion _convert; + dll.LucamRgbPreviewCallback _callbackHandler; + int _callbackId; + + /// + /// コンストラクタ + /// + /// + /// + public Lucam(Form1 form, PictureBox preview) : base(form) { + _picPreview = preview; + + // カメラパラメータの初期値 + _snap.BufferLastFrame = false; + _snap.Exposure = Config.GetFloat("Lucam/Exposure"); + _snap.ExposureDelay = 0; + _snap.flReserved1 = 0; + _snap.flReserved2 = 0; + _snap.Format.BinningX = 1; + _snap.Format.BinningY = 1; + _snap.Format.FlagsX = 0; + _snap.Format.FlagsY = 0; + _snap.Format.Height = 1024; + _snap.Format.PixelFormat = dll.LucamPixelFormat.PF_8; + _snap.Format.SubSampleX = 1; + _snap.Format.SubSampleY = 1; + _snap.Format.Width = 1280; + _snap.Format.X = 0; + _snap.Format.Y = 0; + _snap.Gain = Config.GetFloat("Lucam/Gain"); + _snap.GainBlue = Config.GetFloat("Lucam/GainB"); + _snap.GainGrn1 = Config.GetFloat("Lucam/GainG"); + _snap.GainGrn2 = _snap.GainGrn1; + _snap.GainRed = Config.GetFloat("Lucam/GainR"); + _snap.ShutterType = dll.LucamShutterType.GlobalShutter; + _snap.StrobeDelay = 0.1f; + _snap.StrobeFlags = 0; + _snap.Timeout = 5000; + _snap.ulReserved2 = 0; + _snap.UseHwTrigger = false; + + _convert.DemosaicMethod = dll.LucamDemosaicMethod.HIGH_QUALITY; + _convert.CorrectionMatrix = dll.LucamCorrectionMatrix.LED; + } + + /// + /// カメラ接続 + /// + /// + public override bool Connect() { + if (!BootCheck()) return false; + + int numCam = 0; + try { + numCam = dll.LucamNumCameras(); + } catch (Exception ex) { + ErrorMsg = ex.Message; + return false; + } + if ( numCam < 1 ) { + ErrorMsg = "Lucamが見つかりません"; + return false; + } + if (numCam > 1) { + ErrorMsg = "複数のLucamが見つかりました.\r\n正しいカメラを1つ接続してください."; + return false; + } + + // カメラのデバイス情報取得 + var lumVersion = new dll.LucamVersion[numCam]; + lumVersion = api.EnumCameras(); + var id = 0; + if (lumVersion[id].CameraId == 0x49f) DeviceName = "Lw110"; + SetInfo("カメラ型番", DeviceName); + SerialNumber = lumVersion[id].SerialNumber.ToString(); + SetInfo("カメラSN", SerialNumber); + + // カメラを開く + _hCam = api.CameraOpen(1); + if (_hCam == IntPtr.Zero) { + ErrorMsg = "カメラの接続に失敗しました.\r\n他のアプリケーションでカメラを使用していないか確認してください."; + return false; + } + + // プレビューコールバックの登録 + _callbackHandler = new dll.LucamRgbPreviewCallback(PreviewCallback); + _callbackId = dll.LucamAddRgbPreviewCallback(_hCam, _callbackHandler, IntPtr.Zero, dll.LucamPixelFormat.PF_24); + if (_callbackId == -1) { + ErrorMsg = "コールバックの登録に失敗しました"; + return false; + } + + SetCameraParam(); // カメラパラメータの設定 + + StartStopPreview(); // プレビュー開始 + + return true; + } + + /// + /// プレビュー開始・停止 + /// + /// + public bool StartStopPreview() { + if (_isPreview) { + // プレビュー停止 + var ret = dll.LucamStreamVideoControl(_hCam, dll.LucamStreamMode.STOP_STREAMING, _picPreview.Handle.ToInt32()); + Debug.WriteLine("プレビュー停止"); + if (!ret) return false; + _isPreview = false; + return true; + } else { + // プレビュー開始 + var ret = dll.LucamStreamVideoControl(_hCam, dll.LucamStreamMode.START_DISPLAY, _picPreview.Handle.ToInt32()); + if (!ret) return false; + _isPreview = true; + return true; + } + } + + /// + /// プレビューコールバック + /// + /// + /// データポインタ + /// データサイズ + /// + void PreviewCallback(IntPtr pContext, IntPtr pData, int n, uint unused) { + using (Mat img = Mat.FromPixelData(_snap.Format.Height, _snap.Format.Width, MatType.CV_8UC3, pData)) { + using (Mat imgt = img.T()) { + _bmps[_bmpIndex] = imgt.ToBitmap(); + ProcessCalibrationFrame(imgt); + } + } + _form.ShowImage(_bmps[_bmpIndex]); + _bmpIndex = (_bmpIndex + 1) % 2; + if (_bmps[_bmpIndex] != null) _bmps[_bmpIndex].Dispose(); + } + + /// + /// ゲイン/ホワイトバランスの反映(Lucam 固有) + /// + /// 白パッチの計測値 + protected override void ApplyWhiteBalance(Scalar whitePatch) { + _snap.GainBlue *= GetRatio((float)whitePatch.Val0, Config.GetFloat("Calib/Reference/B")); + _snap.GainGrn1 *= GetRatio((float)whitePatch.Val1, Config.GetFloat("Calib/Reference/G")); + _snap.GainGrn2 = _snap.GainGrn1; + _snap.GainRed *= GetRatio((float)whitePatch.Val2, Config.GetFloat("Calib/Reference/R")); + SetCameraParam(); + } + + /// + /// 校正収束時のゲイン値ログ出力(Lucam 固有) + /// CalcTcc の前に呼ばれ,元コードの Debug.WriteLine 順序を再現する. + /// + protected override void LogCalibrationConverged() { + Debug.WriteLine($"Gain Blue : {_snap.GainBlue}"); + Debug.WriteLine($"Gain Green: {_snap.GainGrn1}"); + Debug.WriteLine($"Gain Red : {_snap.GainRed}"); + } + + /// + /// 校正完了時のカメラ情報記録(Lucam 固有) + /// CalcTcc の後に呼ばれ,SetInfo で各値を保存する. + /// + /// 処理対象 Mat + protected override void RecordCalibrationInfo(Mat imgt) { + SetInfo("Exposure(ms)", $"{_snap.Exposure}"); + SetInfo("Gain", $"{_snap.Gain}"); + SetInfo("Gain B", $"{_snap.GainBlue}"); + SetInfo("Gain G", $"{_snap.GainGrn1}"); + SetInfo("Gain R", $"{_snap.GainRed}"); + SetInfo("画像幅", $"{imgt.Width}"); + SetInfo("画像高さ", $"{imgt.Height}"); + } + + /// + /// 撮影 + /// + /// + /// + protected override void Shot(int numImages=1, int interval=0) { + SetSnapParam(); + + _shots = new BlockingCollection(); + var thread = new Thread(() => SaveThread(numImages)); + thread.Start(); + + BeginShot(); + RunShotLoop(numImages, interval); + EndShot(); + } + + /// + /// 撮影開始処理(Lucam 固有) + /// + protected override void BeginShot() { + dll.LucamEnableFastFrames(_hCam, ref _snap); + var imageSize = _snap.Format.Width * _snap.Format.Height; + _rawImage = new byte[imageSize]; + _rgbImage = new byte[imageSize * 3]; + } + + /// + /// 1 フレーム取得(Lucam 固有) + /// + /// 撮影した Mat(呼び出し元が _shots に追加する) + protected override Mat CaptureFrame() { + var ret = dll.LucamTakeFastFrame(_hCam, _rawImage); + //Debug.WriteLine(ret); + + dll.LucamConvertFrameToRgb24(_hCam, _rgbImage, _rawImage, + _snap.Format.Width, _snap.Format.Height, dll.LucamPixelFormat.PF_8, ref _convert); + using (Mat img = Mat.FromPixelData(_snap.Format.Height, _snap.Format.Width, MatType.CV_8UC3, _rgbImage)) { + return img.T(); + } + } + + /// + /// 撮影終了処理(Lucam 固有) + /// + protected override void EndShot() { + _rgbImage = null; + _rawImage = null; + dll.LucamDisableFastFrames(_hCam); + } + + /// + /// 撮影パラメータの設定 + /// + private void SetSnapParam() { + dll.LucamPropertyFlag flag; + dll.LucamGetProperty(_hCam, dll.LucamProperty.EXPOSURE, out _snap.Exposure, out flag); + dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN, out _snap.Gain, out flag); + dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_BLUE, out _snap.GainBlue, out flag); + dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_GREEN1, out _snap.GainGrn1, out flag); + dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_GREEN2, out _snap.GainGrn2, out flag); + dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_RED, out _snap.GainRed, out flag); + Debug.WriteLine($"SetSnapParam Exp {_snap.Exposure} Gain {_snap.Gain} GainBlue {_snap.GainBlue} GainGrn1 {_snap.GainGrn1} GainGrn2 {_snap.GainGrn2} GainRed {_snap.GainRed}"); + } + + /// + /// カメラパラメータの設定 + /// + private void SetCameraParam() { + var flag = dll.LucamPropertyFlag.NONE; + dll.LucamSetProperty(_hCam, dll.LucamProperty.EXPOSURE, _snap.Exposure, flag); + dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN, _snap.Gain, flag); + dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_BLUE, _snap.GainBlue, flag); + dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_GREEN1, _snap.GainGrn1, flag); + dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_GREEN2, _snap.GainGrn2, flag); + dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_RED, _snap.GainRed, flag); + Debug.WriteLine($"SetCameraParam Exp {_snap.Exposure} Gain {_snap.Gain} GainBlue {_snap.GainBlue} GainGrn1 {_snap.GainGrn1} GainGrn2 {_snap.GainGrn2} GainRed {_snap.GainRed}"); + } + + + /// + /// カメラ切断 + /// + public override void Disconnect() { + if (_hCam != IntPtr.Zero) { + if (_isPreview) { + StartStopPreview(); + } + api.CameraClose(_hCam); + _hCam = IntPtr.Zero; + Debug.WriteLine("カメラ切断"); + } + } + } +} diff --git a/TIASshot/ChartDetection/ChartDetector.cs b/TIASshot/ChartDetection/ChartDetector.cs new file mode 100644 index 0000000..94597b8 --- /dev/null +++ b/TIASshot/ChartDetection/ChartDetector.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using OpenCvSharp; +using OpenCvSharp.Aruco; + +namespace TIASshot { + /// + /// 舌診チャートの検出(ARマーカー検出・固定判定・ホモグラフィ計算・マスク生成)を担うクラス. + /// CameraBase から委譲される.フォーム通知は呼び出し側が提供する. + /// + internal class ChartDetector { + + readonly Dictionary ARDict = CvAruco.GetPredefinedDictionary(PredefinedDictionaryName.Dict4X4_50); + readonly Point2f[] PointsDst40 = new Point2f[] { + new Point2f(345, 130),new Point2f(465, 130),new Point2f(465, 250),new Point2f(345, 250), + }; + readonly Point2f[] PointsDst41 = new Point2f[]{ + new Point2f(345, 1200), new Point2f(465, 1200), new Point2f(465, 1320), new Point2f(345, 1320), + }; + int _detectionCount = 0; + Point2f _lastPosition = new Point2f(0, 0); + + // 状態表示(呼び出し側が提供) + readonly Action _showMessage; + + public ChartDetector(Action showMessage) { + _showMessage = showMessage; + } + + /// + /// チャートの検出.固定が確認できた場合のみチャートマスク(24 枚)を返す. + /// 未検出・上下逆・未固定の場合は null を返す. + /// + /// + /// チャートマスクリスト,または null + public List DetectChart(Mat img) { + + // ARマーカー検出 + CvAruco.DetectMarkers(img, ARDict, out var corners, out var ids, + new DetectorParameters(), out var rejectedImgPoints); + if (ids.Length < 1) return null; + + // マーカー座標格納 + var ptsPict = new List(); + var ptsModel = new List(); + Point2f position = new Point2f(); + float y40 = 0, y41 = 0; + for (int i = 0; i < ids.Length; i++) { + if (ids[i] == 40) { + ptsPict.AddRange(corners[i]); + ptsModel.AddRange(PointsDst40); + position = corners[i][3]; + y40 = corners[i][3].Y; + } + if (ids[i] == 41) { + ptsPict.AddRange(corners[i]); + ptsModel.AddRange(PointsDst41); + y41 = corners[i][3].Y; + } + } + if (ptsPict.Count < 8) return null; + if (y40 > y41) { + _showMessage("舌診チャートが上下逆方向です"); + return null; + } + + // チャートの固定判定 + _showMessage("舌診チャートの検出中"); + var dist = (float)position.DistanceTo(_lastPosition); + if (dist < Config.GetFloat("Calib/ChartSetCriteria")) { + _detectionCount++; + } else { + _detectionCount = 0; + } + _lastPosition = position; + if (_detectionCount < Config.GetInt("Calib/ChartSetCount")) return null; + + // ホモグラフィの計算 + var matPtsPict = Mat.FromArray(ptsPict); + var matPtsModel = Mat.FromArray(ptsModel); + var matH = Cv2.FindHomography(matPtsModel, matPtsPict); + var imgF = new Mat(1545, 810, MatType.CV_8UC3); + Cv2.WarpPerspective(img, imgF, matH, imgF.Size()); + + // チャートマスク作成 + var chartMasks = new List(); + var roiSize = ptsPict.Count < 8 ? 60 : 80; + for (int i = 0; i < 24; i++) { + var row = i % 6; + var col = i / 6; + var x = 581 - col * 144 + (ptsPict.Count < 8 ? 10 : 0); + var y = 318 + row * 144 + (ptsPict.Count < 8 ? 10 : 0); + var roi = new Rect(x, y, roiSize, roiSize); + using (var mask = new Mat(1545, 810, MatType.CV_8U)) { + Cv2.Rectangle(mask, roi, new Scalar(255), Cv2.FILLED); + var maskF = new Mat(img.Size(), MatType.CV_8U); + Cv2.WarpPerspective(mask, maskF, matH, maskF.Size()); + chartMasks.Add(maskF); + } + } + + _showMessage("舌診チャート検出 校正中"); + return chartMasks; + } + } +} diff --git a/TIASshot/ColorCorrection/ColorCorrector.cs b/TIASshot/ColorCorrection/ColorCorrector.cs new file mode 100644 index 0000000..eadebea --- /dev/null +++ b/TIASshot/ColorCorrection/ColorCorrector.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using OpenCvSharp; + +namespace TIASshot { + /// + /// 色補正処理(TCC 変換行列の計算・色変換)を担うクラス. + /// CameraBase から委譲される.チャート検出・ファイル I/O は呼び出し側に委ねる. + /// + internal class ColorCorrector { + + // 参照値(変換目標) + readonly Mat TCC_SRGB; + readonly Mat TCC_XYZ; + + // 処理するチャネル数 + readonly int[] ChannelList; + + // 計算済み RGB→sRGB 変換行列(チャネル数ごと) + readonly Dictionary _convRGB2SRGB = new Dictionary(); + + readonly int[][] ExtendChannels = new int[][] + { + new int[] { 3, 3, 3 }, // 1 + new int[] { 0, 3, 3 }, // R + new int[] { 1, 3, 3 }, // G + new int[] { 2, 3, 3 }, // B + new int[] { 0, 1, 3 }, // RG + new int[] { 0, 2, 3 }, // RB + new int[] { 1, 2, 3 }, // GB + new int[] { 0, 0, 3 }, // RR + new int[] { 1, 1, 3 }, // GG + new int[] { 2, 2, 3 }, // BB + new int[] { 0, 0, 2 }, // RRB + new int[] { 0, 0, 1 }, // RRG + new int[] { 1, 1, 0 }, // GGR + new int[] { 1, 1, 2 }, // GGB + new int[] { 2, 2, 0 }, // BBR + new int[] { 2, 2, 1 }, // BBG + new int[] { 0, 1, 2 }, // RGB + }; + + /// + /// 色補正クラス(テスト用:チャネル配列を直接受け取る) + /// + /// sRGB 変換の参照値(24x3) + /// XYZ 変換の参照値(24x3) + /// 処理対象のチャネル数一覧 + internal ColorCorrector(Mat tccSrgb, Mat tccXyz, int[] channelList) { + TCC_SRGB = tccSrgb; + TCC_XYZ = tccXyz; + ChannelList = channelList; + } + + /// + /// 色補正クラス + /// + /// sRGB 変換の参照値(24x3) + /// XYZ 変換の参照値(24x3) + public ColorCorrector(Mat tccSrgb, Mat tccXyz) + : this(tccSrgb, tccXyz, + Config.GetString("Calib/ConversionChannels") + .Split(',') + .Select(x => int.Parse(x.Trim())) + .Where(x => x >= 4 && x <= 17) + .Distinct() + .OrderBy(x => x) + .ToArray()) { + } + + /// sRGB 参照値が読み込めているか + public bool SrgbRefLoaded => TCC_SRGB != null; + + /// XYZ 参照値が読み込めているか + public bool XyzRefLoaded => TCC_XYZ != null; + + /// 処理対象のチャネル数一覧 + public IEnumerable Channels => ChannelList; + + /// + /// チャートの RGB 値に基づいて変換行列を計算し,CSV に保存する. + /// + /// チャート 24 色票の RGB 値(24x3) + /// 保存先フォルダ + /// Mat を CSV へ保存する処理(呼び出し側が提供) + public void CalcTcc(Mat tccRgb, string saveFolder, Action saveMatToCsv) { + + saveMatToCsv(Path.Combine(saveFolder, Config.GetString("File/TccRgbValues")), tccRgb); + + // 再校正時,古い変換行列のネイティブ資源を解放してから作り直す(Mat リーク防止) + foreach (var mat in _convRGB2SRGB.Values) { + mat.Dispose(); + } + _convRGB2SRGB.Clear(); + + foreach (var channel in ChannelList) { + var convRGB2SRGB = CalcConvertMatrix(tccRgb, TCC_SRGB, channel); + saveMatToCsv(Path.Combine(saveFolder, GetFilenameWithChannel("File/ConvRgb2Srgb", channel)), convRGB2SRGB); + + // 以降の中間 Mat は辞書に保持しないため,使用後に確実に解放する + using (var convRGB2XYZ = CalcConvertMatrix(tccRgb, TCC_XYZ, channel)) { + saveMatToCsv(Path.Combine(saveFolder, GetFilenameWithChannel("File/ConvRgb2Xyz", channel)), convRGB2XYZ); + if (channel == 17) { + using (var convOld = new Mat(convRGB2XYZ.Size(), MatType.CV_64FC1)) { + for (var row = 0; row < convRGB2XYZ.Rows; row++) { + var rowFrom = (row + 1) % convRGB2XYZ.Rows; // 1行ずらす + for (var col = 0; col < convRGB2XYZ.Cols; col++) { + convOld.At(row, col) = convRGB2XYZ.At(rowFrom, col); + } + } + saveMatToCsv(Path.Combine(saveFolder, GetFilenameWithChannel("File/ConvRgb2XyzOld", channel)), convOld); + } + } + } + + using (var tccSrgb = ConvertColor(tccRgb, convRGB2SRGB)) { + saveMatToCsv(Path.Combine(saveFolder, GetFilenameWithChannel("File/TccSrgbValues", channel)), tccSrgb); + + using (var convSrgb2Xyz = CalcConvertMatrix(tccSrgb, TCC_XYZ, channel)) { + saveMatToCsv(Path.Combine(saveFolder, GetFilenameWithChannel("File/ConvSrgb2Xyz", channel)), convSrgb2Xyz); + } + + // 変換精度検証 + var diff = Math.Sqrt(Cv2.Norm(TCC_SRGB, tccSrgb, NormTypes.L2)); + Debug.WriteLine($"{channel}次元 RGB→SRGB 変換行列の誤差 = {diff:.000}"); + } + + // convRGB2SRGB は辞書に保持するため解放しない(ConvertImage で使用) + _convRGB2SRGB.Add(channel, convRGB2SRGB); + } + } + + /// + /// 指定チャネル数の変換行列で画像を色変換する. + /// + /// + /// + /// 8bit 画像 + public Mat ConvertImage(Mat src, int channel) { + return ConvertImage(src, _convRGB2SRGB[channel]); + } + + /// + /// ファイル名にチャネル数を追加する + /// + /// + /// + /// + private string GetFilenameWithChannel(string config, int channel) { + var filename = Config.GetString(config); + filename = filename.Replace("{CN}", $"{channel:00}"); + return filename; + } + + /// + /// 変換行列算出 + /// + /// 画像 + /// 変換目標の24x3行列 + internal Mat CalcConvertMatrix(Mat src, Mat target, int channels) { + var extended = ExtendMat(src, channels); + Mat convMat = new Mat(channels, 3, MatType.CV_64FC1); + Cv2.Solve(extended, target, convMat, DecompTypes.SVD); + return convMat; + } + + /// + /// 色変換 + /// + /// + /// + /// + internal Mat ConvertColor(Mat src, Mat conv) { + var extended = ExtendMat(src, conv.Rows); + var converted = (extended * conv); + return converted.ToMat(); + } + + /// + /// 8bitクリッピング処理 ForEachAsVec3d用 + /// + /// + /// + unsafe void Clip8bit(Vec3d* p, int* pos) { + p->Item0 = Math.Max(0, Math.Min(255.0, p->Item0)); + p->Item1 = Math.Max(0, Math.Min(255.0, p->Item1)); + p->Item2 = Math.Max(0, Math.Min(255.0, p->Item2)); + } + + /// + /// 画像の色変換.中間 Mat は入れ子 using で確実に解放する. + /// + /// + /// + /// 8bit 画像 + internal Mat ConvertImage(Mat src, Mat conv) { + if (src.Type() != MatType.CV_64FC3) { + src.ConvertTo(src, MatType.CV_64FC3); + } + using (var flatten = src.Reshape(3, src.Height * src.Width)) + using (var extended = ExtendMat(flatten, conv.Rows)) + using (var converted = (extended * conv).ToMat()) + using (var convertedImage = converted.Reshape(3, src.Height)) { + //Clipping to 8bit range + //unsafe { + // convertedImage.ForEachAsVec3d(Clip8bit); + //} + + var convImg8 = new Mat(); + convertedImage.ConvertTo(convImg8, MatType.CV_8UC3); + return convImg8; + } + } + + /// + /// 行列の拡張 3次元→高次元(指定チャンネル数) + /// + /// + /// + internal Mat ExtendMat(Mat src, int channels) { + if (src.Cols * src.Channels() != 3) return src; + var dst = new Mat(src.Rows, channels, MatType.CV_64FC1); + Parallel.For(0, src.Rows, row => { + var vals = new double[] { + src.Cols == 1 ? src.At(row, 0)[2] : src.At(row, 2), // R + src.Cols == 1 ? src.At(row, 0)[1] : src.At(row, 1), // G + src.Cols == 1 ? src.At(row, 0)[0] : src.At(row, 0), // B + 1.0 + }; + for (int i = 0; i < channels; i++) { + dst.At(row, i) = vals[ExtendChannels[i][0]] * vals[ExtendChannels[i][1]] * vals[ExtendChannels[i][2]]; + } + }); + return dst; + } + } +} diff --git a/TIASshot/Config.cs b/TIASshot/Config.cs index 9dc0629..9431682 100644 --- a/TIASshot/Config.cs +++ b/TIASshot/Config.cs @@ -19,11 +19,19 @@ public static void Load() { try { doc.Load(configFile); - } catch (Exception) { + } catch (Exception) { } } /// + /// 指定したパスの設定ファイルを読み込む(テスト用) + /// + /// 読み込む XML ファイルのパス + internal static void Load(string path) { + doc.Load(path); + } + + /// /// 設定ファイル読み込み判定 /// /// diff --git a/TIASshot/Form1.Designer.cs b/TIASshot/Form1.Designer.cs deleted file mode 100644 index bfeeb14..0000000 --- a/TIASshot/Form1.Designer.cs +++ /dev/null @@ -1,387 +0,0 @@ -namespace TIASshot { - partial class Form1 { - /// - /// 必要なデザイナー変数です。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 使用中のリソースをすべてクリーンアップします。 - /// - /// マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。 - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows フォーム デザイナーで生成されたコード - - /// - /// デザイナー サポートに必要なメソッドです。このメソッドの内容を - /// コード エディターで変更しないでください。 - /// - private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); - this.btnShotOne = new System.Windows.Forms.Button(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.txtDeviceName = new System.Windows.Forms.TextBox(); - this.txtSerialNo = new System.Windows.Forms.TextBox(); - this.picPreview = new System.Windows.Forms.PictureBox(); - this.picDisplay = new System.Windows.Forms.PictureBox(); - this.btnShotMulti = new System.Windows.Forms.Button(); - this.btnCalib = new System.Windows.Forms.Button(); - this.txtMessage = new System.Windows.Forms.TextBox(); - this.txtSaveFolder = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.txtDataName = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.txtNumMultiShots = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.txtMultiShotsInterval = new System.Windows.Forms.TextBox(); - this.label8 = new System.Windows.Forms.Label(); - this.btnOpenDataFolder = new System.Windows.Forms.Button(); - this.btnLightSW = new System.Windows.Forms.Button(); - this.icImagingControl1 = new TIS.Imaging.ICImagingControl(); - this.txtConvElemNum = new System.Windows.Forms.TextBox(); - this.label9 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.picPreview)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.picDisplay)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.icImagingControl1)).BeginInit(); - this.SuspendLayout(); - // - // btnShotOne - // - this.btnShotOne.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.btnShotOne.Location = new System.Drawing.Point(15, 176); - this.btnShotOne.Name = "btnShotOne"; - this.btnShotOne.Size = new System.Drawing.Size(268, 47); - this.btnShotOne.TabIndex = 0; - this.btnShotOne.Text = "1枚撮影"; - this.btnShotOne.UseVisualStyleBackColor = true; - this.btnShotOne.Click += new System.EventHandler(this.btnShot1_Click); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(40, 16); - this.label1.TabIndex = 1; - this.label1.Text = "カメラ"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label2.Location = new System.Drawing.Point(157, 9); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(35, 16); - this.label2.TabIndex = 1; - this.label2.Text = "S/N"; - // - // txtDeviceName - // - this.txtDeviceName.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtDeviceName.Location = new System.Drawing.Point(51, 6); - this.txtDeviceName.Name = "txtDeviceName"; - this.txtDeviceName.ReadOnly = true; - this.txtDeviceName.Size = new System.Drawing.Size(106, 23); - this.txtDeviceName.TabIndex = 2; - // - // txtSerialNo - // - this.txtSerialNo.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtSerialNo.Location = new System.Drawing.Point(192, 6); - this.txtSerialNo.Name = "txtSerialNo"; - this.txtSerialNo.ReadOnly = true; - this.txtSerialNo.Size = new System.Drawing.Size(94, 23); - this.txtSerialNo.TabIndex = 3; - // - // picPreview - // - this.picPreview.Location = new System.Drawing.Point(12, 565); - this.picPreview.Name = "picPreview"; - this.picPreview.Size = new System.Drawing.Size(79, 57); - this.picPreview.TabIndex = 4; - this.picPreview.TabStop = false; - this.picPreview.Visible = false; - // - // picDisplay - // - this.picDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.picDisplay.Location = new System.Drawing.Point(292, 6); - this.picDisplay.Name = "picDisplay"; - this.picDisplay.Size = new System.Drawing.Size(449, 610); - this.picDisplay.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.picDisplay.TabIndex = 5; - this.picDisplay.TabStop = false; - // - // btnShotMulti - // - this.btnShotMulti.AllowDrop = true; - this.btnShotMulti.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.btnShotMulti.Location = new System.Drawing.Point(15, 316); - this.btnShotMulti.Name = "btnShotMulti"; - this.btnShotMulti.Size = new System.Drawing.Size(268, 49); - this.btnShotMulti.TabIndex = 6; - this.btnShotMulti.Text = "連続撮影"; - this.btnShotMulti.UseVisualStyleBackColor = true; - this.btnShotMulti.Click += new System.EventHandler(this.btnShotMulti_Click); - // - // btnCalib - // - this.btnCalib.AllowDrop = true; - this.btnCalib.Location = new System.Drawing.Point(100, 579); - this.btnCalib.Name = "btnCalib"; - this.btnCalib.Size = new System.Drawing.Size(88, 37); - this.btnCalib.TabIndex = 7; - this.btnCalib.Text = "校正"; - this.btnCalib.UseVisualStyleBackColor = true; - this.btnCalib.Visible = false; - this.btnCalib.Click += new System.EventHandler(this.btnCalib_Click); - // - // txtMessage - // - this.txtMessage.BackColor = System.Drawing.Color.LemonChiffon; - this.txtMessage.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtMessage.Location = new System.Drawing.Point(15, 45); - this.txtMessage.Name = "txtMessage"; - this.txtMessage.ReadOnly = true; - this.txtMessage.Size = new System.Drawing.Size(268, 26); - this.txtMessage.TabIndex = 9; - this.txtMessage.Text = "舌診チャートを設置してください."; - // - // txtSaveFolder - // - this.txtSaveFolder.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtSaveFolder.Location = new System.Drawing.Point(78, 418); - this.txtSaveFolder.Name = "txtSaveFolder"; - this.txtSaveFolder.ReadOnly = true; - this.txtSaveFolder.Size = new System.Drawing.Size(205, 23); - this.txtSaveFolder.TabIndex = 10; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label3.Location = new System.Drawing.Point(12, 395); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(123, 16); - this.label3.TabIndex = 11; - this.label3.Text = "データ保存フォルダ"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label4.Location = new System.Drawing.Point(12, 95); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(60, 16); - this.label4.TabIndex = 12; - this.label4.Text = "データ名"; - // - // txtDataName - // - this.txtDataName.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtDataName.Location = new System.Drawing.Point(15, 114); - this.txtDataName.Name = "txtDataName"; - this.txtDataName.Size = new System.Drawing.Size(268, 23); - this.txtDataName.TabIndex = 13; - this.txtDataName.Text = "なし"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label5.Location = new System.Drawing.Point(12, 261); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(103, 16); - this.label5.TabIndex = 14; - this.label5.Text = "連続撮影枚数"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label6.Location = new System.Drawing.Point(12, 290); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(71, 16); - this.label6.TabIndex = 15; - this.label6.Text = "撮影間隔"; - // - // txtNumMultiShots - // - this.txtNumMultiShots.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtNumMultiShots.Location = new System.Drawing.Point(121, 258); - this.txtNumMultiShots.Name = "txtNumMultiShots"; - this.txtNumMultiShots.Size = new System.Drawing.Size(67, 23); - this.txtNumMultiShots.TabIndex = 16; - this.txtNumMultiShots.Text = "5"; - this.txtNumMultiShots.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label7.Location = new System.Drawing.Point(194, 261); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(23, 16); - this.label7.TabIndex = 17; - this.label7.Text = "枚"; - // - // txtMultiShotsInterval - // - this.txtMultiShotsInterval.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtMultiShotsInterval.Location = new System.Drawing.Point(121, 287); - this.txtMultiShotsInterval.Name = "txtMultiShotsInterval"; - this.txtMultiShotsInterval.Size = new System.Drawing.Size(67, 23); - this.txtMultiShotsInterval.TabIndex = 18; - this.txtMultiShotsInterval.Text = "1000"; - this.txtMultiShotsInterval.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label8.Location = new System.Drawing.Point(194, 290); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(42, 16); - this.label8.TabIndex = 19; - this.label8.Text = "ミリ秒"; - // - // btnOpenDataFolder - // - this.btnOpenDataFolder.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.btnOpenDataFolder.Location = new System.Drawing.Point(15, 414); - this.btnOpenDataFolder.Name = "btnOpenDataFolder"; - this.btnOpenDataFolder.Size = new System.Drawing.Size(57, 27); - this.btnOpenDataFolder.TabIndex = 20; - this.btnOpenDataFolder.Text = "開く"; - this.btnOpenDataFolder.UseVisualStyleBackColor = true; - this.btnOpenDataFolder.Click += new System.EventHandler(this.btnOpenDataFolder_Click); - // - // btnLightSW - // - this.btnLightSW.AllowDrop = true; - this.btnLightSW.Location = new System.Drawing.Point(173, 517); - this.btnLightSW.Name = "btnLightSW"; - this.btnLightSW.Size = new System.Drawing.Size(110, 37); - this.btnLightSW.TabIndex = 21; - this.btnLightSW.Text = "照明 OFF"; - this.btnLightSW.UseVisualStyleBackColor = true; - this.btnLightSW.Click += new System.EventHandler(this.btnLightSW_Click); - // - // icImagingControl1 - // - this.icImagingControl1.BackColor = System.Drawing.Color.White; - this.icImagingControl1.DeviceListChangedExecutionMode = TIS.Imaging.EventExecutionMode.Invoke; - this.icImagingControl1.DeviceLostExecutionMode = TIS.Imaging.EventExecutionMode.AsyncInvoke; - this.icImagingControl1.ImageAvailableExecutionMode = TIS.Imaging.EventExecutionMode.MultiThreaded; - this.icImagingControl1.LiveDisplayPosition = new System.Drawing.Point(0, 0); - this.icImagingControl1.Location = new System.Drawing.Point(12, 505); - this.icImagingControl1.Name = "icImagingControl1"; - this.icImagingControl1.Size = new System.Drawing.Size(79, 54); - this.icImagingControl1.TabIndex = 22; - this.icImagingControl1.Visible = false; - // - // txtConvElemNum - // - this.txtConvElemNum.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.txtConvElemNum.Location = new System.Drawing.Point(173, 463); - this.txtConvElemNum.Name = "txtConvElemNum"; - this.txtConvElemNum.ReadOnly = true; - this.txtConvElemNum.Size = new System.Drawing.Size(110, 23); - this.txtConvElemNum.TabIndex = 23; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label9.Location = new System.Drawing.Point(12, 466); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(148, 16); - this.label9.TabIndex = 24; - this.label9.Text = "変換行列の説明変数"; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(753, 634); - this.Controls.Add(this.label9); - this.Controls.Add(this.txtConvElemNum); - this.Controls.Add(this.icImagingControl1); - this.Controls.Add(this.btnLightSW); - this.Controls.Add(this.btnOpenDataFolder); - this.Controls.Add(this.label8); - this.Controls.Add(this.txtMultiShotsInterval); - this.Controls.Add(this.label7); - this.Controls.Add(this.txtNumMultiShots); - this.Controls.Add(this.label6); - this.Controls.Add(this.label5); - this.Controls.Add(this.txtDataName); - this.Controls.Add(this.label4); - this.Controls.Add(this.label3); - this.Controls.Add(this.txtSaveFolder); - this.Controls.Add(this.txtMessage); - this.Controls.Add(this.btnCalib); - this.Controls.Add(this.btnShotMulti); - this.Controls.Add(this.picDisplay); - this.Controls.Add(this.picPreview); - this.Controls.Add(this.txtSerialNo); - this.Controls.Add(this.txtDeviceName); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.btnShotOne); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "Form1"; - this.Text = "Form1"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); - this.Load += new System.EventHandler(this.Form1_Load); - this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); - ((System.ComponentModel.ISupportInitialize)(this.picPreview)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.picDisplay)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.icImagingControl1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnShotOne; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtDeviceName; - private System.Windows.Forms.TextBox txtSerialNo; - private System.Windows.Forms.PictureBox picPreview; - private System.Windows.Forms.PictureBox picDisplay; - private System.Windows.Forms.Button btnShotMulti; - private System.Windows.Forms.Button btnCalib; - private System.Windows.Forms.TextBox txtMessage; - private System.Windows.Forms.TextBox txtSaveFolder; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtDataName; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.TextBox txtNumMultiShots; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.TextBox txtMultiShotsInterval; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.Button btnOpenDataFolder; - private System.Windows.Forms.Button btnLightSW; - private TIS.Imaging.ICImagingControl icImagingControl1; - private System.Windows.Forms.TextBox txtConvElemNum; - private System.Windows.Forms.Label label9; - } -} - diff --git a/TIASshot/Form1.cs b/TIASshot/Form1.cs deleted file mode 100644 index 90b801c..0000000 --- a/TIASshot/Form1.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Drawing; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.Windows.Interop; -using System.Windows.Media.Media3D; -using System.Xml.Serialization; -using TIS.Imaging; - -namespace TIASshot { - public partial class Form1 : Form { - - private CameraBase _camera; - public static string APP_NAME = "TIAS Shot"; - private LightSource _light = new LightSource(); - private bool _isLightOn = true; - private PreviewMonitor _previewMonitor; - private Bitmap _dispBuf = null; - private bool _isUpdateBuf = false; - - - /// - /// コンストラクタ - /// - public Form1() { - InitializeComponent(); - - var version = Assembly.GetExecutingAssembly().GetName().Version; - Text = $"{APP_NAME} ver.{version.Major}.{version.Minor}"; -#if DEBUG - Text += " [DEBUG]"; -#endif - } - - /// - /// フォームロード - /// - /// - /// - private void Form1_Load(object sender, EventArgs e) { - Config.Load(); - - _camera = new Lucam(this, picPreview); - if (!_camera.Connect()) { - Debug.WriteLine(_camera.ErrorMsg); - Debug.WriteLine("Lucamの接続に失敗しました"); - _camera = null; - } - - if (_camera == null) { - var cameraList = icImagingControl1.Devices.Select(d => d.Name.Replace(" ", "")); - foreach (var cam in cameraList) { - _camera = new IScam(this, icImagingControl1, cam); - if (_camera.Connect()) break; - Debug.WriteLine(_camera.ErrorMsg); - Debug.WriteLine($"{cam}の接続に失敗しました"); - _camera = null; - } - } - - if (_camera == null) { - MessageBox.Show("カメラが見つかりません.終了します.", APP_NAME, - MessageBoxButtons.OK, MessageBoxIcon.Warning); - Close(); - return; - } - - txtDeviceName.Text = _camera.DeviceName; - txtSerialNo.Text = _camera.SerialNumber; - txtNumMultiShots.Text = Config.GetString("Shot/MultiShotCount"); - txtMultiShotsInterval.Text = Config.GetString("Shot/MultiShotInterval"); - txtDataName.Text = Config.GetString("Shot/SubjectName"); - txtSaveFolder.Text = Config.GetString("File/SaveFolder"); - txtConvElemNum.Text = Config.GetString("Calib/ConversionChannels"); - EnableShots(false); - //_lucam.StartStopPreview(); - - if (_light.Open()) { - _light.SetLight(); - } else { - Debug.WriteLine("光源の接続に失敗しました"); - btnLightSW.Enabled = false; - } - - _previewMonitor = new PreviewMonitor(); - if (_previewMonitor.IsShown) _previewMonitor.Show(); - } - - /// - /// フォームクローズ - /// - /// - /// - private void Form1_FormClosing(object sender, FormClosingEventArgs e) { - if (_camera == null) return; - _camera.Disconnect(); - } - - /// - /// 画像撮影1枚 - /// - /// - /// - private void btnShot1_Click(object sender, EventArgs e) { - EnableShots(false); - _camera.ShotOne(); - } - - /// - /// 複数画像撮影 - /// - /// - /// - private void btnShotMulti_Click(object sender, EventArgs e) { - EnableShots(false); - _camera.ShotMulti(); - } - - /// - /// 校正 - /// - /// - /// - private void btnCalib_Click(object sender, EventArgs e) { - //_lucam.Calibration(); - } - - /// - /// 画像表示 - /// ワーカースレッドから呼び出される - /// - /// - public void ShowImage(Bitmap bmp) { - var bmp2 = new Bitmap(bmp); - _dispBuf = bmp; - _isUpdateBuf = true; - Invalidate(); - - if (_previewMonitor!=null && _previewMonitor.IsShown) { - _previewMonitor.UpdateImage(bmp2); - } - } - - /// - /// プレビューウィンドウの再描画 - /// - /// - /// - private void Form1_Paint(object sender, PaintEventArgs e) { - if (!_isUpdateBuf || _dispBuf == null) return; - - picDisplay.Image?.Dispose(); - picDisplay.Image = _dispBuf; - _isUpdateBuf = false; - } - - /// - /// メッセージ表示 - /// - /// - public void ShowMessage(string msg) { - if (InvokeRequired) { - Invoke((MethodInvoker)delegate { ShowMessage(msg); }); - return; - } - txtMessage.Text = msg; - txtMessage.Update(); - } - - /// - /// データ名取得 - /// - /// - public string GetDataName() { - if (InvokeRequired) { - return (string)Invoke((MethodInvoker)delegate { GetDataName(); }); - } - return txtDataName.Text; - } - - /// - /// マルチショット撮影の枚数取得 - /// - /// - public int GetNumMultiShots() { - if (InvokeRequired) { - return (int)Invoke((MethodInvoker)delegate { GetNumMultiShots(); }); - } - if (int.TryParse(txtNumMultiShots.Text, out int result)) return result; - return 1; - } - - /// - /// マルチショット撮影の間隔取得 - /// - /// - public int GetMultiShotsInterval() { - if (InvokeRequired) { - return (int)Invoke((MethodInvoker)delegate { GetMultiShotsInterval(); }); - } - if (int.TryParse(txtMultiShotsInterval.Text, out int result)) return result; - return 1000; - } - - /// - /// 撮影ボタン有効化 - /// - /// - public void EnableShots(bool enable = true) { - if (InvokeRequired) { - Invoke((MethodInvoker)delegate { EnableShots(enable); }); - return; - } - btnShotOne.Enabled = enable; - btnShotMulti.Enabled = enable; - } - - /// - /// データフォルダを開く - /// - /// - /// - private void btnOpenDataFolder_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start(txtSaveFolder.Text); - } - - /// - /// 光源のON/OFF切り替え - /// - /// - /// - private void btnLightSW_Click(object sender, EventArgs e) { - if (!_light.IsOpen || _camera.IsCalibrating) return; - if (_isLightOn) { - _light.TurnOff(); - btnLightSW.Text = "照明 ON"; - _isLightOn = false; - } else { - _light.SetLight(); - btnLightSW.Text = "照明 OFF"; - _isLightOn = true; - } - } - } -} diff --git a/TIASshot/Form1.resx b/TIASshot/Form1.resx deleted file mode 100644 index dae2b47..0000000 --- a/TIASshot/Form1.resx +++ /dev/null @@ -1,3540 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - AAABAAEAAAAAAAEAGAAoIAMAFgAAACgAAAAAAQAAAAIAAAEAGAAAAAAAAAAAAEgAAABIAAAAAAAAAAAA - AADx8/Px8/Tx8vPx8/Tx8/Tx8/Tx8vPx8vPx8/Tx8vTx8/Px8vTx8/Ty8/Ty8/Px8vPx8vTx8/Py8/Px - 8/Py8/Px8/Px8/Px8vPx8/Tx8vPx8vPx8vPw8vPx8vTz9vbw7+/o4uHFsKqwkYiXaVeKWEN1Oh9lIQFi - IQFjIQBlIgFnIwBqJwBtKQBvKwBvKwBuKgBuKwBuKgBtKgBuKgBuKgBuKgBuKgBuKwBuKgBvKwBuKwBu - KwBuKwBuKwBuKwBvKwBuLABuKwBvKwBuKwBuKwBvKwBuLABvKwBvKwBuKwBuKwBuKwBuLABvKwBuKwBv - KwBuLABuKwBuLABuLABvKwBuKwBuKgBvKgBvKwBuKwBuKwBuKwBuKwBvLABuKwBvLABvLABuKwBuKwBu - KwBuKwBvKwBuLABvKwBvKwBuKwBvLABuLABuKwBuLABuLABvLABuLABvKwBuKwBuKwBuKwBuKwBuKwBu - KwBuKgBuKwBvKwBuKwBuKgBvKwBuKwBvKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBvKgBuKwBu - KwBuKwBvKwBuKwBuKwBuKwBuKwBuKwBvLABvLABvKwBvKwBvKwBuKwBvKwBuKwBvKwBvKwBuKwBuKwBu - KwBuKwBvKwBvKwBvKwBuKwBuKwBvKwBvKwBuKwBuLABvKwBvLABvKwBuKwBuKwBvKwBuKwBuKwBvKwBv - KwBuKwBuKwBuKwBuKwBuLABuKwBvLABuKwBvKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBvKwBuKwBu - KwBuKwBuKwBuKwBuKwBvKwBvKwBuKgBtKwBtKgBtKQBsKABqJQBoIwBlIgBlIQBiIABkIAJ2ORyJWkSR - YlOphX27oZzazsns6erz9PX09PXy8/Pw8fPx8vPx8vPx8vPx8vTy8/Py8/Ty8/Px8/Ty8/Tx8vPx8/Px - 8vPy8vTx8/Tx8vPy8/Tx8vTx8/Tx8vPx8vTx8vPx8/Px8/Tx8/Px8/Tx8vPx8vPy8/Px8vPx8vPx8/Tx - 8/Px8/Py8/Tx8/Px8vPx8vTx8/Px8/Tx8vPx8/Px8vPx8vPx8vPy8/Px8vTx8/Px8vPx8/Px8vPx8vPy - 8/Tx8/Tx8vTy8/T09PPe1dO0mJCPYU93OiBnJABtKQBxLwBwLwBxLwBwLgBwLgBwLwBxLwBxLwBwLgBw - LgBvLgBwLwBwLwBwLwBwLgBxLgBxLgBwLgBwLgBwLwBxLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLQBx - LgBwLgBxLgBxLgBxLgBxLgBwLwBxLgBwLQBxLgBxLgBxLgBwLgBxLgBxLgBxLgBwLgBwLgBwLgBwLgBw - LwBxLwBwLgBwLgBxLwBwLgBxLgBwLgBwLgBxLgBxLgBxLwBxLgBxLwBxLgBxLgBwLgBxLgBxLgBwLgBx - LgBwLwBxLwBwLgBxLwBxLgBxLgBxLgBxLwBxLwBwLgBxLgBxLgBwLgBwLgBxLgBxLwBwLgBxLgBxLgBx - LwBxLwBxLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLwBwLgBx - LgBxLgBxLgBxLgBxLwBwLwBxLwBxLgBxLwBxLwBxLgBxLwBxLwBxLwBwLgBxLgBxLgBwLgBxLgBxLgBx - LwBwLgBxLgBwLwBxLgBwLgBwLgBxLgBxLwBwLgBwLgBwLgBxLgBwLgBwLwBxLgBxLgBxLgBwLgBwLgBw - LgBxLgBxLgBxLgBxLgBwLgBxLgBwLgBxLgBwLwBwLgBxLgBwLgBxLgBwLgBwLgBwLgBxLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBxLgBwLgBxLwBvLwBwMABvLwBvLgBwLwBwLwBwLABpJgBr - KQiCTDWdd2rBq6Xn39/09Pbx8vTx8vPx8/Px8vPy8/Ty8/Px8/Py8/Px8/Py8vPy8/Px8/Px8vPx8vPx - 8/Px8/Px8/Py8/Px8/Px8vPx8/Px8/Py8vPx8/Px8/Px8vPx8vPx8vPx8/Tx8/Tx8vPx8/Px8/Px8/Tx - 8vTx8/Ty8/Px8vPx8vPx8/Tx8/Ty8/Tx8vPx8vPx8vTx8vPx8vPx8vPx8vLx8vTy9fX19vff19Wpin59 - RS1sKARvLABxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLwBwLwBwLgBwLwBxLwBwLgBxLgBwLwBsKgBt - LQyEUT2yl5Dm39309ffy8vXy8vTx8vTx8vTx8/Py8/Ty8/Py8vPx8/Py8/Py8/Tx8/Px8/Tx8/Py8vPy - 8/Ty8/Tx8vPx8/Tx8vTy8vPx8/Px8vTx8vPx8/Px8/Px8vPx8/Px8vPy8/Tx8/Tx8vPx8/Tx8/Px8/Px - 8/Ty8/Tx8/Px8/Tx8/Tx8/Tx8/Tx8vPx8/Px8vTy8vT19vjGsauKWERtKwdwLgBxLwBxLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBw - LgBwLQBwLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBxLgBwLgBwLQBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBv - LgBwLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLQBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBuLABtKwuO - X07Mubb19vfx8fTy8vXy8vPx8/Py8/Ty8/Px8vTx8/Py8/Px8vPx8/Tx8/Tx8/Ty8/Px8/Px8/Py8/Tx - 8vTx8vTx8/Px8/Px8vPx8vTy8vPx8vPx8/Px8vPx8/Tx8vPx8/Tx8vPx8/Tx8/Tx8vTy8vPx8/Px8vPx - 8vTx8vPx8vPy8/Ty8/Ty8fHBq6N6QSltKgBxLgBwLgBxLwBxLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLgBwLgBvLgBwLgBwLwBwLgBwLQBwLgBw - LgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBxLwBsKAF7QyzBq6fy - 8fHy8/Tx8/Px8vPy8/Py8/Px8vTy8/Ty8/Px8vPx8/Py8/Tx8/Tx8/Py8/Tx8/Py8/Py8/Px8vPx8vTy - 8vTy8/Px8vPx8vPx8/Px8/Ty8/Tx8/Tx8vTx8/Px8/Tx8vPx8/Px8vTx8/Px8vPx8/Tx8vPw8fPz9PXL - uraARzFtKgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLQBwLQBwLgBvLgBwLQBvLgBwLgBvLgBvLgBv - LgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBtKgB/RzHMvLn09fXx8vPx - 8vPy8vPy8vPx8/Tx8/Py8vTy8/Px8/Ty8/Tx8/Tx8vPx8/Py8/Px8/Ty8/Tx8/Tx8vPx8vTx8/Tx8vTx - 8/Py8/Ty8/Px8/Py8/Tx8/Py8/Ty8vPx8/Py8/Tx8/Tx8vTx8/Px8vTn4eCSZ1htKwRxLgByLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBvLgBwLwBvLgBwLgBwLwBw - LgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBw - LgBwLgBwLwBwLwBwLgBwLgBwLgBxLQBwLQBvLQBxLQBvLgBvLQBwLQBwLgBwLgBwLgBwLQBwLgBwLgBw - LgBwLwBwLwBxLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLgBv - LwBwLgBvLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLwBwLwBvLgBvLgBwLQBvLQBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBw - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLwBxLwBsKgSTaFbl4N/y8/Xy8/Py8vTx8/Px - 8vPy8/Tx8vPy8/Tx8/Px8/Tx8/Ty8/Py8/Ty8/Px8vPx8/Px8/Px8/Tx8/Tx8/Px8/Ty8/Tx8/Ty8/Ty - 8vTx8/Tx8vTx8vTx8/Ty8vTx8/Px8vP09fbHsq11OBlwLQBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBv - LgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBxLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw - LgBwLgBwLwBzLQByLgBxMAByLwBxLgBwLQBvLQBwLgBxLgBxLwBxLwBwLwBwLwBxLwBxLwBwLwBxLwBw - LwBwLwBxLgBwLgBwLwBwLgBwLwBxLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBvLgBvLgBvLwBwLgBw - LwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBwLQBwLgBvLQBwLgBvLgBv - LgBwLgBwLgBxLgBwLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBxNBbFsaz19vfx8/Pw8vPy8/Tx8/Tx8/Ty8vTy - 8/Ty8/Tx8/Tx8/Tx8/Tx8vTy8vTy8vPx8/Px8vTx8vPx8vTx8/Tx8/Tx8vPy8/Ty8/Tx8/Tx8vPx8/Tx - 8/Ty8/Ty8/Py8PKjfXFsKQJwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLQBw - LgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLgBvLgBvLgBwLgBvLwBvLwBwLgBwLgBwLwBvLgBvLgBvLgBv - LgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBxLgBxLwBwLwFz - LgF1LwNyLgVxLwVzLwRzLwR0LgRxLgNwLgFwLgFxLwBwLwBwLwBxLgBxLgBwLwBxLwBwLwBwLgBwLwBx - LwBwLwBwLwBwLwBwLgBvLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBvLwBwLwBwLgBwLwBvLwBvLwBv - LgBwLgBwLQBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBvLgBv - LgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLQBwLgBwLQBvLQBwLgBvLQBvLQBvLQBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBv - LgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBrKQKeemzx8PDz8/Tx8vTx8vTx8vPy8vTx8/Ty8/Px8/Ty8vTx - 8vPx8/Tx8/Px8/Px8vPy8vPx8/Px8vTx8vTx8/Ty8/Tx8/Tx8/Ty8/Tx8/Tx8/Tw8vTy8/Xq5eSKWkht - KwBxLgBxLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBw - LgBwLgBwLwBwLgBwLwBwLwBvLgBwLgBvLgBvLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBvLgBw - LwBwLwBwLgBwLgBwLgBwLwBxLwBwLwBxLwBxLwByLwBxLgNzLwR0LgZxLRFrLjtoL0JaM3RUNKBUOKFQ - OaFRN6FUNZ9ZNHxpL0NuLzV1LQlyLgRxLgNxLgBxLwBxLwBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLwBw - LwBwLwBwLgBwLwBwLgBvLgBxLwBxLwBvLgBvLQBwLgBvLgBwLgBvLwBwLgBvLgBwLgBwLwBwLwBvLgBw - LwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLQBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBv - LgBwLgBwLgBxLwBwLwBvLACIV0Xq5uXy8/Tx8/Tx8/Py8/Ty8/Tx8vPy8/Px8vTy8vTy8/Px8/Px8/Tx - 8/Px8vTx8/Px8/Tx8/Tx8vTx8/Ty8/Ty8/Ty8/Tx8/Ty8vTx8/Xk3dt+RjBwLQBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLwBvLwBwLwBw - LQBwLwBwLgBwLwBvLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBw - LwBvLQByLQJzLwBxLgJyLgV0LRFqLztdMXFMN7lFOc8/PfFBPvFFP/BFPuxIPupIPupHPulHP+tHP+1C - P/E+PexJOMJUNpJoMVR2LhRzLwZyLwFxLwBxLgBxLgBwLgBxLgBwLgBvLgBvLwBvLwBwLwBwLwBwLgBw - LgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLgBvLgBwLwBvLwBvLwBwLgBvLwBvLwBvLwBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLQBwLgBw - LgBvLwBvLAB8RS7j3dvy9PXx8/Ty8/Ty8/Tx8/Py8/Ty8/Ty8vPy8/Px8vPy8vTy8/Px8vTx8vPx8vTx - 8/Py8/Ty8/Tx8/Px8/Tx8/Tx8vTy9PTl3916PyRwLQBxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBvLQBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgBw - LgBwLwBwLgBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBxLwBxLwBwLgBwLwBwLwBxLgBxLgFzLwR3LhFp - LzxYNotFPthCP+lDPu9HPepHPuxGP+pIP+pGPupHPutHPutHPutIPupGPupGPulGPupIP+pIPuxFPu1A - P/NAO91TModuMDB0LQdxLgNxLgBwLgBxLgBwLgBwLgBwLwBwLwBwLgBwLgBwLQBwLgBvLgBwLwBvLwBv - LwBvLgBwLwBwLwBvLwBwLgBwLgBvLwBwLwBvLgBwLgBwLgBvLwBwLgBvLwBvLgBvLwBwLgBvLgBwLgBw - LgBwLgBwLQBvLgBvLgBvLQBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBw - LgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBvLgBvLgBvLQBvLQBwLQBwLgBvLgBvLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLwB6 - PiTl4N/y9PTx8/Ty8/Px8vPx8/Ty8/Px8vPy8/Px8vPy8vPx8/Tx8vTx8vPx8/Tx8/Tx8vTy8/Ty8/Tx - 8/Tx8/Xy9PXo4eF3PCVxLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBxLgBw - LgBwLgBvLwBvLgBwLgBwLwBwLgBwLwBwLwBxLwBxLgBwLwF0LgZyLBpeMmZGO8k+PvFEP+pIP+hJPulJ - P+lIPuhHP+lGPupHPulGP+lHPupHPupHP+pIP+pHP+tHP+pIP+pHP+lJP+lIP+pIPulIPetFP+1BQPJN - OKVqLTd0KwlxLwNxLgBxLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBwLwBw - LgBvLgBwLwBwLgBwLgBvLwBwLgBvLgBvLgBvLQBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBvLQBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBw - LgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLwB5Pifo4uHy8/Xx - 8vTx8/Ty8/Ty8/Ty8/Ty8/Ty8/Tx8/Tx8vPx8vPx8/Px8/Tx8/Tx8/Px8/Py8/Ty8/Ty8/Tu7OyCTjdw - LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBvLQBwLgBwLwBwLwBwLgBwLgBw - LgBwLwBwLgByLwByLwByLgBuLwRzMA9jMmdGPNVEP/BIP+lHPupHPetIPupIPulIP+lHQOpJPutHP+pI - P+pHPupHPupHPupIPupHP+pIPupHP+pHP+pHPulIP+pHPupHPulHPulHPuxHP+pIPus9PO5QNJxvLShx - LwZuLgBvLgBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLgBvLgBw - LgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBvLQBwLQBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLQBvLQBvLgBwLQBvLgBvLQBwLgBwLQBwLgBvLgBwLQBvLgBwLQBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBvLQBwLgBwLQBwLQBwLgBwLgBwLQBwLQBvLgBwLQBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBw - LgBwLQBwLQBwLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLwBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLgCDTjju7Ovx8/Xy8/Ty8vTy8/Ty - 8/Ty8/Tx8/Py8/Tx8/Tx8vTx8vPx8/Py8/Tx8vTy8/Tx8vPx8vP09vaWbV9vLQBxLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBw - LgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBxLgBwMABwLgBz - LgJ1LglpMExIO8lBQfBIPupIP+xHPupIPutHPupIPupHPutHP+pHP+pHP+pIPutHPulHPulHPupHP+tI - PutHPutHP+lHPupHPupHPupHPulHPupHPupHPutHPulIPupHQOpIPepDP+xDPeNdMnNzLg9xLwJvLwBv - LgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw - LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLQBvLgBwLgBvLgBv - LgBvLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLQBvLgBw - LgBwLgBvLgBvLQBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBvLgBvLgBwLQBwLgBvLgBwLgBvLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBvLgBwLgBvLgBwLgBwLgBwLQBv - LgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBv - LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLwBxLwBvKwCWa1z09Pbx8vPx8vPx8/Ty8vTy8/Px8/Tx8/Tx - 8vPx8/Tx8/Px8/Ty8/Px8/Tx8/Tw8vPy9PW0l41rKQBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBvLQBw - LgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwByLwByLwNzLxtTN5lCPe1JP+pK - PupIP+pIP+pIP+pHPutHPupIPutHPutHP+pIP+pIPupHPutHPupIP+pIPupHPupHPupHPupHP+pHPulH - P+pHPupHPupHP+lHPutHPupIP+pHP+pHP+hIPulGP+tIP+pDP+1MOLtvLyVxLQRwLwBwLgBwLwBwLwBw - LwBvLgBwLgBwLgBwLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBwLQBv - LwBwLgBwLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLQBvLgBvLgBv - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBw - LgBwLgBvLgBwLQBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBwLgBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw - LgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBw - LQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBtKgCzlY3y9PXx8vTy8/Tx8vPx8/Px8/Py8/Tx8vPx8vTy8/Py8/Py - 8vPx8vPy8/Tx8/PWyMRtLQpxLwBvLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLgBv - LwBvLgBvLgBvLgBwLgBwLgBwLgBxLgBxMABwLwBzLwRsLzdEPNFDQO9HPulHP+pIP+lHPulHP+pIPupH - PupHPupHPupIPupIP+pIP+lIPupHPulIPupIP+pIP+tHP+lIP+pHP+pHPulIPupHP+pHPulHP+lGP+lH - PupHPulIPulHP+pHP+lIPulIPupHP+pKQOlGQu1BO+BoLklyLwNvLgBxLwBwLwBwLgBvLwBwLwBwLwBw - LgBwLwBvLwBwLgBwLwBvLgBvLgBvLwBwLwBwLgBvLwBvLwBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLQBvLgBvLQBvLQBwLgBvLQBvLgBvLQBwLQBwLgBvLgBvLgBwLgBvLgBvLgBv - LgBvLgBwLgBwLgBwLgBwLgBwLQBvLQBwLgBvLgBvLQBvLgBwLgBwLQBwLgBwLQBwLgBvLQBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBv - LQBwLgBwLgBxMABuLgrYysby8vTx8vPx8vPx8/Px8vPy8/Px8vPx8/Tx8/Ty8/Ty8/Tx8vTx8/Tu7Ox+ - Ri1wLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLQBwLgBw - LgBwLgBxLwBvLQByLwByLQZeMGZAPepHPutIPupHPupGPupHPupHPupIPupHPulHPupHP+tIPupIP+pH - PulHPupIPupHPulHPupHP+lHP+pHPupHPulHP+pIPupHPupHP+pHP+pHPupHPupHPupHP+lHPupHP+lH - PupHPupHP+lHP+pHP+pHPupIPutBPupbL3JzLQlyLgBxLgBwLwBwLgBwLgBvLwBvLgBwLwBvLgBvLgBw - LwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLQBvLgBwLgBv - LQBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLQBvLgBwLQBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBvLQBvLQBwLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBvLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLwBvLQBwLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBwLgBv - LgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLQBvLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBw - LgBvLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBw - LgBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBx - LgB+Ri3v7ezy8/Ty8/Py8/Ty8/Ty8/Ty8vPy8/Tx8/Ty8/Ty8vTx8vPy8/SnhXtuKwBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLQBwLgBvLQBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBxLwF3 - LQ1VMoc/P+xHPupHP+pIP+lHPupHPupHPupHPupHP+pIPupIP+pHPupHPulHPupHP+pHP+pIPutHP+pH - PupHPulIP+pIP+pIP+lIP+pHP+lHPupHPupGPulIPupHPupIPutHP+lIPulIPulIPulIP+lHP+lHPupH - PupHPupIPupLQOpDPe5aNIh0LQpvLwBwLwBwLwBxLgBvLwBvLwBwLgBwLgBwLwBwLwBwLgBwLgBvLgBw - LgBwLwBvLgBvLgBvLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBv - LgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBvLQBwLgBwLgBvLgBwLQBv - LgBvLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBw - LQBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLwBvLQBwLgBvLgBwLgBwLgBvLgBvLgBv - LgBvLQBvLgBvLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLQBwLgBvLgBwLQBwLgBwLgBvLgBvLgBvLgBv - LgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLwBvLgBwLgBwLgBwLgBwLgBxLwBvLAGqiX7y9Pbx - 8/Py8/Ty8/Ty8/Tx8/Px8vTx8/Ty8vTx8vTx8vXg19drKghwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLwBvLwBwLgBwLQBxLQBwLgBvLwBwLgBwLwBxLwBxLwFyLxBSNJ5APu5IP+lIP+lH - QOhHPulHPupHP+tHPulHP+pHPupIP+pHPupHPulHPupHP+lHPupHPulHPulHPupHP+pIP+pIP+pHP+pH - P+pHP+pIPulHP+pHP+lIP+pIP+pHP+pHPupHP+lHP+pIPupHPupHP+lHPulHP+tHP+pHPupIP+lIQOlJ - QepCQO9dNH9zLQhxLgBxLwBwLwBwLwBwLwBxLgBvLwBwLwBwLwBxLwBwLwBwLgBwLgBwLwBwLgBwLwBv - LwBwLwBwLgBwLgBvLwBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBv - LgBvLgBwLQBwLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw - LgBwLgBvLgBwLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBxLwBsKwrh2dbx8/Tx8vPx8vTy8/Py - 8/Ty8vTx8/Ty8/Tx8/T09faNYVBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBwLQBwLgF0LQlXNI9CPe9HPetHPelHPutIPupIP+pHPupHP+pH - PupIPupGPupHP+tHPupHPupHPupHPupIPupGP+lHPulIP+pHPupHPulHPupIPupHPutHP+pHPupHPupH - PupHPulHPupGPupHPupHPupIP+pIPulHPutHPupHPupHP+pIPulHPupHP+pIP+pIP+pJP+lCPOxeMnxz - LQdxLgBwLgBwLgBwLgBxLgBwLwBwLgBvMABwLwBwLwBxLgBwLgBvLgBwLgBwLwBwLwBwLgBvLwBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLgBv - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBw - LgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBw - LgBvLQBwLgBwLgBwLgBvLwBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBv - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBxLwBxLgCQY1Pz9ffy8vTy8/Ty8/Ty8/Px8/Px8vTy8vPy - 8/TQwr1rKgRwLgBwLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLQBwLQBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLwBwLwBwLwBw - LgBwLwBxLgBxLwBxLwByLgVhL1tBP+1IPupIPulIPulHPutHPupHPupHP+pHPupHP+pHP+pGPupHP+pI - P+lHPupHPulHPupHPupHPupIPulHPupHPutHPutHP+pIPulHPupHPupHPupHP+pIP+pHP+tHP+pHPulH - PupHPulHPupIP+pHPulHPupHPupHP+lHP+lHP+lIPupHP+pIPulIP+lJQepCPfJjMVdzLgVwLwBwLwBw - LwBxLwBxLgBvLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBxLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv - LgBwLgBwLQBwLgBwLgBwLgBwLgBvLQBvLQBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBv - LgBvLgBwLQBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBw - LgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBwLgBwLgBv - LgBvLgBwLgBwLgBwLwBvLQBvLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBvLQBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLQBvLgBvLQBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBxLwBsKwXUxsTz8/Xx8/Tx8/Ty8/Ty8vTy8/Ty8/T09PSMXUtwLgBwLgBv - LgBvLgBwLgBvLgBwLgBwLgBwLwBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLgBxLwBw - LwRuLjxFQOdIP+pIPulHPulHP+lHPupHPutHPupHPulIP+lHPulHPupHPupHPupHPupHP+pHP+lHPulH - PupHP+pHPulIPupHP+pHP+pHP+tHP+pHPupHPupHPulHPupHPupHP+pHPulIPupHPupIP+lIPupHPupH - PupHPupHPulHP+pHPupHPulIPulIPulHPupHP+pGQepHQOpDO95sLzJxLgJwLgBwLwBwLgBwLwBwLgBw - LgBvLgBwLgBwLgBxLgBvLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv - LgBvLQBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBv - LgBvLgBwLgBvLgBvLQBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBw - LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLwBvLgBvLgBvLQBvLQBvLQBwLgBvLgBw - LgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBv - LgBwLgBvLQBwLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgCOXU309fbx8vTy8/Px8/Tx8vTy8vTy8/TXzchrKgRwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBxLgBxLwFzLRJLO71HPu1HPulH - PulIPupIPulHP+pHPulIPulIPupHPupHP+lIPupHPupHPulHPulHPupHPupHP+lHPulHPulHPulIPupH - PulIP+pHPulIPupHPulHPupIPulHPupHPupHP+pHP+lHP+pHPupIPupIPupHP+pHP+pHPulHP+lHP+lI - PulHPupIPupIPulHP+pIP+pHPupGP+pFPutIOsVxLBZvLQFwLgBwLgBwLgBvLgBwLwBwLwBvLgBwLwBw - LwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBw - LgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLQBvLgBvLgBw - LgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLQBwLgBvLgBvLgBwLgBw - LQBwLgBvLgBvLgBvLQBwLgBwLgBvLgBuLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBv - LgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBw - LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLQBvLQBwLgBwLgBwLgBwLwBvLgBwLwBs - Kwbd1NDx8/Tx8vPx8/Px8/Tx8vXz9fecdWdxLgBxLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgB0LwddNGxEQe1IQOpHPupHPupHPupHP+pHPupH - PutHPupHPupHPupHPupHP+pHPupIPupHP+pIP+pHPulHPulHPulIP+pHP+lHP+pIPupHP+lHPupHPupH - PupHPupHP+pHP+lHPupIP+pHPupHPupHP+lHPupIP+pHP+pHPupHPupHP+lHP+pHP+pHPulHPupHPupH - PupHPulHPupHPupHPupGPu1XMolyLglxLwBwLwBvLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLwBwLwBw - LgBvLgBwLwBvLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBv - LgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLQBvLgBvLgBw - LgBwLgBvLgBvLQBvLQBwLgBwLgBvLgBvLgBvLgBvLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBv - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBv - LgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQCgfG/y9PXx8vPy - 8/Ty8vTx8vTt6+1oKQpxLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBx - LwBwLwBwLgBwLgBxLQBwLQBxLwFzLh5EPdtJQOlJP+lIPupIPupHP+lIP+pHPupIPupHPupHPupHPulH - PupHP+pHP+lHPupHP+pHPulHPulHP+lHP+lHPulHP+lHP+pHPupIP+lHPupIP+pHP+pIPupHPupHPupH - P+lHP+lHP+pGPupHP+pHPupHPupHP+pHPupHPulHP+pHP+pHPupIP+pHPupHPulHPulHPulHPulHPupI - PupHPes/Pe1pLj1xLwFwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLgBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBv - LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLQBwLgBwLgBwLgBwLgBvLgBv - LQBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv - LgBvLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBv - LQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw - LgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBv - LgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBtMhTz8fLy9PTy8vTx8vTx8/S8o55v - LABwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBx - LgBxLwBzKwVdNGxFQO1IP+hIPulIPutIPutIP+lHPulHPupIP+lHPupHP+pHPulHPupIP+pHP+lHPupH - PulHP+pHP+lIP+pHP+pHP+lHPulHPulIPulHPulIPupHPulHP+tHPupHP+lHP+pHPupHP+pHPulIPupH - P+lHP+lHP+lHP+pGPupHPulHPulIP+lIPupHP+lHP+lIPulIPulIPulHP+lIPupIPulHPelGPupLOq50 - LwxwMABxMABwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBxLgBwLwBwLgBvLwBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBw - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw - LgBvLgBwLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBv - LQBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLwBuKgHGsq3y8vTx8/Px8vTz9faNXkxvLgBvLgBwLgBwLgBv - LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBw - LgBvLgBvLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBxLwBwLgBvLgByKRZGOs9I - PulJPutHP+pHP+pHPupHPupHPulHP+pHPupIPupIP+pHPupHP+pIPupHPupHPulHPupIP+lHP+pIP+pI - PupHPupHP+pIP+pGPupHPupHPulHPupHPupHPulHP+pIP+pHP+pIPupHPulHPulIPupHPulHP+pHP+pG - P+lHPulHPupGP+pHPupHPupIP+lHPupHPupHPulHPupIPupIP+pHPulHPupCP+9kMmJxLwNvLwBvLgBw - LwBwLwBwLwBwLgBwLwBvLwBwLwBvLwBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLQBvLgBvLQBvLQBwLgBwLwBvLgBw - LgBvLgBvLgBvLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLQBv - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBvLgBv - LgBvLgBvLgBwLgBwLQBvLQBvLgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBv - LgBwLgBvLgBvLgBvLgBwLQBvLgBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBxLwGYa1z09ffx8/Tx8vPt6OduLxFwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBv - LQBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBwLgBwLgBwLgBvLgBw - LgBwLgBwLQBwLgBwLgBwLgBvLgBwLwBwLgBwLwBxLwBwLwBwLwBxLANlL1JDQPBIPutIPutIPupHPutI - PupHPulIP+pHP+pHPupIP+pIP+pHP+lHP+lHPulHPulIP+pIPupIPulHP+lIPulHP+pHPupHP+pHPupH - PupIPupHP+tIPulHPupHP+lHPupHPupHP+pGPulHPulHPupIP+lIPupHP+lHPupIP+pHPupHP+pHP+lH - PulHP+pHPupGP+lHPupHPupHPupHPupHP+pHPupIPulHP+tGN8pyLhJvLwBvMABxLgBwLwBwLgBwLwBw - LwBwLwBvLwBwLgBvLgBvLwBwLwBwLgBvLwBwLgBwLgBvLgBvLQBwLgBvLgBvLgBwLQBvLgBwLgBvLgBv - LgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLQBvLQBwLQBwLgBwLgBwLgBvLgBv - LQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLQBwLQBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBw - LgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBw - LgBwLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLQBv - LQBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBw - LgBxLwBxNBjw7/Hx8/Px8/TKubVsKQBwLgBwLwBwLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxLwBwLwBwLwBwLwBwLwB0LAhUNplIQO1IP+tIPupIPupHPupIPutHP+pHPupHP+pH - P+pHP+pIPulHPulHPupHP+pHP+pHPulHP+pHP+pIP+pIPupHP+pHP+pHPulIPulIPutIPupIP+lHPupH - P+lHPupHPupHP+pHPulHPupHPupHP+lHP+lGPulHPupHP+pIP+pHPutIPulIPulIPupHP+pHPulHPulH - PupHPupHP+lHP+pIPulIP+lHPulIP+lEPvFfMGBvLgJwLwBwLwBwLwBwLwBxLwBvLwBvLwBwLwBwLgBw - LgBwLgBvLgBvLwBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBv - LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBv - LgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBv - LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLQBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBwLQBv - LgBwLgBwLgBvLgBwLgBvLQBvLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBtKQHUxcLx - 8vTy9PSlgXVvLQBxLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwBw - LwBwLwBwLwBxLwBuLwByKhVEPNtGQOtIPulHPupHPutHP+lHPupHPupIPupHPupHP+pHPulHPupHPupH - PupIPupHPupGPulHP+pHPupIP+lHP+lHPulIP+lHPulHPulHPupIPupHPupIP+pHPulHPupHP+pHP+lI - P+pHPulHPupHP+lHPulHP+lHPulHPulHPupHPulHPupHP+pGPulHPupIP+pIPulIPupHPupIPulHPupH - P+lHPulHPupHPutIPupGOMV0LQhwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLwBvLwBxLgBw - LwBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBw - LgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLQBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBw - LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQCtjILy8/P09faETzhvLwBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLwBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLwBwLwBvLQBwLgBwLwBxLgBxLwBv - LgRpLkNEP+9HQOtIPutIP+tHP+pIPupHP+pHP+pHP+pHP+pHPulHPupHPupHP+pHP+tHP+pIPupIPupI - P+lIP+pIPupHP+lIP+pHP+pHP+pIPupHPupHPupHPulIP+pHPupIP+lHP+pHP+pHPupHPupHPulHPupH - PupHP+pHPupHPulHPupHPulHPupHP+tIP+pHPulHP+pHP+pHP+pHPupHPupIP+pIP+pHPupHPupHP+lI - PupEPu1mLUhwLwNwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLgBwLgBvLwBvLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBw - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBvLgBvLgBvLgBv - LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBv - LgBvLgBvLQBwLgBwLgBvLgBvLgBvLQBvLgBvLQBwLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBv - LgBvLQBwLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLgBxLwBxMACMWkXy9PXt6elwMhVwLgBvLgBvLgBwLgBvLgBw - LgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgByLgNdMmdHP+5HP+pH - P+tHPupHPutHPupHPupHPupHPupHP+pIPupHPupIPupIPupHPupHPulIP+lHP+pHP+pHP+pIPulHPulI - PulHPupHPupIPulHP+pHP+pIPutIPupHP+pIP+pHPupHP+pIPupHP+pHPupHPupHP+pHP+lIPupHPupH - PutHPulHPupHPupHP+pHP+pHPupHPupHPulHP+pHPupHP+pHP+pHP+lHP+pHP+lJP+pHQepONax1LwZw - LwBwLgBwLgBwLgBwLwBxLgBwLgBvLwBvLgBwLwBwLwBwLgBvLwBvLgBvLQBvLgBvLQBvLQBvLgBvLgBw - LgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBvLQBvLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLQBvLgBwLgBv - LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLQBvLgBvLgBv - LgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBwLQBv - LgBwLgBvLgBwLgBvLgBwLgBxLgB2Oh/u7O3f2NZoJwBvLgBwLgBwLwBwLgBwLgBvLgBvLgBvLgBvLgBv - LgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLwBwLgBxLwBwLwBwLgBxLgBwLgBzLwZRN6ZHQO1IPuxHPupHPupIPupHPutH - PupHP+pHPulHP+pHP+pIP+pHPupHP+pHPupHP+pHPupIP+lHP+pHPupIP+pIP+lIPupHPupHPupGPupH - PupHP+pGPupIPupHPupIP+pHPupHPulHPupHPupHP+pHPulHPupHP+pGPupIP+pHP+lHP+pIPulGPupI - PupHP+pHPupHP+lHP+lHPulHP+lHPupHP+pIPulIP+pHPulHP+tIP+hDQOFtLihwLgFwLgBwLgBwLgBw - LgBwLwBwLwBvLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBv - LQBvLgBwLgBwLQBvLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBv - LQBvLgBvLgBvLgBvLQBvLQBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBv - LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBvLQBwLgBvLgBvLQBvLgBvLgBvLgBwLgBwLQBvLgBw - LgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLQBvLQBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBv - LQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBwLgBwLQBvLQBvLgBwLgBv - LgBwLgBwLgBoJwHj3NvAqqJtKgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLgBxLgB0LgdLN7pHP+pIQOpHPupHPupIP+pHPulGPupHPulHPulHPulH - PupHPupHPutHP+pHPulHPupHPupHP+pHPupHP+pIPupHPulHPupHPupHP+pHPupHPupHPulIPupIPupH - PupHP+pHPupHPupHPupIPulHP+lHP+pHPupHP+pHPupIPupHPupGP+lHP+pHP+pHPupHP+pHP+pHPupH - P+pHP+pHPupHPupHP+pHPulGP+lHPulHPulHP+xGQO5bNYNvLgNwLwBvLgBwLwBwLwBwLwBwLwBvLgBw - LgBwLgBwLwBwLgBwLwBvLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLgBwLQBvLQBv - LgBvLQBvLgBvLgBuLgBvLQBwLgBvLgBvLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBw - LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBvLQBvLQBw - LgBvLgBvLgBvLgBvLQBwLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLQBv - LgBvLgBuLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBrKQDE - sqyvkIpvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBw - LgBwLwBwLQBwLgBxLB5EPOFHQOdIP+lHPutIPupHP+pHPupHP+pHPupHPupHP+lGPulGPupHPupHPupH - PulHP+pHP+lHPulGPupHPupHPulHP+pHPupHPupHPupHPupHPupHPupHPupIPupHPulHPupIPupHPupH - PupHP+pHP+tIPupHPupHP+pHP+lHPulHP+pHPupHPupHPupHPupIPupHPulIP+lHP+lHPulHPupGP+pH - PupHPupHP+pHPupJPupGP+lJP+pMPL90LgtvLwBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLgBwLgBw - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBwLQBwLQBwLQBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLgBvLgBwLgBvLgBvLgBvLQBwLQBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBvLQBw - LgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBw - LgBvLgBvLQBvLQBwLgBwLgBvLgBvLQBwLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv - LgBvLQBvLgBwLgBwLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBxLgBxLwCylY2XalhwLwBwLgBw - LgBwLgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBw - LgBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLQBw - LSxBPfJIQOhHPuhIP+tHPupHPupHPupHP+lHPupHPupHPupGP+lHPulHP+lHPulHP+pHP+pIPulHP+pH - PulHPupHPutHP+pHPupHPupHP+pHPupHPulHP+pHPupIPupHPupHP+pHPupGPupHPulHP+pHPupIPupH - PulHP+pGPupHP+lHP+pHP+pHPutHP+pHPupHP+pHPupHPulHP+pHPupHPupGPupHPupHPupHPulHP+lJ - P+lIPuhHPupAPutuLidvLgFvLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBv - LgBwLQBvLgBvLQBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLQBwLgBwLgBvLgBw - LQBvLgBvLQBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBvLQBwLQBvLQBvLgBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBvLgBv - LgBwLgBvLgBvLgBwLQBwLQBvLgBwLgBvLgBvLQBvLgBvLQBwLgBvLQBwLgBvLgBvLgBvLgBvLQBwLQBv - LgBwLQBvLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBvLgBwLQBvLgBvLgBvLQBwLgBwLgBwLgBvLgBw - LgBwLgBvLgBvLgBvLgBvLQBwLgBwLQBvLgBwLgBwLgByLwCabl6MW0ZwLgBwLgBwLgBwLgBwLgBvLgBw - LQBvLQBvLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBxLgBvLQBwLgBwLwBvLy9APfFHPehHPehH - P+pHPupHPupHPepHP+lHPulHPupHPupHPulIPupHP+pIPulHP+pHPulHPupHP+pHPupHPulHPupIPupH - PupHPupHPupHPulHPulHPupHP+pHPupHPulHPulHP+lHPupHP+pHPulHPupHPulHPupHP+lHP+lHPulH - PulHP+lHPupHP+pHP+pHPupHPupHP+lHPupHPupHPulHPupIPupHPupHP+pGPulIPupHP+pHPulEQO1d - MnZxLgRwLQBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLQBvLgBwLgBvLQBvLgBvLgBv - LgBvLQBvLQBvLgBwLQBvLgBwLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBv - LgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLQBvLgBvLQBwLgBvLQBv - LgBvLQBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBv - LQBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBv - LgBwLgBvLgBvLgBvLQBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLQBwLgBvLQBvLgBwLgBv - LgBvLgBwLgBvLgBvLgBwLgBwLwBwLgCMW0h4QCVwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBvLgBwLgBw - LgBvLQBwLgBvLgBwLQBvLgBwLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw - LgBvLQBwLgBvLgBwLgBwLgBxLgBwLwBxLwBwLgBwLQBxLgJpLz1BP+9GPuhHPudHPupIPupIP+pHPupH - P+pHPulHPulHP+pHP+pHP+pIPulGP+lHP+pHP+lHPupHP+lHP+lIPupHPulHPupHPupHPupHPelHPupI - PupIPepHP+tIPupHPelHPulIP+tHPulIPulHPupHP+lHPelHPupHP+pGPepHP+tGPupIP+pHP+pIPupH - PupHP+pHPulHPulHP+lHPupIPupHPulHP+lHPupIPulHPupHP+pHP+lHPupIPexEOsl1LQRvLQBwLgBw - LwBvLwBwLwBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLQBvLQBwLQBvLgBwLgBwLgBvLQBvLQBvLgBwLgBv - LQBvLgBvLQBwLgBvLgBwLQBvLQBwLQBwLgBvLQBvLgBvLgBvLQBvLgBvLQBvLgBwLgBvLgBwLgBwLgBw - LQBvLQBvLgBvLQBvLQBwLgBwLQBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBvLgBvLQBvLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBwLQBwLgBvLQBwLgBwLgBvLgBvLgBwLgBv - LgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLQBvLQBvLgBvLgBvLgBwLQBvLgBwLgBv - LgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLQBvLQBvLQBvLQBvLgBwLgBvLgBvLgBv - LgBvLQBwLQBvLgBvLgBvLgBwLgBvLQBvLQBvLgBvLQBvLgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBvLQBv - LgBvLgBwLgBwLgB5PyVqJwlwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBvLQBvLgBwLgBvLgBwLgBwLgBwLQBvLQBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBwLwBwLgBwLwBvLgBwLgBvLwNhLFREQO9GPulHPudHPupIPulHPupHP+pHPupHPupHPupHP+lH - P+pIP+pHPupHPepIP+pIP+pHPupGP+lHP+pHPupHPupHPulHPulHPupIPutHPupHPulGPupHPulGP+pH - PupHP+pHP+pHP+pIPupHP+lIPupHP+lIPupHPupGPupHP+pHP+pHPepHPulHPutHP+pHPupHPupHPulH - PulHP+pHP+pHPupHPupIP+pIPupHPupHPupHP+pHPulIP+hDPuRxKxxuLQFwLgBwLgBwLwBvLgBvLwBw - LwBwLwBvLgBwLwBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBvLQBvLgBvLQBvLgBwLgBwLgBvLQBw - LQBvLQBvLQBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBwLgBwLQBvLgBvLQBvLQBvLgBvLgBwLgBw - LgBvLgBvLQBvLgBwLgBvLgBwLQBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBvLQBvLQBw - LgBwLgBvLgBvLgBvLQBvLgBuLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBwLQBvLgBvLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLQBvLgBvLgBwLQBvLgBvLgBv - LQBvLgBwLgBvLQBvLgBwLgBwLQBvLgBvLgBwLQBvLgBvLQBvLQBwLgBwLgBvLgBvLgBwLgBvLQBvLgBv - LgBwLQBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLwBp - JwhkHgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBw - LgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLwBw - LwBwLgBvLwBvLQNfLWFFQe5JPupJPulHPutIPupHPupHPupHP+pHPulHP+pHP+pHP+pHP+pHP+pHPulI - PulIP+lHP+lHP+lHP+pHP+pHPupHPupHPulGPupHPupHP+pHPupHPupGPupHPupHP+pHPupHPulHPupH - PulGPupHPulHP+lGP+lHP+pHP+lHPupHPupHPupGPupHPupIP+pIP+pHPupHP+pHPupHPulHPulHPulI - P+pIP+pHPupHPupHPutHP+lGP+pGQOtDQ/BlL1FwLgNwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLgBw - LwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBuLgBvLQBvLQBvLQBvLgBvLgBvLgBvLgBwLgBwLgBvLQBvLQBvLgBwLgBv - LQBwLgBwLQBwLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBw - LgBvLQBvLgBvLQBvLQBvLQBwLQBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBvLQBwLgBwLQBwLgBwLgBvLQBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBv - LgBwLQBvLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBjIQBmIQBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBv - LgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBxLwBwLwBwLgBvLgBwLwBwLgRg - LWlFQPBHP+lHP+pHPupIPulHP+pHP+pHPulHPulHPupHPupHP+lHP+pHP+pHPulHP+pHP+pHPulHPupH - PulHPulHPupHPupIPupIPupHP+pHP+lHPupHPupHPulHPupIP+pHPupHPupHPulHPupIP+pHP+lHP+pH - PupHP+pHPupHPulHP+pHPupHPupHPupIP+pHPulHP+pIP+lHP+lIP+pHP+pIPulHP+pHP+pHP+pHP+pH - PupHPutHPupHPuxFP+5SNJxyLgVxLwBwLwBwLwBwLwBwLwBwLwBvLgBvLgBvLgBwLgBvLgBwLgBwLgBv - LgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBwLgBvLgBvLgBvLgBvLgBwLgBvLQBvLQBw - LgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBw - LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBv - LgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBv - LQBwLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBw - LgBvLQBvLQBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLQBvLgBw - LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBlIwBnIwBwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLwBvLgBvLgBw - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLQReLGxEP+5JP+hHPulI - PutIP+pHPupHP+pHPupHPupHP+pHP+pHPupIP+pHP+pHPupHP+pIP+pHPupHPupIP+pIP+lHPupHPupH - PutIPupHP+pHPupHPupIPulIPutHPupHPulHP+pHP+pHP+lIPupHP+pHPupHPulHP+pHPupHPupHPupI - PupHPupIPupHP+lHPupHPupIP+pHP+lHPupHPupHP+pIPupHP+pHP+pHPupHP+pHP+pIPupHPupGP+tI - P+tLOLtwLghwLwBwLgBwLgBwLgBvLwBvLwBvLgBwLwBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBv - LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLQBvLQBwLgBvLgBvLgBvLQBvLgBwLQBvLgBvLgBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLwBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBwLQBvLgBvLgBwLgBwLgBv - LQBwLgBvLgBvLgBwLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBw - LgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw - LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBpJQBqJABwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLQBwLgBwLgBw - LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLQBvLgBwLgBwLgBwLgBw - LgBwLgBvLQBwLgBvLgBwLgBwLgBwLwBwLwBvLQBwLgBwLgRdLWpEQO1IP+hHPupHPutIPulHPupHPupH - PupHPupHP+pHPupHPupHPulHP+lGPulHPulHPupHP+pHPulHPulHPupHPupHPupHPupIPupHP+pHPupH - PupHPupHPupHPupHPupHP+pHPupHPulHP+lHPupHPupHPulHPulHPupHPupHPupHPupHPupHP+tHPulH - P+pHP+pHP+pHPulHP+lIP+pHP+lHPupHPupIP+pHP+pHP+pHPupIP+pIPupGP+tIPuxDP+hxMCBwLwFw - LgBwLgBwLwBwLwBwLgBvLgBwLQBvLgBvLwBwLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLgBvLgBwLgBvLQBvLQBwLgBvLgBvLgBvLgBwLQBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBw - LgBwLQBwLgBvLgBvLgBvLgBwLQBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBvLgBvLgBv - LQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv - LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBwLQBvLgBw - LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBv - LQBwLgBwLgBwLwBsKABrKABwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBw - LgBvLwBwLwBwLgBwLwBwLgBwLgBwLwJnMFBEP/BHPulHPudHPupHPupHPupHPupHPupHPupHP+pHPupH - PulGPulHPupHPupIP+pIP+pHPupHP+lHP+lHPupHPupHPupHPupHP+pIPupHPupIPupIPupHPupHPupH - PupIPupHPupHPulHPupHPulHPupIP+pHPulIP+pIP+pHPupHPupHP+lHP+lHP+lIPupHP+pHP+lHPupH - P+pHPulHPulHPulHP+pHPulHP+lIP+pHP+lHPupHPupIPupHPupFPuxoLTlwLgJwLgBwLgBwLwBvLgBw - LwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLQBv - LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBwLgBv - LgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv - LgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLwBw - LABuKgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LwBwLgBwLwBvLgFvLzVBPfFJPedIP+lHPupHPupIPupHPupHPupHPulHPupHPulHPulHPupIPupIP+pH - PupHP+lHP+pHPulHP+pHPupHPupIP+pHP+pHPupIPupHPupHPupIP+pHPupHPupHPulHPulGPupHP+pH - PulIPupHPupGP+lHPupIPupHP+pHPupHP+pHPulHPupHP+pHPupHP+pHP+tHP+pHPulHPupIPupIPulH - P+pHP+pIPupHP+lHP+pHPulHPupHP+pIPutHP+xeM3pxMAZwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBv - LgBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLQBvLgBvLgBwLgBwLgBvLQBwLgBw - LgBvLgBwLgBwLQBwLQBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBw - LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBw - LgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBwLABvLgBwLQBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLwBxLwBwLwBwLwBwLgBxLgBwLwBt - Li9CP/NHP+pHPutHPupIPulHP+pHPupHPupHPupHP+tHP+pHP+pHPupGP+pIPulHP+lHPulHPulHPulH - P+lHPulHPupHPupIP+pHPupHPupHPupHPupHPulHPulHPulHPutHPutHPupHPulIP+pHPupIPupHP+pH - PulHP+pIPupHPulHP+pIPupHPupHP+pIP+pHPupHP+pHPupHPupGPulIP+pIP+pHPupIP+lIP+pHP+lI - P+pIP+pHP+pIP+pHP+pIPupTNJByMAVwLwBvLwBvLwBvLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBw - LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBw - LgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLQBvLgBv - LgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLQBvLgBvLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLQBvLgBwLgBwLgBxLwBvLQBwLgBvLgBvLgBwLgBwLQBvLgBw - LwBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw - LgBvLQBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBxLwBwLgBwLwBxLwBwLwBxLwFyLi5APvRIPupHPupH - PupHP+pHP+pHPupGPupHPulHPupHP+pHP+pHPupIP+pHPulIPupHPupIP+lHP+pHPupHPupHPupHPulH - P+lHP+pHP+lGPelIP+hIP+lHPulHPupHPupIPupHPulHPepHPulHPupHPulHPupHPulIPupIP+lHPulG - PulGP+lGP+lHP+lIPulHP+lHPupHPupHPupHPupHP+lHPulIPupIPupHPulHP+pHP+pHP+lHP+lHPutI - P+tJPelKOch0LghxLwBwLwBwLwBxLwBwLgBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLQBwLgBwLgBwLgBvLgBvLQBvLgBvLQBv - LgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBvLgBwLgBwLgBwLgBvLQBv - LQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLQBwLQBwLgBvLgBvLQBvLQBvLQBv - LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLQBwLgBvLgBxLwBxMABxLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLQBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBxLwByLiVAPe5HPelHPupHPupHPupHP+tHP+pI - P+pHPulHPupHPupHPupHPupIP+pHPupHPulHP+lGPupHP+pHPulHPupHP+pHP+pIPupHPulHPepHQOtJ - PtlEPetHP+lHPupHP+pHPupIP+pIP+pHP+lHP+tHPupHP+pHPupHPupHPupHPupHPupHPupHP+pHPulH - PupHP+lHPupHPulHPupHP+pHP+pHP+lHPupHPulHP+pIP+lIP+lIPupHPulIPupHPupJP+tFPt90Lw1x - LwBxLgBvLgBwLwBvLwBwLwBvLwBwLwBwLwBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBw - LgBvLgBwLQBvLgBvLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLQBwLgBwLQBvLgBvLwBvLgBvLgBvLgBvLQBvLgBwLgBvLgBwLQBwLgBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBvLgBvLgBv - LQBvLQBvLgBvLgBwLgBvLgBwLgBvLQBwLQBvLgBvLQBwLQBwLgBvLgBvLgBvLQBvLgBvLgBwLQBvLgBv - LgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLQBwLgBwLgBvLgBwLgBvLgBw - LgBwLgBvLgBwLgBxLwBwLQBwLQBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLwBwLwBwLgBxLwBwLwBwLgBxLg9GOtNGPulHPupGP+pHPupHPutIP+pHPupHPulHPupGP+pI - PupHPupHPupHPupHPupHP+pGPulHPupIPupHPupHP+pHPupHPulHPulGP+pFQe5lMl9PN69GPepHPupH - PupHPupIPupHPupHPupIPupIPupHPupHPupHPupHPupHPupIPupIPupHPulHPupIPulHPupHPupHPupH - P+lHPupHP+pIPulHPupIP+pHPupHPepHP+pIP+pIPulIP+pGPutIPulDPOVvKRhwLgJwLgBxLwBwLgBw - LwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLQBvLgBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBvLQBw - LgBvLQBwLgBwLgBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLQBvLQBwLgBvLgBwLQBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBx - LwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw - LwBwLgBwLwBxLgByLAdNO7NFPehHPupHPupHPupIPupHP+pHPupGP+tHPupHP+lHPupIPupHPulHPupH - P+pHP+lHP+pHPupIPupHP+pHP+pHP+pHPupIPupHP+pDQe1lLlVhM25EPO9HP+tHPulHP+pHPupHPutH - P+pIPupIP+pHP+pHPupHPulHPupIPupIP+pHPupHPupHP+lIPupHPupHPupIPupHPulHPupHPupHPupH - PupHPupIP+lHPulHP+pHPulIPulIP+lHP+pIPulAPvBmLkpyLgVvLgBwLgBxLwBwLwBwLgBwLgBwLwBw - LwBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLQBwLwBvLQBwLgBwLgBwLgBwLQBvLgBvLgBwLQBwLgBwLgBvLgBwLgBwLQBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBv - LgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBv - LQBvLgBwLgBwLgBvLQBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBxLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLwBvMABwLwBwLgBvLwBxLwBz - LAdONqtHPupGPupHP+pIPupIPupHPupHPupHPulHP+tGP+pHP+pHP+pHP+tHPupHP+pHPupHP+pHP+lH - P+pHPupHP+lIPulIPupIPupJP+pFQfFiMFdpMDlEPu5HPulIPulIPulHP+pHPulHPupHPulHP+pHPupI - PulHPupGP+pIPupHP+lHPulHP+lHPupHP+pHPulHP+pHP+lHPulHPupHPupHP+lHP+pHPupHP+lHP+lI - P+lIP+lHP+lIP+lHPupHPupDP+5kMFtxMAZwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLQBw - LQBvLgBvLgBvLQBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBw - LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBv - LQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLQBwLgBwLQBvLgBwLgBvLgBw - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBwLgBvLQBvLgBvLgBvLgBwLgBv - LgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLwBxLgBvLgBvLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBw - LgBwLgBwLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBxLwByLQNXM35IQOxHPetI - P+pIP+pIP+lHP+pHPupHPupHP+pHPupHPupHP+pHP+pHP+pIP+pHP+pGPupGP+lHPupHPulHP+pIP+pI - P+tIP+tHPupDQvNlMlltLyRDPvJIP+lHP+lHP+lHPulHP+pIP+pHP+pHPupHPulHPupHPulHPupHP+pI - PupIP+pIPupHP+lHPupHPupHPupHPulHPupHPulHPupHPupHP+pIP+lHPulHP+lIP+lHP+lHP+lHPulH - PupHPupEP+5eMmtxLwRwLgBwLwBwLwBvLwBwLwBvLgBwLwBvLgBwLwBwLgBvLgBwLgBwLgBvLgBvLQBv - LgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLQBwLgBwLgBvLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLQBwLgBwLgBvLgBvLQBvLgBwLgBvLgBv - LgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBwLgBvLgBvLQBv - LgBvLgBvLwBwLgBwLgBvLgBwLQBwLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBw - LQBvLgBvLgBwLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBvLgBvLQBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLQBvLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLQBvLQBwLgBvLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBw - LgBvLgBwLgBvLgBvLgBwLwBxLwBwLwBwLgBxLwBwLgBwMABxLwJlMVJCQPFHPupHP+pHPulHP+pHP+pH - P+pHP+tHPupHPupHP+pHP+lHPupHP+pHPupIP+pHP+lHPupIPupIP+pHPupHP+pIPupIPupHP+pDQfNj - MFpzMBtFPuVIP+lHP+pIP+lHP+pIPupHP+pHP+pHP+pHPupHPupHPupHPupHPulHP+pHPupHP+pHP+lH - PupHP+pIPulHP+pHPulHPupHP+pHPupHPulHPulIPupHPulHPulIPulHP+pHP+pIPupHP+pGPuxVNp1y - LQRwLgBxMABwLwBwLgBwLwBvLwBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBw - LgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLQBvLgBwLgBvLQBw - LgBwLgBwLgBvLgBwLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBv - LgBvLgBvLgBvLgBwLQBvLgBvLgBwLgBwLgBwLQBvLQBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBw - LQBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBvLQBvLQBvLgBvLgBv - LgBwLgBwLgBwLgBvLQBvLQBvLQBvLgBwLQBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv - LgBwLgBvLQBvLgBwLgBwLgBwLQBvLgBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgByLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLQBwLgBwLQBvLgBwLgBwLgBvLgBw - LgBwLwBwLgBwLwBwLgBxLgBwLwBwLgByLgJsMkRAP/FFQOpHP+lHPulHPupHPupHPupHPupHPulHP+lH - P+pHPupGP+pHPupHPupHPulHPupHPulIPupIPupHPupHP+lHPupHP+tHPupGQPJmNFl0MAtNOLNJP+lH - P+pIPuhHPupHPupHP+pHP+lHPupIP+lHPupHPulHPulHPulIPupHPulHP+lHPulHPulHP+pHPupHP+pH - PupHPupHPulHPupHPulIPupHP+pIP+lHP+lIPulHP+lIPulGP+pIPupIP+pNNsFzLgdxLgBwLwBwLwBw - LwBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBw - LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLQBvLgBwLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBw - LQBvLQBwLgBwLgBvLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBv - LgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBv - LQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBvLQBvLQBvLgBvLQBvLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBx - LgBvLABvLgBvLgBwLgBwLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBwLwBwLwBwLgBvLgBv - LgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBvLgBvLQBvLgBwLgBwLgBwLwBwLwBvLwBw - LgBwLgBwLgBwLgBwLQBxLBhEPd1JP+hHP+pHP+pIP+pHPupHPulHPupHPulGP+pIPulHP+pHPulHP+lH - PulHP+lHPulHPupHPupHP+pIPulHPupJP+lHPupIPupFQfFnM1pxMAhSNZpIP+pIP+lIP+lGPupIP+lI - PupHPupHP+pHPupIPulHPupHP+lHPupHPupGPupHPupHPulHP+pHP+pIPulHPulHP+pHPupHPupHPupH - PupHP+pHPupHPulHP+pHPupHPupHP+pHP+pIPupHPelIOcZzLQdvLgFwLwBwLgBvLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBw - LgBvLQBvLgBvLQBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLQBwLgBvLgBwLQBvLgBwLgBvLgBwLQBwLQBv - LgBwLgBwLgBwLQBwLgBwLQBvLgBwLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLQBw - LgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLQBvLgBvLQBvLgBvLgBvLgBw - LgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLQBvLQBvLQBvLgBwLQBwLgBwLgBvLgBw - LQBvLgBvLQBwLgBvLQBvLgBwLgBvLgBwLgBvLgBwLQBwLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBv - LQBvLgBwLQBwLgBwLgBvLQBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLABwLgBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw - LgBvLQBwLgBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBxLwBwLgBwLwBwLwBxLgBx - LwB1LQ9JO9NHPutHPupHPupHP+lHPulHPupHPupHP+lHP+lIPulHP+tIPupHPupHP+pHPupHPulHPupH - PupHP+pHPulIPupIP+tHP+pIPutDQPFkNVpyLgRlMFhFP/FIP+lIPulIP+pHP+pIP+pHPulIPulHP+lH - P+tIPulIPulIP+pIP+tIPelGPupGPupHPupHPupIPupHPupHPupHPupGPulGPupHP+pIP+pHPulGPupI - P+lHPulHPupHPulHPulIPupIP+lIPc10LQVwLwBvLwBwLgBwLwBwLwBwLwBvLgBvLwBwLgBwLgBwLgBv - LgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBwLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBv - LgBvLQBwLQBvLQBvLgBwLgBvLgBvLgBwLgBvLgBwLQBvLgBwLwBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBvLQBwLgBv - LQBvLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLQBvLgBwLgBwLgBwLgBvLgBwLQBwLQBv - LgBvLQBvLQBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBxLgBvLABwLgBwLQBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBv - LgBwLQBvLQBvLgBvLgBwLgBwLQBvLgBwLgBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLwB2LwZQM5RFQOtI - P+pHPulHPulHPupHP+pIP+tHPupIP+pHPupHP+pHPupHP+lIPupHPupIPupIPupHPupHP+lHP+pHPupH - PulHPulHP+pGPu9jNFtwLgRvLTtFQOxHP+pGP+pIPulHP+pHP+pHP+pHPupHP+pIP+lIP+pHPupHPupG - P+pHPupHPulHPupHPupHPupHPulGPulHPupHP+pHPulHPupGPupHPulHP+lIP+lHP+lHPulHPupHPupH - PupGPulIPulDPuFzMBdyLgJwLwBwLwBwLgBvLwBxLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBw - LgBwLgBvLgBvLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBvLQBwLQBwLgBv - LgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBv - LQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBvLgBvLgBwLgBv - LgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBxLQBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBvLQBvLgBwLgBvLQBv - LgBvLQBvLgBvLgBvLgBvLgBwLwBwLgBxLwBwLwBxLwBwLwBwLQByLgVaNHVGQutHP+pHPupHPupHPupH - P+lHP+lIPulIP+pIP+lHPutHPupHPupHP+pHPupHPupHPulHP+lIPupHPupIP+lHP+xHPupHPepEP+9Y - M25xMAJxLRFHOdBIP+lHP+lHPutHP+pIP+pHPutHPupHPupHPupIP+pHP+lHP+lHPupHP+pHPulIPupI - PupHPulIP+pHPupHP+lHP+lHP+lIPulHP+lIP+pHPupHPulHP+pHPupHP+pGP+pHPupHPupHPupBPfFw - LS1uLgNwLwBwLwBvLwBvLwBvLwBwLgBwLgBvLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLQBvLgBw - LQBwLgBwLQBwLgBvLgBvLQBvLgBwLQBwLgBwLgBvLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBw - LgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLgBvLQBwLQBw - LgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLQBvLQBwLgBwLQBwLgBvLQBvLgBwLgBv - LgBwLQBwLQBwLQBvLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBwLgBvLgBvLQBwLQBvLgBvLgBwLgBvLgBv - LQBvLgBwLgBvLgBwLgBvLQBvLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBw - LgBwLgBwLgBvLgBwLgBvLABvLQBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLwBwLgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBvLwBwLgBwLgBvLgBwLgBwLwBxLwByLQNoL0BBPu9HPupHPupHPupHP+lGPupIP+pHPupHP+pI - PupGP+tHPupIP+pIPupIP+pHPulHP+pHP+pHP+lHPulHPulHP+pGPupHPupEPu9VM4lzLwR1LglMOrdI - QOlIPulHPupHP+lIPupIP+lIPupIPulIPupHPupHPupGP+pHPulHP+lHP+pGPulIPupIPupHPupHP+pH - PupIPupIP+pHPupHPulHPupHP+pHPupIPutIP+pHPupHPulHPupIPupHPupBPvBsLTNwLwNwLgBwLwBw - LgBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLwBv - LgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LQBvLgBvLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBx - LwBxLQBwLQBwLQBwLgBwLgBwLgBvLgBvLQBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLwBvLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBvLwBwLwBwLgBvLwBwLgFzLCFAPe1HPulIP+lIPulHPupHP+lHPupIPupGPupHPulHP+pHP+pHP+pH - P+lIPulHPulHP+pIP+lHPupHP+pHPulHPepHP+pIPutHPu5SNZx1MARwMANfM3BEP/BGPulHP+tHPulH - P+lHP+pHPupIPupHP+lIPupIPupIPulHP+lHPupHPulHPupHPulIP+pHP+pHP+pHP+pHPulHP+pHP+lG - PupIPulHPupHPulHPupIPutHPulHPulHPupHPupIPupDQu9mLTdxLwJwLgBwLwBwLwBwLwBwLgBwLgBw - LwBvLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLQBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBwLgBwLgBv - LgBvLgBvLgBvLQBvLQBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBv - LgBwLgBvLgBvLQBwLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLQBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBxLgBwLQBwLQBwLgBv - LgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBvLQBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBx - LgBxLgB0LgxIN8FHPelGPuhHP+lGPepHPupHPulHPupHPutHPupHPupHP+pHP+pHPupHP+lHPulHP+pH - PulHP+pHP+pHPupHPupHPupHP+lIP+xNNq9zLQZwLwJsMUBBQO9HP+lHP+pHPupHPupIPupHPulHPupH - PulHPulHPupHPulIPulHP+lHP+lHP+pHP+pHPulHP+lHP+lHPulHPulHPupHPulIPupHPupHPulHP+pH - P+lHPupHPupHPulHPupHPulIPutFQPFhMWJxLwRwLwBwLwBvLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBw - LgBvLQBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBwLQBvLgBvLgBvLgBwLgBwLgBw - LgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw - LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw - LgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBxLgBwLQBwLgBvLgBvLgBwLgBvLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBv - LQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBxLQBxLgZTNZVG - P+xIPupIP+lGP+lHPupHPulHP+pHPutHP+pHPutHPupHPupHPupHP+pHP+lGP+pHP+pHPupHPupHP+pH - PupIP+tIPupHP+pNN7RyLgdyLwBzLRdGPuFFPetGPupHPupHPupHPupHPulHPulHPupHPulHPupHPupH - PulHPupHPulHP+pHPupHP+pHPupHPulHPulHPulHPupIPupHPulHPupHPupHP+pIP+lIP+lHPupHPupH - PupHPepHPupGPu9ZM4dwLwZwLwBwLwBwLwBwLgBvLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw - LgBvLgBvLQBwLgBwLQBvLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBw - LgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBv - LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw - LgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLQBvLgBwLgBwLgBvLgBwLQBvLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBv - LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBvLQBwLgBwLgBv - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLQBxLgBvLwNnMEdDP+9IPulIPupHP+pH - PupGPupHPupHP+lHP+pHPulHPupHP+pHPupHPupHPupHPulHPupHPulHP+lHP+pHP+pHP+pIP+tHPupJ - N7d1MAdxLwBxLAZSNp1HPupIPupIPulHPupHPupHPulHPulHPupHP+lHPupHPupHPupHPulHPulHP+lI - PulHPupHPulHPupGPulGPulHPupHPulHP+lHPulHP+lHPulHP+pHPulHPulHP+pHPupHPupHPupIPu1W - NplxLgdwLwBwLwBwLwBvLgBvLQBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLgBvLgBw - LgBwLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLQBw - LgBwLgBwLgBwLgBwLQBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBv - LgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw - LgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBvLQBwLgBw - LgBvLgBvLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBwLQBwLgBwLgBw - LgBwLgBwLgBwLgBxLgBvLABwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBw - LgBvLgBwLgBwLwBvLgBwLwBwLgBwLgBwLQBwLgBwLgJuLSlAPOlIPupHP+tGPulHPulHPupHPupHP+tH - P+lHP+tHP+pIPupHP+pHPupHPupHPulHP+pHPupHPupHP+lHPupIP+pHP+pJP+tFOMV1LgpyLgBwLQNj - MlpCQPBHPulHPupJP+lHP+lHP+pIP+pHPulIPulHPupHP+pGPupGPupHP+pHPulGPulIPupIPulHPulH - P+lHPulGPulGPupHPulIP+pHPupIPupIPupHPulHPupHP+pHPupHPulHPupIPetQNqJ1LgZxLgBwLwBw - LgBvLgBvLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLwBvLgBwLgBvLQBw - LgBwLgBvLgBwLQBvLgBwLgBwLgBvLQBwLgBwLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBv - LQBwLgBwLgBvLgBwLwBvLgBwLgBvLQBvLgBwLgBwLgBvLQBvLQBvLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv - LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBv - LgBvLgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBx - LwBwLQBwLgBwLgBwLwBwLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw - LwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLwBvLgBvLgBvLgBwLgBvLgBvLgBwLwBxLwBwLwBv - LgBwLwBwLwBwLwBwLgBwLgBwLwB1LQpJOcpKP+pGPutIP+pHPupHPupHPupGP+lIPutIPupHP+tHPulH - P+pHPulHPulHP+lHPulHP+pHP+pHPulHPutHPupHPupIPepDON1wLRxxLgBzLwF0Lys+QO1HPulHPuhH - PulIPupHPupHP+lHPulHPelHP+lGPulHPulGP+pHPulHPulIPupIPupHP+lHPupHPulHPulHPulHP+lH - P+lHP+pHP+lIP+lHPulHPulHP+pHPupHPupHP+lHPulHPutNObdzLgdwLgBwLwBvLgBvLgBwLgBwLgBv - LwBvLwBwLgBwLgBvLgBwLQBwLgBvLgBvLgBvLgBwLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBwLgBwLQBwLgBvLgBvLgBv - LgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLwBwLgBvLgBvLgBv - LgBwLgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBw - LQBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBxLwBwLQBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLgBw - LgBxLgBwLwBxLgZYM39FPexHP+lIPupHPupHPupHPupHPupHPulHPulHPupGPepHP+lHPulIP+lHP+lH - P+pIPupHPupHPutIPupHPupIP+pIP+pAPe9xLzByLwBzLwJ0LwtNO7pHPulIPupHPulHPupHP+pIPulH - PepHP+pHPupHP+pHP+pHPupHPupIPulHP+pHPulHPupHPulHPulHP+lHPulHPupHPupHPulHPulIPulG - PupHPupHPulHPupHPulGPulHPupIPulHOtlxLhJwLwBvLwBwLwBvLgBxLwBwLwBwLwBwLgBvLgBwLgBw - LgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBw - LwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LwBwLQBwLgBvLQBvLgBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLgBvLgBwLQBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLQBwLQBvLgBv - LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBvLwBwLwBvLwBwLQBwLwBxLgBwLQVo - MktDPO9JPutHPupHPulHPelGPupHPupHPupHPulHP+pHPupGPelHPulHPupHPupHP+lHPulHPupHPupH - PupHPupHPupIPulCPfRtLDVwMABwLgByMAVeMWxEP+1HPelHP+pIPupHPupHP+pHPupHPupHP+pHPulH - P+pHP+lHPulHPulHP+pHPelHP+pIPulHPulIPulHPupHPulHPulHPupHPulHP+lHPupIPulHPupGPupH - PupHP+pHPupJP+lGPOVyLRhvLwBvLgBwLwBvLwBwLgBvLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLQBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBw - LgBwLQBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv - LQBvLQBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLQBvLgBwLQBvLgBvLgBwLgBwLgBvLgBvLQBvLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLQBvLgBvLQBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBxLwBwLQBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBv - LgBwLgBvLgBvLgBvLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBw - LgBvLQBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBxLgF2LBdCPOJIP+pGP+tI - PupIP+pHPupHPutHPupHPulHPupHPepHPulIP+lHP+pHPulHPulGPupHPulHP+pHPupHPulGPupIPutB - PvNrLz5yLgFwMABwLwJuMDJEPOdHQOlIPulHP+lIPupHP+pHPulIPupHP+lHPulIPulHP+lHPulHP+lH - PupHPulHPupHPulGPupHPupHPulHPulHPupHP+lHPupHPupHPupGPulHPulHPupHPulHPupGP+lGPOxE - P+ZvLRtwLgJwLwBvLwBwLgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBwLgBw - LgBvLQBwLgBvLgBvLgBwLgBwLgBvLQBvLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBvLgBw - LgBvLgBvLQBvLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBw - LgBwLgBvLgBvLgBvLQBvLgBvLQBvLgBwLgBwLgBvLgBvLQBvLgBvLQBvLQBwLgBvLgBwLQBvLgBvLgBw - LgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLQBvLgBv - LgBvLgBvLgBvLQBvLgBvLQBwLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBv - LgBvLgBwLgBwLwBxLgBuLABwLgBwLgBwLgBvLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLgBxLgBzMAhRNp9JPulHPupIPupIPupGP+lIP+lH - P+pIPupHPupHPepHP+lHPulHP+lHPulHP+lHPupHPulGPupHPupIPulHPupHP+tFPu9hMGxxLgJxLgBx - LwBzLwxMN7dJP+hHPuhHPupIP+pHP+pHPupHPupHPulHPupGPupHPulHPupHPupHPulHPulGPupHPupH - PupHPepGPupHPulHP+pHPupHPupHPulHP+pHPulHPulHP+lIPulHPupHPelHPupCP+pqLzZyLwNwLwBw - LwBvLwBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBv - LgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLQBw - LgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLwBwLgBwLgBwLgBv - LgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBv - LgBwLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLQBv - LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBx - LwBwLABwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBw - LgBwLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLQBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLwBwLwBwLwBw - LgBwLwBwLgBwLgBwLgBwLgBvLwBwLwBxLgVfMWZEQe5HPupHPupHPupHP+lGPupHP+pHPupHPupHPulH - PupHPulHPupHPulHPupHPulHPepHPulGP+pHPupHPupHPulGP+pZMo1yLgRxLwBxLwBxLwRhMlxGQexJ - P+lIP+pHPupHP+pHPulHPupHPupHPupHPulHPupHPupHP+pHP+lHPupHPupHPulHPulHPulHPupHPupH - PulHPupHPupHPulHPulHP+pHP+lHPulHPupHPulHPulHPupEQO1iMFtxLwZwLwBwLwBwLwBwLwBwLwBw - LwBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBw - LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBwLgBwLQBwLgBvLQBwLgBwLgBwLQBvLgBwLwBwLgBvLgBwLgBwLQBwLgBvLgBwLgBw - LgBvLgBwLQBvLQBwLgBvLQBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBw - LgBwLQBwLgBvLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBvLgBwLgBw - LgBwLgBwLgBvLQBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBv - LgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLQBv - LgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLgBw - LgBwLgBwLgBxLwBwLwJxLSxAQe9HP+lHP+pHPupHP+pHP+lHPutHPulHPupIPupHP+pHP+pHP+lHP+lH - PupHPupHPupHPulHPupHPupIPupHPepJPulUNZV1MARxLgBxMABxMAFzLxdFPNlGP+pHPulIPupIP+pH - PupHPutGPulHPupHP+pHPupHPupHP+lHP+lHPupHPulGPulHPupIPupHPulHPulHPupHPupHPupHPupH - PulIPulHPupGPulHP+pHPulHPelIPuhEQe1gMmlwLgdwLwBvLwBvLwBwLwBwLwBvLwBwLgBwLgBwLgBv - LgBvLgBwLgBvLgBwLgBwLQBwLgBvLQBwLgBvLgBwLgBwLQBvLQBvLQBvLgBwLgBvLgBwLgBvLgBwLQBw - LgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw - LgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBwLgBv - LgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLQBv - LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBw - LgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBxLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBz - LgB1KgxHOclIPepHPutHP+pHPupHPupHPupHPupHPulHPupHP+pHPupHP+pIPulIPupHPupHPupHPupH - PupHPupIP+pJPupIPuhHOMF3MAlwLwBxLwByLwB0LQdZNZFEQe1HP+pIPupIP+pIP+pHP+pHP+lHP+lH - PupHPupHP+lIPupHPupHPupIPupHP+lHP+lHP+pHPulHPupHP+pHPupHPupIPulHPupIPupHP+lHPupH - PulHPupHPulHPutFP+taM3tyLwRwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBvLwBw - LgBwLgBvLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLQBwLQBvLgBw - LgBwLgBwLgBvLgBwLQBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLQBwLgBvLQBvLgBwLgBv - LgBvLgBvLgBwLgBvLQBwLQBwLQBvLgBvLgBvLgBwLgBvLQBwLQBwLgBwLQBwLgBvLgBvLgBwLgBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBv - LgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBv - LgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBv - LgBvLgBvLgBwLgBwLgBwLwBwLgBwLgBxLwBwLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBv - LgBwLgBwLQBvLgBvLgBwLgBvLwBvLgBwLgBwLgBwLgBvLgBvLgBwLQBvLQBwLgBwLgBvLgBvLQBvLgBv - LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBwLgBwLwBwLwBwLgBxLgB0LQVSM4xGPuxI - PutHPulHPupIPutHP+pHPupHPupHPulHPupHP+lHP+lHPulIPupHP+pHP+pIP+pHPupHPupIPupHPulH - PutBO+Z1LxJxLwBwLwBwLgBvLQNuLzBBP+dHPulIP+pIP+pIPupHP+pIPupIP+pHPulHPupHPulHPulH - PupHPulHPupHPulIPulHP+tHPupIP+pHP+pHP+pHPupHPupHP+pHP+pIPulHPupIPulHPupHPulHP+lH - QOlPNbJzLQdwLgBvLwBuLwBvLgBwLgBxLwBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLQBwLgBvLgBv - LgBwLQBvLQBvLgBvLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLQBwLgBvLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLQBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLQBwLQBwLgBwLgBvLgBw - LQBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLQBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLQBwLgBwLgBv - LQBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBw - LgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBwLQBvLgBwLgBvLgBv - LQBwLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLQBwLQBwLgBvLgBwLgBvLgBwLgBw - LgBwLgBvLgBwLgBxLwBwLQBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBv - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBw - LgBwLgBwLwBwLQBwLgBwLgBvLgBwLwBwLgBwLwBwLgBxLwBxLQByLwVrLT9CPe1HPupIPupHPulHPupH - P+pHP+pHP+pIPupHPupHPupHP+pHPulHPupHPulHPupHP+pHP+pHPulHPupHPetIPepAPOpxLBpxLwBx - LwBxLwBwLwByLQlQNqdHP+tIPupIP+pIP+pIP+pHP+pHP+lHP+pIP+pHPulHPupHPulHP+lHP+pHPulH - PupHPupHPupHPupHPulIP+pHPupHPupHPupIPulIPulIPupIP+lHP+lHPulGPutGPupJPNJ0LgtxLgBw - LwBvLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBw - LgBwLgBvLgBvLQBvLgBwLgBvLgBwLQBwLgBwLgBvLgBvLQBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLgBv - LgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBv - LgBwLgBvLgBwLgBwLQBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBv - LgBvLQBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBx - LwBwLABvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBvLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLQBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBwLgBw - LwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBxLwBxLwFyKw5EOtdHPupIP+tIP+lGPupHPulHPupHP+pHPupH - PupHPulHPupIPupIPupIPepHPupHPulIP+lHPupHPepIPulGPutFPe9oLk5wLwNxLwBwLwBwLgBxLgRr - MTxDPutHPupJPupHP+pIPupIPupIPupHP+pHPupIP+pHPulHPupHP+lHPupHPupHP+pIP+pHP+pHP+lH - P+lGPupIPulIPupHPulIP+pHPulHPupHPupHPupHPulIP+tHP+hEO9hyLQ9xLwBwLgBxLwBxLwBwLwBx - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBv - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLQBwLgBwLgBvLgBwLgBvLgBvLQBvLgBwLgBvLgBv - LgBwLgBwLQBwLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBvLQBw - LQBwLgBwLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBw - LgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBv - LQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLQBvLgBvLgBvLgBv - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBw - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLwBvLwBwLwBwLgBx - LgBwLwBxLgBxLgBvLwBwLgBxLAdXMY5HQOxIPetIPupHPupHPupHP+pIPupHPupHP+pHPupHPupHPulI - PupHPupHPupHP+pHP+pHPulHPupIPelJP+lHP+1gMm1yMARwLwBvLgBvLgBxLwBxLQlQNa9IPulJP+pH - PulIPupHP+lHPupHP+pIP+pHP+pHPulHPupHP+lIP+pHPupHPulHPupHP+lHPulHPulHP+pHPulIPulH - PupHP+lHPulIPupIP+lHPulHPulIPupHP+lBPOtsLyxwLgNwLgBxLgBxLwBwLgBxLwBwLgBwLgBwLgBw - LQBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLQBwLQBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLQBwLgBvLQBwLgBvLgBvLQBvLgBwLgBwLgBv - LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBw - LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBw - LgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLQBwLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBw - LQBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBv - LQBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBxLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBxLwBwLwBw - LgBwLgBwLQNqMEJEPelHPupIP+lHPupHPepHPupHP+pHP+pHP+tHPutIP+pHPupIP+pHP+pHP+pHPetH - PupIPupIPupGPuhIPuhIP+laMnxyMANxLgBxLgBwLgBwLwByLgNtLzpCP+lKP+pJP+pIPulHP+pIPulH - PupHPupHPulHP+pHP+pIP+lHP+pIPulHPulHP+lGPupHPulIP+lIPupHPupHPelIP+lHPulHP+lHPulH - PulIPupHPepHPulHP+lCPu5pLkJxLwRwLwBwLwBwLwBxLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLQBwLQBwLgBvLgBw - LgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBvLQBvLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBv - LgBvLQBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBw - LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBv - LQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBv - LQBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBvLgBvLQBvLgBwLgBv - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBvLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBvLQBv - LgBwLgBvLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLQF2LhVH - O9JJPulIP+pIPupHPupHPepHPupIPupIPulHP+lHPupHPupHP+lHPulIPupIPupHPulHPupHPupHPupH - PuhHPulJObx2LwVyLwBwLgBxLgBwLgBxLgB1LgZROadGQO5HP+tIPupIPupIP+pIPupHPupHPupHP+pI - PulHP+pIP+pHPupHPulHPupHPulIPulHPulHPulHPulHP+lHP+lHPulIPulIPupIP+lHPupHPulHPulI - PupEPu5mLktyMQRxLwBwLwBxLwBvLwBvLwBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBvLQBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBwLQBwLQBwLgBvLgBvLQBvLQBwLgBvLgBwLgBv - LgBwLQBvLQBwLgBwLQBvLgBwLQBvLQBwLgBwLgBvLgBwLQBvLgBvLQBwLgBvLQBvLgBvLQBwLgBvLgBv - LQBvLQBvLQBvLQBvLgBwLgBwLgBvLQBvLQBvLgBwLQBvLgBvLgBwLgBvLQBwLgBwLgBvLgBvLgBvLQBw - LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBv - LgBvLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBv - LgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBxLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgB0LAVYNYhFPu5IPupIP+pH - P+pIPupGP+pHPupHPupHP+pIPupHPulHPulIP+pHPupIPupHPupHPupHP+pHPupHPupHPupIPMl2Lwdv - LgBvLgBxLwBxLwByLwByLwNvMCNGQeVHP+tHP+pIP+pHPulIPupHP+pHPupHP+pHPulIP+lHPupHP+pH - PulIPupHP+pHP+lHP+pIPupHPulIP+pHP+pHP+lHP+lHPulIPupHPupHPupHPulHPulGP+1VMpNzLwZw - LgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBv - LgBvLQBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBvLQBwLQBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv - LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBv - LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBv - LgBvLgBvLQBvLQBvLQBvLQBvLgBwLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBx - LgBvLQBvLgBwLgBvLgBwLgBwLgBvLQBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLgBwLQBwLgBvLgBwLgBwLgBwLwBvLwBw - LwBwLwBwLgBwLwBwLwBwLwBxLgBwLgBwLwBwLwBwLwBwLgNrLTFCP+1IPupIPupIPupHPutHPulHPutH - PupHPupHPupHP+pHP+pIP+pHP+pHP+pHP+pIPupHPupHPupHPupGPupCPeRvLSlvLwFvLQBxLwBxLgBx - LwBzLQB0LgVdNnpFP+1HPupHPupHP+tHPutHPulHPupIPupIP+lHP+pHPulHPupIP+lIP+lHP+pHPulH - PupHPulHP+lIPulHPupHPupHP+lIPulHPulHPupHP+pGPulHP+lIP+hPOqx0LgdxLwBwLgBwLwBxLwBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBvLQBvLgBwLQBv - LQBvLQBwLgBwLQBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBw - LgBwLgBvLgBvLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLQBvLQBvLgBwLgBw - LgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBv - LgBwLgBvLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBvLgBvLQBwLgBv - LgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBv - LgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBvLQBvLgBwLgBwLQBwLgBxLgBuLQBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLwBw - LgBwLgBwLwBwLgBvLgBwLgBwLgBvLgB1LQVMO75HP+tHPulIPupIPulIP+lHPupIP+pHPupHPupHP+pH - P+pHPupIP+pHPulIPupHPupGPulGPulHPupHPupBPfBrMEdxLgFwLgBwLgBwLgBwLwBxLgByLQF1LRJL - O8NHPetIPupIP+pHPupIP+pIPupIP+lIP+pHPupIPupIPupHPulHP+pHPupHPupHP+lHP+pIPulHP+pI - P+pIP+lHP+lIPupHPulHPulHPulGPepIP+pHPehIOcJ0LghxLwBuLwBwLgBwLwBvLwBwLgBvLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLQBwLgBwLgBwLQBwLQBwLgBvLgBvLgBvLgBwLgBwLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBxLgBvLQBwLgBwLQBwLgBvLgBwLgBvLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw - LgBvLwBwLgBxLQByLwRkMlpDQO5IPupIPupHPulIP+pHPulIP+pHPupHP+lHPupIPupHPupHPulHPupH - PupHPupHPulHPupGPepHPepEPu5eMmpvLQJvLQBwLgBwLgBwLgBwLwBxLwBwLgNvLzxCPedIQOtHP+pH - P+lHPupHPulIPupHP+pHP+pHPupHPulHPulIPupHPulHPulHPulHPulHPulHPulHP+lHPulHPulIPupH - PulHP+pHPulHPepHPepHPelAPOp0MCFwLgFwLwBwMABwLwBwLwBwLgBwLgBwLQBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBv - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBv - LgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLABvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLgBwLwBwLgBw - LAByLhJEO9hIP+pIPupHPulIP+lHPupIP+pHP+lHP+pHPulHPupIPupHP+pHP+pHPupHPulGPupGPupH - PupHPupHPuxQNKV1LgRvLgBwLwBxLwBwLwBwLgBwLgBwLgBxLwVgM29FQPBHPupIPupHPulIPupHP+pI - PulIPupHPulHPulIP+pIPupHPupHP+pHPulIPupHP+lHPulIP+lHP+lHPupHPulIPulHPulIP+pHPupI - PupHPuk/Pu5uLClwLgFwLgBvLwBxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBw - LwBwLgBvLgBwLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxLgBwLwBvLwBvLwBvLgBwLwBwLwBvLwBwLgBwLgBwLwBwLABwLgByLQVcNH9FPu5H - P+tIP+pIPupIPupHPupHPupHPulHPupHPupHPupHPupHPupHPupHPulHP+pHPupHPupHPupHP+tFOMZ1 - Lw1wLQBxLwBwLwBwLwBwLgBwLwBwLwBvLgB1LQ1VOqVFP+5HPupHP+pIPulHP+pHPupHP+pHPulHP+pH - P+lHPupHPulHP+pHPulIP+lHP+pHP+lHPupIP+pHPupHP+lHPulHPulIPupIPutIPulHPupIP+1fMFpx - LwRwLwBxLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv - LgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBwLQBwLgBwLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBv - LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBv - LQBwLQBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBx - LgBwLQBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLwBxLwBwLwBv - LwBwLwBvLwBwLwBwLwBwLwBxLwBxLwBxLwBwLwBwLwBwLgBwLgBwLgFxLR9EPNxIP+pHP+lIP+pIPupI - PupIPulIPupIP+pIP+pHPupGPupHPupHPepHPepIPulHPupHPupIPupDPew/P+xyLR5vLgBxLwBwLwBx - LwBxLwBwLwBwLwBwLgByMAFyLRNLOrVFP+9FP+tIPutHPupHPupHPulIPulHPupHPupHP+pHPupHPulH - P+pHPupHPulIPupIPulHPulHPulHP+lHP+pHPepHPulHPepGPupHPupGP+9YMn1xLQZuLwBxLwBwLwBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLQBwLgBwLQBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBw - LgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLABwLgBwLgBw - LgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBxLgBwLwBx - LgBwLwBxLgBwLgBwLwBwLwBxLwBwLgBxLgByLwByLQRZM4lFPu5JPulHP+pHPupHP+lHP+pHPupHPupH - PulIP+pIP+lGP+pGPupHP+tHPepGP+pHPelIPupGPetDPO9nMFBwLwVxMABwLwBxLwBxLwBxLwBxLgBx - LgBxLwBwLgFyLx1GPM9HQOxHPulGP+lHP+lHP+lHP+pHPulHPupHPupIP+pHPulHP+pHP+pHPupHPupH - PupIP+lHPupHPupHPulIPupGPulGPupHPupHPutIP+1LN7JzLgpvMABwLwBwLwBwLgBwLgBwLgBwLgBw - LgBvLQBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLQBvLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLQBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv - LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv - LgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLwBw - LgBwLwBwLgBwLwBwLwBwLwBxLQFwLSBDPeNHPutIPupHP+pHPulHPulHPulHPupHPupHPupIP+pHPupH - PupHPupHPupHPupHPupIPutGPuhEP+1ZL4NvLQZxLwBxLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBzLwFw - LypGO9BGQO9IPutHPupHPupIPupIP+lHP+pHP+pIPulHPupHPupHPulIPulIPulHP+pHPupHPupHP+pH - P+pHPupHPulHPupHPupHPupIP+tFPN5zLhRxMQBxLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLQBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBv - LgBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLQBvLgBwLQBwLgBwLgBw - LgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBvLQBvLgBv - LgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBw - LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBxLwBxLABwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBvLgBvLgBwLgBwLgBvLgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLQBw - LwBwLwBvLgBxLQVcNn9DP+5IPutHPutIP+pHPupHPupHPupHP+pHPupHP+pHPutHPupHP+pIPupHPupI - PutHP+pHPulIPupLO790LQZxLwBxMABwLwBwLwBwLgBwLwBxLgBxLwBwLgBwLgBxLgJwLydJOL9EQO5H - PetHPupGPupHP+lIP+pIPulHPupHPupHPupHPupHPupIPutHPulGPupHP+pHPepHPupHPupHPupHP+pI - PupHP+pIQO1CP+ptMi9xMAJxLgBwMABwLgBvLgBwLgBwLwBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBv - LgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBwLgBvLgBwLQBv - LgBvLQBvLgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv - LgBvLgBwLgBvLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBvLgBvLgBvLgBw - LgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLwBxLQBvLgFz - LRZIO8xIPupJPulIP+pIPupHPupHPupHPupIPepHPupHP+pIPupHPupHPupHPupHPupIPupHPupJPupF - POJ0MBVxLgFwLgBxLwBwLwBwLwBxLwBxLgBwLwBwLwBwLwBxLwByLQJzLRZPN65EPu5HQOpHP+pIPulI - PupHPupHP+pHPupHP+tHPupIPutHPutHPupHPupGPutIPupHPutHPupHPupHPutHPupHPupHP+tDP/Bj - L1duLgRwLgBwLwBwLwBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBwLgBvLgBwLgBvLgBwLgBwLgBvLQBwLgBv - LQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLQBwLQBvLgBwLgBvLgBwLgBwLgBvLgBwLwBvLgBvLgBvLgBw - LgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBv - LQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBwLgBw - LgBxLABwLgBwLgBvLgBwLgBwLwBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLwBvLgBwLQBwLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBw - LwBvLgBwLgBwLwBvLgBwLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLQByLgByMARkMl9EPu5JP+lI - QOhIPulHPupHPupHPupHPutHPepHPulHPupHPupHPutHPupHPutIPupHP+pHP+pEQPFoLVVxLwNwLgBw - LgBwLgBwLwBwLwBwLwBxLwBxLgBwLwBxLgBxLwBwLgFzLQheMnJCPOZGPuxGPulIPupHP+lHPupHPupH - PupHPelHPupHPetHPupIPupHP+pIPupIPutGPupHPupHPupIPupHPupHP+xGQOtWMpJxLwZwLwBwLwBw - LwBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLQBw - LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBv - LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw - LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBv - LQBwLQBwLQBvLgBwLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBwLQBvLgBwLgBvLQBvLgBvLgBwLgBvLgBv - LgBvLQBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBxLgBwLgBvLgJzLQRUMZJFP+pIPulHPulHPulIPulI - P+lHPulHPulHPupHPepHPupJPutHPelHPulIPulHPulIPupGPutPOrZyLAVxLgFwLgBwLgBwLwBwLwBw - LwBvLwBwLwBvLgBwLQBwLgBxLwBxLwBwLQJ1LglgNWxGPtdEPu9HQOpGPepHP+pHP+pGPetGPupGPutH - PetGPetHPepHPutHPutHPupHPutHPutIPupHPepIP+xHPutJO8p0LA9wLgBwLwBwLwBwLgBvLgBvLgBw - LgBwLgBvLgBvLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLQBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv - LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBwLQBvLQBvLgBvLgBvLgBv - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBxLwBvLQBwLgBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLQBv - LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBvLgBwLgBvLwBwLgBwLwBwLgBwLwBv - LwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBzLRlIP8lDQulEQ+pFQ+lFQulFROtEQ+tEQ+tEQ+pD - Q+lDQulDROtFQ+lFQ+lFROtEROpEROlGROlBQuJpLzFyLQJxLQBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw - LwBwLgBwLgBvLgBwLgBwLgBxLQR2LxVmL09SOaZHPc5BQepDQutDQelCP+lCP+pFQetEQelDQOlDQOpD - QepDQelEQupDQepDQepDQelHROlEQ+o9RutsLy9xLwFxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBw - LgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBv - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBw - LgBwLgBvLQBwLgBvLQBwLgBvLgBvLQBvLgBvLQBvLgBvLgBvLQBwLgBvLgBwLQBwLgBvLgBvLgBvLgBv - LgBvLgBvLgBwLQBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBv - LgBvLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBwLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLgBxLgBwLwBvLwBwLwBwLgBwLwBw - LwBwLwBwLwBwLgBwLQByLgB0LwF0LxR1MyB0MiB0MSB0MCB0MB90MB90MSB1MCBzMCBzLiBzMCByMCB0 - MSBzMCB0MSB0MCByLyBzMR9zLwpyLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBxLwBvLgBw - LQBwLwByLgByLgFzLgNzLQZxLhB0MB9yMSB0MiB0MSBzMiB0MSB1MCB1MSB0MSB0LyB1MCB0MSByMiB0 - MiB0MiBzMiB0MSBwLh9wLgdxLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBw - LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBv - LgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBv - LgBwLgBwLgBvLgBxLgBxLQBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBxLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLgBw - LgBvLgBxLQBxLQFyLQFxLgFvLQFwLgFxLwFwLwFwLgFxLgFxLQFxLgFwMAFzLwFzLgFyLgFxLgFxLgFx - LQFyLgFxLQBwLgBwLgBwLwBxLwBwLwBwLgBwLwBwLwBvLwBwLwBwLgBxLwBwLgBwLQBwLgBwLwBwLgBx - LwByLAByLgFwLQFxLQFyLQFwLgFwLQFzLgFzLQFxLgFyLgFwLgFyLQFxLgFyLwFyLwFxLwFxLwFvLgFu - LgFvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLwBw - LgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBv - LgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBv - LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLwBwLgBwLQBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBx - LgBxLQBvLgBwLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLQBvLgBwLgBw - LgBvLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBvLwBwLwBwLwBwLwBwLgBwLwBvLwBvLwBvLwBwLwBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLgBwLgBx - LQBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLwBwLwBwLgBxLgBwLQBxLgBwLgBwLwBx - LwBwLwBwLwBwLwBvLwBxLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLwBwLgBxLgBwLwBwLgBxLwBx - LwBwLgBxLgBxLQBxLgBxLgBwLgBxLwBxLgBwLgBxLgBwLgBwLwBwLgBwLwBwLgBwLgBxLwBwLgBxLwBw - LwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBv - LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLQBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBv - LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBxLgBvLQBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBvLgBwLwBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBvLwBwLgBwLwBv - LgBwLgBwLwBwLgBvLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBvLwBwLwBwLgBxLwBwLwBwLgBwLgBwLgBw - LgBwLgBwLwBwLwBwLgBwLwBxLwBwLwBwLgBxLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBx - LwBwLgBvLgBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBxLwBwLgBxLwBwLgBwLwBwLwBx - LwBwLwBwLwBxLgBwLwBxLwBxLgBwLwBxLwBxLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBw - LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLgBwMABwLwBvLwBwLgBvLwBvLgBvLgBwLwBw - LwBwLgBvLgBwLgBvLgBwLwBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBxLwBwLwBwLwBwLgBwLwBw - LwBwLwBwLwBvLwBxLwBwLwBwLwBwLwBxLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLgBwLwBwLgBx - LwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBxLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBw - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLQBvLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBxLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBv - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv - LgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw - LgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBwLgBvLwBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLQBv - LgBwLgBvLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBw - LwBvLgBwLgBwLwBwLgBwLwBvLwBwLwBwLwBvLgBwLwBvLgBwLgBwLwBwLwBwLgBvLgBwLwBvLwBvLgBw - LgBwLwBwLwBwLgBvLgBvLgBvLwBwLgBwLgBwLgBvLgBwLwBwLwBvLwBvLwBwLgBwLwBwLwBvLgBwLgBv - LwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBxLwBw - LwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBxLgBwLwBwLwBwLwBxLwBx - LwBwLgBxLwBwLwBxLwBwLwBwLwBxLgBwLwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBw - LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLwBwLwBxLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBw - LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBv - LwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBvLgBvLgBwLwBwLgBv - LwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBvLgBwLwBwLwBw - LwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLwBw - LgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLwBwLgBw - LgBvLgBwLwBvLgBwLwBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBx - LwBxLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLwBvLgBvLgBwLgBwLgBwLwBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBx - LgBxLwBxLwBwLwBxLwBwLwBwLwBwLwBwMABwLwBxLwBwLwBwLgBwLwBxLwBxMABwLwBwLwBwLwBxLwBx - LwBxLwBxLwBwMABwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwMABwMABwMABwLwBwLwBwLwBwLwBxLwBx - LwBxMABwLwBxLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBvLgBwLgBwLwBvLgBwLgBwLwBwLgBvLgBwLwBv - LwBwLgBwLgBvLwBwLwBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLwBw - LwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBw - LgBwLwBwLgBvLgBvLwBwLgBvLwBvLgBvLgBwLgBwLgBvLgBvLwBwLwBwLwBvLwBvLgBvLwBwLgBwLwBw - LgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBx - LwBwLwBwLwBwLwBwLwBvLgBvLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBxLwFxLwJwLANv - LARvLAZuKgZuKwZuLARvLwJxLgJwLwFwLwBwLwBwLgBwLwBwLgBvLQBwLgBwLgBwLwBwLwBwLwBvLgBw - LwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBvLQBvLgBvLgBvLgBwLgBxLwBwLQBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLwBwLgBvLgBwLwBw - LgBvLgBvLgBwLwBwLgBwLwBwLgBvLwBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLwBwLgBvLwBw - LgBwLwBvLwBwLwBwLgBvLwBvLwBwLgBvLgBvLwBwLwBvLwBwLgBwLwBwLgBwLwBwLwBsKAdpJAtpJAtp - IwtqIwtqJAtpJAtrJAtqJAtqJAtqJAtqJAtrJAtqJAtrJAtqJAtrJAtqJAtqJAtqJAtqJAtqJQtqJAtq - JAtqIwtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqIwtrJAtrIwtrJAtrJAtqJQtpJAtrJQtt - KgVwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLwBwLgBvLgBvLwBvLwBwLwBwLgBvLgBw - LwBwLwBwLwBuKwFsJwJsJwJtKAJsKAJsKAJsKAJsKQJsKAJsJwJtKAJsKAJsKAJvLQFwLwBwLwBwLwBw - LwBtKgJsJwJsJwJsJwJsJwJrJwJsKAJtKQJrKAJsKAJsJwJsJwJrJwJtKwFwLQBvLgBwLwBwLwBvLgBv - LwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBw - LgBwLgBtKQFrJgJrJwJrJwJrJgJrJwJrJwJrJwJsJwJsJwJsJwJsJwJsJwJuLAFwLwBwLwBwLwBwLgBw - LwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgFrKANmIwpxNCCBUkuUZlmlg3qwko+zl5Wvko6k - gXiRYlaCU0xxNB9mIgltKQJvLgBwLwBxLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLwBw - LwBwLwBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBvLgBvLwBwLwBwLgBvLgBvLwBwLgBwLwBv - LgBwLwBvLgBwLgBwLgBvLgBwLgBwLwBvLwBvLwBvLwBvLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBvLgBw - LwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBvLgBwLwBwLwBwLwBuKgO0l5Lu6Obt5+Tt6OXt6OXt5+Tt6OXt - 5+Tt6OXt6OXt6OTt6OTt5+Tt6OTt6OXt6OTt6OXt6OTt6OTt6OXt6OTs6OTt6OTt6OXt6OXt6OTt6OXt - 6OTt6OXt6OXt6OXt6OXt6OXt6OTt6OXt6OXu6OXu6OXt6OXu5+Xt6eXt6OXu6OWccmlyMAFwLwBwLwBw - LwBwLwBvLgBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLwBvLwBvLgBwLgBvLgBvLgBwLwBwLgKRXknA - opC/oJC+oJC+oZC+oJC+oJC+oJC+oJC9oJC9n5C/oZG/opGAQyVxLwBxMABxMABuLAKheGi/n4+/n5C/ - oJC/oI++oJC/oJC+oZC+oJG/oJC/oJC/opC/oZCOX05yMQNxLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBv - LwBvLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLwBwLwBxLwBvKwWpg3G+n5C+ - oI++n5C/oJC/oJC+oJC/oJC+oJC/oZC/oZDAoZG+npCIUDdwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw - LwBxLgBxLgByLgJqKAVtMhmTaFq8opvm39/y7+75+vr4+vv3+fr2+Pr2+Pr2+Pr2+Pn3+Pr4+fry7+7k - 3Nu5nZeMXFJnKxBuLAVxLgBwLwBxLwBwLgBwLwBwLgBwLwBwLwBvLgBvLgBvLgBwLgBvLwBwLgBwLgBv - LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBxLgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBvLgBvLwBvLwBwLwBvLwBvLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBvLgBvLgBv - LwBvLwBwLwBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBvLwBwLgBwLgBwLgBvLgBvLgBw - LgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBtKgO3npz19/j19/j1+Pn1+Pj29/j2+Pn1+Pj2+Pj1+Pn19/j1 - +Pj1+Pj1+Pj1+Pj1+Pj09/j1+Pj19/f2+Pj2+Pn2+Pn1+Pj1+Pj2+Pj19/j1+Pj2+Pj1+Pf2+Pj1+Pj1 - +Pj1+Pj1+Pj19/j1+Pn1+Pj1+Pn19/j2+Pj2+Pj1+Pn2+PegeXRxMAFwMABwLgBwLwBwLgBvLwBwLwBw - LwBwLgBvLwBvLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLQSngHX3+fr2+Pr1+Pn1+Pn2 - +Pr2+Pr2+Pr1+Pn19/n1+Pr1+Pn4+PmFTzhxMABwLwBxLwByLwKdfHT19/j2+fr2+Pn19/n2+Pn1+Pj2 - 9/n1+Pn19/j2+Pn1+Pn19/jJuLJrKQVxMABwLwBwLgBvLgBvLgBvLgBvLwBwLgBwLgBwLwBwLwBvLgBw - LwBvLgBvLwBvLwBwLgBwLwBvLwBwLwBwLwBvLgBwLwBwLwBxLwBvNCDu7Or1+Pn29/n2+Pn1+Pj1+Pj1 - 9/n29/j2+Pn2+Pn1+Pn29/n39/h1PidxLwBwLwBwLwBwLwBvLwBvLgBwLgBwLgBwLwBxLwFrJwh+Sz+/ - rKju7Ov4+fn2+fr1+Pn2+Pr1+Pj1+Pn1+fn1+fj1+Pn2+fr1+Pn1+Pn2+Pn2+Pr2+Pn2+Pn4+frq5+Ww - lI9wOSpvKQVxLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBw - LwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLwBw - LgBvLgBvLgBvLgBwLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLwBuKQO4n5z1+fj1+Pn1+Pj1+Pn1+Pn1+fn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn1 - +Pn1+Pn2+Pn1+Pn2+Pj2+fn2+Pn2+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn2+Pn2+fj2+Pn2+Pn1+Pr2+PmgeXRxLwFxLwBvLgBwLwBwLgBvLgBvLgBwLgBwLwBwLwBvLgBv - LwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgOlf3T2+vv2+Pr2+fr2+Pr2+fr2+Pr1+Pr1+fv1 - +Pn1+Pn0+Pn3+fqFTjdyLwBwLwBxLwByMAB6RjL19vX2+fn2+Pr2+Pr2+fr2+Pr2+fn2+Pr1+fr2+Pn1 - +fr19/no4t9rLRFwLwBwLwBwLgBwLgBvLgBwLgBvLwBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLwGKX1T3+Pn2+Pr1+Pn2+Pr2+Pn2+Pr1+Pn2+Pn1+Pr2+Pn1 - +Pr2+Prk3dpmIgJxLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBuLAFxOSa/q6r39fb2+fr2+Pr1+fn2+fv1 - +Pr2+fr2+fn2+Pn2+Pj2+Pr2+Pn2+fr3+Pn3+fr2+fn2+fj2+Pn2+fr3+Pr2+Pr4+frx7Ouph4NrKg5x - LgBwLwBwLwBwLwBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBw - LgBxLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBvLwBvLwBwLwBw - LgBwLgBwLwBwLwBwLwBvLwBwLwBwLwBvLgBvLwBvLgBwLgBvLwBwLwBwLgBvLwBvLwBwLwBwLwBwLwBw - LwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBu - KgO5oJz1+Pn1+Pn1+fn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n2 - +Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pr1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn2+Pr2+Pn1+fn2 - +Pn2+Pn2+Pr3+PmfenRwMAFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBw - LgBwLgBwLwBwLgBwLwBwLwBxLgOmfnP3+fv2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr4+fuF - TjhxMABwLwBxLwBwLgBoKArh2tf3+vv2+Pn2+Pn2+Pn2+fr2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn29/iDUUJx - LwBxLwBwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBw - LwBwLwBwLwBwLwBvLwWvlJD2+fr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pr1+Pn2+Pr2+Pn2+Pn3+Puxl5FwLwJw - LwBwLwBwLwBwLwBwLgBxLwByLwBrLg+igXjw7ev2+fr2+Pr2+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2+Pn2 - +Pn2+Pn1+Pn2+Pr1+Pn1+Pr2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn19/n4+vvb0M9+TD1vLgRwLgBwLgBw - LgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBxLwBxLABwLQBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLQBvLgBvLgBvLwBw - LgBwLgBwLwBwLwBwLgBwLwBvLgBvLgBwLgBwLwBwLwBvLgBwLwBvLwBwLgBvLwBwLwBwLwBvLwBwLwBw - LQBvLgBwLgBvLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBuKwO4n5v1+fr1+Pn2 - +Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pj19/j1+Pn29/n1+Pj1+Pn1 - +Pn2+Pn19/n1+Pn1+Pj1+Pn1+Pj2+Pn29/r1+Pj2+Pn1+Pn2+Pj1+Pn1+Pr1+Pn1+Pj1+Pn2+Pr2+fmf - eXRwLwFxLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBvLgBvLwBvLgBwLwBw - LwBwLwBwLgOmf3T2+Pr2+Pr1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn4+vqFTzhxMABwLwBxLwBw - LwBvLAazm5f2+Pr2+Pn1+Pn1+Pr1+Pn1+Pn2+Pn1+Pj2+Pn1+Pn2+Pn2+fmpioFuLAFwLwBwLwBwLwBw - LgBwLwBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLwBwLwBxLwBq - KwzZzsr2+Pv2+Pn2+Pn1+Pn19/n2+Pn2+Pj2+Pn1+Pn1+Pn1+Pn3+PmKX1JwLgBwLgBwLgBvLwBvLgBw - LQBxMAFtLxjFsqz3+Pj29/n2+Pn2+Pn1+fn1+Pn2+Pn2+fn2+Pn2+Pr2+Pn19/n2+Pn2+Pn1+Pr2+Pn2 - +Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pj1+Pj1+fj3+Pnw7uySZl1uKQRvLgBwLgBwLgBwLwBvLwBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBxLgBwLABwLgBvLgBvLgBwLgBwLgBvLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLwBwLwBwLwBvLgBwLgBw - LgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBw - LwBvLgBwLwBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLwBwLwBuKgO5oJv2+fn1+Pn2+Pn1+Pn1+Pn2+fn1 - +fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+fn29/n2+Pj2+Pj2+Pr1+Pn19/n19/n1+Pj1+Pj2 - +Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pr2+Pn1+Pn1+Pn1+Pn2+fmheXRwLwFxLwBwLgBw - LwBwLwBvLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgOlf3P3 - +fr2+Pr19/j19/n1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn4+fqFTzhxLwBwLwBwLwBwLwByMAKIWU34+vz2 - +Pr2+Pn2+Pr2+fn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+PnVxsNoIwFwLgBwLwBwLwBwLgBvLwBvLgBvLwBv - LgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBxLgBxLwBxLwB2Pibz8/L2+Pv2+Pn2 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pnv7etsMBhvLgBwLgBwLwBwLgBwLgBwLwBtMxvXy8j2+fr2 - +Pn1+Pn2+fn2+Pn2+fn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn2+fn2+fn2+Pn2+Pr29PaZb2duKgJxLgBwLgBwLgBvLgBvLwBvLgBwLgBwLgBv - LgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLQBwLQBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLwBvLwBwLwBvLgBwLwBvLwBvLgBvLgBwLwBwLwBvLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLwBvLwBvLwBvLgBwLgBwLwBwLwBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBvLwBw - LgBwLgBxLgBwLgBvLwBwLwBxLwBxLwBvKgO5npv1+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pn19/n19/n2+Pn1+Pn1+Pn1+Pn2+Pn1+Pr1+Pn2+Pj1+Pn1+Pn1+fr19/n1+fn19/n1+Pn1+Pn1+Pn2 - +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+fr1+Pn2+Pn1+Pn2+PihenRwLwFxLwBwLwBwLgBwLgBvLgBwLwBw - LwBwLgBwLwBwLwBwLwBvLgBwLgBvLgBvLwBwLwBwLgBxLwBwLgBxLwBwLgSlfXX2+Pr1+Pn1+Pj1+Pn1 - +Pn1+Pn1+Pn19/n1+Pj1+Pn1+Pn4+fqETjdxMABvLwBwLgBwLwBwLgBvMx3t6uj2+Pr1+Pr2+Pr29/r2 - +Pr1+Pn2+Pn1+Pn1+Pn2+Pn2+Pr19PJxNhxwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLwBwLwBw - LwBwLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBxLwBxLwGUa2L4+fr1+fn1+Pn2+fn2+Pr2+Pn2+Pn1 - +Pn2+Pn29/n2+Pr19/jFtbNrKwhwLwBwLwBvLgBwLwBxLwBrMhvUyMj3+fv1+Pn19/n2+Pn2+Pr2+Pn1 - +Pn2+Pn1+fr1+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pr2+fn1+Pn1 - 9/n1+fn1+Pn29/n2+Pr2+Pn2+PeNZFluLQNwLgBwLwBwLgBwLgBvLwBvLgBwLgBvLgBwLgBwLgBwLgBw - LQBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBv - LwBwLgBwLgBvLgBvLwBvLgBwLgBvLwBwLwBvLwBwLwBwLgBvLwBvLwBwLwBwLgBvLwBvLwBvLwBwLgBw - LgBwLwBwLwBvLgBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBwLwBwLwBwLgBw - LgBvLwBwLgBwLwBvKgO4n5v1+Pn2+Pn2+Pj1+Pn2+fn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj1+Pn1 - +Pn1+Pn1+Pn1+Pn2+Pn2+Pj29/j2+Pn1+Pn1+Pn1+Pn19/n2+Pn2+Pj1+Pn1+Pn29/n1+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pr2+PmhenRwLwFwLwBwLgBwLwBwLwBwLwBvLgBvLwBvLgBwLwBwLwBw - LwBwLgBwLwBvLwBwLwBvLgBwLwBwLwBwLwBxLwBwLQSmf3T3+fv1+Pr1+Pn19/n2+Pn19/n1+Pr1+Pj1 - +Pn1+Pn1+Pn4+fqETjZxLwBwLwBwLwBwLwBwLwBrKAjKuLX1+Pn2+fn2+Pn1+Pn19/n19/n1+Pn1+Pn1 - +Pn2+Pj2+fn3+vyQY1dxMAJwLgBwLgBwLwBvLwBvLgBwLgBvLwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBw - LwBwLgBvLgBvLgBwLgBvLwBwLgBtKwK9qKT2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj2 - +PidenFwLwNwLwBwLwBxLwBwLwBrKgbBr6v3+fn2+Pr2+Pr2+Pn1+Pn1+fn2+Pr2+Pn2+Pn2+Pn2+Pr1 - +Pn2+Pr1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj1 - +Pj19/n1+Pns6ud3Pi1wLgFvLgBvLgBwLgBwLwBvLwBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBw - LgBxLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLwBwLgBw - LwBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBw - LgBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBu - KgO5n5z2+Pr1+Pj1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn29/n1+Pn2+Pn1+Pn1+Pn19/n2+Pn1+Pj2+Pn1 - +Pn2+Pn2+Pn1+Pn1+Pn2+fn1+Pj1+Pn19/n2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pr1 - +Pn1+Pn2+Pn2+PmgeXRxLwFwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBw - LwBwLwBwLgBwLgBwLwBwLwBwLgOlf3T3+fr1+fn1+Pn1+Pn2+Pn1+Pn1+Pn19/n19/n19/n1+Pn4+fqF - TjdxLwBwLwBwLwBwLwBxLwByMAOfd3D3+fr29/n1+fn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+fq4 - oJ1sKQNwLwBvLwBwLwBwLwBvLgBvLgBwLwBwLwBvLwBwLgBwLwBwLwBwLgBvLwBvLgBvLgBwLgBwLgBw - LgBvLwBwLwBmIwPs6OX1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Prz8vJ1QzJxLwFwLwBw - LgBvLwBuKwGYcGP3+Pj2+Pr2+fn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pj2+Pn2+Pr2+Pn2+Pr2+Pr2+Pn2+Pn2+Pr1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+PnQ - xMFnLA9wLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgByLwBwLQBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBw - LgBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLwBvLwBwLwBwLwBvLgBwLgBvLwBwLwBwLgBw - LwBvLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLwBuKgS5n531+Pr1+Pn1 - 9/n29/n1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pj1+Pj19/n1+Pn1+Pj2+Pn1+Pn1 - 9/n2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pj1+Pj1+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn1+Pn2+Pn19/n2+Pmg - eXNxLwFxLwBxLgBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLwBv - LgBwLwBwLQSmf3X3+fv2+Pr1+Pn1+Pj1+Pn19/n1+Pj1+Pn19/n19/n19/n4+fmFTjZxMQBxLgBwLwBw - LwBwLgBwLwB5Qy/29vT2+Pr2+Pr1+Pj1+Pn1+Pn1+Pj1+Pr1+Pn1+fn1+Pr1+Pnh2dZoJgpxLwBvLwBw - LgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBvLgBvLgBvLgBvLwBwLgBwLgBwLgBwLwF/Sjb3 - +Pj1+Pj1+fr2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pj2+Pn1+Pnb0M1qKg9wLwBwLwBwLgBwLgBwMBzt5+X2 - +fr1+Pn2+Pn1+Pr2+Pn1+Pn1+Pr2+fr2+Pn2+fn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pr1+Pn19/n19/n1 - +Pn1+Pn1+Pn19/n1+Pn1+fn2+fn2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pr2+Pn29viVcGpwLgFxLwBw - LgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLwBvLwBvLgBvLgBwLwBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBw - LgBwLwBwLwBwLwBwLwBwLwBwLgBvLgBvLgBwLwBwLgBvLwBuKgS5oJ31+fr1+Pj2+Pn1+Pn2+Pn2+fn1 - +Pn2+Pr1+Pj19/n2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn1+Pj19/n1+Pn2+Pn29/n2+Pn19/n1+Pn1+Pn19/j1 - +Pn1+Pn19/j1+Pn29/n2+Pn1+Pj1+Pn29/j2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+fqgeXNxLgFwLwBwLwBw - LwBvLgBwLwBwLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLgSmgHX3 - +Pv2+fn19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn4+fqETzdxMABwLwBwLwBwLwBwLgByMABrJwbe - 1dP1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+fr2+fn4+ft1Pi1xMAFwLgBwLwBwLwBwLgBwLwBw - LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLgBvKwGlhHn4+vv1+Pn2+Pn1+Pn2 - +Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+PmxlJBtLARxLwBwLwBwLgBtKQSylpD3+Pr2+Pj1+Pn2+Pn2+Pn1 - +Pj2+Pn1+Pn2+fn2+Pn1+Pj1+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn19/j1+Pn1 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn09/nh3dxnKQtwLwBwLwBvLwBvLgBvLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBvLgBwLgBwLwBvLwBwLgBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBv - LgBwLwBwLwBvLgBwLgBvLwBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLwBwLgBwLwBvLgBwLwBwLwBuKgO5n5z1+fr1+Pj1+Pn2+Pn1+Pn2+fr2+Pj2+Pn29/n29/n1 - +Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn19/n1+Pn1+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn2+Pn29/n2+Pn19/n2+PmgeXRxLgFwLwBwLgBwLwBwLwBwLgBwLgBw - LwBvLwBvLgBwLgBvLwBvLgBwLgBwLwBwLgBvLwBwLwBwLwBvLgBwLwBwLgOmf3T2+fr2+Pn1+Pn1+Pn1 - +Pn1+Pn1+Pn19/j1+Pn1+Pn19/n4+fqFTzhxLwBwLwBvLgBvLgBwLgBxMABvLAGykon4+vr2+Pn2+Pn2 - +fn1+fn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pide3VyLwRxLgBwLgBwLgBwLQBwLgBwLgBvLwBvLgBvLgBw - LgBvLQBwLgBvLgBvLQBwLgBvLgBwLgBwLgBxLwBqKQXOvLb2+Pr2+fn2+Pn2+Pn1+Pn2+Pn19/n1+Pn2 - +Pn1+fn1+Pn4+vqIVkhyMAJwLwBwLgByLwBuNCDv7er2+fr2+Pn2+fr1+Pn2+Pn19/n29/n2+Pr2+Pn2 - +Pn1+Pn1+Pr2+Pn2+Pn2+fv29vbs6unYysLFsq/Arq7Cr63Nvbfp4+Ly8vD3+fn2+Pn1+Pj1+Pn2+Pn2 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn4+vqSZltwLwFwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBw - LwBwLgBwLgBwLgBxLwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LwBvLwBwLgBwLwBwMABwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBv - LgBwLwBwLgBvLwBvLgBwLwBwLgBwLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBwLgBvLwBwLgBwLgBvLwBw - LgBvLgBwLwBwLwBuKwS5oJz2+fn1+Pj2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn29/n19/n1+Pn1+Pn1+fn1 - +Pn1+Pn1+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pr1+Pn1+Pj1+Pn1+fn1+Pn2+Pn2+Pn19/j2+Pn1+Pj1+Pn1 - +Pn1+Pn1+Pn2+Pn19/j1+Pn1+Pn2+PqgenRwLgFxLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBwLwBwLgBv - LgBwLwBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLgOmfnT2+Pr1+fn1+Pn1+Pj1+Pn1+Pn19/j19/j1 - +Pj19/n19/n4+fqFTzlwMABwLgBwLwBwLgBwLgBxLgBxLgCIV0P4+/r2+Pr1+Pn1+Pn2+Pn2+Pn1+Pn1 - +Pn1+Pn1+fn2+Pn1+PnIu7hiKBpoKhhpKxhoKhhoKRhoKhhnKRhoKxhmKhhnKRhnKRhoKRhnKhhoKhdn - KRdoKhhpKhhnKRhnKRhoKhhoMCXs5+f2+fr1+Pn1+Pr1+Pn1+Pn1+Pn19/j1+Pn2+Pn1+Pn2+Pnx7utn - KBFwLgBwLwBwLwByLwSdeXP29/n2+Pn1+fn2+Pn19/n1+Pn1+fn2+Pn2+fn2+Pn2+fn1+fn1+Pn3+fvv - 6+uymZSFV0hsMh1pKAlqJwZrKQdsKAdqJwdqLRh4QzWgf3jg2Nf3+fn1+fn1+Pn1+Pn19/n1+Pn2+Pn2 - +Pn1+Pn2+Pn1+Pn1+Pn2+fnPwLtqJQVwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLwBwLgBwLwBwLgBwLgBw - LgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBvLwBvLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBw - LwBvLgBvLgBwLwBvLgBvLwBvLgBvLgBvLgBvLgBwLwBwLwBvLgBvLgBwLgBwLwBvLwBwLgBwLwBwLwBu - KQO5n5z2+Pn1+Pj2+Pn29/n1+Pn2+Pn19/n2+Pn1+Pn1+Pj19/n1+Pn19/j2+Pn1+Pn2+Pn1+Pn1+Pj1 - +Pn2+Pj2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pj29/j1+Pj1+Pn1+Pn2 - +Pn1+Pn1+Pn2+PmgeXRxLwFxLwBwLgBwLgBwLwBvLgBvLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLwBv - LgBwLwBwLgBwLgBwLwBwLgBwLgOlf3P3+fr2+Pn2+Pn19/n1+Pn2+Pn2+Pj1+Pn1+Pn1+Pj19/r4+fqF - TjhxLwBvLQBwLwBwLwBwLgBxLgBwLgBpKgzv6+r2+fn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1 - +Pn39vbs6uzt6+zt6+zs6+3t7Ozt6+3t6+zt7O3t7Ozt7Ozt6+vt6+zu7Ozu6+zt7Ozt7Ozt7Ozt6+vt - 6+zt6+vv7u72+Pn2+Pn2+Pn2+fn2+Pn2+Pn19/n2+Pj1+Pn2+Pn29/n1+PnItrNrJgNwLwBwLgBwLwBq - KArYzsv29/n2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pr2+Pn2+fn1+Pn2+Pn4+vvIt7FxNyFvLARxMAJwLwBw - LgBxLwBwLwBvLgBwLgBxLwBxLwFuLQNqLROrjIP3+Pj2+Pn1+Pn1+Pr1+Pn1+Pn19/n1+Pn2+fn2+Pn1 - +Pn2+Pn18/JwNB9xLwBvLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLgBwLABwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLwBwLgBwLgBvLwBwLgBwLwBw - LwBvLgBwLwBwLwBvLwBwLgBwLwBwLwBvLgBvLwBvLwBwLgBvLgBvLgBvLwBvLgBvLwBvLgBvLwBvLgBw - LgBvLgBvLwBwLwBvLgBwLwBvLgBvLwBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBuKQS5n5z2+fr1+Pn1 - 9/j2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n1+Pn1+Pn1+Pj1+Pn1+fn2+Pn1+Pn2+Pn1+Pn1+Pn19/n2+Pn2 - +Pn2+Pn19/j2+Pn1+Pn1+Pn1+Pn19/n2+Pn19/n19/j19/n19/n2+Pn1+Pn1+Pn1+Pn19/n1+Pn2+Pmg - eXRxLwFxLwBwLgBwLwBwLwBvLwBvLgBwLgBwLgBvLwBwLwBwLwBwLgBvLgBwLgBvLwBwLgBvLwBwLgBw - LwBwLwBwLgOmf3T2+Pr1+Pr1+Pn1+Pn1+Pn2+Pn2+Pn19/n1+Pn19/n19/j4+fmETjdxMABvMABvLwBw - LwBwLgBwLwBwLwBsKQPFsaz2+fr2+Pn2+Pr2+Pn1+Pj2+Pn19/n1+Pn29/r19/n19/n1+Pn1+Pn1+Pn2 - +Pn1+Pn1+Pn2+Pn1+Pr19/r19/n19/n1+Pn19/n1+Pn29/n1+Pn2+Pn2+Pn2+Pr29/n19/n1+Pn1+Pn2 - +fn29/n19/n1+Pn2+Pn1+Pn1+Pr2+Pn1+Pn1+Pn3+fmccmdxMAJwLwBwLgBwLwB2QzDz8/T2+fr1+Pn2 - +Pn1+Pn2+Pr1+Pj1+Pn2+Pr1+Pr2+Pn2+Pr3+vu5pKBpJwhwLwFwLgBwLgBwLwBwLgBwLgBwLwBwLwBv - LgBvLwBvLgBwLgBwLgBrKAOlgXr3+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/j19/j4+vqSaF9w - LgJvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBxLwBwLABwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBvLwBvLgBwLgBwLgBwLgBw - LgBvLwBvLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBvLgBvLgBvLgBvLgBwLwBvLgBwLgBw - LgBwLgBvLwBwLgBvLgBvLwBwLgBwLgBvLwBwLgBwLwBwLgBuKwO4n5z1+Pr19/j2+Pn1+Pj1+Pn2+Pn1 - +Pn2+Pn1+Pj19/j1+Pj2+Pn1+Pj2+Pn1+Pj1+Pj19/n1+Pn19/n1+Pj19/n1+Pj1+Pn1+Pn2+Pn19/n1 - +Pn1+Pj1+Pj1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj19/n1+Pn1+Pn2+PmgeXNxLwFxMABwLgBw - LwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgOmf3T2 - +Pr1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pj19/n29/n19/j4+fmETjZwLwBxLwBvLgBwLgBwLgBwLwBxLgBx - LwKadWz3+vr2+Pn1+Pn2+Pn19/n1+Pn19/j1+Pn1+fn1+Pj2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2+Pn1 - +Pn1+Pr1+Pn1+Pj1+Pn1+fn1+Pn1+Pj1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+fn2+fn1+Pn1+Pj1 - 9/n1+fn1+Pn2+Pn2+Pn1+Pj29/h1OiFwLgFwLwBwLgBwLwKXdGv3+fn1+Pr1+Pn2+Pn2+fn2+Pn1+Pn1 - +Pn1+Pn2+Pn29/n2+Png2thqLxRwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBw - LgBxLgBoKQzh19f3+Pr2+fn2+Pj1+Pn2+fn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pm3op5tKwRwLgBwLgBwLgBw - LgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLABvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLQBwLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBvLwBvLwBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLwBw - LgBvLwBwLwBwLwBwLgBwLgBvLwBvLgBwLgBvLgBwLwBvLgBwLgBvLwBvLgBvLgBwLgBvLwBwLwBwLgBv - LgBwLgBwLwBvLwBvLwBwLgBwLwBwLwBuKgO5oJz2+fn1+Pj1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn1+Pn2 - +Pn2+Pn29/n1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn2+Pn2+Pr1+Pj1+Pn1+Pn1 - +Pn2+Pn2+Pn2+Pj2+Pn29/j19/j1+Pn2+Pn1+Pn1+Pn2+PmfeXRxLwFxLwBwLgBwLgBvLgBvLgBwLgBw - LgBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLQOmf3T2+fr2+Pn1+Pn2+Pn2 - +Pn1+Pn19/n1+Pn1+Pn1+Pn19/n3+fqDTTZxMABwLwBwLgBwLgBwLgBwLgBwLwByMAB5Qi308/L1+Pn2 - +Pn2+Pn19/n2+Pn1+Pn1+Pj1+Pn1+Pn1+Pn19/j1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1 - +Pn1+Pn2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn19/n2+Pn1 - +Pn1+Pnbzs1sKQdxLgBwLgBwLwBtLAO5n5v19/n1+Pr2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn3 - +fmObGNyMAJwLwBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBxLwBxLgGhg3/3 - +Pr2+Pn1+Pj2+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+Pn19/jQvbpqKAdwLwBwLgBwLQBwLgBwLQBvLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLABwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBvLwBwLgBwLgBvLwBxLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBv - LgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLwBvLgBwLgBwLwBwLgBwLwBw - LwBwLwBwLwBwLwBuKgS5oJz2+Pv1+Pn1+Pn1+Pj19/n19/n1+Pn1+Pn1+Pn2+Pn1+Pn19/n19/j1+Pn1 - +Pn2+Pn1+Pn2+Pn1+Pn1+fn2+Pr29/n1+Pn19/j19/j1+Pn19/n2+Pn19/n1+Pn1+Pn1+Pn1+Pn29/n2 - +Pn1+Pn2+Pn1+fj1+Pn1+Pn29/n2+PmfeXNxLgFxLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgOkfnP3+Pv19/r1+Pn2+Pn2+Pn19/n1+Pn1+Pj1 - +Pj19/n19/n4+fqFTzdxMABwLwBwLwBwLwBwLwBxLwBwLwBxLwBrKg3c0c/19/j2+Pr19/n19/n1+Pj2 - +Pn1+Pn2+Pn1+Pn2+Pn1+Pn29/n29/n1+Pn1+Pn1+Pn2+Pn1+Pr2+Pr29/n2+Pn2+Pn1+Pj2+Pn19/j2 - +fn1+Pn2+Pn1+Pj29/j2+Pn2+Pn1+Pj2+Pj2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pr2+PuylY9vLAFw - LwBwLwBwLgBpKAXSxcT19/n1+Pn1+Pn1+fn29/n2+Pn1+Pn1+Pn1+fn1+Pr1+frr5+ZqMRhwLgBwLgBw - LgBvLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLwCIYFT2+fn1+Pr19/n1+Pn1 - +Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/nm4uFpLRZvLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBv - LgBwLwBvLgBwLwBvLgBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw - LwBvLgBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBu - KwS5oJ32+fr19/j1+Pn1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn1+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1 - +Pn19/j1+Pj1+Pn2+Pn19/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pj2+Pn2+Pj19/j1+Pn1 - +Pn2+Pj1+Pn2+fmfeXNxLgFxLwBwLwBwLwBwLgBvLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBw - LgBwLwBwLwBwLwBwLwBwLwBwLQOlfnP2+fr2+Pn19/j2+Pj1+Pn1+Pn1+Pj1+Pn1+Pj19/n19/j4+fqF - TjZxLwBwLwBwLwBwLwBwLwBwLgBwLwBxMABvLgaulI32+fr2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn19/j1 - 9/j19/j1+Pn1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn2+Pn2+Pn19/n29/j1+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2 - +Pj1+Pn1+Pn1+Pn1+Pn19/j1+Pj2+Pj1+Pn1+Pn19/n1+Pj1+Pn29viJWkpxLgFwLgBwLgBwLgBuLhDo - 4d/1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn19/n2+Pn2+PnAq6lsKwdwLwBwLgBwLgBvLgBvLgBvLwBw - LgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgB/TDr39/b0+Pn1+Pj1+Pn19/j19/n2+Pn2+Pn1 - +fj1+Pj19/jq5+dqMBlvLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBxLwBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLgBw - LgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBvLgBvLgBwLwBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLwBwLwBv - LwBwLgBwLwBvLgBwLgBvLgBvLgBwLwBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBuKwO5oJz1+fr1+Pn1 - +Pn1+Pj2+Pn2+Pn19/n1+Pn1+Pn19/j2+Pn2+Pj1+Pn1+Pj19/n2+Pn1+Pj1+Pn1+Pn2+Pn2+Pn2+Pj1 - +Pj2+Pn19/j2+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn2+Pr1+Pj1+Pn2+Pn29/n1+Pn2+Pn1+Pn2+Pn2+fmg - eXRxLgFwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLgBw - LwBwLwBwLgOkf3P3+Pr1+Pn1+Pn2+Pn1+Pn1+Pn19/n29/n1+Pn1+Pn19/j3+vmFTzdxMABwLwBwLgBw - LgBwLgBwLgBwLwBxLwBxMAGFVUv29/f1+fr2+Pn1+Pr2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pr2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn1+Pn2+Pn29/n2+Pn2+Pn1 - +Pn19/j1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+fjo4+JtMhlxLwBwLwBwLwBwLwBwMxz19PT19/n2+fn2+Pn1 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+fr2+fmgfnZyMARwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLgBvLgBxLgCAVUb4+Pn1+Pn1+Pj1+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pn29/nr6Oht - LxlwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBw - LgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBvLwBwLgBv - LwBvLwBwLwBwLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBvLgBwLwBvLwBwLwBwLgBwLgBvLwBvLwBvLwBw - LgBwLwBvLwBwLwBwLwBwLwBwLgBwLwBvLwBwLwBwLwBwLwBuKgO5n5v2+Pn19/j1+Pj1+Pn29/n1+Pj1 - +Pn19/j1+Pn2+Pr29/n29/j19/n19/n2+Pn1+Pn1+Pn19/j2+Pr2+Pj19/n1+Pj19/n1+Pn2+Pn1+fn1 - +Pn19/j19/j1+Pn1+Pn2+Pn2+Pn19/r2+Pn1+Pn2+Pn1+fn2+Pn1+Pn1+Pn2+fmgenRwLgFxLwBwLgBw - LwBwLwBvLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLwBwLwBxLwBwLgSmgHX3 - +Pr1+Pn2+Pn1+Pn1+Pn19/n1+Pn19/n19/n29/n29/n4+fmFTzlxLwBwLgBwLwBwLwBwLwBwLgBwLwBw - LwBwLwBrLRjp5eL2+Pr2+Pr2+Pn2+fn2+Pn1+Pj2+Pn1+Pn2+Pn1+fn29/n2+Pn2+Pn1+Pj2+Pn2+Pn1 - +Pn2+Pn2+Pn1+Pn19/n29/n2+Pn1+Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pr2+Pn29/n1+Pr2 - +Pn1+Pn1+Pn2+Pn1+fnGta9qKQZwLgBwLwBwLwBwLwB1Mx329vf19/n2+fr2+Pr1+Pr2+Pv2+Pr1+Pr1 - +fr2+Pr1+fr2+fqGVktxMAFxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBw - LgBvLgBwLgGVcWr3+vv1+Pj1+Pn2+Pn1+Pn1+fj2+Pj1+Pn2+Pn1+Pn19/ns6ehvLxlwLgBvLwBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBw - LgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBw - LgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBuKgO4n5r2+Pr19/n1+Pn1+Pn1+Pn1+Pn19/j1+Pn1+Pn19/n2 - 9/n2+Pn19/n1+Pj1+Pj2+Pn1+Pn19/j1+Pn1+Pn2+Pj1+Pn1+Pn1+Pj1+Pn1+Pn19/n19/j1+Pj1+Pn2 - 9/j2+Pn1+Pn2+Pn2+Pj2+Pn19/n1+Pn2+Pn1+Pn1+Pn2+PmheXRwLwFwLwBwLwBwLwBwLgBwLwBwLwBw - LgBwLgBwLgBvLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgSmf3X3+Pr1+Pn1+Pn1+Pn2 - +Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n3+fqFTzlxMABwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBsKAXErqr3 - +Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pj1+fn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn29/n2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pj1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn3 - +viWcWlxMARwLwBwLwBwLwBwLwB5PSD5+fn5+vz5+vv5+/z5+/z6+/36+/z6+/z6+/z6+/z5+/v5+vqC - TkVwLwFwLwBwLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvMABoJQPQwr/2 - +Pr1+Pj1+Pj1+Pn1+Pj19/n2+Pn2+Pn2+Pn1+Pn1+Pnq6OdrLhlvLgBvLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBxLwBwLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLwBv - LwBvLwBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBwLgBwLgBvLgBw - LwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBvLgBvLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBvKgO5n5v1+Pr29/n1+Pj19/n2+Pn1+Pn19/n2+Pn2+Pn2+Pn1+Pn19/j1+Pn1+Pn2 - 9/j2+Pr2+fn1+Pn2+Pn2+Pn1+Pj1+Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn19/n2+Pn1+Pn2+Pn2+Pr1+Pn2 - +Pn1+Pn29/n1+Pn1+Pn1+Pn1+Pn2+PmgeXRwLgFwLgBvLwBwLwBvLwBvLwBwLgBwLwBwLwBvLwBvLgBv - LwBwLwBvLgBvLgBwLwBwLgBwLgBxLwBwLgBxLwBwLgOlf3X3+fr1+Pn2+Pn1+Pj1+Pn19/n1+Pj1+Pn2 - +Pn19/n19/j4+fqFTzlxMABwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBxLgKYbGP4+fv1+Pn2+Pn1+Pn2 - +Pn29/n1+Pn1+Pn1+Pn1+Pn29/n2+fn1+Pj1+Pn1+fn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn1+Pr2+Pn2+Pn2+Pn2+Pr1+Pr29/n2+fn2+Pn1+fr2+Pn2+Pn2+Pn2+Pn2+Pn2+PZyPCpxLgBwLgBw - LwBwLgBxLwBxLgl2PzR0PzRzPzRxPzRyPzRyPzRzPzRzPzRyPjRzPzVyPzVzPjNvLQtwLgBxLwBwLwBw - LwBwLwBxLwBwLgBwLgBwLwBwLwBwLwBvLgBwLgBxLwBwLgBwLgBsKgSaeG/3+fr2+Pn19/j2+Pn19/n1 - 9/n19/n1+Pn1+Pn1+Pn2+Pn1+Pnn4eFrLBRwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBx - LQBwLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLwBvLgBvLgBwLgBv - LgBwLwBvLwBwLwBwLgBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBw - LgBvLwBwLwBwLgBvLgBvLgBwLgBwLgBvLwBwLwBvLgBvLwBwLgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBu - KgO5oJv2+fn1+Pn1+Pr1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pn1+Pn29/n1 - +fn1+Pn2+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pr19/n2+Pn2+Pr1+Pn2+Pn1+Pr1+Pj2+Pn1+Pn1+Pr2+fr1 - +Pn2+Pn1+fn2+PmgeXRxMAFxLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLgBw - LwBwLwBwLwBwLwBvLwBwLwBwLgOmfnT3+fr1+Pn19/n1+Pn1+Pn19/n1+Pn1+Pn29/n1+Pn1+Pj4+fqE - TzdxMABwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBxLwFyMx749/f2+fr1+Pn2+Pn2+Pn1+Pn2+Pr19/n1 - +Pr19/n19/n2+Pn19/n2+Pn2+Pr2+fr2+fn2+Pn2+fn2+fn1+Pr1+Pn2+Pn19/n2+Pr2+Pr29/n2+Pn2 - +Pj2+Pr2+Pr2+Pn1+fn2+Pn2+Pn1+Pn1+Pn1+Pn1+fn1+Pna0M9nIwdxLwBwLwBvLwBwLgBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBxLwBxLwBwLwBwLwBwLgBwLwBwLwBwLwBw - LwBwLgBwLwBwLwBwLwBwLwBwLwBwLgFpJwmbeHH19PT2+Pn2+Pn1+Pn2+Pn29/n1+Pj2+Pn1+Pn1+Pn1 - +Pn2+Pn1+PnMuLRrKAZwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLwBxLwBwLQBvLQBvLQBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBvLgBwLgBwLwBvLgBw - LgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLwBwLwBw - LwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBvLgBwLgBwLgBvLgBwLwBvLgBvLwBwLwBuKgO5oJz1+Pn1+Pj2 - +Pj29/j29/n2+Pn1+Pj2+Pn2+Pn29/n2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj1+Pj2+Pn2+Pn2+Pj1+Pn2 - +Pn2+Pn2+Pn29/n2+Pn19/n2+Pn1+Pn29/n2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2+Pmf - eXRwMAFxLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBv - LgBwLwBwLgSlf3T2+Pr1+Pn1+Pn19/n1+Pn2+Pn19/n19/j1+Pn1+Pn19/n4+fqFTjZxMABwLgBvLgBw - LgBvLwBwLwBvLwBwLwBwLwBwLwBrJQXazMf2+fr29/j2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 - +Pn29/j2+Pn19/n19/j2+Pn2+Pn19/j29/j19/j19/j2+Pj2+Pn2+Pj29/j2+Pn2+Pn2+Pn1+Pn2+Pn2 - +fn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+PqpioVwLgVwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBw - LwBwLwBxLgBwLwBwLgBwLwBxLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBw - LgBxLwJrKgh9SzjMvbf5+vr2+Pv2+Pn1+Pn2+Pn19/j1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn19/i2nZlt - KgRwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLQBwLgBvLgBwLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw - LwBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLwBwLgBwLwBwLwBw - LgBvLwBwLgBwLwBvLwBwLwBwLwBvLwBwLwBwLgBwLwBwLwBvKgS5n5z3+fr29/n29/n2+fn1+Pn1+fn2 - 9/r19/n29/j1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pr2 - +Pn1+Pn2+Pn1+Pn19/n19/n1+Pn2+Pn1+Pn29/n29/n1+Pn29/n1+Pn1+Pn2+PmfeXRwLwFxLwBwLwBw - LwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLgBwLwBwLwBxLwBwLQOlfnP3 - +Pr1+Pn1+Pn1+Pn2+Pj1+Pn19/n19/n1+Pj1+Pn19/n4+fmETjdxMABwLwBwLwBwLwBwLwBwLwBvLwBw - LwBwLwBxLwByLQCriIH3+fr19/n1+Pr1+Pn1+Pn2+fr1+Pn1+Pj1+Pn1+Pn1+Pr3+PjJu7nCrKnCrKrC - rKrBrKrBrKrBrKrCrKrDrKrBrKrCrKrCrKrCrKrBrKrYz9D2+fr19/j1+Pr2+Pn2+fn1+Pn2+Pn1+Pn1 - +Pn1+Pn1+fn4+vqATT9xMAFxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBvLwBwLwBwLwBw - LgBwLgBwLwBwLwBwLwBwLgBwLwBxLwBwLwBvLgBwLwBwLwBwLwBvLwBwLwFvKgVpLBSLYVfJt7X19PX3 - +Pn2+Pr2+Pn1+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pj1+Pj29/n2+Pj3+PqNYVhwLwJwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLgBwLwBw - LgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw - LwBvLwBwLwBwLgBwLwBwLwBwLwBwLgBuKwO4n5v2+Pn19/j1+Pn2+Pn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2 - +Pj2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn29/n1+Pj1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pn1 - +Pj2+Pn2+Pn2+Pr2+Pn19/n1+Pj19/n1+Pn1+Pn1+Pn2+fmfenRxLwFwLwBwLwBwLgBwLwBwLwBwLwBw - LgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgOlfnT2+Pr2+Pn1+Pn2+Pn1 - +Pn19/n1+Pn1+Pn1+Pj1+Pn19/n3+fmFTjdxMABwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwByLwCD - UDn3+Pj2+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn29/iQaWNtKwlsKgdsKwdsKgdsKwdsKQds - KgdtKwdsKgdsKwdsKgdtKwdoJAvDs7D2+Pn2+fn2+Pn1+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn1+fjp4uBq - KxFxLwBxLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLwBv - LgBwLwBwLwBwLwBwLwBwLgBxLwBvLgBxLwBrJgNyMyKlhIHg1tX39vf2+Pj2+Pn29/j1+Pn1+Pj2+Pn1 - 9/n2+Pn1+Pn2+Pj1+Pn19/n1+Pn19/n19/n1+Pny7/BtMRpwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBv - LwBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LwBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBv - LgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBvLwBvLgBwLgBwLgBv - LgBwLwBwLgBxLwBuKwO4n5z1+fr2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2 - +Pn2+Pn2+Pj1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2 - +Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n2+fmgenRxLwFwLwBwLgBwLwBwLgBvLgBwLwBwLwBwLwBvLgBwLgBw - LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgOmfnT3+Pv1+Pn19/n19/n1+Pn1+Pn1+Pn1+Pn2 - +Pn1+Pn1+Pn4+fqFTzZxMABwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwByMABrKg7q5OH1+Pn1+Pr2 - +Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+fm/rKhtLAdxLwBxMABwLwBxLgBxLwBxMABxLwBwLgBwLwBx - LwBxLwBrLxPq5uL19/j1+fn1+Pn1+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+fn1+PjAp6FuKgNwLwBwLwBwLgBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBx - LgBwLwFvLQVnKBGMY1bJuLP49/f4+vv3+vr2+Pn2+Pr2+Pn1+Pj29/n2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2 - +Pn1+Pn1+Pn1+Pn1+Pn3+fq+pqBrJgJvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLwBvLwBw - LwBwLwBvLwBvLwBvLgBwLgBvLwBwLwBvLgBwLwBwLwBwLgBwLgBvLgBwLwBwLgBwLQBwLgBvLwBwLwBw - LgBwLwBvLgBvLwBwLgBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBv - KwS5n5z2+Pr19/n1+Pn19/j1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn2+fr29/n19/n2+Pn19/n1+Pr1 - +Pj2+Pn2+Pn1+Pn1+Pn1+Pn19/j2+Pn2+Pn1+Pn1+Pr29/n19/n19/n1+Pn29/r1+Pn2+Pn1+Pn2+Pn1 - +Pn1+Pn19/j2+PmgeXRxLwFxLwBwLgBvLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLwBvLgBwLgBw - LgBwLwBvLgBwLwBwLwBwLwBwLgOlfnT2+Pn1+Pr2+Pn29/n2+Pn19/n19/n19/n1+Pn19/n09/n4+fmE - TTdxLwBxLwBwLwBwLwBvLgBxLwBwLwBwLgBxLwBwLwBxLgBuLAW+qaj3+fr2+fr1+Pn2+Pr1+Pn1+Pn1 - +Pn1+Pn1+Pn2+Pn19vnm4eBpLRRwLwBxLwBvLwBwLwBwLwBwLwBxLwBwLwBwLgBxLwByLwF/TDz4+fr2 - +Pn1+Pj1+Pn2+Pr1+Pn1+Pn2+Pj1+Pn1+Pn1+Pn3+fuWbF5xLgFxLgBvLgBwLgBwLwBwLwBwLwBvLwBw - LwBwLgBwLwBwLwBwLwBwLgBvLgBvLgBwLgBwLgBwLwBvLwBwLwBwLwBvLgBxLgFsKQdxOiqde3fm3934 - +fr2+Pn1+Pr1+Pr2+Pj1+Pn1+Pn2+Pn1+Pj2+Pr1+Pn2+fn19/n2+Pn2+Pn2+Pr29/n2+Pn2+Pn2+Pr1 - +Pj39/h+RzRwLwFwLwBwLwBwLgBwLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBxLgBwLQBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBvLgBvLgBwLwBwLwBvLwBwLgBwLwBvLwBw - LgBwLwBwLgBwLwBvLwBwLwBvLwBwLwBwLgBwLgBwLgBvLwBwLgBvLwBvLwBwLwBwLwBwLgBvLwBwLwBv - LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBuKwO5n5z2+fn19/j1 - 9/n19/j19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pr19/j19/n2+Pj1+Pn1+Pn2+Pn2+Pn1+Pn1 - +Pn1+Pj1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn19/j2+Pn19/n1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj1+Pn19/j1+Pmg - eXRwLwFwLwBwLgBwLwBvLgBwLwBwLgBvLgBwLgBwLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBw - LwBwLwBwLgOlf3T3+Pr1+Pn1+Pn2+Pn2+Pn19/n1+Pn1+Pn1+Pj1+Pn29/j4+fmETTZxLwBwLwBwLwBw - LgBwLgBvLwBwLwBwLwBwLgBxLgBxLwBxLwKTbGL3+Pj2+Pr1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1 - +Pr29vZ/TkFwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgSoh4P1+Pn1+Pn1+Pj19/n2+Pn2 - +Pn1+Pn1+Pn19/j1+Pn2+Prx8e91OSFwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBw - LwBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBxLQFrJQSBTT/Aqqjw7e33+vv19/r2+Pv1+Pn1+Pj2+Pn1 - +Pn1+Pn19/j1+Pn19/j1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn29/n1+Pn2+Pn39/i7o5xrKgVwLgBv - LwBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLABwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBw - LgBwLwBvLgBvLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBuKwO5n5z2+Pr2+Pn1+Pn1+Pn1+Pn1+Pn1 - 9/n2+Pn2+Pn1+Pj2+Pn2+Pn2+Pr2+fn19/n2+Pn2+Pn19/n1+Pn1+Pj1+Pn1+Pn19/n1+Pn1+Pj2+Pn2 - +fn1+Pn1+Pn1+Pj1+Pj1+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+PmgeXRwLgFxLwBwLwBw - LwBwLgBwLwBwLwBvLwBvLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgOlf3T3 - +fr1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn4+PqETjZxMABwLwBwLwBwLgBwLwBwLgBwLwBw - LwBwLgBwLwBxLwBxMABzOybx8O/2+Pv2+Pn1+Pr2+Pn1+Pn19/n1+Pj1+Pr1+Pn2+Pn29/mkhYBzMQRw - LwBwLgBwLwBwLgBwLwBxLwBwLwBxLwBwLwBpJgfVy8n1+Pn1+Pn2+Pj1+Pj1+Pn2+fr2+Pn19/n1+Pn1 - +Pn2+PnYzMlpJQJxLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBvLgBvLgBw - LgBwLwBvLwBwLgNnKw+QY1rTxcL3+Pj3+fr2+fr1+vn2+Pr2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1 - +Pn1+Pr19/n1+Pn19/n1+Pn1+Pn1+Pn19/n1+Pn19/j2+fnh2NhwNyJwLwBwLwBvLgBwLgBwLwBwLgBv - LQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBvLgBwLwBvLgBvLgBwLwBwLwBvLwBvLgBwLwBvLwBvLwBwLgBwLwBwLwBvLwBvLgBvLwBwLwBv - LgBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLwBvLgBwLgBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBv - LwBvLgBwLgBvLwBwLgBwLwBwLwBwLgBuKgO6n5v29/n2+Pn1+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2 - +Pn1+Pn2+Pj1+Pj2+Pn2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pr1+Pn2+Pn2+Pn2+fj1+Pn2+Pn1+Pj19/n2 - +Pn2+Pn19/n2+Pj2+Pr1+Pn2+Pn19/n19/n2+Pr2+Pn2+fmgenRxLwFxLwBwLgBwLwBwLwBwLwBvLgBv - LgBwLwBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBwLgBwLgBwLgBxLwBwLgOlfnP2+Pr1+Pn1+Pn1+Pn1 - +Pn19/n1+Pn1+Pn1+Pn19/n1+Pj4+fqFTzZxMABwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBx - LwBrKQrUyMX2+fr2+Pn2+Pj1+Pn29/r2+Pn19/r1+Pn2+Pn2+Pn2+PnRxb9qJwRwLwBwLwBxLwBwLwBx - LwBwLgBwLwBwLwByLwBxOSby8PD1+fr2+Pr2+fr1+Pn2+Pr2+Pr2+Pn2+Pn1+fn2+Pn3+fmpjYRvLwNx - LgBwLgBwLwBwLgBwLwBwLwBvLwBwLgBwLwBxLwBwLwBwLwBwLgBwLgBwLgBxLwBxLgByLwBoJAeLX1jb - 0Mz29vf2+Pn2+fr1+Pn1+Pn1+Pn2+Pr2+Pn2+Pn1+Pn1+Pn19/j2+Pn2+fn2+Pn1+Pn2+Pn1+Pr1+Pn1 - +Pn29/n29/n1+Pj1+Pn09/j1+Pnu6ud8RTZwLgJwLwBwLgBvLgBvLwBwLgBwLgBwLgBwLgBvLgBvLgBv - LgBwLgBwLgBwLgBxLgBxLQBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw - LwBvLwBvLgBwLwBuKgO5n5v2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pr1+Pn2+Pj19/j1 - +Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn1+fn2+Pn2+Pn1+Pj1+Pn1 - +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+PmgenRxLwFxLwBwLgBwLwBwLgBvLQBwLwBwLwBwLgBwLwBwLgBw - LgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBxLwBwLQOlf3P3+fr2+Pn1+Pn2+Pn2+Pn19/n1+Pj1+Pn1 - +Pn1+Pn1+Pn4+fqFTjdxLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLQWoioT3+vn1 - +Pj1+Pj2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Prz8fFsMhdwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBy - LwOWb2j3+Pn2+Pn2+Pn2+Pr29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn4+fl+Tz5xLwBwLwBwLgBwLwBwLgBw - LwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBxLgBuKwN2PivLubb5+vv2+Pr2+Pn1+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn29/n1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn29/n2+Pn1 - 9/n2+Prt6Oh9SThwLQJwLgBwLwBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBw - LgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBv - LwBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBvLgBwLwBvLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBv - LgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBvLwBvLgBwLwBwLwBwLgBwLgBwLgBvLwBu - KgO4n5v1+fn1+Pn2+Pr1+Pn1+Pn2+Pn19/n2+Pn1+Pj1+Pn1+Pn1+Pr19/n2+Pn2+Pj2+Pn2+Pn29/n1 - +Pj1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn29/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj19/n1+Pn1+Pn1+Pn29/n1+Pn2 - +Pn1+Pn19/n2+PmgenRxLgFxLwBwLwBvLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBw - LwBwLwBwLgBwLgBwLgBxLwBwLQOlfnP2+Pr1+Pr1+Pn19/n1+Pn19/j1+Pn19/j19/n1+Pn1+Pn4+fqF - TTdxLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBxMAGATj74+fn1+Pr2+Pn1+Pn1+Pn2 - +Pn1+Pn1+Pn2+Pn2+fn1+Pn3+PqOYFRxLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBrLAbBr6r2+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pnq5+VmKAxxLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBw - LwBxLwBwLwBwLgBxLwBwLwBwLgBrKwmYdGvv7ev4+fn2+fr3+fr2+Pn2+Pn1+Pn1+Pn2+Pr1+Pn2+Pj2 - +fn1+Pn29/n2+Pn1+Pn1+Pn1+Pj19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pr3+frc0c55RzVwLQFw - LwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLwBwLwBvLgBw - LwBwLgBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLwBw - LgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLwBwLwBtKgO5n5v2+fr1+Pn2 - +Pn2+Pj1+Pn1+Pj1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n2+Pn1+Pn29/n2+Pn2+Pn2+Pmg - enRxLwFxLwBwLwBwLwBwLwBvLgBwLwBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw - LwBxLwBwLgSmgHX2+Pr2+Pn1+Pn29/n2+Pn19/n19/j2+Pn1+Pn19/j19/n3+fqFTzdxMABwLwBwLgBw - LwBwLwBwLgBwLwBwLwBwLgBxLwBwLwBwLwBxLgBrKhDo4t/1+Pn2+fn2+Pn2+Pn2+Pn29/n19/n2+Pn2 - +Pn2+Pn19/q6n5ltKgBwLwBwLwBwLwBwLwBwLwBwLgBxLgBqMBTl39z19/j2+Pn1+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn1+Pq6paNuLAZwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBw - LwByLwBrJwayl5L29fb1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+fn2+Pn1 - +Pn1+Pn2+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pr2+Pr2+Pr39ve5oZpuNRtxLwFwLwBwLwBwLgBwLwBvLwBw - LwBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBxLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBvLgBwLgBwLQBvLgBvLgBwLgBuLwBwLgBvLgBvLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBw - LgBvLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLwBvLwBwLwBwLwBwLgBvLwBwLwBwLgBwLwBvLgBwLwBw - LgBwLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLwBwLwBtKQO4npv2+fr1+Pn1+Pn2+Pn1+Pj1+Pj2 - +Pn2+Pn29/n1+Pn2+Pn1+Pn2+Pn1+fn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn1+Pn29/n2 - +Pr2+Pn2+Pn2+Pn19/n2+Pj1+Pn19/n2+Pn1+Pn2+Pn1+Pn29/n1+Pn2+Pr2+PmgeXRwLwFwLwBwLgBw - LgBwLwBwLgBwLgBvLwBwLwBwLgBvLgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgOmgHT3 - +fv2+Pn1+Pn1+Pj2+Pn19/n19/n2+Pn29/n2+Pn19/n3+fqFTjZyMABwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBxLwBtKQO9p6H1+Pn2+Pn2+Pr1+Pn1+Pn19/n1+Pj1+Pn2+Pn1+fn2+frm4N1p - KAlwLwBwLwBwLgBwLwBwLgBwLgBwLgCEUkP29/b19vn19/n1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn3 - +PmPZlxxMAJxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLgBwLgBwLgBxLwBxLgBsKQq7oJf3+fr1 - +Pn2+Pn2+Pn1+Pj2+Pj1+fn2+Pn1+Pn2+Pn2+Pr1+Pn1+Pn1+Pn1+Pn2+Pn2+fn1+Pn1+Pr1+Pn1+Pn2 - +Pr1+Pn1+Pn2+Pn2+Pn4+vrYzcmDUUZsKgRxLwBwLgBwLgBvLgBvLgBwLwBwLgBvLgBwLwBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLgBwLgBwLQBwLgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBvLgBv - LgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBwLwBvLgBvLwBvLgBvLwBwLwBwLgBwLwBvLgBvLgBwLgBwLgBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBvLwBvLgBvLgBwLgBvLwBwLwBwLgBwLgBwLwBwLwBvLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBuKgO4npv2+Pn1+Pn1+Pn19/n29/n1+Pn19/j1+Pn19/j19/j1 - +Pn1+Pj2+Pr2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn29/n19/n2+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pn1+Pn29/n1+Pj19/n2+PmgeXRxLwFwLwBwLwBwLwBwLwBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgOlfnT3+Pv2+Pr2+Pn2+Pn2 - +Pn29/n2+Pn1+Pn19/n19/n19/j3+fmFTjZyMABwLwBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLwBwLwBw - LwBxLgByMAKTaF74+fv2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pr3+Pn5+fl+SjlwLwFwLgBwLwBw - LwBwLwBwLwBxLQCpiYL29/n19/n29/n1+Pn1+Pn1+Pj1+Pn2+Pn1+fr2+fn2+Pnt6+txNyVwLwBwLwBw - LwBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLgBvLwBxLwBwLwBsKwaqi4P3+Pn3+Pv1+fn2+Pn2+Pn1+Pn2 - +fn1+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pr2+Pr2+Pn2+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn2+fn2+Pn3+Pjc - 0s6MZ15qKQ9wLgJwLgBwLgBwLgBwLgBxLgBwLwBvLgBvLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBv - LgBvLgBwLgBwLgBxLwBwLQBwLgBvLQBvLgBwLgBwLgBvLgBwLQBwLgBwLQBwLgBwLgBvLgBwLgBwLwBw - LgBvLwBwLwBvLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBvLwBwLwBwLgBw - LwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBvLgBwLwBwLgBvLgBvLgBvLwBwLwBwLgBwLgBvLwBv - LwBwLwBwLwBwLwBuKgO5n5z2+fn2+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 - 9/n1+Pn29/j1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+PmfeXRxLwFxLwBwLgBwLwBwLgBwLgBwLgBwLgBvLwBvLwBwLgBv - LwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgOmf3P3+fr1+Pr2+Pn2+Pn2+Pn1+Pn19/n1+Pn1 - +Pn1+Pn19/j3+fqETTZxMABwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwByLwBxMh31 - 9PL2+Pn2+fr2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+fn4+fynh4BvLQNxLwBwLgBwLwBwLgBxMABrJwPV - x8P1+Pn1+Pj2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn3+fvSw8BqKAtwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLgBwLwBwLwBwLgBwLwBwLgBwLgKOaF329vf19/n2+fn2+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n19/j3+vn3+PfVxsOOY1RoKgtxLwNwLwBxLwBw - LgBwLgBwLwBwLgBwLwBvLwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBx - LgBwLQBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLwBwLwBwLgBv - LgBvLwBwLwBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLwBwLwBw - LwBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBwLwBu - KgO5n5z2+Pn19/n2+Pn2+Pj1+Pj1+Pn1+Pn19/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2 - +fn29/n1+Pn1+Pn19/n1+Pn1+Pj1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1 - +Pn2+Pn1+Pn29/mgeXRxLwFxLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBvLQBvLgBwLwBwLwBwLgBvLwBw - LwBwLgBwLgBwLwBwLgBwLwBwLgOmf3T2+fr2+Pn2+Pn2+Pn1+Pn19/n1+Pn1+Pn19/n1+Pn19/n4+fqE - TTZxLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBsKAPVxsH29/j2+fn1+Pn2 - +Pn2+Pn19/r2+Pr1+Pn1+Pn2+Pr2+PrTxsNpJwlwLwBwLwBwLwBwLwBxLwBwMBb39/f1+Pn2+fn2+Pn2 - +Pn2+Pj1+Pn19/n2+Pn2+Pn2+Pn4+fukgnxwLANxLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBw - LwBwLgBxLgBuMxrm4eD2+Pr2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 - +Pr1+Pn1+Pn1+Pn1+Pn19/n2+Pnv7e2/q6iDUkZqJQhwLgFxLwBxLwBwLwBwLgBwLwBwLgBwLwBwLwBw - LgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLABwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBvLwBvLwBwLgBvLwBvLgBwLgBwLgBvLgBvLwBw - LwBvLgBvLgBwLgBvLgBvLwBwLgBvLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBv - LgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBuKwO6oJz2+Pr19/j1 - +Pn2+Pj29/n1+Pn2+Pn2+Pj2+Pn1+Pn19/n2+Pn29/n2+Pn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn19/n2+Pn2 - +Pn1+Pn1+Pn2+Pn1+Pn2+Pj2+Pr1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn19/j1+Pn19/j19/n2+Pn1+Pn2+Pmg - enNxLwFxLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBxLgBw - LwBxLwBwLgOlf3P3+Pr1+fn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn19/n09/n4+fqETjdxMABwLgBwLwBw - LwBwLwBwLwBwLwBwLgBvLwBwLwBxLwBwLwBwLwBwLwBwLQCog334+vv2+Pr2+Pn2+Pr2+Pn2+Pn2+Pn1 - +Pn1+Pn2+Pr2+Pny7+1yOSdxLQBxLgBwLwBwLgBxLwGVaFz4+vz29/r2+Pn2+Pn1+Pn19/n1+Pn1+Pn2 - +Pn2+Pn1+Pn39/iASztwLwFxLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBuKgCpiH32 - +fv1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn1+Pr2+Pn1+fn1+Pj1+Pn2+fr1+fr3+fr4 - +fnj29efg31yOSlrKQlxLwNxLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLwBvLgBwLgBw - LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLQBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLwBwLgBxLwBwLgBw - LgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBv - LgBwLgBvLgBwLgBwLgBvLgBvLwBwLgBwLwBwLgBwLwBwLwBuKgO5n5z2+fn1+Pn1+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+fr1+Pj1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2 - +Pn1+Pj2+Pn1+Pn1+Pj2+Pn2+Pn2+Pj2+Pj1+Pn2+Pn1+Pj29/n1+Pn2+Pn2+PmfenNxLwFwLwBwLwBw - LgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLwBxLwBwLQOlf3P2 - +fn2+Pn1+Pn29/n2+Pn1+Pn1+Pn1+Pn2+Pj1+Pn19/n4+fqETjdxLwBvLwBwLgBwLwBxLwBwLgBwLgBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBxLwCCSjb3+Pj3+Pr1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn3 - +PmTaV9yMQNwLwBwLwBwLwBuJwLBran3+fr2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+fj2+Pjl395o - JQtwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvMBTr5OP1+Pn19/j2+Pn2+Pn1 - +Pn1+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+fr3+frz8PDEsayJVklmIgVwLwNwLwBv - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBw - LgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBvLwBw - LgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBw - LgBvLgBwLgBwLgBwLwBwLwBwLwBxLwBvKwO5n5z2+fr19/n2+Pn2+Pn19/j1+Pj1+Pn1+Pn1+Pn2+Pn2 - +Pj1+Pn2+Pn19/n1+Pn29/j1+Pn29/n1+Pn1+Pn1+Pn19/n19/n1+Pj1+Pn2+Pn2+Pr19/j1+Pj19/j1 - +Pj1+Pn1+Pn1+Pj19/n1+Pn2+Pn19/n19/n1+Pn1+Pr2+PmgenRwLwFxLwBxLwBwLwBwLwBxLwBwLwBw - LgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBxLwBwLgOkf3P2+Pr1+Pn19/n29/n1 - +Pj1+Pn1+Pn1+Pn19/n19/n1+Pn4+fqETjdxLwBwLgBvLwBwLgBvLwBwLgBwLwBwLwBwLgBxLgBwLwBw - LwBwLwBwLwBxLwBtLg/l3972+Pr2+Pn1+Pn1+Pn2+Pn1+fn1+Pj19/n1+fn2+Pr29/i+qaJrKQZwLwBw - LwBvLwBpKBLr5uP2+Pr1+Pn1+Pn19/j1+Pn1+Pn1+Pn29/n2+Pn1+Pj2+Pq7oZtuKQJwLgBxLwBwLgBw - LgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBxLwBxLwGMXVL4+vv19/j1+Pn2+Pj1+Pn2+fn1+Pn1+Pn1+Pn2 - +fn2+Pn1+Pn29/n1+Pn1+Pn1+Pj29/fe19WkiINvNCVsJARyMAJxLwBwLgBxLwBwLgBwLgBvLwBwLgBv - LgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLgBwLwBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBxLwBwLQBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBw - LgBvLgBwLwBwLwBwLgBvLgBvLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBvLwBwLgBvLwBwLwBvLwBwLgBv - LgBwLwBwLgBwLgBwLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBw - LwBwLwBwLwBwLwBuKgO5oJz3+Pr19/n2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pj19/n1 - +Pn2+Pn1+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn19/n2+Pn1+Pn2+Pr1+Pn2+Pn19/n19/n2+Pn1+Pn2+Pn1 - +Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+PmfeXRwLwFxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBvLwBw - LwBwLgBvLwBvLwBvLwBwLgBwLwBwLwBwLwBxLwBwLgOmfnP2+Pr1+Pn2+Pn1+Pn2+Pn1+Pj29/n19/n1 - 9/n1+Pn1+Pn4+fqETjdwMABwLwBwLgBwLgBwLgBwLgBwLwBxLgBwLwBwLgBwLwBwLwBwLwBwLwBxLwBs - KgW/qqT2+fr2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pr1+Pn1+Pr2+fnn4uFoKhBwLgBwLwBxLwGBTT729vf2 - +Pr1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn4+vqNXlBxLgFwLwBwLwBwLwBwLwBvLgBwLwBwLwBx - LwBwLwBwLwBwLwBwLwBuKgS6oJr19/j1+Pn1+Pn2+Pn2+Pn2+Pn2+Pr1+Pn2+Pn1+fr2+Pn2+Pn1+Pr3 - +vn09PPGs62GWk5qLQ9vLgVxLwFxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBw - LgBwLABwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBvLgBvLgBwLwBw - LwBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBu - KgO5n5v2+Pr1+Pn1+fn1+Pj2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pj1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2 - 9/n1+Pn1+Pn2+PmeeXRxLwFxLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBw - LwBwLwBwLgBwLgBwLgBwLwBvLQSlf3T2+Pr1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn19/n1+Pn19/n19/j4+fqE - TjZxLwBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBxLwKUa2H2+Pn1+Pn2 - +Pj19/n1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn3+PiAUEBxLwFwLwBuLQSri4T2+Pj2+Pr1+Pn1+Pn2+Pn2 - +Pn2+fn2+Pn2+Pn1+Pn19/n09PNqKQ9xLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBw - MABoJQjc1dP1+Pn1+Pn19/n2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+fn2+Pn1+Pn4+frOv7t9STlpJgNxLwFw - MABwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBw - LgBwLwBwLwBvLgBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBv - LgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLwBvLgBvLwBwLwBwLwBwLgBwLwBwLgBvLgBv - LgBvLwBwLwBwLwBwLwBvLwBvLwBwLwBwLwBvLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBv - LwBwLwBwLwBwLgBvLgBwLgBwLwBwLwBvLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBuKgO4n5v2+fn2+Pn2 - +Pn1+Pj29/j19/j1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn1+Pn2+Pj1+Pj2+Pn2+Pn2+Pn1+Pn2 - +fn1+fn3+Pn1+Pn29/n2+Pn2+Pn1+Pj19/j19/n1+Pr2+Pn1+Pn1+Pn2+Pn29/n19/n1+Pj1+Pn2+Pmg - eXRxLgFwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBw - LwBwLwBwLgSlf3X2+fr1+Pn1+Pn1+Pn1+Pj19/j19/n19/j19/j1+Pn1+Pn4+PqETjZxMABwLgBwLgBw - LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwByMABzOSTz8fD2+Pn2+fr1+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pr1+fn2+Pn3+PqniYVvLQRwLwBrKgvTxMD2+Pn19/n2+fn2+Pn2+Pn2+Pn2+fn2+Pr1+Pn1 - +Pn2+PrNvLpsKgVxLgBwLgBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLwBxLwBwLgBxMABtNB7z8e72+fn2 - 9/n1+Pn1+Pn1+fn1+fn1+fn2+Pn2+Pn2+Pj2+Pr4+vq1nZlqKw5xLQJxMABxLgByMABxLwBwLwBxLwBw - LwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLwBwLgBwLgBxLwBwLABwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLQBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLwBwLwBwLgBwLwBwLwBwLwBw - LwBwLwBvLgBvLwBvLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBw - LwBvLwBvLgBwLgBwLwBvLgBwLwBvLgBvLwBwLwBwLwBwLwBvKgO4n5r2+fr2+Pn1+Pn2+Pn1+Pn1+Pn2 - +Pn2+Pn19/r2+Pn1+Pn2+Pn2+Pn2+fr1+Pn2+Pn2+Pn29/n2+Pn1+Pj2+Pn2+Pj1+Pn1+Pj2+Pn2+Pn1 - +Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn1+fn2+PmgenRwLwFxLwBwLgBv - LwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLwBxLgBwLwBwLwBwLgOmfnT3 - +Pn1+Pn1+Pn1+Pn2+Pn19/n19/n19/n1+Pn1+Pn19/n3+PqFTzdxMABwLwBwLgBwLwBwLwBvLgBwLwBw - LgBwLwBwLwBwLwBwLgBwLwBvLwBwLwBxMABnJQfYzsr2+Pn2+fn19/n1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1 - +Pn1+PnYy8hoJgZxLgBzOSXv7uz1+Pr2+Pn2+Pn1+fn2+Pr1+Pn29/n2+Pn1+Pn1+Pr4+fqdeXFxLwJw - LwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwMABzPTD4+vr2+Pr29/n1+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pr2+Pr3+frJtrFnKApwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBw - LgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBwLgBvLgBvLwBwLgBwLgBwLgBw - LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBvLQBxLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLwBvLgBvLwBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBwLwBwLwBwLgBvLwBwLgBvLwBv - LwBwLwBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBvLwBvLwBwLwBwLgBwLwBwLwBwLgBv - LwBvLgBvLgBwLwBwLgBvLwBwLwBwLwBuKwO4npr2+Pr1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn29/n29/j1+Pj1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn2+Pn29/j1+Pn1 - 9/j2+Pj2+Pn29/n1+Pn1+Pn1+Pn1+Pj2+Pn1+Pj2+Pn2+PmfenRxLwFwLwBwLwBwLwBwLwBwLgBwLwBw - LwBvLwBvLwBvLgBvLgBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBxLwBwLgOlfnP2+Pr1+Pn1+Pj19/n1 - +Pj19/n1+Pn1+Pn1+Pj19/n1+Pn3+fqFTzZxLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBw - LwBwLgBvLgBvLwBxLwBzMgWjhX/2+Pn39/n1+Pj2+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+Pn2+Pnz8vF1PSVw - LwKPamD3+Pn1+Pn2+Pr1+Pn2+Pn2+Pn1+fn2+Pn1+Pn1+Pn2+frz8/N5RTNwLgBwLgBvLwBwLgBvLgBw - LwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwB6PzH4+vr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2 - +Pnz8vJ5QzBwLgBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBvLQBv - LgBvLQBvLwBwLQBwLgBvLQBvLQBvLQBvLgBwLgBwLQBvLQBvLgBvLwBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBvLwBw - LgBvLwBvLwBwLgBwLgBvLgBwLwBwLwBwLgBxLwBvLwBwLwBwLgBvLwBvLgBwLwBwLwBwLgBvLgBwLwBv - LwBwLwBwLgBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBvLwBvLgBwLgBwLwBwLgBwLgBvLwBwLgBwLgBw - LgBwLwBwLwBxLwBuKgO5n5v2+Pn19/n1+Pn1+Pn2+Pn19/j1+Pn1+Pn19/j29/n2+Pr2+Pn1+Pj2+Pn2 - +Pn2+Pn1+Pj19/r1+Pn1+Pj19/j1+Pn1+Pj2+Pn2+Pj19/n1+Pn1+Pj1+Pn1+Pn2+Pn2+Pn1+Pn29/n2 - +fn2+Pn1+Pn1+Pn1+Pj2+Pn19/n2+PmfenRwLgFxLwBwLwBvLwBwLwBwLwBvLwBwLwBwLwBwLgBvLgBw - LgBwLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgOlf3P3+fr1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn1+Pn1 - +Pn1+Pj1+Pn4+fmFTjZxMABwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBx - MAByMAF/TT/4+fn2+Pn1+Pn19/n2+fr1+Pn2+Pr1+Pr2+Pr1+Pn2+Pn3+fqXbWFvLQe8p6P2+Pn2+Pn2 - 9/n2+Pn1+Pn2+Pn2+Pn1+Pn1+fj2+Pn2+Pve1NFsLBFwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLwBw - LwBwLgBwLgBvLwBxMAF/QjP4+vr3+Pn2+Pn2+Pn19/j2+fn2+Pn1+Pn2+Pj2+Pr29/nf2NZkJgZxLwBw - LwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLgBvLgBpJgxmJhFmJxJnJxNnJxRm - JxRoKBRnKBRoKBVnKBVnKRVoKRRtLAFvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBw - LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLwBvLgBvLwBvLgBvLgBw - LgBwLwBvLwBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLwBwLwBvLgBwLgBwLgBvLgBwLwBw - LgBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBwLwBvLgBvLgBvLwBwLgBwLwBwLgBwLwBwLwBwLgBu - KgO5oJv3+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn1+fn1 - +Pn1+Pn1+Pj2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn2 - +Pn2+Pn1+Pn2+PmfenNwLwFxLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLwBxLgBwLgOlfnP2+Pr19/n19/n19/n1+Pn1+Pn19/j19/n1+Pn1+Pn19/j4+fqE - TTdxLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBxLwBwLgBsKxDl3973 - +fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+fnDq6VhIQzr5+T2+fn2+Pn2+Pn1+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn19/mzmZRtLQVwLwBwLwBvLwBvLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBx - LwB4QDH3+fn2+Pn2+Pr1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/jKtq9pJwNxLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBpJgTXysfk4N3o5eLp5eTp5+br5+br6Ofr6Ofr6Ojr - 6ejt6uro4+JsKBJwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBxLgBwLQBwLgBwLwBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBvLgBvLwBvLgBwLgBv - LgBwLgBvLwBwLgBvLgBwLwBvLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBwLwBw - LwBwLwBwLwBvLgBwLgBwLwBvLwBwLgBwLgBvLgBvLwBwLwBwLgBwLwBwLwBwLwBtKgO5n5v2+fr19/n2 - +Pn1+Pn1+Pn2+Pj1+Pn29/n1+Pn2+Pj2+Pn2+Pn1+Pj2+Pn2+Pr2+Pn19/n2+Pn2+Pn1+Pn2+Pj19/n2 - +Pn2+Pn2+Pn1+Pj1+Pj1+Pn2+Pn1+Pn1+Pj2+Pj1+Pn1+Pj2+Pn2+Pn1+Pn19/n19/n2+Pn1+Pn2+Pmf - eXRwLgFwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLwBwLwBxLwBv - LwBwLwBwLgOmfnP2+Pr1+Pn1+Pn1+Pj1+Pn19/n1+Pj29/n1+Pj1+Pn19/r3+PqETjZxLwBwLgBwLwBw - LwBvLgBwLgBwLgBvLwBwLgBvLgBwLgBvLwBvLgBwLwBwLwBwLgBxLwBvLAS9pJ72+fr2+Pn1+Pn1+Pn1 - +Pn19/n2+Pn1+Pn1+Pn1+Pn19/rp5eF8U0z4+fn1+Pr2+Pn2+fn1+Pn2+Pn1+Pn1+Pn1+fn1+Pr2+Pn2 - 9/aHXVJvLwJwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLgBwLgBwLwBxLwBxPTD4+fr19/n1 - +Pn1+Pn2+Pn19/j19/n19/n1+Pn1+Pn19/jRw71oJgRxLgBwLgBwLgBwLwBwLwBwLwBvLgBvLwBwLwBw - LgBwLgBwLgBwLgBwLwBxLgBxNRz4+vj19/j2+fn2+Pn29/n2+Pn1+Pn1+Pn1+Pn1+Pn3+Pnq5eNlJw1v - LgBvLgBvLgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLQBwLQBwLQBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBwLgBvLwBw - LwBwLwBvLgBvLgBwLwBwLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLgBw - LgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLwBwLgBwLwBtKgO4n5z2+Pr1+Pj1+Pn1+Pn19/n1+Pn1 - +Pn2+Pn1+Pn1+Pn2+fr2+Pr1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn29/n2+Pj2+Pn1+Pj2+Pn1+fr2 - +Pj2+Pn1+Pj19/n1+Pn1+Pn19/j1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pj2+PmgeXRwLgFxLwBwLgBw - LwBwLwBwLgBwLgBwLwBwLwBwLQBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgOmf3T2 - +Pr1+Pn19/j19/j2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n3+fmETjdxLwBwLgBwLgBwLwBvLgBwLwBwLgBw - LgBwLgBvLwBvLgBwLgBwLwBwLgBwLwBwLgBxLwBxLgGTZ1r4+/z2+Pn19/n2+Pn2+Pn2+Pj2+Pr2+Pn2 - +Pn2+fn2+Pn5+/u7qKD3+fr2+Pn1+Pr2+Pr1+Pn2+Pn2+Pr1+Pj2+Pn1+Pj1+Pns5+ZtMRpxLwBwLwBw - LgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvNyX29vT1+Pn2+Pn1+Pn1+Pn2+Pn1 - +Pn1+Pn1+Pn1+Pn2+Pnr5eRpLBFvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLgBw - LgBwLAKfenP3+vv09/j19/j1+Pn1+Pn19/n29/n19/n2+Pr1+Pr39/nNu7VpIwNwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBvLgBwLwBwLgBvLgBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLgBvLgBwLwBwLwBvLwBwLwBvLwBw - LgBwLgBvLgBwLwBwLgBvLwBwLgBvLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBvLQBvLgBwLgBvLwBw - LwBvLgBvLgBvLgBwLgBwLwBwLwBwLwBuKwO5n5v2+fn1+Pj2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2 - +Pj2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+fr1+Pn2+Pn1+Pn1 - +Pn1+Pn1+Pn1+Pj1+Pj1+Pn19/n2+Pn1+Pn1+Pn19/n2+PmgeXNwLwFwLwBwLgBwLgBwLwBwLgBwLwBw - LgBvLwBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBvLgSmf3X2+Pn1+Pn19/n19/n2 - +Pn19/n29/n1+Pn1+Pn1+Pn1+Pn3+fqETjdxLwBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBw - LgBwLwBwLwBwLwBwLgBwLwBxMAB0NyDy8O/1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn3 - +Pr19/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n2+Pn1+Pj1+PnJt7RqJwRwLwBwLwBwLwBvLwBvLgBwLwBw - LgBwLwBvLwBwLgBwLgBvLgBvLwBvLwBvLQBoJAne2Nb19/n1+Pn1+Pn2+fn2+Pn1+Pn2+Pn29/n1+Pn1 - +Pn4+vuTaV1uLAFwLwBwLQBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBxMABrLRTh2db1+Pn1 - +Pn1+Pn1+Pj1+Pj19/n1+Pn1+Pn1+Pj19/j19/mvkIduLAFwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLQBwLABwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBvLwBw - LgBwLwBwLgBwLwBwLgBvLgBwLgBwLwBvLgBwLgBwLwBvLgBwLwBvLwBvLwBvLwBvLwBwLgBvLgBvLgBw - LwBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBw - LgBwLwBwLwBwLwBvKwO4n5z2+fn2+Pn2+Pn2+Pn29/j1+Pn29/j2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1 - +Pn2+Pn2+Pj2+Pn1+Pn1+Pj19/n1+fn19/j1+Pn2+fj1+Pn1+Pn2+Pn29/n1+Pj1+Pn1+Pn1+Pn29/j2 - +Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+PmfeXRwLwFxLwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBvLgBwLwBw - LwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgSmgHX2+Pr1+Pn1+Pn19/j1+Pn1+Pj1+Pn1+Pn1 - +Pj19/n09/n4+fqETzdxLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLwBw - LgBwLwBxLwBrJgLVxcD1+Pn1+Pn2+Pn1+Pn1+Pn1+fn2+Pn2+Pn2+Pr1+fn2+Pn29/j19/n2+Pj2+Pn2 - +Pn1+Pn1+fn2+Pn19/n1+Pn19/n3+fqadG5yMANwLQBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBw - LwBvLgBwLwBvLgBvLgBqJgXFsq/2+fr2+Pn1+Pn2+Pn19/n2+Pj2+fn2+Pn2+Pn1+Pn2+fvl3dtuMiFx - LgJvLgBwLwBwLwBwLgBwLgBwLwBvLwBvLgBwLgBxLwBwLwBrKwisj4f3+vr2+Pn1+Pn19/n1+Pj19/n2 - +Pn19/n19/n1+Pn1+Pn4+PqLW01vLgFwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBw - LgBxLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBw - LgBvLgBvLgBwLwBvLgBwLgBwLgBwLgBwLgBvLwBvLgBvLgBwLgBvLwBwLgBwLgBvLgBwLwBwLwBwLgBw - LgBvLwBwLgBvLwBwLgBwLgBvLwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLgBvLgBvLwBwLwBwLgBu - KgO5n5z1+Pn19/j1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj1+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pj19/n2 - +Pn1+Pn2+Pn1+fn19/n19/j2+Pn2+Pn2+Pn2+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 - +Pr2+Pn19/n2+fmgeXRxLgFxLwBwLgBwLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBw - LgBvLwBwLwBwLwBwLgBwLwBwLQOlfnT3+fr1+Pn1+Pn29/n2+Pn19/n1+Pn1+Pn1+Pn19/n19/n4+fqF - TzhxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBxLQCo - hn32+fr2+Pn2+Pn2+Pn2+Pn2+Pr2+fn2+Pn2+Pn1+Pn2+Pn2+Pn29/n2+Pn2+Pr2+Pn1+Pn2+Pn2+Pn2 - +Pr1+Pn1+Pr5+vpxNCJxLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBvLwBvLgBwLgBwLgBw - LgBwLgOZc2/3+vv1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+fr2+Pnc09J2QTFuLAJwLgBwLwBw - LwBxLgBxLwBxLwBwLwBwLQBxLgBpKAinhXz29vb2+fr19/j19/n19/n1+Pj19/j2+Pn1+Pj1+Pj2+Pn1 - +Pjz8e9sKg9wLwBvLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLwBvLwBvLgBvLgBwLgBwLgBwLwBwLgBwLgBw - LgBvLwBvLwBvLgBvLQBwLwBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBw - LwBwLwBwLwBwLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBtKgO5n5z2+fr1+Pj2 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2 - 9/n2+Pn1+Pn2+fn2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn19/n1+Pj2+Pn2+Pn1+Pj1+Pn1+Pn1+Pn1+fn2+fmg - eXRxLwFxLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBwLgBw - LwBxLwBwLgOlfnP2+Pr1+Pn1+Pn2+Pn2+fn1+Pn2+Pj19/n2+Pn1+Pn19/j3+fqETzdxLwBwLgBwLwBw - LwBxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBxMACATjr4+fn2+fn2+Pr1 - +Pn1+Pn3+fn2+fn1+Pn2+Pn2+fn2+fn2+Pn3+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+frc0c5r - JQZwLgBwLwBwLwBwLwBwLwBvLwBwLgBvLgBwLwBvLwBwLwBwLgBvLgBvLgBvLgBvLgBwLwB0Nyb09PL1 - +Pr1+Pn2+Pn1+Pn1+Pn2+Pj2+Pn1+Pn1+Pn2+Pn1+Pr3+fry7+6pioN2Qi5nKA5uKgdxLgdwLwdvLQds - KQZmKhGEUkPMu7b3+fv1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj19/n1+Pn19/n2+Pj29/n19/jHtrFsKwRxMABv - LwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLwBvLgBwLgBwLgBwLwBvLwBwLwBw - LgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBv - LwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBuKgO5n5v2+Pr19/j2+Pn1+Pn1+Pn1+Pj1 - +Pj1+Pj2+fn1+Pn2+Pn19/n2+Pn1+Pn1+Pn2+Pn2+Pj1+Pj29/r2+Pn2+fj1+Pn19/j1+Pn1+Pn2+Pn1 - +Pn1+Pn2+Pn1+fn19/j1+Pn19/n19/j1+Pn19/n1+Pn1+Pn1+fn1+Pj1+Pn2+PmgeHRwLwFxLwBwLgBw - LgBwLgBvLgBwLgBwLgBvLwBwLgBwLwBvLgBvLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgOlfnP2 - +Pr1+Pn1+Pj19/n1+Pn1+Pj2+fn19/n1+Pj1+Pn19/n3+fmETzdwLwBwLwBwLwBwLgBvLwBwLwBwLwBw - LwBwLwBvLwBwLwBxLwBwLgBvLwBwLwBwLwBwLgBwLwBxLwBlJQjr6ef1+Pn2+Pn19/n2+Pr2+Pn2+fr1 - +Pn2+Pr2+Pn1+Pr1+Pn2+fn2+fr2+Pn2+Pr1+Pn2+Pn1+Pn2+Pn1+fn2+vuwkYlvLQFwLgBwLwBwLgBw - LgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLwBqJgTNvLf2+Pr19/j29/n1+Pj1 - +Pn2+fn2+Pn1+Pn1+Pj2+Pj1+Pj1+fr3+fn4+frz8/Lg19S8paK0oKCwn6C0oaHCrKno5OL29/f2+Pn2 - +Pn2+Pn1+Pj1+Pn29/n1+Pj19/j1+Pn19/j19/j19/n19/j3+PiRamFxMAFwLwBwLgBwLwBwLwBwLgBw - LgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBvLgBvLgBvLwBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLgBwLgBw - LwBwLwBwLwBvLgBvLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBuKQO5n5v2+Pr1+Pj2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn1 - +Pj2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+PmgeXRwLgFwLwBwLwBwLwBwLgBwLwBwLwBw - LgBwLwBvLgBwLwBwLgBwLgBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgSlf3T2+fr2+Pr1+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/n3+fqETjdxMABxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw - LgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLQa7pKL2+Pr1+Pr1+Pn2+Pr1+Pn2+Pn2+Pr1+Pn2+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pn2+Pn2+Pn2+Pn4+vqIVkJyLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBw - LwBwLgBwLwBvLwBwLgBvLwBvLwBvLgBwLgBwLgBwLgCNXU/4+fn29/n1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn2+Pr2+Pj2+Pn1+Pj19/j19/j29/n19/j2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1 - +Pn2+Pn1+Pn1+Pn1+Pn1+Pj19/n1+Pni3dtrMBVxLwBwLwBvLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBxLgBvLQBwLgBwLgBwLgBwLwBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLgBvLwBwLgBvLgBwLgBwLwBwLgBwLwBvLwBwLgBvLwBvLwBwLgBwLgBwLwBwLwBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLgBvLgBvLgBwLwBwLgBwLwBv - LwBwLgBvLwBwLwBuKgO5npv2+Pr19/j19/j19/n1+Pj2+Pn1+Pn1+Pn2+fn1+Pj2+Pr2+Pn1+Pj2+Pr2 - +Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pj1+Pj2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/j1+Pn2+Pn19/n2 - +Pn2+fn19/n2+Pn19/n1+Pn1+Pn2+PmfenRwLgFxLwBwLgBwLgBwLgBvLgBwLwBvLwBvLwBvLgBvLgBv - LgBwLgBvLwBwLgBwLgBvLwBvLgBwLgBwLgBwLwBwLQSmf3X2+Pr2+Pn1+Pn1+Pn2+fn29/n1+Pn2+Pn1 - 9/n1+Pn19/n3+fmETjZxMABwLgBwLwBvLgBwLwBwLgBwLwBvLwBwLgBwLgBvLgBwLwBvLgBwLwBwLgBw - LgBwLgBwLgBwLwByMAGQaF/4+vv19/r19/n2+Pn2+fn2+Pn2+fn29/r2+fr1+fn1+Pn1+Pn1+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn19/n1+Prs5+ZuLxNwMABxLgBwLgBwLgBvLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBvLgBvLgBwLgBwLgBxLwBqKwvWy8j2+Pn1+Pn1+fn1+Pr2+Pn2+Pr2+Pn2+Pn2+Pr2+Pn1+Pn1 - +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n1+fj1+Pj1+Pn1+Pn1+Pj2+Pj1+Pn1+Pn29/n1+Pn1+Pn1 - 9/j1+Pj1+Pn19/iggXpvLARwLwBwLgBvLgBvLwBwLgBwLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBx - LgBvLQBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw - LgBvLgBwLgBvLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw - LwBwLgBwLgBwLwBvLgBwLwBwLwBvLgBwLgBwLgBwLwBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBu - KgO4npv2+Pr19/j1+Pj1+Pj2+Pn1+Pn1+Pn1+Pn1+Pr19/r1+Pn2+Pr1+Pn2+Pn2+Pj1+Pn2+Pn29/n2 - +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pr1+Pn29/n2+Pn2+Pn2+Pn29/n29/n1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pr1+Pn2+PmgenRxLwFxLwBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLwBwLgBw - LgBvLgBwLgBvLwBwLgBwLwBwLQSkf3X2+fv19/n2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn19/n3+fqE - TjZxMABwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLwBvLwBwLgBvLgBwLgBwLgBwLgBxLgBx - LwBzOSPw7u32+Pr2+Pn1+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn1+Pn2+Pn1+Pj19/n2+Pn1 - +Pn2+fnHtbFrKQRwLgBwLwBwLwBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLwBw - LQBwLgBwLgByLwGAU0T19fT2+Pn2+Pn1+Pn1+Pn1+Pr2+fn1+Pn2+Pn2+Pn2+Pn1+fr2+fn1+Pn2+Pj2 - +Pr2+Pn3+Pn2+Pn1+Pn1+Pn2+fn1+fj1+Pn29/n1+Pn1+Pn19/j1+Pn19/n19/n19/j19/j1+Pni29lo - LxdwLgBwLwBvLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLgBw - LgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBw - LwBwLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBuKwO4n5v2+Pn19/j1 - +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+fn29/n29/r2 - +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+fn2+Pn2+Pn1+Pr2+Pmg - enRwLgFxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBvLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBw - LwBwLwBvLgOlf3T3+Pr2+Pn2+Pn19/n2+Pn1+Pn1+Pn19/n2+Pn19/n19/n3+PmFTjdxMABwLgBwLgBw - LgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBsKgrQwL33+fr2 - +Pn2+Pn1+Pr2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pr2+Pn2+Picdm9xLwJw - LwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBs - KwaskIv3+ff1+fr1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pj19/n09/j19vaLX1NwLwJwLwBwLwBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBwLwBvLgBvLwBwLwBvLwBvLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBvLwBwLgBv - LgBvLgBwLgBwLwBvLgBwLgBvLgBvLgBwLgBwLwBvLwBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBvLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBuKwO5npv2+fr1+Pj19/j1+Pn29/n1+Pn2 - +fn1+Pj29/n1+Pj2+Pn1+Pn2+Pj2+Pn19/n1+Pn2+Pn1+fj19/n1+Pn2+Pn1+Pn19/n2+Pn19/n1+Pn2 - +Pn1+Pn1+Pj2+Pn19/j2+Pn1+Pn2+Pn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn19/n2+PmgenRwLwFwLgBwLgBw - LgBwLwBwLwBwLwBwLwBwLgBwLgBvLgBvLgBwLwBwLgBvLwBwLgBwLgBwLQBwLgBvLgBwLwBvLgOlfnT2 - +Pn2+Pn19/j1+Pj1+Pn19/n1+Pj29/n1+Pj1+Pj19/n3+PmFTjdwMABwLgBwLwBwLwBwLwBwLgBwLgBw - LgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgByMASjgXz4+fv2+Pn1+Pn29/n1+Pn1 - +Pn1+Pn2+fn2+Pn2+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+fn2+Pn29/n09PR1QzFxMABwLgBwLwBwLwBwLgBw - LgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBxLwBwLgBwLgBwLgBwLgBwLwBwLwBvLQBwLgBtLhPRv7z3+fr1 - 9/j2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn19/n19/j1+Pn1 - +Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pj1+Pj19/j2+Pm0l41rKANvLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLQBvLgBwLgBv - LgBwLgBwLgBvLwBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBw - LgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBvLgBw - LwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBuKgO5npv2+Pn2+Pj2+Pn2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn1+Pn2 - +Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+fn1+Pn2+Pn2+Pn2+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pj2 - +Pn29/n19/n2+Pj2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn3+PmfenRwLgFwLwBwLgBwLwBwLwBwLgBwLgBw - LgBwLwBvLgBvLgBwLwBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgOlf3P3+Pv2+Pn1+Pn19/n2 - 9/n1+Pn29/n2+Pn1+Pn1+Pr19/j4+fqETjdxLwBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBw - LwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBxMQGBTj739vb2+Pn2+Pr2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 - +Pn2+Pr1+fn2+Pn29/n2+fn1+Pn1+Pr2+Prb09JoKAlvLgBxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBw - LgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwFwMRve1M/2+fr19/n19/n2+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj2+fn2+Pn19/n1+Pn2+fn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2 - +fn2+Pn1+Pj1+Pn3+PnOwLtsLQ9wLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLQBwLQBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBw - LQBvLgBwLwBwLgBwLgBwLwBwLwBwLwBvLwBwLgBvLwBwLgBwLgBvLgBvLwBwLgBwLgBwLwBwLgBwLgBv - LgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBvLwBw - LgBwLwBwLgBwLgBuKgO4npv2+Pr1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2+Pn1+Pn1 - +Pn1+Pn29/n1+Pn2+Pn2+Pn2+Pr1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1 - +Pn19/n2+Pn1+Pn1+Pn2+Pn1+Pn2+PmfenRwLwFxLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLQSkfnX2+Pr2+Pr2+Pn2+Pn29/n1+Pn2+Pn2+Pn1 - +Pn1+Pn19/j3+fqETjdwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBv - LgBwLgBwLwBwLwBwLwBxLgBqKhHl3t32+Pn3+Pn2+Pn1+Pn2+fn2+fr1+fn2+Pr2+Pn1+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pr2+Pn2+fqnjIdxLwVxLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBwLwBv - LgBwLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBxLwBuMhrSxL32+fn09/n2+Pn2+Pn1+Pn1+Pn1+Pn1 - +Pn1+Pn2+Pn19/j2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn19/n2+PnK - urFrMBVwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBw - LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLgBvLgBwLwBw - LgBwLwBvLgBvLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBxLwBwLwBwLwBwLwBwLwBu - KwO4npv2+Pr19/j1+Pn19/j1+Pj2+Pn2+Pn19/j2+Pn1+Pn1+fn1+Pn2+Pj2+Pn1+Pn2+Pn1+Pn1+Pj1 - +Pn2+Pn2+Pn2+Pn19/n1+Pn19/n2+Pn2+Pr1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2+Pj19/n2+Pj1+Pn1+Pn2 - +Pn1+Pj1+Pn2+PmfeXRwMAFxLwBvLgBwLgBvLwBwLwBxLwBvLgBvLwBvLwBwLgBwLwBwLwBwLwBwLwBw - LwBwLwBwLgBwLgBwLgBvLgBwLQSkf3T2+Pr1+Pr19/n1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n1+Pn3+fqE - TjdxMABwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBw - LgByLwBtKAO8o5/1+Pn1+Pn2+fn19/n2+Pn1+Pn2+Pn2+fr2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn4 - +fqBUUJxLwFxLwBwLgBwLwBwLwBvLwBwLgBxLQBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBw - LwBvLgBwLwBwLwBwLgBvLgBwLgBxLwFsMRi5oJr29/f1+Pn1+Pj2+Pr2+Pn1+Pn19/j2+Pn2+Pn19/n1 - +Pn1+Pj1+Pn1+Pn19/j1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj1+Pn19/n2+fr19vWzlZJqKw9vLwFvLgBvLgBv - LgBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBw - LwBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBv - LgBwLwBvLwBvLwBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBuKgO5n5v2+fr1+Pn1 - +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn29/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pmf - eXRwLwFxLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLwBvLgBw - LwBwLwBwLgOkf3P2+Pr1+Pr1+Pr1+Pn2+Pr1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn3+fmDTDZxLwBxLwBwLgBw - LwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBxLwBxLwKOX1X4 - +vv2+fr1+Pn19/n2+Pn1+Pr2+fr2+fn2+fn2+Pr1+Pn1+Pn2+Pn1+Pn2+Pr2+Prp4+FqLRRwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBw - LgBvLgBwLgBxLgBxMABsKwaOX1Tl3dv3+fr2+fr2+Pr2+Pn1+Pj1+Pn2+Pj2+Pn2+fn2+Pn2+Pn2+Pn2 - +Pn1+Pn1+Pn19/n2+Pn2+Pn1+Pr2+Pr3+fnl396LWUtrKAVxLgBwLgBvLwBwLgBwLgBwLgBvLgBvLwBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBvLgBvLwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBv - LgBwLwBwLgBvLgBwLwBwLgBwLgBvLgBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBw - LgBwLgBwLwBvLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBxLwBuKwO5oJv2+fv2+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pj1+Pn1+fj2+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pn2+Pn1+fn2+Pr1+Pn19/n1+Pj2 - +Pn19/n1+Pn2+fr1+Pn1+Pn2+Pn1+Pj29/n1+Pn2+Pn2+Pj1+Pn1+Pn29/n2+PmfenRxLwFxLwBwLgBw - LwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLwBvLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBxLQOkf3L1 - 9vj19/n09/j09/j09/j19/jz9vf09/jz9vfz9vf09/j39/mDTTRxLwBxLwBwLgBvLwBwLgBvLwBvLgBw - LwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBpJg329vX19/n09/j19/n0 - 9/j1+Pr09/j09/j09/f19/j19/j19/j19/j09/n09/j2+PnEr6xsKAVwLgBwLwBwLwBwLgBwLgBwLgBw - LwBwLgBwLwBwLwBwLgBwLgBvLgBvLwBwLwBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLgBw - LgBwLwBvLQJtLhidfHTl39z4+vr2+Pn19/f1+Pn1+Pr2+Pn1+Pn1+Pn1+Pn1+Pn0+Pn1+Pn2+Pr19/n0 - 9/n1+Pn4+vvk392ffHlsLhlwLQFxLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBvLgBw - LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBxLgBwLABwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLQBw - LgBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLgBwLwBvLgBwLwBvLgBwLgBvLwBvLgBwLgBwLwBwLgBwLgBw - LwBvLgBvLwBwLQBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLwBvLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBv - LgBvLgBwLwBwLwBwLwBwLwBwLwBxMABuKgO5n5z2+Pr1+Pj1+Pn2+fn1+Pj1+Pj1+Pn19/n2+Pn2+Pn2 - +Pr1+Pn1+Pn2+Pn1+Pj2+Pn1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+Pj2+Pn1+Pn1+Pn1+Pn19/n1+Pn1 - +Pn1+Pn1+Pn1+Pr1+Pn1+Pn19/j1+Pn2+Pn1+Pn19/n2+PmfeXRwLgFwLwBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBvLwBvLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgKVZlLJtKjIsqbIs6fIsqbJ - sqbJsqfIsqbIs6fIs6bJsqfJtKjLtqp+RCZxLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLgBsKgCti33IsajIsabIs6bIsqbIs6fHsqfIsqfI - sqfJsqfJsqjIsqjJsqfIsqfIsqfJs6iPYlFwLgJwLgBwLgBwLgBwLwBwLwBwLgBvLwBvLgBwLgBwLgBv - LgBwLwBwLwBxLwBwLwBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLwBwLwBwLgBvLgBw - LAVpLBKIXlK5oJ3o5OH19PP4+vr2+fr2+Pn29/n2+Pn2+Pn1+Pn3+fr4+fv08/Hn4eC7opyIXlRnKxFx - LgVwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBxLgBwLABwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLwBvLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLwBvLgBwLgBvLwBvLgBvLgBwLgBwLwBwLgBwLgBw - LgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBw - LwBwLwBwLwBwLgBuKgO4npv2+Pr1+Pn1+Pn2+Pn1+Pn2+Pn2+Pj1+Pn1+Pn19/n2+Pn2+Pn1+Pn1+Pn1 - +Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn29/n1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+PmgeXRxLwFxLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLgBv - LgBwLgBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBvLwBwLgBwLwBxLwBwLwBwLwBwLwBwLwBxLwBxLwBw - LwBwLwBxMABxLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBvLgBwLwBw - LwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBvLwBwLwBxLwBwLwBwLwBxLwBwLwBwLwBx - LwBxLwBxLwBxLwBxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBvLwBwLgBv - LwBwLQBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBvLgBvLgBwLgBwLgBwLwBwLwBxLwBv - KwJnJAVkIApvMBeCUj+JXlaLYVqKXVaCTjpyNRpjIApmJARwLAJwLwBwLgBwLwBwLwBwLwBwLwBvLwBw - LgBwLwBwLgBvLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLwBw - LwBvLgBwLgBvLwBwLgBwLgBwLwBvLwBwLwBvLgBvLgBvLwBvLwBvLwBvLwBwLgBwLgBvLwBwLwBvLwBv - LgBvLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBxLgBu - KwO3nZr2+Pn1+Pn1+Pj1+fn19/n1+Pn1+Pj19/j2+Pn2+Pn2+Pn2+Pn19/n2+Pn1+Pn1+Pj19/j19/j1 - +Pn1+Pn19/j1+Pn19/j1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn19/n19/n2+fn19/n1+Pj1+Pn1 - +Pn1+Pn19/n2+PiheXRwLwFxLwBwLwBwLwBwLwBwLwBwLgBvLwBvLwBvLgBvLgBwLwBwLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLwBvLgBxLgBwLgBwLgBwLgBv - LwBwLwBwLgBvLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBvLgBvLgBwLwBwLwBw - LwBvLwBwLQBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBw - LwBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLwBvLwBwLgBwLgBvLwBwLwBvLgBwLgBwLwBw - LgBwLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLwBwLwBwLgBwLgBvLwBxLgBwLwBwLgBwLwBxLwBy - MAJxLwRxLwRyMARxLgJxLgFwLwBvLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBw - LgBvLgBvLgBvLgBvLgBvLgBwLwBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBxLwBvLQBwLgBwLgBw - LgBwLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBvLgBvLwBwLwBw - LgBwLgBwLwBvLgBvLgBvLgBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLgBvLwBwLwBvLgBvLwBwLgBwLwBv - LgBvLgBwLwBvLgBwLgBwLgBwLwBvLwBwLwBwLwBvLgBwLwBwLgBwLwBvLgBwLwBtKgO4npr3+Pn1+Pn1 - +Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn19/j1+Pn2+Pn2+Pn1+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn19/n29/n2+Pn1+Pj1+Pn2+Pn2+Pn1+Pj2+Pmg - eXRwLgFxLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBw - LwBwLgBvLgBvLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw - LgBwLwBwLgBwLwBwLwBwLgBvLwBvLwBvLwBvLgBvLgBwLgBvLgBwLwBvLwBwLwBvLgBvLgBvLgBwLgBw - LwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw - LgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBvLgBwLgBvLwBvLwBwLgBwLgBwLgBwLwBwLwBvLgBvLwBwLgBw - LgBwLgBvLwBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBvLgBxLgBxLgBwLgBwLgBw - LgBxLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLgBw - LwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLABwLgBwLgBvLgBwLgBwLwBwLgBw - LgBvLQBwLQBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBvLwBwLwBwLgBwLgBwLgBvLwBwLgBv - LgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLgBvLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBw - LwBwLwBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBuKgO3npn2+Pn1+Pn2+Pn1+Pn2+Pj2+Pn2 - +Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj19/j19/n2+Pn1+Pn1+Pn19/j1+Pr2+Pn2+Pj1+Pn2+Pj2+fn2+fn1 - +Pn2+Pn1+Pn1+fj19/n1+Pr1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn29/n1+Pr19/n2+fmfeXNxLgFxLgBxLgBw - LgBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBvLgBwLgBwLgBwLwBvLgBwLwBvLgBvLgBwLgBvLgBwLwBv - LgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLwBwLwBw - LwBwLwBvLgBvLgBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLwBv - LwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLwBw - LwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBvLgBv - LgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLgBwLgBwLwBw - LwBwLwBwLwBvLwBwLgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBvLwBwLwBwLgBvLgBwLwBvLgBwLwBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLwBwLwBvLgBvLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLgBvLgBwLwBvLwBwLwBvLwBv - LgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLwBvLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLgBvLgBw - LgBwLwBwLgBwLwBvLgBvLgBwLgBwLwBtKgO4npr2+Pj19/j1+Pj1+Pn19/n1+Pn19/n1+Pn2+Pn2+Pn1 - +Pn1+Pj19/n1+Pj19/j2+Pj1+Pj2+Pn1+Pn2+Pj19/j1+Pn19/j1+Pj1+Pj2+Pj1+Pn1+Pj1+Pj1+Pn1 - 9/n2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pj1+Pn19/n2+PmeeXRxLwFxLwBwLgBwLwBwLwBwLgBwLgBv - LgBwLgBvLgBvLgBwLwBwLgBwLQBwLgBvLgBwLwBwLgBwLwBwLgBvLgBwLwBwLwBwLgBvLwBwLgBwLwBw - LgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBv - LwBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBw - LwBxLwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBvLgBvLgBvLgBwLwBvLgBwLwBwLwBw - LwBwLgBwLwBwLwBwLgBvLwBvLwBwLgBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBw - LgBwLwBwLgBwLgBvLgBvLgBwLwBwLwBwLwBvLgBwLgBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBvLgBv - LgBwLwBwLwBwLwBwLwBwLgBvLgBvLwBwLgBwLgBvLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLwBwLgBxLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LwBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLgBvLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBv - LgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBvLwBwLgBwLgBvLgBwLwBwLgBwLwBwLgBwLwBv - LgBwLgBwLwBwLwBuKQO4n5r2+Pr1+Pj2+Pn19/j2+Pj2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1 - 9/n2+Pj1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn19/j2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn1 - +Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+PmfeXRxLgFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLgBw - LgBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLwBw - LwBwLwBwLwBvLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBvLwBwLgBvLwBwLgBvLgBwLgBvLwBw - LgBvLwBwLwBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLgBwLgBwLwBw - LwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBv - LwBvLgBvLgBwLgBwLgBvLgBwLwBwLwBvLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBw - LwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLwBwLwBwLwBw - LwBwLwBwLwBvLwBvLwBvLgBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBx - LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBw - LgBwLgBwLgBvLwBvLwBwLgBwLwBwLwBvLwBvLwBvLgBvLgBwLwBwLwBvLwBvLwBvLgBvLgBvLgBvLwBw - LgBvLgBwLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBvLwBvLwBvLgBwLgBwLgBvLwBvLwBwLgBwLgBxLwBu - KgO5npr2+Pr1+Pj29/n2+Pj1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj19/n1+Pj1+Pn1 - +Pj2+Pn29/n2+Pn2+Pn2+fn2+Pn19/n2+Pn1+Pn1+Pn1+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2 - +Pn1+Pn1+Pn2+fmfenNxLwFxLwBxLwBwLgBwLwBwLwBvLwBvLwBwLwBvLgBvLgBvLgBwLwBwLgBvLgBw - LgBwLwBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBwLwBvLwBwLgBvLgBwLgBwLwBvLgBvLwBwLgBwLgBw - LwBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLwBvLgBwLgBvLgBwLgBwLwBvLgBwLwBvLgBwLwBwLgBvLwBw - LgBwLgBwLwBvLwBwLgBwLwBvLgBvLwBvLwBvLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBvLgBwLgBwLgBvLgBvLgBwLgBvLwBvLgBwLwBwLwBvLgBvLgBvLgBvLgBwLwBvLgBw - LgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLgBwLwBv - LgBvLwBvLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBxLgBvLABvLgBwLgBw - LgBwLgBvLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLwBwLwBvLgBvLwBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBvLgBvLgBwLwBvLgBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBv - LgBwLwBwLgBwLgBwLgBvLwBwLgBwLQBvLgBvLgBwLgBwLgBwLwBwLwBwLwBwLwBuKgO4npr2+Pr1+Pn2 - +Pn1+Pn1+Pj29/n1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pn19/j2+Pn2+Pj1+Pn19/j1+Pj2+Pn1+Pj1 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n1+Pn2+Pj1+Pj19/n2+Pn29/n1+Pn2+Pj2+Pr1+Pn1+Pn1+Pn2+Pmf - eXNwLwFwLwBxLgBwLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBvLgBwLgBv - LgBwLwBwLgBvLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLgBwLgBwLgBwLgBw - LwBwLgBvLgBwLwBwLgBwLgBvLgBvLwBvLgBwLgBvLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLwBvLgBv - LwBvLwBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBw - LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBvLgBvLgBvLwBwLwBwLgBwLgBw - LwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBw - LgBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBwLwBvLgBvLwBwLgBwLgBvLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBvLgBw - LgBvLgBvLwBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBtKgO4n5v3+fn2+Pn1+Pn2+Pn19/n19/n1 - +Pn1+Pn2+Pn2+Pn2+fn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pj1+Pn2+Pn2+Pr2+Pn1+Pn1 - +Pj2+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+fn2+Pn1+fn19/n2+PmgeXRwLwFxLwBwLwBw - LwBwLwBvLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLwBvLwBwLgBw - LgBwLgBvLgBwLwBwLwBwLgBvLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBvLwBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLwBvLgBwLwBwLwBwLwBvLwBwLgBvLgBv - LgBvLgBwLwBwLgBwLwBvLwBwLwBwLwBwLwBvLwBwLwBvLgBvLwBwLgBwLgBwLwBvLgBwLwBwLgBvLwBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLwBw - LwBvLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBvLwBvLgBw - LgBwLwBvLgBvLgBvLgBwLwBwLgBvLwBwLgBwLgBwLwBvLwBwLwBvLgBwLwBvLgBvLgBvLgBwLgBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBvLwBwLwBwLgBwLwBwLwBvLgBw - LwBwLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBwLwBvLwBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBw - LgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBtKwO5n5v2+fr1+Pn1+Pn1+Pn1+Pj2+Pj1+Pj1+Pn2+Pn29/n2 - +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pj2+Pr1+Pn1+Pn1+Pn2+Pn19/j2+Pn2+Pn2+fn1+Pn19/j1+Pj2+Pn2 - +Pn1+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+fn2+Pr1+Pn2+Pn2+PmfenRwLwFxLwBvLwBvLwBwLwBwLwBwLwBw - LwBwLwBvLgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBxLgBwLwBwLwBwLwBwLwBw - LwBvLwBwLgBvLwBwLwBvLwBwLwBvLgBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLwBwLgBv - LwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLgBvLgBwLwBvLwBwLgBvLgBvLgBvLgBwLgBvLgBvLwBw - LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBvLgBvLgBw - LwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBv - LgBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLgBvLgBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBw - LgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBw - LwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBuKgO5n5v2+vn1+Pn2+Pn2+Pn2+Pj19/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pj2+Pn1+fn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1 - +Pn2+Pn1+Pn1+Pn1+Pn1+fn2+Pn2+fmgeXRwLwFxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBw - LwBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLwBw - LwBwLgBwLgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBvLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBvLwBw - LwBwLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBvLwBwLwBwLgBwLgBvLwBwLwBvLgBwLwBvLgBwLwBwLgBw - LwBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLgBvLgBwLgBw - LgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBv - LgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBx - LwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBw - LgBwLgBwLwBvLwBwLgBwLwBwLgBwLwBvLgBwLwBvLgBvLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBw - LwBwLwBwLgBwLwBwLwBvLgBvLgBvLwBwLgBwLgBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBu - KgS5n5z1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+fn2+fn2+Pn1+Pn1+Pn1+Pj1+Pn2+Pn2+Pn1+Pn19/n2+Pn1 - +Pn2+Pn2+Pn2+fn1+Pn19/n19/n1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pn2 - +fn1+Pn1+Pn2+PmgeXRwLwFxLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBw - LwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLwBw - LwBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLwBvLgBvLwBwLwBvLwBwLwBvLgBw - LgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBwLgBvLwBw - LgBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw - LwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBvLQBvLwBwLwBwLgBwLwBwLgBwLwBwLgBw - LwBwLgBvLgBwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLwBwLQBwLgBvLgBw - LwBwLgBwLwBvLQBvLgBvLgBwLgBwLQBvLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBw - LwBwLgBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLgBvLwBw - LgBwLgBvLgBwLwBwLwBvLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBuKgO5n5v1+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pj1+Pj1+Pn19/n1+Pn2+Pn1+Pj2+Pn19/j1+Pj2+Pr1+Pr1+Pj2+Pn2+Pn2+Pj1 - +Pr2+Pn1+Pn1+Pj1+Pn1+Pj2+Pn2+fn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn2+Pmg - eXNxLwFxMABxLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBw - LwBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBvLgBwLwBvLgBvLgBvLgBwLwBwLwBwLgBw - LgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLwBw - LgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBwLwBwLgBvLwBvLwBwLgBwLwBvLgBwLwBwLwBwLwBv - LgBwLgBvLwBvLgBwLgBwLgBwLwBvLgBwLwBvLgBwLgBwLgBwLwBvLgBvLwBvLgBvLwBwLgBwLgBvLwBw - LgBwLwBwLwBvLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLwBvMABwLwBwLgBw - LwBwLwBvLgBwLgBvLgBwLgBvLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBv - LgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBvLgBwLgBvLwBwLgBwLwBvLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBw - LgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBuKgO5n5v2+fn1+Pn1+Pn1+Pn1+Pn1+Pn2 - +Pn1+Pn2+Pn1+Pj1+Pn2+Pn2+Pn19/n19/j2+Pn2+Pj1+Pj2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn19/n1 - +Pn2+Pn1+Pn1+Pn29/n2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+PmgeXRxLgFxLwBwLgBw - LwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw - LwBwLwBvLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLgBwLwBw - LwBwLgBwLgBwLgBwLwBvLgBvLwBwLgBwLgBvLgBwLgBwLwBvLwBvLgBwLgBvLwBwLwBwLgBvLgBvLgBw - LgBwLgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLwBw - LgBvLgBwLgBwLgBwLwBwLwBwLwBwLgBvLwBvLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBv - LwBwLwBwLwBvLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBvLgBwLgBwLwBwLwBwLwBwLgBvLwBvLwBwLwBw - LgBwLwBwLgBwLwBwLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBvLgBvLwBwLgBvLgBvLQBvLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBwLwBwLgBvLwBvLwBvLwBwLgBwLwBwLwBwLwBv - LgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBvLwBwLwBwLwBvLwBwLgBwLgBvLwBwLwBvLwBwLgBwLwBwLgBw - LgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBuKwO5n5z1+Pn19/n19/n2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n2 - +Pn1+Pn19/n1+Pn1+Pn1+Pn19/n1+Pj19/j1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1 - 9/n2+Pn2+Pn1+Pn1+Pn29/n1+Pn2+Pr2+Pn2+Pn19/n29/mgeHRvLwFxLwBwLgBwLwBxLwBwLgBwLwBv - LwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLwBvLwBwLwBwLwBwLgBwLgBwLwBwLgBvLgBvLwBwLgBw - LwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLgBw - LwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBw - LwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLwBv - LgBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBvLwBwLwBwLwBwLwBv - LgBwLwBwLwBwLgBvLwBvLgBwLwBvLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBwLwBwLgBvLgBw - LwBvLwBwLwBvLwBvLwBwLgBwLwBwLgBvLwBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBwLwBwLgBv - LgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw - LwBwLwBvLwBwLgBuKgO4npv2+Pr2+Pn2+Pj2+Pn1+Pj1+Pn2+Pn2+Pj1+Pj1+Pn19/n29/n1+Pj2+Pn1 - +Pj19/n1+Pn19/n1+Pj2+fn1+Pj1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn19/n1+Pn1+Pn19/n2 - +Pn2+Pn2+Pj2+Pn29/n1+Pn1+Pn2+PmgeXRwLgFxLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBv - LwBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLgBwLwBvLwBw - LwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBw - LwBwLwBwLgBwLgBwLwBvLgBwLQBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBvLgBvLwBvLwBw - LwBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLgBvLwBwLwBwLwBv - LwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLgBwLwBvLgBwLwBwLwBw - LwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBw - LgBwLwBvLwBwLgBwLwBvLwBvLwBwLwBvLwBwLwBvLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBx - LgBxLQBwLQBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBw - LwBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBv - LgBwLwBwLgBwLwBvLgBwLwBwLwBwLwBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBu - KgO5n5v2+Pn1+Pj1+Pn2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn1+Pn1+Pn1 - +Pn1+Pn1+Pn1+Pn2+Pj1+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+Pn29/n2 - +Pr1+Pn1+Pn2+PmgeXRwLwFxLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLwBwLwBvLgBv - LgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBvLgBwLwBw - LgBwLwBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBwLgBvLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBw - LwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBw - LwBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLwBwLwBw - LgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLgBwLgBwLgBwLwBwLgBwLwBw - LgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLgBvLwBvLgBwLgBwLgBwLwBwLgBvLwBwLgBvLgBw - LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLABwLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LgBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBv - LwBwLgBvLwBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBuKwO5n5z2+fn19/n1 - +Pn1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+fn2+Pn19/n19/j2+Pj1+Pn2+Pn29/n1+Pn1+Pn19/n2+Pn2+fn1 - +fn1+Pn2+Pj2+fn2+Pn1+Pn1+Pn1+Pn29/n1+fn2+Pn2+Pj2+Pn2+Pr2+Pn2+Pn2+Pr2+Pr1+fn2+Pmh - eXRwLwFxLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLwBwLwBw - LgBwLgBwLgBwLwBvLwBwLwBvLgBwLwBxLwBwLwBwLwBwLwBvLwBwLgBvLgBwLgBwLwBwLwBwLgBwLwBw - LwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBw - LwBwLgBwLwBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLwBwLwBvLgBvLwBwLwBw - LwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLwBw - LgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLQBwLwBwLwBwLwBwLwBv - LwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLwBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABvLgBwLgBvLgBwLwBwLgBwLgBv - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBw - LwBwLwBwLgBvLwBvLwBwLgBvLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBw - LgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBtKwO5oJv2+Pn19/j1+Pn1+Pn2+Pj1+Pj1 - +Pn1+Pj1+Pn29/j1+Pn2+Pj2+Pn1+Pn1+Pn29/n2+Pn1+Pn1+Pj1+Pj2+fn1+Pn1+Pn1+Pj2+Pn2+Pn2 - +Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+fn2+Pn1+fn2+Pn1+Pr2+Pn19/n2+fmgeXRwLwFxLwBwLwBw - LwBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBw - LgBwLwBvLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBv - LgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLwBvLgBwLgBv - LwBwLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBvLwBwLwBwLgBwLwBvLgBwLwBwLwBvLwBwLgBvLgBwLwBv - LwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBw - LwBwLgBwLwBwLgBwLgBvLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBvLwBwLwBwLwBwLgBwLgBvLwBvLgBv - LgBwLwBwLwBvLwBwLwBwLwBvLwBwLgBvLwBvLgBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBv - LgBwLgBwLgBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBw - LgBwLwBwLgBwLwBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBxLwBvLgBwLwBwLgBwLwBw - LgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBuKgO5oJv2+Pr2+Pn1+Pn2+Pn29/r2+Pn1+Pn2+Pn1+Pn1+Pn2 - +Pr1+Pn1+Pn1+Pn1+Pr2+fn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn19/n1 - +Pn1+Pn1+Pn1+Pn2+Pn2+fn1+Pn2+Pr2+Pn1+fn2+Pr2+PmgeXRwLwFxLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLwBvLwBwLgBwLgBw - LgBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBxLwBwLwBvLgBwLgBwLgBw - LwBwLgBwLgBwLwBvLgBwLgBvLwBvLwBwLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBvLwBwLgBwLgBwLgBw - LgBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLwBvLgBwLwBwLgBvLgBvLwBvLgBw - LgBwLwBvLwBvLwBwLwBwLwBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLgBvLgBvLgBwLwBwLgBw - LgBvLwBwLwBwLwBwLwBwLwBvLwBvLwBvLwBwLwBvLgBvLwBwLgBwLgBwLwBvLgBvLQBwLgBwLgBvLgBw - LgBwLgBwLgBwLwBxLwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLQBwLwBwLgBwLgBwLgBwLgBwLwBw - LgBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBvLwBwLwBvLwBwLwBvLwBw - LgBwLwBwLgBwLgBuKgO6n5z2+Pr1+Pr2+Pj2+Pn2+Pr2+Pn2+Pn1+Pn1+Pn1+fn2+Pn1+Pn1+Pn2+Pn1 - +Pn1+Pj1+Pn19/n1+Pj2+Pn1+Pn1+Pj1+Pn1+Pr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pj2+Pj2+Pj1+Pj2 - +Pn2+Pn2+Pn1+fn2+Pn1+Pn2+Pn2+PmfeXRxLwFxMABwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBw - LgBwLgBwLgBwLgBwLwBvLwBvLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBw - LwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBw - LgBwLgBwLgBwLwBwLgBvLgBwLgBvLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBw - LwBvLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLwBxLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBwLwBw - LgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBvLgBvLgBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLwBwLgBv - LwBvLgBwLgBvLgBvLgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBvLwBwLwBwLgBv - LwBwLwBvLgBvLwBwLgBwLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBw - LwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBw - LwBwLwBvLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBu - KgO5n5z2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pj2+Pn1+Pn1+Pn2 - +Pj2+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn1 - +Pn2+Pn1+Pj2+PmgeXRxLgFxLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBvLwBv - LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBw - LwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBvLwBwLgBwLwBwLwBv - LwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBv - LgBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBw - LwBwLwBwLwBwLgBwLgBvLwBvLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLwBwLwBvLwBwLwBvLgBv - LwBwLgBwLwBwLwBvLwBwLgBvLgBwLgBwLgBvLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBvLwBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLgBvLQBwLgBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBw - LwBwLgBwLwBwLwBvLgBvLwBwLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBtKQO5n5v2+Pj2+Pn2 - +Pn1+Pr2+Pn2+Pn1+Pn19/j1+Pn1+Pn29/n1+Pn2+Pj1+Pn2+Pn19/n1+Pj2+Pn2+Pn2+Pj1+Pn1+Pn2 - +Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pr2+Pn1+Pn1+Pr2+Pmh - eXRwLgFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw - LwBvLwBvLgBvLgBwLwBvLgBwLwBwLgBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBvLwBwLwBwLwBwLgBw - LgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwBw - LgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw - LgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBvLgBwLwBwLwBwLwBvLgBwLwBwLwBw - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBvLgBvLwBvLgBvLgBvLwBwLgBwLwBvLwBwLwBwLwBw - LgBvLwBvLwBvLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLwBvLgBwLwBwLwBvLgBvLgBvLgBwLwBvLgBw - LgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBxLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLwBwLwBvLwBvLwBwLgBwLwBvLwBvLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBvLwBw - LgBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvKwO4n5v1+Pn2+Pn1+Pr2+Pn2+Pn1+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1 - +Pn1+Pn2+Pn29/n1+Pj1+Pn1+Pj2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+fn1+Pr2+PmgenRxLwFxLwBwLgBw - LwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBv - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBw - LwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBvLgBwLwBwLgBwLgBvLgBwLgBwLwBw - LgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLwBvLwBvLwBwLwBv - LwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBvLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBvLwBvLwBwLgBvLgBv - LgBwLgBwLwBwLwBwLgBvLgBvLwBwLwBwLwBvLwBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBw - LgBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLQBwLwBwLwBwLwBwLgBvLwBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgByLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBw - LgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBv - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvKgO4n5r1+Pn1+Pn2+fr2+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pj1+Pn1+Pj2+Pn1+Pj1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pr2+fmgenRwLwFxLwBxLgBwLwBwLgBwLgBwLwBw - LwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLwBvLwBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBvLwBvLgBwLgBvLwBwLwBvLgBvLwBw - LgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBvLwBwLwBvLwBwLgBwLgBwLwBwLwBvLgBwLwBwLgBw - LgBwLwBwLgBvLwBwLwBvLgBwLwBwLgBwLwBvLgBvLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBvLwBvLwBvLgBwLgBwLwBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBw - LgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBxLwBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLwBw - LwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBvLwBvLQBw - LwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBwLgBvLwBwLgBvLgBwLwBwLwBw - LwBwLgBwLwBvLgBuKgO3n5v2+fr2+Pn2+Pr2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2 - +Pn2+Pn19/r1+Pn1+fn2+Pn2+Pn2+Pr2+Pn1+Pn1+Pn1+Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+PmgeXRwLgFxLwBwLwBwLwBwLgBvLgBvLwBwLwBwLwBwLgBwLgBw - LwBwLwBwLwBwLgBvLgBwLwBwLwBwLgBvLwBwLwBwLgBvLwBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLwBw - LwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLwBw - LwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBvLwBvLwBvLgBvLgBvLgBv - LwBvLwBwLwBwLgBwLwBwLgBvLgBwLwBvLwBwLgBvLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw - LwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBxLwBwLgBwLgBvLQBwLgBvLgBvLgBwLgBwLwBvLgBvLwBwLwBw - LgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBvLgBvLwBvLgBwLgBv - LgBvLwBwLwBwLwBwLgBvLgBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBx - LwBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBvLgBwLwBvLwBxLwBwLwBwLwBw - LwBwLwBwLgBwLgBvLwBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBt - KgO4n5v2+Pr1+Pn1+fn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1 - +Pn29/n2+Pn2+fn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pn1+Pn2+fmgenRwLgFxLwBwLgBwLgBwLgBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBw - LwBwLgBwLwBwLwBwLgBvLwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBvLwBw - LwBvLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBvLgBvLwBwLwBwLgBvLgBvLwBwLgBvLgBwLwBwLwBw - LgBwLgBwLwBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLgBvLwBvLgBvLgBwLwBwLwBwLwBwLwBvLgBv - LgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLgBwLwBvLwBvLwBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLwBvLwBwLwBwLwBwLgBw - LwBvLgBwLgBvLwBvLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBwLgBw - LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBxLwBwLgBvLgFtKwZtLAZtLAZtLAVtKwVtKwVt - KwZtKwZtLAZtKwVtKwVuKwVtKwVtKwZtKwZtKwZtLAZtKwZtKwZtKwZtKwZtKwZtKwZtKwZtKwZtKwZs - LAZtKwZsKwZtKwVtKwVtKwZtKwZsKwZtKwZsKwZtKwZtKwZsKwZtKwZtKwZtKwZqJwe2n5v2+Pr2+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1 - +Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn2+fme - enVtKwduKwZtKwZtKwZtKwZtKwZtLAZtKwZsKwZtKwZtKwZtKwZtKwZtKwZtKwZtLAZtKwZsKwVtKwZs - KwVtKgZtKwZtKwVtKwVtKwZtKwVtKwVtKwVtKwZtLAVuLAZtKwZtKwZtKwZtKwZsKwVtKwVtKwVtKwZu - KwZtKwZtKwZtKwZtKwZuLARwLwBwLgBwLwBwLgBxLwBwLwBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLwBw - LgBwLwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLwBw - LwBvLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBw - LgBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLgBvLwBwLgBwLwBwLgBvLwBwLwBvLgBwLgBwLwBwLgBwLgBv - LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLwBwLgBwLgBwLgBwLgBwLwByMAF1Nxi4oZi3n5m3oJq2npi2npe1n5e1npi2npi2n5i1npi1 - n5e1npi1npi1n5i3oJm2n5i1oJm3n5m2oJq2n5q2n5m2oJm2n5m2oZm2n5q2npm2n5m2npi2oJm2oJi1 - npi2n5m2oJm1n5m2oJi3n5m2oJq2n5i2oJm2oJm2oJq1oJqznpbX0dD2+Pr29/j2+Pj2+Pn1+Pn2+Pn1 - +Pn1+Pn2+Pn29/n1+Pn1+Pj1+Pn2+Pn19/n2+Pn1+Pn19/n1+Pr1+Pn1+Pn1+Pn1+Pj1+Pn1+Pn2+fn1 - +Pn2+Pj2+Pn1+fn1+Pn2+Pn1+Pj29/n1+Pn2+Pn1+Pn2+Pj2+Pr2+Pn2+fn2+frMwb61n5m1oJm3n5m3 - oJm3oZm3oJq3oJq2n5m2oJm2n5m2n5m1n5m1npm1npm2n5m1npm2n5i1oJi1n5i2oJe1n5m1n5i1npe1 - nZe1npi1npi1oJi1n5i2n5i1npi2n5i1n5m1oJq2n5i1npi2n5e2npe1npi2oJm3oJi2oJm1n5i1oJi3 - oJmgfHNtKQNwLwBwLwBwLwBwLgBwLwBvLwBvLgBvLgBvLwBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBw - LwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLwBvLgBvLgBvLwBwLgBwLgBwLgBvLwBwLwBw - LgBwLgBvLwBvLgBwLwBvLgBvLwBvLgBwLgBwLgBwLgBvLgBvLwBwLwBvLgBvLwBwLgBwLwBwLwBvLwBv - LwBvLgBwLgBwLwBvLgBwLgBwLwBvLwBwLgBvLgBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBvLwBwLgBw - LgBvLgBvLwBvLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBvLwBwLgBvLwBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLwBwLwBwLwF6QCT29vb19/j1+Pn1+Pn19/j19/n19/j19/j19/j29/j19/j2+Pj19/j2+Pn2 - +Pj2+Pn1+Pn19/n2+Pn2+Pn19/j1+Pn19vf19/n2+Pj29/j19/n29/n2+Pn29/n29/j1+Pn1+Pj19/j1 - 9/j19/n2+Pn19/n2+Pn2+Pn19/n19/n19/j29/j2+Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2 - +Pn2+Pn1+Pn1+Pn19/j1+Pn19/n19/n1+Pn2+Pn1+Pj1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1 - 9/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/r3+Pn2+Pn1+Pj29/n2+Pn19/n1+Pn2 - +Pn2+Pn2+fn2+Pj2+Pn1+Pj29/j2+Pn3+Pn29/j2+Pn2+Pn2+Pn2+Pn19/n1+Pn1+Pj2+Pn19/n2+Pn1 - +Pn2+Pn2+Pn2+Pn29/j2+Pn19/n29/n19/n29/n2+Pn2+Pj1+Pj2+Pn2+Pn2+Pn3+frEs61rJwRwLgBw - LgBwLgBvLwBwLwBwLwBvLwBwLwBwLgBvLwBvLgBwLgBvLgBvLwBwLgBvLgBwLgBwLgBwLwBwLwBvLwBw - LgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBvLwBwLgBw - LgBvLgBwLwBvLgBwLwBwLgBwLgBvLgBvLwBwLgBwLgBvLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBw - LwBvLwBwLgBvLgBwLwBvLgBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLwBvLgBwLgBvLwBwLwBw - LgBvLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBvLgBvLgBwLwBwLwBvLwBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBx - MAF6PyP19vb1+Pn29/j1+Pn19/n2+Pn2+fn2+Pr2+Pn2+Pn2+Pn1+Pn2+Pn2+fn2+fn1+Pr2+fr2+fn2 - +Pn2+Pr1+fn2+Pn2+Pr19/n2+Pr2+Pn2+Pn1+fn2+Pr2+Pv3+Pn1+Pr1+fr2+Pn1+fn2+Pr2+fn2+fr2 - +Pr2+Pn1+Pn29/r2+Pj19/n2+Pn2+Pr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n1+Pj1 - +Pn1+Pn1+Pj1+Pj1+Pn2+Pn29/n2+Pn29/n2+fn2+Pn1+Pn1+Pr1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr2 - +Pr1+Pn2+Pn1+Pn1+Pn2+Pn1+fn2+fr19/n29/n2+Pn2+fr2+Pr3+fr2+fr2+Pr2+fr1+fr2+Pr2+Pn2 - +Pr2+Pn2+Pn2+Pr2+Pr29/r2+Pr3+Pr2+fr2+fn2+fr2+Pr2+Pr3+fn3+fr2+Pr2+fr2+Pr2+fr1+fr2 - +fv2+Pr2+Pr2+fr2+Pr2+Pr1+Pn2+Pr2+fr2+fr2+Pr2+Pr2+PrEsaxsJgRwLgBwLgBwLwBwLgBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLgBvLgBwLwBwLwBvLgBvLgBwLgBwLwBvLwBw - LwBvLwBwLwBwLgBvLgBwLgBvLwBvLgBvLwBvLgBwLwBwLgBvLwBvLgBvLgBwLgBwLgBvLgBwLwBvLwBw - LgBwLgBvLwBvLwBvLwBvLgBvLwBwLwBwLwBwLwBvLgBwLgBvLwBwLwBvLgBwLgBwLgBvLwBwLgBvLgBv - LgBwLwBwLgBwLwBwLgBvLgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLwBvLgBwLwBvLwBwLgBv - LgBwLgBvLgBwLgBwLgBwLwBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLgBx - LgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBxMAF6PyL29fb2+Pn1 - 9/n1+Pn29/n1+Pn1+Pr1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1 - +Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/n1 - +Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pr1+Pn1+Pn1+Pn1+Pn2+fn1+Pj19/n1+Pn1+Pj2 - +Pj29/n1+Pn1+Pn1+Pn1+Pn1+Pn2+fn1+Pn1+Pn2+Pn2+fn19/n1+Pj2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2 - +Pn1+Pn2+fr2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn2+Pr2+Pn2+Pn1 - +Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn1+fn2+Pn2+Pn1+Pn19/n2+Pn1+Pr2+Pn2+Pn1+Pn1+Pr1+Pn1+Pn1 - 9/n2+Pn1+fn1+Pn2+Pn2+Pr2+Pn1+Pr2+PrEsatrJgRwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBw - LgBvLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBvLwBvLgBwLwBvLgBvLwBvLgBwLgBvLgBwLwBwLgBw - LgBxLgBwLwBvLgBwLwBwLwBwLwBvLgBwLwBvLgBvLwBvLgBwLwBwLwBvLgBwLwBwLwBvLgBvLwBvLwBw - LwBvLgBvLwBvLgBvLwBwLwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBwLwBwLwBvLwBw - LwBvLgBwLwBwLwBvLgBvLgBwLgBwLwBwLwBvLgBvLgBvLgBvLgBvLgBvLwBvLgBwLgBwLwBwLgBwLgBv - LwBwLwBwLgBvLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxMAF6QCP19vb2+Pj1+Pj1+Pn1+Pj1+Pn1 - +Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1 - +Pj2+Pn1+Pn2+Pn29/n2+Pn1+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pj2+Pn1 - +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj1+Pj2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n19/j2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pr2+Pr2 - +fn2+Pn1+Pr1+Pn19/n2+Pn1+Pn1+Pn1+Pn2+fn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pn2+fn2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn2+fn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pr2+Pn2 - +Pn1+Pn2+Pn1+Pn1+PnEsaxrJgRwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLwBwLwBwLgBwLgBwLwBv - LgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLwBwLgBvLwBvLwBw - LgBwLgBvLgBwLwBwLgBwLwBwLgBvLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLgBvLwBwLgBwLwBw - LwBvLwBwLgBwLwBwLwBwLgBvLgBwLwBvLgBwLwBwLwBvLgBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLgBv - LgBvLwBwLwBwLgBvLgBwLgBvLgBvLwBvLgBvLwBwLwBwLgBwLwBvLwBvLwBwLwBwLwBvLgBwLgBvLwBv - LgBvLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwMAF6PyL19vX1+Pn1+fn1+Pn2+Pn2+Pn1+Pn29/n1+Pn2+Pn1 - +Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn29/n1+fn2+Pn2+fj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1 - 9/n29/n2+Pn2+Pn1+Pn2+Pn1+Pr2+Pn2+Pn19/n1+Pj19/n1+Pn1+Pn1+Pn2+Pn29/j2+Pn2+Pn19/n2 - 9/j2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pj1+Pj2+Pj29/j19/n19/n1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+Pn1 - +Pn2+Pr1+Pn19/n19/n2+Pr1+Pj2+Pn1+Pn2+Pn2+Pn29/n2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+fn1+Pn1 - +Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pr1+Pn3+Pj1+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 - +Pn2+Pn2+Pn1+Pr2+Pn2+fr2+fr1+fr2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pj1+Pr29/n2+Pn1+fn2 - +PnEsaxrJgRwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBw - LwBwLwBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBvLgBvLwBw - LwBvLgBvLwBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLwBvLwBwLgBvLwBw - LgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBv - LgBvLgBwLwBwLgBwLgBwLgBvLwBwLwBwLgBvLwBwLwBwLgBwLgBvLgBvLwBwLwBvLgBwLwBwLwBvLgBw - LwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBxLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBw - LwBwLwBwLgBwLwBwLwF6PyL19/b2+Pn2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+fn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn19/n1+Pj2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2 - +Pn2+Pn1+Pn1+fn1+Pn19/j2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+fn2+Pn1+Pn2+Pn1+Pr2 - +fn2+Pn2+Pn2+Pn2+Pn1+Pj1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+fn2+Pn19/n1+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+fr2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pr1+Pn2+Pr2 - +Pn1+Pn1+Pj2+Pn1+Pn2+Pr1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pr1+Pn2+PnDsaxsJgRwLgBw - LwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBv - LwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLgBvLgBv - LgBwLgBwLwBwLgBvLgBvLgBwLwBvLgBwLgBwLgBvLgBvLwBvLgBvLgBwLgBvLgBwLgBvLwBvLwBwLwBw - LwBvLgBvLgBvLgBwLgBwLgBwLwBvLwBvLgBvLwBvLgBwLgBvLwBwLwBwLgBwLgBvLgBvLgBwLwBvLgBv - LgBwLgBwLwBvLwBvLwBvLwBwLgBvLgBwLgBvLwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - MAF7PyL19vX2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+fn1+Pn19/n1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2 - +Pn1+Pj1+Pn1+Pn1+Pn1+Pj1+Pn19/n19/n1+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn2+Pn2+fr2+Pn2+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1 - +Pn1+Pn1+Pj1+Pn1+Pn1+Pn29/n1+Pn1+fn1+Pn2+Pj1+Pn2+Pn1+Pn1+Pn19/n1+Pn2+fn2+Pn2+Pn1 - +Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+fn2 - +Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pr29/n2+Pn1+Pn2+Pn1+Pn1+Pn2+Pr2+Pn2 - +Pn2+Pr2+Pn29/n2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+PnEsaxrJgRwLgBvLwBwLgBwLgBwLwBv - LgBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLwBvLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LwBwLwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLwBwLgBvLgBvLgBwLgBvLgBv - LgBvLwBvLgBvLgBwLgBwLgBvLgBvLgBvLwBvLgBvLgBvLwBvLgBwLwBwLgBwLgBwLwBvLgBvLwBvLgBw - LgBwLwBvLgBvLgBvLgBwLwBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLwBwLgBwLwBwLwBwLgBw - LgBvLgBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBx - LgBxLgBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBxLwF6PyL29vb2+Pn1 - 9/r1+Pn2+Pn29/j1+Pj2+Pn1+Pn2+Pn1+Pn2+Pn29/r2+Pn2+Pn2+Pr1+Pn19/n2+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pn1+Pn1+Pn19/j2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pr1+Pn1+Pj1+Pn2+Pn2+Pn1+Pn1 - +Pn19/n2+Pn2+Pn2+Pn1+Pj19/n2+Pn1+Pj1+Pn1+Pn2+fj2+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pj2 - +Pn29/j2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr2+Pn1+Pn2+Pn2+Pr2+Pn1+Pn2+Pn29/n2+Pr2+Pn1+Pj1+Pn2 - +Pn2+Pn29/r3+fn1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+fn2+Pn1+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1 - +Pn2+Pn1+Pn2+Pn2+fn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1 - +Pn2+Pn2+fn2+Pn2+Pn1+Pn1+Pn1+Pn2+PnFsa1qJgRwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBw - LwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBvLgBxLwBw - LwBwLwBwLwBwLgBwLwBvLgBwLQBwLgBvLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBw - LwBwLwBwLwBwLgBwLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBvLwBvLwBvLwBwLwBwLgBvLwBwLgBwLwBw - LwBvLwBwLwBwLwBvLwBvLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLgBwLwBvLwBw - LwBwLwBwLgBvLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLwBxLwF5QCL29vb2+Pn2+Pn2+Pn2+Pn2+Pn1 - +Pn2+Pn2+Pn1+Pn2+fr1+Pn2+Pn2+fn1+Pj2+Pj2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+fn1+Pn2+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pj1+Pn2+Pn1+Pn1 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+fn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pj1+Pn2+Pn1+Pn2+Pn2+Pn19/j1+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2 - +fn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+fj2+Pn2+fn2+Pn2+fn1+Pn1+Pn2+fn2+Pn1+Pn2+Pn2+Pn2 - +fn2+Pn2+fr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+fn2+Pn2 - +Pn1+Pn1+Pn2+Pn1+PnEsatrJgRwLwBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBwLwBvLwBwLwBwLwBw - LgBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBw - LwBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBwLgBvLgBwLwBwLgBw - LwBvLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBw - LgBwLwBvLwBvLgBwLwBwLwBvLgBwLwBwLgBwLgBvLwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLgBv - LgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBxLwBxLwBwLgBvLwBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxLwF6QCL29vX1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn19/n2+Pn1+Pn1 - +Pr1+Pn1+Pn2+Pn19/j29/n1+Pn1+Pn2+Pj19/n1+Pn2+fn2+Pn1+Pn2+Pn1+Pn2+fn1+Pn1+Pn19/n2 - +Pn1+fn1+Pn1+Pn1+Pn19/j2+Pr1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+fn2+Pj1+fn1+fn2+Pn1+Pj1 - +Pn2+Pn1+Pn2+Pj2+Pn1+Pn2+Pj1+Pn19/n1+Pn1+Pj29/j2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pr1+Pn2+Pn2+Pn19/n1+Pj1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pn2+Pn3+fr2+Pr2+Pr2 - 9/r2+fn1+Pn2+Pn2+fr2+Pr2+fn1+Pn2+Pn1+Pn2+Pj2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1 - +Pn1+Pr2+Pn2+Pn1+Pn2+Pn1+fn2+Pn19/n1+Pn2+Pr2+fn2+fn1+Pr2+Pn1+fn2+Pr2+Pj2+Pn1+Pn2 - +PnEsaxrJgRwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBwLwBwLwBvLgBvLgBw - LgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBw - LgBvLgBwLwBvLgBvLgBwLgBwLwBvLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBvLgBwLwBwLgBw - LwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBvLgBwLgBw - LwBwLwBwLwBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBvLwBwLwBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwMAByLwF6QCL19vb2+Pn2+Pn1+Pn2+Pn1+Pn29/n2+Pn1+Pr1+Pn2+Pn2+Pr1+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pr1+Pn2+Pr1+Pn2+Pn2+Pj2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1 - +Pn2+Pn1+Pn2+Pn29/n29/n1+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn2+fn1+Pj2+Pn2+Pr1+Pn1 - +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pj29/n2+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn19/n2 - 9/n2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn29/n1+Pn2+Pn2+fn2+Pr2+Pr2+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pr2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+fr3+Pn1+Pr2+fn2+Pn2+Pn1+Pj2+fn2 - +Pn2+Pr2+fr2+Pr1+Pn2+Pn2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pr3+Pr2+Pn2+fnEsaxrJgRvLwBw - LwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBw - LwBwLwBvLwBwLwBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLwBw - LgBwLwBvLwBwLwBwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLwBwLgBv - LwBwLgBwLgBwLgBwLwBvLgBwLwBwLwBvLgBvLwBwLgBwLgBvLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBv - LgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLwBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBx - LwF6QCL19vb2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pr2+Pn2+Pr2+Pn2+Pn2 - +Pn1+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1 - +fn2+fn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pj1+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+fn1+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn2+Pn2+fr2+Pn2+Pn2+fnEsaxsJwRwLgBwLwBwLwBwLgBwLwBw - LwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBw - LwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBvLgBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBw - LgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLwBw - LwBwLgBvLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLwBw - LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBy - LwBvLQBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxMAF6PyP19vb1+Pn1 - +Pn1+Pn1+Pn2+Pn1+Pr2+Pr2+Pn2+Pn2+Pn29/n2+Pn2+Pr1+Pn2+fr2+Pn2+Pn29/n2+Pn2+Pn1+Pn1 - +Pn2+fn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pj2+Pn2+Pj1+Pn29/n2+Pn29/n2+fn1+Pn2+Pn2+Pj1+Pn2+Pn1 - +Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pj1+Pj2+Pn2+fr2+Pj2+Pn2+Pn1+Pn2+Pj1+fn1+Pn1 - +Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pn2+Pr2+Pn2+fn1+Pn2+Pn2+fn2 - +Pn2+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+fr1+Pn2+Pn2+Pn2+Pn2+fn1+Pn2+Pj2+fn2+Pn2+Pn2+Pn2+fn1 - +Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+fr2+fn2+fr2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pr2+fr2+frFsa1rJgRwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLgBv - LwBwLwBwLgBvLwBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLwBwLgBwLwBvLwBwLwBvLwBw - LwBwLgBxLwBwLwBwLwBvLwBwLwBwLwBvLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBw - LwBwLgBwLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBvLwBwLwBwLgBwLwBwLwBwLgBw - LwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBwLwBvLwBxLwBvLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBv - LgBwLwBvLgBwLwBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBxLQBuKwBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwMABxMAF5PyL29vb2+Pn1+Pn1+Pr2+Pn2+Pn2 - +Pn1+Pn1+Pj1+Pn1+Pr2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn1 - 9/n19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn19/n2+Pn1+Pj2+Pn1+Pn2 - +Pn19/n29/n2+Pj2+Pn2+Pn19/n2+fn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn1+Pn2+Pn29/n1 - +Pn2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2 - +Pr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+fn29/n2+Pn2+fn2+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pr1+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pr2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pr2+Pr2+fn2+frFsaxrJgRwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBw - LwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBxLgBwLgBvLwBwLwBv - LgBvLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBvLgBvLwBwLwBwLwBwLwBvLwBvLwBvLwBvLgBwLwBwLwBw - LwBwLgBvLwBvLwBwLwBvLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgBwLwBwLwBw - LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBvLgBw - LwBvLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLQBpJwBwLgBwLgBwLgBwLwBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwF6PyP29vX2+Pn1+Pj19/n2+Pn1+Pn1+Pj2+Pn1+Pj2+Pn1 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn2+Pn1+Pn2+Pn2+Pr29/n2+Pn1+Pj2+Pn1+Pn29/j2 - +Pj2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pn1+Pj2+Pn19/j1+Pj2 - +Pj2+Pn2+Pn1+Pj2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj19/j2+Pn2+Pn2+Pn2+Pj1+Pj1+Pn2+Pn2+Pj1 - +Pn29/n2+Pn2+Pn1+Pj2+Pn19/j1+Pj2+Pn1+Pn1+Pn1+fn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pj1 - +Pn1+Pn29/n2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn1+Pn1+Pn2+fr2+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pn1+Pn2 - +fn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2 - +PnFsaxrJgRwLgBwLwBwLwBxLgBwLwBvLgBwLgBwLgBwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLgBvLgBv - LgBwLwBvLgBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLwBwLwBw - LgBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBwLgBvLgBw - LwBvLwBwLgBwLwBwLgBvLwBvLwBwLwBwLwBvLgBvLwBwLwBwLgBwLwBwLwBvLwBwLgBwLwBvLwBwLgBv - LgBwLwBwLgBwLgBvLwBvLgBvLwBwLwBwLgBvLwBvLwBvLwBvLwBvLgBwLwBwLwBvLgBwLgBwLgBwLgBw - LgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBvLABoJABwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLQBwLgBwLwBxMAF6QCP19vb2+Pr2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pj29/j1+Pn1+fr1+Pn1+Pn2 - +Pn2+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn19/n1+Pn1 - +Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+fn19/n1+Pn2 - +Pj2+Pj19/n2+Pj1+Pn2+Pn1+Pn19/j19/n19/n1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn1+Pn1 - 9/j2+Pn2+fn19/n1+Pn2+Pn1+Pn1+Pr2+Pr1+Pn2+Pn2+Pr2+fn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn1+Pn1 - +Pj1+Pn2+fn1+Pn2+Pn1+fr2+Pn2+fn2+Pn2+fn2+Pn2+Pr1+Pn2+Pn29/n2+Pr2+Pn2+Pn2+Pn29/j1 - +Pj2+fn2+Pn2+Pn2+Pr1+Pn1+Pn2+Pn1+fn1+Pj2+Pr1+fn2+Pn2+Pn2+Pn2+Pr2+fnFsqxrJgRwLgBw - LwBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBv - LwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBvLwBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLgBvLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBvLwBvLgBwLwBw - LwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBvLwBw - LwBvLwBwLgBwLwBwLgBvLwBwLwBvLwBvLwBwLgBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBsKABmIgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBvLgBwLwBw - MAF6PyL29vX2+Pn1+Pn19/n2+Pn1+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn2 - +Pn2+Pn2+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n1+Pn1 - +Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2 - +Pn1+Pn2+Pn2+fn29/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+fn2+Pn2+fn2+fnEsKtrJQRwLwBwLgBwLwBwLwBwLgBw - LwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBvLwBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LgBvLwBwLwBwLgBvLgBwLwBwLwBvLwBwLgBvLwBwLwBvLgBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBw - LgBvLwBvLgBwLgBwLwBwLwBvLgBwLwBwLwBvLgBwLgBwLgBvLwBvLwBwLwBwLwBwLwBwLgBvLwBvLwBw - LgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBvLwBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBw - LgBwLwBwLwBvLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBp - JQBkIABwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxMAF6PyL19/X19/j1 - +Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pj19/n2+Pn1+Pj2+fn2+Pn2+Pn29/n2+Pn1+Pj2+Pn1+Pj3 - +fn1+Pr1+Pj1+Pn2+fn1+Pn2+Pn29/n19/n19/j2+Pn2+Pn1+Pn19/j2+Pn1+Pn19/n19/n1+Pn1+Pn1 - +Pn2+Pj2+fn2+Pn1+Pn2+Pn1+Pj2+Pn1+Pn2+Pn2+Pn2+Pn1+fn2+Pn1+Pj19/n1+Pn2+Pj2+Pj1+Pn1 - +Pn19/n1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn1+Pn1+Pj2+Pn19/n1+Pn2 - +Pn2+Pr2+Pr2+fn2+fn2+Pj1+fj29/n2+Pn29/j1+Pj1+Pn19/j1+Pn1+Pr2+Pn2+Pn1+Pn2+fn2+fr1 - +Pn2+fr2+Pr1+Pn2+fn2+fn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pr29/n1+Pn1+Pn2+Pn2 - +Pn1+Pn2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn2+fnEsKtqJgRwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLgBw - LwBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBw - LgBvLwBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLwBw - LgBwLgBwLwBwLgBwLwBvLgBwLgBvLwBvLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBv - LwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBvLgBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLwBw - LwBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBmIwBnJQZwLQBwLgBv - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxMAF6PyP19vX2+Pn1+Pn19/n2+Pj1+Pn1 - +Pj2+Pn2+Pn1+Pr2+Pn1+Pn2+Pn2+fn29/n2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2 - +Pj1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn29/n2+Pn2+Pn2+fn1+Pn29/n2+Pn2+Pn2+fn2+Pn2+Pn2+Pn19/j2 - 9/n1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn19/n29/n1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2 - +Pj2+Pn19/n1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn29/n2+Pn29/j1+Pn2+Pj1+Pn2+Pn1+Pn2+Pn1 - +Pn29/n2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn1+fn1+fr2+fn2+Pr2+Pn2 - +Pn1+Pn2+Pn2+Pn29/n1+Pn19/j19/n2+Pn2+Pn1+Pj2+Pn2+Pr2+Pr2+Pn2+Pn1+Pn1+Pr1+Pn19/n2 - +Pn1+Pr2+fr2+Pr2+fnEsKprJgRwLwBxLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBw - LgBwLwBwLgBwLgBwLwBwLwBvLwBvLwBxLwBvLgBwLwBwLgBvLwBvLwBvLwBwLwBwLgBwLgBvLwBwLwBw - LgBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBvLwBwLgBvLgBxLgBwLgBvLwBwLgBw - LwBvLgBvLgBvLgBwLwBwLgBwLgBwLwBvLgBwLgBwLwBvLwBwLwBwLgBvLwBwLwBvLgBwLgBwLwBvLwBw - LwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBvLwBvLgBvLwBwLwBwLgBwLgBwLwBwLwBw - LgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBiIQB6QylwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBxLwF7QCT19vb29/n1+Pn1+Pn2+Pj1+Pn1+Pn2+Pn1+Pn1+Pj1 - +Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn29/n2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pn2+Pj2+Pn2 - +Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn29/j2+Pn29/n2+Pj1+Pn2 - +Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n2+Pn2+Pn2+Pj1+Pn19/n2+Pn2+Pn2+fn2 - +Pn1+Pn2+Pn2+fj19/j2+Pj1+Pn2+Pn29/n2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn1+Pn29/n2+Pn2+Pj2 - +Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+fn2+Pr1 - +Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn2+fr2+Pn1+Pn2+Pn2+Pn3 - +PnEsaprJgRwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBwLwBwLgBvLgBwLwBv - LwBwLgBwLgBwLwBwLgBvLgBvLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLwBvLwBvLgBwLwBvLgBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBv - LgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLwBw - LgBwLgBwLwBwLgBvLgBwLwBwLwBvLgBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBmIQKKWkhwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLwBxLwBwLwF6QCP19vX1+Pj29/n1+Pn19/n1+Pn2+fn29/n1+Pn1+Pj1+Pj1+Pj2+Pn2+Pn2 - +Pn2+Pn19/j1+Pn1+Pj1+Pn1+Pn19/n2+Pn1+Pn1+Pj2+Pn29/n1+Pj1+Pn1+Pj2+Pn1+Pj19/n2+Pj1 - +Pn19/j2+Pn19/j19/j1+Pn1+Pj1+Pn1+Pj1+Pn2+fn29/n19/n2+Pj2+Pj2+Pn1+Pn2+Pj1+Pj1+Pn2 - +Pn1+Pn19/n19/n19/n1+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1+Pn29/n29/n29/n1+Pn1 - 9/j2+Pn2+Pj2+Pn19/j1+Pj2+Pn1+Pn2+Pn2+fn1+Pn1+Pn1+Pn19/n1+Pn1+Pj1+Pj2+fn1+Pn2+Pn2 - +Pj1+Pn1+Pj1+Pn2+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+fn1+Pn1+Pn19/n1+Pn1+Pj19/j1 - +Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn19/n1+Pj2+Pn1+Pn2+Pj2+Pn2+Pn1+Pn2+Pn2+PjFsqtsJgRwLgBw - LgBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLwBvLgBvLwBwLgBvLgBwLgBwLgBvLwBvLwBvLwBvLgBwLwBv - LgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBvLwBvLgBwLwBvLwBwLgBvLgBwLwBwLgBw - LgBwLgBwLwBvLwBwLgBxLgBwLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBvLwBwLgBwLwBvLgBw - LgBwLgBwLwBvLgBwLwBvLgBvLgBwLgBvLgBwLgBvLwBwLgBvLgBwLwBvLgBwLwBwLwBvLwBwLgBvLgBv - LwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxNRiZbFxwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBx - LwF5PiP29vb2+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn19/n1 - +Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn2 - +Pn2+Pn2+Pn1+Pn1+Pn29/n2+Pn19/j19/j1+Pn2+Pn2+Pn29/n2+Pn1+Pn2+Pn2+Pn2+Pn19/n2+Pj2 - +Pn29/n1+Pn1+Pn19/n2+Pj2+Pj19/n2+Pn2+Pn2+Pn19/j1+Pn2+Pj1+Pn19/n19/j1+Pn1+Pn1+Pn2 - +Pn2+Pn1+Pj1+Pn1+Pn1+Pj29/n2+Pn2+Pn19/n29/n2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pj2+fn1+Pn29/j2+Pn1+Pn1+Pr1+Pn2+Pn2+Pn1+Pn2+Pn29/j2+Pn1+Pn2+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pr2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+PjFsaxrJgRwLwBwLwBwLwBwLgBwLwBw - LgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBvLgBw - LwBvLwBwLwBwLwBvLgBvLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBw - LwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBvLgBwLwBwLwBwLgBvLgBvLgBvLgBw - LgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLwBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBvLwBw - LgBwLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgCG - Uz6wk4xwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwF5PyL19vb1+Pj1 - +Pn2+Pn2+Pn2+Pn1+Pj19/n1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj2+Pj1+Pn19/n2+Pn1 - 9/j2+Pn1+Pj19/n2+Pn2+Pj1+Pn2+Pn1+Pn1+Pn1+Pj1+Pn29/n1+Pn2+Pn19/j1+Pj2+Pn1+Pn1+Pn1 - +Pn1+Pj2+Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn2+Pn29/j1+Pn1+Pn2+Pn2+Pj1+Pj1 - +Pn2+Pj1+Pj2+Pn19/n2+Pn2+Pj1+Pn2+Pn2+Pj1+Pn2+Pn1+Pj2+Pn19/j29/n2+Pn1+Pn2+fn1+Pj1 - +Pn2+Pn1+Pn2+Pn19/j1+Pj2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn1+Pj2+Pn1+fn1+Pn2+Pn2+Pj2+Pn2+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+fn1+Pn29/n2 - 9/n1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+fjFsa1rJgRwLwBxLwBwLwBwLwBwLwBwLgBwLgBwLgBvLwBw - LgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLwBvLgBv - LgBvLwBwLgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBvLgBvLgBwLwBwLwBwLgBvLwBwLgBvLgBwLwBwLgBw - LwBvLgBwLgBvLgBvLgBvLwBwLgBvLgBvLgBwLwBwLwBwLwBwLwBvLwBvLwBvLgBwLwBvLwBvLwBvLwBv - LgBwLwBwLgBwLwBvLgBwLwBvLwBwLwBwLgBwLwBwLwBvLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBvLQBw - LgBvLgBvLgBvLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBxMACRY1DAqqNtKgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLwF5PyP19vb2+Pn1+Pn29/n1+Pn1+Pn1 - +Pj2+Pn2+Pn2+Pn29/n1+Pn2+Pj19/n1+Pn19/n1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pj2+Pn1+Pn1 - +Pn29/n2+Pn2+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pj1+Pj1+Pn29/j2+fn1+Pn29/n1+Pn29/n1+Pn2+Pn2 - +Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/j19/j2+Pn2+Pn2+fn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj1+Pn2+Pj2 - +Pn1+Pn2+Pn1+Pj1+Pj2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn29/n1+Pn2+Pn19/n1+fn2+Pn1+Pn2+Pn2+fn2 - +Pn2+Pn1+Pn2+Pn2+Pn2+fn29/n2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn2+fn2+Pj19/n2+fn19/n1 - +Pn2+Pn29/n1+Pj19/n2+fn2+fn19/n2+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn1+Pn2 - +Pn1+Pn1+Pn1+Pn1+PnFsa1rJgRwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLwBw - LwBvLgBwLwBvLgBwLwBvLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBvLgBvLgBwLgBwLgBv - LwBwLgBwLwBvLgBwLwBvLgBvLgBvLgBvLwBwMABvLwBwLwBwLgBvLwBwLgBvLgBwLgBvLwBwLgBwLwBv - LwBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLgBv - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLwCohnrg2NdoJQFwLgBwLgBwLwBwLgBwLwBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwF5PiL19vb2+Pn1+Pn1+Pj2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+Pn1+Pj29/j2+Pn2+Pn2+Pr2+Pn2+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn1+Pn2+Pn2+Pn29/j2+Pn2+Pn2+Pn2+Pn1 - +Pn1+Pn2+Pn2+Pn1+Pn1+Pn29/n2+Pn2+Pj2+Pn19/n29/n2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pn19/n19/n1+Pj2+Pn2+Pn19/n19/j29/n2+Pn1+Pn29/j2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn29/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn1+Pn2 - 9/n1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2+Pn2+Pn2+Pn2 - +PnFsa1sJgRwLwBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLwBvLgBwLgBwLgBwLwBvLgBvLgBvLwBwLgBv - LwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLgBvLgBwLwBw - LwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLwBwLgBvLwBwLwBwLwBwLgBwLwBwLwBw - LgBvLwBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLgBvLgBwLwBvLgBwLgBw - LwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLwBvLwBwLgBwLgBwLwBwLgBw - LwBxLgBwLgBwLwBwLgBwLwBwLgBvLAC7opnu6+tzNhpxLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBxLwBwLwF5PyL19vX1+Pj1+Pj1+Pn29/n2+Pn2+Pn19/n1+Pn1+Pn1+Pn2+Pn2+Pj2+Pn1 - +Pn2+Pn1+Pj1+Pn2+Pn2+Pn1+Pj2+Pn1+Pj2+Pj1+Pn1+Pn2+fn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn1 - 9/n2+Pj2+Pn2+Pn2+Pj1+Pn19/j19/j19/j1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj2+Pj2+Pj1+Pn1+fn1+Pn1 - +Pn1+Pj19/n1+Pj2+Pj2+Pn1+Pn19/n1+Pj19/j19/j1+Pj2+Pn2+Pn2+Pn19/j1+Pn1+Pn2+fn1+Pn1 - +Pn1+Pn2+Pn1+Pj19/n1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pn29/n2+Pn2+Pn2+Pj2+Pn2+Pn2+Pj2+Pn2 - +Pn2+Pn2+Pn2+Pn2+fr29/n1+Pn2+fn1+Pn2+Pn1+Pn2+Pn2+fn1+Pn1+Pn1+fn1+Pn2+Pn2+Pj1+Pn2 - +Pn2+Pj29/n1+fn2+Pn1+fn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn1+Pj29/nEsqxrJgRwLwBw - LwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLwBv - LgBvLwBvLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLwBwLgBw - LwBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLgBvLwBwLwBwLgBvLgBvLwBvLgBvLwBvLgBvLgBwLwBwLgBw - LwBvLgBvLwBwLwBvLgBwLgBvLwBwLgBvLwBvLwBvLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBw - LgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLwBvLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBw - LgBwLgBxLgBnJgDXy8jz9faHUz9wLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBx - LwF5PiL19vX1+Pr2+Pj1+Pn19/n1+Pj2+Pn1+Pn1+Pj2+fn2+Pr2+fn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1 - +Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn29/n2+Pr2+Pn2+Pn19/n2+Pn2+Pn2+Pn29/n2+Pj19/n1+Pn1+Pn1 - +fn2+Pn1+Pj19/j1+Pn1+Pn1+Pn2+Pj2+Pr2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pr2 - +Pj19/n2+Pj19/n1+fn1+Pj1+Pj2+Pn2+Pj1+Pn19/n1+Pj2+Pj19/n1+fn1+Pj1+Pn1+Pn19/j1+Pn1 - +Pn29/n2+Pj2+Pn29/j1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pj29/n2+Pn1+Pj3 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn3+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+fn1+Pn2 - +fn2+Pr1+Pn1+Pn1+Pn1+Pn1+fn2+Pn2+Pn1+fn2+Pn2+Pr2+PnEsaxrJgRxLgBwLwBwLgBwLwBxLgBw - LwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBvLgBvLwBvLgBwLgBvLwBvLgBwLwBvLwBwLwBvLgBw - LgBxLgBwLwBvLgBwLgBwLgBwLgBwLwBvLwBvLgBwLwBvLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBw - LgBwLgBwLwBvLgBwLgBvLgBvLwBwLgBvLgBvLgBwLwBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLwBwLwBw - LwBwLwBwLwBvLwBwLgBwLwBxLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv - LgBvLgBwLwBwLgBwLgBvLgBvLgBwLwBvLwBvLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwBuLg3p - 5eXx8/Onhn1wLgBvLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBxLwF6PyL29vX2+Pn1 - +Pn1+Pj2+Pn1+fn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1 - +Pr2+fn2+Pn29/n1+Pn1+Pn2+Pn2+fn3+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1 - 9/n2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn19/n29/n2+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pj2 - +Pn2+Pn3+Pn1+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fr1 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+fr2+Pn2+Pn1+Pn2+Pn2+Pn2 - +Pn2+Pn1+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+PnDsatsJwRxLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBw - LgBwLwBwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLwBwLgBwLgBwLwBwLwBwLgBw - LgBwLgBwLgBvLgBvLgBwLgBwLwBvLwBvLwBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLwBwLwBw - LgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgBw - LgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBvLwBwLgBvLgBvLgBwLwBwLwBvLgBwLwBw - LgBvLwBvLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBxLwCBSjP09fbw8vPPv7xrKgFv - LgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBvLgBwLgBwLwBxMAF6PiL29vX19/n19/j1+Pj2+Pn1+Pn1 - +Pr29/n2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj2+Pn2+fn1+Pn2+Pj1+Pn1 - +Pn2+Pn2+Pn1+Pj1+Pn2+Pj2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pj1+Pn2+Pn2 - +Pn2+Pn1+Pn2+fn1+Pn1+Pn1+Pn19/n1+fn2+Pn19/j2+Pn2+fn1+Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn1 - 9/n2+Pn2+Pn1+Pn2+Pr1+Pn1+Pn2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pj2+Pn2 - +Pn2+Pn1+Pr2+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+fn1+Pn2+Pr2+Pn1+fn2+Pn2+fj2 - +Pn1+Pn2+Pn2+Pj1+fn1+Pn2+Pn2+Pn2+Pn2+fr2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+fn2+fn2 - +Pn2+Pn1+Pj1+Pn2+PnEsaxsJwRwLwBvLwBvLwBwLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBvLgBvLgBv - LgBwLgBvLwBvLgBvLwBwLgBwLwBvLwBwLwBwLwBwLwBvLwBwLwBwLwBvLwBwLgBvLgBvLgBwLwBwLwBw - LgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBvLwBwLgBwLwBwLwBvLwBwLwBvLwBvLgBw - LgBvLwBwLgBwLgBvLgBvLwBwLwBvLgBvLgBwLwBwLwBwLwBvLwBwLgBvLwBwLwBwLwBwLwBwLwBvLgBw - LwBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLwBvLgBvLgBvLgBv - LwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgCje2/x8/Tx8vTt6+ptLxJvLQBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBwLgBxLwBxMAF6PyL19vX2+Pn2+Pn19/j29/n2+Pn1+Pn19/n2+Pn2+Pn2 - +Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pj2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pj1+Pn2+Pn1+Pn29/n2+Pn2 - +Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj29/n2+Pn2+Pn2+Pj2+Pn2+Pn1 - +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pj29/n1+Pn2+Pn2+Pn1+Pj29/n2+fn2+Pn2+Pn2+Pn2+Pn2 - +Pn2+Pj2+Pj1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2+fn2 - +Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2 - +PnEsaxrJgRwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLwBvLwBwLgBvLgBvLgBwLwBwLgBvLgBwLwBvLgBv - LwBvLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLgBv - LgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBvLwBwLwBvLgBwLwBvLwBwLwBwLwBwLwBwLwBv - LgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBvLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBw - LgBvLgBvLwBwLgBwLgBvLwBwLwBwLgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLwBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBuKwDGsa3x8/Tx8/Tz9PaPX09wLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLwBxLwBxMAF6QCL29vX2+Pn1+Pj1+Pj1+Pn1+Pn1+Pn1+Pj2+Pn2+Pj2+Pn2+Pj2+Pn2+Pn1 - +Pj2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2 - +Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn29/j2+Pn2+Pn1+Pn2 - +Pj2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/n2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pj1 - +Pn2+Pn2+Pn1+Pj2+Pj1+Pn1+Pj1+Pn29/n2+Pn2+Pn1+Pn2+Pn2+fn2+Pn2+fn2+Pn2+Pn1+Pn2+Pn3 - +Pn2+fn2+Pn19/n2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pr1+Pn2+Pn2+Pn2+fn1+Pn2 - +Pn1+Pn2+Pn29/n1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+PnEsa1rJwRwLgBw - LwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBw - LwBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBw - LwBwLgBvLgBvLwBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBwLwBwLwBwLwBvLwBwLwBvLwBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLgBwLwBvLwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBw - LgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLwBtLQ7q5+bx8/Tx8vTx8vS9paFuKgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBxLwBx - MAF6PyP19vX19/j19/j1+Pn19/n29/j1+Pn19/j1+Pn2+Pn2+fn19/n19/n2+Pn2+Pj1+Pj1+Pn19/n1 - +Pj2+Pn1+Pj1+Pj1+Pn1+Pn1+Pn2+Pn19/j29/n2+Pj1+Pn19/n1+Pj2+Pn1+Pn2+Pn19/j2+Pn2+Pn1 - 9/n1+Pn1+Pn1+Pn29/n2+Pn1+Pn1+Pj19/n2+Pn2+Pn1+Pn19/j1+Pj2+Pj2+Pn2+Pn19/j19/n29/n1 - 9/n2+Pn19/j19/j1+Pn2+Pn2+Pj19/j2+Pn1+Pj1+Pj29/j1+Pn19/j1+Pn2+Pn1+Pn1+Pj19/n1+Pj1 - +Pn1+Pj1+Pn1+Pj1+Pj2+Pn1+Pn1+Pn2+Pn2+Pj2+fn19/n29/n2+Pn29/n2+Pn2+Pn2+Pn2+Pj2+Pn2 - +fn19/j1+Pn2+Pn2+fn2+Pn2+fn19/n2+Pn1+Pn19/n1+Pn29/j19/n2+Pn2+Pn1+Pn29/j1+Pn1+Pn2 - +fn2+Pn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn19/nFsqxrJgRwLwBwLwBwLwBwLwBwLgBw - LwBvLgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBxLgBwLgBwLwBwLwBv - LgBwLgBwLwBwLwBwLwBvLgBvLgBvLgBwLwBvLwBwLgBvLgBvLwBwLwBvLwBwLwBwLwBwLgBvLwBwLgBw - LwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBw - LgBwLgBwLgBwLgBvLwBwLwBvLgBwLwBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBvLgBvLgBwLwBvLwBw - LwBwLwBwLwBvLgBvLgBwLgBvLwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBxLwCLWkr09vfy - 8/Px8/Ty8/Xv7u5qKgpwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBxMAF6QCT19vX1+Pn1 - +Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/j2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2 - +Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/j1+Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pj2+Pn1+Pn2 - +Pn2+Pn1+Pn2+Pj29/n1+Pn29/j1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2 - +Pn19/j1+Pn2+Pn2+Pj1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/j29/n2+Pj1+Pn1+Pn2 - +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 - +Pr2+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2 - +Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+PnFsaxrJwRwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBw - LgBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLgBvLgBwLgBvLgBwLwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBv - LgBwLwBwLwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLwBwLwBwLgBv - LwBwLwBvLwBvLwBwLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBvLgBvLgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLQC6oJrx8/Xy8vPx8vPx8/Tz9fea - cGFwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxMAF6QCP29vX1+Pj19/j19/j2+Pn2+Pn1 - +Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj2+Pj19/n1+Pj29/j19/n2+Pj1+Pn1+Pj2+Pn2+Pn1+Pn2+Pj1+Pn1 - 9/n19/n1+Pj2+Pn19/n2+Pn2+Pj19/j1+Pn2+Pn2+Pn2+Pr2+Pn2+Pr1+Pn1+fn1+Pn19/n1+Pn2+Pn2 - +Pn1+Pj1+Pn19/n1+Pj2+Pn2+Pn29/n1+Pn19/n2+Pj1+Pn19/j1+Pj1+Pn29/n1+Pn1+Pn2+fn2+Pn1 - +Pj19/j19/n2+Pn1+Pn2+Pn2+Pn1+Pn19/j2+Pj19/n2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2 - +Pj2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn29/n2 - +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fr1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr29/n2 - +Pn2+Pn19/n2+Pn2+PnEsaxrJwRwLwBxLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBw - LgBwLwBwLwBwLgBwLQBwLwBwLwBwLgBvLgBvLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBw - LgBwLgBwLwBwLwBwLgBvLwBxLwBwLgBwLwBwLgBwLwBwLgBvLwBvLgBvLwBvLwBwLgBwLgBvLgBwLwBw - LwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBw - LgBwLwBvLwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBw - LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBpKAnu6+rx8vTx8/Tx8/Px8vPx8/TVxsNqJwFvLgBwLgBw - LgBwLgBxLgBvLgBwLgBwLgBwLgBxLwByMAF6PyT19vX1+Pj19/n1+Pj1+Pn2+Pn1+Pj2+Pn1+Pj1+Pn2 - +Pj2+Pj19/n1+Pn19/n19/j1+Pj1+Pj1+Pn1+Pj19/n1+Pj1+Pj1+Pn1+Pj2+Pn2+Pj1+Pn19/n1+Pj1 - +Pn19/n1+Pn29/j2+Pn1+Pj19/n2+Pn1+Pn19/n1+Pn29/n19/n19/j19/n2+Pj19/n2+Pn19/j1+Pj1 - 9/n29/n19/j19/n2+Pn19/j19/j1+Pj1+Pn2+Pj1+Pj29/j2+Pn1+Pj1+Pn1+Pj1+Pn19/j1+Pn2+Pn1 - +Pn2+Pn2+Pn29/n19/n2+Pn1+Pj2+Pn2+Pn1+Pn19/n2+Pj19/n2+fn1+Pn2+Pn2+Pn2+Pn19/j1+Pn2 - +Pn1+Pn19/j2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj19/j19/n1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn1 - +Pj2+Pn2+Pn29/n2+Pn2+Pn1+Pj2+Pj29/n2+Pn1+Pn1+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pj19/j1+Pn2 - +PnEsKtrJwRwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBvLwBwLwBvLwBwLgBwLgBvLwBv - LwBwLwBwLgBwLgBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBv - LgBwLgBwLwBvLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBw - LwBwLgBwLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBvLwBvLgBwLgBvLgBwLwBwLwBwLgBwLwBwLwBwLgBv - LgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBvLgBwLwBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBxLgBwLgCXbV/y8/Tw8vLx8vTx8/Px8/Py8vPz9PSHVEBxMABwLgBwLgBwLgBwLQBwLgBw - LgBwLgBwLgBxLwBxMAF6QCP19vX2+Pj1+Pn1+Pj2+Pn29/n2+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2 - +Pn2+Pn2+Pj19/n1+Pn1+Pn2+Pj2+Pn1+Pn2+Pn2+Pj2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 - +Pn29/j2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/j29/n2+Pn1+Pn19/n1+Pj2+Pn1+Pn19/j2+Pn2+Pn1+Pn1 - +Pn2+Pn29/n19/j19/n1+Pn2+Pn29/n1+Pn2+fn2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn2+Pj2+Pn1+Pn1 - 9/n2+Pn19/j1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2 - +fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn29/n2+Pn2 - +Pj29/n19/n2+Pj1+Pn29/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn3+PnEsaxrJgRwLwBw - LwBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBw - LgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBw - LwBwLwBwLwBwLgBvLwBvLgBvLwBwLwBwLgBwLwBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBv - LgBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBvLwBwLwBw - LgBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBr - JwLXyMXx8vTx8vLx8vPx8vTx8vTx8vPx8vTFsKptKQFwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLwBx - LwF6QSX29vb2+Pj1+Pj1+Pn19/j19/n19/j19/j1+Pn1+Pj2+Pn29/n19/j2+Pn1+Pj2+Pj1+Pj19/j1 - +Pn1+Pn19/j2+Pj1+Pn29/n1+Pn1+Pn2+Pj1+Pn2+Pj2+Pn2+Pn29/n2+Pn1+Pn2+Pj19/j2+Pn2+Pn1 - +Pn1+Pn1+Pj1+Pj19/n19/n19/n1+Pj1+Pn1+Pn29/n2+Pn19/j19/n1+Pn19/n2+fn1+Pn29/j1+Pn2 - +Pj29/j1+Pj1+Pn1+Pj2+Pn29/n2+Pj1+Pn1+Pj1+Pn19/j1+Pj1+Pj19/n1+Pn1+Pn1+Pn29/n1+Pj2 - +Pn2+fn2+Pn1+Pn1+Pj1+Pn19/n1+Pn1+Pn29/n2+Pn2+Pn2+fn2+Pn19/n2+Pn2+Pn19/n2+Pr2+Pn2 - +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pj1+Pn1+Pn2+Pj2+Pj2+Pn1+Pn1+Pn2+Pj1+Pn1 - 9/n1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj29/n2+Pn2+PjEsaxrJQRxLwBwLgBwLwBwLwBwLwBw - LwBwLgBvLgBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBw - LgBwLwBwLwBwLwBwLgBwLgBvLgBvLgBwLwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBv - LgBvLgBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBw - LgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBxLgCIVULz9PTy8vTy8/Tx - 8/Py8/Px8/Tx8vPx8vTy8/OASjRxLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwByLwF7Qib19vb1+Pn1 - 9/j19/j19/n1+Pj1+Pj19/j2+Pn19/j1+Pn19/n29/n19/j1+Pn19/n1+Pn2+Pj19/n1+Pj2+Pj2+Pn2 - 9/j2+Pn2+Pn2+Pn2+Pn19/n2+Pn19/n1+Pn2+Pj1+Pn29/n2+Pn1+Pn2+Pj1+Pj1+Pj19/n1+Pj1+Pn1 - +Pj1+Pn19/j1+Pj19/j19/j29/n19/j2+Pj19/j1+Pn1+Pj29/n19/j19/n2+Pj1+Pj1+Pj19/n19/n1 - 9/j1+Pn1+Pn1+Pn19/j19/n1+Pn19/j1+Pn2+Pn19/j2+Pn19/n1+Pn19/j1+Pj1+Pn1+Pn19/n1+Pn2 - 9/n2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn29/j1+Pj2+Pj1+Pj2+Pn2+Pn2+Pn1+Pn2+Pj2+Pn1 - +Pn2+Pn2+fn2+Pn2+Pn2+fn1+Pn19/n29/j2+Pn2+Pn19/n2+Pn2+Pn1+Pn19/j1+Pn1+Pn1+Pn2+Pn1 - +Pn2+Pn19/n19/j1+Pn1+Pn19/n19/n2+fnEsa1rJwRwLwBxLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBw - LwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBw - LwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBw - LgBwLgBwLwBwLgBvLwBvLwBwLwBwLgBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLwBxLgBwLwBwLwBv - LwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBv - LwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBsKQPNvLny8/Tx8/Tx8/Tx8/Px8/Tx8vPx8vTx - 8/Ty9PXMu7lpJwFxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwByMAF7Qij29/b0+Pf1+Pf1+Pj2+Pj2+Pn1 - +Pn19/n1+Pn1+Pn1+vn1+fn1+Pj1+fn2+fn2+fn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+fj2+fn1+Pj29/n2 - +Pn2+fj2+Pr1+fn1+Pn1+Pn1+Pj1+Pj2+fn2+fn2+Pn2+fj2+Pn2+fn2+Pj2+Pr2+Pn2+Pn1+Pn2+Pn1 - +Pn2+fj2+Pn2+fn1+fn2+fn2+fj1+Pn2+Pn1+Pn2+Pr2+fn2+Pn2+Pn2+Pj2+Pn2+fn2+Pn2+Pr2+fr2 - +Pr2+fr2+fj2+Pn2+Pr1+Pn1+Pn1+Pn1+Pr2+fn1+Pn1+Pn1+Pn2+Pn2+Pn3+fn2+Pn2+fn2+fr2+fn2 - +Pn3+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pr2+fn1+Pn1+Pj1+Pn2+Pr2+Pn2+fj2+fr3+Pr2 - +Pn1+fn1+fn2+fn2+fn1+fn2+fj2+fn2+Pn3+fn1+fn2+fr2+fn2+Pn2+fn1+fr2+fn2+fn1+fr2+fn2 - +Pr2+fn1+fr2+fr2+fjGs61rJgRwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLwBw - LgBwLwBvLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBw - LgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBw - LgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBw - LgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBwLwBv - LgBwLwBwLwBwLgBwLgBxLgBwLwCKWkj09vfx8/Ty8vPy8vPy8vPx8/Tx8/Tx8/Ty8/Tx8/Pz9fWRY1Nw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwF7Qyvo5OTp5+jp6Ofp5+jp5+fp5+fp5+jp5+fq5+jq5+jp - 5+fp5+jp5+jp5+fp5+jp5+jp6Ojp5+fp6Ojp5+jp5+jq5+fq5+jp5+jq5+jq5+fp5+fp5+fp5+jq5+jq - 5+jp5+fp5+fp5+fp5+jq5+fp5+fp5+fq6Ojq5+jp5+jo5+fp5+fp5+fp5+fp5+jp6Ojp5+jq5+jp5+jp - 5+jp5+jp5+jp5+jq5+jp5+jp5+jq6Ojp5+jp5+fp5+jp5+jp5+jp5+fp5+fp5+jp6Ojp5+fp5+fp5+fp - 5+fp5+fo5+fq5+jp5+jq5+jp5+fp5+fp5+fp5+jp5ufp5+jp5+jp5+jq5+jq5+fq5+fp5+jq5+fo5+fp - 5+fq5+jp5ujq5+fq5+jp5+jp5+jq5+jp5+jq5+jq5+fp5+fp5+fp5+fp5+jp5+jp5+jp5+fo5+jo6Ofp - 5+jp5+fq5+fp5ufp5+fp5+jp5+fp5+jp5+jp5+fp5+fp5+jq5+fp5+jp5+fq5+fq5ujp5+jq5+jo5+jp - 6OfBq6lrKAVxLwBwLwBwLwBwLgBwLwBvLgBvLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLwBvLwBvLgBw - LwBxLgBvLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBxLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLwBw - LgBwLgBwLgBwLgBvLwBvLgBwLwBwLwBwLgBvLgBwLgBvLwBvLwBwLgBwLwBwLwBwLwBwLwBvLwBwLgBv - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBvLgBwLgBw - LgBvLwBwLgBwLwBwLwBwLgBvLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBw - LgBwLwBrKAbb0c/w8/Px8vTy8vTy8/Ty8/Px8/Px8vTy8vTx8vTx8/Tx8vTl3dxwMRRxMABwLgBwLgBw - LgBwLgBwLgBwLwBvLgBtKQFiJAhhIwhhIwhiIwhiIwhhIwhhJAhiJAhhIwhhIwhiIwhiJAhhJAhhJAhi - JAhiJAhhJAhiJAhhJAhhJAhiJAhhJAhiJAhhJAhgJAhhJAhhIwhhJAhhIwhhJAhhJAhiJAhhJAhiJAhh - IwhhJAhhJAhiJAhhJAhhIwhgIwhgIwhiJAhiIwhhIwhiJAhjIwhhJAhiJAhhIwhhJAhiJQhiJAhiJAhi - IwhgJAhhJAhhIwhiIghhIghhIwhhJAhhIwhhJAhhIwhgJAhhJAhhIwhhJAhiJAhhIwhhJAhgIwhhJAhh - IwhiIwhhJAhhIwhgIwhhJAhhIwhhJAhhJAhhJAhiJAhiJAhhIwhhIwhhIwhhIwhhIwhgIwhhJAhhIwhh - JAhhIwhgJAhhJAhhIwhhIwhhJAhfJAhgJAhhIwhhIwhhIwhgIwhgJAhgJAhgIwhgJAhhIwhgJAhhIwhh - IwhhIghhIwhhJAhhIwhgJAhiJAhhJAhhJAhhIwhhIwhhJAhhIwhhIwhgJAhhIwhhJQhmJgVvLQBwLgBw - LwBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBvLgBwLwBwLgBw - LgBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBvLgBvLgBwLgBwLwBwLgBwLwBvLwBw - LwBwLgBwLgBwLgBwLgBwLgBvLwBvLgBwLgBwLwBvLgBwLgBwLgBvLgBwLwBvLwBwLQBwLgBvLgBwLgBw - LgBvLgBwLgBwLgBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBvLgBwLwBwLQBwLgBwLgBwLgBwLgBvKwCng3ny8/Xx - 8vPx8vPy8/Ty8/Py8/Px8vTy8vTx8vPx8vPx8vTx8vPz8/S5oJlsKQJvLwBwLgBwLgBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBxLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBw - LwBwLgBwLwBwLwBvLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBw - LwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw - LwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBv - LwBwLwBwLgBvLwBwLwBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBw - LgBvLgBvLwBvLgBwLgBvLwBvLgBvLgBvLgBwLwBvLwBwLwBwLwBwLgBvLgBvLgBvLwBvLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBwLgBwLwBwLQBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw - LwBwLwBwLwBvLwBvLgBvLgBvLgBwLgBwLgBvLwBwLgBwLgByLgB9RTDv7e/y8/Tx8/Py8/Tx8/Py8vTy - 8/Tx8vTx8vPy8/Tx8/Tx8vTx8vTx8vPz8/SPYlNwLQBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBw - LgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLwBw - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw - LwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBxLwBwLwBwLwBwLwBwLgBvLgBwLwBvLwBwLgBwLwBwLgBwLwBw - LwBwLgBwLwBwLgBxLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLgBw - LwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLwBw - LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBw - LwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBvLgBwLwBw - LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBwLwBvLgBvLwBwLgBwLwBvLgBw - LgBwLgBvLgBwLgBvLwBwLgBvLwBvLwBwLwBvLwBvLwBwLwBwLgBwLgBwLwBvLwBwLwBvLgBwLgBvLgBw - LgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLwBvLwBwLgBvLwBwLwBvLwBwLwBwLgBwLgBwLgBw - LgBwLgBvLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBvLwBwLwBvLgBw - LwBwLgBwLgBwLwBwLwBwLwBwLgBxLwBuLQ3Yzcvy8/Xx8/Tx8/Tx8vPx8/Px8/Px8/Px8/Px8/Tx8/Tx - 8/Px8/Px8/Tx8vPy8/Ts6up3PSVwLQBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLgBx - LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLgBwLwBwLwBwLgBwLQBwLwBwLwBwLwBw - LwBwLgBwLwBwLwBxLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBvLwBwLwBwLgBw - LgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBxLwBwLgBw - LwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw - LwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw - LwBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLwBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLgBw - LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBw - LwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBw - LgBwLgBvLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw - LwBvLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBw - LgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBvLwBwLgBwLwBwLgBvLwBwLgBwLwBw - LwBvLwBwLwBqJwC9pJ7y9PXx8/Tx8/Tx8/Tx8/Tx8vTx8vPx8/Tx8/Ty8vTy8/Tx8vTx8/Ty8vTx8/Tx - 8/Tx8vTc0c1vMRNvLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw - LQBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBvLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw - LgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LwBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLQBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBuKwKkgXbz - 9fby8/Tx8vTx8vTy8/Ty8/Px8vPx8vTx8/Px8vTx8/Tx8/Ty8/Ty8/Px8vTx8/Tx8/Py8/Ty8vTSwb9u - Lw5vLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLQBwLgBwLQBwLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLQBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBuLACVbFvx8fLy8vTx8/Ty8/Tx8/Py - 8/Ty8/Tx8vPx8vTx8vPx8vPy8vPy8/Tx8/Tx8/Ty8/Tx8/Tx8/Tx8vTx8vPy9PXJt7FtLApxLgBwLgBw - LwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLQBvLgBw - LgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBuKwCSZVbx8fDy8vTy8/Tx8/Py8/Ty8/Py8/Tx8/Tx8vTy8vTx - 8vTx8/Px8vTx8/Tx8/Tx8/Px8/Tx8vPx8/Px8/Tx8/Ty8/Xz9PbItrJtLQxxLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLQBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLgBv - LgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBvLQBwLQBwLgBwLgBwLgBw - LgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv - LgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBw - LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBvLgBwLgBsKQCZcGLx8fLy8/Tx8/Tx8/Tx8/Ty8/Px8vPx8vPx8/Tx8/Px8/Px8/Tx8/Tx8/Py8vTx - 8/Ty8/Ty8vTx8/Tx8/Ty8/Tx8/Py8vPx8vTy9PXSw79xNBhyLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBv - LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBw - LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv - LgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBtKgSohXvy - 8/Tx8/Ty8/Ty8/Ty8vTy8/Px8/Tx8vPy8vTx8/Tx8vPx8vTx8vPx8vTx8vPx8vTx8/Py8/Px8/Tx8/Py - 8/Py8/Tx8/Tx8/Tx8/Tx8vTx8/Pz8/OcdWhtKwNwLgBxLwBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBw - LgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBv - LQBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw - LgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBuKgB+STjk2tjz9PXy8/Ty8/Tx8vTy8/Py - 8vPx8vTx8vTx8/Px8/Ty8/Tx8/Tx8/Px8vPx8vPx8vTx8vTx8vTx8/Px8/Ty8/Px8/Px8vTx8/Py8/Tx - 8vPx8vTw8vPx8vPz9PbDrahyMhdwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBxLgBxLgBsLAekgHXw7+7y9PTx8vTy8/Py8/Ty8vTy8/Py8/Py8vPy8/Tx8vTy - 8/Tx8/Tx8vPy8/Tx8vPx8vPx8vPx8/Py8vPx8vPx8vTx8vTx8/Py8/Px8vTx8vTx8vPx8/Tx8vPx8vPx - 8vTy8/Xl4OCSZVVsKANxLgBxLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBxLgBxLgBwLgBw - LgBuKQCASDLRwsDz8/bx8vTx8vPx8/Py8/Tx8/Px8vPx8vPx8/Px8/Px8vPx8/Ty8vTy8vTx8vPx8vPx - 8vPx8vPx8vPx8vPx8vPy8/Tx8/Px8vPx8vPx8vPx8/Ty8/Tx8/Tx8/Tx8/Px8vPx8vTx8vTx8vT08/XM - vLl5QCptKgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv - LQBvLgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLgBwLwBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLQBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvMRa3m5Ty8fHy8/Xx - 8vTx8/Tx8vTy8vPx8vPx8vTy8/Tx8vTy8/Ty8/Px8/Px8/Tx8vPx8/Tx8/Px8vPx8vPx8vPx8vPx8/Tx - 8vPx8vTx8/Px8vPx8vPx8vTx8vPx8vPx8/Px8vTx8vPx8/Tx8vPx8vTx8vPy8/Tz8/Tz9PW7o514Pyht - KQFxLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBxLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw - LgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv - LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBx - LgBwLwBwLgBwLgBwLgBxLgBxLwBwLgBxLQBvKwBzNRqtjobv7evy8/Ty9PTx8vTx8/Py8/Px8/Tx8vPx - 8vPy8/Ty8/Py8vTx8/Px8vPx8/Tx8vTx8vTx8vPx8vPy8vPx8vPx8/Px8vPx8vPx8vPx8vTx8/Px8vTx - 8vPx8/Px8/Px8vTy8/Tx8vTy8vPx8vPy8/Tx8vPx8/Px8vTy8/Ty8/Ty8/Tz8vLBqqWHUkBtKQZvLABw - LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBxLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBxLwBwLgBwLgBwLgBwLgBxLgBwLgBwLgBw - LgBwLwBwLgBqKASASzO5npjv7e3z8/Xx8/Px8vPx8/Py8/Ty8/Px8/Px8/Px8vPx8/Px8vPy8/Tx8/Py - 8/Tx8vTx8/Px8/Px8/Px8/Tx8/Px8/Px8vPx8/Px8vPx8/Tx8vPx8/Px8/Tx8/Py8vTx8/Ty8vPx8/Px - 8vPy8vTx8vPx8vPx8/Tx8vTx8/Ty8vPx8vPx8/Ty8/Ty8/Tz9Pb09fbd0s+kgHR6QCdpJgBvLgBwLwBw - LgBwLgBwLwBwLwBxLwBwLwBxLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw - LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBxLgBwLgBxLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLgBxLgBxLgBwLgBw - LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LgBwLgBwLgBwLgBxLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw - LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLQBwLgBwLgBw - LgBwLwBwLgBwLgBwLgBxLwBwLgBwLwBwLwBwLwBxLwBxLwBwLgBxLwBxLwBwLgBnJgF3PiOgem/Wycbz - 9PTy8/bx8vTx8vTx8/Ty8vTy8/Ty8/Tx8/Tx8vPx8vPy8/Py8/Py8vPx8/Py8vTx8/Tx8vPy8/Tx8vPx - 8/Px8/Px8/Px8vTx8/Px8vPy8vPx8vPx8vPx8/Tx8/Tx8vPx8vPx8vPx8vPx8vPx8vTx8/Px8vTx8vPx - 8vTy8vPx8/Ty8/Tx8/Px8/Px8/Tx8/Ty8/Tx8vTx8/Tz9Pbw8PHZzsmsjoaJWERpKAloJABvLABwLgBw - LgBwLgBxMABxLwBxLwBxLwBxLwBxLwBxLwBxLgBxLgBwLwBwLgBwLgBwLwBwLwBxLgBxLgBxLgBwLgBw - LgBwLgBxLwBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBxLwBwLwBwLgBwLwBw - LgBwLwBwLgBwLgBxLgBwLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBxLgBxLgBwLgBxLgBwLgBwLgBw - LgBxLwBwLgBwLwBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBwLgBxLgBxLwBx - LgBwLwBwLgBwLwBwLwBwLgBwLwBxLgBxLwBwLwBwLwBxLwBxLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw - LgBwLgBwLgBxLgBxLwBwLwBwLgBwLwBwLwBwLgBxLgBxLgBxLwBxLgBxLwBwLgBxLgBwLwBwLgBwLgBw - LgBwLgBxLwBwLwBwLwBwLgBxLgBxLwBxLgBwLgBwLwBwLgBxLgBwLgBwLgBxLwBxLwBxLwBxLgBxLwBx - LwBxLwBxLwBxLgBxLwBxLgBwLwBxLgBwLwBwLwBxLwBxLgBxLwBwLgBwLgBxLwBwLwBxLwBwLgBwLgBw - LwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLwBwLwBwLwBxLwBx - LwBwLwBwLwBwLwBxLgBwLQBxLgBvKwBlIQBsKw+LW0qvkonbzsvv7+/y8/Tx8vTx8/Px8vPx8vPx8vTx - 8/Py8/Ty8/Py8vTx8/Px8vTy8/Px8vPx8vPy8/Tx8/Px8/Ty8/Px8/Tx8vPx8/Px8/Px8/Px8vPx8vPx - 8vPx8vPx8vPx8vPy8/Tx8/Py8/Tx8/Px8vTx8vPx8vPx8/Px8vPx8vTx8/Px8/Px8/Px8vTx8/Tx8vPx - 8vPy8/Py8/Px8/Tx8vTx8vTx8vTx8vPx8vTy8/Xz8/X29/f19fbd1M+/qKSlfnOSZ1d1OiFkHwJgHwBk - IQBpJQBuKwBxLQByLgBxLwByLwByMAByLwBxLwByLwByLwByMABzMABzMAByMAByLwByLwByLwByLwBy - LwBxMAByLwFxLwByLwBxLwBxLwByMAFxMABxLwFxLwBxMAFxLwByMAByLwFyLwByLwByLwBxMABxLwBx - LwByLwBxLwFwLwBxLwBxLwByLwByMAFxLwBxLwByLwBxLwBxLwByLwFyMAByLwByLwByMABxLwBxMAFy - MABxLwByLwBxLwFyMABxMAByLwBxLwBxMAFyMAFxLwFxMABxMABxMAFyMABwLwBxMABxLwBxLwBxMAFx - LwBxMABxLwBxMABxMABxMAByLwByLwFyMAFxLwBxLwBxLwByLwByLwByLwByLwBxLwBxLwBxLwByLwBy - LwBxLwByMAByLwByLwByLwByLwBxLwByMABxMAByMAByLwByMAByLwBxMAByLwFzMAFyMAFyMAByLwBx - LwBxLwByMAByLwByMAByMAByMAByLwBxMAByMAFxMAFyMAByLwFyMAByMAByLwByLwByMAByMAByLwBy - MAFyMAByLwByLwBxLwBxLwFxMAFyMAFyMAFxLwByMAByLwBxMAByMABxLwByMABxMABxMAByLwBxLwBx - LwByMABxLwBxMAByLwByLwFxLwFxMAFwLwBwLgBwLgBxLgByLwBzMABxLQBsKABlIQBhHgBeHQBqKQuC - TziWa1ysjIPEr6rm39r09fT09fby9PXx8vTx8/Tx8vPy8vTx8vTx8/Py8/Ty8vTx8/Tx8/Py8/Tx8/Px - 8vPx8/Tx8vPx8/Px8/Tx8/Py8/Py8vTx8/Px8/Tx8/Px8vTy8/Px8/Px8vPx8/Px8vMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - - - \ No newline at end of file diff --git a/TIASshot/IScam.cs b/TIASshot/IScam.cs deleted file mode 100644 index 67d1d37..0000000 --- a/TIASshot/IScam.cs +++ /dev/null @@ -1,208 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using TIS.Imaging; -using OpenCvSharp; -using OpenCvSharp.Extensions; -using System.Diagnostics; -using System.Drawing; -using System.Threading; -using System.IO; - -namespace TIASshot { - internal class IScam : CameraBase { - ICImagingControl _ic; - VCDRangeProperty _brightness; - VCDRangeProperty _gain; - VCDRangeProperty _exposure; - VCDRangeProperty _gamma; - VCDRangeProperty _whiteBalanceBlue; - VCDRangeProperty _whiteBalanceGreen; - VCDRangeProperty _whiteBalanceRed; - FrameQueueSink _queueSink; - FrameSnapSink _snapSink; - - /// - /// IScamコンストラクタ - /// - /// - /// - public IScam(Form1 form, ICImagingControl ic, string deviceName) : base(form) { - _ic = ic; - DeviceName = deviceName; - } - - /// - /// IScam接続 - /// - /// - public override bool Connect() { - if (!BootCheck()) return false; - - var configFile = $"{DeviceName}.xml"; - if (!File.Exists(configFile)) { - ErrorMsg = $"{configFile}が見つかりません"; - return false; - } - _ic.LoadDeviceStateFromFile(configFile, true); - if (!_ic.DeviceValid) { - ErrorMsg = $"設定ファイル{configFile}の読み込みに失敗しました"; - return false; - } - //if (!_ic.LoadShowSaveDeviceState(configFile)) { - // return false; - //} - _roi = new Rect( - Config.GetInt($"{DeviceName}/ROI/X"), - Config.GetInt($"{DeviceName}/ROI/Y"), - Config.GetInt($"{DeviceName}/ROI/W"), - Config.GetInt($"{DeviceName}/ROI/H")); - - _queueSink = new FrameQueueSink(Retrieve, MediaSubtypes.RGB24, 5); - _snapSink = new FrameSnapSink(MediaSubtypes.RGB24); - _ic.Sink = _queueSink; - DeviceName = _ic.DeviceCurrent.Name; - SetInfo("カメラ型番", DeviceName); - SerialNumber = _ic.DeviceCurrent.GetSerialNumber(); - SetInfo("カメラSN", SerialNumber); - _brightness = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Brightness, VCDGUIDs.VCDElement_Value); - _gain = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Gain, VCDGUIDs.VCDElement_Value); - _exposure = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Exposure, VCDGUIDs.VCDElement_Value); - _gamma = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Gamma, VCDGUIDs.VCDElement_Value); - _whiteBalanceBlue = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceBlue); - _whiteBalanceGreen = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceGreen); - _whiteBalanceRed = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_WhiteBalance, VCDGUIDs.VCDElement_WhiteBalanceRed); - Debug.WriteLine($"Exposure range: {_exposure.RangeMin} to {_exposure.RangeMax} value={_exposure.Value}" ); - Debug.WriteLine($"Gain range: {_gain.RangeMin} to {_gain.RangeMax} value={_gain.Value}"); - Debug.WriteLine($"Brightness range: {_brightness.RangeMin} to {_brightness.RangeMax} value={_brightness.Value}"); - Debug.WriteLine($"Gamma range: {_gamma.RangeMin} to {_gamma.RangeMax} value={_gamma.Value}"); - Debug.WriteLine($"White Balance Blue range: {_whiteBalanceBlue.RangeMin} to {_whiteBalanceBlue.RangeMax} value={_whiteBalanceBlue.Value}"); - Debug.WriteLine($"White Balance Green range: {_whiteBalanceGreen.RangeMin} to {_whiteBalanceGreen.RangeMax} value={_whiteBalanceGreen.Value}"); - Debug.WriteLine($"White Balance Red range: {_whiteBalanceRed.RangeMin} to {_whiteBalanceRed.RangeMax} value={_whiteBalanceRed.Value}"); - - _ic.LiveStart(); - return true; - } - - /// - /// IScam切断 - /// - public override void Disconnect() { - _ic.LiveStop(); - } - - /// - /// フレーム取得処理 - /// - /// - /// - private FrameQueuedResult Retrieve(IFrameQueueBuffer buffer) { - var frameType = buffer.FrameType; - - using (Mat img = Mat.FromPixelData(frameType.Height, frameType.Width, MatType.CV_8UC3, buffer.GetIntPtr())) { - using (Mat imgt_full = img.T()) { - using (var imgt = new Mat(imgt_full, _roi)) { - //_bmps[_bmpIndex] = imgt.ToBitmap(); - //using (Bitmap bmp = imgt.ToBitmap()) { - // _form.ShowImage(bmp); - //} - _form.ShowImage(imgt.ToBitmap()); - - - if (_calibrating > 0) { - var whitePatch = Cv2.Mean(imgt, _chartMasks[12]); - Debug.WriteLine($"White patch R {whitePatch.Val2:.00} G {whitePatch.Val1:.00} B {whitePatch.Val0:.00}"); - if (_calibrating % Config.GetInt("Calib/UpdateInterval") == 0) { - _whiteBalanceBlue.Value = (int)(0.5 + _whiteBalanceBlue.Value * GetRatio((float)whitePatch.Val0, Config.GetFloat("Calib/Reference/B"))); - _whiteBalanceGreen.Value = (int)(0.5 + _whiteBalanceGreen.Value * GetRatio((float)whitePatch.Val1, Config.GetFloat("Calib/Reference/G"))); - _whiteBalanceRed.Value = (int)(0.5 + _whiteBalanceRed.Value * GetRatio((float)whitePatch.Val2, Config.GetFloat("Calib/Reference/R"))); - } - _calibrating--; - if (_calibrating == 0) { - Debug.WriteLine($"White Balance Blue range: {_whiteBalanceBlue.RangeMin} to {_whiteBalanceBlue.RangeMax} value={_whiteBalanceBlue.Value}"); - Debug.WriteLine($"White Balance Green range: {_whiteBalanceGreen.RangeMin} to {_whiteBalanceGreen.RangeMax} value={_whiteBalanceGreen.Value}"); - Debug.WriteLine($"White Balance Red range: {_whiteBalanceRed.RangeMin} to {_whiteBalanceRed.RangeMax} value={_whiteBalanceRed.Value}"); - - CalcTcc(imgt); - - SetInfo("Exposure(ms)", $"{(float)_exposure.Value / 10}"); - SetInfo("Brightness", $"{_brightness.Value}"); - SetInfo("Gamma", $"{_gamma.Value}"); - SetInfo("Gain", $"{_gain.Value}"); - SetInfo("Gain B", $"{_whiteBalanceBlue.Value}"); - SetInfo("Gain G", $"{_whiteBalanceGreen.Value}"); - SetInfo("Gain R", $"{_whiteBalanceRed.Value}"); - SetInfo("画像幅", $"{imgt.Width}"); - SetInfo("画像高さ", $"{imgt.Height}"); - } - } - - if (!_calibrated && _calibrating == 0) { - DetectChart(imgt); - } - } - } - } - //_form.ShowImage(_bmps[_bmpIndex]); - //_bmpIndex = (_bmpIndex + 1) % 2; - //if (_bmps[_bmpIndex] != null) { - // _bmps[_bmpIndex].Dispose(); - // _bmps[_bmpIndex] = null; - //} - - return FrameQueuedResult.ReQueue; - } - - /// - /// 撮影 - /// - /// - /// - protected override void Shot(int numImages = 1, int interval = 0) { - _ic.LiveStop(); - _ic.Sink = _snapSink; - _ic.LiveStart(); - var snapSink = _ic.Sink as FrameSnapSink; - - // 最初のフレームを捨てる - snapSink.SnapSingle(TimeSpan.FromSeconds(5)); - - // 画像をその場で保存してメモリに溜めないようにする - var filename = Config.GetString("File/Info"); - using (var csv = new StreamWriter(Path.Combine(_saveFolder, filename))) { - WriteInfo(csv); - csv.WriteLine("Shot,Time(ms)"); - - var watch = Stopwatch.StartNew(); - for (int i = 0; i < numImages; i++) { - var shotTime = watch.ElapsedMilliseconds; - csv.WriteLine($"{i+1},{shotTime}"); - _form.ShowMessage($"撮影 {i + 1} / {numImages} 枚目"); - - var buffer = snapSink.SnapSingle(TimeSpan.FromSeconds(5)); - using (Mat img = Mat.FromPixelData(buffer.FrameType.Height, buffer.FrameType.Width, MatType.CV_8UC3, buffer.GetIntPtr())) { - using (Mat imgt_full = img.T()) { - using (Mat imgt = new Mat(imgt_full, _roi)) { - // 即座に保存しメモリに保持しない - SaveImages(imgt, i); - } - } - } - - while (watch.ElapsedMilliseconds < interval * (i+1) && i < numImages - 1) { - Thread.Sleep(1); - } - } - } - - _ic.LiveStop(); - _ic.Sink = _queueSink; - _ic.LiveStart(); - // 撮影と保存が完了したため、撮影ボタンを再有効化 - _form.EnableShots(true); - } - } -} diff --git a/TIASshot/Lucam.cs b/TIASshot/Lucam.cs deleted file mode 100644 index 517a409..0000000 --- a/TIASshot/Lucam.cs +++ /dev/null @@ -1,309 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using Lumenera.USB; -using OpenCvSharp; -using OpenCvSharp.Extensions; -using System.Drawing; -using System.Windows.Interop; -using System.Threading; -using OpenCvSharp.Aruco; -using System.Windows.Media.Animation; -using System.Configuration; -using System.Web.ModelBinding; -using System.Windows.Controls; -using System.IO; -using static System.Resources.ResXFileRef; -using System.Windows.Shapes; -using Path = System.IO.Path; -using OpenCvSharp.Dnn; - -namespace TIASshot { - - /// - /// Lumeneraカメラクラス - /// - internal class Lucam : CameraBase { - - // 光源の輝度設定 - // 連続撮影のマルチスレッド化 - // GUI更新はタイマー使用に変更 - - IntPtr _hCam = IntPtr.Zero; - PictureBox _picPreview; - - dll.LucamSnapshot _snap; - dll.LucamConversion _convert; - dll.LucamRgbPreviewCallback _callbackHandler; - int _callbackId; - - /// - /// コンストラクタ - /// - /// - /// - public Lucam(Form1 form, PictureBox preview) : base(form) { - _picPreview = preview; - - // カメラパラメータの初期値 - _snap.BufferLastFrame = false; - _snap.Exposure = Config.GetFloat("Lucam/Exposure"); - _snap.ExposureDelay = 0; - _snap.flReserved1 = 0; - _snap.flReserved2 = 0; - _snap.Format.BinningX = 1; - _snap.Format.BinningY = 1; - _snap.Format.FlagsX = 0; - _snap.Format.FlagsY = 0; - _snap.Format.Height = 1024; - _snap.Format.PixelFormat = dll.LucamPixelFormat.PF_8; - _snap.Format.SubSampleX = 1; - _snap.Format.SubSampleY = 1; - _snap.Format.Width = 1280; - _snap.Format.X = 0; - _snap.Format.Y = 0; - _snap.Gain = Config.GetFloat("Lucam/Gain"); - _snap.GainBlue = Config.GetFloat("Lucam/GainB"); - _snap.GainGrn1 = Config.GetFloat("Lucam/GainG"); - _snap.GainGrn2 = _snap.GainGrn1; - _snap.GainRed = Config.GetFloat("Lucam/GainR"); - _snap.ShutterType = dll.LucamShutterType.GlobalShutter; - _snap.StrobeDelay = 0.1f; - _snap.StrobeFlags = 0; - _snap.Timeout = 5000; - _snap.ulReserved2 = 0; - _snap.UseHwTrigger = false; - - _convert.DemosaicMethod = dll.LucamDemosaicMethod.HIGH_QUALITY; - _convert.CorrectionMatrix = dll.LucamCorrectionMatrix.LED; - } - - /// - /// カメラ接続 - /// - /// - public override bool Connect() { - if (!BootCheck()) return false; - - int numCam = 0; - try { - numCam = dll.LucamNumCameras(); - } catch (Exception ex) { - ErrorMsg = ex.Message; - return false; - } - if ( numCam < 1 ) { - ErrorMsg = "Lucamが見つかりません"; - return false; - } - if (numCam > 1) { - ErrorMsg = "複数のLucamが見つかりました.\r\n正しいカメラを1つ接続してください."; - return false; - } - - // カメラのデバイス情報取得 - var lumVersion = new dll.LucamVersion[numCam]; - lumVersion = api.EnumCameras(); - var id = 0; - if (lumVersion[id].CameraId == 0x49f) DeviceName = "Lw110"; - SetInfo("カメラ型番", DeviceName); - SerialNumber = lumVersion[id].SerialNumber.ToString(); - SetInfo("カメラSN", SerialNumber); - - // カメラを開く - _hCam = api.CameraOpen(1); - if (_hCam == IntPtr.Zero) { - ErrorMsg = "カメラの接続に失敗しました.\r\n他のアプリケーションでカメラを使用していないか確認してください."; - return false; - } - - // プレビューコールバックの登録 - _callbackHandler = new dll.LucamRgbPreviewCallback(PreviewCallback); - _callbackId = dll.LucamAddRgbPreviewCallback(_hCam, _callbackHandler, IntPtr.Zero, dll.LucamPixelFormat.PF_24); - if (_callbackId == -1) { - ErrorMsg = "コールバックの登録に失敗しました"; - return false; - } - - SetCameraParam(); // カメラパラメータの設定 - - StartStopPreview(); // プレビュー開始 - - return true; - } - - /// - /// プレビュー開始・停止 - /// - /// - public bool StartStopPreview() { - if (_isPreview) { - // プレビュー停止 - var ret = dll.LucamStreamVideoControl(_hCam, dll.LucamStreamMode.STOP_STREAMING, _picPreview.Handle.ToInt32()); - Debug.WriteLine("プレビュー停止"); - if (!ret) return false; - _isPreview = false; - return true; - } else { - // プレビュー開始 - var ret = dll.LucamStreamVideoControl(_hCam, dll.LucamStreamMode.START_DISPLAY, _picPreview.Handle.ToInt32()); - if (!ret) return false; - _isPreview = true; - return true; - } - } - - /// - /// プレビューコールバック - /// - /// - /// データポインタ - /// データサイズ - /// - void PreviewCallback(IntPtr pContext, IntPtr pData, int n, uint unused) { - using (Mat img = Mat.FromPixelData(_snap.Format.Height, _snap.Format.Width, MatType.CV_8UC3, pData)) { - using (Mat imgt = img.T()) { - _bmps[_bmpIndex] = imgt.ToBitmap(); - - if (_calibrating > 0) { - var whitePatch = Cv2.Mean(imgt, _chartMasks[12]); - Debug.WriteLine($"White patch R {whitePatch.Val2:.00} G {whitePatch.Val1:.00} B {whitePatch.Val0:.00}"); - if (_calibrating % Config.GetInt("Calib/UpdateInterval") == 0) { - _snap.GainBlue *= GetRatio((float)whitePatch.Val0, Config.GetFloat("Calib/Reference/B")); - _snap.GainGrn1 *= GetRatio((float)whitePatch.Val1, Config.GetFloat("Calib/Reference/G")); - _snap.GainGrn2 = _snap.GainGrn1; - _snap.GainRed *= GetRatio((float)whitePatch.Val2, Config.GetFloat("Calib/Reference/R")); - SetCameraParam(); - } - _calibrating--; - if (_calibrating == 0) { - Debug.WriteLine($"Gain Blue : {_snap.GainBlue}"); - Debug.WriteLine($"Gain Green: {_snap.GainGrn1}"); - Debug.WriteLine($"Gain Red : {_snap.GainRed}"); - - CalcTcc(imgt); - - SetInfo("Exposure(ms)", $"{_snap.Exposure}"); - SetInfo("Gain", $"{_snap.Gain}"); - SetInfo("Gain B", $"{_snap.GainBlue}"); - SetInfo("Gain G", $"{_snap.GainGrn1}"); - SetInfo("Gain R", $"{_snap.GainRed}"); - SetInfo("画像幅", $"{imgt.Width}"); - SetInfo("画像高さ", $"{imgt.Height}"); - } - } - - if (!_calibrated && _calibrating == 0) { - DetectChart(imgt); - } - } - } - _form.ShowImage(_bmps[_bmpIndex]); - _bmpIndex = (_bmpIndex + 1) % 2; - if (_bmps[_bmpIndex] != null) _bmps[_bmpIndex].Dispose(); - } - - /// - /// 撮影 - /// - /// - /// - protected override void Shot(int numImages=1, int interval=0) { - SetSnapParam(); - - _shots.Clear(); - var thread = new Thread(() => SaveThread(numImages)); - thread.Start(); - - dll.LucamEnableFastFrames(_hCam, ref _snap); - var imageSize = _snap.Format.Width * _snap.Format.Height; - var rawImage = new byte[imageSize]; - var rgbImage = new byte[imageSize * 3]; - - var filename = Config.GetString("File/Info"); - using (var csv = new StreamWriter(Path.Combine(_saveFolder, filename))) { - WriteInfo(csv); - csv.WriteLine("Shot,Time(ms)"); - - var watch = Stopwatch.StartNew(); - for (var i = 0; i < numImages; i++) { - var shotTime = watch.ElapsedMilliseconds; - csv.WriteLine($"{i + 1},{shotTime}"); - _form.ShowMessage($"撮影 {i + 1} / {numImages} 枚目"); - var ret = dll.LucamTakeFastFrame(_hCam, rawImage); - //Debug.WriteLine(ret); - - dll.LucamConvertFrameToRgb24(_hCam, rgbImage, rawImage, - _snap.Format.Width, _snap.Format.Height, dll.LucamPixelFormat.PF_8, ref _convert); - using (Mat img = Mat.FromPixelData(_snap.Format.Height, _snap.Format.Width, MatType.CV_8UC3, rgbImage)) { - _shots.Add(img.T()); - } - while (watch.ElapsedMilliseconds < interval * (i + 1) && i < numImages - 1) { - Thread.Sleep(1); - } - } - } - - rgbImage = null; - rawImage = null; - - dll.LucamDisableFastFrames(_hCam); - } - - /// - /// 校正 露光時間とホワイトバランスの自動調整 - /// - public void Calibration() { - Debug.WriteLine("校正前"); - SetSnapParam(); - _calibrating = 30; - } - - /// - /// 撮影パラメータの設定 - /// - private void SetSnapParam() { - dll.LucamPropertyFlag flag; - dll.LucamGetProperty(_hCam, dll.LucamProperty.EXPOSURE, out _snap.Exposure, out flag); - dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN, out _snap.Gain, out flag); - dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_BLUE, out _snap.GainBlue, out flag); - dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_GREEN1, out _snap.GainGrn1, out flag); - dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_GREEN2, out _snap.GainGrn2, out flag); - dll.LucamGetProperty(_hCam, dll.LucamProperty.GAIN_RED, out _snap.GainRed, out flag); - Debug.WriteLine($"SetSnapParam Exp {_snap.Exposure} Gain {_snap.Gain} GainBlue {_snap.GainBlue} GainGrn1 {_snap.GainGrn1} GainGrn2 {_snap.GainGrn2} GainRed {_snap.GainRed}"); - } - - /// - /// カメラパラメータの設定 - /// - private void SetCameraParam() { - var flag = dll.LucamPropertyFlag.NONE; - dll.LucamSetProperty(_hCam, dll.LucamProperty.EXPOSURE, _snap.Exposure, flag); - dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN, _snap.Gain, flag); - dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_BLUE, _snap.GainBlue, flag); - dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_GREEN1, _snap.GainGrn1, flag); - dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_GREEN2, _snap.GainGrn2, flag); - dll.LucamSetProperty(_hCam, dll.LucamProperty.GAIN_RED, _snap.GainRed, flag); - Debug.WriteLine($"SetCameraParam Exp {_snap.Exposure} Gain {_snap.Gain} GainBlue {_snap.GainBlue} GainGrn1 {_snap.GainGrn1} GainGrn2 {_snap.GainGrn2} GainRed {_snap.GainRed}"); - } - - - /// - /// カメラ切断 - /// - public override void Disconnect() { - if (_hCam != IntPtr.Zero) { - if (_isPreview) { - StartStopPreview(); - } - api.CameraClose(_hCam); - _hCam = IntPtr.Zero; - Debug.WriteLine("カメラ切断"); - } - } - } -} diff --git a/TIASshot/PreviewMonitor.Designer.cs b/TIASshot/PreviewMonitor.Designer.cs deleted file mode 100644 index 34280e8..0000000 --- a/TIASshot/PreviewMonitor.Designer.cs +++ /dev/null @@ -1,146 +0,0 @@ -namespace TIASshot { - partial class PreviewMonitor { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() { - this.picPreview = new System.Windows.Forms.PictureBox(); - this.label1 = new System.Windows.Forms.Label(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.picPreview)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // picPreview - // - this.picPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.picPreview.Location = new System.Drawing.Point(617, 0); - this.picPreview.Name = "picPreview"; - this.picPreview.Size = new System.Drawing.Size(662, 800); - this.picPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.picPreview.TabIndex = 0; - this.picPreview.TabStop = false; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("BIZ UDPゴシック", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label1.Location = new System.Drawing.Point(78, 326); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(435, 144); - this.label1.TabIndex = 1; - this.label1.Text = "口を大きく開いて\r\n\r\n舌を出してください"; - // - // pictureBox1 - // - this.pictureBox1.Image = global::TIASshot.Properties.Resources.アイコン; - this.pictureBox1.Location = new System.Drawing.Point(12, 72); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(133, 132); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBox1.TabIndex = 2; - this.pictureBox1.TabStop = false; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("BIZ UDPゴシック", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label2.Location = new System.Drawing.Point(169, 72); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(397, 24); - this.label2.TabIndex = 3; - this.label2.Text = "千葉大学フロンティア医工学センター"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("BIZ UDPゴシック", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label3.Location = new System.Drawing.Point(166, 137); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(445, 37); - this.label3.TabIndex = 3; - this.label3.Text = "舌撮影解析システム TIAS"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("BIZ UDPゴシック", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); - this.label4.Location = new System.Drawing.Point(261, 185); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(345, 19); - this.label4.TabIndex = 4; - this.label4.Text = "Tongue Image Analyzing System"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Segoe UI", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.Location = new System.Drawing.Point(26, 538); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(580, 130); - this.label5.TabIndex = 5; - this.label5.Text = "Open your mouth wide \r\nand stick out your tongue."; - // - // PreviewMonitor - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1280, 800); - this.ControlBox = false; - this.Controls.Add(this.label5); - this.Controls.Add(this.label4); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.label1); - this.Controls.Add(this.picPreview); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; - this.Name = "PreviewMonitor"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.Text = "PreviewMonitor"; - this.Load += new System.EventHandler(this.PreviewMonitor_Load); - this.Paint += new System.Windows.Forms.PaintEventHandler(this.PreviewMonitor_Paint); - ((System.ComponentModel.ISupportInitialize)(this.picPreview)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.PictureBox picPreview; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label5; - } -} \ No newline at end of file diff --git a/TIASshot/PreviewMonitor.cs b/TIASshot/PreviewMonitor.cs deleted file mode 100644 index 2abdcff..0000000 --- a/TIASshot/PreviewMonitor.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace TIASshot { - public partial class PreviewMonitor : Form { - private Point _location; - private Size _size = new Size(0, 0); - private Bitmap _dispBuf; - private bool _isUpdateBuf = false; - - public bool IsShown => (_size.Width > 0); - - /// - /// プレビューウィンドウのコンストラクタ - /// - public PreviewMonitor() { - InitializeComponent(); - - // プレビューウィンドウの位置とサイズを取得 - foreach (var scr in Screen.AllScreens) { - if (scr.Primary) continue; // プライマリスクリーンは除外 - if (scr.Bounds.Width <= Config.GetInt("Shot/PreviewMonitorWidth")) { - _location = scr.Bounds.Location; - _size = scr.Bounds.Size; - } - } - } - - /// - /// プレビューウィンドウのロードイベント - /// - /// - /// - private void PreviewMonitor_Load(object sender, EventArgs e) { - // プレビューウィンドウの位置とサイズを設定 - Location = _location; - Size = _size; - } - - /// - /// プレビューウィンドウの表示状態を更新 - /// - /// - public void UpdateImage(Bitmap image) { - _dispBuf = image; - _isUpdateBuf = true; - Invalidate(); - } - - /// - /// プレビューウィンドウの再描画イベント - /// - /// - private void PreviewMonitor_Paint(object sender, PaintEventArgs e) { - if (!IsShown || !_isUpdateBuf || _dispBuf == null) return; - - picPreview.Image?.Dispose(); - picPreview.Image = _dispBuf; - _isUpdateBuf = false; - } - } -} diff --git a/TIASshot/PreviewMonitor.resx b/TIASshot/PreviewMonitor.resx deleted file mode 100644 index 1af7de1..0000000 --- a/TIASshot/PreviewMonitor.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/TIASshot/Properties/AssemblyInfo.cs b/TIASshot/Properties/AssemblyInfo.cs index de9601b..308d4a7 100644 --- a/TIASshot/Properties/AssemblyInfo.cs +++ b/TIASshot/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +[assembly: InternalsVisibleTo("TIASshot.Tests")] // アセンブリに関する一般的な情報は、次の方法で制御されます // 制御されます。アセンブリに関連付けられている情報を変更するには、 @@ -29,5 +30,5 @@ // ビルド番号 // リビジョン // -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] diff --git a/TIASshot/TIASshot.csproj b/TIASshot/TIASshot.csproj index 25734a4..3aae01d 100644 --- a/TIASshot/TIASshot.csproj +++ b/TIASshot/TIASshot.csproj @@ -1,4 +1,4 @@ - + @@ -22,7 +22,7 @@ full false bin\Debug\ - DEBUG;TRACE + DEBUG;TRACE;WHITEBOARD;MEMMONITOR prompt 4 true @@ -40,7 +40,7 @@ true bin\x64\Debug\ - DEBUG;TRACE + DEBUG;TRACE;WHITEBOARD;MEMMONITOR full x64 7.3 @@ -110,6 +110,7 @@ + False @@ -118,29 +119,49 @@ - + + + + - + + + + Form - + Form1.cs - - - - + + Form1.cs + + + Form1.cs + + Form - + + MemoryMonitorForm.cs + + + + + + + + Form + + PreviewMonitor.cs - + Form1.cs - + PreviewMonitor.cs diff --git a/TIASshot/UI/Form1.Designer.cs b/TIASshot/UI/Form1.Designer.cs new file mode 100644 index 0000000..cbe6996 --- /dev/null +++ b/TIASshot/UI/Form1.Designer.cs @@ -0,0 +1,371 @@ +namespace TIASshot { + partial class Form1 { + /// + /// 必要なデザイナー変数です。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 使用中のリソースをすべてクリーンアップします。 + /// + /// マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。 + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows フォーム デザイナーで生成されたコード + + /// + /// デザイナー サポートに必要なメソッドです。このメソッドの内容を + /// コード エディターで変更しないでください。 + /// + private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.btnShotOne = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.txtDeviceName = new System.Windows.Forms.TextBox(); + this.txtSerialNo = new System.Windows.Forms.TextBox(); + this.picPreview = new System.Windows.Forms.PictureBox(); + this.picDisplay = new System.Windows.Forms.PictureBox(); + this.btnShotMulti = new System.Windows.Forms.Button(); + this.txtMessage = new System.Windows.Forms.TextBox(); + this.txtSaveFolder = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txtDataName = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.txtNumMultiShots = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.txtMultiShotsInterval = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.btnOpenDataFolder = new System.Windows.Forms.Button(); + this.btnLightSW = new System.Windows.Forms.Button(); + this.icImagingControl1 = new TIS.Imaging.ICImagingControl(); + this.txtConvElemNum = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.picPreview)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDisplay)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.icImagingControl1)).BeginInit(); + this.SuspendLayout(); + // + // btnShotOne + // + this.btnShotOne.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.btnShotOne.Location = new System.Drawing.Point(15, 176); + this.btnShotOne.Name = "btnShotOne"; + this.btnShotOne.Size = new System.Drawing.Size(268, 47); + this.btnShotOne.TabIndex = 0; + this.btnShotOne.Text = "1枚撮影"; + this.btnShotOne.UseVisualStyleBackColor = true; + this.btnShotOne.Click += new System.EventHandler(this.btnShot1_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(40, 16); + this.label1.TabIndex = 1; + this.label1.Text = "カメラ"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label2.Location = new System.Drawing.Point(157, 9); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(35, 16); + this.label2.TabIndex = 1; + this.label2.Text = "S/N"; + // + // txtDeviceName + // + this.txtDeviceName.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtDeviceName.Location = new System.Drawing.Point(51, 6); + this.txtDeviceName.Name = "txtDeviceName"; + this.txtDeviceName.ReadOnly = true; + this.txtDeviceName.Size = new System.Drawing.Size(106, 23); + this.txtDeviceName.TabIndex = 2; + // + // txtSerialNo + // + this.txtSerialNo.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtSerialNo.Location = new System.Drawing.Point(192, 6); + this.txtSerialNo.Name = "txtSerialNo"; + this.txtSerialNo.ReadOnly = true; + this.txtSerialNo.Size = new System.Drawing.Size(94, 23); + this.txtSerialNo.TabIndex = 3; + // + // picPreview + // + this.picPreview.Location = new System.Drawing.Point(12, 565); + this.picPreview.Name = "picPreview"; + this.picPreview.Size = new System.Drawing.Size(79, 57); + this.picPreview.TabIndex = 4; + this.picPreview.TabStop = false; + this.picPreview.Visible = false; + // + // picDisplay + // + this.picDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.picDisplay.Location = new System.Drawing.Point(292, 6); + this.picDisplay.Name = "picDisplay"; + this.picDisplay.Size = new System.Drawing.Size(449, 610); + this.picDisplay.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picDisplay.TabIndex = 5; + this.picDisplay.TabStop = false; + // + // btnShotMulti + // + this.btnShotMulti.AllowDrop = true; + this.btnShotMulti.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.btnShotMulti.Location = new System.Drawing.Point(15, 316); + this.btnShotMulti.Name = "btnShotMulti"; + this.btnShotMulti.Size = new System.Drawing.Size(268, 49); + this.btnShotMulti.TabIndex = 6; + this.btnShotMulti.Text = "連続撮影"; + this.btnShotMulti.UseVisualStyleBackColor = true; + this.btnShotMulti.Click += new System.EventHandler(this.btnShotMulti_Click); + // + // txtMessage + // + this.txtMessage.BackColor = System.Drawing.Color.LemonChiffon; + this.txtMessage.Font = new System.Drawing.Font("MS UI Gothic", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtMessage.Location = new System.Drawing.Point(15, 45); + this.txtMessage.Name = "txtMessage"; + this.txtMessage.ReadOnly = true; + this.txtMessage.Size = new System.Drawing.Size(268, 26); + this.txtMessage.TabIndex = 9; + this.txtMessage.Text = "舌診チャートを設置してください."; + // + // txtSaveFolder + // + this.txtSaveFolder.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtSaveFolder.Location = new System.Drawing.Point(78, 418); + this.txtSaveFolder.Name = "txtSaveFolder"; + this.txtSaveFolder.ReadOnly = true; + this.txtSaveFolder.Size = new System.Drawing.Size(205, 23); + this.txtSaveFolder.TabIndex = 10; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label3.Location = new System.Drawing.Point(12, 395); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(123, 16); + this.label3.TabIndex = 11; + this.label3.Text = "データ保存フォルダ"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label4.Location = new System.Drawing.Point(12, 95); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(60, 16); + this.label4.TabIndex = 12; + this.label4.Text = "データ名"; + // + // txtDataName + // + this.txtDataName.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtDataName.Location = new System.Drawing.Point(15, 114); + this.txtDataName.Name = "txtDataName"; + this.txtDataName.Size = new System.Drawing.Size(268, 23); + this.txtDataName.TabIndex = 13; + this.txtDataName.Text = "なし"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label5.Location = new System.Drawing.Point(12, 261); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(103, 16); + this.label5.TabIndex = 14; + this.label5.Text = "連続撮影枚数"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label6.Location = new System.Drawing.Point(12, 290); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(71, 16); + this.label6.TabIndex = 15; + this.label6.Text = "撮影間隔"; + // + // txtNumMultiShots + // + this.txtNumMultiShots.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtNumMultiShots.Location = new System.Drawing.Point(121, 258); + this.txtNumMultiShots.Name = "txtNumMultiShots"; + this.txtNumMultiShots.Size = new System.Drawing.Size(67, 23); + this.txtNumMultiShots.TabIndex = 16; + this.txtNumMultiShots.Text = "5"; + this.txtNumMultiShots.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label7.Location = new System.Drawing.Point(194, 261); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(23, 16); + this.label7.TabIndex = 17; + this.label7.Text = "枚"; + // + // txtMultiShotsInterval + // + this.txtMultiShotsInterval.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtMultiShotsInterval.Location = new System.Drawing.Point(121, 287); + this.txtMultiShotsInterval.Name = "txtMultiShotsInterval"; + this.txtMultiShotsInterval.Size = new System.Drawing.Size(67, 23); + this.txtMultiShotsInterval.TabIndex = 18; + this.txtMultiShotsInterval.Text = "1000"; + this.txtMultiShotsInterval.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label8.Location = new System.Drawing.Point(194, 290); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(42, 16); + this.label8.TabIndex = 19; + this.label8.Text = "ミリ秒"; + // + // btnOpenDataFolder + // + this.btnOpenDataFolder.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.btnOpenDataFolder.Location = new System.Drawing.Point(15, 414); + this.btnOpenDataFolder.Name = "btnOpenDataFolder"; + this.btnOpenDataFolder.Size = new System.Drawing.Size(57, 27); + this.btnOpenDataFolder.TabIndex = 20; + this.btnOpenDataFolder.Text = "開く"; + this.btnOpenDataFolder.UseVisualStyleBackColor = true; + this.btnOpenDataFolder.Click += new System.EventHandler(this.btnOpenDataFolder_Click); + // + // btnLightSW + // + this.btnLightSW.AllowDrop = true; + this.btnLightSW.Location = new System.Drawing.Point(173, 517); + this.btnLightSW.Name = "btnLightSW"; + this.btnLightSW.Size = new System.Drawing.Size(110, 37); + this.btnLightSW.TabIndex = 21; + this.btnLightSW.Text = "照明 OFF"; + this.btnLightSW.UseVisualStyleBackColor = true; + this.btnLightSW.Click += new System.EventHandler(this.btnLightSW_Click); + // + // icImagingControl1 + // + this.icImagingControl1.BackColor = System.Drawing.Color.White; + this.icImagingControl1.DeviceListChangedExecutionMode = TIS.Imaging.EventExecutionMode.Invoke; + this.icImagingControl1.DeviceLostExecutionMode = TIS.Imaging.EventExecutionMode.AsyncInvoke; + this.icImagingControl1.ImageAvailableExecutionMode = TIS.Imaging.EventExecutionMode.MultiThreaded; + this.icImagingControl1.LiveDisplayPosition = new System.Drawing.Point(0, 0); + this.icImagingControl1.Location = new System.Drawing.Point(12, 505); + this.icImagingControl1.Name = "icImagingControl1"; + this.icImagingControl1.Size = new System.Drawing.Size(79, 54); + this.icImagingControl1.TabIndex = 22; + this.icImagingControl1.Visible = false; + // + // txtConvElemNum + // + this.txtConvElemNum.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.txtConvElemNum.Location = new System.Drawing.Point(173, 463); + this.txtConvElemNum.Name = "txtConvElemNum"; + this.txtConvElemNum.ReadOnly = true; + this.txtConvElemNum.Size = new System.Drawing.Size(110, 23); + this.txtConvElemNum.TabIndex = 23; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("MS UI Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label9.Location = new System.Drawing.Point(12, 466); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(148, 16); + this.label9.TabIndex = 24; + this.label9.Text = "変換行列の説明変数"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(753, 634); + this.Controls.Add(this.label9); + this.Controls.Add(this.txtConvElemNum); + this.Controls.Add(this.icImagingControl1); + this.Controls.Add(this.btnLightSW); + this.Controls.Add(this.btnOpenDataFolder); + this.Controls.Add(this.label8); + this.Controls.Add(this.txtMultiShotsInterval); + this.Controls.Add(this.label7); + this.Controls.Add(this.txtNumMultiShots); + this.Controls.Add(this.label6); + this.Controls.Add(this.label5); + this.Controls.Add(this.txtDataName); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.txtSaveFolder); + this.Controls.Add(this.txtMessage); + this.Controls.Add(this.btnShotMulti); + this.Controls.Add(this.picDisplay); + this.Controls.Add(this.picPreview); + this.Controls.Add(this.txtSerialNo); + this.Controls.Add(this.txtDeviceName); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.btnShotOne); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "Form1"; + this.Text = "Form1"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.picPreview)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDisplay)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.icImagingControl1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnShotOne; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtDeviceName; + private System.Windows.Forms.TextBox txtSerialNo; + private System.Windows.Forms.PictureBox picPreview; + private System.Windows.Forms.PictureBox picDisplay; + private System.Windows.Forms.Button btnShotMulti; + private System.Windows.Forms.TextBox txtMessage; + private System.Windows.Forms.TextBox txtSaveFolder; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtDataName; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtNumMultiShots; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox txtMultiShotsInterval; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Button btnOpenDataFolder; + private System.Windows.Forms.Button btnLightSW; + private TIS.Imaging.ICImagingControl icImagingControl1; + private System.Windows.Forms.TextBox txtConvElemNum; + private System.Windows.Forms.Label label9; + } +} + diff --git a/TIASshot/UI/Form1.MemMonitor.cs b/TIASshot/UI/Form1.MemMonitor.cs new file mode 100644 index 0000000..d65d166 --- /dev/null +++ b/TIASshot/UI/Form1.MemMonitor.cs @@ -0,0 +1,77 @@ +#if MEMMONITOR +using System.Windows.Forms; + +namespace TIASshot { + public partial class Form1 { + + private MemoryMonitorForm _memoryMonitorForm; + + // F9 で ON/OFF をトグルする副モニタ計測用の一時抑制フラグ。 + // true の間は ShowImage が副モニタへのフレーム給餌(コピー生成・UpdateImage 呼び出し)を止める。 + private bool _subMonitorSuppressed = false; + + /// + /// メモリ観測ウィンドウを非モーダルで開く(MEMMONITOR 限定)。 + /// 既に開いている場合は前面化する。 + /// Shown イベントから呼び出すことでメインフォームの最終位置を確定させてから配置する。 + /// + private void ShowMemoryMonitor() { + if (_memoryMonitorForm != null && !_memoryMonitorForm.IsDisposed) { + _memoryMonitorForm.BringToFront(); + return; + } + + _memoryMonitorForm = new MemoryMonitorForm(); + + // 画面録画用の初期配置: 本体(左)と観測窓(右)を作業領域いっぱいに + // 横並び・上端揃え・同じ高さで置く。本体は左上に寄せ,観測窓は右隣の残り幅を占める。 + var wa = Screen.FromControl(this).WorkingArea; + const int gap = 8; + + this.StartPosition = FormStartPosition.Manual; + this.Location = new System.Drawing.Point(wa.Left, wa.Top); + + // 観測窓の左端を本体側へ少し食い込ませて左方向にわずかに拡大する + // (録画時にグラフ領域をもう少し広く見せるため)。 + const int leftExtend = 80; + int monX = this.Right + gap - leftExtend; + int monWidth = wa.Right - monX; + if (monWidth < 480) monWidth = 480; // 極端に狭い環境での最小幅ガード + + _memoryMonitorForm.StartPosition = FormStartPosition.Manual; + _memoryMonitorForm.Location = new System.Drawing.Point(monX, wa.Top); + _memoryMonitorForm.Size = new System.Drawing.Size(monWidth, this.Height); + + _memoryMonitorForm.Show(this); + } + + /// + /// 副モニタへのプレビュー給餌を ON/OFF トグルする(MEMMONITOR 限定・計測用)。 + /// F9 キーで Form1・MemoryMonitorForm のどちらからでも呼び出せる。 + /// 副ディスプレイが存在しない環境(_previewMonitor.IsShown が false)では何もしない。 + /// + public void ToggleSubMonitorProfiling() { + if (_previewMonitor == null || !_previewMonitor.IsShown) return; // 副ディスプレイが無い環境では何もしない + _subMonitorSuppressed = !_subMonitorSuppressed; + if (_subMonitorSuppressed) { + _previewMonitor.Hide(); + PreviewProfiler.MarkEvent("SUB_OFF"); + } else { + _previewMonitor.Show(); + PreviewProfiler.MarkEvent("SUB_ON"); + } + } + + /// + /// F9 キーで副モニタ給餌をトグルする(MEMMONITOR 限定)。 + /// Form1_Load で KeyPreview = true を設定した上で KeyDown に接続する。 + /// + private void Form1_MemMonitor_KeyDown(object sender, KeyEventArgs e) { + if (e.KeyCode == Keys.F9) { + ToggleSubMonitorProfiling(); + e.Handled = true; + } + } + } +} +#endif diff --git a/TIASshot/UI/Form1.WhiteBoard.cs b/TIASshot/UI/Form1.WhiteBoard.cs new file mode 100644 index 0000000..a5eb69b --- /dev/null +++ b/TIASshot/UI/Form1.WhiteBoard.cs @@ -0,0 +1,65 @@ +#if WHITEBOARD +using System; +using System.Windows.Forms; + +namespace TIASshot { + public partial class Form1 { + + /// + /// 白板撮影ボタンの初期化(WHITEBOARD 限定) + /// InitializeComponent() 完了後にコンストラクタから呼び出す. + /// + private void InitializeWhiteBoardButton() { + this.btnWhiteBoard = new System.Windows.Forms.Button(); + // + // btnWhiteBoard [WB] + // + this.btnWhiteBoard.BackColor = System.Drawing.Color.LightYellow; + this.btnWhiteBoard.Font = new System.Drawing.Font("MS UI Gothic", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.btnWhiteBoard.Location = new System.Drawing.Point(15, 225); + this.btnWhiteBoard.Name = "btnWhiteBoard"; + this.btnWhiteBoard.Size = new System.Drawing.Size(268, 28); + this.btnWhiteBoard.TabIndex = 25; + this.btnWhiteBoard.Text = "[WB] 白板撮影(均一性評価用)"; + this.btnWhiteBoard.UseVisualStyleBackColor = false; + this.btnWhiteBoard.Click += new System.EventHandler(this.btnWhiteBoard_Click); + this.Controls.Add(this.btnWhiteBoard); + } + + /// + /// [WB] 白板撮影ボタン(照明均一性評価用) + /// 校正ゲートを通さず IScam の白板撮影パスを呼び出す. + /// WHITEBOARD シンボルが定義されていない構成(Release 等)には含まれない. + /// + private void btnWhiteBoard_Click(object sender, EventArgs e) { + int numImages = GetNumMultiShots(); + if (numImages < 1) numImages = 1; + + btnWhiteBoard.Enabled = false; + ShowMessage($"白板撮影開始({numImages} 枚)..."); + + // 撮影は UI スレッドをブロックしないよう別スレッドで実行 + var thread = new System.Threading.Thread(() => { + try { + _camera.ShotWhiteBoard(numImages); + } catch (Exception ex) { + System.Diagnostics.Debug.WriteLine($"[WhiteBoard] 撮影スレッドエラー: {ex.Message}"); + ShowMessage($"白板撮影エラー: {ex.Message}"); + } finally { + if (InvokeRequired) { + Invoke((MethodInvoker)delegate { + btnWhiteBoard.Enabled = true; + }); + } else { + btnWhiteBoard.Enabled = true; + } + } + }); + thread.Name = "WhiteBoardShotThread"; + thread.Start(); + } + + private System.Windows.Forms.Button btnWhiteBoard; + } +} +#endif diff --git a/TIASshot/UI/Form1.cs b/TIASshot/UI/Form1.cs new file mode 100644 index 0000000..433df66 --- /dev/null +++ b/TIASshot/UI/Form1.cs @@ -0,0 +1,329 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Interop; +using System.Windows.Media.Media3D; +using System.Xml.Serialization; +using TIS.Imaging; + +namespace TIASshot { + public partial class Form1 : Form { + + private CameraBase _camera; + public static string APP_NAME = "TIAS Shot"; + private LightSource _light = new LightSource(); + private bool _isLightOn = true; + private PreviewMonitor _previewMonitor; + private Bitmap _dispBuf = null; + private bool _isUpdateBuf = false; + private readonly object _dispBufLock = new object(); + + // 本モニタ(picDisplay)の自ペース再描画用タイマー。 + // 以前はコールバックスレッドから毎フレーム Invalidate() していたが,Form1 の WM_PAINT が + // 常時保留状態になり,同一 UI スレッドを共有する副モニタの WM_TIMER が + // (WM_PAINT > WM_TIMER の優先度により)飢餓状態になっていた。 + // 本モニタも副モニタと同じタイマー駆動に統一し,コールバックスレッドからは + // Invalidate を一切呼ばないことで WM_PAINT の常時保留(洪水源)を消す。 + private const int MainRefreshIntervalMs = 33; // ≒30fps(PreviewMonitor と同じ値) + private readonly System.Windows.Forms.Timer _mainRefreshTimer = new System.Windows.Forms.Timer(); + + + /// + /// コンストラクタ + /// + public Form1() { + InitializeComponent(); +#if WHITEBOARD + InitializeWhiteBoardButton(); +#endif +#if MEMMONITOR + this.Shown += (s, e) => ShowMemoryMonitor(); + this.KeyPreview = true; + this.KeyDown += Form1_MemMonitor_KeyDown; +#endif + + var version = Assembly.GetExecutingAssembly().GetName().Version; + Text = $"{APP_NAME} ver.{version.Major}.{version.Minor}"; +#if DEBUG + Text += " [DEBUG]"; +#endif + } + + /// + /// フォームロード + /// + /// + /// + private void Form1_Load(object sender, EventArgs e) { + Config.Load(); + + _camera = new Lucam(this, picPreview); + if (!_camera.Connect()) { + Debug.WriteLine(_camera.ErrorMsg); + Debug.WriteLine("Lucamの接続に失敗しました"); + _camera = null; + } + + if (_camera == null) { + var cameraList = icImagingControl1.Devices.Select(d => d.Name.Replace(" ", "")); + foreach (var cam in cameraList) { + _camera = new IScam(this, icImagingControl1, cam); + if (_camera.Connect()) break; + Debug.WriteLine(_camera.ErrorMsg); + Debug.WriteLine($"{cam}の接続に失敗しました"); + _camera = null; + } + } + + if (_camera == null) { + MessageBox.Show("カメラが見つかりません.終了します.", APP_NAME, + MessageBoxButtons.OK, MessageBoxIcon.Warning); + Close(); + return; + } + + txtDeviceName.Text = _camera.DeviceName; + txtSerialNo.Text = _camera.SerialNumber; + txtNumMultiShots.Text = Config.GetString("Shot/MultiShotCount"); + txtMultiShotsInterval.Text = Config.GetString("Shot/MultiShotInterval"); + txtDataName.Text = Config.GetString("Shot/SubjectName"); + txtSaveFolder.Text = Config.GetString("File/SaveFolder"); + txtConvElemNum.Text = Config.GetString("Calib/ConversionChannels"); + EnableShots(false); + //_lucam.StartStopPreview(); + + if (_light.Open()) { + _light.SetLight(); + } else { + Debug.WriteLine("光源の接続に失敗しました"); + btnLightSW.Enabled = false; + } + + _previewMonitor = new PreviewMonitor(); + if (_previewMonitor.IsShown) _previewMonitor.Show(); + + _mainRefreshTimer.Interval = MainRefreshIntervalMs; + _mainRefreshTimer.Tick += MainRefreshTimer_Tick; + _mainRefreshTimer.Start(); + } + + /// + /// フォームクローズ + /// + /// + /// + private void Form1_FormClosing(object sender, FormClosingEventArgs e) { + _mainRefreshTimer.Stop(); + if (_camera == null) return; + _camera.Disconnect(); + } + + /// + /// 画像撮影1枚 + /// + /// + /// + private void btnShot1_Click(object sender, EventArgs e) { + EnableShots(false); + _camera.ShotOne(); + } + + /// + /// 複数画像撮影 + /// + /// + /// + private void btnShotMulti_Click(object sender, EventArgs e) { + EnableShots(false); + _camera.ShotMulti(); + } + + /// + /// 画像表示 + /// ワーカースレッドから呼び出される + /// + /// + public void ShowImage(Bitmap bmp) { +#if MEMMONITOR + PreviewProfiler.IncrementCallbackFrames(); + PreviewProfiler.SetLastImageSize(bmp.Width, bmp.Height); + long mainCopyStart = System.Diagnostics.Stopwatch.GetTimestamp(); +#endif + // Lucam 経路は二重バッファ(_bmps[0]/_bmps[1])をコールバックスレッド上で Dispose するため, + // 入力 bmp をそのまま picDisplay.Image に載せると,UIスレッドの OnPaint が Width 等を + // 読んでいる最中にコールバックスレッドが Dispose して別スレッド同時アクセスでクラッシュしうる。 + // そのため ShowImage は入力 bmp を「読むだけ」とし,表示用には呼び出しスレッド上で + // Form1 所有のコピーを生成する(bmp の所有権は呼び出し側に残す)。 + // BitmapUtil.FastClone は LockBits による生画素コピーで,GDI+ の DrawImage 経路を使う + // new Bitmap(bmp)(~25ms)より高速(数 ms)。生成されるコピーは入力と独立した画素バッファを + // 持つため,所有権・スレッド安全性のモデルは new Bitmap(bmp) と完全に同一。 + var dispCopy = BitmapUtil.FastClone(bmp); +#if MEMMONITOR + PreviewProfiler.AddMainCopyTicks(System.Diagnostics.Stopwatch.GetTimestamp() - mainCopyStart); +#endif + + // 原因2: タイマー Tick に反映されなかった取りこぼしフレームを Dispose する + // _dispBufLock で ShowImage(コールバックスレッド)と MainRefreshTimer_Tick(UIスレッド)の + // 同時アクセスを防ぎ、二重 Dispose・使用中バッファの誤 Dispose を回避する + Bitmap toDispose = null; + lock (_dispBufLock) { + if (_isUpdateBuf && _dispBuf != null) { + toDispose = _dispBuf; // タイマー未反映の旧バッファを破棄予約 + } + _dispBuf = dispCopy; + _isUpdateBuf = true; + } + toDispose?.Dispose(); // ロック外で GDI 解放(ロック保持時間を最小化) + // Invalidate() は呼ばない。毎フレーム呼ぶと Form1 の WM_PAINT が常時保留状態になり, + // 同一 UI スレッドを共有する副モニタの WM_TIMER(WM_PAINT より優先度が低い)が + // 飢餓状態になるため(本モニタも MainRefreshTimer_Tick による自ペース再描画に統一した)。 + + // 原因1: 副モニタが表示されているときだけフルコピーを生成する + // (非表示時に毎フレーム bmp2 を生成しリークしていた問題を修正) + bool feedSub = _previewMonitor != null && _previewMonitor.IsShown; +#if MEMMONITOR + // F9 トグル(ToggleSubMonitorProfiling)による計測用の一時抑制。 + // 抑制中は副モニタ用コピー生成も UpdateImage 呼び出しも走らせず, + // コールバックスレッドのコピー回数を本モニタ用の 1 回だけに戻す。 + if (_subMonitorSuppressed) feedSub = false; +#endif + if (feedSub) { +#if MEMMONITOR + PreviewProfiler.IsSubShown = true; + long subCopyStart = System.Diagnostics.Stopwatch.GetTimestamp(); + var subCopy = BitmapUtil.FastClone(bmp); + PreviewProfiler.AddSubCopyTicks(System.Diagnostics.Stopwatch.GetTimestamp() - subCopyStart); + _previewMonitor.UpdateImage(subCopy); +#else + _previewMonitor.UpdateImage(BitmapUtil.FastClone(bmp)); +#endif + } +#if MEMMONITOR + else { + PreviewProfiler.IsSubShown = false; + } +#endif + } + + /// + /// 本モニタ(picDisplay)の自ペース再描画(約30fps)。 + /// 新フレームがあるときだけ picDisplay.Image を差し替える(静止フレームは無駄に再描画しない)。 + /// + /// + /// + private void MainRefreshTimer_Tick(object sender, EventArgs e) { + // 原因2: _dispBufLock で ShowImage との競合を防ぎながらバッファを取り出す + // _dispBuf を null に戻すことで ShowImage 側が「表示中バッファ」を誤って Dispose しないようにする + Bitmap toDisplay; + lock (_dispBufLock) { + if (!_isUpdateBuf || _dispBuf == null) return; + toDisplay = _dispBuf; + _dispBuf = null; // 参照を手放し、次の ShowImage で二重 Dispose されないようにする + _isUpdateBuf = false; + } + + // picDisplay.Image の Dispose・差し替えは UI スレッド(このタイマー Tick)でのみ行う。 + picDisplay.Image?.Dispose(); // 直前に表示していたバッファを解放 + picDisplay.Image = toDisplay; +#if MEMMONITOR + PreviewProfiler.IncrementMainPaints(); +#endif + } + + /// + /// メッセージ表示 + /// + /// + public void ShowMessage(string msg) { + if (InvokeRequired) { + Invoke((MethodInvoker)delegate { ShowMessage(msg); }); + return; + } + txtMessage.Text = msg; + txtMessage.Update(); + } + + /// + /// データ名取得 + /// + /// + public string GetDataName() { + if (InvokeRequired) { + return (string)Invoke((MethodInvoker)delegate { GetDataName(); }); + } + return txtDataName.Text; + } + + /// + /// マルチショット撮影の枚数取得 + /// + /// + public int GetNumMultiShots() { + if (InvokeRequired) { + return (int)Invoke((MethodInvoker)delegate { GetNumMultiShots(); }); + } + if (int.TryParse(txtNumMultiShots.Text, out int result)) return result; + return 1; + } + + /// + /// マルチショット撮影の間隔取得 + /// + /// + public int GetMultiShotsInterval() { + if (InvokeRequired) { + return (int)Invoke((MethodInvoker)delegate { GetMultiShotsInterval(); }); + } + if (int.TryParse(txtMultiShotsInterval.Text, out int result)) return result; + return 1000; + } + + /// + /// 撮影ボタン有効化 + /// + /// + public void EnableShots(bool enable = true) { + if (InvokeRequired) { + Invoke((MethodInvoker)delegate { EnableShots(enable); }); + return; + } + btnShotOne.Enabled = enable; + btnShotMulti.Enabled = enable; + } + + /// + /// データフォルダを開く + /// + /// + /// + private void btnOpenDataFolder_Click(object sender, EventArgs e) { + System.Diagnostics.Process.Start(txtSaveFolder.Text); + } + + /// + /// 光源のON/OFF切り替え + /// + /// + /// + private void btnLightSW_Click(object sender, EventArgs e) { + if (!_light.IsOpen || _camera.IsCalibrating) return; + if (_isLightOn) { + _light.TurnOff(); + btnLightSW.Text = "照明 ON"; + _isLightOn = false; + } else { + _light.SetLight(); + btnLightSW.Text = "照明 OFF"; + _isLightOn = true; + } + } + } +} diff --git a/TIASshot/UI/Form1.resx b/TIASshot/UI/Form1.resx new file mode 100644 index 0000000..dae2b47 --- /dev/null +++ b/TIASshot/UI/Form1.resx @@ -0,0 +1,3540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAAAAAAAEAGAAoIAMAFgAAACgAAAAAAQAAAAIAAAEAGAAAAAAAAAAAAEgAAABIAAAAAAAAAAAA + AADx8/Px8/Tx8vPx8/Tx8/Tx8/Tx8vPx8vPx8/Tx8vTx8/Px8vTx8/Ty8/Ty8/Px8vPx8vTx8/Py8/Px + 8/Py8/Px8/Px8/Px8vPx8/Tx8vPx8vPx8vPw8vPx8vTz9vbw7+/o4uHFsKqwkYiXaVeKWEN1Oh9lIQFi + IQFjIQBlIgFnIwBqJwBtKQBvKwBvKwBuKgBuKwBuKgBtKgBuKgBuKgBuKgBuKgBuKwBuKgBvKwBuKwBu + KwBuKwBuKwBuKwBvKwBuLABuKwBvKwBuKwBuKwBvKwBuLABvKwBvKwBuKwBuKwBuKwBuLABvKwBuKwBv + KwBuLABuKwBuLABuLABvKwBuKwBuKgBvKgBvKwBuKwBuKwBuKwBuKwBvLABuKwBvLABvLABuKwBuKwBu + KwBuKwBvKwBuLABvKwBvKwBuKwBvLABuLABuKwBuLABuLABvLABuLABvKwBuKwBuKwBuKwBuKwBuKwBu + KwBuKgBuKwBvKwBuKwBuKgBvKwBuKwBvKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBvKgBuKwBu + KwBuKwBvKwBuKwBuKwBuKwBuKwBuKwBvLABvLABvKwBvKwBvKwBuKwBvKwBuKwBvKwBvKwBuKwBuKwBu + KwBuKwBvKwBvKwBvKwBuKwBuKwBvKwBvKwBuKwBuLABvKwBvLABvKwBuKwBuKwBvKwBuKwBuKwBvKwBv + KwBuKwBuKwBuKwBuKwBuLABuKwBvLABuKwBvKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBuKwBvKwBuKwBu + KwBuKwBuKwBuKwBuKwBvKwBvKwBuKgBtKwBtKgBtKQBsKABqJQBoIwBlIgBlIQBiIABkIAJ2ORyJWkSR + YlOphX27oZzazsns6erz9PX09PXy8/Pw8fPx8vPx8vPx8vPx8vTy8/Py8/Ty8/Px8/Ty8/Tx8vPx8/Px + 8vPy8vTx8/Tx8vPy8/Tx8vTx8/Tx8vPx8vTx8vPx8/Px8/Tx8/Px8/Tx8vPx8vPy8/Px8vPx8vPx8/Tx + 8/Px8/Py8/Tx8/Px8vPx8vTx8/Px8/Tx8vPx8/Px8vPx8vPx8vPy8/Px8vTx8/Px8vPx8/Px8vPx8vPy + 8/Tx8/Tx8vTy8/T09PPe1dO0mJCPYU93OiBnJABtKQBxLwBwLwBxLwBwLgBwLgBwLwBxLwBxLwBwLgBw + LgBvLgBwLwBwLwBwLwBwLgBxLgBxLgBwLgBwLgBwLwBxLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLQBx + LgBwLgBxLgBxLgBxLgBxLgBwLwBxLgBwLQBxLgBxLgBxLgBwLgBxLgBxLgBxLgBwLgBwLgBwLgBwLgBw + LwBxLwBwLgBwLgBxLwBwLgBxLgBwLgBwLgBxLgBxLgBxLwBxLgBxLwBxLgBxLgBwLgBxLgBxLgBwLgBx + LgBwLwBxLwBwLgBxLwBxLgBxLgBxLgBxLwBxLwBwLgBxLgBxLgBwLgBwLgBxLgBxLwBwLgBxLgBxLgBx + LwBxLwBxLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLwBwLgBx + LgBxLgBxLgBxLgBxLwBwLwBxLwBxLgBxLwBxLwBxLgBxLwBxLwBxLwBwLgBxLgBxLgBwLgBxLgBxLgBx + LwBwLgBxLgBwLwBxLgBwLgBwLgBxLgBxLwBwLgBwLgBwLgBxLgBwLgBwLwBxLgBxLgBxLgBwLgBwLgBw + LgBxLgBxLgBxLgBxLgBwLgBxLgBwLgBxLgBwLwBwLgBxLgBwLgBxLgBwLgBwLgBwLgBxLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBxLgBwLgBxLwBvLwBwMABvLwBvLgBwLwBwLwBwLABpJgBr + KQiCTDWdd2rBq6Xn39/09Pbx8vTx8vPx8/Px8vPy8/Ty8/Px8/Py8/Px8/Py8vPy8/Px8/Px8vPx8vPx + 8/Px8/Px8/Py8/Px8/Px8vPx8/Px8/Py8vPx8/Px8/Px8vPx8vPx8vPx8/Tx8/Tx8vPx8/Px8/Px8/Tx + 8vTx8/Ty8/Px8vPx8vPx8/Tx8/Ty8/Tx8vPx8vPx8vTx8vPx8vPx8vPx8vLx8vTy9fX19vff19Wpin59 + RS1sKARvLABxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLwBwLwBwLgBwLwBxLwBwLgBxLgBwLwBsKgBt + LQyEUT2yl5Dm39309ffy8vXy8vTx8vTx8vTx8/Py8/Ty8/Py8vPx8/Py8/Py8/Tx8/Px8/Tx8/Py8vPy + 8/Ty8/Tx8vPx8/Tx8vTy8vPx8/Px8vTx8vPx8/Px8/Px8vPx8/Px8vPy8/Tx8/Tx8vPx8/Tx8/Px8/Px + 8/Ty8/Tx8/Px8/Tx8/Tx8/Tx8/Tx8vPx8/Px8vTy8vT19vjGsauKWERtKwdwLgBxLwBxLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBw + LgBwLQBwLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBxLgBwLgBwLQBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBv + LgBwLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLQBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBuLABtKwuO + X07Mubb19vfx8fTy8vXy8vPx8/Py8/Ty8/Px8vTx8/Py8/Px8vPx8/Tx8/Tx8/Ty8/Px8/Px8/Py8/Tx + 8vTx8vTx8/Px8/Px8vPx8vTy8vPx8vPx8/Px8vPx8/Tx8vPx8/Tx8vPx8/Tx8/Tx8vTy8vPx8/Px8vPx + 8vTx8vPx8vPy8/Ty8/Ty8fHBq6N6QSltKgBxLgBwLgBxLwBxLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLgBwLgBvLgBwLgBwLwBwLgBwLQBwLgBw + LgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBxLwBsKAF7QyzBq6fy + 8fHy8/Tx8/Px8vPy8/Py8/Px8vTy8/Ty8/Px8vPx8/Py8/Tx8/Tx8/Py8/Tx8/Py8/Py8/Px8vPx8vTy + 8vTy8/Px8vPx8vPx8/Px8/Ty8/Tx8/Tx8vTx8/Px8/Tx8vPx8/Px8vTx8/Px8vPx8/Tx8vPw8fPz9PXL + uraARzFtKgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLQBwLQBwLgBvLgBwLQBvLgBwLgBvLgBvLgBv + LgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBtKgB/RzHMvLn09fXx8vPx + 8vPy8vPy8vPx8/Tx8/Py8vTy8/Px8/Ty8/Tx8/Tx8vPx8/Py8/Px8/Ty8/Tx8/Tx8vPx8vTx8/Tx8vTx + 8/Py8/Ty8/Px8/Py8/Tx8/Py8/Ty8vPx8/Py8/Tx8/Tx8vTx8/Px8vTn4eCSZ1htKwRxLgByLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBvLgBwLwBvLgBwLgBwLwBw + LgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBw + LgBwLgBwLwBwLwBwLgBwLgBwLgBxLQBwLQBvLQBxLQBvLgBvLQBwLQBwLgBwLgBwLgBwLQBwLgBwLgBw + LgBwLwBwLwBxLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLgBv + LwBwLgBvLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLwBwLwBvLgBvLgBwLQBvLQBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBw + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLwBxLwBsKgSTaFbl4N/y8/Xy8/Py8vTx8/Px + 8vPy8/Tx8vPy8/Tx8/Px8/Tx8/Ty8/Py8/Ty8/Px8vPx8/Px8/Px8/Tx8/Tx8/Px8/Ty8/Tx8/Ty8/Ty + 8vTx8/Tx8vTx8vTx8/Ty8vTx8/Px8vP09fbHsq11OBlwLQBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBv + LgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBxLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw + LgBwLgBwLwBzLQByLgBxMAByLwBxLgBwLQBvLQBwLgBxLgBxLwBxLwBwLwBwLwBxLwBxLwBwLwBxLwBw + LwBwLwBxLgBwLgBwLwBwLgBwLwBxLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBvLgBvLgBvLwBwLgBw + LwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBwLQBwLgBvLQBwLgBvLgBv + LgBwLgBwLgBxLgBwLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBxNBbFsaz19vfx8/Pw8vPy8/Tx8/Tx8/Ty8vTy + 8/Ty8/Tx8/Tx8/Tx8/Tx8vTy8vTy8vPx8/Px8vTx8vPx8vTx8/Tx8/Tx8vPy8/Ty8/Tx8/Tx8vPx8/Tx + 8/Ty8/Ty8/Py8PKjfXFsKQJwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLQBw + LgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLgBvLgBvLgBwLgBvLwBvLwBwLgBwLgBwLwBvLgBvLgBvLgBv + LgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBxLgBxLwBwLwFz + LgF1LwNyLgVxLwVzLwRzLwR0LgRxLgNwLgFwLgFxLwBwLwBwLwBxLgBxLgBwLwBxLwBwLwBwLgBwLwBx + LwBwLwBwLwBwLwBwLgBvLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBvLwBwLwBwLgBwLwBvLwBvLwBv + LgBwLgBwLQBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBvLgBv + LgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLQBwLgBwLQBvLQBwLgBvLQBvLQBvLQBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBv + LgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBrKQKeemzx8PDz8/Tx8vTx8vTx8vPy8vTx8/Ty8/Px8/Ty8vTx + 8vPx8/Tx8/Px8/Px8vPy8vPx8/Px8vTx8vTx8/Ty8/Tx8/Tx8/Ty8/Tx8/Tx8/Tw8vTy8/Xq5eSKWkht + KwBxLgBxLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBw + LgBwLgBwLwBwLgBwLwBwLwBvLgBwLgBvLgBvLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBvLgBw + LwBwLwBwLgBwLgBwLgBwLwBxLwBwLwBxLwBxLwByLwBxLgNzLwR0LgZxLRFrLjtoL0JaM3RUNKBUOKFQ + OaFRN6FUNZ9ZNHxpL0NuLzV1LQlyLgRxLgNxLgBxLwBxLwBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLwBw + LwBwLwBwLgBwLwBwLgBvLgBxLwBxLwBvLgBvLQBwLgBvLgBwLgBvLwBwLgBvLgBwLgBwLwBwLwBvLgBw + LwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLQBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBv + LgBwLgBwLgBxLwBwLwBvLACIV0Xq5uXy8/Tx8/Tx8/Py8/Ty8/Tx8vPy8/Px8vTy8vTy8/Px8/Px8/Tx + 8/Px8vTx8/Px8/Tx8/Tx8vTx8/Ty8/Ty8/Ty8/Tx8/Ty8vTx8/Xk3dt+RjBwLQBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLwBvLwBwLwBw + LQBwLwBwLgBwLwBvLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBw + LwBvLQByLQJzLwBxLgJyLgV0LRFqLztdMXFMN7lFOc8/PfFBPvFFP/BFPuxIPupIPupHPulHP+tHP+1C + P/E+PexJOMJUNpJoMVR2LhRzLwZyLwFxLwBxLgBxLgBwLgBxLgBwLgBvLgBvLwBvLwBwLwBwLwBwLgBw + LgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLgBvLgBwLwBvLwBvLwBwLgBvLwBvLwBvLwBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLQBwLgBw + LgBvLwBvLAB8RS7j3dvy9PXx8/Ty8/Ty8/Tx8/Py8/Ty8/Ty8vPy8/Px8vPy8vTy8/Px8vTx8vPx8vTx + 8/Py8/Ty8/Tx8/Px8/Tx8/Tx8vTy9PTl3916PyRwLQBxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBvLQBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgBw + LgBwLwBwLgBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBxLwBxLwBwLgBwLwBwLwBxLgBxLgFzLwR3LhFp + LzxYNotFPthCP+lDPu9HPepHPuxGP+pIP+pGPupHPutHPutHPutIPupGPupGPulGPupIP+pIPuxFPu1A + P/NAO91TModuMDB0LQdxLgNxLgBwLgBxLgBwLgBwLgBwLwBwLwBwLgBwLgBwLQBwLgBvLgBwLwBvLwBv + LwBvLgBwLwBwLwBvLwBwLgBwLgBvLwBwLwBvLgBwLgBwLgBvLwBwLgBvLwBvLgBvLwBwLgBvLgBwLgBw + LgBwLgBwLQBvLgBvLgBvLQBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBw + LgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBvLgBvLgBvLQBvLQBwLQBwLgBvLgBvLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLwB6 + PiTl4N/y9PTx8/Ty8/Px8vPx8/Ty8/Px8vPy8/Px8vPy8vPx8/Tx8vTx8vPx8/Tx8/Tx8vTy8/Ty8/Tx + 8/Tx8/Xy9PXo4eF3PCVxLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBxLgBw + LgBwLgBvLwBvLgBwLgBwLwBwLgBwLwBwLwBxLwBxLgBwLwF0LgZyLBpeMmZGO8k+PvFEP+pIP+hJPulJ + P+lIPuhHP+lGPupHPulGP+lHPupHPupHP+pIP+pHP+tHP+pIP+pHP+lJP+lIP+pIPulIPetFP+1BQPJN + OKVqLTd0KwlxLwNxLgBxLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBwLwBw + LgBvLgBwLwBwLgBwLgBvLwBwLgBvLgBvLgBvLQBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBvLQBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBw + LgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLwB5Pifo4uHy8/Xx + 8vTx8/Ty8/Ty8/Ty8/Ty8/Ty8/Tx8/Tx8vPx8vPx8/Px8/Tx8/Tx8/Px8/Py8/Ty8/Ty8/Tu7OyCTjdw + LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBvLQBwLgBwLwBwLwBwLgBwLgBw + LgBwLwBwLgByLwByLwByLgBuLwRzMA9jMmdGPNVEP/BIP+lHPupHPetIPupIPulIP+lHQOpJPutHP+pI + P+pHPupHPupHPupIPupHP+pIPupHP+pHP+pHPulIP+pHPupHPulHPulHPuxHP+pIPus9PO5QNJxvLShx + LwZuLgBvLgBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLgBvLgBw + LgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBvLQBwLQBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLQBvLQBvLgBwLQBvLgBvLQBwLgBwLQBwLgBvLgBwLQBvLgBwLQBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBvLQBwLgBwLQBwLQBwLgBwLgBwLQBwLQBvLgBwLQBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBw + LgBwLQBwLQBwLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLwBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLgCDTjju7Ovx8/Xy8/Ty8vTy8/Ty + 8/Ty8/Tx8/Py8/Tx8/Tx8vTx8vPx8/Py8/Tx8vTy8/Tx8vPx8vP09vaWbV9vLQBxLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBw + LgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBxLgBwMABwLgBz + LgJ1LglpMExIO8lBQfBIPupIP+xHPupIPutHPupIPupHPutHP+pHP+pHP+pIPutHPulHPulHPupHP+tI + PutHPutHP+lHPupHPupHPupHPulHPupHPupHPutHPulIPupHQOpIPepDP+xDPeNdMnNzLg9xLwJvLwBv + LgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw + LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLQBvLgBwLgBvLgBv + LgBvLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLQBvLgBw + LgBwLgBvLgBvLQBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBvLgBvLgBwLQBwLgBvLgBwLgBvLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBvLgBwLgBvLgBwLgBwLgBwLQBv + LgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBv + LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLwBxLwBvKwCWa1z09Pbx8vPx8vPx8/Ty8vTy8/Px8/Tx8/Tx + 8vPx8/Tx8/Px8/Ty8/Px8/Tx8/Tw8vPy9PW0l41rKQBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBvLQBw + LgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwByLwByLwNzLxtTN5lCPe1JP+pK + PupIP+pIP+pIP+pHPutHPupIPutHPutHP+pIP+pIPupHPutHPupIP+pIPupHPupHPupHPupHP+pHPulH + P+pHPupHPupHP+lHPutHPupIP+pHP+pHP+hIPulGP+tIP+pDP+1MOLtvLyVxLQRwLwBwLgBwLwBwLwBw + LwBvLgBwLgBwLgBwLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBwLQBv + LwBwLgBwLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLQBvLgBvLgBv + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBw + LgBwLgBvLgBwLQBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBwLgBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw + LgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBw + LQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBtKgCzlY3y9PXx8vTy8/Tx8vPx8/Px8/Py8/Tx8vPx8vTy8/Py8/Py + 8vPx8vPy8/Tx8/PWyMRtLQpxLwBvLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLgBv + LwBvLgBvLgBvLgBwLgBwLgBwLgBxLgBxMABwLwBzLwRsLzdEPNFDQO9HPulHP+pIP+lHPulHP+pIPupH + PupHPupHPupIPupIP+pIP+lIPupHPulIPupIP+pIP+tHP+lIP+pHP+pHPulIPupHP+pHPulHP+lGP+lH + PupHPulIPulHP+pHP+lIPulIPupHP+pKQOlGQu1BO+BoLklyLwNvLgBxLwBwLwBwLgBvLwBwLwBwLwBw + LgBwLwBvLwBwLgBwLwBvLgBvLgBvLwBwLwBwLgBvLwBvLwBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLQBvLgBvLQBvLQBwLgBvLQBvLgBvLQBwLQBwLgBvLgBvLgBwLgBvLgBvLgBv + LgBvLgBwLgBwLgBwLgBwLgBwLQBvLQBwLgBvLgBvLQBvLgBwLgBwLQBwLgBwLQBwLgBvLQBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBv + LQBwLgBwLgBxMABuLgrYysby8vTx8vPx8vPx8/Px8vPy8/Px8vPx8/Tx8/Ty8/Ty8/Tx8vTx8/Tu7Ox+ + Ri1wLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLQBwLgBw + LgBwLgBxLwBvLQByLwByLQZeMGZAPepHPutIPupHPupGPupHPupHPupIPupHPulHPupHP+tIPupIP+pH + PulHPupIPupHPulHPupHP+lHP+pHPupHPulHP+pIPupHPupHP+pHP+pHPupHPupHPupHP+lHPupHP+lH + PupHPupHP+lHP+pHP+pHPupIPutBPupbL3JzLQlyLgBxLgBwLwBwLgBwLgBvLwBvLgBwLwBvLgBvLgBw + LwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLQBvLgBwLgBv + LQBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLQBvLgBwLQBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBvLQBvLQBwLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBvLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLwBvLQBwLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBwLgBv + LgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLQBvLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBw + LgBvLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBw + LgBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBx + LgB+Ri3v7ezy8/Ty8/Py8/Ty8/Ty8/Ty8vPy8/Tx8/Ty8/Ty8vTx8vPy8/SnhXtuKwBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLQBwLgBvLQBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBxLwF3 + LQ1VMoc/P+xHPupHP+pIP+lHPupHPupHPupHPupHP+pIPupIP+pHPupHPulHPupHP+pHP+pIPutHP+pH + PupHPulIP+pIP+pIP+lIP+pHP+lHPupHPupGPulIPupHPupIPutHP+lIPulIPulIPulIP+lHP+lHPupH + PupHPupIPupLQOpDPe5aNIh0LQpvLwBwLwBwLwBxLgBvLwBvLwBwLgBwLgBwLwBwLwBwLgBwLgBvLgBw + LgBwLwBvLgBvLgBvLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBv + LgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBvLQBwLgBwLgBvLgBwLQBv + LgBvLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBw + LQBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLwBvLQBwLgBvLgBwLgBwLgBvLgBvLgBv + LgBvLQBvLgBvLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLQBwLgBvLgBwLQBwLgBwLgBvLgBvLgBvLgBv + LgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLwBvLgBwLgBwLgBwLgBwLgBxLwBvLAGqiX7y9Pbx + 8/Py8/Ty8/Ty8/Tx8/Px8vTx8/Ty8vTx8vTx8vXg19drKghwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLwBvLwBwLgBwLQBxLQBwLgBvLwBwLgBwLwBxLwBxLwFyLxBSNJ5APu5IP+lIP+lH + QOhHPulHPupHP+tHPulHP+pHPupIP+pHPupHPulHPupHP+lHPupHPulHPulHPupHP+pIP+pIP+pHP+pH + P+pHP+pIPulHP+pHP+lIP+pIP+pHP+pHPupHP+lHP+pIPupHPupHP+lHPulHP+tHP+pHPupIP+lIQOlJ + QepCQO9dNH9zLQhxLgBxLwBwLwBwLwBwLwBxLgBvLwBwLwBwLwBxLwBwLwBwLgBwLgBwLwBwLgBwLwBv + LwBwLwBwLgBwLgBvLwBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBv + LgBvLgBwLQBwLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw + LgBwLgBvLgBwLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBxLwBsKwrh2dbx8/Tx8vPx8vTy8/Py + 8/Ty8vTx8/Ty8/Tx8/T09faNYVBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBwLQBwLgF0LQlXNI9CPe9HPetHPelHPutIPupIP+pHPupHP+pH + PupIPupGPupHP+tHPupHPupHPupHPupIPupGP+lHPulIP+pHPupHPulHPupIPupHPutHP+pHPupHPupH + PupHPulHPupGPupHPupHPupIP+pIPulHPutHPupHPupHP+pIPulHPupHP+pIP+pIP+pJP+lCPOxeMnxz + LQdxLgBwLgBwLgBwLgBxLgBwLwBwLgBvMABwLwBwLwBxLgBwLgBvLgBwLgBwLwBwLwBwLgBvLwBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLgBv + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBw + LgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBw + LgBvLQBwLgBwLgBwLgBvLwBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBv + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBxLwBxLgCQY1Pz9ffy8vTy8/Ty8/Ty8/Px8/Px8vTy8vPy + 8/TQwr1rKgRwLgBwLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLQBwLQBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLwBwLwBwLwBw + LgBwLwBxLgBxLwBxLwByLgVhL1tBP+1IPupIPulIPulHPutHPupHPupHP+pHPupHP+pHP+pGPupHP+pI + P+lHPupHPulHPupHPupHPupIPulHPupHPutHPutHP+pIPulHPupHPupHPupHP+pIP+pHP+tHP+pHPulH + PupHPulHPupIP+pHPulHPupHPupHP+lHP+lHP+lIPupHP+pIPulIP+lJQepCPfJjMVdzLgVwLwBwLwBw + LwBxLwBxLgBvLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBxLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv + LgBwLgBwLQBwLgBwLgBwLgBwLgBvLQBvLQBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBv + LgBvLgBwLQBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBw + LgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBwLgBwLgBv + LgBvLgBwLgBwLgBwLwBvLQBvLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBvLQBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLQBvLgBvLQBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBxLwBsKwXUxsTz8/Xx8/Tx8/Ty8/Ty8vTy8/Ty8/T09PSMXUtwLgBwLgBv + LgBvLgBwLgBvLgBwLgBwLgBwLwBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLgBxLwBw + LwRuLjxFQOdIP+pIPulHPulHP+lHPupHPutHPupHPulIP+lHPulHPupHPupHPupHPupHP+pHP+lHPulH + PupHP+pHPulIPupHP+pHP+pHP+tHP+pHPupHPupHPulHPupHPupHP+pHPulIPupHPupIP+lIPupHPupH + PupHPupHPulHP+pHPupHPulIPulIPulHPupHP+pGQepHQOpDO95sLzJxLgJwLgBwLwBwLgBwLwBwLgBw + LgBvLgBwLgBwLgBxLgBvLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv + LgBvLQBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBv + LgBvLgBwLgBvLgBvLQBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBw + LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLwBvLgBvLgBvLQBvLQBvLQBwLgBvLgBw + LgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBv + LgBwLgBvLQBwLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgCOXU309fbx8vTy8/Px8/Tx8vTy8vTy8/TXzchrKgRwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBxLgBxLwFzLRJLO71HPu1HPulH + PulIPupIPulHP+pHPulIPulIPupHPupHP+lIPupHPupHPulHPulHPupHPupHP+lHPulHPulHPulIPupH + PulIP+pHPulIPupHPulHPupIPulHPupHPupHP+pHP+lHP+pHPupIPupIPupHP+pHP+pHPulHP+lHP+lI + PulHPupIPupIPulHP+pIP+pHPupGP+pFPutIOsVxLBZvLQFwLgBwLgBwLgBvLgBwLwBwLwBvLgBwLwBw + LwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBw + LgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLQBvLgBvLgBw + LgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLQBwLgBvLgBvLgBwLgBw + LQBwLgBvLgBvLgBvLQBwLgBwLgBvLgBuLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBv + LgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBw + LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLQBvLQBwLgBwLgBwLgBwLwBvLgBwLwBs + Kwbd1NDx8/Tx8vPx8/Px8/Tx8vXz9fecdWdxLgBxLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgB0LwddNGxEQe1IQOpHPupHPupHPupHP+pHPupH + PutHPupHPupHPupHPupHP+pHPupIPupHP+pIP+pHPulHPulHPulIP+pHP+lHP+pIPupHP+lHPupHPupH + PupHPupHP+pHP+lHPupIP+pHPupHPupHP+lHPupIP+pHP+pHPupHPupHP+lHP+pHP+pHPulHPupHPupH + PupHPulHPupHPupHPupGPu1XMolyLglxLwBwLwBvLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLwBwLwBw + LgBvLgBwLwBvLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBv + LgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLQBvLgBvLgBw + LgBwLgBvLgBvLQBvLQBwLgBwLgBvLgBvLgBvLgBvLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBv + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBv + LgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQCgfG/y9PXx8vPy + 8/Ty8vTx8vTt6+1oKQpxLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBx + LwBwLwBwLgBwLgBxLQBwLQBxLwFzLh5EPdtJQOlJP+lIPupIPupHP+lIP+pHPupIPupHPupHPupHPulH + PupHP+pHP+lHPupHP+pHPulHPulHP+lHP+lHPulHP+lHP+pHPupIP+lHPupIP+pHP+pIPupHPupHPupH + P+lHP+lHP+pGPupHP+pHPupHPupHP+pHPupHPulHP+pHP+pHPupIP+pHPupHPulHPulHPulHPulHPupI + PupHPes/Pe1pLj1xLwFwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLgBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBv + LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLQBwLgBwLgBwLgBwLgBvLgBv + LQBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv + LgBvLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBv + LQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw + LgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBv + LgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBtMhTz8fLy9PTy8vTx8vTx8/S8o55v + LABwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBx + LgBxLwBzKwVdNGxFQO1IP+hIPulIPutIPutIP+lHPulHPupIP+lHPupHP+pHPulHPupIP+pHP+lHPupH + PulHP+pHP+lIP+pHP+pHP+lHPulHPulIPulHPulIPupHPulHP+tHPupHP+lHP+pHPupHP+pHPulIPupH + P+lHP+lHP+lHP+pGPupHPulHPulIP+lIPupHP+lHP+lIPulIPulIPulHP+lIPupIPulHPelGPupLOq50 + LwxwMABxMABwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBxLgBwLwBwLgBvLwBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBw + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw + LgBvLgBwLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBv + LQBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLwBuKgHGsq3y8vTx8/Px8vTz9faNXkxvLgBvLgBwLgBwLgBv + LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBw + LgBvLgBvLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBxLwBwLgBvLgByKRZGOs9I + PulJPutHP+pHP+pHPupHPupHPulHP+pHPupIPupIP+pHPupHP+pIPupHPupHPulHPupIP+lHP+pIP+pI + PupHPupHP+pIP+pGPupHPupHPulHPupHPupHPulHP+pIP+pHP+pIPupHPulHPulIPupHPulHP+pHP+pG + P+lHPulHPupGP+pHPupHPupIP+lHPupHPupHPulHPupIPupIP+pHPulHPupCP+9kMmJxLwNvLwBvLgBw + LwBwLwBwLwBwLgBwLwBvLwBwLwBvLwBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLQBvLgBvLQBvLQBwLgBwLwBvLgBw + LgBvLgBvLgBvLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLQBv + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBvLgBv + LgBvLgBvLgBwLgBwLQBvLQBvLgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBv + LgBwLgBvLgBvLgBvLgBwLQBvLgBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBxLwGYa1z09ffx8/Tx8vPt6OduLxFwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBv + LQBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBwLgBwLgBwLgBvLgBw + LgBwLgBwLQBwLgBwLgBwLgBvLgBwLwBwLgBwLwBxLwBwLwBwLwBxLANlL1JDQPBIPutIPutIPupHPutI + PupHPulIP+pHP+pHPupIP+pIP+pHP+lHP+lHPulHPulIP+pIPupIPulHP+lIPulHP+pHPupHP+pHPupH + PupIPupHP+tIPulHPupHP+lHPupHPupHP+pGPulHPulHPupIP+lIPupHP+lHPupIP+pHPupHP+pHP+lH + PulHP+pHPupGP+lHPupHPupHPupHPupHP+pHPupIPulHP+tGN8pyLhJvLwBvMABxLgBwLwBwLgBwLwBw + LwBwLwBvLwBwLgBvLgBvLwBwLwBwLgBvLwBwLgBwLgBvLgBvLQBwLgBvLgBvLgBwLQBvLgBwLgBvLgBv + LgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLQBvLQBwLQBwLgBwLgBwLgBvLgBv + LQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLQBwLQBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBw + LgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBw + LgBwLwBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLQBv + LQBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBw + LgBxLwBxNBjw7/Hx8/Px8/TKubVsKQBwLgBwLwBwLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxLwBwLwBwLwBwLwBwLwB0LAhUNplIQO1IP+tIPupIPupHPupIPutHP+pHPupHP+pH + P+pHP+pIPulHPulHPupHP+pHP+pHPulHP+pHP+pIP+pIPupHP+pHP+pHPulIPulIPutIPupIP+lHPupH + P+lHPupHPupHP+pHPulHPupHPupHP+lHP+lGPulHPupHP+pIP+pHPutIPulIPulIPupHP+pHPulHPulH + PupHPupHP+lHP+pIPulIP+lHPulIP+lEPvFfMGBvLgJwLwBwLwBwLwBwLwBxLwBvLwBvLwBwLwBwLgBw + LgBwLgBvLgBvLwBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBv + LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBv + LgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBv + LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLQBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBwLQBv + LgBwLgBwLgBvLgBwLgBvLQBvLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBtKQHUxcLx + 8vTy9PSlgXVvLQBxLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwBw + LwBwLwBwLwBxLwBuLwByKhVEPNtGQOtIPulHPupHPutHP+lHPupHPupIPupHPupHP+pHPulHPupHPupH + PupIPupHPupGPulHP+pHPupIP+lHP+lHPulIP+lHPulHPulHPupIPupHPupIP+pHPulHPupHP+pHP+lI + P+pHPulHPupHP+lHPulHP+lHPulHPulHPupHPulHPupHP+pGPulHPupIP+pIPulIPupHPupIPulHPupH + P+lHPulHPupHPutIPupGOMV0LQhwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLwBvLwBxLgBw + LwBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBw + LgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLQBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBw + LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQCtjILy8/P09faETzhvLwBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLwBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLwBwLwBvLQBwLgBwLwBxLgBxLwBv + LgRpLkNEP+9HQOtIPutIP+tHP+pIPupHP+pHP+pHP+pHP+pHPulHPupHPupHP+pHP+tHP+pIPupIPupI + P+lIP+pIPupHP+lIP+pHP+pHP+pIPupHPupHPupHPulIP+pHPupIP+lHP+pHP+pHPupHPupHPulHPupH + PupHP+pHPupHPulHPupHPulHPupHP+tIP+pHPulHP+pHP+pHP+pHPupHPupIP+pIP+pHPupHPupHP+lI + PupEPu1mLUhwLwNwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLgBwLgBvLwBvLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBw + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBvLgBvLgBvLgBv + LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBwLgBvLgBv + LgBvLgBvLQBwLgBwLgBvLgBvLgBvLQBvLgBvLQBwLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBv + LgBvLQBwLgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLgBxLwBxMACMWkXy9PXt6elwMhVwLgBvLgBvLgBwLgBvLgBw + LgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgByLgNdMmdHP+5HP+pH + P+tHPupHPutHPupHPupHPupHPupHP+pIPupHPupIPupIPupHPupHPulIP+lHP+pHP+pHP+pIPulHPulI + PulHPupHPupIPulHP+pHP+pIPutIPupHP+pIP+pHPupHP+pIPupHP+pHPupHPupHP+pHP+lIPupHPupH + PutHPulHPupHPupHP+pHP+pHPupHPupHPulHP+pHPupHP+pHP+pHP+lHP+pHP+lJP+pHQepONax1LwZw + LwBwLgBwLgBwLgBwLwBxLgBwLgBvLwBvLgBwLwBwLwBwLgBvLwBvLgBvLQBvLgBvLQBvLQBvLgBvLgBw + LgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBvLQBvLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLQBvLgBwLgBv + LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLQBvLgBvLgBv + LgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBwLQBv + LgBwLgBvLgBwLgBvLgBwLgBxLgB2Oh/u7O3f2NZoJwBvLgBwLgBwLwBwLgBwLgBvLgBvLgBvLgBvLgBv + LgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLwBwLgBxLwBwLwBwLgBxLgBwLgBzLwZRN6ZHQO1IPuxHPupHPupIPupHPutH + PupHP+pHPulHP+pHP+pIP+pHPupHP+pHPupHP+pHPupIP+lHP+pHPupIP+pIP+lIPupHPupHPupGPupH + PupHP+pGPupIPupHPupIP+pHPupHPulHPupHPupHP+pHPulHPupHP+pGPupIP+pHP+lHP+pIPulGPupI + PupHP+pHPupHP+lHP+lHPulHP+lHPupHP+pIPulIP+pHPulHP+tIP+hDQOFtLihwLgFwLgBwLgBwLgBw + LgBwLwBwLwBvLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBv + LQBvLgBwLgBwLQBvLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBv + LQBvLgBvLgBvLgBvLQBvLQBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBv + LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBvLQBwLgBvLgBvLQBvLgBvLgBvLgBwLgBwLQBvLgBw + LgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLQBvLQBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBv + LQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBwLgBwLQBvLQBvLgBwLgBv + LgBwLgBwLgBoJwHj3NvAqqJtKgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLgBxLgB0LgdLN7pHP+pIQOpHPupHPupIP+pHPulGPupHPulHPulHPulH + PupHPupHPutHP+pHPulHPupHPupHP+pHPupHP+pIPupHPulHPupHPupHP+pHPupHPupHPulIPupIPupH + PupHP+pHPupHPupHPupIPulHP+lHP+pHPupHP+pHPupIPupHPupGP+lHP+pHP+pHPupHP+pHP+pHPupH + P+pHP+pHPupHPupHP+pHPulGP+lHPulHPulHP+xGQO5bNYNvLgNwLwBvLgBwLwBwLwBwLwBwLwBvLgBw + LgBwLgBwLwBwLgBwLwBvLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLgBwLQBvLQBv + LgBvLQBvLgBvLgBuLgBvLQBwLgBvLgBvLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBw + LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBvLQBvLQBw + LgBvLgBvLgBvLgBvLQBwLQBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLQBv + LgBvLgBuLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBrKQDE + sqyvkIpvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBw + LgBwLwBwLQBwLgBxLB5EPOFHQOdIP+lHPutIPupHP+pHPupHP+pHPupHPupHP+lGPulGPupHPupHPupH + PulHP+pHP+lHPulGPupHPupHPulHP+pHPupHPupHPupHPupHPupHPupHPupIPupHPulHPupIPupHPupH + PupHP+pHP+tIPupHPupHP+pHP+lHPulHP+pHPupHPupHPupHPupIPupHPulIP+lHP+lHPulHPupGP+pH + PupHPupHP+pHPupJPupGP+lJP+pMPL90LgtvLwBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLgBwLgBw + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBwLQBwLQBwLQBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLgBvLgBwLgBvLgBvLgBvLQBwLQBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBvLQBw + LgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBw + LgBvLgBvLQBvLQBwLgBwLgBvLgBvLQBwLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv + LgBvLQBvLgBwLgBwLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBxLgBxLwCylY2XalhwLwBwLgBw + LgBwLgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBw + LgBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLQBw + LSxBPfJIQOhHPuhIP+tHPupHPupHPupHP+lHPupHPupHPupGP+lHPulHP+lHPulHP+pHP+pIPulHP+pH + PulHPupHPutHP+pHPupHPupHP+pHPupHPulHP+pHPupIPupHPupHP+pHPupGPupHPulHP+pHPupIPupH + PulHP+pGPupHP+lHP+pHP+pHPutHP+pHPupHP+pHPupHPulHP+pHPupHPupGPupHPupHPupHPulHP+lJ + P+lIPuhHPupAPutuLidvLgFvLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBv + LgBwLQBvLgBvLQBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLQBwLgBwLgBvLgBw + LQBvLgBvLQBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBvLQBwLQBvLQBvLgBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBvLgBv + LgBwLgBvLgBvLgBwLQBwLQBvLgBwLgBvLgBvLQBvLgBvLQBwLgBvLQBwLgBvLgBvLgBvLgBvLQBwLQBv + LgBwLQBvLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBvLgBwLQBvLgBvLgBvLQBwLgBwLgBwLgBvLgBw + LgBwLgBvLgBvLgBvLgBvLQBwLgBwLQBvLgBwLgBwLgByLwCabl6MW0ZwLgBwLgBwLgBwLgBwLgBvLgBw + LQBvLQBvLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBxLgBvLQBwLgBwLwBvLy9APfFHPehHPehH + P+pHPupHPupHPepHP+lHPulHPupHPupHPulIPupHP+pIPulHP+pHPulHPupHP+pHPupHPulHPupIPupH + PupHPupHPupHPulHPulHPupHP+pHPupHPulHPulHP+lHPupHP+pHPulHPupHPulHPupHP+lHP+lHPulH + PulHP+lHPupHP+pHP+pHPupHPupHP+lHPupHPupHPulHPupIPupHPupHP+pGPulIPupHP+pHPulEQO1d + MnZxLgRwLQBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLQBvLgBwLgBvLQBvLgBvLgBv + LgBvLQBvLQBvLgBwLQBvLgBwLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBv + LgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLQBvLgBvLQBwLgBvLQBv + LgBvLQBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBwLgBv + LQBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBv + LgBwLgBvLgBvLgBvLQBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLQBwLgBvLQBvLgBwLgBv + LgBvLgBwLgBvLgBvLgBwLgBwLwBwLgCMW0h4QCVwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBvLgBwLgBw + LgBvLQBwLgBvLgBwLQBvLgBwLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw + LgBvLQBwLgBvLgBwLgBwLgBxLgBwLwBxLwBwLgBwLQBxLgJpLz1BP+9GPuhHPudHPupIPupIP+pHPupH + P+pHPulHPulHP+pHP+pHP+pIPulGP+lHP+pHP+lHPupHP+lHP+lIPupHPulHPupHPupHPupHPelHPupI + PupIPepHP+tIPupHPelHPulIP+tHPulIPulHPupHP+lHPelHPupHP+pGPepHP+tGPupIP+pHP+pIPupH + PupHP+pHPulHPulHP+lHPupIPupHPulHP+lHPupIPulHPupHP+pHP+lHPupIPexEOsl1LQRvLQBwLgBw + LwBvLwBwLwBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLQBvLQBwLQBvLgBwLgBwLgBvLQBvLQBvLgBwLgBv + LQBvLgBvLQBwLgBvLgBwLQBvLQBwLQBwLgBvLQBvLgBvLgBvLQBvLgBvLQBvLgBwLgBvLgBwLgBwLgBw + LQBvLQBvLgBvLQBvLQBwLgBwLQBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBvLgBvLQBvLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBwLQBwLgBvLQBwLgBwLgBvLgBvLgBwLgBv + LgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLQBvLQBvLgBvLgBvLgBwLQBvLgBwLgBv + LgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLQBvLQBvLQBvLQBvLgBwLgBvLgBvLgBv + LgBvLQBwLQBvLgBvLgBvLgBwLgBvLQBvLQBvLgBvLQBvLgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBvLQBv + LgBvLgBwLgBwLgB5PyVqJwlwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBvLQBvLgBwLgBvLgBwLgBwLgBwLQBvLQBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBwLwBwLgBwLwBvLgBwLgBvLwNhLFREQO9GPulHPudHPupIPulHPupHP+pHPupHPupHPupHP+lH + P+pIP+pHPupHPepIP+pIP+pHPupGP+lHP+pHPupHPupHPulHPulHPupIPutHPupHPulGPupHPulGP+pH + PupHP+pHP+pHP+pIPupHP+lIPupHP+lIPupHPupGPupHP+pHP+pHPepHPulHPutHP+pHPupHPupHPulH + PulHP+pHP+pHPupHPupIP+pIPupHPupHPupHP+pHPulIP+hDPuRxKxxuLQFwLgBwLgBwLwBvLgBvLwBw + LwBwLwBvLgBwLwBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBvLQBvLgBvLQBvLgBwLgBwLgBvLQBw + LQBvLQBvLQBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBwLgBwLQBvLgBvLQBvLQBvLgBvLgBwLgBw + LgBvLgBvLQBvLgBwLgBvLgBwLQBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBvLQBvLQBw + LgBwLgBvLgBvLgBvLQBvLgBuLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBwLQBvLgBvLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLQBvLgBvLgBwLQBvLgBvLgBv + LQBvLgBwLgBvLQBvLgBwLgBwLQBvLgBvLgBwLQBvLgBvLQBvLQBwLgBwLgBvLgBvLgBwLgBvLQBvLgBv + LgBwLQBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBwLwBp + JwhkHgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBw + LgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBwLgBwLgBwLwBwLwBw + LwBwLgBvLwBvLQNfLWFFQe5JPupJPulHPutIPupHPupHPupHP+pHPulHP+pHP+pHP+pHP+pHP+pHPulI + PulIP+lHP+lHP+lHP+pHP+pHPupHPupHPulGPupHPupHP+pHPupHPupGPupHPupHP+pHPupHPulHPupH + PulGPupHPulHP+lGP+lHP+pHP+lHPupHPupHPupGPupHPupIP+pIP+pHPupHP+pHPupHPulHPulHPulI + P+pIP+pHPupHPupHPutHP+lGP+pGQOtDQ/BlL1FwLgNwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLgBw + LwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBuLgBvLQBvLQBvLQBvLgBvLgBvLgBvLgBwLgBwLgBvLQBvLQBvLgBwLgBv + LQBwLgBwLQBwLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBw + LgBvLQBvLgBvLQBvLQBvLQBwLQBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBvLQBwLgBwLQBwLgBwLgBvLQBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBv + LgBwLQBvLgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBvLQBvLQBvLgBvLgBvLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBjIQBmIQBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBv + LgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBxLwBwLwBwLgBvLgBwLwBwLgRg + LWlFQPBHP+lHP+pHPupIPulHP+pHP+pHPulHPulHPupHPupHP+lHP+pHP+pHPulHP+pHP+pHPulHPupH + PulHPulHPupHPupIPupIPupHP+pHP+lHPupHPupHPulHPupIP+pHPupHPupHPulHPupIP+pHP+lHP+pH + PupHP+pHPupHPulHP+pHPupHPupHPupIP+pHPulHP+pIP+lHP+lIP+pHP+pIPulHP+pHP+pHP+pHP+pH + PupHPutHPupHPuxFP+5SNJxyLgVxLwBwLwBwLwBwLwBwLwBwLwBvLgBvLgBvLgBwLgBvLgBwLgBwLgBv + LgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLQBwLgBvLgBvLgBvLgBvLgBwLgBvLQBvLQBw + LgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBw + LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBv + LgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBv + LQBwLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBw + LgBvLQBvLQBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLQBvLgBw + LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBlIwBnIwBwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLwBvLgBvLgBw + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLQReLGxEP+5JP+hHPulI + PutIP+pHPupHP+pHPupHPupHP+pHP+pHPupIP+pHP+pHPupHP+pIP+pHPupHPupIP+pIP+lHPupHPupH + PutIPupHP+pHPupHPupIPulIPutHPupHPulHP+pHP+pHP+lIPupHP+pHPupHPulHP+pHPupHPupHPupI + PupHPupIPupHP+lHPupHPupIP+pHP+lHPupHPupHP+pIPupHP+pHP+pHPupHP+pHP+pIPupHPupGP+tI + P+tLOLtwLghwLwBwLgBwLgBwLgBvLwBvLwBvLgBwLwBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBv + LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLQBvLQBwLgBvLgBvLgBvLQBvLgBwLQBvLgBvLgBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLwBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBwLQBvLgBvLgBwLgBwLgBv + LQBwLgBvLgBvLgBwLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBw + LgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw + LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBpJQBqJABwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLQBwLgBwLgBw + LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLQBvLgBwLgBwLgBwLgBw + LgBwLgBvLQBwLgBvLgBwLgBwLgBwLwBwLwBvLQBwLgBwLgRdLWpEQO1IP+hHPupHPutIPulHPupHPupH + PupHPupHP+pHPupHPupHPulHP+lGPulHPulHPupHP+pHPulHPulHPupHPupHPupHPupIPupHP+pHPupH + PupHPupHPupHPupHPupHP+pHPupHPulHP+lHPupHPupHPulHPulHPupHPupHPupHPupHPupHP+tHPulH + P+pHP+pHP+pHPulHP+lIP+pHP+lHPupHPupIP+pHP+pHP+pHPupIP+pIPupGP+tIPuxDP+hxMCBwLwFw + LgBwLgBwLwBwLwBwLgBvLgBwLQBvLgBvLwBwLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLgBvLgBwLgBvLQBvLQBwLgBvLgBvLgBvLgBwLQBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBw + LgBwLQBwLgBvLgBvLgBvLgBwLQBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBvLgBvLgBv + LQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv + LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBwLQBvLgBw + LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBv + LQBwLgBwLgBwLwBsKABrKABwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBw + LgBvLwBwLwBwLgBwLwBwLgBwLgBwLwJnMFBEP/BHPulHPudHPupHPupHPupHPupHPupHPupHP+pHPupH + PulGPulHPupHPupIP+pIP+pHPupHP+lHP+lHPupHPupHPupHPupHP+pIPupHPupIPupIPupHPupHPupH + PupIPupHPupHPulHPupHPulHPupIP+pHPulIP+pIP+pHPupHPupHP+lHP+lHP+lIPupHP+pHP+lHPupH + P+pHPulHPulHPulHP+pHPulHP+lIP+pHP+lHPupHPupIPupHPupFPuxoLTlwLgJwLgBwLgBwLwBvLgBw + LwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLQBv + LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBwLgBv + LgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv + LgBwLgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLwBw + LABuKgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LwBwLgBwLwBvLgFvLzVBPfFJPedIP+lHPupHPupIPupHPupHPupHPulHPupHPulHPulHPupIPupIP+pH + PupHP+lHP+pHPulHP+pHPupHPupIP+pHP+pHPupIPupHPupHPupIP+pHPupHPupHPulHPulGPupHP+pH + PulIPupHPupGP+lHPupIPupHP+pHPupHP+pHPulHPupHP+pHPupHP+pHP+tHP+pHPulHPupIPupIPulH + P+pHP+pIPupHP+lHP+pHPulHPupHP+pIPutHP+xeM3pxMAZwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBv + LgBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLQBvLgBvLgBwLgBwLgBvLQBwLgBw + LgBvLgBwLgBwLQBwLQBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBw + LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBw + LgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBwLABvLgBwLQBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLwBxLwBwLwBwLwBwLgBxLgBwLwBt + Li9CP/NHP+pHPutHPupIPulHP+pHPupHPupHPupHP+tHP+pHP+pHPupGP+pIPulHP+lHPulHPulHPulH + P+lHPulHPupHPupIP+pHPupHPupHPupHPupHPulHPulHPulHPutHPutHPupHPulIP+pHPupIPupHP+pH + PulHP+pIPupHPulHP+pIPupHPupHP+pIP+pHPupHP+pHPupHPupGPulIP+pIP+pHPupIP+lIP+pHP+lI + P+pIP+pHP+pIP+pHP+pIPupTNJByMAVwLwBvLwBvLwBvLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLQBvLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBw + LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBw + LgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLQBvLgBv + LgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLQBvLgBvLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLQBvLgBwLgBwLgBxLwBvLQBwLgBvLgBvLgBwLgBwLQBvLgBw + LwBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw + LgBvLQBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBxLwBwLgBwLwBxLwBwLwBxLwFyLi5APvRIPupHPupH + PupHP+pHP+pHPupGPupHPulHPupHP+pHP+pHPupIP+pHPulIPupHPupIP+lHP+pHPupHPupHPupHPulH + P+lHP+pHP+lGPelIP+hIP+lHPulHPupHPupIPupHPulHPepHPulHPupHPulHPupHPulIPupIP+lHPulG + PulGP+lGP+lHP+lIPulHP+lHPupHPupHPupHPupHP+lHPulIPupIPupHPulHP+pHP+pHP+lHP+lHPutI + P+tJPelKOch0LghxLwBwLwBwLwBxLwBwLgBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLQBwLgBwLgBwLgBvLgBvLQBvLgBvLQBv + LgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBvLgBwLgBwLgBwLgBvLQBv + LQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLQBwLQBwLgBvLgBvLQBvLQBvLQBv + LgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLQBwLgBvLgBxLwBxMABxLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLQBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBxLwByLiVAPe5HPelHPupHPupHPupHP+tHP+pI + P+pHPulHPupHPupHPupHPupIP+pHPupHPulHP+lGPupHP+pHPulHPupHP+pHP+pIPupHPulHPepHQOtJ + PtlEPetHP+lHPupHP+pHPupIP+pIP+pHP+lHP+tHPupHP+pHPupHPupHPupHPupHPupHPupHP+pHPulH + PupHP+lHPupHPulHPupHP+pHP+pHP+lHPupHPulHP+pIP+lIP+lIPupHPulIPupHPupJP+tFPt90Lw1x + LwBxLgBvLgBwLwBvLwBwLwBvLwBwLwBwLwBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBw + LgBvLgBwLQBvLgBvLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLQBwLgBwLQBvLgBvLwBvLgBvLgBvLgBvLQBvLgBwLgBvLgBwLQBwLgBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLQBwLgBvLgBvLgBwLgBvLgBvLgBv + LQBvLQBvLgBvLgBwLgBvLgBwLgBvLQBwLQBvLgBvLQBwLQBwLgBvLgBvLgBvLQBvLgBvLgBwLQBvLgBv + LgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLQBwLgBwLgBvLgBwLgBvLgBw + LgBwLgBvLgBwLgBxLwBwLQBwLQBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLwBwLwBwLgBxLwBwLwBwLgBxLg9GOtNGPulHPupGP+pHPupHPutIP+pHPupHPulHPupGP+pI + PupHPupHPupHPupHPupHP+pGPulHPupIPupHPupHP+pHPupHPulHPulGP+pFQe5lMl9PN69GPepHPupH + PupHPupIPupHPupHPupIPupIPupHPupHPupHPupHPupHPupIPupIPupHPulHPupIPulHPupHPupHPupH + P+lHPupHP+pIPulHPupIP+pHPupHPepHP+pIP+pIPulIP+pGPutIPulDPOVvKRhwLgJwLgBxLwBwLgBw + LwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLQBvLgBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBvLQBw + LgBvLQBwLgBwLgBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLQBvLQBwLgBvLgBwLQBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBx + LwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw + LwBwLgBwLwBxLgByLAdNO7NFPehHPupHPupHPupIPupHP+pHPupGP+tHPupHP+lHPupIPupHPulHPupH + P+pHP+lHP+pHPupIPupHP+pHP+pHP+pHPupIPupHP+pDQe1lLlVhM25EPO9HP+tHPulHP+pHPupHPutH + P+pIPupIP+pHP+pHPupHPulHPupIPupIP+pHPupHPupHP+lIPupHPupHPupIPupHPulHPupHPupHPupH + PupHPupIP+lHPulHP+pHPulIPulIP+lHP+pIPulAPvBmLkpyLgVvLgBwLgBxLwBwLwBwLgBwLgBwLwBw + LwBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLQBwLwBvLQBwLgBwLgBwLgBwLQBvLgBvLgBwLQBwLgBwLgBvLgBwLgBwLQBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBv + LgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBv + LQBvLgBwLgBwLgBvLQBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBxLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLwBvMABwLwBwLgBvLwBxLwBz + LAdONqtHPupGPupHP+pIPupIPupHPupHPupHPulHP+tGP+pHP+pHP+pHP+tHPupHP+pHPupHP+pHP+lH + P+pHPupHP+lIPulIPupIPupJP+pFQfFiMFdpMDlEPu5HPulIPulIPulHP+pHPulHPupHPulHP+pHPupI + PulHPupGP+pIPupHP+lHPulHP+lHPupHP+pHPulHP+pHP+lHPulHPupHPupHP+lHP+pHPupHP+lHP+lI + P+lIP+lHP+lIP+lHPupHPupDP+5kMFtxMAZwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLQBw + LQBvLgBvLgBvLQBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBw + LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBv + LQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLQBwLgBwLQBvLgBwLgBvLgBw + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLQBwLgBvLQBvLgBvLgBvLgBwLgBv + LgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLwBxLgBvLgBvLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBw + LgBwLgBwLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBxLwByLQNXM35IQOxHPetI + P+pIP+pIP+lHP+pHPupHPupHP+pHPupHPupHP+pHP+pHP+pIP+pHP+pGPupGP+lHPupHPulHP+pIP+pI + P+tIP+tHPupDQvNlMlltLyRDPvJIP+lHP+lHP+lHPulHP+pIP+pHP+pHPupHPulHPupHPulHPupHP+pI + PupIP+pIPupHP+lHPupHPupHPupHPulHPupHPulHPupHPupHP+pIP+lHPulHP+lIP+lHP+lHP+lHPulH + PupHPupEP+5eMmtxLwRwLgBwLwBwLwBvLwBwLwBvLgBwLwBvLgBwLwBwLgBvLgBwLgBwLgBvLgBvLQBv + LgBwLgBwLgBwLgBvLgBwLQBwLgBvLgBvLgBwLQBwLgBwLgBvLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLQBwLgBwLgBvLgBvLQBvLgBwLgBvLgBv + LgBvLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBwLgBvLgBvLQBv + LgBvLgBvLwBwLgBwLgBvLgBwLQBwLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBw + LQBvLgBvLgBwLgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBvLgBvLQBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLQBvLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLQBvLQBwLgBvLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBw + LgBvLgBwLgBvLgBvLgBwLwBxLwBwLwBwLgBxLwBwLgBwMABxLwJlMVJCQPFHPupHP+pHPulHP+pHP+pH + P+pHP+tHPupHPupHP+pHP+lHPupHP+pHPupIP+pHP+lHPupIPupIP+pHPupHP+pIPupIPupHP+pDQfNj + MFpzMBtFPuVIP+lHP+pIP+lHP+pIPupHP+pHP+pHP+pHPupHPupHPupHPupHPulHP+pHPupHP+pHP+lH + PupHP+pIPulHP+pHPulHPupHP+pHPupHPulHPulIPupHPulHPulIPulHP+pHP+pIPupHP+pGPuxVNp1y + LQRwLgBxMABwLwBwLgBwLwBvLwBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBw + LgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLQBvLgBwLgBvLQBw + LgBwLgBwLgBvLgBwLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBv + LgBvLgBvLgBvLgBwLQBvLgBvLgBwLgBwLgBwLQBvLQBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBw + LQBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBvLQBvLQBvLgBvLgBv + LgBwLgBwLgBwLgBvLQBvLQBvLQBvLgBwLQBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv + LgBwLgBvLQBvLgBwLgBwLgBwLQBvLgBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgByLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLQBwLgBwLQBvLgBwLgBwLgBvLgBw + LgBwLwBwLgBwLwBwLgBxLgBwLwBwLgByLgJsMkRAP/FFQOpHP+lHPulHPupHPupHPupHPupHPulHP+lH + P+pHPupGP+pHPupHPupHPulHPupHPulIPupIPupHPupHP+lHPupHP+tHPupGQPJmNFl0MAtNOLNJP+lH + P+pIPuhHPupHPupHP+pHP+lHPupIP+lHPupHPulHPulHPulIPupHPulHP+lHPulHPulHP+pHPupHP+pH + PupHPupHPulHPupHPulIPupHP+pIP+lHP+lIPulHP+lIPulGP+pIPupIP+pNNsFzLgdxLgBwLwBwLwBw + LwBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBw + LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLQBvLgBwLgBvLgBwLQBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBw + LQBvLQBwLgBwLgBvLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBv + LgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBwLQBvLgBvLgBwLgBvLgBwLgBv + LQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBvLQBvLQBvLgBvLQBvLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBx + LgBvLABvLgBvLgBwLgBwLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBvLgBwLwBwLwBwLgBvLgBv + LgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBvLgBvLQBvLgBwLgBwLgBwLwBwLwBvLwBw + LgBwLgBwLgBwLgBwLQBxLBhEPd1JP+hHP+pHP+pIP+pHPupHPulHPupHPulGP+pIPulHP+pHPulHP+lH + PulHP+lHPulHPupHPupHP+pIPulHPupJP+lHPupIPupFQfFnM1pxMAhSNZpIP+pIP+lIP+lGPupIP+lI + PupHPupHP+pHPupIPulHPupHP+lHPupHPupGPupHPupHPulHP+pHP+pIPulHPulHP+pHPupHPupHPupH + PupHP+pHPupHPulHP+pHPupHPupHP+pHP+pIPupHPelIOcZzLQdvLgFwLwBwLgBvLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLQBvLgBwLgBvLgBvLgBw + LgBvLQBvLgBvLQBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLQBwLgBvLgBwLQBvLgBwLgBvLgBwLQBwLQBv + LgBwLgBwLgBwLQBwLgBwLQBvLgBwLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLQBw + LgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLQBvLgBvLQBvLgBvLgBvLgBw + LgBvLgBvLgBwLgBvLQBvLgBwLgBvLgBwLgBvLgBvLQBwLgBvLQBvLQBvLQBvLgBwLQBwLgBwLgBvLgBw + LQBvLgBvLQBwLgBvLQBvLgBwLgBvLgBwLgBvLgBwLQBwLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBv + LQBvLgBwLQBwLgBwLgBvLQBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLABwLgBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw + LgBvLQBwLgBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBxLwBwLgBwLwBwLwBxLgBx + LwB1LQ9JO9NHPutHPupHPupHP+lHPulHPupHPupHP+lHP+lIPulHP+tIPupHPupHP+pHPupHPulHPupH + PupHP+pHPulIPupIP+tHP+pIPutDQPFkNVpyLgRlMFhFP/FIP+lIPulIP+pHP+pIP+pHPulIPulHP+lH + P+tIPulIPulIP+pIP+tIPelGPupGPupHPupHPupIPupHPupHPupHPupGPulGPupHP+pIP+pHPulGPupI + P+lHPulHPupHPulHPulIPupIP+lIPc10LQVwLwBvLwBwLgBwLwBwLwBwLwBvLgBvLwBwLgBwLgBwLgBv + LgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLQBwLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBv + LgBvLQBwLQBvLQBvLgBwLgBvLgBvLgBwLgBvLgBwLQBvLgBwLwBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBvLQBwLgBv + LQBvLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLQBvLgBwLgBwLgBwLgBvLgBwLQBwLQBv + LgBvLQBvLQBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBxLgBvLABwLgBwLQBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBv + LgBwLQBvLQBvLgBvLgBwLgBwLQBvLgBwLgBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLwB2LwZQM5RFQOtI + P+pHPulHPulHPupHP+pIP+tHPupIP+pHPupHP+pHPupHP+lIPupHPupIPupIPupHPupHP+lHP+pHPupH + PulHPulHP+pGPu9jNFtwLgRvLTtFQOxHP+pGP+pIPulHP+pHP+pHP+pHPupHP+pIP+lIP+pHPupHPupG + P+pHPupHPulHPupHPupHPupHPulGPulHPupHP+pHPulHPupGPupHPulHP+lIP+lHP+lHPulHPupHPupH + PupGPulIPulDPuFzMBdyLgJwLwBwLwBwLgBvLwBxLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBw + LgBwLgBvLgBvLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBvLQBwLQBwLgBv + LgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBv + LQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBvLgBvLgBwLgBv + LgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBxLQBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBvLQBvLgBwLgBvLQBv + LgBvLQBvLgBvLgBvLgBvLgBwLwBwLgBxLwBwLwBxLwBwLwBwLQByLgVaNHVGQutHP+pHPupHPupHPupH + P+lHP+lIPulIP+pIP+lHPutHPupHPupHP+pHPupHPupHPulHP+lIPupHPupIP+lHP+xHPupHPepEP+9Y + M25xMAJxLRFHOdBIP+lHP+lHPutHP+pIP+pHPutHPupHPupHPupIP+pHP+lHP+lHPupHP+pHPulIPupI + PupHPulIP+pHPupHP+lHP+lHP+lIPulHP+lIP+pHPupHPulHP+pHPupHP+pGP+pHPupHPupHPupBPfFw + LS1uLgNwLwBwLwBvLwBvLwBvLwBwLgBwLgBvLgBvLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLQBvLgBw + LQBwLgBwLQBwLgBvLgBvLQBvLgBwLQBwLgBwLgBvLgBvLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBw + LgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLgBvLQBwLQBw + LgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLQBvLQBwLgBwLQBwLgBvLQBvLgBwLgBv + LgBwLQBwLQBwLQBvLgBvLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLQBwLgBvLgBvLQBwLQBvLgBvLgBwLgBvLgBv + LQBvLgBwLgBvLgBwLgBvLQBvLgBwLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBw + LgBwLgBwLgBvLgBwLgBvLABvLQBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLwBwLgBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBvLwBwLgBwLgBvLgBwLgBwLwBxLwByLQNoL0BBPu9HPupHPupHPupHP+lGPupIP+pHPupHP+pI + PupGP+tHPupIP+pIPupIP+pHPulHP+pHP+pHP+lHPulHPulHP+pGPupHPupEPu9VM4lzLwR1LglMOrdI + QOlIPulHPupHP+lIPupIP+lIPupIPulIPupHPupHPupGP+pHPulHP+lHP+pGPulIPupIPupHPupHP+pH + PupIPupIP+pHPupHPulHPupHP+pHPupIPutIP+pHPupHPulHPupIPupHPupBPvBsLTNwLwNwLgBwLwBw + LgBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLwBv + LgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LQBvLgBvLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBx + LwBxLQBwLQBwLQBwLgBwLgBwLgBvLgBvLQBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLwBvLgBwLgBwLgBvLgBwLQBvLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBvLwBwLwBwLgBvLwBwLgFzLCFAPe1HPulIP+lIPulHPupHP+lHPupIPupGPupHPulHP+pHP+pHP+pH + P+lIPulHPulHP+pIP+lHPupHP+pHPulHPepHP+pIPutHPu5SNZx1MARwMANfM3BEP/BGPulHP+tHPulH + P+lHP+pHPupIPupHP+lIPupIPupIPulHP+lHPupHPulHPupHPulIP+pHP+pHP+pHP+pHPulHP+pHP+lG + PupIPulHPupHPulHPupIPutHPulHPulHPupHPupIPupDQu9mLTdxLwJwLgBwLwBwLwBwLwBwLgBwLgBw + LwBvLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLQBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBwLgBwLgBv + LgBvLgBvLgBvLQBvLQBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBv + LgBwLgBvLgBvLQBwLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLQBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBxLgBwLQBwLQBwLgBv + LgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBvLQBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBx + LgBxLgB0LgxIN8FHPelGPuhHP+lGPepHPupHPulHPupHPutHPupHPupHP+pHP+pHPupHP+lHPulHP+pH + PulHP+pHP+pHPupHPupHPupHP+lIP+xNNq9zLQZwLwJsMUBBQO9HP+lHP+pHPupHPupIPupHPulHPupH + PulHPulHPupHPulIPulHP+lHP+lHP+pHP+pHPulHP+lHP+lHPulHPulHPupHPulIPupHPupHPulHP+pH + P+lHPupHPupHPulHPupHPulIPutFQPFhMWJxLwRwLwBwLwBvLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBw + LgBvLQBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBwLQBvLgBvLgBvLgBwLgBwLgBw + LgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw + LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw + LgBwLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBxLgBwLQBwLgBvLgBvLgBwLgBvLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBv + LQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBxLQBxLgZTNZVG + P+xIPupIP+lGP+lHPupHPulHP+pHPutHP+pHPutHPupHPupHPupHP+pHP+lGP+pHP+pHPupHPupHP+pH + PupIP+tIPupHP+pNN7RyLgdyLwBzLRdGPuFFPetGPupHPupHPupHPupHPulHPulHPupHPulHPupHPupH + PulHPupHPulHP+pHPupHP+pHPupHPulHPulHPulHPupIPupHPulHPupHPupHP+pIP+lIP+lHPupHPupH + PupHPepHPupGPu9ZM4dwLwZwLwBwLwBwLwBwLgBvLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw + LgBvLgBvLQBwLgBwLQBvLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBw + LgBwLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLgBv + LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw + LgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLQBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLQBvLgBwLgBwLgBvLgBwLQBvLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBv + LgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBvLQBwLgBwLgBv + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLQBxLgBvLwNnMEdDP+9IPulIPupHP+pH + PupGPupHPupHP+lHP+pHPulHPupHP+pHPupHPupHPupHPulHPupHPulHP+lHP+pHP+pHP+pIP+tHPupJ + N7d1MAdxLwBxLAZSNp1HPupIPupIPulHPupHPupHPulHPulHPupHP+lHPupHPupHPupHPulHPulHP+lI + PulHPupHPulHPupGPulGPulHPupHPulHP+lHPulHP+lHPulHP+pHPulHPulHP+pHPupHPupHPupIPu1W + NplxLgdwLwBwLwBwLwBvLgBvLQBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLgBvLgBw + LgBwLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBvLQBw + LgBwLgBwLgBwLgBwLQBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBv + LgBvLgBwLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw + LgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBvLQBwLgBw + LgBvLgBvLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBwLQBvLgBvLgBvLgBwLQBwLgBwLgBw + LgBwLgBwLgBwLgBxLgBvLABwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBwLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBw + LgBvLgBwLgBwLwBvLgBwLwBwLgBwLgBwLQBwLgBwLgJuLSlAPOlIPupHP+tGPulHPulHPupHPupHP+tH + P+lHP+tHP+pIPupHP+pHPupHPupHPulHP+pHPupHPupHP+lHPupIP+pHP+pJP+tFOMV1LgpyLgBwLQNj + MlpCQPBHPulHPupJP+lHP+lHP+pIP+pHPulIPulHPupHP+pGPupGPupHP+pHPulGPulIPupIPulHPulH + P+lHPulGPulGPupHPulIP+pHPupIPupIPupHPulHPupHP+pHPupHPulHPupIPetQNqJ1LgZxLgBwLwBw + LgBvLgBvLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLwBvLgBwLgBvLQBw + LgBwLgBvLgBwLQBvLgBwLgBwLgBvLQBwLgBwLgBwLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBv + LQBwLgBwLgBvLgBwLwBvLgBwLgBvLQBvLgBwLgBwLgBvLQBvLQBvLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv + LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBv + LgBvLgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBx + LwBwLQBwLgBwLgBwLwBwLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw + LwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLwBvLgBvLgBvLgBwLgBvLgBvLgBwLwBxLwBwLwBv + LgBwLwBwLwBwLwBwLgBwLgBwLwB1LQpJOcpKP+pGPutIP+pHPupHPupHPupGP+lIPutIPupHP+tHPulH + P+pHPulHPulHP+lHPulHP+pHP+pHPulHPutHPupHPupIPepDON1wLRxxLgBzLwF0Lys+QO1HPulHPuhH + PulIPupHPupHP+lHPulHPelHP+lGPulHPulGP+pHPulHPulIPupIPupHP+lHPupHPulHPulHPulHP+lH + P+lHP+pHP+lIP+lHPulHPulHP+pHPupHPupHP+lHPulHPutNObdzLgdwLgBwLwBvLgBvLgBwLgBwLgBv + LwBvLwBwLgBwLgBvLgBwLQBwLgBvLgBvLgBvLgBwLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBwLgBwLQBwLgBvLgBvLgBv + LgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLwBwLgBvLgBvLgBv + LgBwLgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBw + LQBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBxLwBwLQBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLgBw + LgBxLgBwLwBxLgZYM39FPexHP+lIPupHPupHPupHPupHPupHPulHPulHPupGPepHP+lHPulIP+lHP+lH + P+pIPupHPupHPutIPupHPupIP+pIP+pAPe9xLzByLwBzLwJ0LwtNO7pHPulIPupHPulHPupHP+pIPulH + PepHP+pHPupHP+pHP+pHPupHPupIPulHP+pHPulHPupHPulHPulHP+lHPulHPupHPupHPulHPulIPulG + PupHPupHPulHPupHPulGPulHPupIPulHOtlxLhJwLwBvLwBwLwBvLgBxLwBwLwBwLwBwLgBvLgBwLgBw + LgBwLgBwLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBw + LwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LwBwLQBwLgBvLQBvLgBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLgBvLgBwLQBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLQBwLQBvLgBv + LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBvLwBwLwBvLwBwLQBwLwBxLgBwLQVo + MktDPO9JPutHPupHPulHPelGPupHPupHPupHPulHP+pHPupGPelHPulHPupHPupHP+lHPulHPupHPupH + PupHPupHPupIPulCPfRtLDVwMABwLgByMAVeMWxEP+1HPelHP+pIPupHPupHP+pHPupHPupHP+pHPulH + P+pHP+lHPulHPulHP+pHPelHP+pIPulHPulIPulHPupHPulHPulHPupHPulHP+lHPupIPulHPupGPupH + PupHP+pHPupJP+lGPOVyLRhvLwBvLgBwLwBvLwBwLgBvLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLQBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBw + LgBwLQBwLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBv + LQBvLQBvLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLQBvLgBwLQBvLgBvLgBwLgBwLgBvLgBvLQBvLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLQBvLgBvLQBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBxLwBwLQBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBv + LgBwLgBvLgBvLgBvLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBw + LgBvLQBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBxLgF2LBdCPOJIP+pGP+tI + PupIP+pHPupHPutHPupHPulHPupHPepHPulIP+lHP+pHPulHPulGPupHPulHP+pHPupHPulGPupIPutB + PvNrLz5yLgFwMABwLwJuMDJEPOdHQOlIPulHP+lIPupHP+pHPulIPupHP+lHPulIPulHP+lHPulHP+lH + PupHPulHPupHPulGPupHPupHPulHPulHPupHP+lHPupHPupHPupGPulHPulHPupHPulHPupGP+lGPOxE + P+ZvLRtwLgJwLwBvLwBwLgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLQBwLgBwLQBwLgBwLgBwLgBw + LgBvLQBwLgBvLgBvLgBwLgBwLgBvLQBvLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBvLgBvLgBvLgBw + LgBvLgBvLQBvLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBw + LgBwLgBvLgBvLgBvLQBvLgBvLQBvLgBwLgBwLgBvLgBvLQBvLgBvLQBvLQBwLgBvLgBwLQBvLgBvLgBw + LgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLQBvLgBv + LgBvLgBvLgBvLQBvLgBvLQBwLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBv + LgBvLgBwLgBwLwBxLgBuLABwLgBwLgBwLgBvLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLgBxLgBzMAhRNp9JPulHPupIPupIPupGP+lIP+lH + P+pIPupHPupHPepHP+lHPulHP+lHPulHP+lHPupHPulGPupHPupIPulHPupHP+tFPu9hMGxxLgJxLgBx + LwBzLwxMN7dJP+hHPuhHPupIP+pHP+pHPupHPupHPulHPupGPupHPulHPupHPupHPulHPulGPupHPupH + PupHPepGPupHPulHP+pHPupHPupHPulHP+pHPulHPulHP+lIPulHPupHPelHPupCP+pqLzZyLwNwLwBw + LwBvLwBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBv + LgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLQBw + LgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLwBwLgBwLgBwLgBv + LgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLQBvLgBvLgBv + LgBwLgBvLgBvLgBvLgBvLgBvLgBwLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLQBv + LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBx + LwBwLABwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBw + LgBwLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBwLQBwLgBvLQBwLgBvLgBvLgBvLgBvLgBwLwBwLwBwLwBw + LgBwLwBwLgBwLgBwLgBwLgBvLwBwLwBxLgVfMWZEQe5HPupHPupHPupHP+lGPupHP+pHPupHPupHPulH + PupHPulHPupHPulHPupHPulHPepHPulGP+pHPupHPupHPulGP+pZMo1yLgRxLwBxLwBxLwRhMlxGQexJ + P+lIP+pHPupHP+pHPulHPupHPupHPupHPulHPupHPupHP+pHP+lHPupHPupHPulHPulHPulHPupHPupH + PulHPupHPupHPulHPulHP+pHP+lHPulHPupHPulHPulHPupEQO1iMFtxLwZwLwBwLwBwLwBwLwBwLwBw + LwBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLQBvLgBw + LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBwLgBwLQBwLgBvLQBwLgBwLgBwLQBvLgBwLwBwLgBvLgBwLgBwLQBwLgBvLgBwLgBw + LgBvLgBwLQBvLQBwLgBvLQBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBw + LgBwLQBwLgBvLgBwLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBwLgBvLgBvLgBvLgBvLgBwLgBw + LgBwLgBwLgBvLQBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBv + LgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLQBv + LgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLgBw + LgBwLgBwLgBxLwBwLwJxLSxAQe9HP+lHP+pHPupHP+pHP+lHPutHPulHPupIPupHP+pHP+pHP+lHP+lH + PupHPupHPupHPulHPupHPupIPupHPepJPulUNZV1MARxLgBxMABxMAFzLxdFPNlGP+pHPulIPupIP+pH + PupHPutGPulHPupHP+pHPupHPupHP+lHP+lHPupHPulGPulHPupIPupHPulHPulHPupHPupHPupHPupH + PulIPulHPupGPulHP+pHPulHPelIPuhEQe1gMmlwLgdwLwBvLwBvLwBwLwBwLwBvLwBwLgBwLgBwLgBv + LgBvLgBwLgBvLgBwLgBwLQBwLgBvLQBwLgBvLgBwLgBwLQBvLQBvLQBvLgBwLgBvLgBwLgBvLgBwLQBw + LgBwLgBvLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBvLgBwLgBvLgBwLgBw + LgBvLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBwLgBwLgBwLgBv + LgBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLQBv + LgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBw + LgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBxLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBz + LgB1KgxHOclIPepHPutHP+pHPupHPupHPupHPupHPulHPupHP+pHPupHP+pIPulIPupHPupHPupHPupH + PupHPupIP+pJPupIPuhHOMF3MAlwLwBxLwByLwB0LQdZNZFEQe1HP+pIPupIP+pIP+pHP+pHP+lHP+lH + PupHPupHP+lIPupHPupHPupIPupHP+lHP+lHP+pHPulHPupHP+pHPupHPupIPulHPupIPupHP+lHPupH + PulHPupHPulHPutFP+taM3tyLwRwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBvLwBw + LgBwLgBvLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLQBwLQBvLgBw + LgBwLgBwLgBvLgBwLQBvLQBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLQBwLgBvLQBvLgBwLgBv + LgBvLgBvLgBwLgBvLQBwLQBwLQBvLgBvLgBvLgBwLgBvLQBwLQBwLgBwLQBwLgBvLgBvLgBwLgBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBwLgBwLgBvLgBv + LgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBv + LgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBwLQBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBv + LgBvLgBvLgBwLgBwLgBwLwBwLgBwLgBxLwBwLQBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBv + LgBwLgBwLQBvLgBvLgBwLgBvLwBvLgBwLgBwLgBwLgBvLgBvLgBwLQBvLQBwLgBwLgBvLgBvLQBvLgBv + LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBwLgBwLwBwLwBwLgBxLgB0LQVSM4xGPuxI + PutHPulHPupIPutHP+pHPupHPupHPulHPupHP+lHP+lHPulIPupHP+pHP+pIP+pHPupHPupIPupHPulH + PutBO+Z1LxJxLwBwLwBwLgBvLQNuLzBBP+dHPulIP+pIP+pIPupHP+pIPupIP+pHPulHPupHPulHPulH + PupHPulHPupHPulIPulHP+tHPupIP+pHP+pHP+pHPupHPupHP+pHP+pIPulHPupIPulHPupHPulHP+lH + QOlPNbJzLQdwLgBvLwBuLwBvLgBwLgBxLwBvLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLQBwLgBvLgBv + LgBwLQBvLQBvLgBvLgBwLQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLQBwLgBvLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLQBvLQBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLQBwLQBwLgBwLgBvLgBw + LQBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLQBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLQBwLgBwLgBv + LQBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBwLgBvLQBvLgBwLgBwLgBvLgBvLgBvLQBwLgBw + LgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBwLgBwLgBwLQBvLgBwLgBvLgBv + LQBwLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLQBwLQBwLgBvLgBwLgBvLgBwLgBw + LgBwLgBvLgBwLgBxLwBwLQBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBwLgBvLgBv + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBw + LgBwLgBwLwBwLQBwLgBwLgBvLgBwLwBwLgBwLwBwLgBxLwBxLQByLwVrLT9CPe1HPupIPupHPulHPupH + P+pHP+pHP+pIPupHPupHPupHP+pHPulHPupHPulHPupHP+pHP+pHPulHPupHPetIPepAPOpxLBpxLwBx + LwBxLwBwLwByLQlQNqdHP+tIPupIP+pIP+pIP+pHP+pHP+lHP+pIP+pHPulHPupHPulHP+lHP+pHPulH + PupHPupHPupHPupHPulIP+pHPupHPupHPupIPulIPulIPupIP+lHP+lHPulGPutGPupJPNJ0LgtxLgBw + LwBvLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBw + LgBwLgBvLgBvLQBvLgBwLgBvLgBwLQBwLgBwLgBvLgBvLQBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LQBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBvLgBvLgBwLgBvLgBv + LgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBvLgBvLgBwLgBv + LgBwLgBvLgBwLgBwLQBwLgBwLgBvLQBwLgBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBv + LgBvLQBvLgBwLgBvLgBvLgBwLQBvLgBwLgBvLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBx + LwBwLABvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBvLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLQBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBwLgBw + LwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBxLwBxLwFyKw5EOtdHPupIP+tIP+lGPupHPulHPupHP+pHPupH + PupHPulHPupIPupIPupIPepHPupHPulIP+lHPupHPepIPulGPutFPe9oLk5wLwNxLwBwLwBwLgBxLgRr + MTxDPutHPupJPupHP+pIPupIPupIPupHP+pHPupIP+pHPulHPupHP+lHPupHPupHP+pIP+pHP+pHP+lH + P+lGPupIPulIPupHPulIP+pHPulHPupHPupHPupHPulIP+tHP+hEO9hyLQ9xLwBwLgBxLwBxLwBwLwBx + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBvLQBvLgBwLgBvLgBvLgBvLgBv + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBvLgBvLQBwLgBwLgBvLgBwLgBvLgBvLQBvLgBwLgBvLgBv + LgBwLgBwLQBwLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBvLQBw + LQBwLgBwLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBw + LgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBv + LQBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLQBvLgBvLgBvLgBv + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBw + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLwBvLwBwLwBwLgBx + LgBwLwBxLgBxLgBvLwBwLgBxLAdXMY5HQOxIPetIPupHPupHPupHP+pIPupHPupHP+pHPupHPupHPulI + PupHPupHPupHP+pHP+pHPulHPupIPelJP+lHP+1gMm1yMARwLwBvLgBvLgBxLwBxLQlQNa9IPulJP+pH + PulIPupHP+lHPupHP+pIP+pHP+pHPulHPupHP+lIP+pHPupHPulHPupHP+lHPulHPulHP+pHPulIPulH + PupHP+lHPulIPupIP+lHPulHPulIPupHP+lBPOtsLyxwLgNwLgBxLgBxLwBwLgBxLwBwLgBwLgBwLgBw + LQBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLQBwLgBwLQBwLQBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLQBwLgBvLQBwLgBvLgBvLQBvLgBwLgBwLgBv + LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBvLgBwLgBwLgBvLgBwLgBvLgBw + LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBw + LgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLQBwLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBvLgBw + LQBvLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBv + LQBvLQBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBxLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBxLwBwLwBw + LgBwLgBwLQNqMEJEPelHPupIP+lHPupHPepHPupHP+pHP+pHP+tHPutIP+pHPupIP+pHP+pHP+pHPetH + PupIPupIPupGPuhIPuhIP+laMnxyMANxLgBxLgBwLgBwLwByLgNtLzpCP+lKP+pJP+pIPulHP+pIPulH + PupHPupHPulHP+pHP+pIP+lHP+pIPulHPulHP+lGPupHPulIP+lIPupHPupHPelIP+lHPulHP+lHPulH + PulIPupHPepHPulHP+lCPu5pLkJxLwRwLwBwLwBwLwBxLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLgBvLQBvLgBvLgBvLgBvLQBwLQBwLgBvLgBw + LgBwLgBvLgBwLgBwLQBwLgBvLgBvLgBvLQBvLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBv + LgBvLQBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLQBw + LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBv + LQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBwLgBv + LQBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBvLgBvLQBvLgBwLgBv + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBvLQBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBvLQBv + LgBwLgBvLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLQF2LhVH + O9JJPulIP+pIPupHPupHPepHPupIPupIPulHP+lHPupHPupHP+lHPulIPupIPupHPulHPupHPupHPupH + PuhHPulJObx2LwVyLwBwLgBxLgBwLgBxLgB1LgZROadGQO5HP+tIPupIPupIP+pIPupHPupHPupHP+pI + PulHP+pIP+pHPupHPulHPupHPulIPulHPulHPulHPulHP+lHP+lHPulIPulIPupIP+lHPupHPulHPulI + PupEPu5mLktyMQRxLwBwLwBxLwBvLwBvLwBwLgBwLgBwLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBvLQBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLQBwLgBvLgBwLQBwLQBwLgBvLgBvLQBvLQBwLgBvLgBwLgBv + LgBwLQBvLQBwLgBwLQBvLgBwLQBvLQBwLgBwLgBvLgBwLQBvLgBvLQBwLgBvLQBvLgBvLQBwLgBvLgBv + LQBvLQBvLQBvLQBvLgBwLgBwLgBvLQBvLQBvLgBwLQBvLgBvLgBwLgBvLQBwLgBwLgBvLgBvLgBvLQBw + LgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBv + LgBvLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBv + LgBvLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLQBvLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBxLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgB0LAVYNYhFPu5IPupIP+pH + P+pIPupGP+pHPupHPupHP+pIPupHPulHPulIP+pHPupIPupHPupHPupHP+pHPupHPupHPupIPMl2Lwdv + LgBvLgBxLwBxLwByLwByLwNvMCNGQeVHP+tHP+pIP+pHPulIPupHP+pHPupHP+pHPulIP+lHPupHP+pH + PulIPupHP+pHP+lHP+pIPupHPulIP+pHP+pHP+lHP+lHPulIPupHPupHPupHPulHPulGP+1VMpNzLwZw + LgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBv + LgBvLQBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBwLgBvLQBwLQBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv + LgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBv + LgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBv + LgBvLgBvLQBvLQBvLQBvLQBvLgBwLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBx + LgBvLQBvLgBwLgBvLgBwLgBwLgBvLQBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLgBwLQBwLgBvLgBwLgBwLgBwLwBvLwBw + LwBwLwBwLgBwLwBwLwBwLwBxLgBwLgBwLwBwLwBwLwBwLgNrLTFCP+1IPupIPupIPupHPutHPulHPutH + PupHPupHPupHP+pHP+pIP+pHP+pHP+pHP+pIPupHPupHPupHPupGPupCPeRvLSlvLwFvLQBxLwBxLgBx + LwBzLQB0LgVdNnpFP+1HPupHPupHP+tHPutHPulHPupIPupIP+lHP+pHPulHPupIP+lIP+lHP+pHPulH + PupHPulHP+lIPulHPupHPupHP+lIPulHPulHPupHP+pGPulHP+lIP+hPOqx0LgdxLwBwLgBwLwBxLwBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBvLQBvLgBwLQBv + LQBvLQBwLgBwLQBvLgBvLgBvLQBvLgBvLQBvLgBvLgBwLgBwLgBwLgBvLgBvLQBvLgBwLgBvLgBvLgBw + LgBwLgBvLgBvLgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLQBvLQBvLgBwLgBw + LgBwLgBvLgBvLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBv + LgBwLgBvLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBvLgBvLQBwLgBv + LgBvLgBvLgBvLgBvLgBvLQBwLgBwLgBwLQBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBv + LgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLQBwLgBvLQBvLgBwLgBwLQBwLgBxLgBuLQBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLwBw + LgBwLgBwLwBwLgBvLgBwLgBwLgBvLgB1LQVMO75HP+tHPulIPupIPulIP+lHPupIP+pHPupHPupHP+pH + P+pHPupIP+pHPulIPupHPupGPulGPulHPupHPupBPfBrMEdxLgFwLgBwLgBwLgBwLwBxLgByLQF1LRJL + O8NHPetIPupIP+pHPupIP+pIPupIP+lIP+pHPupIPupIPupHPulHP+pHPupHPupHP+lHP+pIPulHP+pI + P+pIP+lHP+lIPupHPulHPulHPulGPepIP+pHPehIOcJ0LghxLwBuLwBwLgBwLwBvLwBwLgBvLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLQBwLgBwLgBwLQBwLQBwLgBvLgBvLgBvLgBwLgBwLQBvLgBvLgBwLgBvLgBvLgBwLQBvLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBxLgBvLQBwLgBwLQBwLgBvLgBwLgBvLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw + LgBvLwBwLgBxLQByLwRkMlpDQO5IPupIPupHPulIP+pHPulIP+pHPupHP+lHPupIPupHPupHPulHPupH + PupHPupHPulHPupGPepHPepEPu5eMmpvLQJvLQBwLgBwLgBwLgBwLwBxLwBwLgNvLzxCPedIQOtHP+pH + P+lHPupHPulIPupHP+pHP+pHPupHPulHPulIPupHPulHPulHPulHPulHPulHPulHP+lHPulHPulIPupH + PulHP+pHPulHPepHPepHPelAPOp0MCFwLgFwLwBwMABwLwBwLwBwLgBwLgBwLQBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBv + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBv + LgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLQBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLABvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLgBwLwBwLgBw + LAByLhJEO9hIP+pIPupHPulIP+lHPupIP+pHP+lHP+pHPulHPupIPupHP+pHP+pHPupHPulGPupGPupH + PupHPupHPuxQNKV1LgRvLgBwLwBxLwBwLwBwLgBwLgBwLgBxLwVgM29FQPBHPupIPupHPulIPupHP+pI + PulIPupHPulHPulIP+pIPupHPupHP+pHPulIPupHP+lHPulIP+lHP+lHPupHPulIPulHPulIP+pHPupI + PupHPuk/Pu5uLClwLgFwLgBvLwBxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBwLgBwLgBw + LwBwLgBvLgBwLQBvLgBvLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxLgBwLwBvLwBvLwBvLgBwLwBwLwBvLwBwLgBwLgBwLwBwLABwLgByLQVcNH9FPu5H + P+tIP+pIPupIPupHPupHPupHPulHPupHPupHPupHPupHPupHPupHPulHP+pHPupHPupHPupHP+tFOMZ1 + Lw1wLQBxLwBwLwBwLwBwLgBwLwBwLwBvLgB1LQ1VOqVFP+5HPupHP+pIPulHP+pHPupHP+pHPulHP+pH + P+lHPupHPulHP+pHPulIP+lHP+pHP+lHPupIP+pHPupHP+lHPulHPulIPupIPutIPulHPupIP+1fMFpx + LwRwLwBxLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv + LgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBwLQBwLgBwLQBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBv + LgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBv + LQBwLQBvLgBvLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBx + LgBwLQBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLwBxLwBwLwBv + LwBwLwBvLwBwLwBwLwBwLwBxLwBxLwBxLwBwLwBwLwBwLgBwLgBwLgFxLR9EPNxIP+pHP+lIP+pIPupI + PupIPulIPupIP+pIP+pHPupGPupHPupHPepHPepIPulHPupHPupIPupDPew/P+xyLR5vLgBxLwBwLwBx + LwBxLwBwLwBwLwBwLgByMAFyLRNLOrVFP+9FP+tIPutHPupHPupHPulIPulHPupHPupHP+pHPupHPulH + P+pHPupHPulIPupIPulHPulHPulHP+lHP+pHPepHPulHPepGPupHPupGP+9YMn1xLQZuLwBxLwBwLwBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLQBwLgBwLQBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBw + LgBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLABwLgBwLgBw + LgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBxLgBwLwBx + LgBwLwBxLgBwLgBwLwBwLwBxLwBwLgBxLgByLwByLQRZM4lFPu5JPulHP+pHPupHP+lHP+pHPupHPupH + PulIP+pIP+lGP+pGPupHP+tHPepGP+pHPelIPupGPetDPO9nMFBwLwVxMABwLwBxLwBxLwBxLwBxLgBx + LgBxLwBwLgFyLx1GPM9HQOxHPulGP+lHP+lHP+lHP+pHPulHPupHPupIP+pHPulHP+pHP+pHPupHPupH + PupIP+lHPupHPupHPulIPupGPulGPupHPupHPutIP+1LN7JzLgpvMABwLwBwLwBwLgBwLgBwLgBwLgBw + LgBvLQBvLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLQBvLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLQBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv + LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBv + LgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLwBw + LgBwLwBwLgBwLwBwLwBwLwBxLQFwLSBDPeNHPutIPupHP+pHPulHPulHPulHPupHPupHPupIP+pHPupH + PupHPupHPupHPupHPupIPutGPuhEP+1ZL4NvLQZxLwBxLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBzLwFw + LypGO9BGQO9IPutHPupHPupIPupIP+lHP+pHP+pIPulHPupHPupHPulIPulIPulHP+pHPupHPupHP+pH + P+pHPupHPulHPupHPupHPupIP+tFPN5zLhRxMQBxLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLQBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLQBvLgBv + LgBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLQBvLgBwLQBwLgBwLgBw + LgBwLgBvLQBwLgBvLgBvLgBvLgBvLgBvLQBvLQBwLgBwLgBvLgBwLQBwLgBwLgBvLgBwLgBvLQBvLgBv + LgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBvLgBvLQBvLQBvLgBvLgBvLgBwLgBvLgBvLgBwLgBw + LgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBxLwBxLABwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBvLgBvLgBwLgBwLgBvLgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLQBw + LwBwLwBvLgBxLQVcNn9DP+5IPutHPutIP+pHPupHPupHPupHP+pHPupHP+pHPutHPupHP+pIPupHPupI + PutHP+pHPulIPupLO790LQZxLwBxMABwLwBwLwBwLgBwLwBxLgBxLwBwLgBwLgBxLgJwLydJOL9EQO5H + PetHPupGPupHP+lIP+pIPulHPupHPupHPupHPupHPupIPutHPulGPupHP+pHPepHPupHPupHPupHP+pI + PupHP+pIQO1CP+ptMi9xMAJxLgBwMABwLgBvLgBwLgBwLwBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBv + LgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBwLQBwLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLQBvLgBvLQBwLgBwLgBwLgBvLgBwLQBv + LgBvLQBvLgBvLgBwLQBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBvLQBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBv + LgBvLgBwLgBvLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBvLgBvLgBvLgBw + LgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLwBxLQBvLgFz + LRZIO8xIPupJPulIP+pIPupHPupHPupHPupIPepHPupHP+pIPupHPupHPupHPupHPupIPupHPupJPupF + POJ0MBVxLgFwLgBxLwBwLwBwLwBxLwBxLgBwLwBwLwBwLwBxLwByLQJzLRZPN65EPu5HQOpHP+pIPulI + PupHPupHP+pHPupHP+tHPupIPutHPutHPupHPupGPutIPupHPutHPupHPupHPutHPupHPupHP+tDP/Bj + L1duLgRwLgBwLwBwLwBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLQBwLgBvLgBwLgBvLgBwLgBwLgBvLQBwLgBv + LQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLQBvLQBwLQBvLgBwLgBvLgBwLgBwLgBvLgBwLwBvLgBvLgBvLgBw + LgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLQBv + LQBvLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLgBvLgBvLQBwLgBwLgBwLgBwLgBwLgBw + LgBxLABwLgBwLgBvLgBwLgBwLwBvLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLwBvLgBwLQBwLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBw + LwBvLgBwLgBwLwBvLgBwLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLQByLgByMARkMl9EPu5JP+lI + QOhIPulHPupHPupHPupHPutHPepHPulHPupHPupHPutHPupHPutIPupHP+pHP+pEQPFoLVVxLwNwLgBw + LgBwLgBwLwBwLwBwLwBxLwBxLgBwLwBxLgBxLwBwLgFzLQheMnJCPOZGPuxGPulIPupHP+lHPupHPupH + PupHPelHPupHPetHPupIPupHP+pIPupIPutGPupHPupHPupIPupHPupHP+xGQOtWMpJxLwZwLwBwLwBw + LwBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLQBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLQBwLgBwLgBvLQBw + LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBv + LgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw + LgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBv + LQBwLQBwLQBvLgBwLgBvLgBvLgBvLgBvLQBvLgBvLgBvLQBwLQBvLgBwLgBvLQBvLgBvLgBwLgBvLgBv + LgBvLQBvLQBvLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBxLgBwLgBvLgJzLQRUMZJFP+pIPulHPulHPulIPulI + P+lHPulHPulHPupHPepHPupJPutHPelHPulIPulHPulIPupGPutPOrZyLAVxLgFwLgBwLgBwLwBwLwBw + LwBvLwBwLwBvLgBwLQBwLgBxLwBxLwBwLQJ1LglgNWxGPtdEPu9HQOpGPepHP+pHP+pGPetGPupGPutH + PetGPetHPepHPutHPutHPupHPutHPutIPupHPepIP+xHPutJO8p0LA9wLgBwLwBwLwBwLgBvLgBvLgBw + LgBwLgBvLgBvLgBwLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLQBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLQBvLQBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBvLgBvLQBvLgBv + LgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBvLgBwLQBvLQBvLgBvLgBvLgBv + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBxLwBvLQBwLgBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBvLgBvLgBvLQBv + LgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBvLgBwLgBvLwBwLgBwLwBwLgBwLwBv + LwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBzLRlIP8lDQulEQ+pFQ+lFQulFROtEQ+tEQ+tEQ+pD + Q+lDQulDROtFQ+lFQ+lFROtEROpEROlGROlBQuJpLzFyLQJxLQBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw + LwBwLgBwLgBvLgBwLgBwLgBxLQR2LxVmL09SOaZHPc5BQepDQutDQelCP+lCP+pFQetEQelDQOlDQOpD + QepDQelEQupDQepDQepDQelHROlEQ+o9RutsLy9xLwFxLwBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBw + LgBwLgBwLgBvLQBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBv + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBvLgBvLgBwLgBwLgBvLgBvLgBvLQBvLgBvLgBvLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBwLgBvLgBw + LgBwLgBvLQBwLgBvLQBwLgBvLgBvLQBvLgBvLQBvLgBvLgBvLQBwLgBvLgBwLQBwLgBvLgBvLgBvLgBv + LgBvLgBvLgBwLQBvLgBwLgBvLgBwLQBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBv + LgBvLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLQBwLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLgBxLgBwLwBvLwBwLwBwLgBwLwBw + LwBwLwBwLwBwLgBwLQByLgB0LwF0LxR1MyB0MiB0MSB0MCB0MB90MB90MSB1MCBzMCBzLiBzMCByMCB0 + MSBzMCB0MSB0MCByLyBzMR9zLwpyLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBxLwBvLgBw + LQBwLwByLgByLgFzLgNzLQZxLhB0MB9yMSB0MiB0MSBzMiB0MSB1MCB1MSB0MSB0LyB1MCB0MSByMiB0 + MiB0MiBzMiB0MSBwLh9wLgdxLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLQBw + LgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLgBvLQBvLgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBv + LgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBv + LgBwLgBwLgBvLgBxLgBxLQBwLQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBxLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLgBw + LgBvLgBxLQBxLQFyLQFxLgFvLQFwLgFxLwFwLwFwLgFxLgFxLQFxLgFwMAFzLwFzLgFyLgFxLgFxLgFx + LQFyLgFxLQBwLgBwLgBwLwBxLwBwLwBwLgBwLwBwLwBvLwBwLwBwLgBxLwBwLgBwLQBwLgBwLwBwLgBx + LwByLAByLgFwLQFxLQFyLQFwLgFwLQFzLgFzLQFxLgFyLgFwLgFyLQFxLgFyLwFyLwFxLwFxLwFvLgFu + LgFvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBvLgBwLgBvLgBvLgBvLgBvLgBwLwBw + LgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLQBvLgBvLgBvLgBvLgBvLgBvLgBv + LgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLQBwLgBv + LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBvLwBwLgBwLQBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBx + LgBxLQBvLgBwLgBvLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLQBvLgBwLgBw + LgBvLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBvLwBwLwBwLwBwLwBwLgBwLwBvLwBvLwBvLwBwLwBvLgBwLwBwLgBwLgBwLgBvLgBwLwBwLgBwLgBx + LQBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLwBwLwBwLgBxLgBwLQBxLgBwLgBwLwBx + LwBwLwBwLwBwLwBvLwBxLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLwBwLgBxLgBwLwBwLgBxLwBx + LwBwLgBxLgBxLQBxLgBxLgBwLgBxLwBxLgBwLgBxLgBwLgBwLwBwLgBwLwBwLgBwLgBxLwBwLgBxLwBw + LwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBv + LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLQBwLQBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBvLgBv + LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBxLgBvLQBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBvLgBwLwBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBvLwBwLgBwLwBv + LgBwLgBwLwBwLgBvLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBvLwBwLwBwLgBxLwBwLwBwLgBwLgBwLgBw + LgBwLgBwLwBwLwBwLgBwLwBxLwBwLwBwLgBxLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBx + LwBwLgBvLgBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBxLwBwLgBxLwBwLgBwLwBwLwBx + LwBwLwBwLwBxLgBwLwBxLwBxLgBwLwBxLwBxLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLQBvLgBvLgBw + LgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLgBwMABwLwBvLwBwLgBvLwBvLgBvLgBwLwBw + LwBwLgBvLgBwLgBvLgBwLwBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBxLwBwLwBwLwBwLgBwLwBw + LwBwLwBwLwBvLwBxLwBwLwBwLwBwLwBxLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLgBwLwBwLgBx + LwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBxLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBvLgBwLgBwLgBw + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLQBvLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBxLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBv + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBv + LgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBw + LgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBwLgBvLwBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLQBv + LgBwLgBvLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBw + LwBvLgBwLgBwLwBwLgBwLwBvLwBwLwBwLwBvLgBwLwBvLgBwLgBwLwBwLwBwLgBvLgBwLwBvLwBvLgBw + LgBwLwBwLwBwLgBvLgBvLgBvLwBwLgBwLgBwLgBvLgBwLwBwLwBvLwBvLwBwLgBwLwBwLwBvLgBwLgBv + LwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBxLwBw + LwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBxLgBwLwBwLwBwLwBxLwBx + LwBwLgBxLwBwLwBxLwBwLwBwLwBxLgBwLwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBw + LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLwBwLwBxLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBw + LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBv + LwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBvLgBvLgBwLwBwLgBv + LwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBvLgBwLwBwLwBw + LwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLwBw + LgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLwBwLgBw + LgBvLgBwLwBvLgBwLwBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBx + LwBxLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLwBvLgBvLgBwLgBwLgBwLwBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBx + LgBxLwBxLwBwLwBxLwBwLwBwLwBwLwBwMABwLwBxLwBwLwBwLgBwLwBxLwBxMABwLwBwLwBwLwBxLwBx + LwBxLwBxLwBwMABwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwMABwMABwMABwLwBwLwBwLwBwLwBxLwBx + LwBxMABwLwBxLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBvLgBwLgBwLwBvLgBwLgBwLwBwLgBvLgBwLwBv + LwBwLgBwLgBvLwBwLwBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLwBw + LwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBw + LgBwLwBwLgBvLgBvLwBwLgBvLwBvLgBvLgBwLgBwLgBvLgBvLwBwLwBwLwBvLwBvLgBvLwBwLgBwLwBw + LgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBx + LwBwLwBwLwBwLwBwLwBvLgBvLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBxLwFxLwJwLANv + LARvLAZuKgZuKwZuLARvLwJxLgJwLwFwLwBwLwBwLgBwLwBwLgBvLQBwLgBwLgBwLwBwLwBwLwBvLgBw + LwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBvLQBvLgBvLgBvLgBwLgBxLwBwLQBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLwBwLgBvLgBwLwBw + LgBvLgBvLgBwLwBwLgBwLwBwLgBvLwBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBvLwBwLgBvLwBw + LgBwLwBvLwBwLwBwLgBvLwBvLwBwLgBvLgBvLwBwLwBvLwBwLgBwLwBwLgBwLwBwLwBsKAdpJAtpJAtp + IwtqIwtqJAtpJAtrJAtqJAtqJAtqJAtqJAtrJAtqJAtrJAtqJAtrJAtqJAtqJAtqJAtqJAtqJQtqJAtq + JAtqIwtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqJAtqIwtrJAtrIwtrJAtrJAtqJQtpJAtrJQtt + KgVwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLwBwLgBvLgBvLwBvLwBwLwBwLgBvLgBw + LwBwLwBwLwBuKwFsJwJsJwJtKAJsKAJsKAJsKAJsKQJsKAJsJwJtKAJsKAJsKAJvLQFwLwBwLwBwLwBw + LwBtKgJsJwJsJwJsJwJsJwJrJwJsKAJtKQJrKAJsKAJsJwJsJwJrJwJtKwFwLQBvLgBwLwBwLwBvLgBv + LwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBw + LgBwLgBtKQFrJgJrJwJrJwJrJgJrJwJrJwJrJwJsJwJsJwJsJwJsJwJsJwJuLAFwLwBwLwBwLwBwLgBw + LwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgFrKANmIwpxNCCBUkuUZlmlg3qwko+zl5Wvko6k + gXiRYlaCU0xxNB9mIgltKQJvLgBwLwBxLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLwBw + LwBwLwBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBvLgBvLwBwLwBwLgBvLgBvLwBwLgBwLwBv + LgBwLwBvLgBwLgBwLgBvLgBwLgBwLwBvLwBvLwBvLwBvLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBvLgBw + LwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBvLgBwLwBwLwBwLwBuKgO0l5Lu6Obt5+Tt6OXt6OXt5+Tt6OXt + 5+Tt6OXt6OXt6OTt6OTt5+Tt6OTt6OXt6OTt6OXt6OTt6OTt6OXt6OTs6OTt6OTt6OXt6OXt6OTt6OXt + 6OTt6OXt6OXt6OXt6OXt6OXt6OTt6OXt6OXu6OXu6OXt6OXu5+Xt6eXt6OXu6OWccmlyMAFwLwBwLwBw + LwBwLwBvLgBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLwBvLwBvLgBwLgBvLgBvLgBwLwBwLgKRXknA + opC/oJC+oJC+oZC+oJC+oJC+oJC+oJC9oJC9n5C/oZG/opGAQyVxLwBxMABxMABuLAKheGi/n4+/n5C/ + oJC/oI++oJC/oJC+oZC+oJG/oJC/oJC/opC/oZCOX05yMQNxLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBv + LwBvLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLwBwLwBxLwBvKwWpg3G+n5C+ + oI++n5C/oJC/oJC+oJC/oJC+oJC/oZC/oZDAoZG+npCIUDdwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw + LwBxLgBxLgByLgJqKAVtMhmTaFq8opvm39/y7+75+vr4+vv3+fr2+Pr2+Pr2+Pr2+Pn3+Pr4+fry7+7k + 3Nu5nZeMXFJnKxBuLAVxLgBwLwBxLwBwLgBwLwBwLgBwLwBwLwBvLgBvLgBvLgBwLgBvLwBwLgBwLgBv + LgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBxLgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBvLgBvLwBvLwBwLwBvLwBvLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBvLgBvLgBv + LwBvLwBwLwBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBvLwBwLgBwLgBwLgBvLgBvLgBw + LgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBtKgO3npz19/j19/j1+Pn1+Pj29/j2+Pn1+Pj2+Pj1+Pn19/j1 + +Pj1+Pj1+Pj1+Pj1+Pj09/j1+Pj19/f2+Pj2+Pn2+Pn1+Pj1+Pj2+Pj19/j1+Pj2+Pj1+Pf2+Pj1+Pj1 + +Pj1+Pj1+Pj19/j1+Pn1+Pj1+Pn19/j2+Pj2+Pj1+Pn2+PegeXRxMAFwMABwLgBwLwBwLgBvLwBwLwBw + LwBwLgBvLwBvLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLQSngHX3+fr2+Pr1+Pn1+Pn2 + +Pr2+Pr2+Pr1+Pn19/n1+Pr1+Pn4+PmFTzhxMABwLwBxLwByLwKdfHT19/j2+fr2+Pn19/n2+Pn1+Pj2 + 9/n1+Pn19/j2+Pn1+Pn19/jJuLJrKQVxMABwLwBwLgBvLgBvLgBvLgBvLwBwLgBwLgBwLwBwLwBvLgBw + LwBvLgBvLwBvLwBwLgBwLwBvLwBwLwBwLwBvLgBwLwBwLwBxLwBvNCDu7Or1+Pn29/n2+Pn1+Pj1+Pj1 + 9/n29/j2+Pn2+Pn1+Pn29/n39/h1PidxLwBwLwBwLwBwLwBvLwBvLgBwLgBwLgBwLwBxLwFrJwh+Sz+/ + rKju7Ov4+fn2+fr1+Pn2+Pr1+Pj1+Pn1+fn1+fj1+Pn2+fr1+Pn1+Pn2+Pn2+Pr2+Pn2+Pn4+frq5+Ww + lI9wOSpvKQVxLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBw + LwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBvLwBw + LgBvLgBvLgBvLgBwLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLwBuKQO4n5z1+fj1+Pn1+Pj1+Pn1+Pn1+fn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn1 + +Pn1+Pn2+Pn1+Pn2+Pj2+fn2+Pn2+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn2+Pn2+fj2+Pn2+Pn1+Pr2+PmgeXRxLwFxLwBvLgBwLwBwLgBvLgBvLgBwLgBwLwBwLwBvLgBv + LwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgOlf3T2+vv2+Pr2+fr2+Pr2+fr2+Pr1+Pr1+fv1 + +Pn1+Pn0+Pn3+fqFTjdyLwBwLwBxLwByMAB6RjL19vX2+fn2+Pr2+Pr2+fr2+Pr2+fn2+Pr1+fr2+Pn1 + +fr19/no4t9rLRFwLwBwLwBwLgBwLgBvLgBwLgBvLwBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLwGKX1T3+Pn2+Pr1+Pn2+Pr2+Pn2+Pr1+Pn2+Pn1+Pr2+Pn1 + +Pr2+Prk3dpmIgJxLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBuLAFxOSa/q6r39fb2+fr2+Pr1+fn2+fv1 + +Pr2+fr2+fn2+Pn2+Pj2+Pr2+Pn2+fr3+Pn3+fr2+fn2+fj2+Pn2+fr3+Pr2+Pr4+frx7Ouph4NrKg5x + LgBwLwBwLwBwLwBwLgBwLwBvLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBw + LgBxLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBvLwBvLwBwLwBw + LgBwLgBwLwBwLwBwLwBvLwBwLwBwLwBvLgBvLwBvLgBwLgBvLwBwLwBwLgBvLwBvLwBwLwBwLwBwLwBw + LwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBu + KgO5oJz1+Pn1+Pn1+fn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n2 + +Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pr1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn2+Pr2+Pn1+fn2 + +Pn2+Pn2+Pr3+PmfenRwMAFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBw + LgBwLgBwLwBwLgBwLwBwLwBxLgOmfnP3+fv2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr4+fuF + TjhxMABwLwBxLwBwLgBoKArh2tf3+vv2+Pn2+Pn2+Pn2+fr2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn29/iDUUJx + LwBxLwBwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBw + LwBwLwBwLwBwLwBvLwWvlJD2+fr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pr1+Pn2+Pr2+Pn2+Pn3+Puxl5FwLwJw + LwBwLwBwLwBwLwBwLgBxLwByLwBrLg+igXjw7ev2+fr2+Pr2+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2+Pn2 + +Pn2+Pn1+Pn2+Pr1+Pn1+Pr2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn19/n4+vvb0M9+TD1vLgRwLgBwLgBw + LgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBxLwBxLABwLQBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLQBvLgBvLgBvLwBw + LgBwLgBwLwBwLwBwLgBwLwBvLgBvLgBwLgBwLwBwLwBvLgBwLwBvLwBwLgBvLwBwLwBwLwBvLwBwLwBw + LQBvLgBwLgBvLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBuKwO4n5v1+fr1+Pn2 + +Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pj19/j1+Pn29/n1+Pj1+Pn1 + +Pn2+Pn19/n1+Pn1+Pj1+Pn1+Pj2+Pn29/r1+Pj2+Pn1+Pn2+Pj1+Pn1+Pr1+Pn1+Pj1+Pn2+Pr2+fmf + eXRwLwFxLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBvLgBvLwBvLgBwLwBw + LwBwLwBwLgOmf3T2+Pr2+Pr1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn4+vqFTzhxMABwLwBxLwBw + LwBvLAazm5f2+Pr2+Pn1+Pn1+Pr1+Pn1+Pn2+Pn1+Pj2+Pn1+Pn2+Pn2+fmpioFuLAFwLwBwLwBwLwBw + LgBwLwBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLwBwLwBxLwBq + KwzZzsr2+Pv2+Pn2+Pn1+Pn19/n2+Pn2+Pj2+Pn1+Pn1+Pn1+Pn3+PmKX1JwLgBwLgBwLgBvLwBvLgBw + LQBxMAFtLxjFsqz3+Pj29/n2+Pn2+Pn1+fn1+Pn2+Pn2+fn2+Pn2+Pr2+Pn19/n2+Pn2+Pn1+Pr2+Pn2 + +Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pj1+Pj1+fj3+Pnw7uySZl1uKQRvLgBwLgBwLgBwLwBvLwBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLQBwLgBxLgBwLABwLgBvLgBvLgBwLgBwLgBvLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLwBwLwBwLwBvLgBwLgBw + LgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBw + LwBvLgBwLwBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLwBwLwBuKgO5oJv2+fn1+Pn2+Pn1+Pn1+Pn2+fn1 + +fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+fn29/n2+Pj2+Pj2+Pr1+Pn19/n19/n1+Pj1+Pj2 + +Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pr2+Pn1+Pn1+Pn1+Pn2+fmheXRwLwFxLwBwLgBw + LwBwLwBvLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgOlf3P3 + +fr2+Pr19/j19/n1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn4+fqFTzhxLwBwLwBwLwBwLwByMAKIWU34+vz2 + +Pr2+Pn2+Pr2+fn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+PnVxsNoIwFwLgBwLwBwLwBwLgBvLwBvLgBvLwBv + LgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBxLgBxLwBxLwB2Pibz8/L2+Pv2+Pn2 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pnv7etsMBhvLgBwLgBwLwBwLgBwLgBwLwBtMxvXy8j2+fr2 + +Pn1+Pn2+fn2+Pn2+fn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn2+fn2+fn2+Pn2+Pr29PaZb2duKgJxLgBwLgBwLgBvLgBvLwBvLgBwLgBwLgBv + LgBvLgBvLgBvLgBvLgBvLQBvLgBvLgBwLgBwLQBwLQBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLwBvLwBwLwBvLgBwLwBvLwBvLgBvLgBwLwBwLwBvLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLwBvLwBvLwBvLgBwLgBwLwBwLwBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBvLwBw + LgBwLgBxLgBwLgBvLwBwLwBxLwBxLwBvKgO5npv1+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pn19/n19/n2+Pn1+Pn1+Pn1+Pn2+Pn1+Pr1+Pn2+Pj1+Pn1+Pn1+fr19/n1+fn19/n1+Pn1+Pn1+Pn2 + +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+fr1+Pn2+Pn1+Pn2+PihenRwLwFxLwBwLwBwLgBwLgBvLgBwLwBw + LwBwLgBwLwBwLwBwLwBvLgBwLgBvLgBvLwBwLwBwLgBxLwBwLgBxLwBwLgSlfXX2+Pr1+Pn1+Pj1+Pn1 + +Pn1+Pn1+Pn19/n1+Pj1+Pn1+Pn4+fqETjdxMABvLwBwLgBwLwBwLgBvMx3t6uj2+Pr1+Pr2+Pr29/r2 + +Pr1+Pn2+Pn1+Pn1+Pn2+Pn2+Pr19PJxNhxwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLwBwLwBw + LwBwLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBxLwBxLwGUa2L4+fr1+fn1+Pn2+fn2+Pr2+Pn2+Pn1 + +Pn2+Pn29/n2+Pr19/jFtbNrKwhwLwBwLwBvLgBwLwBxLwBrMhvUyMj3+fv1+Pn19/n2+Pn2+Pr2+Pn1 + +Pn2+Pn1+fr1+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pr2+fn1+Pn1 + 9/n1+fn1+Pn29/n2+Pr2+Pn2+PeNZFluLQNwLgBwLwBwLgBwLgBvLwBvLgBwLgBvLgBwLgBwLgBwLgBw + LQBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBv + LwBwLgBwLgBvLgBvLwBvLgBwLgBvLwBwLwBvLwBwLwBwLgBvLwBvLwBwLwBwLgBvLwBvLwBvLwBwLgBw + LgBwLwBwLwBvLgBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBwLwBwLwBwLgBw + LgBvLwBwLgBwLwBvKgO4n5v1+Pn2+Pn2+Pj1+Pn2+fn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj1+Pn1 + +Pn1+Pn1+Pn1+Pn2+Pn2+Pj29/j2+Pn1+Pn1+Pn1+Pn19/n2+Pn2+Pj1+Pn1+Pn29/n1+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pr2+PmhenRwLwFwLwBwLgBwLwBwLwBwLwBvLgBvLwBvLgBwLwBwLwBw + LwBwLgBwLwBvLwBwLwBvLgBwLwBwLwBwLwBxLwBwLQSmf3T3+fv1+Pr1+Pn19/n2+Pn19/n1+Pr1+Pj1 + +Pn1+Pn1+Pn4+fqETjZxLwBwLwBwLwBwLwBwLwBrKAjKuLX1+Pn2+fn2+Pn1+Pn19/n19/n1+Pn1+Pn1 + +Pn2+Pj2+fn3+vyQY1dxMAJwLgBwLgBwLwBvLwBvLgBwLgBvLwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBw + LwBwLgBvLgBvLgBwLgBvLwBwLgBtKwK9qKT2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj2 + +PidenFwLwNwLwBwLwBxLwBwLwBrKgbBr6v3+fn2+Pr2+Pr2+Pn1+Pn1+fn2+Pr2+Pn2+Pn2+Pn2+Pr1 + +Pn2+Pr1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj1 + +Pj19/n1+Pns6ud3Pi1wLgFvLgBvLgBwLgBwLwBvLwBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBw + LgBxLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLwBwLgBw + LwBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBw + LgBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBu + KgO5n5z2+Pr1+Pj1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn29/n1+Pn2+Pn1+Pn1+Pn19/n2+Pn1+Pj2+Pn1 + +Pn2+Pn2+Pn1+Pn1+Pn2+fn1+Pj1+Pn19/n2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pr1 + +Pn1+Pn2+Pn2+PmgeXRxLwFwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBw + LwBwLwBwLgBwLgBwLwBwLwBwLgOlf3T3+fr1+fn1+Pn1+Pn2+Pn1+Pn1+Pn19/n19/n19/n1+Pn4+fqF + TjdxLwBwLwBwLwBwLwBxLwByMAOfd3D3+fr29/n1+fn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+fq4 + oJ1sKQNwLwBvLwBwLwBwLwBvLgBvLgBwLwBwLwBvLwBwLgBwLwBwLwBwLgBvLwBvLgBvLgBwLgBwLgBw + LgBvLwBwLwBmIwPs6OX1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Prz8vJ1QzJxLwFwLwBw + LgBvLwBuKwGYcGP3+Pj2+Pr2+fn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pj2+Pn2+Pr2+Pn2+Pr2+Pr2+Pn2+Pn2+Pr1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+PnQ + xMFnLA9wLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgByLwBwLQBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBw + LgBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLwBvLwBwLwBwLwBvLgBwLgBvLwBwLwBwLgBw + LwBvLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLwBuKgS5n531+Pr1+Pn1 + 9/n29/n1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pj1+Pj19/n1+Pn1+Pj2+Pn1+Pn1 + 9/n2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pj1+Pj1+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn1+Pn2+Pn19/n2+Pmg + eXNxLwFxLwBxLgBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLwBv + LgBwLwBwLQSmf3X3+fv2+Pr1+Pn1+Pj1+Pn19/n1+Pj1+Pn19/n19/n19/n4+fmFTjZxMQBxLgBwLwBw + LwBwLgBwLwB5Qy/29vT2+Pr2+Pr1+Pj1+Pn1+Pn1+Pj1+Pr1+Pn1+fn1+Pr1+Pnh2dZoJgpxLwBvLwBw + LgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBvLgBvLgBvLgBvLwBwLgBwLgBwLgBwLwF/Sjb3 + +Pj1+Pj1+fr2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pj2+Pn1+Pnb0M1qKg9wLwBwLwBwLgBwLgBwMBzt5+X2 + +fr1+Pn2+Pn1+Pr2+Pn1+Pn1+Pr2+fr2+Pn2+fn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pr1+Pn19/n19/n1 + +Pn1+Pn1+Pn19/n1+Pn1+fn2+fn2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pr2+Pn29viVcGpwLgFxLwBw + LgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLwBvLwBvLgBvLgBwLwBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBw + LgBwLwBwLwBwLwBwLwBwLwBwLgBvLgBvLgBwLwBwLgBvLwBuKgS5oJ31+fr1+Pj2+Pn1+Pn2+Pn2+fn1 + +Pn2+Pr1+Pj19/n2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn1+Pj19/n1+Pn2+Pn29/n2+Pn19/n1+Pn1+Pn19/j1 + +Pn1+Pn19/j1+Pn29/n2+Pn1+Pj1+Pn29/j2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+fqgeXNxLgFwLwBwLwBw + LwBvLgBwLwBwLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLgSmgHX3 + +Pv2+fn19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn4+fqETzdxMABwLwBwLwBwLwBwLgByMABrJwbe + 1dP1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+fr2+fn4+ft1Pi1xMAFwLgBwLwBwLwBwLgBwLwBw + LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLgBvKwGlhHn4+vv1+Pn2+Pn1+Pn2 + +Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+PmxlJBtLARxLwBwLwBwLgBtKQSylpD3+Pr2+Pj1+Pn2+Pn2+Pn1 + +Pj2+Pn1+Pn2+fn2+Pn1+Pj1+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn19/j1+Pn1 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn09/nh3dxnKQtwLwBwLwBvLwBvLgBvLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBvLgBwLgBwLwBvLwBwLgBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBv + LgBwLwBwLwBvLgBwLgBvLwBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLwBwLgBwLwBvLgBwLwBwLwBuKgO5n5z1+fr1+Pj1+Pn2+Pn1+Pn2+fr2+Pj2+Pn29/n29/n1 + +Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn19/n1+Pn1+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn2+Pn29/n2+Pn19/n2+PmgeXRxLgFwLwBwLgBwLwBwLwBwLgBwLgBw + LwBvLwBvLgBwLgBvLwBvLgBwLgBwLwBwLgBvLwBwLwBwLwBvLgBwLwBwLgOmf3T2+fr2+Pn1+Pn1+Pn1 + +Pn1+Pn1+Pn19/j1+Pn1+Pn19/n4+fqFTzhxLwBwLwBvLgBvLgBwLgBxMABvLAGykon4+vr2+Pn2+Pn2 + +fn1+fn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pide3VyLwRxLgBwLgBwLgBwLQBwLgBwLgBvLwBvLgBvLgBw + LgBvLQBwLgBvLgBvLQBwLgBvLgBwLgBwLgBxLwBqKQXOvLb2+Pr2+fn2+Pn2+Pn1+Pn2+Pn19/n1+Pn2 + +Pn1+fn1+Pn4+vqIVkhyMAJwLwBwLgByLwBuNCDv7er2+fr2+Pn2+fr1+Pn2+Pn19/n29/n2+Pr2+Pn2 + +Pn1+Pn1+Pr2+Pn2+Pn2+fv29vbs6unYysLFsq/Arq7Cr63Nvbfp4+Ly8vD3+fn2+Pn1+Pj1+Pn2+Pn2 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn4+vqSZltwLwFwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBw + LwBwLgBwLgBwLgBxLwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LwBvLwBwLgBwLwBwMABwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBv + LgBwLwBwLgBvLwBvLgBwLwBwLgBwLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBwLgBvLwBwLgBwLgBvLwBw + LgBvLgBwLwBwLwBuKwS5oJz2+fn1+Pj2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn29/n19/n1+Pn1+Pn1+fn1 + +Pn1+Pn1+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pr1+Pn1+Pj1+Pn1+fn1+Pn2+Pn2+Pn19/j2+Pn1+Pj1+Pn1 + +Pn1+Pn1+Pn2+Pn19/j1+Pn1+Pn2+PqgenRwLgFxLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBwLwBwLgBv + LgBwLwBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLgOmfnT2+Pr1+fn1+Pn1+Pj1+Pn1+Pn19/j19/j1 + +Pj19/n19/n4+fqFTzlwMABwLgBwLwBwLgBwLgBxLgBxLgCIV0P4+/r2+Pr1+Pn1+Pn2+Pn2+Pn1+Pn1 + +Pn1+Pn1+fn2+Pn1+PnIu7hiKBpoKhhpKxhoKhhoKRhoKhhnKRhoKxhmKhhnKRhnKRhoKRhnKhhoKhdn + KRdoKhhpKhhnKRhnKRhoKhhoMCXs5+f2+fr1+Pn1+Pr1+Pn1+Pn1+Pn19/j1+Pn2+Pn1+Pn2+Pnx7utn + KBFwLgBwLwBwLwByLwSdeXP29/n2+Pn1+fn2+Pn19/n1+Pn1+fn2+Pn2+fn2+Pn2+fn1+fn1+Pn3+fvv + 6+uymZSFV0hsMh1pKAlqJwZrKQdsKAdqJwdqLRh4QzWgf3jg2Nf3+fn1+fn1+Pn1+Pn19/n1+Pn2+Pn2 + +Pn1+Pn2+Pn1+Pn1+Pn2+fnPwLtqJQVwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLQBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLwBwLgBwLwBwLgBwLgBw + LgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBvLwBvLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBw + LwBvLgBvLgBwLwBvLgBvLwBvLgBvLgBvLgBvLgBwLwBwLwBvLgBvLgBwLgBwLwBvLwBwLgBwLwBwLwBu + KQO5n5z2+Pn1+Pj2+Pn29/n1+Pn2+Pn19/n2+Pn1+Pn1+Pj19/n1+Pn19/j2+Pn1+Pn2+Pn1+Pn1+Pj1 + +Pn2+Pj2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pj29/j1+Pj1+Pn1+Pn2 + +Pn1+Pn1+Pn2+PmgeXRxLwFxLwBwLgBwLgBwLwBvLgBvLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLwBv + LgBwLwBwLgBwLgBwLwBwLgBwLgOlf3P3+fr2+Pn2+Pn19/n1+Pn2+Pn2+Pj1+Pn1+Pn1+Pj19/r4+fqF + TjhxLwBvLQBwLwBwLwBwLgBxLgBwLgBpKgzv6+r2+fn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1 + +Pn39vbs6uzt6+zt6+zs6+3t7Ozt6+3t6+zt7O3t7Ozt7Ozt6+vt6+zu7Ozu6+zt7Ozt7Ozt7Ozt6+vt + 6+zt6+vv7u72+Pn2+Pn2+Pn2+fn2+Pn2+Pn19/n2+Pj1+Pn2+Pn29/n1+PnItrNrJgNwLwBwLgBwLwBq + KArYzsv29/n2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pr2+Pn2+fn1+Pn2+Pn4+vvIt7FxNyFvLARxMAJwLwBw + LgBxLwBwLwBvLgBwLgBxLwBxLwFuLQNqLROrjIP3+Pj2+Pn1+Pn1+Pr1+Pn1+Pn19/n1+Pn2+fn2+Pn1 + +Pn2+Pn18/JwNB9xLwBvLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLgBwLABwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLwBwLgBwLgBvLwBwLgBwLwBw + LwBvLgBwLwBwLwBvLwBwLgBwLwBwLwBvLgBvLwBvLwBwLgBvLgBvLgBvLwBvLgBvLwBvLgBvLwBvLgBw + LgBvLgBvLwBwLwBvLgBwLwBvLgBvLwBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBuKQS5n5z2+fr1+Pn1 + 9/j2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n1+Pn1+Pn1+Pj1+Pn1+fn2+Pn1+Pn2+Pn1+Pn1+Pn19/n2+Pn2 + +Pn2+Pn19/j2+Pn1+Pn1+Pn1+Pn19/n2+Pn19/n19/j19/n19/n2+Pn1+Pn1+Pn1+Pn19/n1+Pn2+Pmg + eXRxLwFxLwBwLgBwLwBwLwBvLwBvLgBwLgBwLgBvLwBwLwBwLwBwLgBvLgBwLgBvLwBwLgBvLwBwLgBw + LwBwLwBwLgOmf3T2+Pr1+Pr1+Pn1+Pn1+Pn2+Pn2+Pn19/n1+Pn19/n19/j4+fmETjdxMABvMABvLwBw + LwBwLgBwLwBwLwBsKQPFsaz2+fr2+Pn2+Pr2+Pn1+Pj2+Pn19/n1+Pn29/r19/n19/n1+Pn1+Pn1+Pn2 + +Pn1+Pn1+Pn2+Pn1+Pr19/r19/n19/n1+Pn19/n1+Pn29/n1+Pn2+Pn2+Pn2+Pr29/n19/n1+Pn1+Pn2 + +fn29/n19/n1+Pn2+Pn1+Pn1+Pr2+Pn1+Pn1+Pn3+fmccmdxMAJwLwBwLgBwLwB2QzDz8/T2+fr1+Pn2 + +Pn1+Pn2+Pr1+Pj1+Pn2+Pr1+Pr2+Pn2+Pr3+vu5pKBpJwhwLwFwLgBwLgBwLwBwLgBwLgBwLwBwLwBv + LgBvLwBvLgBwLgBwLgBrKAOlgXr3+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/j19/j4+vqSaF9w + LgJvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBxLwBwLABwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBvLwBvLgBwLgBwLgBwLgBw + LgBvLwBvLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBvLgBvLgBvLgBvLgBwLwBvLgBwLgBw + LgBwLgBvLwBwLgBvLgBvLwBwLgBwLgBvLwBwLgBwLwBwLgBuKwO4n5z1+Pr19/j2+Pn1+Pj1+Pn2+Pn1 + +Pn2+Pn1+Pj19/j1+Pj2+Pn1+Pj2+Pn1+Pj1+Pj19/n1+Pn19/n1+Pj19/n1+Pj1+Pn1+Pn2+Pn19/n1 + +Pn1+Pj1+Pj1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj19/n1+Pn1+Pn2+PmgeXNxLwFxMABwLgBw + LwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgOmf3T2 + +Pr1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pj19/n29/n19/j4+fmETjZwLwBxLwBvLgBwLgBwLgBwLwBxLgBx + LwKadWz3+vr2+Pn1+Pn2+Pn19/n1+Pn19/j1+Pn1+fn1+Pj2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2+Pn1 + +Pn1+Pr1+Pn1+Pj1+Pn1+fn1+Pn1+Pj1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+fn2+fn1+Pn1+Pj1 + 9/n1+fn1+Pn2+Pn2+Pn1+Pj29/h1OiFwLgFwLwBwLgBwLwKXdGv3+fn1+Pr1+Pn2+Pn2+fn2+Pn1+Pn1 + +Pn1+Pn2+Pn29/n2+Png2thqLxRwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBw + LgBxLgBoKQzh19f3+Pr2+fn2+Pj1+Pn2+fn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pm3op5tKwRwLgBwLgBwLgBw + LgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLABvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLQBwLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBvLwBvLwBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLwBw + LgBvLwBwLwBwLwBwLgBwLgBvLwBvLgBwLgBvLgBwLwBvLgBwLgBvLwBvLgBvLgBwLgBvLwBwLwBwLgBv + LgBwLgBwLwBvLwBvLwBwLgBwLwBwLwBuKgO5oJz2+fn1+Pj1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn1+Pn2 + +Pn2+Pn29/n1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn2+Pn2+Pr1+Pj1+Pn1+Pn1 + +Pn2+Pn2+Pn2+Pj2+Pn29/j19/j1+Pn2+Pn1+Pn1+Pn2+PmfeXRxLwFxLwBwLgBwLgBvLgBvLgBwLgBw + LgBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLQOmf3T2+fr2+Pn1+Pn2+Pn2 + +Pn1+Pn19/n1+Pn1+Pn1+Pn19/n3+fqDTTZxMABwLwBwLgBwLgBwLgBwLgBwLwByMAB5Qi308/L1+Pn2 + +Pn2+Pn19/n2+Pn1+Pn1+Pj1+Pn1+Pn1+Pn19/j1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1 + +Pn1+Pn2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn19/n2+Pn1 + +Pn1+Pnbzs1sKQdxLgBwLgBwLwBtLAO5n5v19/n1+Pr2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn3 + +fmObGNyMAJwLwBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBxLwBxLgGhg3/3 + +Pr2+Pn1+Pj2+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+Pn19/jQvbpqKAdwLwBwLgBwLQBwLgBwLQBvLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLABwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBvLwBwLgBwLgBvLwBxLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBv + LgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLwBvLgBwLgBwLwBwLgBwLwBw + LwBwLwBwLwBwLwBuKgS5oJz2+Pv1+Pn1+Pn1+Pj19/n19/n1+Pn1+Pn1+Pn2+Pn1+Pn19/n19/j1+Pn1 + +Pn2+Pn1+Pn2+Pn1+Pn1+fn2+Pr29/n1+Pn19/j19/j1+Pn19/n2+Pn19/n1+Pn1+Pn1+Pn1+Pn29/n2 + +Pn1+Pn2+Pn1+fj1+Pn1+Pn29/n2+PmfeXNxLgFxLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgOkfnP3+Pv19/r1+Pn2+Pn2+Pn19/n1+Pn1+Pj1 + +Pj19/n19/n4+fqFTzdxMABwLwBwLwBwLwBwLwBxLwBwLwBxLwBrKg3c0c/19/j2+Pr19/n19/n1+Pj2 + +Pn1+Pn2+Pn1+Pn2+Pn1+Pn29/n29/n1+Pn1+Pn1+Pn2+Pn1+Pr2+Pr29/n2+Pn2+Pn1+Pj2+Pn19/j2 + +fn1+Pn2+Pn1+Pj29/j2+Pn2+Pn1+Pj2+Pj2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pr2+PuylY9vLAFw + LwBwLwBwLgBpKAXSxcT19/n1+Pn1+Pn1+fn29/n2+Pn1+Pn1+Pn1+fn1+Pr1+frr5+ZqMRhwLgBwLgBw + LgBvLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLwCIYFT2+fn1+Pr19/n1+Pn1 + +Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/nm4uFpLRZvLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBv + LgBwLwBvLgBwLwBvLgBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBw + LwBvLgBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBu + KwS5oJ32+fr19/j1+Pn1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn1+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1 + +Pn19/j1+Pj1+Pn2+Pn19/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pj2+Pn2+Pj19/j1+Pn1 + +Pn2+Pj1+Pn2+fmfeXNxLgFxLwBwLwBwLwBwLgBvLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBw + LgBwLwBwLwBwLwBwLwBwLwBwLQOlfnP2+fr2+Pn19/j2+Pj1+Pn1+Pn1+Pj1+Pn1+Pj19/n19/j4+fqF + TjZxLwBwLwBwLwBwLwBwLwBwLgBwLwBxMABvLgaulI32+fr2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn19/j1 + 9/j19/j1+Pn1+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn2+Pn2+Pn19/n29/j1+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2 + +Pj1+Pn1+Pn1+Pn1+Pn19/j1+Pj2+Pj1+Pn1+Pn19/n1+Pj1+Pn29viJWkpxLgFwLgBwLgBwLgBuLhDo + 4d/1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn19/n2+Pn2+PnAq6lsKwdwLwBwLgBwLgBvLgBvLgBvLwBw + LgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgB/TDr39/b0+Pn1+Pj1+Pn19/j19/n2+Pn2+Pn1 + +fj1+Pj19/jq5+dqMBlvLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBxLwBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBvLgBvLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLgBw + LgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBvLgBvLgBwLwBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLwBwLwBv + LwBwLgBwLwBvLgBwLgBvLgBvLgBwLwBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBuKwO5oJz1+fr1+Pn1 + +Pn1+Pj2+Pn2+Pn19/n1+Pn1+Pn19/j2+Pn2+Pj1+Pn1+Pj19/n2+Pn1+Pj1+Pn1+Pn2+Pn2+Pn2+Pj1 + +Pj2+Pn19/j2+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn2+Pr1+Pj1+Pn2+Pn29/n1+Pn2+Pn1+Pn2+Pn2+fmg + eXRxLgFwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLgBw + LwBwLwBwLgOkf3P3+Pr1+Pn1+Pn2+Pn1+Pn1+Pn19/n29/n1+Pn1+Pn19/j3+vmFTzdxMABwLwBwLgBw + LgBwLgBwLgBwLwBxLwBxMAGFVUv29/f1+fr2+Pn1+Pr2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pr2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn1+Pn2+Pn29/n2+Pn2+Pn1 + +Pn19/j1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+fjo4+JtMhlxLwBwLwBwLwBwLwBwMxz19PT19/n2+fn2+Pn1 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+fr2+fmgfnZyMARwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLgBvLgBxLgCAVUb4+Pn1+Pn1+Pj1+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pn29/nr6Oht + LxlwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBvLgBw + LgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBvLwBwLgBv + LwBvLwBwLwBwLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBvLgBwLwBvLwBwLwBwLgBwLgBvLwBvLwBvLwBw + LgBwLwBvLwBwLwBwLwBwLwBwLgBwLwBvLwBwLwBwLwBwLwBuKgO5n5v2+Pn19/j1+Pj1+Pn29/n1+Pj1 + +Pn19/j1+Pn2+Pr29/n29/j19/n19/n2+Pn1+Pn1+Pn19/j2+Pr2+Pj19/n1+Pj19/n1+Pn2+Pn1+fn1 + +Pn19/j19/j1+Pn1+Pn2+Pn2+Pn19/r2+Pn1+Pn2+Pn1+fn2+Pn1+Pn1+Pn2+fmgenRwLgFxLwBwLgBw + LwBwLwBvLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLwBwLwBxLwBwLgSmgHX3 + +Pr1+Pn2+Pn1+Pn1+Pn19/n1+Pn19/n19/n29/n29/n4+fmFTzlxLwBwLgBwLwBwLwBwLwBwLgBwLwBw + LwBwLwBrLRjp5eL2+Pr2+Pr2+Pn2+fn2+Pn1+Pj2+Pn1+Pn2+Pn1+fn29/n2+Pn2+Pn1+Pj2+Pn2+Pn1 + +Pn2+Pn2+Pn1+Pn19/n29/n2+Pn1+Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pr2+Pn29/n1+Pr2 + +Pn1+Pn1+Pn2+Pn1+fnGta9qKQZwLgBwLwBwLwBwLwB1Mx329vf19/n2+fr2+Pr1+Pr2+Pv2+Pr1+Pr1 + +fr2+Pr1+fr2+fqGVktxMAFxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBw + LgBvLgBwLgGVcWr3+vv1+Pj1+Pn2+Pn1+Pn1+fj2+Pj1+Pn2+Pn1+Pn19/ns6ehvLxlwLgBvLwBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBw + LgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBw + LgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBuKgO4n5r2+Pr19/n1+Pn1+Pn1+Pn1+Pn19/j1+Pn1+Pn19/n2 + 9/n2+Pn19/n1+Pj1+Pj2+Pn1+Pn19/j1+Pn1+Pn2+Pj1+Pn1+Pn1+Pj1+Pn1+Pn19/n19/j1+Pj1+Pn2 + 9/j2+Pn1+Pn2+Pn2+Pj2+Pn19/n1+Pn2+Pn1+Pn1+Pn2+PmheXRwLwFwLwBwLwBwLwBwLgBwLwBwLwBw + LgBwLgBwLgBvLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgSmf3X3+Pr1+Pn1+Pn1+Pn2 + +Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n3+fqFTzlxMABwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBsKAXErqr3 + +Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pj1+fn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn29/n2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pj1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn3 + +viWcWlxMARwLwBwLwBwLwBwLwB5PSD5+fn5+vz5+vv5+/z5+/z6+/36+/z6+/z6+/z6+/z5+/v5+vqC + TkVwLwFwLwBwLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvMABoJQPQwr/2 + +Pr1+Pj1+Pj1+Pn1+Pj19/n2+Pn2+Pn2+Pn1+Pn1+Pnq6OdrLhlvLgBvLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBxLwBwLQBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLwBv + LwBvLwBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBwLgBwLgBvLgBw + LwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBvLgBvLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBvKgO5n5v1+Pr29/n1+Pj19/n2+Pn1+Pn19/n2+Pn2+Pn2+Pn1+Pn19/j1+Pn1+Pn2 + 9/j2+Pr2+fn1+Pn2+Pn2+Pn1+Pj1+Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn19/n2+Pn1+Pn2+Pn2+Pr1+Pn2 + +Pn1+Pn29/n1+Pn1+Pn1+Pn1+Pn2+PmgeXRwLgFwLgBvLwBwLwBvLwBvLwBwLgBwLwBwLwBvLwBvLgBv + LwBwLwBvLgBvLgBwLwBwLgBwLgBxLwBwLgBxLwBwLgOlf3X3+fr1+Pn2+Pn1+Pj1+Pn19/n1+Pj1+Pn2 + +Pn19/n19/j4+fqFTzlxMABwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBxLgKYbGP4+fv1+Pn2+Pn1+Pn2 + +Pn29/n1+Pn1+Pn1+Pn1+Pn29/n2+fn1+Pj1+Pn1+fn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn1+Pr2+Pn2+Pn2+Pn2+Pr1+Pr29/n2+fn2+Pn1+fr2+Pn2+Pn2+Pn2+Pn2+Pn2+PZyPCpxLgBwLgBw + LwBwLgBxLwBxLgl2PzR0PzRzPzRxPzRyPzRyPzRzPzRzPzRyPjRzPzVyPzVzPjNvLQtwLgBxLwBwLwBw + LwBwLwBxLwBwLgBwLgBwLwBwLwBwLwBvLgBwLgBxLwBwLgBwLgBsKgSaeG/3+fr2+Pn19/j2+Pn19/n1 + 9/n19/n1+Pn1+Pn1+Pn2+Pn1+Pnn4eFrLBRwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBx + LQBwLQBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLwBvLgBvLgBwLgBv + LgBwLwBvLwBwLwBwLgBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBw + LgBvLwBwLwBwLgBvLgBvLgBwLgBwLgBvLwBwLwBvLgBvLwBwLgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBu + KgO5oJv2+fn1+Pn1+Pr1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pn1+Pn29/n1 + +fn1+Pn2+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pr19/n2+Pn2+Pr1+Pn2+Pn1+Pr1+Pj2+Pn1+Pn1+Pr2+fr1 + +Pn2+Pn1+fn2+PmgeXRxMAFxLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLgBw + LwBwLwBwLwBwLwBvLwBwLwBwLgOmfnT3+fr1+Pn19/n1+Pn1+Pn19/n1+Pn1+Pn29/n1+Pn1+Pj4+fqE + TzdxMABwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBxLwFyMx749/f2+fr1+Pn2+Pn2+Pn1+Pn2+Pr19/n1 + +Pr19/n19/n2+Pn19/n2+Pn2+Pr2+fr2+fn2+Pn2+fn2+fn1+Pr1+Pn2+Pn19/n2+Pr2+Pr29/n2+Pn2 + +Pj2+Pr2+Pr2+Pn1+fn2+Pn2+Pn1+Pn1+Pn1+Pn1+fn1+Pna0M9nIwdxLwBwLwBvLwBwLgBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBxLwBxLwBwLwBwLwBwLgBwLwBwLwBwLwBw + LwBwLgBwLwBwLwBwLwBwLwBwLwBwLgFpJwmbeHH19PT2+Pn2+Pn1+Pn2+Pn29/n1+Pj2+Pn1+Pn1+Pn1 + +Pn2+Pn1+PnMuLRrKAZwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLwBxLwBwLQBvLQBvLQBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBvLgBwLgBwLwBvLgBw + LgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLwBwLwBw + LwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBvLgBwLgBwLgBvLgBwLwBvLgBvLwBwLwBuKgO5oJz1+Pn1+Pj2 + +Pj29/j29/n2+Pn1+Pj2+Pn2+Pn29/n2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj1+Pj2+Pn2+Pn2+Pj1+Pn2 + +Pn2+Pn2+Pn29/n2+Pn19/n2+Pn1+Pn29/n2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2+Pmf + eXRwMAFxLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBv + LgBwLwBwLgSlf3T2+Pr1+Pn1+Pn19/n1+Pn2+Pn19/n19/j1+Pn1+Pn19/n4+fqFTjZxMABwLgBvLgBw + LgBvLwBwLwBvLwBwLwBwLwBwLwBrJQXazMf2+fr29/j2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 + +Pn29/j2+Pn19/n19/j2+Pn2+Pn19/j29/j19/j19/j2+Pj2+Pn2+Pj29/j2+Pn2+Pn2+Pn1+Pn2+Pn2 + +fn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+PqpioVwLgVwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBw + LwBwLwBxLgBwLwBwLgBwLwBxLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBw + LgBxLwJrKgh9SzjMvbf5+vr2+Pv2+Pn1+Pn2+Pn19/j1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn19/i2nZlt + KgRwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLQBwLgBvLgBwLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw + LwBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLwBwLgBwLwBwLwBw + LgBvLwBwLgBwLwBvLwBwLwBwLwBvLwBwLwBwLgBwLwBwLwBvKgS5n5z3+fr29/n29/n2+fn1+Pn1+fn2 + 9/r19/n29/j1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pr2 + +Pn1+Pn2+Pn1+Pn19/n19/n1+Pn2+Pn1+Pn29/n29/n1+Pn29/n1+Pn1+Pn2+PmfeXRwLwFxLwBwLwBw + LwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLgBwLwBwLwBxLwBwLQOlfnP3 + +Pr1+Pn1+Pn1+Pn2+Pj1+Pn19/n19/n1+Pj1+Pn19/n4+fmETjdxMABwLwBwLwBwLwBwLwBwLwBvLwBw + LwBwLwBxLwByLQCriIH3+fr19/n1+Pr1+Pn1+Pn2+fr1+Pn1+Pj1+Pn1+Pn1+Pr3+PjJu7nCrKnCrKrC + rKrBrKrBrKrBrKrCrKrDrKrBrKrCrKrCrKrCrKrBrKrYz9D2+fr19/j1+Pr2+Pn2+fn1+Pn2+Pn1+Pn1 + +Pn1+Pn1+fn4+vqATT9xMAFxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBvLwBwLwBwLwBw + LgBwLgBwLwBwLwBwLwBwLgBwLwBxLwBwLwBvLgBwLwBwLwBwLwBvLwBwLwFvKgVpLBSLYVfJt7X19PX3 + +Pn2+Pr2+Pn1+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pj1+Pj29/n2+Pj3+PqNYVhwLwJwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLgBwLwBw + LgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw + LwBvLwBwLwBwLgBwLwBwLwBwLwBwLgBuKwO4n5v2+Pn19/j1+Pn2+Pn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2 + +Pj2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn29/n1+Pj1+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pn1 + +Pj2+Pn2+Pn2+Pr2+Pn19/n1+Pj19/n1+Pn1+Pn1+Pn2+fmfenRxLwFwLwBwLwBwLgBwLwBwLwBwLwBw + LgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgOlfnT2+Pr2+Pn1+Pn2+Pn1 + +Pn19/n1+Pn1+Pn1+Pj1+Pn19/n3+fmFTjdxMABwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwByLwCD + UDn3+Pj2+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn29/iQaWNtKwlsKgdsKwdsKgdsKwdsKQds + KgdtKwdsKgdsKwdsKgdtKwdoJAvDs7D2+Pn2+fn2+Pn1+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn1+fjp4uBq + KxFxLwBxLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLwBv + LgBwLwBwLwBwLwBwLwBwLgBxLwBvLgBxLwBrJgNyMyKlhIHg1tX39vf2+Pj2+Pn29/j1+Pn1+Pj2+Pn1 + 9/n2+Pn1+Pn2+Pj1+Pn19/n1+Pn19/n19/n1+Pny7/BtMRpwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLgBv + LwBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LwBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBv + LgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBvLwBvLgBwLgBwLgBv + LgBwLwBwLgBxLwBuKwO4n5z1+fr2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2 + +Pn2+Pn2+Pj1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2 + +Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n2+fmgenRxLwFwLwBwLgBwLwBwLgBvLgBwLwBwLwBwLwBvLgBwLgBw + LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgOmfnT3+Pv1+Pn19/n19/n1+Pn1+Pn1+Pn1+Pn2 + +Pn1+Pn1+Pn4+fqFTzZxMABwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwByMABrKg7q5OH1+Pn1+Pr2 + +Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+fm/rKhtLAdxLwBxMABwLwBxLgBxLwBxMABxLwBwLgBwLwBx + LwBxLwBrLxPq5uL19/j1+fn1+Pn1+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+fn1+PjAp6FuKgNwLwBwLwBwLgBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBx + LgBwLwFvLQVnKBGMY1bJuLP49/f4+vv3+vr2+Pn2+Pr2+Pn1+Pj29/n2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2 + +Pn1+Pn1+Pn1+Pn1+Pn3+fq+pqBrJgJvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLQBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLwBvLwBw + LwBwLwBvLwBvLwBvLgBwLgBvLwBwLwBvLgBwLwBwLwBwLgBwLgBvLgBwLwBwLgBwLQBwLgBvLwBwLwBw + LgBwLwBvLgBvLwBwLgBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBv + KwS5n5z2+Pr19/n1+Pn19/j1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn2+fr29/n19/n2+Pn19/n1+Pr1 + +Pj2+Pn2+Pn1+Pn1+Pn1+Pn19/j2+Pn2+Pn1+Pn1+Pr29/n19/n19/n1+Pn29/r1+Pn2+Pn1+Pn2+Pn1 + +Pn1+Pn19/j2+PmgeXRxLwFxLwBwLgBvLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLwBvLgBwLgBw + LgBwLwBvLgBwLwBwLwBwLwBwLgOlfnT2+Pn1+Pr2+Pn29/n2+Pn19/n19/n19/n1+Pn19/n09/n4+fmE + TTdxLwBxLwBwLwBwLwBvLgBxLwBwLwBwLgBxLwBwLwBxLgBuLAW+qaj3+fr2+fr1+Pn2+Pr1+Pn1+Pn1 + +Pn1+Pn1+Pn2+Pn19vnm4eBpLRRwLwBxLwBvLwBwLwBwLwBwLwBxLwBwLwBwLgBxLwByLwF/TDz4+fr2 + +Pn1+Pj1+Pn2+Pr1+Pn1+Pn2+Pj1+Pn1+Pn1+Pn3+fuWbF5xLgFxLgBvLgBwLgBwLwBwLwBwLwBvLwBw + LwBwLgBwLwBwLwBwLwBwLgBvLgBvLgBwLgBwLgBwLwBvLwBwLwBwLwBvLgBxLgFsKQdxOiqde3fm3934 + +fr2+Pn1+Pr1+Pr2+Pj1+Pn1+Pn2+Pn1+Pj2+Pr1+Pn2+fn19/n2+Pn2+Pn2+Pr29/n2+Pn2+Pn2+Pr1 + +Pj39/h+RzRwLwFwLwBwLwBwLgBwLgBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBxLgBwLQBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBvLgBvLgBwLwBwLwBvLwBwLgBwLwBvLwBw + LgBwLwBwLgBwLwBvLwBwLwBvLwBwLwBwLgBwLgBwLgBvLwBwLgBvLwBvLwBwLwBwLwBwLgBvLwBwLwBv + LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBuKwO5n5z2+fn19/j1 + 9/n19/j19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pr19/j19/n2+Pj1+Pn1+Pn2+Pn2+Pn1+Pn1 + +Pn1+Pj1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn19/j2+Pn19/n1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj1+Pn19/j1+Pmg + eXRwLwFwLwBwLgBwLwBvLgBwLwBwLgBvLgBwLgBwLgBvLwBwLwBvLwBwLwBwLwBwLgBwLwBwLgBwLwBw + LwBwLwBwLgOlf3T3+Pr1+Pn1+Pn2+Pn2+Pn19/n1+Pn1+Pn1+Pj1+Pn29/j4+fmETTZxLwBwLwBwLwBw + LgBwLgBvLwBwLwBwLwBwLgBxLgBxLwBxLwKTbGL3+Pj2+Pr1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1 + +Pr29vZ/TkFwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgSoh4P1+Pn1+Pn1+Pj19/n2+Pn2 + +Pn1+Pn1+Pn19/j1+Pn2+Prx8e91OSFwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBw + LwBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBxLQFrJQSBTT/Aqqjw7e33+vv19/r2+Pv1+Pn1+Pj2+Pn1 + +Pn1+Pn19/j1+Pn19/j1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn29/n1+Pn2+Pn39/i7o5xrKgVwLgBv + LwBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLABwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBw + LgBwLwBvLgBvLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBuKwO5n5z2+Pr2+Pn1+Pn1+Pn1+Pn1+Pn1 + 9/n2+Pn2+Pn1+Pj2+Pn2+Pn2+Pr2+fn19/n2+Pn2+Pn19/n1+Pn1+Pj1+Pn1+Pn19/n1+Pn1+Pj2+Pn2 + +fn1+Pn1+Pn1+Pj1+Pj1+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+PmgeXRwLgFxLwBwLwBw + LwBwLgBwLwBwLwBvLwBvLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgOlf3T3 + +fr1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn4+PqETjZxMABwLwBwLwBwLgBwLwBwLgBwLwBw + LwBwLgBwLwBxLwBxMABzOybx8O/2+Pv2+Pn1+Pr2+Pn1+Pn19/n1+Pj1+Pr1+Pn2+Pn29/mkhYBzMQRw + LwBwLgBwLwBwLgBwLwBxLwBwLwBxLwBwLwBpJgfVy8n1+Pn1+Pn2+Pj1+Pj1+Pn2+fr2+Pn19/n1+Pn1 + +Pn2+PnYzMlpJQJxLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBvLgBvLgBw + LgBwLwBvLwBwLgNnKw+QY1rTxcL3+Pj3+fr2+fr1+vn2+Pr2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1 + +Pn1+Pr19/n1+Pn19/n1+Pn1+Pn1+Pn19/n1+Pn19/j2+fnh2NhwNyJwLwBwLwBvLgBwLgBwLwBwLgBv + LQBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBvLgBwLwBvLgBvLgBwLwBwLwBvLwBvLgBwLwBvLwBvLwBwLgBwLwBwLwBvLwBvLgBvLwBwLwBv + LgBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLwBvLgBwLgBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBv + LwBvLgBwLgBvLwBwLgBwLwBwLwBwLgBuKgO6n5v29/n2+Pn1+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2 + +Pn1+Pn2+Pj1+Pj2+Pn2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pr1+Pn2+Pn2+Pn2+fj1+Pn2+Pn1+Pj19/n2 + +Pn2+Pn19/n2+Pj2+Pr1+Pn2+Pn19/n19/n2+Pr2+Pn2+fmgenRxLwFxLwBwLgBwLwBwLwBwLwBvLgBv + LgBwLwBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBwLgBwLgBwLgBxLwBwLgOlfnP2+Pr1+Pn1+Pn1+Pn1 + +Pn19/n1+Pn1+Pn1+Pn19/n1+Pj4+fqFTzZxMABwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBx + LwBrKQrUyMX2+fr2+Pn2+Pj1+Pn29/r2+Pn19/r1+Pn2+Pn2+Pn2+PnRxb9qJwRwLwBwLwBxLwBwLwBx + LwBwLgBwLwBwLwByLwBxOSby8PD1+fr2+Pr2+fr1+Pn2+Pr2+Pr2+Pn2+Pn1+fn2+Pn3+fmpjYRvLwNx + LgBwLgBwLwBwLgBwLwBwLwBvLwBwLgBwLwBxLwBwLwBwLwBwLgBwLgBwLgBxLwBxLgByLwBoJAeLX1jb + 0Mz29vf2+Pn2+fr1+Pn1+Pn1+Pn2+Pr2+Pn2+Pn1+Pn1+Pn19/j2+Pn2+fn2+Pn1+Pn2+Pn1+Pr1+Pn1 + +Pn29/n29/n1+Pj1+Pn09/j1+Pnu6ud8RTZwLgJwLwBwLgBvLgBvLwBwLgBwLgBwLgBwLgBvLgBvLgBv + LgBwLgBwLgBwLgBxLgBxLQBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBw + LwBvLwBvLgBwLwBuKgO5n5v2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pr1+Pn2+Pj19/j1 + +Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn1+fn2+Pn2+Pn1+Pj1+Pn1 + +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+PmgenRxLwFxLwBwLgBwLwBwLgBvLQBwLwBwLwBwLgBwLwBwLgBw + LgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBxLwBwLQOlf3P3+fr2+Pn1+Pn2+Pn2+Pn19/n1+Pj1+Pn1 + +Pn1+Pn1+Pn4+fqFTjdxLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLQWoioT3+vn1 + +Pj1+Pj2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Prz8fFsMhdwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBy + LwOWb2j3+Pn2+Pn2+Pn2+Pr29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn4+fl+Tz5xLwBwLwBwLgBwLwBwLgBw + LwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBxLgBuKwN2PivLubb5+vv2+Pr2+Pn1+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn29/n1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn29/n2+Pn1 + 9/n2+Prt6Oh9SThwLQJwLgBwLwBwLgBvLgBwLgBvLgBvLgBvLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBw + LgBvLQBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBwLgBv + LwBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLwBvLgBwLwBvLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBv + LgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBvLwBvLgBwLwBwLwBwLgBwLgBwLgBvLwBu + KgO4n5v1+fn1+Pn2+Pr1+Pn1+Pn2+Pn19/n2+Pn1+Pj1+Pn1+Pn1+Pr19/n2+Pn2+Pj2+Pn2+Pn29/n1 + +Pj1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn29/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj19/n1+Pn1+Pn1+Pn29/n1+Pn2 + +Pn1+Pn19/n2+PmgenRxLgFxLwBwLwBvLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBw + LwBwLwBwLgBwLgBwLgBxLwBwLQOlfnP2+Pr1+Pr1+Pn19/n1+Pn19/j1+Pn19/j19/n1+Pn1+Pn4+fqF + TTdxLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBxMAGATj74+fn1+Pr2+Pn1+Pn1+Pn2 + +Pn1+Pn1+Pn2+Pn2+fn1+Pn3+PqOYFRxLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBrLAbBr6r2+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pnq5+VmKAxxLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBw + LwBxLwBwLwBwLgBxLwBwLwBwLgBrKwmYdGvv7ev4+fn2+fr3+fr2+Pn2+Pn1+Pn1+Pn2+Pr1+Pn2+Pj2 + +fn1+Pn29/n2+Pn1+Pn1+Pn1+Pj19/n2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pr3+frc0c55RzVwLQFw + LwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBvLgBvLgBwLgBvLwBwLwBvLgBw + LwBwLgBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLwBw + LgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLwBwLwBtKgO5n5v2+fr1+Pn2 + +Pn2+Pj1+Pn1+Pj1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n2+Pn1+Pn29/n2+Pn2+Pn2+Pmg + enRxLwFxLwBwLwBwLwBwLwBvLgBwLwBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBw + LwBxLwBwLgSmgHX2+Pr2+Pn1+Pn29/n2+Pn19/n19/j2+Pn1+Pn19/j19/n3+fqFTzdxMABwLwBwLgBw + LwBwLwBwLgBwLwBwLwBwLgBxLwBwLwBwLwBxLgBrKhDo4t/1+Pn2+fn2+Pn2+Pn2+Pn29/n19/n2+Pn2 + +Pn2+Pn19/q6n5ltKgBwLwBwLwBwLwBwLwBwLwBwLgBxLgBqMBTl39z19/j2+Pn1+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn1+Pq6paNuLAZwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBw + LwByLwBrJwayl5L29fb1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+fn2+Pn1 + +Pn1+Pn2+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pr2+Pr2+Pr39ve5oZpuNRtxLwFwLwBwLwBwLgBwLwBvLwBw + LwBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBxLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBvLgBwLgBwLQBvLgBvLgBwLgBuLwBwLgBvLgBvLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBw + LgBvLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLwBvLwBwLwBwLwBwLgBvLwBwLwBwLgBwLwBvLgBwLwBw + LgBwLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLwBwLwBtKQO4npv2+fr1+Pn1+Pn2+Pn1+Pj1+Pj2 + +Pn2+Pn29/n1+Pn2+Pn1+Pn2+Pn1+fn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn1+Pn29/n2 + +Pr2+Pn2+Pn2+Pn19/n2+Pj1+Pn19/n2+Pn1+Pn2+Pn1+Pn29/n1+Pn2+Pr2+PmgeXRwLwFwLwBwLgBw + LgBwLwBwLgBwLgBvLwBwLwBwLgBvLgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgOmgHT3 + +fv2+Pn1+Pn1+Pj2+Pn19/n19/n2+Pn29/n2+Pn19/n3+fqFTjZyMABwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBxLwBtKQO9p6H1+Pn2+Pn2+Pr1+Pn1+Pn19/n1+Pj1+Pn2+Pn1+fn2+frm4N1p + KAlwLwBwLwBwLgBwLwBwLgBwLgBwLgCEUkP29/b19vn19/n1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn3 + +PmPZlxxMAJxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLgBwLgBwLgBxLwBxLgBsKQq7oJf3+fr1 + +Pn2+Pn2+Pn1+Pj2+Pj1+fn2+Pn1+Pn2+Pn2+Pr1+Pn1+Pn1+Pn1+Pn2+Pn2+fn1+Pn1+Pr1+Pn1+Pn2 + +Pr1+Pn1+Pn2+Pn2+Pn4+vrYzcmDUUZsKgRxLwBwLgBwLgBvLgBvLgBwLwBwLgBvLgBwLwBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLgBwLgBwLQBwLgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBvLgBv + LgBwLgBwLgBwLwBvLgBwLgBwLgBvLgBwLwBvLgBvLwBvLgBvLwBwLwBwLgBwLwBvLgBvLgBwLgBwLgBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBvLwBvLgBvLgBwLgBvLwBwLwBwLgBwLgBwLwBwLwBvLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBuKgO4npv2+Pn1+Pn1+Pn19/n29/n1+Pn19/j1+Pn19/j19/j1 + +Pn1+Pj2+Pr2+Pn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn29/n19/n2+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pn1+Pn29/n1+Pj19/n2+PmgeXRxLwFwLwBwLwBwLwBwLwBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgOlfnT3+Pv2+Pr2+Pn2+Pn2 + +Pn29/n2+Pn1+Pn19/n19/n19/j3+fmFTjZyMABwLwBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLwBwLwBw + LwBxLgByMAKTaF74+fv2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pr3+Pn5+fl+SjlwLwFwLgBwLwBw + LwBwLwBwLwBxLQCpiYL29/n19/n29/n1+Pn1+Pn1+Pj1+Pn2+Pn1+fr2+fn2+Pnt6+txNyVwLwBwLwBw + LwBwLgBwLwBwLwBwLwBwLgBvLwBwLgBwLgBvLwBxLwBwLwBsKwaqi4P3+Pn3+Pv1+fn2+Pn2+Pn1+Pn2 + +fn1+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pr2+Pr2+Pn2+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn2+fn2+Pn3+Pjc + 0s6MZ15qKQ9wLgJwLgBwLgBwLgBwLgBxLgBwLwBvLgBvLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBv + LgBvLgBwLgBwLgBxLwBwLQBwLgBvLQBvLgBwLgBwLgBvLgBwLQBwLgBwLQBwLgBwLgBvLgBwLgBwLwBw + LgBvLwBwLwBvLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBvLwBwLwBwLgBw + LwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBvLgBwLwBwLgBvLgBvLgBvLwBwLwBwLgBwLgBvLwBv + LwBwLwBwLwBwLwBuKgO5n5z2+fn2+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 + 9/n1+Pn29/j1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+PmfeXRxLwFxLwBwLgBwLwBwLgBwLgBwLgBwLgBvLwBvLwBwLgBv + LwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgOmf3P3+fr1+Pr2+Pn2+Pn2+Pn1+Pn19/n1+Pn1 + +Pn1+Pn19/j3+fqETTZxMABwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwByLwBxMh31 + 9PL2+Pn2+fr2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+fn4+fynh4BvLQNxLwBwLgBwLwBwLgBxMABrJwPV + x8P1+Pn1+Pj2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn3+fvSw8BqKAtwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLgBwLwBwLwBwLgBwLwBwLgBwLgKOaF329vf19/n2+fn2+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n19/j3+vn3+PfVxsOOY1RoKgtxLwNwLwBxLwBw + LgBwLgBwLwBwLgBwLwBvLwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBx + LgBwLQBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLwBwLgBwLwBwLwBwLgBv + LgBvLwBwLwBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLwBwLwBw + LwBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBwLwBu + KgO5n5z2+Pn19/n2+Pn2+Pj1+Pj1+Pn1+Pn19/n1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2 + +fn29/n1+Pn1+Pn19/n1+Pn1+Pj1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1 + +Pn2+Pn1+Pn29/mgeXRxLwFxLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBvLQBvLgBwLwBwLwBwLgBvLwBw + LwBwLgBwLgBwLwBwLgBwLwBwLgOmf3T2+fr2+Pn2+Pn2+Pn1+Pn19/n1+Pn1+Pn19/n1+Pn19/n4+fqE + TTZxLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBsKAPVxsH29/j2+fn1+Pn2 + +Pn2+Pn19/r2+Pr1+Pn1+Pn2+Pr2+PrTxsNpJwlwLwBwLwBwLwBwLwBxLwBwMBb39/f1+Pn2+fn2+Pn2 + +Pn2+Pj1+Pn19/n2+Pn2+Pn2+Pn4+fukgnxwLANxLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBw + LwBwLgBxLgBuMxrm4eD2+Pr2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 + +Pr1+Pn1+Pn1+Pn1+Pn19/n2+Pnv7e2/q6iDUkZqJQhwLgFxLwBxLwBwLwBwLgBwLwBwLgBwLwBwLwBw + LgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLABwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBvLgBvLwBvLwBwLgBvLwBvLgBwLgBwLgBvLgBvLwBw + LwBvLgBvLgBwLgBvLgBvLwBwLgBvLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBv + LgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBuKwO6oJz2+Pr19/j1 + +Pn2+Pj29/n1+Pn2+Pn2+Pj2+Pn1+Pn19/n2+Pn29/n2+Pn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn19/n2+Pn2 + +Pn1+Pn1+Pn2+Pn1+Pn2+Pj2+Pr1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn19/j1+Pn19/j19/n2+Pn1+Pn2+Pmg + enNxLwFxLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBxLgBw + LwBxLwBwLgOlf3P3+Pr1+fn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn19/n09/n4+fqETjdxMABwLgBwLwBw + LwBwLwBwLwBwLwBwLgBvLwBwLwBxLwBwLwBwLwBwLwBwLQCog334+vv2+Pr2+Pn2+Pr2+Pn2+Pn2+Pn1 + +Pn1+Pn2+Pr2+Pny7+1yOSdxLQBxLgBwLwBwLgBxLwGVaFz4+vz29/r2+Pn2+Pn1+Pn19/n1+Pn1+Pn2 + +Pn2+Pn1+Pn39/iASztwLwFxLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBuKgCpiH32 + +fv1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn1+Pr2+Pn1+fn1+Pj1+Pn2+fr1+fr3+fr4 + +fnj29efg31yOSlrKQlxLwNxLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLwBvLgBwLgBw + LgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLQBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLQBvLgBvLQBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLwBwLgBxLwBwLgBw + LgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBv + LgBwLgBvLgBwLgBwLgBvLgBvLwBwLgBwLwBwLgBwLwBwLwBuKgO5n5z2+fn1+Pn1+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+fr1+Pj1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2 + +Pn1+Pj2+Pn1+Pn1+Pj2+Pn2+Pn2+Pj2+Pj1+Pn2+Pn1+Pj29/n1+Pn2+Pn2+PmfenNxLwFwLwBwLwBw + LgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBwLgBwLwBwLwBxLwBwLQOlf3P2 + +fn2+Pn1+Pn29/n2+Pn1+Pn1+Pn1+Pn2+Pj1+Pn19/n4+fqETjdxLwBvLwBwLgBwLwBxLwBwLgBwLgBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBxLwCCSjb3+Pj3+Pr1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn3 + +PmTaV9yMQNwLwBwLwBwLwBuJwLBran3+fr2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+fj2+Pjl395o + JQtwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvMBTr5OP1+Pn19/j2+Pn2+Pn1 + +Pn1+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+fr3+frz8PDEsayJVklmIgVwLwNwLwBv + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBw + LgBvLQBwLgBwLgBvLgBwLgBwLgBvLgBwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBvLwBw + LgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBw + LgBvLgBwLgBwLgBwLwBwLwBwLwBxLwBvKwO5n5z2+fr19/n2+Pn2+Pn19/j1+Pj1+Pn1+Pn1+Pn2+Pn2 + +Pj1+Pn2+Pn19/n1+Pn29/j1+Pn29/n1+Pn1+Pn1+Pn19/n19/n1+Pj1+Pn2+Pn2+Pr19/j1+Pj19/j1 + +Pj1+Pn1+Pn1+Pj19/n1+Pn2+Pn19/n19/n1+Pn1+Pr2+PmgenRwLwFxLwBxLwBwLwBwLwBxLwBwLwBw + LgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBxLwBwLgOkf3P2+Pr1+Pn19/n29/n1 + +Pj1+Pn1+Pn1+Pn19/n19/n1+Pn4+fqETjdxLwBwLgBvLwBwLgBvLwBwLgBwLwBwLwBwLgBxLgBwLwBw + LwBwLwBwLwBxLwBtLg/l3972+Pr2+Pn1+Pn1+Pn2+Pn1+fn1+Pj19/n1+fn2+Pr29/i+qaJrKQZwLwBw + LwBvLwBpKBLr5uP2+Pr1+Pn1+Pn19/j1+Pn1+Pn1+Pn29/n2+Pn1+Pj2+Pq7oZtuKQJwLgBxLwBwLgBw + LgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBxLwBxLwGMXVL4+vv19/j1+Pn2+Pj1+Pn2+fn1+Pn1+Pn1+Pn2 + +fn2+Pn1+Pn29/n1+Pn1+Pn1+Pj29/fe19WkiINvNCVsJARyMAJxLwBwLgBxLwBwLgBwLgBvLwBwLgBv + LgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBwLgBwLwBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBxLwBwLQBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBw + LgBvLgBwLwBwLwBwLgBvLgBvLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBvLwBwLgBvLwBwLwBvLwBwLgBv + LgBwLwBwLgBwLgBwLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBw + LwBwLwBwLwBwLwBuKgO5oJz3+Pr19/n2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pj19/n1 + +Pn2+Pn1+Pn2+Pn1+Pn1+Pn19/n1+Pn1+Pn19/n2+Pn1+Pn2+Pr1+Pn2+Pn19/n19/n2+Pn1+Pn2+Pn1 + +Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+PmfeXRwLwFxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBvLwBw + LwBwLgBvLwBvLwBvLwBwLgBwLwBwLwBwLwBxLwBwLgOmfnP2+Pr1+Pn2+Pn1+Pn2+Pn1+Pj29/n19/n1 + 9/n1+Pn1+Pn4+fqETjdwMABwLwBwLgBwLgBwLgBwLgBwLwBxLgBwLwBwLgBwLwBwLwBwLwBwLwBxLwBs + KgW/qqT2+fr2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pr1+Pn1+Pr2+fnn4uFoKhBwLgBwLwBxLwGBTT729vf2 + +Pr1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2+Pn4+vqNXlBxLgFwLwBwLwBwLwBwLwBvLgBwLwBwLwBx + LwBwLwBwLwBwLwBwLwBuKgS6oJr19/j1+Pn1+Pn2+Pn2+Pn2+Pn2+Pr1+Pn2+Pn1+fr2+Pn2+Pn1+Pr3 + +vn09PPGs62GWk5qLQ9vLgVxLwFxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBw + LgBwLABwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBvLgBvLgBwLwBw + LwBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBu + KgO5n5v2+Pr1+Pn1+fn1+Pj2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n1+Pn2+Pn1+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pj1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2 + 9/n1+Pn1+Pn2+PmeeXRxLwFxLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBw + LwBwLwBwLgBwLgBwLgBwLwBvLQSlf3T2+Pr1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn19/n1+Pn19/n19/j4+fqE + TjZxLwBwLgBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBxLwKUa2H2+Pn1+Pn2 + +Pj19/n1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn3+PiAUEBxLwFwLwBuLQSri4T2+Pj2+Pr1+Pn1+Pn2+Pn2 + +Pn2+fn2+Pn2+Pn1+Pn19/n09PNqKQ9xLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBw + MABoJQjc1dP1+Pn1+Pn19/n2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+fn2+Pn1+Pn4+frOv7t9STlpJgNxLwFw + MABwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBw + LgBwLwBwLwBvLgBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBv + LgBwLgBvLQBvLgBvLgBvLgBvLgBvLgBwLgBvLgBwLgBvLwBvLgBvLwBwLwBwLwBwLgBwLwBwLgBvLgBv + LgBvLwBwLwBwLwBwLwBvLwBvLwBwLwBwLwBvLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBv + LwBwLwBwLwBwLgBvLgBwLgBwLwBwLwBvLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBuKgO4n5v2+fn2+Pn2 + +Pn1+Pj29/j19/j1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn1+Pn2+Pj1+Pj2+Pn2+Pn2+Pn1+Pn2 + +fn1+fn3+Pn1+Pn29/n2+Pn2+Pn1+Pj19/j19/n1+Pr2+Pn1+Pn1+Pn2+Pn29/n19/n1+Pj1+Pn2+Pmg + eXRxLgFwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBw + LwBwLwBwLgSlf3X2+fr1+Pn1+Pn1+Pn1+Pj19/j19/n19/j19/j1+Pn1+Pn4+PqETjZxMABwLgBwLgBw + LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwByMABzOSTz8fD2+Pn2+fr1+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pr1+fn2+Pn3+PqniYVvLQRwLwBrKgvTxMD2+Pn19/n2+fn2+Pn2+Pn2+Pn2+fn2+Pr1+Pn1 + +Pn2+PrNvLpsKgVxLgBwLgBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLwBxLwBwLgBxMABtNB7z8e72+fn2 + 9/n1+Pn1+Pn1+fn1+fn1+fn2+Pn2+Pn2+Pj2+Pr4+vq1nZlqKw5xLQJxMABxLgByMABxLwBwLwBxLwBw + LwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLwBwLgBwLgBxLwBwLABwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLQBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLwBwLwBwLgBwLwBwLwBwLwBw + LwBwLwBvLgBvLwBvLgBwLgBvLgBvLgBvLwBwLwBwLgBwLgBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBw + LwBvLwBvLgBwLgBwLwBvLgBwLwBvLgBvLwBwLwBwLwBwLwBvKgO4n5r2+fr2+Pn1+Pn2+Pn1+Pn1+Pn2 + +Pn2+Pn19/r2+Pn1+Pn2+Pn2+Pn2+fr1+Pn2+Pn2+Pn29/n2+Pn1+Pj2+Pn2+Pj1+Pn1+Pj2+Pn2+Pn1 + +Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n2+Pn1+fn2+PmgenRwLwFxLwBwLgBv + LwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLwBxLgBwLwBwLwBwLgOmfnT3 + +Pn1+Pn1+Pn1+Pn2+Pn19/n19/n19/n1+Pn1+Pn19/n3+PqFTzdxMABwLwBwLgBwLwBwLwBvLgBwLwBw + LgBwLwBwLwBwLwBwLgBwLwBvLwBwLwBxMABnJQfYzsr2+Pn2+fn19/n1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1 + +Pn1+PnYy8hoJgZxLgBzOSXv7uz1+Pr2+Pn2+Pn1+fn2+Pr1+Pn29/n2+Pn1+Pn1+Pr4+fqdeXFxLwJw + LwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwMABzPTD4+vr2+Pr29/n1+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pr2+Pr3+frJtrFnKApwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBw + LgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBwLgBvLgBvLwBwLgBwLgBwLgBw + LgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBvLQBxLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLwBvLgBvLwBvLgBwLgBwLQBwLgBvLgBvLgBwLgBwLgBwLwBwLwBwLgBvLwBwLgBvLwBv + LwBwLwBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBvLwBvLwBwLwBwLgBwLwBwLwBwLgBv + LwBvLgBvLgBwLwBwLgBvLwBwLwBwLwBuKwO4npr2+Pr1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn29/n29/j1+Pj1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn2+Pn29/j1+Pn1 + 9/j2+Pj2+Pn29/n1+Pn1+Pn1+Pn1+Pj2+Pn1+Pj2+Pn2+PmfenRxLwFwLwBwLwBwLwBwLwBwLgBwLwBw + LwBvLwBvLwBvLgBvLgBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBxLwBwLgOlfnP2+Pr1+Pn1+Pj19/n1 + +Pj19/n1+Pn1+Pn1+Pj19/n1+Pn3+fqFTzZxLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBw + LwBwLgBvLgBvLwBxLwBzMgWjhX/2+Pn39/n1+Pj2+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+Pn2+Pnz8vF1PSVw + LwKPamD3+Pn1+Pn2+Pr1+Pn2+Pn2+Pn1+fn2+Pn1+Pn1+Pn2+frz8/N5RTNwLgBwLgBvLwBwLgBvLgBw + LwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwB6PzH4+vr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2 + +Pnz8vJ5QzBwLgBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBvLQBv + LgBvLQBvLwBwLQBwLgBvLQBvLQBvLQBvLgBwLgBwLQBvLQBvLgBvLwBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLgBvLgBvLwBw + LgBvLwBvLwBwLgBwLgBvLgBwLwBwLwBwLgBxLwBvLwBwLwBwLgBvLwBvLgBwLwBwLwBwLgBvLgBwLwBv + LwBwLwBwLgBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBvLwBvLgBwLgBwLwBwLgBwLgBvLwBwLgBwLgBw + LgBwLwBwLwBxLwBuKgO5n5v2+Pn19/n1+Pn1+Pn2+Pn19/j1+Pn1+Pn19/j29/n2+Pr2+Pn1+Pj2+Pn2 + +Pn2+Pn1+Pj19/r1+Pn1+Pj19/j1+Pn1+Pj2+Pn2+Pj19/n1+Pn1+Pj1+Pn1+Pn2+Pn2+Pn1+Pn29/n2 + +fn2+Pn1+Pn1+Pn1+Pj2+Pn19/n2+PmfenRwLgFxLwBwLwBvLwBwLwBwLwBvLwBwLwBwLwBwLgBvLgBw + LgBwLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgOlf3P3+fr1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn1+Pn1 + +Pn1+Pj1+Pn4+fmFTjZxMABwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBx + MAByMAF/TT/4+fn2+Pn1+Pn19/n2+fr1+Pn2+Pr1+Pr2+Pr1+Pn2+Pn3+fqXbWFvLQe8p6P2+Pn2+Pn2 + 9/n2+Pn1+Pn2+Pn2+Pn1+Pn1+fj2+Pn2+Pve1NFsLBFwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLwBw + LwBwLgBwLgBvLwBxMAF/QjP4+vr3+Pn2+Pn2+Pn19/j2+fn2+Pn1+Pn2+Pj2+Pr29/nf2NZkJgZxLwBw + LwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLgBvLgBpJgxmJhFmJxJnJxNnJxRm + JxRoKBRnKBRoKBVnKBVnKRVoKRRtLAFvLgBwLgBwLgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBwLgBwLgBw + LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLwBvLgBvLwBvLgBvLgBw + LgBwLwBvLwBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLwBwLwBvLgBwLgBwLgBvLgBwLwBw + LgBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBwLwBvLgBvLgBvLwBwLgBwLwBwLgBwLwBwLwBwLgBu + KgO5oJv3+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn1+fn1 + +Pn1+Pn1+Pj2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn2 + +Pn2+Pn1+Pn2+PmfenNwLwFxLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLwBxLgBwLgOlfnP2+Pr19/n19/n19/n1+Pn1+Pn19/j19/n1+Pn1+Pn19/j4+fqE + TTdxLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBxLwBwLgBsKxDl3973 + +fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+fnDq6VhIQzr5+T2+fn2+Pn2+Pn1+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn19/mzmZRtLQVwLwBwLwBvLwBvLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBx + LwB4QDH3+fn2+Pn2+Pr1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/jKtq9pJwNxLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBpJgTXysfk4N3o5eLp5eTp5+br5+br6Ofr6Ofr6Ojr + 6ejt6uro4+JsKBJwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBxLgBwLQBwLgBwLwBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLgBwLgBvLgBvLwBvLgBwLgBv + LgBwLgBvLwBwLgBvLgBwLwBvLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBvLgBwLgBwLgBwLwBw + LwBwLwBwLwBvLgBwLgBwLwBvLwBwLgBwLgBvLgBvLwBwLwBwLgBwLwBwLwBwLwBtKgO5n5v2+fr19/n2 + +Pn1+Pn1+Pn2+Pj1+Pn29/n1+Pn2+Pj2+Pn2+Pn1+Pj2+Pn2+Pr2+Pn19/n2+Pn2+Pn1+Pn2+Pj19/n2 + +Pn2+Pn2+Pn1+Pj1+Pj1+Pn2+Pn1+Pn1+Pj2+Pj1+Pn1+Pj2+Pn2+Pn1+Pn19/n19/n2+Pn1+Pn2+Pmf + eXRwLgFwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLwBwLwBxLwBv + LwBwLwBwLgOmfnP2+Pr1+Pn1+Pn1+Pj1+Pn19/n1+Pj29/n1+Pj1+Pn19/r3+PqETjZxLwBwLgBwLwBw + LwBvLgBwLgBwLgBvLwBwLgBvLgBwLgBvLwBvLgBwLwBwLwBwLgBxLwBvLAS9pJ72+fr2+Pn1+Pn1+Pn1 + +Pn19/n2+Pn1+Pn1+Pn1+Pn19/rp5eF8U0z4+fn1+Pr2+Pn2+fn1+Pn2+Pn1+Pn1+Pn1+fn1+Pr2+Pn2 + 9/aHXVJvLwJwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLgBwLgBwLwBxLwBxPTD4+fr19/n1 + +Pn1+Pn2+Pn19/j19/n19/n1+Pn1+Pn19/jRw71oJgRxLgBwLgBwLgBwLwBwLwBwLwBvLgBvLwBwLwBw + LgBwLgBwLgBwLgBwLwBxLgBxNRz4+vj19/j2+fn2+Pn29/n2+Pn1+Pn1+Pn1+Pn1+Pn3+Pnq5eNlJw1v + LgBvLgBvLgBwLQBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLQBwLQBwLQBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBwLgBvLwBw + LwBwLwBvLgBvLgBwLwBwLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLgBw + LgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLwBwLwBwLgBwLwBtKgO4n5z2+Pr1+Pj1+Pn1+Pn19/n1+Pn1 + +Pn2+Pn1+Pn1+Pn2+fr2+Pr1+Pn1+Pj2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn29/n2+Pj2+Pn1+Pj2+Pn1+fr2 + +Pj2+Pn1+Pj19/n1+Pn1+Pn19/j1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pj2+PmgeXRwLgFxLwBwLgBw + LwBwLwBwLgBwLgBwLwBwLwBwLQBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgOmf3T2 + +Pr1+Pn19/j19/j2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n3+fmETjdxLwBwLgBwLgBwLwBvLgBwLwBwLgBw + LgBwLgBvLwBvLgBwLgBwLwBwLgBwLwBwLgBxLwBxLgGTZ1r4+/z2+Pn19/n2+Pn2+Pn2+Pj2+Pr2+Pn2 + +Pn2+fn2+Pn5+/u7qKD3+fr2+Pn1+Pr2+Pr1+Pn2+Pn2+Pr1+Pj2+Pn1+Pj1+Pns5+ZtMRpxLwBwLwBw + LgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvNyX29vT1+Pn2+Pn1+Pn1+Pn2+Pn1 + +Pn1+Pn1+Pn1+Pn2+Pnr5eRpLBFvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLgBw + LgBwLAKfenP3+vv09/j19/j1+Pn1+Pn19/n29/n19/n2+Pr1+Pr39/nNu7VpIwNwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBvLgBwLwBwLgBvLgBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLgBvLgBwLwBwLwBvLwBwLwBvLwBw + LgBwLgBvLgBwLwBwLgBvLwBwLgBvLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBvLQBvLgBwLgBvLwBw + LwBvLgBvLgBvLgBwLgBwLwBwLwBwLwBuKwO5n5v2+fn1+Pj2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2 + +Pj2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+fr1+Pn2+Pn1+Pn1 + +Pn1+Pn1+Pn1+Pj1+Pj1+Pn19/n2+Pn1+Pn1+Pn19/n2+PmgeXNwLwFwLwBwLgBwLgBwLwBwLgBwLwBw + LgBvLwBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBvLgSmf3X2+Pn1+Pn19/n19/n2 + +Pn19/n29/n1+Pn1+Pn1+Pn1+Pn3+fqETjdxLwBwLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBw + LgBwLwBwLwBwLwBwLgBwLwBxMAB0NyDy8O/1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn3 + +Pr19/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n2+Pn1+Pj1+PnJt7RqJwRwLwBwLwBwLwBvLwBvLgBwLwBw + LgBwLwBvLwBwLgBwLgBvLgBvLwBvLwBvLQBoJAne2Nb19/n1+Pn1+Pn2+fn2+Pn1+Pn2+Pn29/n1+Pn1 + +Pn4+vuTaV1uLAFwLwBwLQBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBxMABrLRTh2db1+Pn1 + +Pn1+Pn1+Pj1+Pj19/n1+Pn1+Pn1+Pj19/j19/mvkIduLAFwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLQBwLABwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBvLwBw + LgBwLwBwLgBwLwBwLgBvLgBwLgBwLwBvLgBwLgBwLwBvLgBwLwBvLwBvLwBvLwBvLwBwLgBvLgBvLgBw + LwBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBw + LgBwLwBwLwBwLwBvKwO4n5z2+fn2+Pn2+Pn2+Pn29/j1+Pn29/j2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1 + +Pn2+Pn2+Pj2+Pn1+Pn1+Pj19/n1+fn19/j1+Pn2+fj1+Pn1+Pn2+Pn29/n1+Pj1+Pn1+Pn1+Pn29/j2 + +Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+PmfeXRwLwFxLwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBvLgBwLwBw + LwBvLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgSmgHX2+Pr1+Pn1+Pn19/j1+Pn1+Pj1+Pn1+Pn1 + +Pj19/n09/n4+fqETzdxLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLwBw + LgBwLwBxLwBrJgLVxcD1+Pn1+Pn2+Pn1+Pn1+Pn1+fn2+Pn2+Pn2+Pr1+fn2+Pn29/j19/n2+Pj2+Pn2 + +Pn1+Pn1+fn2+Pn19/n1+Pn19/n3+fqadG5yMANwLQBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBw + LwBvLgBwLwBvLgBvLgBqJgXFsq/2+fr2+Pn1+Pn2+Pn19/n2+Pj2+fn2+Pn2+Pn1+Pn2+fvl3dtuMiFx + LgJvLgBwLwBwLwBwLgBwLgBwLwBvLwBvLgBwLgBxLwBwLwBrKwisj4f3+vr2+Pn1+Pn19/n1+Pj19/n2 + +Pn19/n19/n1+Pn1+Pn4+PqLW01vLgFwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBw + LgBxLQBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBw + LgBvLgBvLgBwLwBvLgBwLgBwLgBwLgBwLgBvLwBvLgBvLgBwLgBvLwBwLgBwLgBvLgBwLwBwLwBwLgBw + LgBvLwBwLgBvLwBwLgBwLgBvLwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLgBvLgBvLwBwLwBwLgBu + KgO5n5z1+Pn19/j1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj1+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pj19/n2 + +Pn1+Pn2+Pn1+fn19/n19/j2+Pn2+Pn2+Pn2+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 + +Pr2+Pn19/n2+fmgeXRxLgFxLwBwLgBwLwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBw + LgBvLwBwLwBwLwBwLgBwLwBwLQOlfnT3+fr1+Pn1+Pn29/n2+Pn19/n1+Pn1+Pn1+Pn19/n19/n4+fqF + TzhxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBxLQCo + hn32+fr2+Pn2+Pn2+Pn2+Pn2+Pr2+fn2+Pn2+Pn1+Pn2+Pn2+Pn29/n2+Pn2+Pr2+Pn1+Pn2+Pn2+Pn2 + +Pr1+Pn1+Pr5+vpxNCJxLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBvLwBvLgBwLgBwLgBw + LgBwLgOZc2/3+vv1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+fr2+Pnc09J2QTFuLAJwLgBwLwBw + LwBxLgBxLwBxLwBwLwBwLQBxLgBpKAinhXz29vb2+fr19/j19/n19/n1+Pj19/j2+Pn1+Pj1+Pj2+Pn1 + +Pjz8e9sKg9wLwBvLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBvLgBvLwBvLwBvLgBvLgBwLgBwLgBwLwBwLgBwLgBw + LgBvLwBvLwBvLgBvLQBwLwBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBw + LwBwLwBwLwBwLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBtKgO5n5z2+fr1+Pj2 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2 + 9/n2+Pn1+Pn2+fn2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn19/n1+Pj2+Pn2+Pn1+Pj1+Pn1+Pn1+Pn1+fn2+fmg + eXRxLwFxLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBwLgBw + LwBxLwBwLgOlfnP2+Pr1+Pn1+Pn2+Pn2+fn1+Pn2+Pj19/n2+Pn1+Pn19/j3+fqETzdxLwBwLgBwLwBw + LwBxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBxMACATjr4+fn2+fn2+Pr1 + +Pn1+Pn3+fn2+fn1+Pn2+Pn2+fn2+fn2+Pn3+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+frc0c5r + JQZwLgBwLwBwLwBwLwBwLwBvLwBwLgBvLgBwLwBvLwBwLwBwLgBvLgBvLgBvLgBvLgBwLwB0Nyb09PL1 + +Pr1+Pn2+Pn1+Pn1+Pn2+Pj2+Pn1+Pn1+Pn2+Pn1+Pr3+fry7+6pioN2Qi5nKA5uKgdxLgdwLwdvLQds + KQZmKhGEUkPMu7b3+fv1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj19/n1+Pn19/n2+Pj29/n19/jHtrFsKwRxMABv + LwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLQBwLQBvLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLQBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLwBvLgBwLgBwLgBwLwBvLwBwLwBw + LgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBv + LwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLgBwLwBuKgO5n5v2+Pr19/j2+Pn1+Pn1+Pn1+Pj1 + +Pj1+Pj2+fn1+Pn2+Pn19/n2+Pn1+Pn1+Pn2+Pn2+Pj1+Pj29/r2+Pn2+fj1+Pn19/j1+Pn1+Pn2+Pn1 + +Pn1+Pn2+Pn1+fn19/j1+Pn19/n19/j1+Pn19/n1+Pn1+Pn1+fn1+Pj1+Pn2+PmgeHRwLwFxLwBwLgBw + LgBwLgBvLgBwLgBwLgBvLwBwLgBwLwBvLgBvLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgOlfnP2 + +Pr1+Pn1+Pj19/n1+Pn1+Pj2+fn19/n1+Pj1+Pn19/n3+fmETzdwLwBwLwBwLwBwLgBvLwBwLwBwLwBw + LwBwLwBvLwBwLwBxLwBwLgBvLwBwLwBwLwBwLgBwLwBxLwBlJQjr6ef1+Pn2+Pn19/n2+Pr2+Pn2+fr1 + +Pn2+Pr2+Pn1+Pr1+Pn2+fn2+fr2+Pn2+Pr1+Pn2+Pn1+Pn2+Pn1+fn2+vuwkYlvLQFwLgBwLwBwLgBw + LgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLwBqJgTNvLf2+Pr19/j29/n1+Pj1 + +Pn2+fn2+Pn1+Pn1+Pj2+Pj1+Pj1+fr3+fn4+frz8/Lg19S8paK0oKCwn6C0oaHCrKno5OL29/f2+Pn2 + +Pn2+Pn1+Pj1+Pn29/n1+Pj19/j1+Pn19/j19/j19/n19/j3+PiRamFxMAFwLwBwLgBwLwBwLwBwLgBw + LgBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBvLgBvLgBvLwBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLgBwLgBw + LwBwLwBwLwBvLgBvLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBuKQO5n5v2+Pr1+Pj2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn1 + +Pj2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+PmgeXRwLgFwLwBwLwBwLwBwLgBwLwBwLwBw + LgBwLwBvLgBwLwBwLgBwLgBwLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgSlf3T2+fr2+Pr1+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/n3+fqETjdxMABxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw + LgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLQa7pKL2+Pr1+Pr1+Pn2+Pr1+Pn2+Pn2+Pr1+Pn2+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pn2+Pn2+Pn2+Pn4+vqIVkJyLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBw + LwBwLgBwLwBvLwBwLgBvLwBvLwBvLgBwLgBwLgBwLgCNXU/4+fn29/n1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn2+Pr2+Pj2+Pn1+Pj19/j19/j29/n19/j2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1 + +Pn2+Pn1+Pn1+Pn1+Pn1+Pj19/n1+Pni3dtrMBVxLwBwLwBvLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBxLgBvLQBwLgBwLgBwLgBwLwBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLgBvLwBwLgBvLgBwLgBwLwBwLgBwLwBvLwBwLgBvLwBvLwBwLgBwLgBwLwBwLwBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLgBvLgBvLgBwLwBwLgBwLwBv + LwBwLgBvLwBwLwBuKgO5npv2+Pr19/j19/j19/n1+Pj2+Pn1+Pn1+Pn2+fn1+Pj2+Pr2+Pn1+Pj2+Pr2 + +Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pj1+Pj2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/j1+Pn2+Pn19/n2 + +Pn2+fn19/n2+Pn19/n1+Pn1+Pn2+PmfenRwLgFxLwBwLgBwLgBwLgBvLgBwLwBvLwBvLwBvLgBvLgBv + LgBwLgBvLwBwLgBwLgBvLwBvLgBwLgBwLgBwLwBwLQSmf3X2+Pr2+Pn1+Pn1+Pn2+fn29/n1+Pn2+Pn1 + 9/n1+Pn19/n3+fmETjZxMABwLgBwLwBvLgBwLwBwLgBwLwBvLwBwLgBwLgBvLgBwLwBvLgBwLwBwLgBw + LgBwLgBwLgBwLwByMAGQaF/4+vv19/r19/n2+Pn2+fn2+Pn2+fn29/r2+fr1+fn1+Pn1+Pn1+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn19/n1+Prs5+ZuLxNwMABxLgBwLgBwLgBvLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBvLgBvLgBwLgBwLgBxLwBqKwvWy8j2+Pn1+Pn1+fn1+Pr2+Pn2+Pr2+Pn2+Pn2+Pr2+Pn1+Pn1 + +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn19/n1+fj1+Pj1+Pn1+Pn1+Pj2+Pj1+Pn1+Pn29/n1+Pn1+Pn1 + 9/j1+Pj1+Pn19/iggXpvLARwLwBwLgBvLgBvLwBwLgBwLgBvLQBwLgBwLgBvLgBwLgBvLgBwLgBwLgBx + LgBvLQBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBw + LgBvLgBwLgBvLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw + LwBwLgBwLgBwLwBvLgBwLwBwLwBvLgBwLgBwLgBwLwBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBu + KgO4npv2+Pr19/j1+Pj1+Pj2+Pn1+Pn1+Pn1+Pn1+Pr19/r1+Pn2+Pr1+Pn2+Pn2+Pj1+Pn2+Pn29/n2 + +Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pr1+Pn29/n2+Pn2+Pn2+Pn29/n29/n1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pr1+Pn2+PmgenRxLwFxLwBvLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBwLgBvLwBwLgBw + LgBvLgBwLgBvLwBwLgBwLwBwLQSkf3X2+fv19/n2+Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn19/n3+fqE + TjZxMABwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLwBvLwBwLgBvLgBwLgBwLgBwLgBxLgBx + LwBzOSPw7u32+Pr2+Pn1+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn1+Pn2+Pn1+Pj19/n2+Pn1 + +Pn2+fnHtbFrKQRwLgBwLwBwLwBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLwBw + LQBwLgBwLgByLwGAU0T19fT2+Pn2+Pn1+Pn1+Pn1+Pr2+fn1+Pn2+Pn2+Pn2+Pn1+fr2+fn1+Pn2+Pj2 + +Pr2+Pn3+Pn2+Pn1+Pn1+Pn2+fn1+fj1+Pn29/n1+Pn1+Pn19/j1+Pn19/n19/n19/j19/j1+Pni29lo + LxdwLgBwLwBvLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLgBw + LgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBw + LwBwLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBuKwO4n5v2+Pn19/j1 + +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+fn29/n29/r2 + +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+fn2+Pn2+Pn1+Pr2+Pmg + enRwLgFxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBvLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBw + LwBwLwBvLgOlf3T3+Pr2+Pn2+Pn19/n2+Pn1+Pn1+Pn19/n2+Pn19/n19/n3+PmFTjdxMABwLgBwLgBw + LgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBsKgrQwL33+fr2 + +Pn2+Pn1+Pr2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pr2+Pn2+Picdm9xLwJw + LwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBs + KwaskIv3+ff1+fr1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pj19/n09/j19vaLX1NwLwJwLwBwLwBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBwLwBvLgBvLwBwLwBvLwBvLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBvLwBwLgBv + LgBvLgBwLgBwLwBvLgBwLgBvLgBvLgBwLgBwLwBvLwBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBvLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBuKwO5npv2+fr1+Pj19/j1+Pn29/n1+Pn2 + +fn1+Pj29/n1+Pj2+Pn1+Pn2+Pj2+Pn19/n1+Pn2+Pn1+fj19/n1+Pn2+Pn1+Pn19/n2+Pn19/n1+Pn2 + +Pn1+Pn1+Pj2+Pn19/j2+Pn1+Pn2+Pn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn19/n2+PmgenRwLwFwLgBwLgBw + LgBwLwBwLwBwLwBwLwBwLgBwLgBvLgBvLgBwLwBwLgBvLwBwLgBwLgBwLQBwLgBvLgBwLwBvLgOlfnT2 + +Pn2+Pn19/j1+Pj1+Pn19/n1+Pj29/n1+Pj1+Pj19/n3+PmFTjdwMABwLgBwLwBwLwBwLwBwLgBwLgBw + LgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLgByMASjgXz4+fv2+Pn1+Pn29/n1+Pn1 + +Pn1+Pn2+fn2+Pn2+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+fn2+Pn29/n09PR1QzFxMABwLgBwLwBwLwBwLgBw + LgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBxLwBwLgBwLgBwLgBwLgBwLwBwLwBvLQBwLgBtLhPRv7z3+fr1 + 9/j2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn19/n19/j1+Pn1 + +Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pj1+Pj19/j2+Pm0l41rKANvLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLQBvLgBwLgBv + LgBwLgBwLgBvLwBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBw + LgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBvLgBw + LwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBuKgO5npv2+Pn2+Pj2+Pn2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn1+Pn2 + +Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+fn1+Pn2+Pn2+Pn2+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pj2 + +Pn29/n19/n2+Pj2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn3+PmfenRwLgFwLwBwLgBwLwBwLwBwLgBwLgBw + LgBwLwBvLgBvLgBwLwBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgOlf3P3+Pv2+Pn1+Pn19/n2 + 9/n1+Pn29/n2+Pn1+Pn1+Pr19/j4+fqETjdxLwBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBw + LwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBxMQGBTj739vb2+Pn2+Pr2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1 + +Pn2+Pr1+fn2+Pn29/n2+fn1+Pn1+Pr2+Prb09JoKAlvLgBxLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBw + LgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwFwMRve1M/2+fr19/n19/n2+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj2+fn2+Pn19/n1+Pn2+fn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2 + +fn2+Pn1+Pj1+Pn3+PnOwLtsLQ9wLgBwLgBwLwBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLQBwLQBwLgBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBwLgBwLgBvLgBwLgBw + LQBvLgBwLwBwLgBwLgBwLwBwLwBwLwBvLwBwLgBvLwBwLgBwLgBvLgBvLwBwLgBwLgBwLwBwLgBwLgBv + LgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBvLwBw + LgBwLwBwLgBwLgBuKgO4npv2+Pr1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2+Pn1+Pn1 + +Pn1+Pn29/n1+Pn2+Pn2+Pn2+Pr1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1 + +Pn19/n2+Pn1+Pn1+Pn2+Pn1+Pn2+PmfenRwLwFxLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLQSkfnX2+Pr2+Pr2+Pn2+Pn29/n1+Pn2+Pn2+Pn1 + +Pn1+Pn19/j3+fqETjdwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBv + LgBwLgBwLwBwLwBwLwBxLgBqKhHl3t32+Pn3+Pn2+Pn1+Pn2+fn2+fr1+fn2+Pr2+Pn1+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pr2+Pn2+fqnjIdxLwVxLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBwLwBv + LgBwLwBvLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBxLwBuMhrSxL32+fn09/n2+Pn2+Pn1+Pn1+Pn1+Pn1 + +Pn1+Pn2+Pn19/j2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn19/n2+PnK + urFrMBVwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBw + LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLgBvLgBwLwBw + LgBwLwBvLgBvLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBxLwBwLwBwLwBwLwBwLwBu + KwO4npv2+Pr19/j1+Pn19/j1+Pj2+Pn2+Pn19/j2+Pn1+Pn1+fn1+Pn2+Pj2+Pn1+Pn2+Pn1+Pn1+Pj1 + +Pn2+Pn2+Pn2+Pn19/n1+Pn19/n2+Pn2+Pr1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2+Pj19/n2+Pj1+Pn1+Pn2 + +Pn1+Pj1+Pn2+PmfeXRwMAFxLwBvLgBwLgBvLwBwLwBxLwBvLgBvLwBvLwBwLgBwLwBwLwBwLwBwLwBw + LwBwLwBwLgBwLgBwLgBvLgBwLQSkf3T2+Pr1+Pr19/n1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn19/n1+Pn3+fqE + TjdxMABwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBw + LgByLwBtKAO8o5/1+Pn1+Pn2+fn19/n2+Pn1+Pn2+Pn2+fr2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn4 + +fqBUUJxLwFxLwBwLgBwLwBwLwBvLwBwLgBxLQBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBw + LwBvLgBwLwBwLwBwLgBvLgBwLgBxLwFsMRi5oJr29/f1+Pn1+Pj2+Pr2+Pn1+Pn19/j2+Pn2+Pn19/n1 + +Pn1+Pj1+Pn1+Pn19/j1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj1+Pn19/n2+fr19vWzlZJqKw9vLwFvLgBvLgBv + LgBvLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLQBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLgBwLgBw + LwBwLgBwLgBvLgBwLgBvLgBvLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBv + LgBwLwBvLwBvLwBwLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBuKgO5n5v2+fr1+Pn1 + +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn29/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pmf + eXRwLwFxLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLwBvLgBw + LwBwLwBwLgOkf3P2+Pr1+Pr1+Pr1+Pn2+Pr1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn3+fmDTDZxLwBxLwBwLgBw + LwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBxLwBxLwKOX1X4 + +vv2+fr1+Pn19/n2+Pn1+Pr2+fr2+fn2+fn2+Pr1+Pn1+Pn2+Pn1+Pn2+Pr2+Prp4+FqLRRwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBw + LgBvLgBwLgBxLgBxMABsKwaOX1Tl3dv3+fr2+fr2+Pr2+Pn1+Pj1+Pn2+Pj2+Pn2+fn2+Pn2+Pn2+Pn2 + +Pn1+Pn1+Pn19/n2+Pn2+Pn1+Pr2+Pr3+fnl396LWUtrKAVxLgBwLgBvLwBwLgBwLgBwLgBvLgBvLwBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLwBvLwBvLgBvLwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBv + LgBwLwBwLgBvLgBwLwBwLgBwLgBvLgBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBw + LgBwLgBwLwBvLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBxLwBuKwO5oJv2+fv2+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pj1+Pn1+fj2+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pn2+Pn1+fn2+Pr1+Pn19/n1+Pj2 + +Pn19/n1+Pn2+fr1+Pn1+Pn2+Pn1+Pj29/n1+Pn2+Pn2+Pj1+Pn1+Pn29/n2+PmfenRxLwFxLwBwLgBw + LwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLwBvLwBvLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBxLQOkf3L1 + 9vj19/n09/j09/j09/j19/jz9vf09/jz9vfz9vf09/j39/mDTTRxLwBxLwBwLgBvLwBwLgBvLwBvLgBw + LwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLwBpJg329vX19/n09/j19/n0 + 9/j1+Pr09/j09/j09/f19/j19/j19/j19/j09/n09/j2+PnEr6xsKAVwLgBwLwBwLwBwLgBwLgBwLgBw + LwBwLgBwLwBwLwBwLgBwLgBvLgBvLwBwLwBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLgBw + LgBwLwBvLQJtLhidfHTl39z4+vr2+Pn19/f1+Pn1+Pr2+Pn1+Pn1+Pn1+Pn1+Pn0+Pn1+Pn2+Pr19/n0 + 9/n1+Pn4+vvk392ffHlsLhlwLQFxLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBvLgBw + LgBwLgBwLgBvLgBwLgBvLgBvLgBvLgBxLgBwLABwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLgBvLQBw + LgBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLgBwLwBvLgBwLwBvLgBwLgBvLwBvLgBwLgBwLwBwLgBwLgBw + LwBvLgBvLwBwLQBwLgBwLgBwLgBwLQBvLgBvLgBvLgBwLwBvLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBv + LgBvLgBwLwBwLwBwLwBwLwBwLwBxMABuKgO5n5z2+Pr1+Pj1+Pn2+fn1+Pj1+Pj1+Pn19/n2+Pn2+Pn2 + +Pr1+Pn1+Pn2+Pn1+Pj2+Pn1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+Pn2+Pj2+Pn1+Pn1+Pn1+Pn19/n1+Pn1 + +Pn1+Pn1+Pn1+Pr1+Pn1+Pn19/j1+Pn2+Pn1+Pn19/n2+PmfeXRwLgFwLwBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBvLwBvLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgKVZlLJtKjIsqbIs6fIsqbJ + sqbJsqfIsqbIs6fIs6bJsqfJtKjLtqp+RCZxLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLwBvLgBwLwBwLwBwLgBwLgBsKgCti33IsajIsabIs6bIsqbIs6fHsqfIsqfI + sqfJsqfJsqjIsqjJsqfIsqfIsqfJs6iPYlFwLgJwLgBwLgBwLgBwLwBwLwBwLgBvLwBvLgBwLgBwLgBv + LgBwLwBwLwBxLwBwLwBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLwBwLwBwLgBvLgBw + LAVpLBKIXlK5oJ3o5OH19PP4+vr2+fr2+Pn29/n2+Pn2+Pn1+Pn3+fr4+fv08/Hn4eC7opyIXlRnKxFx + LgVwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBxLgBwLABwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLwBvLgBwLwBvLgBvLwBwLwBwLgBwLwBwLwBwLwBvLgBwLgBvLwBvLgBvLgBwLgBwLwBwLgBwLgBw + LgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBw + LwBwLwBwLwBwLgBuKgO4npv2+Pr1+Pn1+Pn2+Pn1+Pn2+Pn2+Pj1+Pn1+Pn19/n2+Pn2+Pn1+Pn1+Pn1 + +Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn29/n1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+PmgeXRxLwFxLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLgBv + LgBwLgBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBvLwBwLgBwLwBxLwBwLwBwLwBwLwBwLwBxLwBxLwBw + LwBwLwBxMABxLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBvLgBwLwBw + LwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBvLwBwLwBxLwBwLwBwLwBxLwBwLwBwLwBx + LwBxLwBxLwBxLwBxLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBvLwBwLgBv + LwBwLQBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBvLgBvLgBwLgBwLgBwLwBwLwBxLwBv + KwJnJAVkIApvMBeCUj+JXlaLYVqKXVaCTjpyNRpjIApmJARwLAJwLwBwLgBwLwBwLwBwLwBwLwBvLwBw + LgBwLwBwLgBvLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBvLgBvLwBw + LwBvLgBwLgBvLwBwLgBwLgBwLwBvLwBwLwBvLgBvLgBvLwBvLwBvLwBvLwBwLgBwLgBvLwBwLwBvLwBv + LgBvLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBxLgBu + KwO3nZr2+Pn1+Pn1+Pj1+fn19/n1+Pn1+Pj19/j2+Pn2+Pn2+Pn2+Pn19/n2+Pn1+Pn1+Pj19/j19/j1 + +Pn1+Pn19/j1+Pn19/j1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn19/n19/n2+fn19/n1+Pj1+Pn1 + +Pn1+Pn19/n2+PiheXRwLwFxLwBwLwBwLwBwLwBwLwBwLgBvLwBvLwBvLgBvLgBwLwBwLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLwBvLgBxLgBwLgBwLgBwLgBv + LwBwLwBwLgBvLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBvLgBvLgBwLwBwLwBw + LwBvLwBwLQBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBw + LwBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLwBvLwBwLgBwLgBvLwBwLwBvLgBwLgBwLwBw + LgBwLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLwBwLwBwLgBwLgBvLwBxLgBwLwBwLgBwLwBxLwBy + MAJxLwRxLwRyMARxLgJxLgFwLwBvLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBw + LgBvLgBvLgBvLgBvLgBvLgBwLwBvLQBvLgBwLgBwLgBvLgBvLgBwLgBvLgBwLgBxLwBvLQBwLgBwLgBw + LgBwLQBvLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLgBwLgBwLwBwLgBvLgBvLgBwLgBvLgBvLwBwLwBw + LgBwLgBwLwBvLgBvLgBvLgBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLgBvLwBwLwBvLgBvLwBwLgBwLwBv + LgBvLgBwLwBvLgBwLgBwLgBwLwBvLwBwLwBwLwBvLgBwLwBwLgBwLwBvLgBwLwBtKgO4npr3+Pn1+Pn1 + +Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn19/j1+Pn2+Pn2+Pn1+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn19/n29/n2+Pn1+Pj1+Pn2+Pn2+Pn1+Pj2+Pmg + eXRwLgFxLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLwBw + LwBwLgBvLgBvLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw + LgBwLwBwLgBwLwBwLwBwLgBvLwBvLwBvLwBvLgBvLgBwLgBvLgBwLwBvLwBwLwBvLgBvLgBvLgBwLgBw + LwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw + LgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBvLgBwLgBvLwBvLwBwLgBwLgBwLgBwLwBwLwBvLgBvLwBwLgBw + LgBwLgBvLwBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBvLgBxLgBxLgBwLgBwLgBw + LgBxLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLgBw + LwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBvLQBvLgBwLgBwLgBwLABwLgBwLgBvLgBwLgBwLwBwLgBw + LgBvLQBwLQBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBvLwBwLwBwLgBwLgBwLgBvLwBwLgBv + LgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLgBvLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBw + LwBwLwBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBuKgO3npn2+Pn1+Pn2+Pn1+Pn2+Pj2+Pn2 + +Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj19/j19/n2+Pn1+Pn1+Pn19/j1+Pr2+Pn2+Pj1+Pn2+Pj2+fn2+fn1 + +Pn2+Pn1+Pn1+fj19/n1+Pr1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn29/n1+Pr19/n2+fmfeXNxLgFxLgBxLgBw + LgBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBvLgBwLgBwLgBwLwBvLgBwLwBvLgBvLgBwLgBvLgBwLwBv + LgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLwBwLwBw + LwBwLwBvLgBvLgBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLwBv + LwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLwBw + LwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBvLgBv + LgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLgBwLgBwLwBw + LwBwLwBwLwBvLwBwLgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBvLwBwLwBwLgBvLgBwLwBvLgBwLwBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLwBwLwBvLgBvLgBwLgBwLgBwLgBwLwBvLgBwLwBwLwBwLgBvLgBwLwBvLwBwLwBvLwBv + LgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBvLgBwLwBvLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLgBvLgBw + LgBwLwBwLgBwLwBvLgBvLgBwLgBwLwBtKgO4npr2+Pj19/j1+Pj1+Pn19/n1+Pn19/n1+Pn2+Pn2+Pn1 + +Pn1+Pj19/n1+Pj19/j2+Pj1+Pj2+Pn1+Pn2+Pj19/j1+Pn19/j1+Pj1+Pj2+Pj1+Pn1+Pj1+Pj1+Pn1 + 9/n2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pj1+Pn19/n2+PmeeXRxLwFxLwBwLgBwLwBwLwBwLgBwLgBv + LgBwLgBvLgBvLgBwLwBwLgBwLQBwLgBvLgBwLwBwLgBwLwBwLgBvLgBwLwBwLwBwLgBvLwBwLgBwLwBw + LgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBv + LwBwLgBwLgBvLgBwLgBvLQBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBw + LwBxLwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBvLgBvLgBvLgBwLwBvLgBwLwBwLwBw + LwBwLgBwLwBwLwBwLgBvLwBvLwBwLgBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLwBw + LgBwLwBwLgBwLgBvLgBvLgBwLwBwLwBwLwBvLgBwLgBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBvLgBv + LgBwLwBwLwBwLwBwLwBwLgBvLgBvLwBwLgBwLgBvLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLwBwLgBxLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LwBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLgBvLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBv + LgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBvLwBwLgBwLgBvLgBwLwBwLgBwLwBwLgBwLwBv + LgBwLgBwLwBwLwBuKQO4n5r2+Pr1+Pj2+Pn19/j2+Pj2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1 + 9/n2+Pj1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn19/j2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn1 + +Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+PmfeXRxLgFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBvLgBw + LgBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLwBw + LwBwLwBwLwBvLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBvLwBwLgBvLwBwLgBvLgBwLgBvLwBw + LgBvLwBwLwBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLgBwLgBwLwBw + LwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLwBv + LwBvLgBvLgBwLgBwLgBvLgBwLwBwLwBvLgBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBw + LwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLwBwLwBwLwBw + LwBwLwBwLwBvLwBvLwBvLgBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBwLgBx + LgBvLgBwLgBvLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBw + LgBwLgBwLgBvLwBvLwBwLgBwLwBwLwBvLwBvLwBvLgBvLgBwLwBwLwBvLwBvLwBvLgBvLgBvLgBvLwBw + LgBvLgBwLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBvLwBvLwBvLgBwLgBwLgBvLwBvLwBwLgBwLgBxLwBu + KgO5npr2+Pr1+Pj29/n2+Pj1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj19/n1+Pj1+Pn1 + +Pj2+Pn29/n2+Pn2+Pn2+fn2+Pn19/n2+Pn1+Pn1+Pn1+Pn19/n1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2 + +Pn1+Pn1+Pn2+fmfenNxLwFxLwBxLwBwLgBwLwBwLwBvLwBvLwBwLwBvLgBvLgBvLgBwLwBwLgBvLgBw + LgBwLwBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBwLwBvLwBwLgBvLgBwLgBwLwBvLgBvLwBwLgBwLgBw + LwBwLgBvLgBwLgBwLgBvLgBwLwBwLgBvLwBvLgBwLgBvLgBwLgBwLwBvLgBwLwBvLgBwLwBwLgBvLwBw + LgBwLgBwLwBvLwBwLgBwLwBvLgBvLwBvLwBvLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBvLgBwLgBwLgBvLgBvLgBwLgBvLwBvLgBwLwBwLwBvLgBvLgBvLgBvLgBwLwBvLgBw + LgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLgBwLwBv + LgBvLwBvLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLgBxLgBvLABvLgBwLgBw + LgBwLgBvLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLwBwLwBvLgBvLwBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBvLgBvLgBwLwBvLgBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBv + LgBwLwBwLgBwLgBwLgBvLwBwLgBwLQBvLgBvLgBwLgBwLgBwLwBwLwBwLwBwLwBuKgO4npr2+Pr1+Pn2 + +Pn1+Pn1+Pj29/n1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pn19/j2+Pn2+Pj1+Pn19/j1+Pj2+Pn1+Pj1 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n1+Pn2+Pj1+Pj19/n2+Pn29/n1+Pn2+Pj2+Pr1+Pn1+Pn1+Pn2+Pmf + eXNwLwFwLwBxLgBwLgBwLgBwLgBvLgBwLwBwLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBvLgBwLgBv + LgBwLwBwLgBvLgBwLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLgBwLgBwLgBwLgBw + LwBwLgBvLgBwLwBwLgBwLgBvLgBvLwBvLgBwLgBvLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLwBvLgBv + LwBvLwBwLgBwLgBwLgBwLwBwLwBvLgBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBw + LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBvLgBvLwBwLwBvLgBvLgBvLwBwLwBwLgBwLgBw + LwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBw + LgBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBwLwBvLgBvLwBwLgBwLgBvLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBvLgBw + LgBvLgBvLwBwLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBtKgO4n5v3+fn2+Pn1+Pn2+Pn19/n19/n1 + +Pn1+Pn2+Pn2+Pn2+fn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pn1+Pj2+Pn2+Pj1+Pn2+Pn2+Pr2+Pn1+Pn1 + +Pj2+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+fn2+Pn1+fn19/n2+PmgeXRwLwFxLwBwLwBw + LwBwLwBvLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLwBvLwBwLgBw + LgBwLgBvLgBwLwBwLwBwLgBvLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBvLwBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLwBvLwBvLgBwLwBwLwBwLwBvLwBwLgBvLgBv + LgBvLgBwLwBwLgBwLwBvLwBwLwBwLwBwLwBvLwBwLwBvLgBvLwBwLgBwLgBwLwBvLgBwLwBwLgBvLwBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLwBw + LwBvLgBvLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBvLwBvLgBw + LgBwLwBvLgBvLgBvLgBwLwBwLgBvLwBwLgBwLgBwLwBvLwBwLwBvLgBwLwBvLgBvLgBvLgBwLgBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBvLwBwLwBwLgBwLwBwLwBvLgBw + LwBwLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBwLwBvLwBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBw + LgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBtKwO5n5v2+fr1+Pn1+Pn1+Pn1+Pj2+Pj1+Pj1+Pn2+Pn29/n2 + +Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pj2+Pr1+Pn1+Pn1+Pn2+Pn19/j2+Pn2+Pn2+fn1+Pn19/j1+Pj2+Pn2 + +Pn1+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+fn2+Pr1+Pn2+Pn2+PmfenRwLwFxLwBvLwBvLwBwLwBwLwBwLwBw + LwBwLwBvLgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBxLgBwLwBwLwBwLwBwLwBw + LwBvLwBwLgBvLwBwLwBvLwBwLwBvLgBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLgBwLwBwLwBwLgBv + LwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLgBvLgBwLwBvLwBwLgBvLgBvLgBvLgBwLgBvLgBvLwBw + LwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBvLgBvLgBw + LwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBv + LgBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLgBvLgBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBw + LgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBw + LwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBuKgO5n5v2+vn1+Pn2+Pn2+Pn2+Pj19/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pj2+Pn1+fn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1 + +Pn2+Pn1+Pn1+Pn1+Pn1+fn2+Pn2+fmgeXRwLwFxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBw + LwBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLwBw + LwBwLgBwLgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBvLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLwBvLwBvLwBw + LwBwLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBvLwBwLwBwLgBwLgBvLwBwLwBvLgBwLwBvLgBwLwBwLgBw + LwBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLgBvLgBvLgBwLgBw + LgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBv + LgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBx + LwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLwBwLwBw + LgBwLgBwLwBvLwBwLgBwLwBwLgBwLwBvLgBwLwBvLgBvLgBwLwBwLwBwLwBvLgBwLgBwLwBwLwBwLwBw + LwBwLwBwLgBwLwBwLwBvLgBvLgBvLwBwLgBwLgBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBu + KgS5n5z1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+fn2+fn2+Pn1+Pn1+Pn1+Pj1+Pn2+Pn2+Pn1+Pn19/n2+Pn1 + +Pn2+Pn2+Pn2+fn1+Pn19/n19/n1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pn2 + +fn1+Pn1+Pn2+PmgeXRwLwFxLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBw + LwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLwBvLwBwLwBwLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBwLwBw + LwBwLwBvLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLwBvLgBvLwBwLwBvLwBwLwBvLgBw + LgBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLwBwLgBvLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBwLgBvLwBw + LgBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw + LwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBvLQBvLwBwLwBwLgBwLwBwLgBwLwBwLgBw + LwBwLgBvLgBwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLwBwLQBwLgBvLgBw + LwBwLgBwLwBvLQBvLgBvLgBwLgBwLQBvLgBvLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBw + LwBwLgBwLwBwLgBwLgBvLgBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLgBvLwBw + LgBwLgBvLgBwLwBwLwBvLgBwLwBvLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBuKgO5n5v1+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pj1+Pj1+Pn19/n1+Pn2+Pn1+Pj2+Pn19/j1+Pj2+Pr1+Pr1+Pj2+Pn2+Pn2+Pj1 + +Pr2+Pn1+Pn1+Pj1+Pn1+Pj2+Pn2+fn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn2+Pmg + eXNxLwFxMABxLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBw + LwBwLgBwLwBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBvLgBwLwBvLgBvLgBvLgBwLwBwLwBwLgBw + LgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLwBw + LgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBwLwBwLgBvLwBvLwBwLgBwLwBvLgBwLwBwLwBwLwBv + LgBwLgBvLwBvLgBwLgBwLgBwLwBvLgBwLwBvLgBwLgBwLgBwLwBvLgBvLwBvLgBvLwBwLgBwLgBvLwBw + LgBwLwBwLwBvLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLwBvMABwLwBwLgBw + LwBwLwBvLgBwLgBvLgBwLgBvLwBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBv + LgBvLQBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBvLgBwLgBvLwBwLgBwLwBvLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLwBwLgBwLgBwLwBvLgBwLwBwLgBwLwBw + LgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBuKgO5n5v2+fn1+Pn1+Pn1+Pn1+Pn1+Pn2 + +Pn1+Pn2+Pn1+Pj1+Pn2+Pn2+Pn19/n19/j2+Pn2+Pj1+Pj2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn19/n1 + +Pn2+Pn1+Pn1+Pn29/n2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+PmgeXRxLgFxLwBwLgBw + LwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw + LwBwLwBvLgBwLgBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLgBwLwBw + LwBwLgBwLgBwLgBwLwBvLgBvLwBwLgBwLgBvLgBwLgBwLwBvLwBvLgBwLgBvLwBwLwBwLgBvLgBvLgBw + LgBwLgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLwBw + LgBvLgBwLgBwLgBwLwBwLwBwLwBwLgBvLwBvLgBwLgBvLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBv + LwBwLwBwLwBvLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBvLgBwLgBwLwBwLwBwLwBwLgBvLwBvLwBwLwBw + LgBwLwBwLgBwLwBwLgBwLwBvLgBvLgBwLwBwLgBwLgBwLgBvLgBvLwBwLgBvLgBvLQBvLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBwLwBwLgBvLwBvLwBvLwBwLgBwLwBwLwBwLwBv + LgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBvLwBwLwBwLwBvLwBwLgBwLgBvLwBwLwBvLwBwLgBwLwBwLgBw + LgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBuKwO5n5z1+Pn19/n19/n2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n2 + +Pn1+Pn19/n1+Pn1+Pn1+Pn19/n1+Pj19/j1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1 + 9/n2+Pn2+Pn1+Pn1+Pn29/n1+Pn2+Pr2+Pn2+Pn19/n29/mgeHRvLwFxLwBwLgBwLwBxLwBwLgBwLwBv + LwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLwBvLwBwLwBwLwBwLgBwLgBwLwBwLgBvLgBvLwBwLgBw + LwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLgBvLgBw + LwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLwBw + LwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLgBwLwBv + LgBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBvLwBwLwBwLwBwLwBv + LgBwLwBwLwBwLgBvLwBvLgBwLwBvLwBvLgBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBwLwBwLgBvLgBw + LwBvLwBwLwBvLwBvLwBwLgBwLwBwLgBvLwBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLQBvLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBwLwBvLwBwLgBwLgBwLwBwLgBv + LgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw + LwBwLwBvLwBwLgBuKgO4npv2+Pr2+Pn2+Pj2+Pn1+Pj1+Pn2+Pn2+Pj1+Pj1+Pn19/n29/n1+Pj2+Pn1 + +Pj19/n1+Pn19/n1+Pj2+fn1+Pj1+Pj1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn19/n1+Pn1+Pn19/n2 + +Pn2+Pn2+Pj2+Pn29/n1+Pn1+Pn2+PmgeXRwLgFxLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBv + LwBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLgBwLwBvLwBw + LwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBvLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBw + LwBwLwBwLgBwLgBwLwBvLgBwLQBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBvLgBvLwBvLwBw + LwBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLgBvLwBwLwBwLwBv + LwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLgBwLwBvLgBwLwBwLwBw + LwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBw + LgBwLwBvLwBwLgBwLwBvLwBvLwBwLwBvLwBwLwBvLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBx + LgBxLQBwLQBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBw + LwBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBv + LgBwLwBwLgBwLwBvLgBwLwBwLwBwLwBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBu + KgO5n5v2+Pn1+Pj1+Pn2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pj2+Pn1+Pn1+Pn1 + +Pn1+Pn1+Pn1+Pn2+Pj1+Pn2+fn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+Pn29/n2 + +Pr1+Pn1+Pn2+PmgeXRwLwFxLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBvLwBwLwBwLwBvLgBv + LgBwLgBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBvLgBwLwBw + LgBwLwBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLgBwLgBvLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBw + LwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBw + LwBwLgBwLwBwLgBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLwBwLwBw + LgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLgBwLgBwLgBwLwBwLgBwLwBw + LgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLgBvLwBwLgBvLwBvLgBwLgBwLgBwLwBwLgBvLwBwLgBvLgBw + LgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLABwLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LgBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBv + LwBwLgBvLwBwLgBwLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBuKwO5n5z2+fn19/n1 + +Pn1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+fn2+Pn19/n19/j2+Pj1+Pn2+Pn29/n1+Pn1+Pn19/n2+Pn2+fn1 + +fn1+Pn2+Pj2+fn2+Pn1+Pn1+Pn1+Pn29/n1+fn2+Pn2+Pj2+Pn2+Pr2+Pn2+Pn2+Pr2+Pr1+fn2+Pmh + eXRwLwFxLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLwBwLwBw + LgBwLgBwLgBwLwBvLwBwLwBvLgBwLwBxLwBwLwBwLwBwLwBvLwBwLgBvLgBwLgBwLwBwLwBwLgBwLwBw + LwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBw + LwBwLgBwLwBwLgBwLgBvLgBwLgBvLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLwBwLwBvLgBvLwBwLwBw + LwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLwBw + LgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLQBwLwBwLwBwLwBwLwBv + LwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBwLwBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABvLgBwLgBvLgBwLwBwLgBwLgBv + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBw + LwBwLwBwLgBvLwBvLwBwLgBvLgBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBwLwBwLgBw + LgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBtKwO5oJv2+Pn19/j1+Pn1+Pn2+Pj1+Pj1 + +Pn1+Pj1+Pn29/j1+Pn2+Pj2+Pn1+Pn1+Pn29/n2+Pn1+Pn1+Pj1+Pj2+fn1+Pn1+Pn1+Pj2+Pn2+Pn2 + +Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+fn2+Pn1+fn2+Pn1+Pr2+Pn19/n2+fmgeXRwLwFxLwBwLwBw + LwBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBw + LgBwLwBvLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBv + LgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLwBvLgBwLgBv + LwBwLwBvLgBwLgBwLwBwLgBwLgBwLwBwLwBvLwBwLwBwLgBwLwBvLgBwLwBwLwBvLwBwLgBvLgBwLwBv + LwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBw + LwBwLgBwLwBwLgBwLgBvLgBwLwBvLgBwLgBwLgBvLwBwLwBwLwBvLwBwLwBwLwBwLgBwLgBvLwBvLgBv + LgBwLwBwLwBvLwBwLwBwLwBvLwBwLgBvLwBvLgBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLQBwLgBwLgBv + LgBwLgBwLgBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBw + LgBwLwBwLgBwLwBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBxLwBvLgBwLwBwLgBwLwBw + LgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBuKgO5oJv2+Pr2+Pn1+Pn2+Pn29/r2+Pn1+Pn2+Pn1+Pn1+Pn2 + +Pr1+Pn1+Pn1+Pn1+Pr2+fn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn19/n1 + +Pn1+Pn1+Pn1+Pn2+Pn2+fn1+Pn2+Pr2+Pn1+fn2+Pr2+PmgeXRwLwFxLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLgBvLgBvLgBwLwBvLwBwLgBwLgBw + LgBwLgBwLwBwLwBwLgBvLwBwLwBwLwBwLwBvLgBwLwBvLgBvLgBwLwBwLgBxLwBwLwBvLgBwLgBwLgBw + LwBwLgBwLgBwLwBvLgBwLgBvLwBvLwBwLgBvLgBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBvLwBvLwBwLgBwLgBwLgBw + LgBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBvLgBvLwBwLwBwLwBvLgBwLwBwLgBvLgBvLwBvLgBw + LgBwLwBvLwBvLwBwLwBwLwBvLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLgBvLgBvLgBwLwBwLgBw + LgBvLwBwLwBwLwBwLwBwLwBvLwBvLwBvLwBwLwBvLgBvLwBwLgBwLgBwLwBvLgBvLQBwLgBwLgBvLgBw + LgBwLgBwLgBwLwBxLwBwLQBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLQBwLwBwLgBwLgBwLgBwLgBwLwBw + LgBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBvLgBwLgBwLwBwLwBwLwBwLwBvLwBwLwBvLwBwLwBvLwBw + LgBwLwBwLgBwLgBuKgO6n5z2+Pr1+Pr2+Pj2+Pn2+Pr2+Pn2+Pn1+Pn1+Pn1+fn2+Pn1+Pn1+Pn2+Pn1 + +Pn1+Pj1+Pn19/n1+Pj2+Pn1+Pn1+Pj1+Pn1+Pr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pj2+Pj2+Pj1+Pj2 + +Pn2+Pn2+Pn1+fn2+Pn1+Pn2+Pn2+PmfeXRxLwFxMABwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBw + LgBwLgBwLgBwLgBwLwBvLwBvLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBw + LwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLgBvLgBvLgBw + LgBwLgBwLgBwLwBwLgBvLgBwLgBvLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBw + LwBvLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLwBxLgBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBwLwBw + LgBwLgBwLgBvLgBwLgBwLwBwLgBwLwBwLgBvLgBvLgBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLwBwLgBv + LwBvLgBwLgBvLgBvLgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBvLwBwLwBwLgBv + LwBwLwBvLgBvLwBwLgBwLwBwLgBwLwBvLgBwLwBvLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLQBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBw + LwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBvLwBvLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBw + LwBwLwBvLwBwLwBwLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBu + KgO5n5z2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+fn1+Pj2+Pn1+Pn1+Pn2 + +Pj2+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn1 + +Pn2+Pn1+Pj2+PmgeXRxLgFxLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBvLwBv + LwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBw + LwBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBvLwBwLgBwLwBwLwBv + LwBvLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBvLwBvLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBv + LgBwLgBwLgBwLwBwLwBvLgBwLgBwLwBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBw + LwBwLwBwLwBwLgBwLgBvLwBvLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBvLgBvLwBwLwBvLwBwLwBvLgBv + LwBwLgBwLwBwLwBvLwBwLgBvLgBwLgBwLgBvLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBvLwBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLgBvLQBwLgBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLwBvLwBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBw + LwBwLgBwLwBwLwBvLgBvLwBwLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBtKQO5n5v2+Pj2+Pn2 + +Pn1+Pr2+Pn2+Pn1+Pn19/j1+Pn1+Pn29/n1+Pn2+Pj1+Pn2+Pn19/n1+Pj2+Pn2+Pn2+Pj1+Pn1+Pn2 + +Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pr2+Pn1+Pn1+Pr2+Pmh + eXRwLgFxLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw + LwBvLwBvLgBvLgBwLwBvLgBwLwBwLgBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBvLwBwLwBwLwBwLgBw + LgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBvLgBwLgBwLwBw + LgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBw + LgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLwBwLgBwLgBvLgBwLwBwLwBwLwBvLgBwLwBwLwBw + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBvLgBvLwBvLgBvLgBvLwBwLgBwLwBvLwBwLwBwLwBw + LgBvLwBvLwBvLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLwBvLgBwLwBwLwBvLgBvLgBvLgBwLwBvLgBw + LgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBxLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLwBwLwBwLwBvLwBvLwBwLgBwLwBvLwBvLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBvLwBw + LgBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBvKwO4n5v1+Pn2+Pn1+Pr2+Pn2+Pn1+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+Pj2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1 + +Pn1+Pn2+Pn29/n1+Pj1+Pn1+Pj2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+fn1+Pr2+PmgenRxLwFxLwBwLgBw + LwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBv + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBw + LwBwLgBvLgBwLwBwLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBvLgBwLwBwLgBwLgBvLgBwLgBwLwBw + LgBwLwBwLwBvLwBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLwBvLwBvLwBwLwBv + LwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBvLgBvLgBvLgBvLgBwLwBwLgBvLgBwLgBvLwBvLwBwLgBvLgBv + LgBwLgBwLwBwLwBwLgBvLgBvLwBwLwBwLwBvLwBvLgBwLwBvLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBw + LgBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLQBwLwBwLwBwLwBwLgBvLwBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBvLgBwLgByLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBwLwBw + LgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBv + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvKgO4n5r1+Pn1+Pn2+fr2+fn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pj1+Pn1+Pj2+Pn1+Pj1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/n2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pr2+fmgenRwLwFxLwBxLgBwLwBwLgBwLgBwLwBw + LwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLwBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLwBvLwBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBvLwBvLgBwLgBvLwBwLwBvLgBvLwBw + LgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBvLwBwLwBvLwBwLgBwLgBwLwBwLwBvLgBwLwBwLgBw + LgBwLwBwLgBvLwBwLwBvLgBwLwBwLgBwLwBvLgBvLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBvLwBvLwBvLgBwLgBwLwBwLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBw + LgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLgBwLwBwLwBwLgBvLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBxLwBvLgBwLgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLwBw + LwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBvLwBwLwBvLgBwLgBvLwBvLQBw + LwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLgBwLgBvLwBwLgBvLgBwLwBwLwBw + LwBwLgBwLwBvLgBuKgO3n5v2+fr2+Pn2+Pr2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2 + +Pn2+Pn19/r1+Pn1+fn2+Pn2+Pn2+Pr2+Pn1+Pn1+Pn1+Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+PmgeXRwLgFxLwBwLwBwLwBwLgBvLgBvLwBwLwBwLwBwLgBwLgBw + LwBwLwBwLwBwLgBvLgBwLwBwLwBwLgBvLwBwLwBwLgBvLwBwLgBvLgBwLgBvLgBwLwBwLgBvLgBwLwBw + LwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLwBw + LwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLwBvLwBvLwBvLgBvLgBvLgBv + LwBvLwBwLwBwLgBwLwBwLgBvLgBwLwBvLwBwLgBvLwBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw + LwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBxLwBwLgBwLgBvLQBwLgBvLgBvLgBwLgBwLwBvLgBvLwBwLwBw + LgBvLgBwLwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLgBvLwBwLwBwLgBwLwBvLgBvLwBvLgBwLgBv + LgBvLwBwLwBwLwBwLgBvLgBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBx + LwBwLQBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBvLgBvLgBwLwBvLwBxLwBwLwBwLwBw + LwBwLwBwLgBwLgBvLwBwLgBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBxLgBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLgBwLgBvLwBwLgBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBt + KgO4n5v2+Pr1+Pn1+fn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1 + +Pn29/n2+Pn2+fn1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pn1+Pn2+fmgenRwLgFxLwBwLgBwLgBwLgBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLgBw + LwBwLgBwLwBwLwBwLgBvLwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBvLwBw + LwBvLgBvLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBvLgBvLwBwLwBwLgBvLgBvLwBwLgBvLgBwLwBwLwBw + LgBwLgBwLwBwLgBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLgBvLwBvLgBvLgBwLwBwLwBwLwBwLwBvLgBv + LgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBvLgBwLgBvLwBwLwBwLgBwLwBvLwBvLwBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBvLgBwLgBwLwBvLwBwLwBwLwBwLgBw + LwBvLgBwLgBvLwBvLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBxLgBvLABwLgBwLgBw + LgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBxLwBwLgBvLgFtKwZtLAZtLAZtLAVtKwVtKwVt + KwZtKwZtLAZtKwVtKwVuKwVtKwVtKwZtKwZtKwZtLAZtKwZtKwZtKwZtKwZtKwZtKwZtKwZtKwZtKwZs + LAZtKwZsKwZtKwVtKwVtKwZtKwZsKwZtKwZsKwZtKwZtKwZsKwZtKwZtKwZtKwZqJwe2n5v2+Pr2+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1 + +Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn2+fme + enVtKwduKwZtKwZtKwZtKwZtKwZtLAZtKwZsKwZtKwZtKwZtKwZtKwZtKwZtKwZtLAZtKwZsKwVtKwZs + KwVtKgZtKwZtKwVtKwVtKwZtKwVtKwVtKwVtKwZtLAVuLAZtKwZtKwZtKwZtKwZsKwVtKwVtKwVtKwZu + KwZtKwZtKwZtKwZtKwZuLARwLwBwLgBwLwBwLgBxLwBwLwBvLgBvLwBwLgBwLgBwLgBwLwBwLwBwLwBw + LgBwLwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBvLwBvLgBwLwBwLwBw + LwBvLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBw + LgBwLgBwLwBvLwBwLwBwLgBwLwBwLgBwLgBvLwBwLgBwLwBwLgBvLwBwLwBvLgBwLgBwLwBwLgBwLgBv + LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLwBwLgBwLgBwLgBwLgBwLwByMAF1Nxi4oZi3n5m3oJq2npi2npe1n5e1npi2npi2n5i1npi1 + n5e1npi1npi1n5i3oJm2n5i1oJm3n5m2oJq2n5q2n5m2oJm2n5m2oZm2n5q2npm2n5m2npi2oJm2oJi1 + npi2n5m2oJm1n5m2oJi3n5m2oJq2n5i2oJm2oJm2oJq1oJqznpbX0dD2+Pr29/j2+Pj2+Pn1+Pn2+Pn1 + +Pn1+Pn2+Pn29/n1+Pn1+Pj1+Pn2+Pn19/n2+Pn1+Pn19/n1+Pr1+Pn1+Pn1+Pn1+Pj1+Pn1+Pn2+fn1 + +Pn2+Pj2+Pn1+fn1+Pn2+Pn1+Pj29/n1+Pn2+Pn1+Pn2+Pj2+Pr2+Pn2+fn2+frMwb61n5m1oJm3n5m3 + oJm3oZm3oJq3oJq2n5m2oJm2n5m2n5m1n5m1npm1npm2n5m1npm2n5i1oJi1n5i2oJe1n5m1n5i1npe1 + nZe1npi1npi1oJi1n5i2n5i1npi2n5i1n5m1oJq2n5i1npi2n5e2npe1npi2oJm3oJi2oJm1n5i1oJi3 + oJmgfHNtKQNwLwBwLwBwLwBwLgBwLwBvLwBvLgBvLgBvLwBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBw + LwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLwBvLgBvLgBvLwBwLgBwLgBwLgBvLwBwLwBw + LgBwLgBvLwBvLgBwLwBvLgBvLwBvLgBwLgBwLgBwLgBvLgBvLwBwLwBvLgBvLwBwLgBwLwBwLwBvLwBv + LwBvLgBwLgBwLwBvLgBwLgBwLwBvLwBwLgBvLgBwLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBvLwBwLgBw + LgBvLgBvLwBvLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBvLgBwLwBwLgBvLgBvLwBwLgBvLwBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLwBwLwBwLwF6QCT29vb19/j1+Pn1+Pn19/j19/n19/j19/j19/j29/j19/j2+Pj19/j2+Pn2 + +Pj2+Pn1+Pn19/n2+Pn2+Pn19/j1+Pn19vf19/n2+Pj29/j19/n29/n2+Pn29/n29/j1+Pn1+Pj19/j1 + 9/j19/n2+Pn19/n2+Pn2+Pn19/n19/n19/j29/j2+Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2 + +Pn2+Pn1+Pn1+Pn19/j1+Pn19/n19/n1+Pn2+Pn1+Pj1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1 + 9/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn19/r3+Pn2+Pn1+Pj29/n2+Pn19/n1+Pn2 + +Pn2+Pn2+fn2+Pj2+Pn1+Pj29/j2+Pn3+Pn29/j2+Pn2+Pn2+Pn2+Pn19/n1+Pn1+Pj2+Pn19/n2+Pn1 + +Pn2+Pn2+Pn2+Pn29/j2+Pn19/n29/n19/n29/n2+Pn2+Pj1+Pj2+Pn2+Pn2+Pn3+frEs61rJwRwLgBw + LgBwLgBvLwBwLwBwLwBvLwBwLwBwLgBvLwBvLgBwLgBvLgBvLwBwLgBvLgBwLgBwLgBwLwBwLwBvLwBw + LgBwLgBvLgBwLgBvLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLwBvLwBwLgBw + LgBvLgBwLwBvLgBwLwBwLgBwLgBvLgBvLwBwLgBwLgBvLwBvLgBwLgBwLwBwLwBwLwBwLgBwLgBvLgBw + LwBvLwBwLgBvLgBwLwBvLgBvLwBwLgBwLwBwLgBwLwBwLgBwLwBwLwBvLgBwLwBvLgBwLgBvLwBwLwBw + LgBvLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBvLgBvLgBwLwBwLwBvLwBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBvLgBwLgBwLgBxLgBwLQBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBx + MAF6PyP19vb1+Pn29/j1+Pn19/n2+Pn2+fn2+Pr2+Pn2+Pn2+Pn1+Pn2+Pn2+fn2+fn1+Pr2+fr2+fn2 + +Pn2+Pr1+fn2+Pn2+Pr19/n2+Pr2+Pn2+Pn1+fn2+Pr2+Pv3+Pn1+Pr1+fr2+Pn1+fn2+Pr2+fn2+fr2 + +Pr2+Pn1+Pn29/r2+Pj19/n2+Pn2+Pr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n1+Pj1 + +Pn1+Pn1+Pj1+Pj1+Pn2+Pn29/n2+Pn29/n2+fn2+Pn1+Pn1+Pr1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr2 + +Pr1+Pn2+Pn1+Pn1+Pn2+Pn1+fn2+fr19/n29/n2+Pn2+fr2+Pr3+fr2+fr2+Pr2+fr1+fr2+Pr2+Pn2 + +Pr2+Pn2+Pn2+Pr2+Pr29/r2+Pr3+Pr2+fr2+fn2+fr2+Pr2+Pr3+fn3+fr2+Pr2+fr2+Pr2+fr1+fr2 + +fv2+Pr2+Pr2+fr2+Pr2+Pr1+Pn2+Pr2+fr2+fr2+Pr2+Pr2+PrEsaxsJgRwLgBwLgBwLwBwLgBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLwBwLgBwLgBvLgBwLwBwLwBvLgBvLgBwLgBwLwBvLwBw + LwBvLwBwLwBwLgBvLgBwLgBvLwBvLgBvLwBvLgBwLwBwLgBvLwBvLgBvLgBwLgBwLgBvLgBwLwBvLwBw + LgBwLgBvLwBvLwBvLwBvLgBvLwBwLwBwLwBwLwBvLgBwLgBvLwBwLwBvLgBwLgBwLgBvLwBwLgBvLgBv + LgBwLwBwLgBwLwBwLgBvLgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLwBvLgBwLwBvLwBwLgBv + LgBwLgBvLgBwLgBwLgBwLwBvLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLgBx + LgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBxMAF6PyL29fb2+Pn1 + 9/n1+Pn29/n1+Pn1+Pr1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1 + +Pn1+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/n1 + +Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pr1+Pn1+Pn1+Pn1+Pn2+fn1+Pj19/n1+Pn1+Pj2 + +Pj29/n1+Pn1+Pn1+Pn1+Pn1+Pn2+fn1+Pn1+Pn2+Pn2+fn19/n1+Pj2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2 + +Pn1+Pn2+fr2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn2+Pr2+Pn2+Pn1 + +Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn1+fn2+Pn2+Pn1+Pn19/n2+Pn1+Pr2+Pn2+Pn1+Pn1+Pr1+Pn1+Pn1 + 9/n2+Pn1+fn1+Pn2+Pn2+Pr2+Pn1+Pr2+PrEsatrJgRwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBw + LgBvLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBvLwBvLgBwLwBvLgBvLwBvLgBwLgBvLgBwLwBwLgBw + LgBxLgBwLwBvLgBwLwBwLwBwLwBvLgBwLwBvLgBvLwBvLgBwLwBwLwBvLgBwLwBwLwBvLgBvLwBvLwBw + LwBvLgBvLwBvLgBvLwBwLwBwLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBvLwBwLgBwLwBwLwBwLwBvLwBw + LwBvLgBwLwBwLwBvLgBvLgBwLgBwLwBwLwBvLgBvLgBvLgBvLgBvLgBvLwBvLgBwLgBwLwBwLgBwLgBv + LwBwLwBwLgBvLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxMAF6QCP19vb2+Pj1+Pj1+Pn1+Pj1+Pn1 + +Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1 + +Pj2+Pn1+Pn2+Pn29/n2+Pn1+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pj2+Pn1 + +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj1+Pj2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn19/n19/j2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pr2+Pr2 + +fn2+Pn1+Pr1+Pn19/n2+Pn1+Pn1+Pn1+Pn2+fn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pn2+fn2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn2+fn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pr2+Pn2 + +Pn1+Pn2+Pn1+Pn1+PnEsaxrJgRwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBvLwBwLwBwLgBwLgBwLwBv + LgBvLgBvLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLwBwLgBvLwBvLwBw + LgBwLgBvLgBwLwBwLgBwLwBwLgBvLgBvLgBwLgBwLwBwLwBvLwBwLgBwLgBwLgBwLgBvLwBwLgBwLwBw + LwBvLwBwLgBwLwBwLwBwLgBvLgBwLwBvLgBwLwBwLwBvLgBwLgBvLwBwLgBwLwBwLgBvLgBwLwBwLgBv + LgBvLwBwLwBwLgBvLgBwLgBvLgBvLwBvLgBvLwBwLwBwLgBwLwBvLwBvLwBwLwBwLwBvLgBwLgBvLwBv + LgBvLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwMAF6PyL19vX1+Pn1+fn1+Pn2+Pn2+Pn1+Pn29/n1+Pn2+Pn1 + +Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+Pn1+Pn29/n1+fn2+Pn2+fj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1 + 9/n29/n2+Pn2+Pn1+Pn2+Pn1+Pr2+Pn2+Pn19/n1+Pj19/n1+Pn1+Pn1+Pn2+Pn29/j2+Pn2+Pn19/n2 + 9/j2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pj1+Pj2+Pj29/j19/n19/n1+Pn1+Pn2+fn1+Pn2+Pn1+Pn1+Pn1 + +Pn2+Pr1+Pn19/n19/n2+Pr1+Pj2+Pn1+Pn2+Pn2+Pn29/n2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+fn1+Pn1 + +Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pr1+Pn3+Pj1+fn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2 + +Pn2+Pn2+Pn1+Pr2+Pn2+fr2+fr1+fr2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pj1+Pr29/n2+Pn1+fn2 + +PnEsaxrJgRwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBvLwBwLwBwLgBwLgBwLwBvLwBwLgBvLwBw + LwBwLwBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBvLgBvLwBw + LwBvLgBvLwBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLwBvLwBwLgBvLwBw + LgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBv + LgBvLgBwLwBwLgBwLgBwLgBvLwBwLwBwLgBvLwBwLwBwLgBwLgBvLgBvLwBwLwBvLgBwLwBwLwBvLgBw + LwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBxLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBw + LwBwLwBwLgBwLwBwLwF6PyL19/b2+Pn2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+fn2+Pn2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn19/n1+Pj2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2 + +Pn2+Pn1+Pn1+fn1+Pn19/j2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pj2+Pn1+fn2+Pn1+Pn2+Pn1+Pr2 + +fn2+Pn2+Pn2+Pn2+Pn1+Pj1+Pn2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+fn2+Pn19/n1+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+fr2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pr1+Pn2+Pr2 + +Pn1+Pn1+Pj2+Pn1+Pn2+Pr1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pr1+Pn2+PnDsaxsJgRwLgBw + LwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLwBvLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBv + LwBwLwBwLgBwLwBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLgBvLgBv + LgBwLgBwLwBwLgBvLgBvLgBwLwBvLgBwLgBwLgBvLgBvLwBvLgBvLgBwLgBvLgBwLgBvLwBvLwBwLwBw + LwBvLgBvLgBvLgBwLgBwLgBwLwBvLwBvLgBvLwBvLgBwLgBvLwBwLwBwLgBwLgBvLgBvLgBwLwBvLgBv + LgBwLgBwLwBvLwBvLwBvLwBwLgBvLgBwLgBvLwBwLwBvLwBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + MAF7PyL19vX2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+fn1+Pn19/n1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj2 + +Pn1+Pj1+Pn1+Pn1+Pn1+Pj1+Pn19/n19/n1+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn2+Pn2+fr2+Pn2+Pn2+Pn1+Pn1+Pj2+Pn2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1 + +Pn1+Pn1+Pj1+Pn1+Pn1+Pn29/n1+Pn1+fn1+Pn2+Pj1+Pn2+Pn1+Pn1+Pn19/n1+Pn2+fn2+Pn2+Pn1 + +Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+fn2 + +Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pr29/n2+Pn1+Pn2+Pn1+Pn1+Pn2+Pr2+Pn2 + +Pn2+Pr2+Pn29/n2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+PnEsaxrJgRwLgBvLwBwLgBwLgBwLwBv + LgBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLwBvLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LwBwLwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLwBwLgBvLgBvLgBwLgBvLgBv + LgBvLwBvLgBvLgBwLgBwLgBvLgBvLgBvLwBvLgBvLgBvLwBvLgBwLwBwLgBwLgBwLwBvLgBvLwBvLgBw + LgBwLwBvLgBvLgBvLgBwLwBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLwBwLgBwLwBwLwBwLgBw + LgBvLgBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBx + LgBxLgBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBxLwF6PyL29vb2+Pn1 + 9/r1+Pn2+Pn29/j1+Pj2+Pn1+Pn2+Pn1+Pn2+Pn29/r2+Pn2+Pn2+Pr1+Pn19/n2+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pn1+Pn1+Pn19/j2+Pj1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pr1+Pn1+Pj1+Pn2+Pn2+Pn1+Pn1 + +Pn19/n2+Pn2+Pn2+Pn1+Pj19/n2+Pn1+Pj1+Pn1+Pn2+fj2+Pn1+Pn19/n1+Pn1+Pn1+Pn1+Pn1+Pj2 + +Pn29/j2+Pn1+Pn2+Pn1+Pn1+Pn1+Pr2+Pn1+Pn2+Pn2+Pr2+Pn1+Pn2+Pn29/n2+Pr2+Pn1+Pj1+Pn2 + +Pn2+Pn29/r3+fn1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+fn2+Pn1+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn1 + +Pn2+Pn1+Pn2+Pn2+fn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pj2+Pn1 + +Pn2+Pn2+fn2+Pn2+Pn1+Pn1+Pn1+Pn2+PnFsa1qJgRwLwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBw + LwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBvLwBwLwBwLwBvLgBxLwBw + LwBwLwBwLwBwLgBwLwBvLgBwLQBwLgBvLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBvLgBw + LwBwLwBwLwBwLgBwLwBwLgBvLwBwLwBvLgBwLwBwLwBwLwBvLwBvLwBvLwBwLwBwLgBvLwBwLgBwLwBw + LwBvLwBwLwBwLwBvLwBvLgBwLgBwLwBwLgBwLwBwLgBwLgBwLwBvLgBwLgBwLwBwLwBwLgBwLwBvLwBw + LwBwLwBwLgBvLwBwLgBvLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBxLwBxLwF5QCL29vb2+Pn2+Pn2+Pn2+Pn2+Pn1 + +Pn2+Pn2+Pn1+Pn2+fr1+Pn2+Pn2+fn1+Pj2+Pj2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+fn1+Pn2+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn1+Pj2+Pj1+Pn2+Pn1+Pn1 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+fn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pj1+Pn2+Pn1+Pn2+Pn2+Pn19/j1+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2 + +fn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+fj2+Pn2+fn2+Pn2+fn1+Pn1+Pn2+fn2+Pn1+Pn2+Pn2+Pn2 + +fn2+Pn2+fr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+fn2+Pn2 + +Pn1+Pn1+Pn2+Pn1+PnEsatrJgRwLwBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBwLwBvLwBwLwBwLwBw + LgBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLwBw + LwBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBwLgBvLgBwLwBwLgBw + LwBvLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBvLwBwLwBw + LgBwLwBvLwBvLgBwLwBwLwBvLgBwLwBwLgBwLgBvLwBvLwBwLwBwLgBwLwBvLwBwLgBwLgBwLwBwLgBv + LgBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBxLwBxLwBwLgBvLwBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxLwF6QCL29vX1+Pn1+Pn1+Pj2+Pn2+Pn1+Pn19/n2+Pn1+Pn1 + +Pr1+Pn1+Pn2+Pn19/j29/n1+Pn1+Pn2+Pj19/n1+Pn2+fn2+Pn1+Pn2+Pn1+Pn2+fn1+Pn1+Pn19/n2 + +Pn1+fn1+Pn1+Pn1+Pn19/j2+Pr1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+fn2+Pj1+fn1+fn2+Pn1+Pj1 + +Pn2+Pn1+Pn2+Pj2+Pn1+Pn2+Pj1+Pn19/n1+Pn1+Pj29/j2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pr1+Pn2+Pn2+Pn19/n1+Pj1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn29/n2+Pn2+Pn3+fr2+Pr2+Pr2 + 9/r2+fn1+Pn2+Pn2+fr2+Pr2+fn1+Pn2+Pn1+Pn2+Pj2+Pn1+Pn1+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1 + +Pn1+Pr2+Pn2+Pn1+Pn2+Pn1+fn2+Pn19/n1+Pn2+Pr2+fn2+fn1+Pr2+Pn1+fn2+Pr2+Pj2+Pn1+Pn2 + +PnEsaxrJgRwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBvLgBvLwBwLwBwLwBwLwBvLgBvLgBw + LgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBw + LgBvLgBwLwBvLgBvLgBwLgBwLwBvLgBwLgBvLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBvLgBwLwBwLgBw + LwBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLwBwLwBvLgBwLgBw + LwBwLwBwLwBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLgBvLgBvLwBwLwBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwMAByLwF6QCL19vb2+Pn2+Pn1+Pn2+Pn1+Pn29/n2+Pn1+Pr1+Pn2+Pn2+Pr1+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pr1+Pn2+Pr1+Pn2+Pn2+Pj2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1 + +Pn2+Pn1+Pn2+Pn29/n29/n1+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn2+Pn1+Pn2+fn1+Pj2+Pn2+Pr1+Pn1 + +Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pj29/n2+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn19/n2 + 9/n2+Pr1+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn29/n1+Pn2+Pn2+fn2+Pr2+Pr2+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pr2+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+fr3+Pn1+Pr2+fn2+Pn2+Pn1+Pj2+fn2 + +Pn2+Pr2+fr2+Pr1+Pn2+Pn2+Pn1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pr3+Pr2+Pn2+fnEsaxrJgRvLwBw + LwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBvLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBw + LwBwLwBvLwBwLwBvLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBvLgBwLgBwLwBvLwBw + LgBwLwBvLwBwLwBwLwBwLgBvLwBvLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLwBwLgBv + LwBwLgBwLgBwLgBwLwBvLgBwLwBwLwBvLgBvLwBwLgBwLgBvLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBv + LgBvLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLgBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLwBxLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBx + LwF6QCL19vb2+Pn1+Pn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pr2+Pn2+Pr2+Pn2+Pn2 + +Pn1+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1 + +fn2+fn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pj1+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn1+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+fn1+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+fn2+Pn2+fr2+Pn2+Pn2+fnEsaxsJwRwLgBwLwBwLwBwLgBwLwBw + LwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLgBwLgBw + LwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLwBvLgBvLgBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLwBw + LgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLwBw + LwBwLgBvLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLwBw + LwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBy + LwBvLQBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxMAF6PyP19vb1+Pn1 + +Pn1+Pn1+Pn2+Pn1+Pr2+Pr2+Pn2+Pn2+Pn29/n2+Pn2+Pr1+Pn2+fr2+Pn2+Pn29/n2+Pn2+Pn1+Pn1 + +Pn2+fn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pj2+Pn2+Pj1+Pn29/n2+Pn29/n2+fn1+Pn2+Pn2+Pj1+Pn2+Pn1 + +Pn2+Pn1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pj1+Pj2+Pn2+fr2+Pj2+Pn2+Pn1+Pn2+Pj1+fn1+Pn1 + +Pn1+Pj1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn1+Pn2+Pn2+Pn2+Pr2+Pn2+fn1+Pn2+Pn2+fn2 + +Pn2+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+fr1+Pn2+Pn2+Pn2+Pn2+fn1+Pn2+Pj2+fn2+Pn2+Pn2+Pn2+fn1 + +Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+fr2+fn2+fr2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pr2+fr2+frFsa1rJgRwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLgBv + LwBwLwBwLgBvLwBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBvLwBwLgBwLwBvLwBwLwBvLwBw + LwBwLgBxLwBwLwBwLwBvLwBwLwBwLwBvLwBvLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLwBw + LwBwLgBwLwBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBvLwBvLwBwLwBwLgBwLwBwLwBwLgBw + LwBwLgBwLgBvLwBwLgBvLwBwLwBwLwBwLwBvLwBxLwBvLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBv + LgBwLwBvLgBwLwBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBxLQBuKwBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwMABxMAF5PyL29vb2+Pn1+Pn1+Pr2+Pn2+Pn2 + +Pn1+Pn1+Pj1+Pn1+Pr2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn1 + 9/n19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn19/n2+Pn1+Pj2+Pn1+Pn2 + +Pn19/n29/n2+Pj2+Pn2+Pn19/n2+fn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn1+Pn2+Pn29/n1 + +Pn2+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2 + +Pr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+fn29/n2+Pn2+fn2+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pr1+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pr2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pr2+Pr2+fn2+frFsaxrJgRwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBw + LwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLwBwLwBxLgBwLgBvLwBwLwBv + LgBvLwBwLwBwLwBwLwBwLwBvLwBwLwBwLgBvLgBvLwBwLwBwLwBwLwBvLwBvLwBvLwBvLgBwLwBwLwBw + LwBwLgBvLwBvLwBwLwBvLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLwBwLgBwLwBwLwBw + LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBvLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBvLgBvLgBw + LwBvLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBvLgBwLQBpJwBwLgBwLgBwLgBwLwBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwF6PyP29vX2+Pn1+Pj19/n2+Pn1+Pn1+Pj2+Pn1+Pj2+Pn1 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn2+Pn1+Pn2+Pn2+Pr29/n2+Pn1+Pj2+Pn1+Pn29/j2 + +Pj2+Pn1+Pn2+Pj1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pn1+Pj2+Pn19/j1+Pj2 + +Pj2+Pn2+Pn1+Pj2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj19/j2+Pn2+Pn2+Pn2+Pj1+Pj1+Pn2+Pn2+Pj1 + +Pn29/n2+Pn2+Pn1+Pj2+Pn19/j1+Pj2+Pn1+Pn1+Pn1+fn2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pj1 + +Pn1+Pn29/n2+Pn2+Pn1+Pn2+Pj2+Pn2+Pn1+Pn1+Pn2+fr2+Pn1+Pn2+Pn19/j2+Pn2+Pn1+Pn1+Pn2 + +fn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2 + +PnFsaxrJgRwLgBwLwBwLwBxLgBwLwBvLgBwLgBwLgBwLwBwLwBwLwBwLwBvLgBvLgBwLwBwLgBvLgBv + LgBwLwBvLgBvLgBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLwBwLwBw + LgBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBwLgBvLgBw + LwBvLwBwLgBwLwBwLgBvLwBvLwBwLwBwLwBvLgBvLwBwLwBwLgBwLwBwLwBvLwBwLgBwLwBvLwBwLgBv + LgBwLwBwLgBwLgBvLwBvLgBvLwBwLwBwLgBvLwBvLwBvLwBvLwBvLgBwLwBwLwBvLgBwLgBwLgBwLgBw + LgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBvLABoJABwLQBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLQBwLgBwLwBxMAF6QCP19vb2+Pr2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pj29/j1+Pn1+fr1+Pn1+Pn2 + +Pn2+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pr2+Pn1+Pn2+Pn1+Pn1+Pj1+Pn19/n2+Pn2+Pn2+Pn19/n1+Pn1 + +Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn1+fn19/n1+Pn2 + +Pj2+Pj19/n2+Pj1+Pn2+Pn1+Pn19/j19/n19/n1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pj1+Pn1+Pn1 + 9/j2+Pn2+fn19/n1+Pn2+Pn1+Pn1+Pr2+Pr1+Pn2+Pn2+Pr2+fn2+Pn2+Pn1+Pn2+Pr1+Pn2+Pn1+Pn1 + +Pj1+Pn2+fn1+Pn2+Pn1+fr2+Pn2+fn2+Pn2+fn2+Pn2+Pr1+Pn2+Pn29/n2+Pr2+Pn2+Pn2+Pn29/j1 + +Pj2+fn2+Pn2+Pn2+Pr1+Pn1+Pn2+Pn1+fn1+Pj2+Pr1+fn2+Pn2+Pn2+Pn2+Pr2+fnFsqxrJgRwLgBw + LwBvLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBwLgBwLwBwLgBwLwBwLwBv + LwBvLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBvLwBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBvLgBvLgBwLwBwLwBwLwBwLgBvLgBwLwBwLwBvLwBvLgBwLwBw + LwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBvLwBw + LwBvLwBwLgBwLwBwLgBvLwBwLwBvLwBvLwBwLgBwLwBvLwBvLgBwLwBwLgBwLgBwLwBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBsKABmIgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLQBwLgBvLgBwLwBw + MAF6PyL29vX2+Pn1+Pn19/n2+Pn1+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+Pn2 + +Pn2+Pn2+fn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n1+Pn1 + +Pn1+Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2 + +Pn1+Pn2+Pn2+fn29/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn1+Pj2+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pn2+fn2+Pn2+fn2+fnEsKtrJQRwLwBwLgBwLwBwLwBwLgBw + LwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBvLwBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LgBvLwBwLwBwLgBvLgBwLwBwLwBvLwBwLgBvLwBwLwBvLgBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBw + LgBvLwBvLgBwLgBwLwBwLwBvLgBwLwBwLwBvLgBwLgBwLgBvLwBvLwBwLwBwLwBwLwBwLgBvLwBvLwBw + LgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBvLwBvLwBwLwBvLwBwLwBwLgBwLgBwLwBwLwBw + LgBwLwBwLwBvLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBp + JQBkIABwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxMAF6PyL19/X19/j1 + +Pn19/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pj19/n2+Pn1+Pj2+fn2+Pn2+Pn29/n2+Pn1+Pj2+Pn1+Pj3 + +fn1+Pr1+Pj1+Pn2+fn1+Pn2+Pn29/n19/n19/j2+Pn2+Pn1+Pn19/j2+Pn1+Pn19/n19/n1+Pn1+Pn1 + +Pn2+Pj2+fn2+Pn1+Pn2+Pn1+Pj2+Pn1+Pn2+Pn2+Pn2+Pn1+fn2+Pn1+Pj19/n1+Pn2+Pj2+Pj1+Pn1 + +Pn19/n1+Pn1+Pn2+Pn1+Pj1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn1+Pn1+Pj2+Pn19/n1+Pn2 + +Pn2+Pr2+Pr2+fn2+fn2+Pj1+fj29/n2+Pn29/j1+Pj1+Pn19/j1+Pn1+Pr2+Pn2+Pn1+Pn2+fn2+fr1 + +Pn2+fr2+Pr1+Pn2+fn2+fn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pr29/n1+Pn1+Pn2+Pn2 + +Pn1+Pn2+Pn2+Pn1+Pn2+Pr2+Pn2+Pn2+fnEsKtqJgRwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBwLgBw + LwBwLgBwLgBwLgBvLwBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBw + LgBvLwBvLwBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBvLgBvLgBwLgBwLgBvLgBwLgBwLwBw + LgBwLgBwLwBwLgBwLwBvLgBwLgBvLwBvLwBwLgBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBv + LwBvLgBwLwBwLwBvLgBwLwBwLwBwLwBvLgBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLwBw + LwBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBmIwBnJQZwLQBwLgBv + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBxMAF6PyP19vX2+Pn1+Pn19/n2+Pj1+Pn1 + +Pj2+Pn2+Pn1+Pr2+Pn1+Pn2+Pn2+fn29/n2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2 + +Pj1+Pn2+Pn1+Pn2+Pn1+Pn1+Pn29/n2+Pn2+Pn2+fn1+Pn29/n2+Pn2+Pn2+fn2+Pn2+Pn2+Pn19/j2 + 9/n1+Pn19/n1+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn19/n29/n1+Pn1+Pn2+Pn2+Pj1+Pn1+Pn1+Pn2+Pn2 + +Pj2+Pn19/n1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn29/n2+Pn29/j1+Pn2+Pj1+Pn2+Pn1+Pn2+Pn1 + +Pn29/n2+Pn2+Pn2+Pn2+Pn1+Pr2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr2+Pn1+Pn1+fn1+fr2+fn2+Pr2+Pn2 + +Pn1+Pn2+Pn2+Pn29/n1+Pn19/j19/n2+Pn2+Pn1+Pj2+Pn2+Pr2+Pr2+Pn2+Pn1+Pn1+Pr1+Pn19/n2 + +Pn1+Pr2+fr2+Pr2+fnEsKprJgRwLwBxLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBw + LgBwLwBwLgBwLgBwLwBwLwBvLwBvLwBxLwBvLgBwLwBwLgBvLwBvLwBvLwBwLwBwLgBwLgBvLwBwLwBw + LgBwLwBvLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBvLwBwLgBvLgBxLgBwLgBvLwBwLgBw + LwBvLgBvLgBvLgBwLwBwLgBwLgBwLwBvLgBwLgBwLwBvLwBwLwBwLgBvLwBwLwBvLgBwLgBwLwBvLwBw + LwBwLgBwLwBwLwBwLgBvLgBwLgBwLwBwLgBwLwBwLgBwLwBvLwBvLgBvLwBwLwBwLgBwLgBwLwBwLwBw + LgBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBiIQB6QylwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBxLwF7QCT19vb29/n1+Pn1+Pn2+Pj1+Pn1+Pn2+Pn1+Pn1+Pj1 + +Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn1+Pn29/n2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pn2+Pj2+Pn2 + +Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn29/j2+Pn29/n2+Pj1+Pn2 + +Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn19/n2+Pn2+Pn2+Pj1+Pn19/n2+Pn2+Pn2+fn2 + +Pn1+Pn2+Pn2+fj19/j2+Pj1+Pn2+Pn29/n2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn1+Pn29/n2+Pn2+Pj2 + +Pn2+fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+fn2+Pr1 + +Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pr2+Pn2+Pr1+Pn2+Pn1+Pn2+Pn2+Pn2+fr2+Pn1+Pn2+Pn2+Pn3 + +PnEsaprJgRwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLgBwLgBvLwBwLgBwLwBwLwBwLgBvLgBwLwBv + LwBwLgBwLgBwLwBwLgBvLgBvLwBvLgBwLgBwLwBwLwBvLgBwLgBwLgBwLgBwLgBwLwBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLwBvLwBvLgBwLwBvLgBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBv + LgBvLgBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLwBw + LgBwLgBwLwBwLgBvLgBwLwBwLwBvLgBwLwBwLwBwLwBvLwBwLwBwLgBwLgBwLwBvLwBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBmIQKKWkhwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLwBxLwBwLwF6QCP19vX1+Pj29/n1+Pn19/n1+Pn2+fn29/n1+Pn1+Pj1+Pj1+Pj2+Pn2+Pn2 + +Pn2+Pn19/j1+Pn1+Pj1+Pn1+Pn19/n2+Pn1+Pn1+Pj2+Pn29/n1+Pj1+Pn1+Pj2+Pn1+Pj19/n2+Pj1 + +Pn19/j2+Pn19/j19/j1+Pn1+Pj1+Pn1+Pj1+Pn2+fn29/n19/n2+Pj2+Pj2+Pn1+Pn2+Pj1+Pj1+Pn2 + +Pn1+Pn19/n19/n19/n1+Pn1+Pj1+Pn1+Pn1+Pn1+Pn1+Pj1+Pn2+Pn1+Pn1+Pn29/n29/n29/n1+Pn1 + 9/j2+Pn2+Pj2+Pn19/j1+Pj2+Pn1+Pn2+Pn2+fn1+Pn1+Pn1+Pn19/n1+Pn1+Pj1+Pj2+fn1+Pn2+Pn2 + +Pj1+Pn1+Pj1+Pn2+Pn2+Pn29/n1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+fn1+Pn1+Pn19/n1+Pn1+Pj19/j1 + +Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn19/n1+Pj2+Pn1+Pn2+Pj2+Pn2+Pn1+Pn2+Pn2+PjFsqtsJgRwLgBw + LgBwLwBwLgBwLwBvLwBwLgBwLgBwLgBwLwBvLgBvLwBwLgBvLgBwLgBwLgBvLwBvLwBvLwBvLgBwLwBv + LgBvLwBwLwBvLgBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBvLwBvLgBwLwBvLwBwLgBvLgBwLwBwLgBw + LgBwLgBwLwBvLwBwLgBxLgBwLwBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBvLwBwLgBwLwBvLgBw + LgBwLgBwLwBvLgBwLwBvLgBvLgBwLgBvLgBwLgBvLwBwLgBvLgBwLwBvLgBwLwBwLwBvLwBwLgBvLgBv + LwBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxNRiZbFxwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLwBx + LwF5PiP29vb2+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn19/n1 + +Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn19/n1+Pn2 + +Pn2+Pn2+Pn1+Pn1+Pn29/n2+Pn19/j19/j1+Pn2+Pn2+Pn29/n2+Pn1+Pn2+Pn2+Pn2+Pn19/n2+Pj2 + +Pn29/n1+Pn1+Pn19/n2+Pj2+Pj19/n2+Pn2+Pn2+Pn19/j1+Pn2+Pj1+Pn19/n19/j1+Pn1+Pn1+Pn2 + +Pn2+Pn1+Pj1+Pn1+Pn1+Pj29/n2+Pn2+Pn19/n29/n2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pj2+fn1+Pn29/j2+Pn1+Pn1+Pr1+Pn2+Pn2+Pn1+Pn2+Pn29/j2+Pn1+Pn2+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pr2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+PjFsaxrJgRwLwBwLwBwLwBwLgBwLwBw + LgBvLgBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLwBvLgBw + LwBvLwBwLwBwLwBvLgBvLwBwLwBvLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLwBw + LwBwLgBwLgBvLwBwLgBwLwBwLwBwLwBwLwBvLwBwLgBwLwBwLgBvLgBwLwBwLwBwLgBvLgBvLgBvLgBw + LgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBwLgBwLwBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBvLwBw + LgBwLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgCG + Uz6wk4xwLQBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwF5PyL19vb1+Pj1 + +Pn2+Pn2+Pn2+Pn1+Pj19/n1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj2+Pj1+Pn19/n2+Pn1 + 9/j2+Pn1+Pj19/n2+Pn2+Pj1+Pn2+Pn1+Pn1+Pn1+Pj1+Pn29/n1+Pn2+Pn19/j1+Pj2+Pn1+Pn1+Pn1 + +Pn1+Pj2+Pn19/n1+Pj2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+Pj1+Pn2+Pn29/j1+Pn1+Pn2+Pn2+Pj1+Pj1 + +Pn2+Pj1+Pj2+Pn19/n2+Pn2+Pj1+Pn2+Pn2+Pj1+Pn2+Pn1+Pj2+Pn19/j29/n2+Pn1+Pn2+fn1+Pj1 + +Pn2+Pn1+Pn2+Pn19/j1+Pj2+Pn2+Pn2+Pj2+Pn2+Pn2+Pn1+Pj2+Pn1+fn1+Pn2+Pn2+Pj2+Pn2+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+fn2+Pn2+Pn1+fn1+Pn29/n2 + 9/n1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+fjFsa1rJgRwLwBxLwBwLwBwLwBwLwBwLgBwLgBwLgBvLwBw + LgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLgBvLgBvLgBwLwBwLwBwLgBwLgBwLgBwLwBvLgBwLwBvLgBv + LgBvLwBwLgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBvLgBvLgBwLwBwLwBwLgBvLwBwLgBvLgBwLwBwLgBw + LwBvLgBwLgBvLgBvLgBvLwBwLgBvLgBvLgBwLwBwLwBwLwBwLwBvLwBvLwBvLgBwLwBvLwBvLwBvLwBv + LgBwLwBwLgBwLwBvLgBwLwBvLwBwLwBwLgBwLwBwLwBvLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBvLQBw + LgBvLgBvLgBvLgBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBxMACRY1DAqqNtKgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBxLwF5PyP19vb2+Pn1+Pn29/n1+Pn1+Pn1 + +Pj2+Pn2+Pn2+Pn29/n1+Pn2+Pj19/n1+Pn19/n1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pj2+Pn1+Pn1 + +Pn29/n2+Pn2+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pj1+Pj1+Pn29/j2+fn1+Pn29/n1+Pn29/n1+Pn2+Pn2 + +Pn1+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/j19/j2+Pn2+Pn2+fn1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj1+Pn2+Pj2 + +Pn1+Pn2+Pn1+Pj1+Pj2+Pn2+Pn1+Pn1+Pn2+Pn1+Pn29/n1+Pn2+Pn19/n1+fn2+Pn1+Pn2+Pn2+fn2 + +Pn2+Pn1+Pn2+Pn2+Pn2+fn29/n2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn2+fn2+Pj19/n2+fn19/n1 + +Pn2+Pn29/n1+Pj19/n2+fn2+fn19/n2+Pn1+Pn1+Pj1+Pn1+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn1+Pn2 + +Pn1+Pn1+Pn1+Pn1+PnFsa1rJgRwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLwBw + LwBvLgBwLwBvLgBwLwBvLwBvLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBvLwBwLwBvLgBvLgBwLgBwLgBv + LwBwLgBwLwBvLgBwLwBvLgBvLgBvLgBvLwBwMABvLwBwLwBwLgBvLwBwLgBvLgBwLgBvLwBwLgBwLwBv + LwBvLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLgBvLgBwLwBvLgBv + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBxLwCohnrg2NdoJQFwLgBwLgBwLwBwLgBwLwBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwF5PiL19vb2+Pn1+Pn1+Pj2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn1+Pn1+Pj29/j2+Pn2+Pn2+Pr2+Pn2+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pn1+Pn2+Pn2+Pn19/n1+Pn1+Pn2+Pn2+Pn29/j2+Pn2+Pn2+Pn2+Pn1 + +Pn1+Pn2+Pn2+Pn1+Pn1+Pn29/n2+Pn2+Pj2+Pn19/n29/n2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pn19/n19/n1+Pj2+Pn2+Pn19/n19/j29/n2+Pn1+Pn29/j2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn29/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fn2+Pn1+Pn2 + 9/n1+Pn2+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2+Pn2+Pn2+Pn2 + +PnFsa1sJgRwLwBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLwBvLgBwLgBwLgBwLwBvLgBvLgBvLwBwLgBv + LwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLwBwLwBwLgBvLgBwLwBw + LwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBvLwBwLgBwLgBwLwBvLwBwLgBvLwBwLwBwLwBwLgBwLwBwLwBw + LgBvLwBwLwBwLgBwLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBvLgBvLgBwLwBvLgBwLgBw + LwBvLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLwBvLwBwLgBwLgBwLwBwLgBw + LwBxLgBwLgBwLwBwLgBwLwBwLgBvLAC7opnu6+tzNhpxLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBxLwBwLwF5PyL19vX1+Pj1+Pj1+Pn29/n2+Pn2+Pn19/n1+Pn1+Pn1+Pn2+Pn2+Pj2+Pn1 + +Pn2+Pn1+Pj1+Pn2+Pn2+Pn1+Pj2+Pn1+Pj2+Pj1+Pn1+Pn2+fn2+Pn2+Pn29/n2+Pn2+Pn1+Pn1+Pn1 + 9/n2+Pj2+Pn2+Pn2+Pj1+Pn19/j19/j19/j1+Pn2+Pn1+Pn1+Pj1+Pn2+Pj2+Pj2+Pj1+Pn1+fn1+Pn1 + +Pn1+Pj19/n1+Pj2+Pj2+Pn1+Pn19/n1+Pj19/j19/j1+Pj2+Pn2+Pn2+Pn19/j1+Pn1+Pn2+fn1+Pn1 + +Pn1+Pn2+Pn1+Pj19/n1+Pn1+Pn1+Pn2+Pn2+Pn1+Pj2+Pn29/n2+Pn2+Pn2+Pj2+Pn2+Pn2+Pj2+Pn2 + +Pn2+Pn2+Pn2+Pn2+fr29/n1+Pn2+fn1+Pn2+Pn1+Pn2+Pn2+fn1+Pn1+Pn1+fn1+Pn2+Pn2+Pj1+Pn2 + +Pn2+Pj29/n1+fn2+Pn1+fn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn1+Pj29/nEsqxrJgRwLwBw + LwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBvLgBwLgBvLwBv + LgBvLwBvLgBwLgBwLgBwLgBvLwBwLwBwLwBwLgBvLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBvLwBwLgBw + LwBwLgBwLwBwLwBwLgBvLgBwLwBwLgBwLgBvLwBwLwBwLgBvLgBvLwBvLgBvLwBvLgBvLgBwLwBwLgBw + LwBvLgBvLwBwLwBvLgBwLgBvLwBwLgBvLwBvLwBvLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLwBw + LgBwLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBvLgBwLQBvLwBvLwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBw + LgBwLgBxLgBnJgDXy8jz9faHUz9wLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBx + LwF5PiL19vX1+Pr2+Pj1+Pn19/n1+Pj2+Pn1+Pn1+Pj2+fn2+Pr2+fn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn1 + +Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn29/n2+Pr2+Pn2+Pn19/n2+Pn2+Pn2+Pn29/n2+Pj19/n1+Pn1+Pn1 + +fn2+Pn1+Pj19/j1+Pn1+Pn1+Pn2+Pj2+Pr2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pr2 + +Pj19/n2+Pj19/n1+fn1+Pj1+Pj2+Pn2+Pj1+Pn19/n1+Pj2+Pj19/n1+fn1+Pj1+Pn1+Pn19/j1+Pn1 + +Pn29/n2+Pj2+Pn29/j1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+fn2+Pn1+Pn1+Pj29/n2+Pn1+Pj3 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn3+Pn1+Pn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1+fn1+Pn2 + +fn2+Pr1+Pn1+Pn1+Pn1+Pn1+fn2+Pn2+Pn1+fn2+Pn2+Pr2+PnEsaxrJgRxLgBwLwBwLgBwLwBxLgBw + LwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBvLgBvLwBvLgBwLgBvLwBvLgBwLwBvLwBwLwBvLgBw + LgBxLgBwLwBvLgBwLgBwLgBwLgBwLwBvLwBvLgBwLwBvLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLwBw + LgBwLgBwLwBvLgBwLgBvLgBvLwBwLgBvLgBvLgBwLwBwLgBwLgBwLQBvLgBwLgBwLgBvLgBwLwBwLwBw + LwBwLwBwLwBvLwBwLgBwLwBxLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBvLgBv + LgBvLgBwLwBwLgBwLgBvLgBvLgBwLwBvLwBvLgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwBuLg3p + 5eXx8/Onhn1wLgBvLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLwBxLwF6PyL29vX2+Pn1 + +Pn1+Pj2+Pn1+fn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn2+Pn1 + +Pr2+fn2+Pn29/n1+Pn1+Pn2+Pn2+fn3+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn1 + 9/n2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pj1+Pn29/n2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pj1+Pn2+Pn2+Pn1+Pn2+Pn19/n29/n2+Pn2+Pn2+Pn2+Pr2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pj2 + +Pn2+Pn3+Pn1+fn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fr1 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+fn2+fr2+Pn2+Pn1+Pn2+Pn2+Pn2 + +Pn2+Pn1+Pn2+Pr2+Pn2+Pn2+Pn2+Pn2+PnDsatsJwRxLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLwBw + LgBwLwBwLwBwLgBvLgBwLgBvLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLwBwLgBwLgBwLwBwLwBwLgBw + LgBwLgBwLgBvLgBvLgBwLgBwLwBvLwBvLwBwLgBvLgBvLgBwLgBwLwBwLgBvLgBwLgBwLgBvLwBwLwBw + LgBwLgBvLgBwLwBvLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBvLgBvLgBwLwBwLgBwLgBwLwBwLgBwLgBw + LgBvLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBvLwBwLgBvLgBvLgBwLwBwLwBvLgBwLwBw + LgBvLwBvLgBvLwBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLwBwLwBxLwCBSjP09fbw8vPPv7xrKgFv + LgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBwLgBvLgBwLgBwLwBxMAF6PiL29vX19/n19/j1+Pj2+Pn1+Pn1 + +Pr29/n2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pj2+Pn2+fn1+Pn2+Pj1+Pn1 + +Pn2+Pn2+Pn1+Pj1+Pn2+Pj2+Pn1+Pn1+Pj2+Pn1+Pn1+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pj1+Pn2+Pn2 + +Pn2+Pn1+Pn2+fn1+Pn1+Pn1+Pn19/n1+fn2+Pn19/j2+Pn2+fn1+Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn1 + 9/n2+Pn2+Pn1+Pn2+Pr1+Pn1+Pn2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+Pn2+Pj2+Pn2 + +Pn2+Pn1+Pr2+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pn2+fn1+Pn2+Pr2+Pn1+fn2+Pn2+fj2 + +Pn1+Pn2+Pn2+Pj1+fn1+Pn2+Pn2+Pn2+Pn2+fr2+fn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+fn2+fn2 + +Pn2+Pn1+Pj1+Pn2+PnEsaxsJwRwLwBvLwBvLwBwLwBwLgBwLwBwLgBwLgBvLgBvLgBwLgBvLgBvLgBv + LgBwLgBvLwBvLgBvLwBwLgBwLwBvLwBwLwBwLwBwLwBvLwBwLwBwLwBvLwBwLgBvLgBvLgBwLwBwLwBw + LgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBvLwBwLgBwLwBwLwBvLwBwLwBvLwBvLgBw + LgBvLwBwLgBwLgBvLgBvLwBwLwBvLgBvLgBwLwBwLwBwLwBvLwBwLgBvLwBwLwBwLwBwLwBwLwBvLgBw + LwBvLwBwLgBwLwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBvLwBwLgBwLwBvLgBvLgBvLgBv + LwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgCje2/x8/Tx8vTt6+ptLxJvLQBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBwLgBxLwBxMAF6PyL19vX2+Pn2+Pn19/j29/n2+Pn1+Pn19/n2+Pn2+Pn2 + +Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pj2+Pn2+Pn2+Pn2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn2+Pj1+Pn2+Pn1+Pn29/n2+Pn2 + +Pn2+Pn2+Pn1+Pn2+Pn1+Pj1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pn1+Pj29/n2+Pn2+Pn2+Pj2+Pn2+Pn1 + +Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pj2+Pn2+Pj29/n1+Pn2+Pn2+Pn1+Pj29/n2+fn2+Pn2+Pn2+Pn2+Pn2 + +Pn2+Pj2+Pj1+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pr2+fn2 + +Pn2+Pn2+Pj2+Pn2+Pn2+Pn2+Pj1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2 + +PnEsaxrJgRwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLwBvLwBwLgBvLgBvLgBwLwBwLgBvLgBwLwBvLgBv + LwBvLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBvLwBwLgBwLwBwLgBv + LgBwLgBwLgBwLgBwLwBvLwBwLwBwLgBwLwBvLgBwLgBvLwBwLwBvLgBwLwBvLwBwLwBwLwBwLwBwLwBv + LgBwLgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBvLwBwLgBwLwBvLgBwLgBwLwBvLgBwLwBwLwBwLwBvLwBw + LgBvLgBvLwBwLgBwLgBvLwBwLwBwLgBvLgBwLgBwLwBwLgBvLgBvLgBwLgBvLwBwLgBwLwBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBuKwDGsa3x8/Tx8/Tz9PaPX09wLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLwBxLwBxMAF6QCL29vX2+Pn1+Pj1+Pj1+Pn1+Pn1+Pn1+Pj2+Pn2+Pj2+Pn2+Pj2+Pn2+Pn1 + +Pj2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn29/n2+Pn2+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2 + +Pn19/n1+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn29/j2+Pn2+Pn1+Pn2 + +Pj2+Pn1+Pn2+Pn1+Pn2+Pn2+Pn19/n2+Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pj1 + +Pn2+Pn2+Pn1+Pj2+Pj1+Pn1+Pj1+Pn29/n2+Pn2+Pn1+Pn2+Pn2+fn2+Pn2+fn2+Pn2+Pn1+Pn2+Pn3 + +Pn2+fn2+Pn19/n2+fn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pr1+Pn2+Pn2+Pn2+fn1+Pn2 + +Pn1+Pn2+Pn29/n1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/n2+PnEsa1rJwRwLgBw + LwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBw + LwBwLgBwLwBvLgBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBw + LwBwLgBvLgBvLwBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLwBvLgBwLwBwLwBwLwBwLwBvLwBwLwBvLwBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLwBwLgBwLwBvLwBwLwBwLwBwLwBvLgBwLwBwLwBwLgBw + LgBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBvLgBvLwBwLgBwLgBvLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLwBtLQ7q5+bx8/Tx8vTx8vS9paFuKgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBxLwBx + MAF6PyP19vX19/j19/j1+Pn19/n29/j1+Pn19/j1+Pn2+Pn2+fn19/n19/n2+Pn2+Pj1+Pj1+Pn19/n1 + +Pj2+Pn1+Pj1+Pj1+Pn1+Pn1+Pn2+Pn19/j29/n2+Pj1+Pn19/n1+Pj2+Pn1+Pn2+Pn19/j2+Pn2+Pn1 + 9/n1+Pn1+Pn1+Pn29/n2+Pn1+Pn1+Pj19/n2+Pn2+Pn1+Pn19/j1+Pj2+Pj2+Pn2+Pn19/j19/n29/n1 + 9/n2+Pn19/j19/j1+Pn2+Pn2+Pj19/j2+Pn1+Pj1+Pj29/j1+Pn19/j1+Pn2+Pn1+Pn1+Pj19/n1+Pj1 + +Pn1+Pj1+Pn1+Pj1+Pj2+Pn1+Pn1+Pn2+Pn2+Pj2+fn19/n29/n2+Pn29/n2+Pn2+Pn2+Pn2+Pj2+Pn2 + +fn19/j1+Pn2+Pn2+fn2+Pn2+fn19/n2+Pn1+Pn19/n1+Pn29/j19/n2+Pn2+Pn1+Pn29/j1+Pn1+Pn2 + +fn2+Pn19/n2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn1+Pj2+Pn19/nFsqxrJgRwLwBwLwBwLwBwLwBwLgBw + LwBvLgBwLgBwLwBwLgBwLgBwLwBwLgBvLgBwLgBwLwBwLgBvLwBwLwBwLwBwLwBxLgBwLgBwLwBwLwBv + LgBwLgBwLwBwLwBwLwBvLgBvLgBvLgBwLwBvLwBwLgBvLgBvLwBwLwBvLwBwLwBwLwBwLgBvLwBwLgBw + LwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBw + LgBwLgBwLgBwLgBvLwBwLwBvLgBwLwBwLgBvLgBwLgBvLwBvLgBwLgBwLgBvLgBvLgBvLgBwLwBvLwBw + LwBwLwBwLwBvLgBvLgBwLgBvLwBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBxLwCLWkr09vfy + 8/Px8/Ty8/Xv7u5qKgpwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBxMAF6QCT19vX1+Pn1 + +Pn1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn29/j2+Pn1+Pn1+Pn1+Pj2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn1+Pn2 + +Pn1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/j1+Pn2+Pn1+Pn19/n2+Pn2+Pn1+Pn2+Pn1+Pn2+Pj2+Pn1+Pn2 + +Pn2+Pn1+Pn2+Pj29/n1+Pn29/j1+Pn1+Pn2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn1+Pn2+Pn2+Pj1+Pn2 + +Pn19/j1+Pn2+Pn2+Pj1+Pn2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn19/j29/n2+Pj1+Pn1+Pn2 + +Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2 + +Pr2+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn2+Pn1+Pn2+Pn19/n2+Pn2+Pn1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2 + +Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+PnFsaxrJwRwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBwLwBwLwBwLwBwLgBw + LgBwLgBwLwBwLwBwLwBvLgBwLwBwLwBwLgBvLgBwLgBvLgBwLwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBv + LgBwLwBwLwBwLgBvLwBwLgBwLgBvLgBwLgBwLgBvLwBwLgBwLwBvLgBvLgBwLgBwLgBwLwBwLwBwLgBv + LwBwLwBvLwBvLwBwLwBwLwBwLwBvLwBvLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBvLgBvLgBvLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBvLgBwLgBvLQC6oJrx8/Xy8vPx8vPx8/Tz9fea + cGFwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxMAF6QCP29vX1+Pj19/j19/j2+Pn2+Pn1 + +Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pj2+Pj19/n1+Pj29/j19/n2+Pj1+Pn1+Pj2+Pn2+Pn1+Pn2+Pj1+Pn1 + 9/n19/n1+Pj2+Pn19/n2+Pn2+Pj19/j1+Pn2+Pn2+Pn2+Pr2+Pn2+Pr1+Pn1+fn1+Pn19/n1+Pn2+Pn2 + +Pn1+Pj1+Pn19/n1+Pj2+Pn2+Pn29/n1+Pn19/n2+Pj1+Pn19/j1+Pj1+Pn29/n1+Pn1+Pn2+fn2+Pn1 + +Pj19/j19/n2+Pn1+Pn2+Pn2+Pn1+Pn19/j2+Pj19/n2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj1+Pn1+Pn1+Pn2 + +Pj2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pj2+Pn2+Pn1+Pn19/n1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn29/n2 + +Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+fr1+Pn1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pr29/n2 + +Pn2+Pn19/n2+Pn2+PnEsaxrJwRwLwBxLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLwBw + LgBwLwBwLwBwLgBwLQBwLwBwLwBwLgBvLgBvLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBvLgBwLwBwLwBw + LgBwLgBwLwBwLwBwLgBvLwBxLwBwLgBwLwBwLgBwLwBwLgBvLwBvLgBvLwBvLwBwLgBwLgBvLgBwLwBw + LwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBvLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBvLgBw + LgBwLwBvLwBwLgBvLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBw + LgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBpKAnu6+rx8vTx8/Tx8/Px8vPx8/TVxsNqJwFvLgBwLgBw + LgBwLgBxLgBvLgBwLgBwLgBwLgBxLwByMAF6PyT19vX1+Pj19/n1+Pj1+Pn2+Pn1+Pj2+Pn1+Pj1+Pn2 + +Pj2+Pj19/n1+Pn19/n19/j1+Pj1+Pj1+Pn1+Pj19/n1+Pj1+Pj1+Pn1+Pj2+Pn2+Pj1+Pn19/n1+Pj1 + +Pn19/n1+Pn29/j2+Pn1+Pj19/n2+Pn1+Pn19/n1+Pn29/n19/n19/j19/n2+Pj19/n2+Pn19/j1+Pj1 + 9/n29/n19/j19/n2+Pn19/j19/j1+Pj1+Pn2+Pj1+Pj29/j2+Pn1+Pj1+Pn1+Pj1+Pn19/j1+Pn2+Pn1 + +Pn2+Pn2+Pn29/n19/n2+Pn1+Pj2+Pn2+Pn1+Pn19/n2+Pj19/n2+fn1+Pn2+Pn2+Pn2+Pn19/j1+Pn2 + +Pn1+Pn19/j2+Pn2+Pn1+Pn2+Pn1+Pn1+Pj19/j19/n1+Pn2+Pn1+Pn2+Pn1+Pn2+Pn29/n1+Pn1+Pn1 + +Pj2+Pn2+Pn29/n2+Pn2+Pn1+Pj2+Pj29/n2+Pn1+Pn1+Pn1+Pn1+Pn29/n1+Pn2+Pn1+Pj19/j1+Pn2 + +PnEsKtrJwRwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBvLwBwLwBvLwBwLgBwLgBvLwBv + LwBwLwBwLgBwLgBvLgBwLgBvLgBwLwBvLwBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLgBv + LgBwLgBwLwBvLwBvLgBwLgBwLwBwLgBvLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBw + LwBwLgBwLgBwLgBwLwBwLgBwLwBvLgBwLwBwLgBvLwBvLgBwLgBvLgBwLwBwLwBwLgBwLwBwLwBwLgBv + LgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBvLgBwLgBwLwBvLgBwLwBvLgBwLgBvLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBxLgBwLgCXbV/y8/Tw8vLx8vTx8/Px8/Py8vPz9PSHVEBxMABwLgBwLgBwLgBwLQBwLgBw + LgBwLgBwLgBxLwBxMAF6QCP19vX2+Pj1+Pn1+Pj2+Pn29/n2+Pn2+Pj1+Pn1+Pn1+Pn1+Pn2+Pn1+Pn2 + +Pn2+Pn2+Pj19/n1+Pn1+Pn2+Pj2+Pn1+Pn2+Pn2+Pj2+Pn29/n1+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2 + +Pn29/j2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn19/j29/n2+Pn1+Pn19/n1+Pj2+Pn1+Pn19/j2+Pn2+Pn1+Pn1 + +Pn2+Pn29/n19/j19/n1+Pn2+Pn29/n1+Pn2+fn2+Pn1+Pn1+Pn2+Pn1+Pj1+Pn2+Pn2+Pj2+Pn1+Pn1 + 9/n2+Pn19/j1+Pn2+Pn2+Pn2+Pn2+Pn2+Pj2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn1+Pn1+Pn2 + +fn1+Pn2+Pn2+Pn2+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn2+Pn1+Pn2+Pn1+Pn29/n2+Pn2 + +Pj29/n19/n2+Pj1+Pn29/n2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn2+Pn1+Pn2+Pn2+Pn3+PnEsaxrJgRwLwBw + LwBwLwBwLwBwLwBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBw + LgBwLgBwLwBwLgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBwLwBw + LwBwLwBwLwBwLgBvLwBvLgBvLwBwLwBwLgBwLwBvLgBwLgBvLgBwLgBwLgBwLwBwLgBwLwBwLgBwLwBv + LgBwLgBvLwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBvLwBwLgBwLgBwLgBvLwBwLwBwLgBvLwBwLwBw + LgBwLgBwLwBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBr + JwLXyMXx8vTx8vLx8vPx8vTx8vTx8vPx8vTFsKptKQFwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLwBwLwBx + LwF6QSX29vb2+Pj1+Pj1+Pn19/j19/n19/j19/j1+Pn1+Pj2+Pn29/n19/j2+Pn1+Pj2+Pj1+Pj19/j1 + +Pn1+Pn19/j2+Pj1+Pn29/n1+Pn1+Pn2+Pj1+Pn2+Pj2+Pn2+Pn29/n2+Pn1+Pn2+Pj19/j2+Pn2+Pn1 + +Pn1+Pn1+Pj1+Pj19/n19/n19/n1+Pj1+Pn1+Pn29/n2+Pn19/j19/n1+Pn19/n2+fn1+Pn29/j1+Pn2 + +Pj29/j1+Pj1+Pn1+Pj2+Pn29/n2+Pj1+Pn1+Pj1+Pn19/j1+Pj1+Pj19/n1+Pn1+Pn1+Pn29/n1+Pj2 + +Pn2+fn2+Pn1+Pn1+Pj1+Pn19/n1+Pn1+Pn29/n2+Pn2+Pn2+fn2+Pn19/n2+Pn2+Pn19/n2+Pr2+Pn2 + +Pn2+Pn1+Pn2+Pn2+Pn2+Pn2+Pn19/n2+Pn2+Pn2+Pj1+Pn1+Pn2+Pj2+Pj2+Pn1+Pn1+Pn2+Pj1+Pn1 + 9/n1+Pn2+Pn1+Pn1+Pn2+Pn2+Pn2+Pn1+Pn1+Pj29/n2+Pn2+PjEsaxrJQRxLwBwLgBwLwBwLwBwLwBw + LwBwLgBvLgBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLwBwLgBwLgBw + LgBwLwBwLwBwLwBwLgBwLgBvLgBvLgBwLwBvLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLwBwLgBwLwBwLgBvLgBwLwBwLgBvLwBwLgBwLgBv + LgBvLgBwLgBwLwBwLwBwLgBwLwBvLwBwLgBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLwBwLgBwLwBwLwBw + LgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBxLgCIVULz9PTy8vTy8/Tx + 8/Py8/Px8/Tx8vPx8vTy8/OASjRxLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwByLwF7Qib19vb1+Pn1 + 9/j19/j19/n1+Pj1+Pj19/j2+Pn19/j1+Pn19/n29/n19/j1+Pn19/n1+Pn2+Pj19/n1+Pj2+Pj2+Pn2 + 9/j2+Pn2+Pn2+Pn2+Pn19/n2+Pn19/n1+Pn2+Pj1+Pn29/n2+Pn1+Pn2+Pj1+Pj1+Pj19/n1+Pj1+Pn1 + +Pj1+Pn19/j1+Pj19/j19/j29/n19/j2+Pj19/j1+Pn1+Pj29/n19/j19/n2+Pj1+Pj1+Pj19/n19/n1 + 9/j1+Pn1+Pn1+Pn19/j19/n1+Pn19/j1+Pn2+Pn19/j2+Pn19/n1+Pn19/j1+Pj1+Pn1+Pn19/n1+Pn2 + 9/n2+Pj1+Pn1+Pn1+Pn1+Pn1+Pn2+Pn2+Pn2+Pn29/j1+Pj2+Pj1+Pj2+Pn2+Pn2+Pn1+Pn2+Pj2+Pn1 + +Pn2+Pn2+fn2+Pn2+Pn2+fn1+Pn19/n29/j2+Pn2+Pn19/n2+Pn2+Pn1+Pn19/j1+Pn1+Pn1+Pn2+Pn1 + +Pn2+Pn19/n19/j1+Pn1+Pn19/n19/n2+fnEsa1rJwRwLwBxLwBwLgBwLwBwLwBwLwBwLgBvLgBwLwBw + LwBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLgBwLwBwLwBwLwBw + LwBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLgBwLwBvLgBwLwBwLwBwLwBwLgBwLwBw + LgBwLgBwLwBwLgBvLwBvLwBwLwBwLgBvLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBwLwBxLgBwLwBwLwBv + LwBwLgBwLgBwLwBwLgBwLwBvLgBwLgBwLwBwLgBwLwBwLgBwLwBvLgBwLwBwLgBwLwBwLwBwLwBwLwBv + LwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBsKQPNvLny8/Tx8/Tx8/Tx8/Px8/Tx8vPx8vTx + 8/Ty9PXMu7lpJwFxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwByMAF7Qij29/b0+Pf1+Pf1+Pj2+Pj2+Pn1 + +Pn19/n1+Pn1+Pn1+vn1+fn1+Pj1+fn2+fn2+fn2+fn2+Pn2+Pn2+Pn1+Pn2+Pn2+fj2+fn1+Pj29/n2 + +Pn2+fj2+Pr1+fn1+Pn1+Pn1+Pj1+Pj2+fn2+fn2+Pn2+fj2+Pn2+fn2+Pj2+Pr2+Pn2+Pn1+Pn2+Pn1 + +Pn2+fj2+Pn2+fn1+fn2+fn2+fj1+Pn2+Pn1+Pn2+Pr2+fn2+Pn2+Pn2+Pj2+Pn2+fn2+Pn2+Pr2+fr2 + +Pr2+fr2+fj2+Pn2+Pr1+Pn1+Pn1+Pn1+Pr2+fn1+Pn1+Pn1+Pn2+Pn2+Pn3+fn2+Pn2+fn2+fr2+fn2 + +Pn3+fr2+Pr2+Pn2+Pn2+Pn2+Pn2+fn2+Pn2+Pn2+Pr2+fn1+Pn1+Pj1+Pn2+Pr2+Pn2+fj2+fr3+Pr2 + +Pn1+fn1+fn2+fn2+fn1+fn2+fj2+fn2+Pn3+fn1+fn2+fr2+fn2+Pn2+fn1+fr2+fn2+fn1+fr2+fn2 + +Pr2+fn1+fr2+fr2+fjGs61rJgRwLgBwLgBwLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBwLgBwLwBw + LgBwLwBvLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLgBvLgBwLwBwLgBwLgBwLwBwLwBvLgBwLgBwLwBw + LgBwLwBwLwBvLwBwLgBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLgBwLgBwLgBwLwBwLwBvLgBwLwBwLgBw + LgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBvLwBwLwBvLwBwLwBwLwBwLwBwLwBw + LgBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLgBvLwBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLwBvLgBwLwBv + LgBwLwBwLwBwLgBwLgBxLgBwLwCKWkj09vfx8/Ty8vPy8vPy8vPx8/Tx8/Tx8/Ty8/Tx8/Pz9fWRY1Nw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLwF7Qyvo5OTp5+jp6Ofp5+jp5+fp5+fp5+jp5+fq5+jq5+jp + 5+fp5+jp5+jp5+fp5+jp5+jp6Ojp5+fp6Ojp5+jp5+jq5+fq5+jp5+jq5+jq5+fp5+fp5+fp5+jq5+jq + 5+jp5+fp5+fp5+fp5+jq5+fp5+fp5+fq6Ojq5+jp5+jo5+fp5+fp5+fp5+fp5+jp6Ojp5+jq5+jp5+jp + 5+jp5+jp5+jp5+jq5+jp5+jp5+jq6Ojp5+jp5+fp5+jp5+jp5+jp5+fp5+fp5+jp6Ojp5+fp5+fp5+fp + 5+fp5+fo5+fq5+jp5+jq5+jp5+fp5+fp5+fp5+jp5ufp5+jp5+jp5+jq5+jq5+fq5+fp5+jq5+fo5+fp + 5+fq5+jp5ujq5+fq5+jp5+jp5+jq5+jp5+jq5+jq5+fp5+fp5+fp5+fp5+jp5+jp5+jp5+fo5+jo6Ofp + 5+jp5+fq5+fp5ufp5+fp5+jp5+fp5+jp5+jp5+fp5+fp5+jq5+fp5+jp5+fq5+fq5ujp5+jq5+jo5+jp + 6OfBq6lrKAVxLwBwLwBwLwBwLgBwLwBvLgBvLgBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLwBvLwBvLgBw + LwBxLgBvLgBvLgBwLgBwLgBwLwBwLgBwLwBwLwBxLwBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBvLwBw + LgBwLgBwLgBwLgBvLwBvLgBwLwBwLwBwLgBvLgBwLgBvLwBvLwBwLgBwLwBwLwBwLwBwLwBvLwBwLgBv + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBvLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLwBvLgBwLgBw + LgBvLwBwLgBwLwBwLwBwLgBvLgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBvLgBvLwBwLgBwLgBwLgBwLwBw + LgBwLwBrKAbb0c/w8/Px8vTy8vTy8/Ty8/Px8/Px8vTy8vTx8vTx8/Tx8vTl3dxwMRRxMABwLgBwLgBw + LgBwLgBwLgBwLwBvLgBtKQFiJAhhIwhhIwhiIwhiIwhhIwhhJAhiJAhhIwhhIwhiIwhiJAhhJAhhJAhi + JAhiJAhhJAhiJAhhJAhhJAhiJAhhJAhiJAhhJAhgJAhhJAhhIwhhJAhhIwhhJAhhJAhiJAhhJAhiJAhh + IwhhJAhhJAhiJAhhJAhhIwhgIwhgIwhiJAhiIwhhIwhiJAhjIwhhJAhiJAhhIwhhJAhiJQhiJAhiJAhi + IwhgJAhhJAhhIwhiIghhIghhIwhhJAhhIwhhJAhhIwhgJAhhJAhhIwhhJAhiJAhhIwhhJAhgIwhhJAhh + IwhiIwhhJAhhIwhgIwhhJAhhIwhhJAhhJAhhJAhiJAhiJAhhIwhhIwhhIwhhIwhhIwhgIwhhJAhhIwhh + JAhhIwhgJAhhJAhhIwhhIwhhJAhfJAhgJAhhIwhhIwhhIwhgIwhgJAhgJAhgIwhgJAhhIwhgJAhhIwhh + IwhhIghhIwhhJAhhIwhgJAhiJAhhJAhhJAhhIwhhIwhhJAhhIwhhIwhgJAhhIwhhJQhmJgVvLQBwLgBw + LwBwLwBwLwBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBvLgBwLwBwLgBw + LgBvLgBwLwBwLwBwLwBwLgBwLgBvLgBwLgBvLgBwLwBwLwBvLgBvLgBvLgBwLgBwLwBwLgBwLwBvLwBw + LwBwLgBwLgBwLgBwLgBwLgBvLwBvLgBwLgBwLwBvLgBwLgBwLgBvLgBwLwBvLwBwLQBwLgBvLgBwLgBw + LgBvLgBwLgBwLgBwLwBwLgBvLwBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLwBwLwBwLwBvLgBwLgBwLgBwLwBwLgBwLgBvLgBwLwBwLQBwLgBwLgBwLgBwLgBvKwCng3ny8/Xx + 8vPx8vPy8/Ty8/Py8/Px8vTy8vTx8vPx8vPx8vTx8vPz8/S5oJlsKQJvLwBwLgBwLgBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBxLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBw + LwBwLgBwLwBwLwBvLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBw + LwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLgBw + LwBwLwBwLgBwLwBwLwBwLgBwLwBwLwBwLwBvLgBvLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBv + LwBwLwBwLgBvLwBwLwBwLwBwLgBvLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBvLwBwLwBwLwBwLwBwLgBw + LgBvLgBvLwBvLgBwLgBvLwBvLgBvLgBvLgBwLwBvLwBwLwBwLwBwLgBvLgBvLgBvLwBvLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLgBwLgBwLwBwLQBwLwBwLgBwLwBwLgBwLwBwLwBwLwBw + LwBwLwBwLwBvLwBvLgBvLgBvLgBwLgBwLgBvLwBwLgBwLgByLgB9RTDv7e/y8/Tx8/Py8/Tx8/Py8vTy + 8/Tx8vTx8vPy8/Tx8/Tx8vTx8vTx8vPz8/SPYlNwLQBwLgBwLgBwLgBwLgBvLwBwLwBwLwBwLwBwLwBw + LgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBwLwBw + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBwLwBw + LwBwLgBvLwBwLwBwLgBwLwBwLwBwLgBxLwBwLwBwLwBwLwBwLgBvLgBwLwBvLwBwLgBwLwBwLgBwLwBw + LwBwLgBwLwBwLgBxLwBwLwBvLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLwBwLgBw + LwBwLwBxLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLwBvLwBwLwBwLwBwLwBwLgBwLwBw + LwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBvLgBwLwBvLwBwLgBw + LwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBwLwBwLgBvLwBwLwBwLwBvLgBwLwBw + LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBvLgBvLgBwLwBwLwBvLgBvLwBwLgBwLwBvLgBw + LgBwLgBvLgBwLgBvLwBwLgBvLwBvLwBwLwBvLwBvLwBwLwBwLgBwLgBwLwBvLwBwLwBvLgBwLgBvLgBw + LgBwLwBvLgBwLgBwLgBwLwBwLwBwLgBwLwBvLwBvLwBvLwBwLgBvLwBwLwBvLwBwLwBwLgBwLgBwLgBw + LgBwLgBvLwBwLwBwLwBwLwBvLgBwLwBwLgBwLwBwLwBvLwBvLgBwLwBwLgBwLgBwLwBvLwBwLwBvLgBw + LwBwLgBwLgBwLwBwLwBwLwBwLgBxLwBuLQ3Yzcvy8/Xx8/Tx8/Tx8vPx8/Px8/Px8/Px8/Px8/Tx8/Tx + 8/Px8/Px8/Tx8vPy8/Ts6up3PSVwLQBwLgBwLgBwLgBwLwBwLwBwLwBwLwBwLwBwLgBwLwBxLwBwLgBx + LgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLwBxLwBwLwBwLwBwLgBwLwBwLwBwLgBwLQBwLwBwLwBwLwBw + LwBwLgBwLwBwLwBxLgBwLwBwLwBwLwBwLwBwLwBwLwBwLwBwLgBwLwBwLgBwLgBwLgBvLwBwLwBwLgBw + LgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLwBwLwBwLgBxLwBwLgBw + LwBvLwBwLgBwLgBwLwBwLwBwLwBwLgBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw + LwBwLwBwLwBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLwBwLgBwLwBwLwBwLgBw + LwBwLwBwLwBwLgBwLgBwLwBwLgBvLwBwLwBwLgBwLgBwLwBwLgBvLgBwLwBwLgBwLwBwLgBwLwBwLgBw + LgBwLwBwLgBwLwBwLwBwLwBwLwBwLwBvLgBwLwBwLwBwLwBwLgBwLgBwLwBwLwBwLwBvLgBwLgBwLwBw + LwBwLgBvLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBvLgBwLwBwLwBwLwBwLwBwLgBwLgBwLgBwLgBwLwBw + LgBwLgBvLwBwLwBwLgBvLgBvLgBwLgBwLwBwLgBwLwBvLgBwLgBvLgBvLgBvLgBwLgBvLgBwLgBwLgBw + LwBvLwBvLgBwLwBwLwBwLwBwLwBwLgBwLwBwLgBvLwBvLwBwLwBwLwBwLwBwLwBwLgBwLwBvLgBwLgBw + LgBwLwBwLgBwLwBwLgBwLgBwLwBwLwBwLgBwLgBwLgBwLwBwLgBvLwBwLgBwLwBwLgBvLwBwLgBwLwBw + LwBvLwBwLwBqJwC9pJ7y9PXx8/Tx8/Tx8/Tx8/Tx8vTx8vPx8/Tx8/Ty8vTy8/Tx8vTx8/Ty8vTx8/Tx + 8/Tx8vTc0c1vMRNvLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBw + LQBvLgBwLgBwLgBwLwBwLwBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLgBwLgBwLwBwLgBwLgBwLgBvLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw + LgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LwBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBwLwBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLwBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBvLgBwLQBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBuKwKkgXbz + 9fby8/Tx8vTx8vTy8/Ty8/Px8vPx8vTx8/Px8vTx8/Tx8/Ty8/Ty8/Px8vTx8/Tx8/Py8/Ty8vTSwb9u + Lw5vLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLQBwLgBwLQBwLwBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBvLgBwLgBvLQBwLQBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBuLACVbFvx8fLy8vTx8/Ty8/Tx8/Py + 8/Ty8/Tx8vPx8vTx8vPx8vPy8vPy8/Tx8/Tx8/Ty8/Tx8/Tx8/Tx8vTx8vPy9PXJt7FtLApxLgBwLgBw + LwBwLwBwLgBwLgBwLwBvLgBwLgBvLgBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLQBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLQBvLgBw + LgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBuKwCSZVbx8fDy8vTy8/Tx8/Py8/Ty8/Py8/Tx8/Tx8vTy8vTx + 8vTx8/Px8vTx8/Tx8/Tx8/Px8/Tx8vPx8/Px8/Tx8/Ty8/Xz9PbItrJtLQxxLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LQBwLgBvLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLQBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBvLgBwLgBvLgBwLgBv + LgBwLgBwLgBwLwBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLQBwLgBwLgBvLgBvLQBwLQBwLgBwLgBwLgBw + LgBvLQBwLgBwLgBwLgBwLgBwLgBwLgBvLQBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBv + LgBvLgBwLgBwLgBvLQBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLQBwLgBvLgBw + LgBvLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBvLgBwLgBsKQCZcGLx8fLy8/Tx8/Tx8/Tx8/Ty8/Px8vPx8vPx8/Tx8/Px8/Px8/Tx8/Tx8/Py8vTx + 8/Ty8/Ty8vTx8/Tx8/Ty8/Tx8/Py8vPx8vTy9PXSw79xNBhyLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBvLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBv + LgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLQBvLgBw + LgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBv + LgBwLgBwLgBvLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBtKgSohXvy + 8/Tx8/Ty8/Ty8/Ty8vTy8/Px8/Tx8vPy8vTx8/Tx8vPx8vTx8vPx8vTx8vPx8vTx8/Py8/Px8/Tx8/Py + 8/Py8/Tx8/Tx8/Tx8/Tx8vTx8/Pz8/OcdWhtKwNwLgBxLwBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLwBwLwBwLgBwLgBwLgBw + LgBwLgBvLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBv + LQBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLQBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBvLgBwLgBvLQBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw + LgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBuKgB+STjk2tjz9PXy8/Ty8/Tx8vTy8/Py + 8vPx8vTx8vTx8/Px8/Ty8/Tx8/Tx8/Px8vPx8vPx8vTx8vTx8vTx8/Px8/Ty8/Px8/Px8vTx8/Py8/Tx + 8vPx8vTw8vPx8vPz9PbDrahyMhdwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLQBwLgBwLgBvLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBxLgBxLgBsLAekgHXw7+7y9PTx8vTy8/Py8/Ty8vTy8/Py8/Py8vPy8/Tx8vTy + 8/Tx8/Tx8vPy8/Tx8vPx8vPx8vPx8/Py8vPx8vPx8vTx8vTx8/Py8/Px8vTx8vTx8vPx8/Tx8vPx8vPx + 8vTy8/Xl4OCSZVVsKANxLgBxLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLwBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBvLwBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLwBwLgBwLgBwLgBvLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBxLgBxLgBwLgBw + LgBuKQCASDLRwsDz8/bx8vTx8vPx8/Py8/Tx8/Px8vPx8vPx8/Px8/Px8vPx8/Ty8vTy8vTx8vPx8vPx + 8vPx8vPx8vPx8vPx8vPy8/Tx8/Px8vPx8vPx8vPx8/Ty8/Tx8/Tx8/Tx8/Px8vPx8vTx8vTx8vT08/XM + vLl5QCptKgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBv + LQBvLgBwLgBwLgBwLgBwLgBvLwBwLgBwLgBvLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBxLgBwLwBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBvLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLwBvLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLQBwLQBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBvMRa3m5Ty8fHy8/Xx + 8vTx8/Tx8vTy8vPx8vPx8vTy8/Tx8vTy8/Ty8/Px8/Px8/Tx8vPx8/Tx8/Px8vPx8vPx8vPx8vPx8/Tx + 8vPx8vTx8/Px8vPx8vPx8vTx8vPx8vPx8/Px8vTx8vPx8/Tx8vPx8vTx8vPy8/Tz8/Tz9PW7o514Pyht + KQFxLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLwBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBxLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBvLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLwBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLwBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLQBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBvLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBw + LgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBv + LgBwLgBwLgBvLgBwLgBwLgBvLgBwLgBwLwBwLgBwLgBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBwLgBx + LgBwLwBwLgBwLgBwLgBxLgBxLwBwLgBxLQBvKwBzNRqtjobv7evy8/Ty9PTx8vTx8/Py8/Px8/Tx8vPx + 8vPy8/Ty8/Py8vTx8/Px8vPx8/Tx8vTx8vTx8vPx8vPy8vPx8vPx8/Px8vPx8vPx8vPx8vTx8/Px8vTx + 8vPx8/Px8/Px8vTy8/Tx8vTy8vPx8vPy8/Tx8vPx8/Px8vTy8/Ty8/Ty8/Tz8vLBqqWHUkBtKQZvLABw + LgBwLwBwLgBwLwBwLwBwLgBwLwBwLgBwLwBwLgBwLgBxLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLwBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLQBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLwBwLgBwLgBxLwBwLgBwLgBwLgBwLgBxLgBwLgBwLgBw + LgBwLwBwLgBqKASASzO5npjv7e3z8/Xx8/Px8vPx8/Py8/Ty8/Px8/Px8/Px8vPx8/Px8vPy8/Tx8/Py + 8/Tx8vTx8/Px8/Px8/Px8/Tx8/Px8/Px8vPx8/Px8vPx8/Tx8vPx8/Px8/Tx8/Py8vTx8/Ty8vPx8/Px + 8vPy8vTx8vPx8vPx8/Tx8vTx8/Ty8vPx8vPx8/Ty8/Ty8/Tz9Pb09fbd0s+kgHR6QCdpJgBvLgBwLwBw + LgBwLgBwLwBwLwBxLwBwLwBxLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBw + LgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLwBwLgBxLgBwLgBxLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBwLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBxLgBxLgBxLgBxLgBwLgBw + LgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LgBwLgBwLgBwLgBxLgBvLgBwLgBwLgBwLgBwLgBwLgBwLgBxLwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBw + LwBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBwLgBvLgBwLwBwLgBwLgBwLgBwLwBwLgBwLQBwLgBwLgBw + LgBwLwBwLgBwLgBwLgBxLwBwLgBwLwBwLwBwLwBxLwBxLwBwLgBxLwBxLwBwLgBnJgF3PiOgem/Wycbz + 9PTy8/bx8vTx8vTx8/Ty8vTy8/Ty8/Tx8/Tx8vPx8vPy8/Py8/Py8vPx8/Py8vTx8/Tx8vPy8/Tx8vPx + 8/Px8/Px8/Px8vTx8/Px8vPy8vPx8vPx8vPx8/Tx8/Tx8vPx8vPx8vPx8vPx8vPx8vTx8/Px8vTx8vPx + 8vTy8vPx8/Ty8/Tx8/Px8/Px8/Tx8/Ty8/Tx8vTx8/Tz9Pbw8PHZzsmsjoaJWERpKAloJABvLABwLgBw + LgBwLgBxMABxLwBxLwBxLwBxLwBxLwBxLwBxLgBxLgBwLwBwLgBwLgBwLwBwLwBxLgBxLgBxLgBwLgBw + LgBwLgBxLwBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLwBwLgBwLwBwLgBwLgBwLgBxLwBwLwBwLgBwLwBw + LgBwLwBwLgBwLgBxLgBwLwBwLgBwLgBwLgBwLQBwLgBwLgBwLgBwLgBxLgBxLgBwLgBxLgBwLgBwLgBw + LgBxLwBwLgBwLwBwLgBwLgBwLgBwLgBxLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBwLgBxLgBxLwBx + LgBwLwBwLgBwLwBwLwBwLgBwLwBxLgBxLwBwLwBwLwBxLwBxLwBwLgBwLgBwLgBwLwBwLgBwLgBwLgBw + LgBwLgBwLgBxLgBxLwBwLwBwLgBwLwBwLwBwLgBxLgBxLgBxLwBxLgBxLwBwLgBxLgBwLwBwLgBwLgBw + LgBwLgBxLwBwLwBwLwBwLgBxLgBxLwBxLgBwLgBwLwBwLgBxLgBwLgBwLgBxLwBxLwBxLwBxLgBxLwBx + LwBxLwBxLwBxLgBxLwBxLgBwLwBxLgBwLwBwLwBxLwBxLgBxLwBwLgBwLgBxLwBwLwBxLwBwLgBwLgBw + LwBwLgBwLwBwLgBwLgBwLgBwLgBwLwBxLwBwLgBwLgBwLgBxLgBxLgBwLgBwLgBwLwBwLwBwLwBxLwBx + LwBwLwBwLwBwLwBxLgBwLQBxLgBvKwBlIQBsKw+LW0qvkonbzsvv7+/y8/Tx8vTx8/Px8vPx8vPx8vTx + 8/Py8/Ty8/Py8vTx8/Px8vTy8/Px8vPx8vPy8/Tx8/Px8/Ty8/Px8/Tx8vPx8/Px8/Px8/Px8vPx8vPx + 8vPx8vPx8vPx8vPy8/Tx8/Py8/Tx8/Px8vTx8vPx8vPx8/Px8vPx8vTx8/Px8/Px8/Px8vTx8/Tx8vPx + 8vPy8/Py8/Px8/Tx8vTx8vTx8vTx8vPx8vTy8/Xz8/X29/f19fbd1M+/qKSlfnOSZ1d1OiFkHwJgHwBk + IQBpJQBuKwBxLQByLgBxLwByLwByMAByLwBxLwByLwByLwByMABzMABzMAByMAByLwByLwByLwByLwBy + LwBxMAByLwFxLwByLwBxLwBxLwByMAFxMABxLwFxLwBxMAFxLwByMAByLwFyLwByLwByLwBxMABxLwBx + LwByLwBxLwFwLwBxLwBxLwByLwByMAFxLwBxLwByLwBxLwBxLwByLwFyMAByLwByLwByMABxLwBxMAFy + MABxLwByLwBxLwFyMABxMAByLwBxLwBxMAFyMAFxLwFxMABxMABxMAFyMABwLwBxMABxLwBxLwBxMAFx + LwBxMABxLwBxMABxMABxMAByLwByLwFyMAFxLwBxLwBxLwByLwByLwByLwByLwBxLwBxLwBxLwByLwBy + LwBxLwByMAByLwByLwByLwByLwBxLwByMABxMAByMAByLwByMAByLwBxMAByLwFzMAFyMAFyMAByLwBx + LwBxLwByMAByLwByMAByMAByMAByLwBxMAByMAFxMAFyMAByLwFyMAByMAByLwByLwByMAByMAByLwBy + MAFyMAByLwByLwBxLwBxLwFxMAFyMAFyMAFxLwByMAByLwBxMAByMABxLwByMABxMABxMAByLwBxLwBx + LwByMABxLwBxMAByLwByLwFxLwFxMAFwLwBwLgBwLgBxLgByLwBzMABxLQBsKABlIQBhHgBeHQBqKQuC + TziWa1ysjIPEr6rm39r09fT09fby9PXx8vTx8/Tx8vPy8vTx8vTx8/Py8/Ty8vTx8/Tx8/Py8/Tx8/Px + 8vPx8/Tx8vPx8/Px8/Tx8/Py8/Py8vTx8/Px8/Tx8/Px8vTy8/Px8/Px8vPx8/Px8vMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/TIASshot/UI/MemoryMonitorForm.Designer.cs b/TIASshot/UI/MemoryMonitorForm.Designer.cs new file mode 100644 index 0000000..699aa5f --- /dev/null +++ b/TIASshot/UI/MemoryMonitorForm.Designer.cs @@ -0,0 +1,175 @@ +#if MEMMONITOR +namespace TIASshot { + partial class MemoryMonitorForm { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series seriesPrivate = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series seriesMainFps = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.Series seriesSubFps = new System.Windows.Forms.DataVisualization.Charting.Series(); + + this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.lblCurrent = new System.Windows.Forms.Label(); + this.lblPreview = new System.Windows.Forms.Label(); + this.btnStartStop = new System.Windows.Forms.Button(); + this.btnReset = new System.Windows.Forms.Button(); + this.btnSaveCsv = new System.Windows.Forms.Button(); + this.btnOpenFolder = new System.Windows.Forms.Button(); + this.panelButtons = new System.Windows.Forms.Panel(); + + ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit(); + this.panelButtons.SuspendLayout(); + this.SuspendLayout(); + + // chart + chartArea.Name = "ChartArea1"; + chartArea.AxisX.Title = "経過時間 (秒)"; + chartArea.AxisY.Title = "メモリ (GB)"; + chartArea.AxisX.IsStartedFromZero = true; + chartArea.AxisY.IsStartedFromZero = true; + // 副 Y 軸(FPS): メモリ(GB)とは単位・スケールが異なるため右側の第 2 軸に分ける。 + // 本モニタ/副モニタの実描画 FPS をここに乗せる(案A: メモリ左軸+FPS 右軸の同居)。 + chartArea.AxisY2.Title = "FPS"; + chartArea.AxisY2.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.True; + chartArea.AxisY2.IsStartedFromZero = true; + this.chart.ChartAreas.Add(chartArea); + + legend.Name = "Legend1"; + // 凡例をグラフ下部に横並びで配置する(右側ドッキングだと縦一列で幅を食い, + // プロット領域が左に圧縮されるため)。プロットを横幅いっぱいに広げる目的。 + legend.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Bottom; + legend.Alignment = System.Drawing.StringAlignment.Center; + this.chart.Legends.Add(legend); + + seriesPrivate.Name = "Private"; + seriesPrivate.LegendText = "メモリ Private (GB)"; + seriesPrivate.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + seriesPrivate.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesPrivate.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesPrivate.BorderWidth = 2; + seriesPrivate.Color = System.Drawing.Color.DodgerBlue; + + // 本モニタ実描画 FPS(副 Y 軸)。WorkingSet 系列はグラフには描かない + // (録画・スライドで主指標 Private 1 本を強調するため。CSV には従来どおり記録する)。 + seriesMainFps.Name = "MainFps"; + seriesMainFps.LegendText = "本モニタ FPS"; + seriesMainFps.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + seriesMainFps.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesMainFps.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesMainFps.YAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Secondary; + seriesMainFps.BorderWidth = 2; + seriesMainFps.Color = System.Drawing.Color.ForestGreen; + + // 副モニタ実描画 FPS(副 Y 軸)。校正後の描画飢餓(≈2fps)と回復を線で見せる指標。 + seriesSubFps.Name = "SubFps"; + seriesSubFps.LegendText = "副モニタ FPS"; + seriesSubFps.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; + seriesSubFps.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesSubFps.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double; + seriesSubFps.YAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Secondary; + seriesSubFps.BorderWidth = 2; + seriesSubFps.Color = System.Drawing.Color.MediumVioletRed; + + this.chart.Series.Add(seriesPrivate); + this.chart.Series.Add(seriesMainFps); + this.chart.Series.Add(seriesSubFps); + this.chart.Dock = System.Windows.Forms.DockStyle.Fill; + this.chart.Name = "chart"; + this.chart.TabIndex = 0; + + // lblCurrent + this.lblCurrent.AutoSize = false; + this.lblCurrent.Dock = System.Windows.Forms.DockStyle.Top; + this.lblCurrent.Font = new System.Drawing.Font("Consolas", 11F, System.Drawing.FontStyle.Bold); + this.lblCurrent.Height = 32; + this.lblCurrent.Name = "lblCurrent"; + this.lblCurrent.TabIndex = 1; + this.lblCurrent.Text = "現在: --- (待機中)"; + this.lblCurrent.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblCurrent.Padding = new System.Windows.Forms.Padding(4, 0, 0, 0); + + // lblPreview(プレビュー計測: コールバック/描画 FPS・コピー時間の切り分け用) + this.lblPreview.AutoSize = false; + this.lblPreview.Dock = System.Windows.Forms.DockStyle.Top; + this.lblPreview.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular); + this.lblPreview.Height = 28; + this.lblPreview.Name = "lblPreview"; + this.lblPreview.TabIndex = 4; + this.lblPreview.Text = "プレビュー計測: ---"; + this.lblPreview.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblPreview.Padding = new System.Windows.Forms.Padding(4, 0, 0, 0); + + // panelButtons + this.btnStartStop.Name = "btnStartStop"; + this.btnStartStop.Size = new System.Drawing.Size(100, 28); + this.btnStartStop.Location = new System.Drawing.Point(4, 4); + this.btnStartStop.Text = "停止"; + this.btnStartStop.TabIndex = 0; + this.btnStartStop.Click += new System.EventHandler(this.btnStartStop_Click); + + this.btnReset.Name = "btnReset"; + this.btnReset.Size = new System.Drawing.Size(80, 28); + this.btnReset.Location = new System.Drawing.Point(112, 4); + this.btnReset.Text = "リセット"; + this.btnReset.TabIndex = 1; + this.btnReset.Click += new System.EventHandler(this.btnReset_Click); + + this.btnSaveCsv.Name = "btnSaveCsv"; + this.btnSaveCsv.Size = new System.Drawing.Size(100, 28); + this.btnSaveCsv.Location = new System.Drawing.Point(200, 4); + this.btnSaveCsv.Text = "CSV保存"; + this.btnSaveCsv.TabIndex = 2; + this.btnSaveCsv.Click += new System.EventHandler(this.btnSaveCsv_Click); + + this.btnOpenFolder.Name = "btnOpenFolder"; + this.btnOpenFolder.Size = new System.Drawing.Size(120, 28); + this.btnOpenFolder.Location = new System.Drawing.Point(308, 4); + this.btnOpenFolder.Text = "フォルダを開く"; + this.btnOpenFolder.TabIndex = 3; + this.btnOpenFolder.Click += new System.EventHandler(this.btnOpenFolder_Click); + + this.panelButtons.Controls.Add(this.btnStartStop); + this.panelButtons.Controls.Add(this.btnReset); + this.panelButtons.Controls.Add(this.btnSaveCsv); + this.panelButtons.Controls.Add(this.btnOpenFolder); + this.panelButtons.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelButtons.Height = 38; + this.panelButtons.Name = "panelButtons"; + this.panelButtons.TabIndex = 2; + + // MemoryMonitorForm + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(640, 480); + this.Controls.Add(this.chart); + this.Controls.Add(this.lblPreview); + this.Controls.Add(this.lblCurrent); + this.Controls.Add(this.panelButtons); + this.Name = "MemoryMonitorForm"; + // Text は MemoryMonitorForm.cs コンストラクタで設定 + + ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit(); + this.panelButtons.ResumeLayout(false); + this.ResumeLayout(false); + } + + private System.Windows.Forms.DataVisualization.Charting.Chart chart; + private System.Windows.Forms.Label lblCurrent; + private System.Windows.Forms.Label lblPreview; + private System.Windows.Forms.Button btnStartStop; + private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.Button btnSaveCsv; + private System.Windows.Forms.Button btnOpenFolder; + private System.Windows.Forms.Panel panelButtons; + } +} +#endif diff --git a/TIASshot/UI/MemoryMonitorForm.cs b/TIASshot/UI/MemoryMonitorForm.cs new file mode 100644 index 0000000..39b4cee --- /dev/null +++ b/TIASshot/UI/MemoryMonitorForm.cs @@ -0,0 +1,277 @@ +#if MEMMONITOR +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace TIASshot { + + /// + /// メモリ観測ウィンドウ(MEMMONITOR 限定)。 + /// TIASshot 本体プロセスのメモリ使用量をライブ折れ線グラフで表示する。 + /// 研究室デモ用:実使用時にメモリが増え続けないことを画面録画で示す。 + /// + public partial class MemoryMonitorForm : Form { + + // ---- GDI/USER ハンドル数取得(GDI ハンドル枯渇の疑いを確認するため)------ + [DllImport("user32.dll")] + private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags); + private const uint GR_GDIOBJECTS = 0; + private const uint GR_USEROBJECTS = 1; + + // ---- サンプリング記録 ------------------------------------------------- + private struct MemSample { + public double ElapsedSec; + public double PrivateMB; + public double WorkingSetMB; + + // プレビュー計測(コピー負荷 vs UI 描画負荷の切り分け用。PreviewProfiler.Snapshot() の区間値) + public double CallbackFps; // ShowImage 実効フレームレート(コールバックスレッド律速の指標) + public double MainPaintFps; // MainRefreshTimer_Tick の実スワップレート + public double SubUpdateFps; // PreviewMonitor.UpdateImage 呼び出しレート + public double SubPaintFps; // PreviewMonitor_Paint の実スワップレート(副モニタ描画側の指標) + public double SubDropFps; // 副モニタ側の取りこぼしレート + public double SubPaintMs; // picPreview の実描画(base.OnPaint)平均所要時間 + public double MainCopyMs; // 本モニタ用コピー(dispCopy)の平均所要時間 + public double SubCopyMs; // 副モニタ用コピーの平均所要時間 + public uint GdiObjects; // プロセスの GDI オブジェクト数(GetGuiResources GR_GDIOBJECTS) + public uint UserObjects; // プロセスの USER オブジェクト数(GetGuiResources GR_USEROBJECTS) + public int HandleCount; // プロセスのハンドル数(Process.HandleCount) + public int ImgW; // 直近に表示したフレームの幅 + public int ImgH; // 直近に表示したフレームの高さ + public bool SubShown; // 区間内に副モニタが表示されていたか + public string Event; // "SUB_ON"/"SUB_OFF"/"CALIB_START"/"CALIB_END"/"SHOT_START"/"SHOT_END" を ";" 連結(無ければ "") + } + + private readonly List _samples = new List(); + private readonly System.Windows.Forms.Timer _timer; + private readonly Stopwatch _stopwatch = new Stopwatch(); + private bool _isRunning; + private double _lastTickElapsedSec = 0.0; + + // CSV 出力先 + private readonly string _outputDir; + + // ---- コンストラクタ --------------------------------------------------- + + public MemoryMonitorForm() { + InitializeComponent(); + + // F9 で副モニタ計測トグル(Form1.ToggleSubMonitorProfiling)を, + // このウィンドウにフォーカスがある場合にも呼び出せるようにする。 + // このフォームは ShowMemoryMonitor() で Show(this) されるため Owner は Form1。 + this.KeyPreview = true; + this.KeyDown += MemoryMonitorForm_KeyDown; + + this.Text = "メモリ観測ウィンドウ [MEMMONITOR]"; + + _outputDir = Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, + "MemMonitor_Results"); + Directory.CreateDirectory(_outputDir); + + _timer = new System.Windows.Forms.Timer(); + _timer.Interval = 500; + _timer.Tick += Timer_Tick; + + this.FormClosing += (s, e) => { + _timer.Stop(); + }; + + // ウィンドウを開いたら自動でサンプリング開始 + this.Shown += (s, e) => StartSampling(); + } + + // ---- キー操作 -------------------------------------------------------- + + private void MemoryMonitorForm_KeyDown(object sender, KeyEventArgs e) { + if (e.KeyCode == Keys.F9) { + (this.Owner as Form1)?.ToggleSubMonitorProfiling(); + e.Handled = true; + } + } + + // ---- サンプリング制御 ------------------------------------------------ + + private void StartSampling() { + if (_isRunning) return; + _isRunning = true; + _stopwatch.Start(); + _timer.Start(); + btnStartStop.Text = "停止"; + } + + private void StopSampling() { + if (!_isRunning) return; + _isRunning = false; + _stopwatch.Stop(); + _timer.Stop(); + btnStartStop.Text = "開始"; + } + + // ---- タイマー Tick(サンプリング本体)-------------------------------- + + private void Timer_Tick(object sender, EventArgs e) { + // Process.Refresh() で最新値を取得(GC 強制なし) + using (var proc = Process.GetCurrentProcess()) { + proc.Refresh(); + + double elapsedSec = _stopwatch.Elapsed.TotalSeconds; + double privateMB = proc.PrivateMemorySize64 / (1024.0 * 1024.0); + double wsMB = proc.WorkingSet64 / (1024.0 * 1024.0); + + // GDI/USER ハンドル数・プロセスハンドル数(GDI ハンドル枯渇による描画劣化の疑いを確認する) + uint gdiObjects = GetGuiResources(proc.Handle, GR_GDIOBJECTS); + uint userObjects = GetGuiResources(proc.Handle, GR_USEROBJECTS); + int handleCount = proc.HandleCount; + + // プレビュー計測区間の実経過秒(Timer.Interval のブレを吸収するため実測差分を使う) + double intervalSec = elapsedSec - _lastTickElapsedSec; + if (intervalSec <= 0) intervalSec = _timer.Interval / 1000.0; + _lastTickElapsedSec = elapsedSec; + + // PreviewProfiler.Snapshot() は呼び出しごとにカウンタをゼロリセットして区間値を返す。 + // ここで各段の実効 FPS とコピー時間・描画時間平均を算出し, + // - 副モニタ ON で callback_fps が大きく落ちる → コピー/コールバックスレッド律速 + // - callback_fps は高いのに sub_paint_fps が sub_update_fps より大幅に低い → 副モニタの UI 描画律速 + // - CALIB_END/SHOT_END 直後に sub_paint_ms が跳ね上がる → 描画コスト増(副モニタ描画律速) + // 跳ね上がらず sub_paint_fps だけ落ちる → メッセージ枯渇/別要因 + // - gdi_objects/user_objects/handle_count が撮影のたびに増え続け sub_paint_ms 増加と相関 + // → GDI ハンドル枯渇による描画劣化の疑い + // - img_w/img_h が校正前後で変化 → プレビュー画像サイズ肥大による拡大負荷増の疑い + // を切り分けるための材料とする。 + var snap = PreviewProfiler.Snapshot(); + double callbackFps = snap.CallbackFrames / intervalSec; + double mainPaintFps = snap.MainPaints / intervalSec; + double subUpdateFps = snap.SubUpdates / intervalSec; + double subPaintFps = snap.SubPaints / intervalSec; + double subDropFps = snap.SubDrops / intervalSec; + + // 保留イベント(F9 トグル・校正・撮影)を消費する。 + // イベントは 500ms 区間内の直近サンプルに現れる(分析上この粒度で十分)。 + string eventLabel = PreviewProfiler.ConsumeEvents(); + + // 記録 + _samples.Add(new MemSample { + ElapsedSec = elapsedSec, + PrivateMB = privateMB, + WorkingSetMB = wsMB, + CallbackFps = callbackFps, + MainPaintFps = mainPaintFps, + SubUpdateFps = subUpdateFps, + SubPaintFps = subPaintFps, + SubDropFps = subDropFps, + SubPaintMs = snap.SubPaintMs, + MainCopyMs = snap.MainCopyMs, + SubCopyMs = snap.SubCopyMs, + GdiObjects = gdiObjects, + UserObjects = userObjects, + HandleCount = handleCount, + ImgW = snap.ImgW, + ImgH = snap.ImgH, + SubShown = snap.SubShown, + Event = eventLabel, + }); + + // グラフ追加 + double privateGB = privateMB / 1024.0; + double wsGB = wsMB / 1024.0; + + // 左 Y 軸: メモリ主指標 Private(1 本)。右 Y 軸(副軸): 本/副モニタの実描画 FPS。 + // WorkingSet はグラフに描かず CSV にのみ残す(主指標 1 本を録画で強調するため)。 + chart.Series["Private"].Points.AddXY(elapsedSec, privateGB); + chart.Series["MainFps"].Points.AddXY(elapsedSec, mainPaintFps); + chart.Series["SubFps"].Points.AddXY(elapsedSec, subPaintFps); + + // Y 軸オートスケール追従(左右両軸) + chart.ChartAreas["ChartArea1"].RecalculateAxesScale(); + + // ラベル更新 + int n = (int)Math.Round(elapsedSec); + lblCurrent.Text = + $"現在: Private {privateGB:F2} GB / WS {wsGB:F2} GB(経過 {n}s)"; + + string eventSuffix = string.IsNullOrEmpty(eventLabel) ? "" : $" / event {eventLabel}"; + lblPreview.Text = + $"CB {callbackFps:F1} / mainPaint {mainPaintFps:F1} / subUpd {subUpdateFps:F1} subPaint {subPaintFps:F1} subDrop {subDropFps:F1} / " + + $"copy main {snap.MainCopyMs:F1}ms sub {snap.SubCopyMs:F1}ms / subPaint {snap.SubPaintMs:F1}ms / " + + $"gdi {gdiObjects} user {userObjects} handle {handleCount} / img {snap.ImgW}x{snap.ImgH} / " + + $"sub {(snap.SubShown ? "ON" : "OFF")}{eventSuffix} (F9: 副モニタ計測トグル)"; + } + } + + // ---- ボタンイベント -------------------------------------------------- + + private void btnStartStop_Click(object sender, EventArgs e) { + if (_isRunning) { + StopSampling(); + } else { + StartSampling(); + } + } + + private void btnReset_Click(object sender, EventArgs e) { + StopSampling(); + _samples.Clear(); + _stopwatch.Reset(); + _lastTickElapsedSec = 0.0; + PreviewProfiler.Snapshot(); // 未読の累積値を捨てて次回計測をゼロから開始する + PreviewProfiler.ConsumeEvents(); // 未読のイベントも破棄する + chart.Series["Private"].Points.Clear(); + chart.Series["MainFps"].Points.Clear(); + chart.Series["SubFps"].Points.Clear(); + lblCurrent.Text = "現在: --- (リセット)"; + lblPreview.Text = "プレビュー計測: ---"; + } + + private void btnSaveCsv_Click(object sender, EventArgs e) { + if (_samples.Count == 0) { + MessageBox.Show("記録データがありません。", "CSV 保存", + MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + string path = NextCsvPath(); + var sb = new StringBuilder(); + sb.AppendLine( + "elapsed_sec,private_MB,ws_MB,callback_fps,main_paint_fps,sub_update_fps,sub_paint_fps,sub_drop_fps," + + "sub_paint_ms,main_copy_ms,sub_copy_ms,gdi_objects,user_objects,handle_count,img_w,img_h,sub_shown,event"); + foreach (var s in _samples) { + sb.AppendLine( + $"{s.ElapsedSec:F3},{s.PrivateMB:F2},{s.WorkingSetMB:F2}," + + $"{s.CallbackFps:F2},{s.MainPaintFps:F2},{s.SubUpdateFps:F2},{s.SubPaintFps:F2},{s.SubDropFps:F2}," + + $"{s.SubPaintMs:F3},{s.MainCopyMs:F3},{s.SubCopyMs:F3}," + + $"{s.GdiObjects},{s.UserObjects},{s.HandleCount},{s.ImgW},{s.ImgH}," + + $"{(s.SubShown ? 1 : 0)},{s.Event}"); + } + File.WriteAllText(path, sb.ToString(), new UTF8Encoding(false)); + + MessageBox.Show($"保存しました:\n{path}", "CSV 保存", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void btnOpenFolder_Click(object sender, EventArgs e) { + Directory.CreateDirectory(_outputDir); + Process.Start("explorer.exe", _outputDir); + } + + // ---- ユーティリティ -------------------------------------------------- + + private string NextCsvPath() { + const string prefix = "mem_monitor_"; + int max = 0; + if (Directory.Exists(_outputDir)) { + foreach (var f in Directory.GetFiles(_outputDir, prefix + "*.csv")) { + string name = Path.GetFileNameWithoutExtension(f); + string numPart = name.Substring(prefix.Length); + if (int.TryParse(numPart, out int n) && n > max) max = n; + } + } + return Path.Combine(_outputDir, $"{prefix}{max + 1:D4}.csv"); + } + } +} +#endif diff --git a/TIASshot/UI/PreviewMonitor.Designer.cs b/TIASshot/UI/PreviewMonitor.Designer.cs new file mode 100644 index 0000000..d9b390e --- /dev/null +++ b/TIASshot/UI/PreviewMonitor.Designer.cs @@ -0,0 +1,150 @@ +namespace TIASshot { + partial class PreviewMonitor { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { +#if MEMMONITOR + // 副モニタの実描画時間計測用(sub_paint_ms)。PictureBox 派生で挙動は同一。 + this.picPreview = new TIASshot.TimedPictureBox(); +#else + this.picPreview = new System.Windows.Forms.PictureBox(); +#endif + this.label1 = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.picPreview)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // picPreview + // + this.picPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.picPreview.Location = new System.Drawing.Point(617, 0); + this.picPreview.Name = "picPreview"; + this.picPreview.Size = new System.Drawing.Size(662, 800); + this.picPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picPreview.TabIndex = 0; + this.picPreview.TabStop = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("BIZ UDPゴシック", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label1.Location = new System.Drawing.Point(78, 326); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(435, 144); + this.label1.TabIndex = 1; + this.label1.Text = "口を大きく開いて\r\n\r\n舌を出してください"; + // + // pictureBox1 + // + this.pictureBox1.Image = global::TIASshot.Properties.Resources.アイコン; + this.pictureBox1.Location = new System.Drawing.Point(12, 72); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(133, 132); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 2; + this.pictureBox1.TabStop = false; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("BIZ UDPゴシック", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label2.Location = new System.Drawing.Point(169, 72); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(397, 24); + this.label2.TabIndex = 3; + this.label2.Text = "千葉大学フロンティア医工学センター"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("BIZ UDPゴシック", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label3.Location = new System.Drawing.Point(166, 137); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(445, 37); + this.label3.TabIndex = 3; + this.label3.Text = "舌撮影解析システム TIAS"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("BIZ UDPゴシック", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); + this.label4.Location = new System.Drawing.Point(261, 185); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(345, 19); + this.label4.TabIndex = 4; + this.label4.Text = "Tongue Image Analyzing System"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Segoe UI", 36F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.Location = new System.Drawing.Point(26, 538); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(580, 130); + this.label5.TabIndex = 5; + this.label5.Text = "Open your mouth wide \r\nand stick out your tongue."; + // + // PreviewMonitor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1280, 800); + this.ControlBox = false; + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.picPreview); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "PreviewMonitor"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "PreviewMonitor"; + this.Load += new System.EventHandler(this.PreviewMonitor_Load); + ((System.ComponentModel.ISupportInitialize)(this.picPreview)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox picPreview; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + } +} \ No newline at end of file diff --git a/TIASshot/UI/PreviewMonitor.cs b/TIASshot/UI/PreviewMonitor.cs new file mode 100644 index 0000000..6acac3f --- /dev/null +++ b/TIASshot/UI/PreviewMonitor.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TIASshot { + public partial class PreviewMonitor : Form { + private Point _location; + private Size _size = new Size(0, 0); + private Bitmap _dispBuf; + private bool _isUpdateBuf = false; + private readonly object _dispBufLock = new object(); + + // 副モニタ(セカンダリ・非アクティブ・ボーダーレスウィンドウ)は,コールバックスレッドから + // 毎フレーム Invalidate() すると WM_PAINT が飢餓状態になり sub_paint_fps が数fpsまで落ち込む + // (実描画コスト・GDI 枯渇・画像サイズ肥大は計測により否定済み)。 + // そのため UI タイマーで一定周期(約30fps)に自ペース再描画し,コールバックスレッドからは + // 「最新フレームの保持」のみを行い Invalidate は一切呼ばない。 + private const int RefreshIntervalMs = 33; // ≒30fps + private readonly System.Windows.Forms.Timer _refreshTimer; + + public bool IsShown => (_size.Width > 0); + + /// + /// プレビューウィンドウのコンストラクタ + /// + public PreviewMonitor() { + InitializeComponent(); + + // プレビューウィンドウの位置とサイズを取得 + foreach (var scr in Screen.AllScreens) { + if (scr.Primary) continue; // プライマリスクリーンは除外 + if (scr.Bounds.Width <= Config.GetInt("Shot/PreviewMonitorWidth")) { + _location = scr.Bounds.Location; + _size = scr.Bounds.Size; + } + } + + _refreshTimer = new System.Windows.Forms.Timer(); + _refreshTimer.Interval = RefreshIntervalMs; + _refreshTimer.Tick += RefreshTimer_Tick; + + this.FormClosing += (s, e) => _refreshTimer.Stop(); + } + + /// + /// プレビューウィンドウのロードイベント + /// + /// + /// + private void PreviewMonitor_Load(object sender, EventArgs e) { + // プレビューウィンドウの位置とサイズを設定 + Location = _location; + Size = _size; + + if (IsShown) _refreshTimer.Start(); + } + + /// + /// プレビューウィンドウの表示状態を更新(カメラのコールバックスレッドから毎フレーム呼ばれる) + /// 最新フレームの保持のみを行い,UI 再描画のトリガー(Invalidate)は呼ばない。 + /// 実際の表示更新は RefreshTimer_Tick(UI スレッド)が自ペースで行う。 + /// + /// + public void UpdateImage(Bitmap image) { +#if MEMMONITOR + PreviewProfiler.IncrementSubUpdates(); +#endif + // 原因3: RefreshTimer_Tick に反映されなかった旧バッファを上書き前に Dispose する + // _dispBufLock で UpdateImage(コールバックスレッド)と RefreshTimer_Tick(UIスレッド)の + // 競合・二重 Dispose を防ぐ + Bitmap toDispose = null; + lock (_dispBufLock) { + if (_isUpdateBuf && _dispBuf != null) { + toDispose = _dispBuf; + } + _dispBuf = image; + _isUpdateBuf = true; + } +#if MEMMONITOR + if (toDispose != null) PreviewProfiler.IncrementSubDrops(); +#endif + toDispose?.Dispose(); // ロック外で GDI 解放(コールバックスレッド上だが,まだ表示に使われていないフレームのみ) + // Invalidate() は呼ばない(毎フレーム呼ぶと WM_PAINT が飢餓状態になるため)。 + } + + /// + /// UI タイマーによる自ペース再描画(約30fps)。 + /// 新フレームがあるときだけ picPreview.Image を差し替える(静止フレームは無駄に再描画しない)。 + /// + private void RefreshTimer_Tick(object sender, EventArgs e) { + if (!IsShown) return; + + // 原因3: _dispBufLock で UpdateImage との競合を防ぎながらバッファを取り出す + Bitmap toDisplay; + lock (_dispBufLock) { + if (!_isUpdateBuf || _dispBuf == null) return; + toDisplay = _dispBuf; + _dispBuf = null; // 参照を手放し、UpdateImage 側が誤 Dispose しないようにする + _isUpdateBuf = false; + } + + // picPreview.Image の Dispose・差し替えは UI スレッド(このタイマー Tick)でのみ行う。 + // 代入によって picPreview 自身が再描画され,MEMMONITOR の TimedPictureBox.OnPaint 計測も + // 引き続き機能する。 + picPreview.Image?.Dispose(); // 直前に表示していたバッファを解放 + picPreview.Image = toDisplay; +#if MEMMONITOR + PreviewProfiler.IncrementSubPaints(); +#endif + } + } +} diff --git a/TIASshot/UI/PreviewMonitor.resx b/TIASshot/UI/PreviewMonitor.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/TIASshot/UI/PreviewMonitor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TIASshot/UI/PreviewProfiler.cs b/TIASshot/UI/PreviewProfiler.cs new file mode 100644 index 0000000..4ad43d8 --- /dev/null +++ b/TIASshot/UI/PreviewProfiler.cs @@ -0,0 +1,162 @@ +#if MEMMONITOR +using System.Diagnostics; +using System.Text; +using System.Threading; + +namespace TIASshot { + + /// + /// プレビュー表示経路の性能計測(MEMMONITOR 限定)。 + /// カメラのコールバックスレッド(Form1.ShowImage)と UI スレッド(MainRefreshTimer_Tick 等)の + /// 双方から呼ばれるため,すべて Interlocked/lock で加算するスレッド安全なカウンタとする。 + /// 「コピー負荷(コールバックスレッド)」「副モニタの実描画コスト」「GDI/USER ハンドル枯渇」 + /// 「プレビュー画像サイズ肥大」のどれが副モニタ描画崩壊の原因かを切り分けるために, + /// 各段の呼び出し回数・所要時間・イベント(校正/撮影/F9 トグル)を計測する。 + /// + internal static class PreviewProfiler { + + // ---- カウンタ(区間内の呼び出し回数)---------------------------------- + private static long _callbackFrames; // ShowImage 呼び出し数(コールバックスレッドの実効フレーム数) + private static long _mainPaints; // MainRefreshTimer_Tick で実際に picDisplay.Image を差し替えた回数 + private static long _subUpdates; // PreviewMonitor.UpdateImage 呼び出し数 + private static long _subPaints; // RefreshTimer_Tick で実際に picPreview.Image を差し替えた回数 + private static long _subDrops; // UpdateImage で旧バッファを取りこぼし Dispose した回数 + + // ---- コピー時間累積(Stopwatch tick)---------------------------------- + private static long _mainCopyTicks; + private static long _mainCopySamples; + private static long _subCopyTicks; + private static long _subCopySamples; + + // ---- 副モニタの実描画時間累積(Stopwatch tick)-------------------------- + // TimedPictureBox.OnPaint(picPreview の実際の GDI 描画: base.OnPaint)の所要時間。 + // 「描画コストそのものが増えているか」と「メッセージ枯渇で呼び出し自体が減っているか」を + // sub_paint_fps(呼び出しレート)と組み合わせて切り分けるための指標。 + private static long _subPaintTicks; + private static long _subPaintSamples; + + // ---- 直近の副モニタ表示状態 -------------------------------------------- + private static int _isSubShown; // 0/1 を Interlocked で扱う(bool は Interlocked 非対応のため) + + public static bool IsSubShown { + get { return Interlocked.CompareExchange(ref _isSubShown, 0, 0) != 0; } + set { Interlocked.Exchange(ref _isSubShown, value ? 1 : 0); } + } + + // ---- 直近の表示画像サイズ(プレビュー画像肥大の確認用)-------------------- + private static int _lastImgW; + private static int _lastImgH; + + /// Form1.ShowImage から呼ばれ,直近に表示したフレームのサイズを記録する + public static void SetLastImageSize(int w, int h) { + Interlocked.Exchange(ref _lastImgW, w); + Interlocked.Exchange(ref _lastImgH, h); + } + + // ---- イベント(CSV の event 列用)---------------------------------------- + // F9 トグル(SUB_ON/SUB_OFF)・校正(CALIB_START/CALIB_END)・撮影(SHOT_START/SHOT_END)を + // 文字列イベントとして記録する。同一 500ms 区間内に複数発生した場合は ";" で連結する。 + // 呼び出し元(コールバックスレッド・UI スレッド・撮影スレッド)が異なるため lock で保護する。 + private static readonly object _eventLock = new object(); + private static readonly StringBuilder _pendingEvents = new StringBuilder(); + + /// イベントタグを保留イベントに追加する(スレッドセーフ) + public static void MarkEvent(string tag) { + lock (_eventLock) { + if (_pendingEvents.Length > 0) _pendingEvents.Append(';'); + _pendingEvents.Append(tag); + } + } + + /// 保留中のイベント文字列を読み取ってクリアする(無ければ "") + public static string ConsumeEvents() { + lock (_eventLock) { + string result = _pendingEvents.ToString(); + _pendingEvents.Clear(); + return result; + } + } + + // ---- カウンタ加算ヘルパ ------------------------------------------------- + public static void IncrementCallbackFrames() => Interlocked.Increment(ref _callbackFrames); + public static void IncrementMainPaints() => Interlocked.Increment(ref _mainPaints); + public static void IncrementSubUpdates() => Interlocked.Increment(ref _subUpdates); + public static void IncrementSubPaints() => Interlocked.Increment(ref _subPaints); + public static void IncrementSubDrops() => Interlocked.Increment(ref _subDrops); + + /// 本モニタ用コピー(dispCopy 生成)の所要時間を記録する + public static void AddMainCopyTicks(long ticks) { + Interlocked.Add(ref _mainCopyTicks, ticks); + Interlocked.Increment(ref _mainCopySamples); + } + + /// 副モニタ用コピー(new Bitmap(bmp))の所要時間を記録する + public static void AddSubCopyTicks(long ticks) { + Interlocked.Add(ref _subCopyTicks, ticks); + Interlocked.Increment(ref _subCopySamples); + } + + /// TimedPictureBox(picPreview)の実描画(base.OnPaint)所要時間を記録する + public static void AddSubPaintTicks(long ticks) { + Interlocked.Add(ref _subPaintTicks, ticks); + Interlocked.Increment(ref _subPaintSamples); + } + + // ---- スナップショット ---------------------------------------------------- + + /// + /// 区間計測結果のスナップショット。呼び出し回数はそのまま(呼び出し側で区間秒で割って FPS 換算する), + /// コピー時間・描画時間は ms 平均に変換済み。 + /// + public struct ProfilerSnapshot { + public long CallbackFrames; + public long MainPaints; + public long SubUpdates; + public long SubPaints; + public long SubDrops; + public double MainCopyMs; // 平均コピー時間(ms)。サンプルなしなら 0 + public double SubCopyMs; // 平均コピー時間(ms)。サンプルなしなら 0 + public double SubPaintMs; // picPreview の平均実描画時間(ms)。サンプルなしなら 0 + public bool SubShown; + public int ImgW; // 直近に表示したフレームの幅 + public int ImgH; // 直近に表示したフレームの高さ + } + + /// + /// 現在値を読み取ってゼロにリセットし,区間スナップショットを返す。 + /// MemoryMonitorForm の Timer_Tick(500ms 間隔)から呼ばれる想定。 + /// + public static ProfilerSnapshot Snapshot() { + long callbackFrames = Interlocked.Exchange(ref _callbackFrames, 0); + long mainPaints = Interlocked.Exchange(ref _mainPaints, 0); + long subUpdates = Interlocked.Exchange(ref _subUpdates, 0); + long subPaints = Interlocked.Exchange(ref _subPaints, 0); + long subDrops = Interlocked.Exchange(ref _subDrops, 0); + + long mainCopyTicks = Interlocked.Exchange(ref _mainCopyTicks, 0); + long mainCopySamples = Interlocked.Exchange(ref _mainCopySamples, 0); + long subCopyTicks = Interlocked.Exchange(ref _subCopyTicks, 0); + long subCopySamples = Interlocked.Exchange(ref _subCopySamples, 0); + + long subPaintTicks = Interlocked.Exchange(ref _subPaintTicks, 0); + long subPaintSamples = Interlocked.Exchange(ref _subPaintSamples, 0); + + double tickToMs = 1000.0 / Stopwatch.Frequency; + + return new ProfilerSnapshot { + CallbackFrames = callbackFrames, + MainPaints = mainPaints, + SubUpdates = subUpdates, + SubPaints = subPaints, + SubDrops = subDrops, + MainCopyMs = mainCopySamples > 0 ? (mainCopyTicks * tickToMs) / mainCopySamples : 0.0, + SubCopyMs = subCopySamples > 0 ? (subCopyTicks * tickToMs) / subCopySamples : 0.0, + SubPaintMs = subPaintSamples > 0 ? (subPaintTicks * tickToMs) / subPaintSamples : 0.0, + SubShown = IsSubShown, + ImgW = Interlocked.CompareExchange(ref _lastImgW, 0, 0), + ImgH = Interlocked.CompareExchange(ref _lastImgH, 0, 0), + }; + } + } +} +#endif diff --git a/TIASshot/UI/TimedPictureBox.cs b/TIASshot/UI/TimedPictureBox.cs new file mode 100644 index 0000000..7e05bd5 --- /dev/null +++ b/TIASshot/UI/TimedPictureBox.cs @@ -0,0 +1,21 @@ +#if MEMMONITOR +using System.Diagnostics; +using System.Windows.Forms; + +namespace TIASshot { + + /// + /// 副モニタの実描画時間を計測する PictureBox(MEMMONITOR 限定)。 + /// base.OnPaint(実際の GDI 描画)の所要時間を PreviewProfiler に記録し, + /// 「副モニタの描画コストそのものが増えているか」を sub_paint_ms として可視化する。 + /// 本番ビルドでは本クラスごとコンパイルされないため,通常の PictureBox と挙動は一切変わらない。 + /// + internal class TimedPictureBox : PictureBox { + protected override void OnPaint(PaintEventArgs pe) { + long t0 = Stopwatch.GetTimestamp(); + base.OnPaint(pe); + PreviewProfiler.AddSubPaintTicks(Stopwatch.GetTimestamp() - t0); + } + } +} +#endif diff --git a/TIASshot/Utils/BitmapUtil.cs b/TIASshot/Utils/BitmapUtil.cs new file mode 100644 index 0000000..82d10b6 --- /dev/null +++ b/TIASshot/Utils/BitmapUtil.cs @@ -0,0 +1,70 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; + +namespace TIASshot { + + /// + /// Bitmap 操作の共有ユーティリティ。 + /// プレビュー表示経路で毎フレーム発生する Bitmap の複製処理を高速化するために, + /// GDI+ の DrawImage 経路()ではなく, + /// LockBits による生画素の直接コピー(memcpy 相当)を提供する。 + /// + internal static class BitmapUtil { + + [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")] + private static extern void CopyMemory(IntPtr dest, IntPtr src, UIntPtr count); + + /// + /// Bitmap を高速に複製する。 + /// 入力と同じ PixelFormat・サイズの新規 Bitmap を確保し,LockBits で取得した + /// 生画素バッファをネイティブ memcpy(RtlMoveMemory)で丸ごとコピーする。 + /// 生成される Bitmap は入力とは独立した画素バッファを持つため, + /// 呼び出し元スレッドとは別のスレッド(UI スレッド等)で安全に保持・Dispose できる + /// ( によるフルコピーと同じ所有権モデル)。 + /// + /// 複製元の Bitmap(読み取りのみ・変更しない) + /// src と独立した画素バッファを持つ新規 Bitmap + public static Bitmap FastClone(Bitmap src) { + if (src == null) return null; + + // インデックスカラー系(8bpp 以下)はパレットを保持する必要があり, + // LockBits の単純コピーだけではパレット情報が失われるため, + // 安全網として従来どおりの GDI+ フルコピーにフォールバックする。 + // ※ この経路は入力と独立・色が等価なコピーを返すが,GDI+ の Bitmap(Image) + // により PixelFormat は 32bppArgb に変換される(8bppIndexed のままにはならない)。 + // プレビュー画像(Mat.ToBitmap() 由来の 24bppRgb)は通常この分岐に入らない。 + if ((src.PixelFormat & PixelFormat.Indexed) != 0) { + return new Bitmap(src); + } + + var rect = new Rectangle(0, 0, src.Width, src.Height); + var dst = new Bitmap(src.Width, src.Height, src.PixelFormat); + + BitmapData srcData = null; + BitmapData dstData = null; + try { + srcData = src.LockBits(rect, ImageLockMode.ReadOnly, src.PixelFormat); + dstData = dst.LockBits(rect, ImageLockMode.WriteOnly, dst.PixelFormat); + + // ストライドは通常一致するが,念のため行ごとに小さい方のバイト数だけコピーする + // (負ストライド/パディング差があっても src・dst それぞれの範囲を超えない堅牢な実装) + int bytesPerRow = Math.Min(Math.Abs(srcData.Stride), Math.Abs(dstData.Stride)); + var count = (UIntPtr)bytesPerRow; + + for (int y = 0; y < src.Height; y++) { + IntPtr srcRow = IntPtr.Add(srcData.Scan0, y * srcData.Stride); + IntPtr dstRow = IntPtr.Add(dstData.Scan0, y * dstData.Stride); + CopyMemory(dstRow, srcRow, count); + } + } finally { + // src は ReadOnly ロックのみなので UnlockBits は元データを変更しない(src は破損しない) + if (srcData != null) src.UnlockBits(srcData); + if (dstData != null) dst.UnlockBits(dstData); + } + + return dst; + } + } +} diff --git a/TIASshot/Utils/ImageStats.cs b/TIASshot/Utils/ImageStats.cs new file mode 100644 index 0000000..52b8bae --- /dev/null +++ b/TIASshot/Utils/ImageStats.cs @@ -0,0 +1,225 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using OpenCvSharp; + +namespace TIASshot { + /// + /// 1 フレーム分の飽和統計情報を保持する構造体(ピュアロジック). + /// + internal struct FrameStats { + public double SaturatedRatio; // 飽和画素率(値 >= 254 の割合) + public double P99; // ROI 輝度(グレースケール)の 99 パーセンタイル + public double MeanB; + public double MeanG; + public double MeanR; + public double MaxB; + public double MaxG; + public double MaxR; + } + + /// + /// 飽和統計の算出と JSON サイドカー生成を担う純粋ユーティリティクラス(ハードウェア非依存). + /// + /// GUIDE_08 ピュアロジック層に分類する:Mat を入力に統計を返す静的メソッド群, + /// および設定 dict → JSON 文字列変換メソッドを提供する. + /// [InternalsVisibleTo("TIASshot.Tests")] により TIASshot.Tests から呼び出せる. + /// + /// + internal static class ImageStats { + + // --------------------------------------------------------------- + // 統計算出 + // --------------------------------------------------------------- + + /// + /// ROI 適用済みの BGR Mat から 1 フレーム分の飽和統計を算出する(ピュアロジック). + /// + /// CV_8UC3 の BGR Mat(ROI 適用後) + /// 統計情報 + internal static FrameStats Calc(Mat bgr) { + if (bgr == null) throw new ArgumentNullException("bgr"); + if (bgr.Type() != MatType.CV_8UC3) + throw new ArgumentException("bgr must be CV_8UC3"); + + int total = bgr.Rows * bgr.Cols; + + // チャンネル分離 + Mat[] channels = Cv2.Split(bgr); + try { + Mat b = channels[0]; + Mat g = channels[1]; + Mat r = channels[2]; + + // --- チャンネル別 mean / max --- + Scalar meanB = Cv2.Mean(b); + Scalar meanG = Cv2.Mean(g); + Scalar meanR = Cv2.Mean(r); + + double maxBVal, maxGVal, maxRVal; + Point dummy1, dummy2; + double dummyMin; + Cv2.MinMaxLoc(b, out dummyMin, out maxBVal, out dummy1, out dummy2); + Cv2.MinMaxLoc(g, out dummyMin, out maxGVal, out dummy1, out dummy2); + Cv2.MinMaxLoc(r, out dummyMin, out maxRVal, out dummy1, out dummy2); + + // --- 輝度(グレースケール)への変換 --- + // OpenCV の BGR2GRAY: 0.114*B + 0.587*G + 0.299*R + using (Mat gray = new Mat()) { + Cv2.CvtColor(bgr, gray, ColorConversionCodes.BGR2GRAY); + + // --- 飽和画素率(輝度 >= 254)--- + using (Mat saturatedMask = new Mat()) { + Cv2.Threshold(gray, saturatedMask, 253.5, 1.0, ThresholdTypes.Binary); + int saturatedCount = (int)Cv2.Sum(saturatedMask).Val0; + double saturatedRatio = total > 0 ? (double)saturatedCount / total : 0.0; + + // --- p99(輝度の 99 パーセンタイル)--- + double p99 = CalcPercentile(gray, 99.0); + + return new FrameStats { + SaturatedRatio = saturatedRatio, + P99 = p99, + MeanB = meanB.Val0, + MeanG = meanG.Val0, + MeanR = meanR.Val0, + MaxB = maxBVal, + MaxG = maxGVal, + MaxR = maxRVal, + }; + } + } + } finally { + foreach (var ch in channels) ch.Dispose(); + } + } + + /// + /// CV_8U Mat の指定パーセンタイル値を累積ヒストグラムから算出する(ピュアロジック). + /// + /// CV_8U の Mat + /// パーセンタイル(0〜100) + /// パーセンタイル値(0〜255 の実数) + internal static double CalcPercentile(Mat gray, double percentile) { + if (gray == null) throw new ArgumentNullException("gray"); + if (gray.Type() != MatType.CV_8U) + throw new ArgumentException("gray must be CV_8U"); + + int total = gray.Rows * gray.Cols; + if (total == 0) return 0.0; + + // ヒストグラムを計算(256 ビン,0〜255) + Mat[] srcArr = { gray }; + int[] channels = { 0 }; + Mat hist = new Mat(); + try { + int[] histSize = { 256 }; + Rangef[] ranges = { new Rangef(0, 256) }; + Cv2.CalcHist(srcArr, channels, null, hist, 1, histSize, ranges); + + double threshold = total * (percentile / 100.0); + double cumulative = 0.0; + for (int i = 0; i < 256; i++) { + cumulative += hist.At(i); + if (cumulative >= threshold) { + return (double)i; + } + } + return 255.0; + } finally { + hist.Dispose(); + } + } + + // --------------------------------------------------------------- + // JSON 生成 + // --------------------------------------------------------------- + + /// + /// 撮影条件辞書と統計リストから JSON 文字列を生成する(ピュアロジック). + /// StringBuilder を使った手書きシリアライズにより,NuGet 追加依存なし. + /// + /// 撮影条件・メタ情報の辞書(キーはすべて ASCII 文字列) + /// フレームごとの統計リスト(null なら省略) + /// 整形済み JSON 文字列 + internal static string BuildJson(Dictionary meta, IList stats) { + var sb = new StringBuilder(); + sb.AppendLine("{"); + + // メタ情報 + bool firstMeta = true; + foreach (var kvp in meta) { + if (!firstMeta) sb.AppendLine(","); + firstMeta = false; + sb.Append(" "); + AppendJsonString(sb, kvp.Key); + sb.Append(": "); + AppendJsonValue(sb, kvp.Value); + } + + // フレーム統計 + if (stats != null && stats.Count > 0) { + if (!firstMeta) sb.AppendLine(","); + sb.AppendLine(" \"frame_stats\": ["); + for (int i = 0; i < stats.Count; i++) { + var s = stats[i]; + sb.AppendLine(" {"); + sb.AppendLine(" \"frame\": " + (i + 1) + ","); + sb.AppendLine(" \"saturated_ratio\": " + FormatDouble(s.SaturatedRatio) + ","); + sb.AppendLine(" \"p99_luminance\": " + FormatDouble(s.P99) + ","); + sb.AppendLine(" \"mean_B\": " + FormatDouble(s.MeanB) + ","); + sb.AppendLine(" \"mean_G\": " + FormatDouble(s.MeanG) + ","); + sb.AppendLine(" \"mean_R\": " + FormatDouble(s.MeanR) + ","); + sb.AppendLine(" \"max_B\": " + FormatDouble(s.MaxB) + ","); + sb.AppendLine(" \"max_G\": " + FormatDouble(s.MaxG) + ","); + sb.Append(" \"max_R\": " + FormatDouble(s.MaxR)); + sb.AppendLine(); + if (i < stats.Count - 1) { + sb.AppendLine(" },"); + } else { + sb.AppendLine(" }"); + } + } + sb.Append(" ]"); + } + + sb.AppendLine(); + sb.Append("}"); + return sb.ToString(); + } + + private static void AppendJsonString(StringBuilder sb, string s) { + sb.Append('"'); + foreach (var c in s) { + if (c == '"') sb.Append("\\\""); + else if (c == '\\') sb.Append("\\\\"); + else sb.Append(c); + } + sb.Append('"'); + } + + private static void AppendJsonValue(StringBuilder sb, object v) { + if (v == null) { + sb.Append("null"); + } else if (v is bool bv) { + sb.Append(bv ? "true" : "false"); + } else if (v is int iv) { + sb.Append(iv); + } else if (v is double dv) { + sb.Append(FormatDouble(dv)); + } else if (v is float fv) { + sb.Append(FormatDouble(fv)); + } else if (v is long lv) { + sb.Append(lv); + } else { + // 文字列として出力 + AppendJsonString(sb, v.ToString()); + } + } + + private static string FormatDouble(double d) { + return d.ToString("G6", System.Globalization.CultureInfo.InvariantCulture); + } + } +} diff --git a/TIASshot/Utils/IoUtil.cs b/TIASshot/Utils/IoUtil.cs new file mode 100644 index 0000000..0d7c41e --- /dev/null +++ b/TIASshot/Utils/IoUtil.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Media; +using OpenCvSharp; + +namespace TIASshot { + /// + /// ファイル I/O(CSV 読み書き・保存フォルダ生成・撮影情報出力)とサウンド再生の + /// ユーティリティ.CameraBase から委譲される.状態を持たない. + /// + internal static class IoUtil { + + /// + /// csvファイルからMatを読み込む + /// + /// + /// + /// + public static Mat LoadMatFromCsv(string csvFile) { + try { + var arr = new List(); + int cols = -1; + using (var reader = new StreamReader(csvFile)) { + while (!reader.EndOfStream) { + var line = reader.ReadLine(); + var valStrs = line.Split(','); + if (cols == -1) cols = valStrs.Length; + else if (cols != valStrs.Length) throw new Exception("cols != valStrs.Length"); + var vals = valStrs.Select(x => double.Parse(x)).ToArray(); + arr.Add(vals); + } + } + var m = new Mat(arr.Count, cols, MatType.CV_64FC1); + for (var row = 0; row < arr.Count; row++) { + for (var col = 0; col < cols; col++) { + m.At(row, col) = arr[row][col]; + } + } + return m; + } catch (Exception) { + return null; + } + } + + /// + /// Matをcsvファイルに保存 + /// + /// + /// + public static void SaveMatToCsv(string csvFile, Mat m) { + using (var writer = new StreamWriter(csvFile)) { + for (var row = 0; row < m.Rows; row++) { + var line = ""; + for (var col = 0; col < m.Cols; col++) { + if (col > 0) line += ","; + line += $"{m.At(row, col):0.0000000}"; + } + writer.WriteLine(line); + } + } + } + + /// + /// 保存フォルダを生成し,そのパスを返す + /// + /// + /// 生成した保存フォルダのパス + public static string CreateSaveFolder(string note) { + var dt = DateTime.Now; + var paths = new List() { + Config.GetString("File/SaveFolder"), + dt.ToString("yyyy-MM-dd"), + dt.ToString("HH_mm_ss") + $"-{note}", + }; + var saveFolder = Path.Combine(paths.ToArray()); + Directory.CreateDirectory(saveFolder); + return saveFolder; + } + + /// + /// 設定値をCSVファイルに書き込む + /// + /// + /// + public static void WriteInfo(StreamWriter sw, Dictionary info) { + sw.WriteLine($"撮影日時,{DateTime.Now:yyyy/MM/dd HH:mm:ss}"); // 撮影日時を追加 + foreach (var kvp in info) { + sw.WriteLine($"{kvp.Key},{kvp.Value}"); + } + } + + /// + /// 効果音を再生する + /// + /// + public static void PlaySound(string wavfile) { + if (!File.Exists(wavfile)) { + Debug.WriteLine($"音声ファイルが見つかりません: {wavfile}"); + return; + } + try { + using (var player = new SoundPlayer(wavfile)) { + player.Play(); + } + } catch (Exception ex) { + Debug.WriteLine($"音声再生に失敗しました: {ex.Message}"); + } + } + } +} diff --git "a/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" "b/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" new file mode 100644 index 0000000..f277852 --- /dev/null +++ "b/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" @@ -0,0 +1,128 @@ +# プロジェクト立ち上げフロー (Project Setup Flow) + +新規プロジェクトを AI と協働で立ち上げる際の手順を定義する. +各フェーズを順番に進め,成果物を確定させてから次のフェーズに移ること. + +## フェーズ一覧 (Phase Overview) + +| フェーズ | やること | 成果物 | +| -------- | ---------------------------------------------- | ---------------------------------------------------------- | +| 方針決定 | プロジェクトの目的・スコープを決める | `PLAN_01_要件定義書.md` | +| 技術選定 | 言語・フレームワーク・インフラを決める | `ENV_01_技術スタック.md` | +| 環境構築 | 開発環境のセットアップ手順を整備する | `ENV_02_環境構築手順.md`,`ENV_03_管理者用環境構築手順.md`,`ENV_04_開発コマンド.md`(任意) | +| 仕様設計 | アーキテクチャ・データモデル・画面設計を決める | `SPEC_01_*.md` | +| 規約整備 | 技術スタックに応じたコーディング規約を作る | `.claude/rules/*.md` | +| 開発計画 | ステップを分割し,開発順序を決める | `PLAN_02_開発ステップ.md` | +| 実装開始 | 開発計画に沿って実装を進める | ソースコード | + +※ 立ち上げフローで作成するのは `02_ENV / 03_PLAN / 04_SPEC` カテゴリの成果物と,規約整備フェーズの `.claude/rules/*.md` のみ.`05_TECH`(技術設計)・`06_TEST`(テスト)は実装フェーズで必要になった時点で作成し,立ち上げ時に空フォルダを作らない. + +## 開発モードとファイル構成 (Development Modes & File Layout) + +プロジェクトは個人開発(solo)とチーム開発(team)の 2 モードで運用できる.モードは `/setup` の冒頭で選択し,`.claude/project-mode` に記録される(後からの切り替えは `/set-mode `). + +| レイヤ | 対象 | 存在するモード | +| --- | --- | --- | +| 共通層 | `GUIDE_01`・`GUIDE_02`,`.claude/rules/` のすべて,`.claude/agents/`,skills(`commit`・`implement`・`setup`・`sync-template`・`set-mode`・`auto-refactor`・`auto-audit`) | solo・team 両方 | +| team 層 | `GUIDE_03`,skills(`task-create`・`task-start`(+ `reference.md`)・`task-handoff`),`.claude/hooks/check_sync.sh`,`settings.json` の SessionStart 配線 | team のみ | + +- `.claude/rules/` はすべて共通層だが,進捗記録ルール(`progress-log`)だけは team モードで運用上**上書き**される(進捗は `CLAUDE.md`/`docs/PROGRESS.md` ではなく GitHub Issues と git 履歴で追う.GUIDE_03). +- team 層ファイルの配置・削除は `/set-mode` が一括で行い,`/sync-template` は `.claude/project-mode` を見て team 層の同期可否を判定する.team 層ファイルの正確なリストは `/set-mode`・`/sync-template` の定義に持たせており,増減時は両者を一致させること. + +## 方針決定 (Direction) + +プロジェクトの全体像を明確にする. + +- **人間が決めること**: プロジェクトの目的,対象ユーザー,スコープ(やること・やらないこと) +- **AI に依頼できること**: 要件の整理・構造化,類似プロジェクトの調査,要件定義書のドラフト作成 +- **成果物**: `PLAN_01_要件定義書.md` + +## 技術選定 (Tech Stack) + +要件に基づいて技術スタックを決定する. + +- **人間が決めること**: 最終的な技術選定の判断,チームのスキルセットとの適合性 +- **AI に依頼できること**: 要件に適した技術の候補提案,各候補のメリット・デメリット比較 +- **成果物**: `ENV_01_技術スタック.md` + +## 環境構築 (Environment Setup) + +開発環境を構築し,手順をドキュメント化する.初回のみの管理者作業と,メンバーが繰り返し行う構築手順を分けて整備する. + +- **前提条件**: 以下のツールは全プロジェクト共通で導入する. + - `git` — バージョン管理(運用ルールは `.claude/rules/git-conventions.md` で定義) + - `gh` — GitHub CLI(PR 作成・マージ等に使用) +- **基本方針**: 環境の再現性を重視し,手順書だけに頼らず構築を自動化・コード化できる方法を優先する(例: Docker,Dev Containers,Windows Sandbox,IaC ツール等). +- **人間が決めること**: 開発マシンの選定,クラウドサービスのアカウント作成,環境構築方法の選択 +- **AI に依頼できること**: 環境構築手順書の作成,設定ファイルの生成,`.gitignore` の作成,Dockerfile や devcontainer.json 等の構築用ファイルの作成 +- **成果物**: + - `ENV_02_環境構築手順.md` — メンバーの参加時や環境の再構築時に使う手順 + - `ENV_03_管理者用環境構築手順.md` — プロジェクト作成時に一度だけ行う初期設定(リポジトリ作成,外部サービスの設定等) + - `ENV_04_開発コマンド.md`(任意)— アプリの起動・テスト・lint・ビルド等,日常の開発で使うコマンド一覧.人間とエージェント(tester・coder,`/auto-refactor`・`/auto-audit`)がコマンドを推測せずに済むようにするための唯一の参照先とする + - 立ち上げ時点で確定しているコマンドが無ければ**作成を後回しにしてよい**.実装中にコマンドが確定・変更された時点で作成・追記する(`/implement` の Phase 4 で自動的に見直される) + - コマンドが増えてきたら,タスクランナー(npm scripts・Makefile 等)への集約を優先し,本ファイルは薄い一覧に保つ(「手順書より自動化・コード化」の基本方針と同じ) + +## 仕様設計 (Specification) + +アプリケーションの設計を行う. + +- **人間が決めること**: ユーザー体験の方針,ビジネスロジックの最終判断 +- **AI に依頼できること**: アーキテクチャ設計のドラフト,データモデル定義,画面遷移図の整理 +- **成果物**: `SPEC_01_*.md`(プロジェクトの規模に応じて複数ファイルに分割) + +## 規約整備 (Coding Standards) + +技術スタックに応じたプロジェクト固有の規約を作成する. +汎用の規約(Git 運用・ドキュメント書式・ファイル命名・進捗記録)はテンプレートの `.claude/rules/` に含まれているため,ここでは技術スタック固有の規約を追加する. + +- **基本方針**: 言語・フレームワークの公式ガイドラインや広く採用されている標準規約に則る(例: Effective Dart,PEP 8,Google Style Guide 等).プロジェクト固有のルールは標準と異なる部分のみ定義する. +- **置き場所**: 「コードを書くときは常に X せよ」という指示型の規約は,docs ではなく **path-scoped rule**(`.claude/rules/*.md` の frontmatter に `paths:` を付けたもの)として作成する.該当ファイルの編集時に自動ロードされるため,規約の読ませ忘れが起きない.アーキテクチャの背景説明や設計判断の記録など「読み物・参照資料」は従来どおり docs(`04_SPEC`/`05_TECH`)に置く. +- **人間が決めること**: 標準規約でカバーされない判断(アーキテクチャパターンの選択等) +- **AI に依頼できること**: 標準規約を踏まえた規約のドラフト作成,参照元ガイドラインの調査 +- **作成すべき rule**(`paths` はプロジェクトの実際のディレクトリ構成に合わせて設定する): + - `.claude/rules/coding-style.md` — 命名規則,フォーマット,import 順序,型の使い方,コメントの書き方,コード内ドキュメントの規則(例: `paths: ["src/**", "lib/**"]`) + - `.claude/rules/project-structure.md` — プロジェクトのディレクトリ構成とファイル配置ルール(`paths` はソースディレクトリ全般) + - `.claude/rules/testing.md` — テストの種類,粒度,実行タイミング,カバレッジ基準,モック方針,テストファイルの配置規則(例: `paths: ["test/**", "**/*.test.*"]`) + - `.claude/rules/error-handling.md` — エラーの分類,処理方法,ログ出力の方針(`paths` はソースディレクトリ全般) + - ※ リファクタリング方針は言語に依存しないため,`.claude/agents/refactorer.md` の判断基準を共通ルールとして使用する + - ※ 機能実装完了フローは GUIDE_02 と `/implement` で定義済みのため,別途作成しない + - ※ 規約以外の運用フロー文書を `docs/01_GUIDE/` に追加する場合は,team 層の `GUIDE_03` との衝突を避けるため `GUIDE_04` 以降の番号を使う + +## 開発計画 (Development Plan) + +実装の順序とステップを決定する. + +- **人間が決めること**: 優先度,リリース計画,マイルストーン +- **AI に依頼できること**: 仕様を元にしたステップ分割の提案,依存関係の整理 +- **成果物**: `PLAN_02_開発ステップ.md` + +## 実装開始 (Implementation) + +開発計画に沿って AI と協働で実装を進める. + +- 各ステップの完了時に Git 規約(`.claude/rules/git-conventions.md`)に従ってコミット・PR を作成する(ドキュメント書式は `.claude/rules/markdown-style.md` が自動適用される). +- 仕様変更が発生した場合は,先にドキュメントを更新してから実装に反映する. + +## CLAUDE.md の管理 (CLAUDE.md Management) + +`CLAUDE.md` は AI が会話開始時に最初に読むファイルであり,プロジェクトの引継ぎ情報を一元管理する. +AI は毎回新しい会話で始まるため,このファイルが唯一の継続的な文脈となる. + +### 記載すべき内容 + +- **プロジェクト概要**: プロジェクト名,目的,技術スタックの要約 +- **開発進捗**: 現在のステップ(最新 1 行のみ).詳細な進捗履歴は `docs/PROGRESS.md` に追記する(進捗記録ルール `.claude/rules/progress-log.md` 参照) +- **必須ルール**: AI が実装時に必ず守るべきルール(コーディング規約,コミット前チェック等の要点) +- **ドキュメント一覧**: docs/ 内のファイルへの参照パス + +### 更新タイミング + +- ステップの完了時に開発進捗を更新する(CLAUDE.md は最新 1 行に上書き,`docs/PROGRESS.md` は末尾に追記) +- ドキュメントの追加・削除・リネーム時に参照パスを更新する +- 必須ルールに変更があった場合に反映する + +### 運用上の注意 + +- CLAUDE.md は AI が毎回読み込むため,簡潔に保つ.詳細は docs/ のドキュメントに委ね,CLAUDE.md には要点と参照先のみ記載する. +- 進捗記録は二段構成(CLAUDE.md = 最新 1 行 / `docs/PROGRESS.md` = 追記型フルログ)で管理する.詳細は `.claude/rules/progress-log.md` を参照. +- プロジェクト固有のルールが増えたら,docs/ に独立ファイルとして切り出し,CLAUDE.md からはリンクで参照する. diff --git "a/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" "b/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" new file mode 100644 index 0000000..91f9daf --- /dev/null +++ "b/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" @@ -0,0 +1,49 @@ +# エージェント運用ルール (Agent Operation Rules) + +実装品質を担保するために,3 つの専門エージェントを用いた開発パイプラインを定義する. +本ガイドは運用の**原則**を定める.各フェーズの具体的な実行手順(委譲プロンプト・分岐・確認メッセージ)は `/implement`(`.claude/skills/implement/SKILL.md`)が正本である. + +## 基本方針 (Basic Policy) + +- 「実装完了」とは,コーディング・テスト・リファクタリングの全フェーズが完了した状態を指す. +- 各フェーズは専門エージェントが担当し,フレッシュなコンテキストでレビューする.各エージェントは前フェーズのサマリーを入力として受け取り,加えて `git diff` で実際の変更差分を自ら確認する. +- フェーズのスキップは原則禁止する.リファクタリング不要の判断は Refactorer エージェント自身が行う. +- テストは実装コードではなく**仕様**(`docs/04_SPEC/`)を基準に書く.実装が仕様と異なればテストが失敗し,バグを検出する. +- 人間の本質的な役割は「AI にできない判断と確認」であり,各フェーズの品質のゲートキーパーとなる. + +## エージェント一覧 (Agent List) + +| エージェント | 役割 | フェーズ | +| --- | --- | --- | +| `coder` | 機能実装・バグ修正 | Phase 1 | +| `tester` | 仕様ベースのテスト作成・実行 | Phase 2 | +| `refactorer` | コード品質の改善 | Phase 3 | + +## パイプラインの流れと人間の役割 (Pipeline & Human's Role) + +`/implement <タスク内容>` で開始する(作業ブランチは git-conventions ルールに従い作成される). + +| フェーズ | 担当 | やること | 人間の関与 | +| --- | --- | --- | --- | +| Phase 1: コーディング | `coder` | 実装に集中する(テスト・リファクタ・コミットはしない) | 完了後にブラウザ・実機で動作確認(AI にできない確認).NG ならフィードバックして修正させる | +| Phase 2: テスト | `tester` | 仕様(`docs/04_SPEC/`)を基準にテストを作成・実行する | テスト失敗時のみ方針判断(仕様・実装・テストのどれの問題か).全成功なら自動で Phase 3 へ | +| Phase 3: リファクタリング | `refactorer` | テストを安全網に,挙動を変えずに品質を改善する | なし(不要判断は Refactorer 自身が行う) | +| Phase 4: ドキュメント更新 | メイン | `docs/`・進捗記録を必要に応じて更新し,結果を `.claude/commit-context.md` に書き出す | 更新がある場合のみ確認 | +| 完了 | — | `/implement` はコミットしない | `/commit` でコミットする | + +チェック観点や委譲プロンプト等の詳細は `.claude/skills/implement/SKILL.md` を参照.`.claude/commit-context.md` は `/commit` が参照し,ドキュメント更新漏れチェックをスキップするために使う(`.gitignore` 対象). + +## コミットルール (Commit Rules) + +パイプライン完了後は `/commit` でコミットする.コミットメッセージのタグ等は `.claude/rules/git-conventions.md` に従う. + +※ リファクタリングとテストは実装と一体の成果物として,まとめてコミットする.必要に応じて分割コミットも可. + +※ **例外(無人運転)**: 以下のループは CLAUDE.md の「`/commit` 自発実行禁止」ルールに対するユーザー承認済みの例外として,専用ブランチに自律コミットする.いずれも push・PR・マージ・`main` への操作は行わず,取り込み可否は人間が判断する. + +- `/auto-refactor`(リファクタ/ドキュメント整理ループ)→ `refactor/` 専用ブランチ +- `/auto-audit`(バグ/脆弱性の巡回監査ループ.発見を裏取り後,再現テストで正しさを担保できるものだけ自動修正し,それ以外は台帳へ報告)→ `fix/` 専用ブランチ + +## 進捗記録の運用ルール(CLAUDE.md / PROGRESS.md) + +進捗記録(CLAUDE.md「開発進捗」・`docs/PROGRESS.md` の書き方)のルールは `.claude/rules/progress-log.md` に定義されている.該当ファイルを編集する際に自動で読み込まれる. diff --git "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" new file mode 100644 index 0000000..7a9aff8 --- /dev/null +++ "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" @@ -0,0 +1,50 @@ +# 技術スタック (Tech Stack) + +## 開発環境 (Development Environment) + +- IDE: Visual Studio 2022 +- ターゲットフレームワーク: .NET Framework 4.8 + +## NuGet パッケージ (NuGet Packages) + +`packages.config` で管理する.Visual Studio のパッケージ復元で自動取得される. + +**OpenCvSharp4 関連** + +- `OpenCvSharp4` (4.10.0): OpenCV の C# ラッパー本体 +- `OpenCvSharp4.Extensions` (4.10.0): Bitmap 変換等の拡張機能 +- `OpenCvSharp4.runtime.win` (4.10.0): Windows 向けネイティブランタイム +- `OpenCvSharp4.Windows` (4.10.0): Windows Forms 向け統合パッケージ +- `OpenCvSharp4.WpfExtensions` (4.10.0): WPF 向け拡張機能 + +**.NET 補完ライブラリ** + +- `System.Buffers` (4.5.1) +- `System.Drawing.Common` (8.0.0) +- `System.Memory` (4.5.5) +- `System.Numerics.Vectors` (4.5.0) +- `System.Runtime.CompilerServices.Unsafe` (6.0.0) +- `System.ValueTuple` (4.5.0) + +## テストプロジェクト TIASshot.Tests (Test Project) + +テストプロジェクトも `packages.config` で管理する(本体と同じレガシー形式・x64). + +- `NUnit` (3.14.0): テストフレームワーク +- `NUnit3TestAdapter` (4.5.0): テストランナー連携(Visual Studio / vstest) +- `Microsoft.NET.Test.Sdk` (17.8.0): テスト実行基盤 +- ※ `OpenCvSharp4` / `OpenCvSharp4.runtime.win` (4.10.0) も参照する.`Mat` 演算はネイティブ DLL に依存するため,テストプロジェクトも **x64** でビルドする. + +## 外部 SDK(別途インストールが必要) (External SDKs) + +**IC Imaging Control SDK (The Imaging Source)** + +- 用途: ImagingSource 製カメラの制御(DFK33UX178,DFK23UX249) +- 名前空間: `TIS.Imaging` +- インストール: The Imaging Source の公式サイトから取得する + +**Lumenera SDK** + +- 用途: Lumenera 製カメラの制御(Lw110) +- DLL: `lumenera.api.dll`(リポジトリ内に同梱) +- 別途インストール不要(同梱 DLL を参照) diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" new file mode 100644 index 0000000..0976cbc --- /dev/null +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -0,0 +1,114 @@ +# 環境構築手順 (Environment Setup) + +## セットアップ方法の選択 (Setup Method) + +### 自動セットアップ(推奨) + +リポジトリルートの `setup.ps1` を使用することで,Visual Studio のインストール,データフォルダの作成,NuGet パッケージの復元を自動化できる. + +**実行手順** + +1. PowerShell を管理者権限で開く. +2. リポジトリのルートに移動する. + + ```powershell + cd [リポジトリのパス] + ``` + +3. スクリプトの実行ポリシーを一時的に変更する. + + ```powershell + Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass + ``` + +4. セットアップスクリプトを実行する. + + ```powershell + .\setup.ps1 + ``` + +5. スクリプト完了後,IC Imaging Control SDK を手動でインストールする. + - 詳細は「必要なソフトウェア — IC Imaging Control SDK」を参照する. + +**自動化される内容** + +- Visual Studio 2022 のインストール(未インストール時のみ) + - `.vsconfig` により「.NET デスクトップ開発」ワークロードが自動で設定される. +- `C:\TIAS_Data` フォルダの作成(未作成時のみ) +- NuGet パッケージの復元 + +**自動化されない内容(手動対応が必要)** + +- IC Imaging Control SDK のインストール +- 実行時設定ファイルの配置(config.xml,カメラ設定 XML,CSV) + +### 手動セットアップ + +スクリプトを使用しない場合は,以下の「必要なソフトウェア」〜「実行時の準備」の手順に従って手動で構築する. + +## 必要なソフトウェア (Required Software) + +### Visual Studio 2022 + +- 公式サイトからインストーラをダウンロードしてインストールする. +- ワークロード選択で「.NET デスクトップ開発」を有効にする. +- リポジトリルートの `.vsconfig` をインストーラで読み込むと,必要なワークロードが自動で提案される. + +### IC Imaging Control SDK + +- The Imaging Source が提供するカメラ制御ライブラリ. +- ImagingSource 製カメラ(DFK33UX178,DFK23UX249)の使用に必要. +- インストール後,参照 DLL が Visual Studio から認識されることを確認する. + +### Lumenera SDK + +- Lumenera 製カメラ(Lw110)の使用に必要. +- `lumenera.api.dll` はリポジトリ内に同梱されている. + +## リポジトリのセットアップ (Repository Setup) + +1. リポジトリのクローン + + ```bash + git clone [リポジトリURL] + cd TIASshot + ``` + +2. ソリューションを開く + - `TIASshot.sln` を Visual Studio 2022 で開く. + +3. NuGet パッケージの復元 + - Visual Studio のメニューから「ビルド」→「NuGet パッケージの復元」を実行する. + - または,パッケージマネージャーコンソールで以下を実行する. + + ```bash + nuget restore TIASshot.sln + ``` + +4. ビルド + - 「ビルド」→「ソリューションのビルド」を実行し,エラーがないことを確認する. + +## 実行時の準備 (Runtime Preparation) + +### 設定ファイルの配置 + +- `TIASshot/config.xml` が実行ファイルと同じディレクトリに存在することを確認する. +- パラメータの詳細は `SPEC_02_設定ファイル仕様.md` を参照する. + +### カメラ設定ファイルの確認 + +- ImagingSource カメラを使用する場合,以下のファイルが同ディレクトリに必要. + - `DFK33UX178.xml` + - `DFK23UX249.xml` + +### TCC参照ファイルの確認 + +- 以下の CSV ファイルが実行ファイルと同じディレクトリに必要. + - `tcc_srgb.csv`: sRGB 変換の参照値 + - `tcc_xyz.csv`: XYZ 変換の参照値 + +### データ保存フォルダの確認 + +- `config.xml` の `` に指定したフォルダへの書き込み権限があることを確認する. +- デフォルトは `C:\TIAS_Data`. +- `setup.ps1` を実行した場合,このフォルダは自動で作成される. diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" new file mode 100644 index 0000000..85f1594 --- /dev/null +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -0,0 +1,39 @@ +# 管理者用環境構築手順 (Administrator Setup) + +プロジェクト作成時に**一度だけ**行う初期設定をまとめる.各開発者が繰り返し行う構築手順は [ENV_02_環境構築手順](ENV_02_環境構築手順.md) を参照する. + +本プロジェクトは個人開発(solo)のデスクトップアプリのため,管理者作業は最小限である.チーム開発へ移行する場合の管理者初期設定は `.claude/rules/`/GUIDE_01 の team 運用に従って別途整備する. + +## リポジトリ (Repository) + +- ホスティング: GitHub の **Private** リポジトリ.具体的なオーナー・リポジトリ名・URL は管理者が別途把握する(本ドキュメントには記載しない). +- 既定ブランチ: `main`.`main` への直接 push は行わず,作業ブランチ → PR 経由でマージする(`.claude/rules/git-conventions.md`). +- 新しい開発マシンでは `git clone` 後に [ENV_02_環境構築手順](ENV_02_環境構築手順.md) に従う. + +## 外部 SDK・ライセンス (External SDKs & Licenses) + +カメラ制御 SDK はリポジトリに含めず,各開発マシンへ個別に導入する.入手元とライセンスの管理は管理者が把握しておく. + +| SDK | 用途 | 入手・配置 | +| --- | --- | --- | +| IC Imaging Control SDK | ImagingSource 製カメラ(DFK33UX178 / DFK23UX249) | [The Imaging Source](https://www.theimagingsource.com/en-us/support/download/) から各自インストール(`setup.ps1` が未導入時にダウンロードページを開く) | +| Lumenera SDK | Lumenera 製カメラ(Lw110) | `lumenera.api.dll` をリポジトリに同梱済み.追加インストールは不要 | + +## 実行時参照ファイルの配布 (Runtime Reference Files) + +アプリは実行ファイルと同じディレクトリに以下を必要とする.これらは環境・機材に依存するため**リポジトリでは管理せず**,管理者が正となるファイルを保持し,新しい開発者・現場へ配布する. + +- `config.xml` — 実行時設定(仕様は [SPEC_02_設定ファイル仕様](../04_SPEC/SPEC_02_設定ファイル仕様.md)) +- `DFK33UX178.xml` / `DFK23UX249.xml` — ImagingSource カメラ設定 +- `tcc_srgb.csv` / `tcc_xyz.csv` — TCC 色変換の参照値 + +## データ保存フォルダ (Data Folder) + +- 既定の保存先は `C:\TIAS_Data`(`config.xml` の `` で変更可能). +- `setup.ps1` 実行時に未作成なら自動生成される. +- 現場マシンでは,このフォルダへの書き込み権限を管理者が確認する. + +## CI・自動化 (CI & Automation) + +- 現時点で CI(GitHub Actions 等)は構築していない(`.github/` なし).ビルド・テストはローカルで行う([ENV_04_開発コマンド](ENV_04_開発コマンド.md)). +- 将来 CI を導入する場合は,x64・packages.config・ネイティブ DLL(OpenCvSharp)依存を満たすランナー構成が必要になる点に注意する. diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" new file mode 100644 index 0000000..97c72ad --- /dev/null +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -0,0 +1,69 @@ +# 開発コマンド (Development Commands) + +日常の開発で使うビルド・テスト・実行コマンドをまとめる.人間とエージェント(tester・coder,`/auto-refactor`・`/auto-audit`)が**コマンドを推測せずに済むための唯一の参照先**とする.コマンドが増減・変更されたら本ファイルを更新する. + +## 前提 (Prerequisites) + +- ビルドは **x64 のみ**(`TIASshot.sln` は `Debug|x64` / `Release|x64` のみ定義).OpenCvSharp 等がネイティブ DLL に依存するため `AnyCPU` は使わない. +- レガシー形式(packages.config)のため **`dotnet build` / `dotnet test` は使えない**.MSBuild と `vstest.console.exe` を使う. +- コマンドは PowerShell で実行する.VS のエディション差(Community / Professional / Enterprise)を吸収するため,`vswhere` で MSBuild・vstest の場所を解決する. + +## ツールパスの解決 (Locating Build Tools) + +```powershell +$vs = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath +$msbuild = Join-Path $vs "MSBuild\Current\Bin\MSBuild.exe" +$vstest = Join-Path $vs "Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" +``` + +以降のコマンドは `$msbuild` / `$vstest` を解決済みとして記載する. + +## NuGet 復元 (Restore) + +```powershell +nuget restore TIASshot.sln +``` + +`nuget.exe` が PATH に無い場合はリポジトリルートの `nuget.exe` を使う(`setup.ps1` が未取得時に自動ダウンロードする). + +## ビルド (Build) + +```powershell +# 開発・検証(WHITEBOARD / MEMMONITOR 有効) +& $msbuild TIASshot.sln /t:Build /p:Configuration=Debug /p:Platform=x64 + +# 配布版(診断機能なし) +& $msbuild TIASshot.sln /t:Build /p:Configuration=Release /p:Platform=x64 + +# クリーンビルド +& $msbuild TIASshot.sln /t:Rebuild /p:Configuration=Debug /p:Platform=x64 +``` + +構成ごとのビルドフラグの意味は [ENV_06_ビルド構成とビルドフラグ](ENV_06_ビルド構成とビルドフラグ.md) を参照する. + +## テスト (Test) + +自動テストの方針・対象範囲は `.claude/rules/testing.md` を参照する(本ファイルはコマンドのみ). + +```powershell +# テストプロジェクトをビルドしてから x64 で実行する +& $msbuild TIASshot.sln /t:Build /p:Configuration=Debug /p:Platform=x64 +& $vstest "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" /Platform:x64 +``` + +- ネイティブ DLL を x64 でロードするため `/Platform:x64` は必須. +- Visual Studio 上ではテストエクスプローラーから実行できる(プラットフォームを x64 にすること). + +## 実行 (Run) + +ビルド後,構成に対応した実行ファイルを起動する.実行時参照ファイル(`config.xml`・カメラ設定 XML・TCC の CSV)が同ディレクトリに配置済みであること([ENV_02_環境構築手順](ENV_02_環境構築手順.md)). + +```powershell +# 開発・検証版 +& "TIASshot\bin\x64\Debug\TIASshot.exe" + +# 配布版 +& "TIASshot\bin\x64\Release\TIASshot.exe" +``` + +実機カメラ・光源に接続して動作する UI アプリのため,完全な動作確認には機材が必要. diff --git "a/docs/02_ENV/ENV_05_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" "b/docs/02_ENV/ENV_05_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" new file mode 100644 index 0000000..8bdcde3 --- /dev/null +++ "b/docs/02_ENV/ENV_05_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" @@ -0,0 +1,112 @@ +# ディレクトリ構成 (Directory Structure) + +## 全体構成 (Overview) + +```text +TIASshot/ +├── CLAUDE.md ← AI向けガイドライン(ドキュメント・コーディング規則の参照) +├── README.md ← プロジェクト概要 +├── TIASshot.sln ← Visual Studio ソリューションファイル +├── TIASshot/ ← メインプロジェクト +├── TIASshot.Tests/ ← テストプロジェクト(NUnit / x64) +└── docs/ ← ドキュメント +``` + +## メインプロジェクト TIASshot/ (Main Project) + +### ソースコード + +責務ごとにサブフォルダへ分離している(リファクタリング Phase 1〜5 による). + +```text +├── Program.cs ← エントリポイント +├── Config.cs ← config.xml の読み込みユーティリティ +├── LightSource.cs ← 光源(シリアル通信)制御 +├── Cameras/ ← カメラ制御 +│ ├── CameraBase.cs ← カメラ制御の基底クラス(共通処理・撮影/校正の骨格) +│ ├── IScam.cs ← ImagingSource カメラの実装 +│ ├── Lucam.cs ← Lumenera カメラの実装 +│ └── GainCalc.cs ← ゲイン更新比率の計算(純粋ロジック) +├── ChartDetection/ ← チャート検出 +│ └── ChartDetector.cs ← ArUco マーカー検出・マスク生成 +├── ColorCorrection/ ← 色補正 +│ └── ColorCorrector.cs ← TCC 変換行列の計算・色変換 +├── UI/ ← フォーム(WinForms) +│ ├── Form1.cs ← メインフォーム(UI・操作イベント) +│ ├── Form1.Designer.cs ← メインフォームのデザイナー自動生成コード +│ ├── Form1.WhiteBoard.cs ← 白板撮影ボタン(WHITEBOARD ビルド限定の partial) +│ ├── Form1.MemMonitor.cs ← メモリ観測ウィンドウ起動・F9 トグル(MEMMONITOR 限定の partial) +│ ├── PreviewMonitor.cs ← プレビューモニタフォーム +│ ├── PreviewMonitor.Designer.cs ← プレビューモニタのデザイナー自動生成コード +│ ├── MemoryMonitorForm.cs ← メモリ観測ウィンドウ(MEMMONITOR 限定) +│ ├── MemoryMonitorForm.Designer.cs ← 同デザイナーコード(MEMMONITOR 限定) +│ ├── PreviewProfiler.cs ← プレビュー計測カウンタ(MEMMONITOR 限定) +│ └── TimedPictureBox.cs ← 副モニタ実描画時間の計測(MEMMONITOR 限定) +└── Utils/ ← ユーティリティ + ├── IoUtil.cs ← ファイル I/O(CSV・保存フォルダ・撮影情報)・サウンド + ├── BitmapUtil.cs ← Bitmap 生画素コピー(FastClone・純粋ロジック) + └── ImageStats.cs ← 飽和統計算出・JSON 生成(白板撮影用・純粋ロジック) +``` + +### 設定・データファイル + +```text +├── config.xml ← アプリケーション設定(パラメータ定義) +├── DFK33UX178.xml ← ImagingSource DFK33UX178 カメラ設定 +├── DFK23UX249.xml ← ImagingSource DFK23UX249 カメラ設定 +├── tcc_srgb.csv ← TCC sRGB 変換参照値(24色票×3ch) +└── tcc_xyz.csv ← TCC XYZ 変換参照値(24色票×3ch) +``` + +### 外部ライブラリ・リソース + +```text +├── lumenera.api.dll ← Lumenera SDK(同梱) +├── lumenera.api.xml ← Lumenera SDK ドキュメント +├── CalibDone.wav ← キャリブレーション完了音 +├── OneShot.wav ← 1枚撮影完了音 +├── MultiShot.wav ← 連続撮影完了音 +└── main.ico ← アプリケーションアイコン +``` + +### プロジェクト設定 + +```text +├── TIASshot.csproj ← プロジェクトファイル +├── App.config ← .NET アプリケーション設定 +├── packages.config ← NuGet パッケージ一覧 +└── Properties/ + ├── AssemblyInfo.cs ← アセンブリ情報 + ├── Resources.Designer.cs ← リソース自動生成コード + └── Settings.Designer.cs ← アプリ設定自動生成コード +``` + +## テストプロジェクト TIASshot.Tests/ (Test Project) + +```text +TIASshot.Tests/ +├── TIASshot.Tests.csproj ← テストプロジェクトファイル(net48 / x64) +├── packages.config ← NuGet パッケージ一覧(NUnit 等) +├── IoUtilTests.cs ← CSV 読み書き往復のテスト +├── ConfigTests.cs ← config.xml パースのテスト +├── ColorCorrectorTests.cs ← 次元拡張・変換行列・色変換のテスト +├── GainCalcTests.cs ← ゲイン更新比率計算のテスト +├── ImageStatsTests.cs ← 飽和統計・JSON 生成のテスト(白板撮影用) +├── BitmapUtilTests.cs ← FastClone の仕様ベーステスト +├── ConvertImageMemoryBenchmark.cs ← ConvertImage 単体のメモリ計測ベンチ([Explicit]) +├── ContinuousShootMemoryBenchmark.cs ← 連続撮影フロー再現のメモリ計測ベンチ([Explicit]) +├── MemBenchSupport.cs ← メモリベンチ共通ユーティリティ +└── MemBenchSupportTests.cs ← 同ユーティリティのテスト +``` + +## ドキュメント docs/ (Documents) + +```text +docs/ +├── 01_GUIDE/ ← チームルール・規約(命名,Git,コーディング,コメント) +├── 02_ENV/ ← 開発環境・構成に関するドキュメント(本ディレクトリ) +├── 03_PLAN/ ← 進行計画・要件定義(プレビューメモリリーク修正計画,性能評価計測計画) +├── 04_SPEC/ ← ユーザーから見える仕様(機能仕様,設定ファイル仕様) +├── 05_TECH/ ← クラス設計・アルゴリズム等の技術設計(カメラ制御,色補正処理) +└── 06_TEST/ ← テスト計画・品質保証(テスト仕様) +``` diff --git "a/docs/02_ENV/ENV_06_\343\203\223\343\203\253\343\203\211\346\247\213\346\210\220\343\201\250\343\203\223\343\203\253\343\203\211\343\203\225\343\203\251\343\202\260.md" "b/docs/02_ENV/ENV_06_\343\203\223\343\203\253\343\203\211\346\247\213\346\210\220\343\201\250\343\203\223\343\203\253\343\203\211\343\203\225\343\203\251\343\202\260.md" new file mode 100644 index 0000000..f22905f --- /dev/null +++ "b/docs/02_ENV/ENV_06_\343\203\223\343\203\253\343\203\211\346\247\213\346\210\220\343\201\250\343\203\223\343\203\253\343\203\211\343\203\225\343\203\251\343\202\260.md" @@ -0,0 +1,53 @@ +# ビルド構成とビルドフラグ (Build Configurations and Flags) + +本プロジェクトは,診断・評価用の機能(メモリ観測・白板撮影)を**条件コンパイルシンボル(ビルドフラグ)**で出し分けている.配布版(Release)にはこれらをコードごと含めない方針である.本ドキュメントは,どのフラグが何を有効化し,どの構成で定義されるかをまとめる. + +## 設計方針 (Policy) + +- **Release(配布版)=素の製品**.診断・評価・デモ用の機能はコードごと除外する. +- **Debug=開発・検証版**.診断/評価機能(`MEMMONITOR`・`WHITEBOARD`)を自動で含める. + +## ソリューション構成 (Solution Configurations) + +`TIASshot.sln` が定義する構成は次の 2 つ(プラットフォームは **x64** のみ).OpenCvSharp 等がネイティブ DLL に依存するため x64 でビルドする. + +| 構成 | 用途 | 定義されるシンボル | 出力先 | +| --- | --- | --- | --- | +| `Debug\|x64` | 開発・検証 | `DEBUG` `TRACE` `WHITEBOARD` `MEMMONITOR` | `TIASshot/bin/x64/Debug/` | +| `Release\|x64` | 配布 | `TRACE` | `TIASshot/bin/x64/Release/` | + +> ※ `TIASshot.csproj` には `Debug\|AnyCPU` / `Release\|AnyCPU` の PropertyGroup も残っているが,`.sln` は `x64` のみをビルド対象としており,通常はこれらを使わない. +> ※ `TIASshot/bin/Debug-NoWB/` というフォルダが残っている場合があるが,これは `WHITEBOARD` フラグ導入前の古い手動ビルドの残骸であり,現在のソリューションには対応する構成は存在しない. + +## ビルドフラグ一覧 (Build Flags) + +| シンボル | 目的 | 定義される構成 | Release(配布)含有 | 出し分け対象(主なもの) | +| --- | --- | --- | --- | --- | +| `MEMMONITOR` | メモリ観測ウィンドウ+プレビュー計測 | `Debug\|x64`(自動) | ✗ | `UI/MemoryMonitorForm`,`UI/PreviewProfiler`,`UI/TimedPictureBox`,`UI/Form1.MemMonitor`(F9 トグル),`Form1.ShowImage` 等のプレビュー計測 | +| `WHITEBOARD` | 白板撮影モード(照明均一性評価用) | `Debug\|x64`(自動) | ✗ | 白板撮影ボタン(`Form1` の専用 partial),`Cameras/IScam.ShotWhiteBoard` 等 | +| `DEBUG` | .NET 標準デバッグシンボル | `Debug\|x64` | ✗ | 標準(一部の開発時分岐) | +| `TRACE` | .NET 標準トレースシンボル | 全構成 | ○ | `System.Diagnostics.Trace` | + +### MEMMONITOR — メモリ観測・プレビュー計測 + +- 起動時にメモリ観測ウィンドウ(`MemoryMonitorForm`)を自動で開き,PrivateMemory / WorkingSet をライブ折れ線グラフ+CSV で記録する. +- プレビュー経路の計測(各段の実効 FPS・コピー時間・描画時間・GDI/USER/ハンドル数・画像サイズ・校正/撮影/F9 のイベント)を CSV(`bin/x64/Debug/MemMonitor_Results/`)に出力する. +- 副モニタ表示を実行中に切り替える計測用ホットキー **F9** も本フラグ限定で有効. +- 配布版には不要なため Release では未定義. + +### WHITEBOARD — 白板撮影モード + +- SmTIAS との装置間比較(照明均一性評価)用に,校正・色補正を行わず素の RGB を保存する独立撮影パスを追加する. +- ImagingSource(IScam)でのみ実装.未対応カメラでは通知して何もしない. +- 配布版の舌診撮影フローには不要なため Release では未定義. + +## ビルド方法 (How to Build) + +標準構成(Debug / Release)のビルド・テスト・実行コマンドは [ENV_04_開発コマンド](ENV_04_開発コマンド.md) を参照する.`Debug|x64` では `WHITEBOARD` と `MEMMONITOR` が自動で有効になり(メモリ観測ウィンドウが開き,白板撮影ボタンが表示される),`Release|x64` ではいずれの診断フラグも含まれない. + +## 関連 (Related) + +- 各フラグ導入の経緯・設計判断は [docs/PROGRESS.md](../PROGRESS.md) の該当エントリを参照: + - `WHITEBOARD`(白板撮影の専用ビルド記号化) + - `MEMMONITOR`(メモリ修正の効果検証ツール) +- メモリ計測の結果は [docs/06_TEST/TEST_03_メモリ修正効果計測.md](../06_TEST/TEST_03_メモリ修正効果計測.md). diff --git "a/docs/03_PLAN/PLAN_03_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\343\203\241\343\203\242\343\203\252\343\203\252\343\203\274\343\202\257\344\277\256\346\255\243\350\250\210\347\224\273.md" "b/docs/03_PLAN/PLAN_03_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\343\203\241\343\203\242\343\203\252\343\203\252\343\203\274\343\202\257\344\277\256\346\255\243\350\250\210\347\224\273.md" new file mode 100644 index 0000000..e393b03 --- /dev/null +++ "b/docs/03_PLAN/PLAN_03_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\343\203\241\343\203\242\343\203\252\343\203\252\343\203\274\343\202\257\344\277\256\346\255\243\350\250\210\347\224\273.md" @@ -0,0 +1,84 @@ +# プレビューメモリリーク修正計画 (Preview Memory Leak Fix Plan) + +## 前提 (Prerequisites) + +- 本計画は,連続撮影クラッシュ(撮影経路の修正)とは**独立した別系統のバグ**を扱う.撮影経路の不具合が「撮影時」に起きるのに対し,本計画は「プレビュー表示中(撮影していなくても)長時間起動で落ちる」不具合を対象とする. +- 修正は1件ずつ独立して行い,都度ビルド・動作確認する. +- コミットメッセージは `[fix]` タグを使用する. +- 該当箇所はリファクタ後の現構造(`Cameras/`・`UI/`)で記載する.プレビュー供給は `Cameras/IScam.cs`・`Cameras/Lucam.cs`,表示は `UI/Form1.cs`・`UI/PreviewMonitor.cs` に分かれている. + +## 症状 (Symptom) + +- ver1.6 で,アプリを**長時間起動していると落ちる**ことがあった. +- 連続撮影の有無に関わらず発生する(撮影せずプレビュー表示のまま放置していても起こりうる). +- ver1.6(タグ `v1.6`)と現行コードの該当経路を比較した結果,**プレビュー表示経路は v1.6 からほぼ同一で未修正**であり,現行でも同じクラッシュが起こりうる. + +## 原因 (Cause) + +プレビューはカメラのフレームレート(30〜60 fps 相当)で連続的にフレームを供給し続ける.`IScam` では `Cameras/IScam.cs` の `Retrieve`(`FrameQueueSink` コールバック)が毎フレーム `_form.ShowImage(imgt.ToBitmap())` を呼ぶ.この経路で `Bitmap` が確実に解放されず,時間とともに蓄積する. + +`Bitmap` は内部に GDI ハンドル(HBITMAP)とネイティブ画素バッファ(IScam の 1840×2440×3 で約 13 MB/枚)を持つ.一方マネージドのラッパは小さいため GC がメモリ圧を感じにくく,回収が遅れる.結果として **GDI ハンドルの枯渇(既定上限はプロセスあたり 1 万)** か **ワーキングセット肥大による OutOfMemory/GDI+ のエラー**で,時間とともにクラッシュする.確率的に「たまに/いずれ」落ちる症状と整合する. + +### 原因1: `ShowImage` のフルコピー Bitmap が毎フレームリークする(決定的・最優先) + +- `UI/Form1.cs` の `ShowImage(Bitmap bmp)` は冒頭で `var bmp2 = new Bitmap(bmp);` と**フルコピー Bitmap を毎フレーム生成**する. +- `bmp2` は `_previewMonitor.IsShown` が true のとき(副プレビューモニタ表示時)だけ `PreviewMonitor.UpdateImage` に渡される.**通常運用(副モニタ非表示)では `bmp2` はどこにも使われず,かつ Dispose されない**ため,1 フレームごとに 1 枚まるごとリークする. +- 撮影せずプレビュー表示しているだけでも蓄積する=「長時間アイドルで落ちる」の主因. + +**該当箇所** + +- `UI/Form1.cs` の `ShowImage`(`bmp2 = new Bitmap(bmp)` と,`IsShown` 分岐). + +### 原因2: 表示バッファの取りこぼしフレームが Dispose されない + +- `ShowImage` は `_dispBuf = bmp;` で表示バッファ参照を差し替え,`Invalidate()` で再描画を要求する.実際の Dispose は `Form1_Paint` の `picDisplay.Image?.Dispose();` で行われる. +- `Invalidate()` による `WM_PAINT` は合体(コアレス)されるため,`Form1_Paint` が走る前に次フレームが届くと `_dispBuf` が複数回上書きされる.`IScam` 経路は二重バッファを持たないため,**Paint に到達しなかった `ToBitmap()` 結果は Dispose を通らずに捨てられ,リークする**. + +**該当箇所** + +- `UI/Form1.cs` の `ShowImage`(`_dispBuf` 差し替え)/`Form1_Paint`(`picDisplay.Image?.Dispose()`). +- `Cameras/IScam.cs` の `Retrieve`(毎フレーム `ToBitmap()` を `ShowImage` へ渡す.二重バッファなし). +- ※ `Cameras/Lucam.cs` の `PreviewCallback` は `_bmps[2]` の二重バッファで `ToBitmap()` 結果を 2 枚に抑えて Dispose しており,この点は安全.ただし原因1(`ShowImage` 内の `bmp2`)は Lucam 経路でも同様にリークする. + +### 原因3: `PreviewMonitor.UpdateImage` の上書き前バッファが Dispose されない + +- `UI/PreviewMonitor.cs` の `UpdateImage` も単一バッファを上書きする構造で,差し替え前の旧バッファを Dispose していない(副プレビューモニタ表示時のみ顕在化). + +**該当箇所** + +- `UI/PreviewMonitor.cs` の `UpdateImage`(表示バッファ上書き). + +## 修正方針 (Fix Policy) + +### 優先度1: `ShowImage` のフルコピー Bitmap を必要時のみ生成する + +- `bmp2 = new Bitmap(bmp)` を**無条件生成から,`_previewMonitor != null && _previewMonitor.IsShown` が true のときだけ生成**に変更する.未表示時のフルコピーリークを止める(効果が最も大きく,変更も小さい). + +### 優先度2: プレビュー表示バッファを確実に Dispose する + +- 取りこぼしフレームを含め,プレビュー用 `Bitmap` を確実に解放する.方針候補: + - `Lucam` と同様の**二重バッファ+確実な Dispose** に表示経路を統一する,または + - `_dispBuf` を差し替える前に,まだ `picDisplay.Image` に反映されていない旧 `_dispBuf` を Dispose する(Paint を通らなかったフレームも必ず破棄する). +- `picDisplay.Image` への代入は「直前の Image を Dispose してから差し替え」を保証する. + +### 優先度3: `PreviewMonitor.UpdateImage` の上書き前 Dispose + +- `UpdateImage` で表示バッファを上書きする前に,旧バッファを Dispose する. + +## 検証 (Verification) + +- `MEMMONITOR` ビルド(`UI/MemoryMonitorForm`)で,**撮影せずプレビュー表示のまま放置**し,メモリ(PrivateMemory/WorkingSet)が時間とともに増え続けないことを確認する.修正前後で対比する. +- 既存のメモリ計測ベンチ([TEST_03](../06_TEST/TEST_03_メモリ修正効果計測.md))は**撮影フロー対象**であり,本件(プレビュー放置)はカバーしていない.プレビュー放置シナリオの観測は別途行う. +- GDI ハンドルのリークが疑われるため,観測ウィンドウに **GDI オブジェクト数**(`GetGuiResources` 等)の表示を追加して,メモリだけでなくハンドル数も時間で増えないことを確認することを推奨する(任意). + +## 修正順序まとめ (Summary) + +| 順位 | 原因 | 該当ファイル | クラッシュとの関連 | +| --- | --- | --- | --- | +| 1 | `ShowImage` のフルコピー Bitmap が毎フレームリーク | `UI/Form1.cs` | 直接原因(アイドル時の主因・決定的リーク) | +| 2 | 表示バッファの取りこぼしフレーム未 Dispose | `UI/Form1.cs` / `Cameras/IScam.cs` | 直接原因(二重バッファなしで取りこぼし) | +| 3 | `PreviewMonitor.UpdateImage` の上書き前未 Dispose | `UI/PreviewMonitor.cs` | 副モニタ表示時のリーク | + +## 関連 (Related) + +- [TEST_03 メモリ修正効果計測](../06_TEST/TEST_03_メモリ修正効果計測.md) — 撮影経路のメモリ計測結果. diff --git "a/docs/03_PLAN/PLAN_04_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\350\250\210\347\224\273.md" "b/docs/03_PLAN/PLAN_04_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\350\250\210\347\224\273.md" new file mode 100644 index 0000000..10150c0 --- /dev/null +++ "b/docs/03_PLAN/PLAN_04_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\350\250\210\347\224\273.md" @@ -0,0 +1,142 @@ +# 性能評価計測計画 (Performance Evaluation Measurement Plan) + +## 目的 (Purpose) + +3 バージョン(v1.6 / v1.7 / 現行)で性能(主にメモリ挙動,副次的にプレビュー性能)の実験・計測を行い,改善効果を定量・可視化する.結果は研究室共有用に**画面録画+スライド**で提示することを想定する. + +## 対象バージョン (Target Versions) + +計測対象は「メモリ改善の 3 段階」を表す.上流(nakaguchi)が素の状態,本 GitHub フォークが改善を積んだ現行. + +| 版 | commit | 中身 | 主に効くメモリ経路 | +| --- | --- | --- | --- | +| **v1.6** | `4b107e4`(nakaguchi タグ `v1.6`) | ベースライン | 保存経路・プレビュー経路とも未修正(リークあり) | +| **v1.7** | `5315d2d`(nakaguchi タグ `v1.7`「メモリ使用効率化」) | `SaveThread` が `_shots` から pop して都度 Dispose+変換行列の中間 Mat 解放 | **保存経路**を改善(プレビューは未修正) | +| **現行** | `HEAD`(GitHub `rintoHasegawa/TIASshot` main) | `ConvertImage` の Mat 解放(メモリ)+PLAN_03(プレビュー)+FastClone | **プレビュー経路**を修正+コピー高速化 | + +→ 計測のストーリー: **保存経路は v1.6 → v1.7 で,プレビュー経路は v1.7 → 現行で**効いた,という切り分けを示す. + +## 計測手段と役割分担 (Method & Roles) + +- **手段**: 実機 MEMMONITOR(メモリ観測ウィンドウ+プレビュー計測)を使ったライブ計測.自動 NUnit ベンチ(TEST_03)ではなく,**実カメラで普通にアプリを使ったときの挙動**を対象とする. +- **カメラ**: IScam(ImagingSource DFK 23UX249.白板撮影で使用したもの). +- **役割分担**: + - **Claude**: 3 本の計装済みビルド(後述の使い捨てブランチ)と実行チェックリストを用意し,出力 CSV を集計して結果ドキュメント(TEST_02)にまとめる. + - **人間**: 実カメラでの撮影・放置・画面録画を実施する(外部サービス操作・実機動作確認と同じく手動作業). + +### IScam 前提の効き方の違い (Note: IScam) + +PLAN_03 で最も派手だった「Lucam のクロススレッド GDI クラッシュ(`_bmps[]` をコールバックスレッドで Dispose)」は **Lucam 固有**で IScam では再現しない.IScam で効くのは次の 5 点であり,計測はここに焦点を当てる. + +- `ShowImage` のフルコピー Bitmap リーク(原因1) +- 表示バッファ取りこぼし Dispose(原因2) +- `PreviewMonitor.UpdateImage` 上書き前 Dispose(原因3) +- 副モニタ描画飢餓 +- FastClone によるコピー高速化 + +## 移植方針 (Porting Strategy) + +現行の計測スカフォールドを v1.6 / v1.7 に移植して 3 版横並びで計測する.ただし次の制約がある. + +- v1.7 は**フラット構成**(`TIASshot/*.cs` 直置き),現行は `UI/`・`Cameras/` 等に**再編済み**のため,cherry-pick は不可.**各タグへ手作業で移植**する. +- 作業は各タグから切った**使い捨てブランチ**(`bench/v1.6`・`bench/v1.7`)上で行い,**`main` には一切マージしない**. +- 移植は結合度で 2 層に分ける(Tier A / Tier B). +- 移植の原則: 旧版へは**観測フック(カウンタ/Stopwatch)のみ**を足し,**計測対象のロジック(撮影・保存・プレビューのコピー方式・Invalidate タイミング)は一切変えない**.変えると測りたい timing 自体が動く.旧版自体が「修正前」であるため,リーク再現用の仕掛けは不要(旧版をそのまま計測すればよい). + +### Tier A: メモリ観測(低結合・3 版すべてに移植・確定) + +`MemoryMonitorForm`(+`.Designer.cs`)は自前の 500ms タイマーで自プロセスを覗くだけで,計測対象コードに触れない.移植は「2 ファイルを置いて起動時に 1 行で開く」だけで,メモリ挙動を歪めない. + +**計測指標(確定)**: + +- **主指標: `private_MB`(`Process.PrivateMemorySize64`)** — コミット量.`Mat` はネイティブメモリのため `GC.GetTotalMemory` では捕捉できず,プロセス視点のコミット量を主指標とする. +- 副指標(CSV のみ記録): `ws_MB`(`WorkingSet64`),`gdi_objects` / `user_objects` / `handle_count`(GDI ハンドル枯渇仮説の否定材料). + +**表示・記録の方針(確定)**: + +- **画面グラフは 1 つに,左右 2 軸で描く**(案A).メモリと FPS は単位・スケールが異なるため軸を分ける(.NET Chart の `Series.YAxisType = Secondary`). + - **左 Y 軸(メモリ・GB)**: 主指標 `private_MB` の **1 本のみ**描画する(録画・スライドで「右肩上がり vs 水平」を一目で伝えるため).現状 2 系列(Private / WorkingSet)を描いているので,WorkingSet 系列は**描かない(または非表示)**にする. + - **右 Y 軸(副軸・FPS)**: **本モニタ実描画 FPS(M3 `main_paint_fps`)と副モニタ実描画 FPS(M4 `sub_paint_fps`)の 2 本**を折れ線で乗せる.副モニタ飢餓(校正後 ≈2fps → 回復)を録画で線として見せるため(テキスト数値より伝わる).F9 で副モニタ給餌を ON/OFF して同一録画内で対比する. + - `callback_fps` 等その他の指標はグラフには乗せず,テキスト(`lblPreview`)と CSV に留める. +- **CSV は全列そのまま残す**(`ws_MB`・ハンドル数はコストゼロの裏取り材料).「グラフで見せるのはメモリ 1 本+FPS 2 本,録るのは全部」とする. +- **Y 軸スケールは 3 版で揃える**(現状はオートスケール.バラバラだと「v1.6 も水平」に錯覚するため,録画時に左軸メモリ上限・右軸 FPS 上限を手動で揃えるか,後段でスクショを同スケールで並べる). +- この FPS オーバーレイは `MemoryMonitorForm` のグラフ描画拡張であり,旧版(`bench/v1.6`・`bench/v1.7`)へ移植する窓にも同じ拡張を含める. + +### Tier B: プレビュー性能プロファイラ(高結合・一式移植で確定) + +`PreviewProfiler`+`TimedPictureBox`+`ShowImage`/`PreviewMonitor` へのフック.旧版はプレビュー経路が別物(`new Bitmap(bmp)` フルコピー・毎フレーム `Invalidate`・タイマー無し)のため,フック位置を各版の `ShowImage` に置き直す必要があり侵襲的. + +M1〜M5 は同じスカフォールドに相乗りするため(フックを一度置けば同時取得),指標を個別に間引かず**一式を移植して CSV 全列を記録**する.副モニタ(セカンダリディスプレイ)は実機で**使える**ため,`TimedPictureBox` を要する M4/M5(副モニタ実描画)も計測対象とする. + +**計測指標(確定)**: + +| # | 指標 | 何がわかるか | 差が出る版 | +| --- | --- | --- | --- | +| M1 | `copy_ms`(1 フレームの Bitmap コピー時間) | FastClone の効果を直接分離(~25ms→~2.5ms) | v1.7 vs 現行 | +| M2 | `callback_fps`(`ShowImage` 呼び出しレート) | コピー負荷がコールバックスレッドを律速しているか | v1.7 vs 現行 | +| M3 | 実効プレビュー FPS(本モニタの実描画レート) | ユーザーに見える滑らかさ(~10→~20fps).旧版は毎フレーム Invalidate,現行はタイマー駆動のため「結果としての FPS」比較 | v1.7 vs 現行 | +| M4 | 副モニタ描画飢餓(`sub_paint_fps`) | 校正完了後の副モニタ飢餓(≈2fps)と回復(~10fps) | v1.7 vs 現行 | +| M5 | `sub_paint_ms`(副モニタ実描画コスト自体) | 「飢餓 or 描画コスト増」の切り分け | 参考 | +| M6 | GDI/USER/handle 数の推移 | ハンドル枯渇仮説の検証(Tier A の窓が既に保持・移植不要) | v1.7 vs 現行 | + +**画面録画・スライドの方針(確定)**: 記録は全指標だが,**録画で強調するのは 2 つの物語**に絞る. + +- **① FastClone でコピーが桁で速くなる**: 主役は M1 `copy_ms`(~25ms→~2.5ms),律速の証拠に M2 `callback_fps`. +- **② 副モニタ飢餓の解消**: 主役は M4 副モニタ FPS(v1.7=校正後に崩壊/現行=steady),実効 FPS に M3,切り分けに M5.**F9 トグル**(`ToggleSubMonitorProfiling`)で副モニタ給餌の ON/OFF を切り替えながら同一録画内で対比を撮る. + +## 計測シナリオ (Scenarios) + +同一手順・同一パラメータ(解像度・チャンネル数・枚数・時間)で 3 版を回す. + +S1〜S3 は独立に回すのではなく,**現行で実測した 1 本の記録(基準プロトコル)を全版で再現**して同時取得する(副モニタ ON).基準記録は [docs/06_TEST/data/perf_current.csv](../06_TEST/data/perf_current.csv). + +| ID | 観測対象 | この記録での該当区間 | 主な観測 | 差が出る版 | +| --- | --- | --- | --- | --- | +| **S1** | 保存経路リーク | 撮影イベント前後 | `private_MB` のピーク包絡線 | v1.6 vs v1.7 vs 現行 | +| **S2** | プレビュー経路リーク | 撮影間・放置区間 | `private_MB`+`gdi_objects`/`handle_count` の推移 | v1.7 vs 現行 | +| **S3** | プレビュー性能 | 全区間(定常プレビュー) | `copy_ms` / `callback_fps` / 実効 FPS / 副モニタ FPS(M1〜M5) | v1.7 vs 現行 | + +**基準プロトコル(確定・現行 `perf_current.csv` の秒数に全版を合わせる)**: 撮影は**単発撮影(1 枚撮影)の繰り返し**とする. + +- 0〜32 秒: プレビュー放置(副モニタ ON) +- 32.5〜36.1 秒: 校正 1 回(処理時間 約 3.5 秒.アプリ側処理で固定) +- 62 / 92 / 123 秒: 単発撮影(約 30 秒間隔で 3 回) +- 123〜303 秒: プレビュー放置(約 180 秒.S2 のリーク観測区間) +- 303 秒: 単発撮影 1 回 +- 約 348 秒: 停止・CSV 保存 + +旧版(v1.6 / v1.7)もこの**秒数・順序・撮影間隔に合わせて**再現し,同じ時間軸で 3 版を重ねて比較する. + +### 同条件の統制 (Comparability Controls) + +- 同一マシン・**x64 Debug** ビルド・同一カメラ(IScam)・同一解像度・同一チャンネル数. +- 固定ウォームアップ・固定時間(S1 のサイクル数 M,S2 の放置時間 T を全版共通で固定). +- **GC を強制しない**(本番のリーク機序を保つ). +- 観測窓自体もわずかにメモリ・GDI を消費するが,3 版とも同じ overhead のため比較では相殺される. +- CSV はバージョン別に命名して後で重ね描きする. + +## 結果の読み方 (Reading the Results) + +グラフは滑らかに上がらず**のこぎり波/階段状**になる(OpenCvSharp が GC にメモリ圧を通知し,リーク版でも GC+ファイナライザが周期的にネイティブメモリを一掃するため).**見るべきは振れ幅ではなくピーク包絡線のトレンド**(リーク=右肩上がり/修正済み=天井一定). + +## 注意点・リスク (Cautions & Risks) + +- **実機 OOM 上限**: 自動ベンチ(TEST_03)には打ち切り上限ガードがあったが,実機観測窓(`MemoryMonitorForm`)にはガードが無い(記録するのみ).S1 でリーク版(v1.6)を長く回すと OOM に達し得るため,**サイクル数 M・放置時間 T に上限を決めておく**(値は計測実施時に確定). +- **移植の非マージ**: `bench/v1.6`・`bench/v1.7` は計測専用の使い捨てブランチであり,`main` にマージ・push・PR しない. +- 旧版が現行と同じツールチェーン(x64 / .NET Framework 4.8 / OpenCvSharp パッケージ)でビルドできるかは移植着手時に確認する. + +## 未確定事項 (Open Items) + +- 計測プロトコル・指標は確定. +- 3 版(v1.6 / v1.7 / 現行)の計測・移植・再現計測は**完了**.結果は [TEST_02_性能評価計測結果](../06_TEST/TEST_02_性能評価計測結果.md). + +## 成果物 (Deliverables) + +- 本計画: `docs/03_PLAN/PLAN_04_性能評価計測計画.md`. +- 計測結果: `docs/06_TEST/TEST_02_性能評価計測結果.md`(TEST_03 と同形式の 3 版比較表). + +## 関連 (Related) + +- ビルドフラグ(`MEMMONITOR`): [ENV_06_ビルド構成とビルドフラグ](../02_ENV/ENV_06_ビルド構成とビルドフラグ.md). +- 自動ベンチによるメモリ計測(参考・別手段): [TEST_03_メモリ修正効果計測](../06_TEST/TEST_03_メモリ修正効果計測.md). +- プレビューメモリリーク修正の詳細: [PLAN_03_プレビューメモリリーク修正計画](PLAN_03_プレビューメモリリーク修正計画.md). diff --git "a/docs/04_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" new file mode 100644 index 0000000..7feab10 --- /dev/null +++ "b/docs/04_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" @@ -0,0 +1,96 @@ +# 機能仕様 (Feature Specification) + +## 対応カメラ (Supported Cameras) + +起動時に Lucam → ImagingSource の順で接続を試みる. + +**ImagingSource カメラ(新カメラ)** + +- 対応機種: DFK33UX178,DFK23UX249 + - ※ README には DBK33UX178 と記載されていたが,ソースコード上は DFK33UX178 として扱われている.実機の型番は要確認. +- SDK: IC Imaging Control (TIS.Imaging) +- 設定ファイル: `[デバイス名].xml`(例: `DFK33UX178.xml`) + +**Lumenera カメラ(旧カメラ)** + +- 対応機種: Lw110 +- SDK: Lumenera SDK(`lumenera.api.dll`) + +## プレビュー (Preview) + +- 起動後,接続したカメラのライブ映像をメインウィンドウに表示する. +- サブモニタへのプレビュー表示にも対応する(PreviewMonitor). +- ImagingSource カメラはプレビュー時に ROI クリップを適用する. + +## 自動キャリブレーション (Auto Calibration) + +プレビュー中に舌診チャートを検出すると自動でキャリブレーションを開始する. + +### チャート検出 + +- ArUco マーカー(ID 40, 41)を使用してチャートを自動検出する. +- チャートが一定フレーム数静止したことを確認してからキャリブを開始する. + +### ホワイトバランス調整 + +- チャートの白色票(24色票の13番)を基準にカメラのゲインを自動調整する. +- 目標値は `config.xml` の `Calib/Reference` で指定する. + +### TCC(色変換行列)計算 + +- 24パッチの平均 RGB 値を計測し,最小二乗法(SVD)で変換行列を算出する. +- 変換次元数(多項式の次数)は `Calib/ConversionChannels` で指定する. + - 4: 1次式(R,G,B,1) + - 10: 2次式(+RG,RB,GB,R²,G²,B²) + - 17: 3次式(+R²B,R²G,G²R,G²B,B²R,B²G,RGB) +- 複数の次元数をカンマ区切りで同時に指定可能(例: `4,10,17`). +- 算出した変換行列は CSV ファイルに保存される. + +## 撮影 (Shooting) + +キャリブレーション完了後に撮影ボタンが有効になる. + +**1枚撮影** + +- 撮影した画像を1枚保存する. + +**連続撮影** + +- 指定した枚数・間隔で連続撮影する. +- 枚数・間隔は UI で変更可能(デフォルト値は `config.xml` で設定). + +**保存される画像** + +- 元画像(RGB): `Shot{NO}.png` +- sRGB 変換画像: `sRGB{CN}_{NO}.jpg`(指定した次元数ぶん生成される) + +## データ保存 (Data Saving) + +撮影・キャリブレーション結果は保存フォルダ以下に日時フォルダで自動保存される. + +**保存先フォルダ構成** + +- `[SaveFolder]/[日付]/[時刻]-[データ名]/` + +**キャリブレーション保存ファイル** + +- `TCC.png`: キャリブ時の画像 +- `TCC_ROIs.jpg`: チャートの ROI 確認画像 +- `TCC_RGB.csv`: チャート24色票の RGB 値 +- `TCC_sRGB{CN}.csv`: チャート24色票の sRGB 変換値 +- `Conv_RGB-sRGB{CN}.csv`: RGB→sRGB 変換行列 +- `Conv_RGB-XYZ{CN}.csv`: RGB→XYZ 変換行列 +- `Conv_sRGB-XYZ{CN}.csv`: sRGB→XYZ 変換行列 + +**撮影保存ファイル** + +- `Info.csv`: 撮影情報(カメラ型番・SN,露光時間,ゲイン等) +- `Shot{NO}.png`: 元画像(RGB) +- `sRGB{CN}_{NO}.jpg`: sRGB 変換画像 + +## 光源制御 (Light Source Control) + +- シリアル通信(USB-シリアル変換)で光源の ON/OFF を制御する. +- 対応デバイス: Silicon Labs CP210x(`config.xml` で変更可能). +- キャリブレーション中は光源の切り替えが無効になる. +- 光源デバイスが見つからない場合,光源ボタンが無効化される. diff --git "a/docs/04_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" new file mode 100644 index 0000000..24a3266 --- /dev/null +++ "b/docs/04_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" @@ -0,0 +1,129 @@ +# 設定ファイル仕様 (Configuration File Specification) + +実行ファイルと同じディレクトリに `config.xml` を配置する. +XML のルート要素は `` とする. + +※ ファイル名・保存先のテンプレート変数: `{NO}` は4桁連番,`{CN}` は2桁の次元数に展開される. + +## Lucam カメラ設定 (Lucam Camera) + +Lumenera Lw110 の初期パラメータ. + +**``** + +- ``: 露光時間 (ms) + - 例: `60.0` +- ``: マスターゲイン + - 例: `1.5` +- ``: ブルーゲイン + - 例: `2.62` +- ``: グリーンゲイン + - 例: `1.72` +- ``: レッドゲイン + - 例: `1.70` + +## ImagingSource カメラ設定 (ImagingSource Camera) + +各カメラの ROI(関心領域)設定.カメラ名はデバイス名と一致させる. + +**`` / ``** + +- `` + - ``: ROI の左端座標 (px) + - ``: ROI の上端座標 (px) + - ``: ROI の幅 (px) + - ``: ROI の高さ (px) + +※ ImagingSource カメラは画像を転置してから ROI を切り出す.X・Y・W・H は転置後の座標系で指定する. + +## キャリブレーション設定 (Calibration) + +**``** + +- ``: チャート固定判定の閾値 (px) + - ARマーカーの移動量がこの値未満のフレームを「静止」とみなす. + - 例: `4.0` +- ``: チャート固定判定に必要な連続静止フレーム数 + - 例: `30` +- ``: 白色票(24色票の13番)の目標 RGB 値 + - ``: ブルー目標値 (0-255) + - ``: グリーン目標値 (0-255) + - ``: レッド目標値 (0-255) + - 例: `226`(各チャンネル共通) +- ``: ホワイトバランスゲインの更新率(0.0-1.0) + - 1.0 で即時反映,値を下げると緩やかに収束する. + - 例: `0.8` +- ``: キャリブレーションに使用するフレーム数 + - 例: `100` +- ``: ゲインを更新するフレーム間隔 + - 例: `5`(5フレームごとに更新) +- ``: 変換行列の次元数 + - 4 (1次式),10 (2次式),17 (3次式) から選択する. + - カンマ区切りで複数指定可能(例: `4,10,17`). + - 詳細は `SPEC_01_機能仕様.md` の「TCC(色変換行列)計算」を参照. + +## 撮影設定 (Shot) + +**``** + +- ``: プレビューモニタの表示幅 (px) + - 例: `1280` +- ``: 連続撮影の枚数(UI の初期値) + - 例: `10` +- ``: 連続撮影の間隔 (ms)(UI の初期値) + - 例: `500` +- ``: データ名の初期値(UI のテキストボックスに表示) + - 例: `無記名` + +## ファイル設定 (File) + +**``** + +- ``: データの保存先フォルダ(絶対パス) + - 例: `C:\TIAS_Data` +- ``: sRGB 変換参照値 CSV のパス + - 例: `tcc_srgb.csv` +- ``: XYZ 変換参照値 CSV のパス + - 例: `tcc_xyz.csv` +- ``: キャリブ時の画像ファイル名 + - 例: `TCC.png` +- ``: チャート ROI 確認画像ファイル名 + - 例: `TCC_ROIs.jpg` +- ``: 撮影画像ファイル名(`{NO}` で連番) + - 例: `Shot{NO}.png` +- ``: sRGB 変換画像ファイル名(`{CN}` で次元数,`{NO}` で連番) + - 例: `sRGB{CN}_{NO}.jpg` +- ``: 撮影情報 CSV のファイル名 + - 例: `Info.csv` +- ``: チャート RGB 値 CSV のファイル名 + - 例: `TCC_RGB.csv` +- ``: チャート sRGB 値 CSV のファイル名(`{CN}` で次元数) + - 例: `TCC_sRGB{CN}.csv` +- ``: RGB→sRGB 変換行列 CSV のファイル名 + - 例: `Conv_RGB-sRGB{CN}.csv` +- ``: RGB→XYZ 変換行列 CSV のファイル名 + - 例: `Conv_RGB-XYZ{CN}.csv` +- ``: sRGB→XYZ 変換行列 CSV のファイル名 + - 例: `Conv_sRGB-XYZ{CN}.csv` +- ``: RGB→XYZ 変換行列(旧形式)CSV のファイル名 + - 例: `Conv_RGB-XYZold.csv` + +## 光源設定 (Light Source) + +**``** + +- ``: 光源デバイスのデバイス名(部分一致で検索) + - 例: `Silicon Labs CP210x` +- ``: シリアル通信のボーレート (bps) + - 例: `38400` + +## サウンド設定 (Sound) + +**``** + +- ``: キャリブレーション完了時の効果音ファイル名 + - 例: `CalibDone.wav` +- ``: 1枚撮影完了時の効果音ファイル名 + - 例: `OneShot.wav` +- ``: 連続撮影完了時の効果音ファイル名 + - 例: `MultiShot.wav` diff --git "a/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" "b/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" new file mode 100644 index 0000000..13cff86 --- /dev/null +++ "b/docs/04_SPEC/SPEC_03_\347\231\275\346\235\277\346\222\256\345\275\261_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241.md" @@ -0,0 +1,238 @@ +# 白板撮影プロトコルと TIAS 撮影条件(照明均一性評価) (White-Board Capture Protocol & TIAS Conditions) + +本書は,従来型口腔内画像取得装置 **TIAS** の照明均一性を評価するための **白板撮影プロトコル**(撮影の目標・要件)と,それに対する **TIASshot(撮影アプリ)の現行撮影条件**,および **SmTIAS-Evaluation 側との確認結果(Q&A)** を 1 つにまとめたものである.最終目的は **TIAS と SmTIAS の照明均一性を装置間比較する**ことにある. + +> **外部参照について**: 本書が参照する `PLAN_01 要件定義書`・`SPEC_02 照明均一性評価アルゴリズム`・`TECH_01 DNG 対応要求仕様`・`TEST_01/03 評価報告書` 等は,**別プロジェクト「SmTIAS-Evaluation」側のドキュメント**であり本リポジトリには含まれない.本書ではプレーンテキストで参照名のみ示す. +> +> **構成**: Part 1 = 撮影プロトコル(こう撮るべき/SmTIAS 基準),Part 2 = TIAS の現行撮影条件(実際どう撮るか),Part 3 = 確認事項と SmTIAS の回答・依頼事項. + +--- + +# Part 1: 撮影プロトコル (Capture Protocol) + +SmTIAS と同一の評価パイプライン・同一指標で比較できる白板データを取得するためのプロトコル(撮影の目標・要件). + +## 目的 (Purpose) + +白板(全面が一様反射率の面光源応答ターゲット)を撮影し,**被写体の反射率ムラを排除して,観測される輝度ムラを照明系のムラに帰着させる**.取得データから CoV・最大/最小比・中心周辺勾配・動径 min/max 比などの均一性指標を算出する(指標定義は SmTIAS-Evaluation の SPEC_02). + +### なぜ条件を SmTIAS と揃えるのか + +主目的は **SmTIAS と TIAS の照明系の差**を見ること.撮影条件(露出・WB・現像処理)が両装置で異なると「照明系の差」と「撮影条件の差」が混在し比較が成立しない. + +※ ただし CoV・最大/最小比等は画像内の**相対ばらつき指標**であり,全画素に等しく作用する係数(露出スケール・線形ゲイン等)には不変である.したがって**最優先で揃えるべきは「線形性を壊す処理(トーンカーブ・自動露出・自動 WB・ノイズ低減)の有無」**であり,露出値・ISO の絶対一致は副次的である. + +## 撮影対象(白板) (Target: White Board) + +- TIAS の積分球開口部に合致する**別白板**を用いる(SmTIAS 用白板とは物理形状が異なるため流用しない). +- 開口部全面を均一反射率で覆える寸法・形状.表面は均一拡散反射(マット)で,光沢・色ムラ・汚れ・傷がないこと. +- 白板の白色面のみを ROI とし,開口縁・筐体壁面・フレーム・ラベル等は除外する. + +## 揃える基準値(SmTIAS 定量撮影モード) (Reference Settings) + +SmTIAS は定量撮影モードで **RAW_SENSOR (DNG) を線形・無補正で取得**している(機種 SH-02M / AQUOS sense3).TIAS 側はこの設定思想に揃える. + +| 項目 | SmTIAS 定量モードの値 | 揃える狙い | +| --- | --- | --- | +| 出力形式 | RAW_SENSOR (DNG, 10-bit linear) | トーンカーブ・sRGB 符号化を経ない線形信号 | +| 自動露出 (AE) | OFF(手動固定) | フレーム間で露出を変動させない | +| 露出時間 | 8,333,333 ns(≒ 1/120 s) | 固定露出 | +| ISO 感度 | 40(最低感度) | ノイズ最小・固定 | +| ホワイトバランス (AWB) | OFF,ゲイン [1,1,1,1],色変換 identity | 生の比率を保つ | +| オートフォーカス (AF) | OFF(手動固定) | フォーカス固定 | +| ノイズ低減 (NR) | OFF | 空間平滑化で輝度分布を歪めない | +| エッジ強調 | OFF | シャープ化による輝度改変を避ける | +| トーンマップ | 線形 (CONTRAST_CURVE_LINEAR) | 入射光量に比例した値を保つ | +| シェーディング補正 (LSC) | **適用してビネット除去**※ | レンズ由来の周辺減光を除き照明系のムラだけを残す | +| ブラックレベルロック | true | 黒レベルを固定 | + +※ **シェーディング補正(LSC)は他の処理と性質が逆で,必ず適用してビネットを除去する**.NR・トーンカーブ・エッジ強調は信号を不可逆に歪めるため OFF にするが,LSC は**レンズ由来の周辺減光(ビネット)を除く**補正であり,掛けないと照明系のムラとカメラのビネットが混在してしまう.SmTIAS では実機 DNG が LSC 未補正で出力されるため評価側でシェーディングマップを順適用して除去している.**未補正のまま評価すると指標が大きく悪化する**(SmTIAS 実測: CoV 0.070→0.146,中心周辺勾配 8.4%→31%,動径 min/max 0.86→0.53). + +## 設定方針 (Capture Policy) + +優先度の高い順に: + +1. **線形・無加工で取得する(最優先)**: AE・AWB・NR・エッジ強調・トーンカーブを OFF にし,可能なら RAW で保存する. +2. **シェーディング補正(ビネット除去)は必ず適用する**: 上記とは逆に,レンズ由来の周辺減光は補正して除く(在カメラ補正 or RAW+シェーディングマップで評価側補正). +3. **すべて手動固定する**: 露出・ゲイン・WB・フォーカスを手動固定し,全撮影で同一値. +4. **飽和・黒つぶれを避ける**: 白板最明部が飽和せず,かつレンジの 7〜9 割程度になるよう露出を調整する(SmTIAS は飽和画素率 0%・p99 が白レベル 1023 に対し約 880). +5. **露出値の一致は副次的**: 「線形・無加工・飽和なし」を満たした上で TIAS 固有の最適露出を選び,その値を記録する. + +## 撮影手順 (Procedure) + +1. **設置**: TIAS 開口部に白板を装着し,カメラ・白板・装置の相対位置を固定する. +2. **設定適用**: 上記設定を適用(処理 OFF・手動固定・可能なら RAW).**シェーディング補正は OFF にせずビネットを除去できる状態にする**. +3. **露出調整**: 白板最明部がレンジの 7〜9 割程度になるよう調整し,値を確定・記録. +4. **外乱光条件**: 原則 TIAS 自前照明のみ.室内照明の影響を見たい場合は位置・露出固定のまま室内灯 ON/OFF の連続 2 枚を撮影する. +5. **複数枚撮影**: 同一条件で複数枚(SmTIAS では 12 枚)撮影し,再現性(SSIM・指標分散)を評価できるようにする. +6. **記録**: 各撮影の条件(露出・ISO・WB・外乱光の有無・温度等)と,使用したカメラ仕様を記録する. + +## データ管理・命名 (Data Management) + +- **保存先**: SmTIAS-Evaluation 側の `data/tias/whiteboard/` に配置する想定. +- **RAW の場合**: RAW 本体に加え撮影条件・センサ特性のメタデータ(JSON 等)を併置する(SmTIAS の `*.meta.json` に準拠できると後段の解析が容易). +- **ファイル名**: 装置・対象・撮影日時が判別できる命名(例: `TIAS_<日付>_<連番>`). + +--- + +# Part 2: TIAS 現行撮影条件 (Current TIAS Conditions) + +撮影アプリ **TIASshot**(C# / WinForms,Lucam + ImagingSource を制御)が,照明均一性評価用に**実際にどの条件で撮影するか**を,コード・設定ファイルから抽出したもの. + +## 前提: 校正なしの撮影 (Premise: No Calibration) + +通常の TIASshot(舌診用途)は「チャート検出 → WB 自動調整 → TCC 色補正 → sRGB 出力」という校正フローを行う.しかし照明均一性評価では色を合わせること自体が目的でないため,白板撮影では **WB 自動調整・TCC 色補正・チャート検出を一切行わず,カメラ素の RGB のみを保存**する.WB のチャンネルゲインは設定ファイル/デバイス状態の**固定値**のまま. + +> TIASshot には校正を前提としない独立撮影パス(`#if WHITEBOARD` 限定の白板撮影モード)を実装済み.本 Part はその撮影が用いる設定を記す. + +## カメラ構成と出力形式 (Cameras & Output) + +- **Lucam(Lumenera)優先 → 無ければ ImagingSource** にフォールバック.接続中のカメラは画面の機種名欄(`txtDeviceName`)で確認できる. +- 出力は **いずれも RGB24(8-bit/ch,デモザイク済み)**.RAW ではない. +- **実機の主対象は ImagingSource DFK 23UX249**(基準データ・実撮影で使用,SN 45610026). + +| カメラ | 機種 | 解像度(ROI 後) | 出力 | +| --- | --- | --- | --- | +| Lucam | Lumenera Lw110 | 1280 × 1024 | RGB24 8-bit | +| ImagingSource | DFK 33UX178 | ROI 1840 × 2440 | RGB24 8-bit | +| ImagingSource | DFK 23UX249 | ROI 1136 × 1528 | RGB24 8-bit | + +## カメラ別 撮影条件 (Per-Camera Settings) + +設定元: `Lucam.cs`+`config.xml`,`DFK33UX178.xml`/`DFK23UX249.xml`(デバイス状態). + +### Lucam (Lumenera Lw110) + +| 項目 | 値 | 備考 | +| --- | --- | --- | +| 出力 | RGB24 8-bit | PF_8 → デモザイク(HIGH_QUALITY) | +| 露出 | 60 ms(手動固定) | 自動露出なし | +| ゲイン | 1.5(固定) | | +| ホワイトバランス | B 2.62 / G 1.72 / R 1.70(固定) | 校正なしのため自動調整しない | +| 色補正行列 (CCM) | **LED(適用)** ⚠ | SDK 内蔵の光源別 3×3 補正(チャンネル混合).白板モードでは NONE 推奨 | +| NR / エッジ / トーンカーブ | アプリ側で適用なし | | +| シェーディング補正 | **適用なし** ⚠ | ビネット未除去・マップ未保存.SDK に `LSC_X`/`LSC_Y`(2 係数の簡易補正)あり(未使用) | + +### ImagingSource DFK 33UX178 + +| 項目 | 値 | 備考 | +| --- | --- | --- | +| 出力 | RGB24 8-bit(3072×2048,ROI 切出) | | +| 露出 | 手動 ≈1/60 s | ※自動フラグ二重・要確認 | +| ゲイン | 1.0(Auto OFF) | | +| ホワイトバランス | Auto OFF・G64/B134/R79(固定) | | +| ガンマ | 1.0(線形)・トーンマップ OFF | | +| NR / シャープネス | Denoise 0 / Sharpness 0 | | +| 色補正行列 (Color Matrix) | **OFF** | カメラ内 CCM 無効 | +| 明るさ (Brightness) | 240 | ※黒レベル/オフセット相当か要確認 | +| シェーディング補正 | 設定項目なし・**適用なし** ⚠ | | + +### ImagingSource DFK 23UX249(実機の主対象) + +| 項目 | 値 | 備考 | +| --- | --- | --- | +| 出力 | RGB24 8-bit(1920×1200,ROI 切出) | | +| 露出 | 手動 ≈1/60 s(16.6 ms) | ※自動フラグ二重・要確認 | +| ゲイン | 0.0(Auto OFF) | | +| ホワイトバランス | Auto OFF・G64/B140/R100(固定) | | +| ガンマ | 100(= 1.0,線形)・トーンマップ OFF | スケール表記が DFK33 と異なるだけ | +| NR / シャープネス | Denoise 0 / Sharpness 0 | | +| 色強調 (Color Enhancement) | 既定 ON ⚠ → **白板モードで OFF にする** | DFK33(CCM OFF)と異なる色処理.非線形の懸念 | +| 明るさ (Brightness) | 50 | ※要確認(DFK33=240 と差大) | +| シェーディング補正 | 設定項目なし・**適用なし** ⚠ | | + +## SPEC_03 基準値との対照 (Comparison) + +○=合致,△=条件付き/要確認,✗=相違. + +| 項目 | SmTIAS 基準 | Lucam | DFK33UX178 | DFK23UX249 | +| --- | --- | --- | --- | --- | +| 出力形式 | RAW 10-bit linear | ✗ RGB24 8-bit | ✗ RGB24 8-bit | ✗ RGB24 8-bit | +| 自動露出 | OFF 固定 | ○ | △ 要確認 | △ 要確認 | +| ゲイン | 固定 | ○ | ○ | ○ | +| ホワイトバランス | OFF・identity | △ 固定(非 identity) | △ 固定(非 identity) | △ 固定(非 identity) | +| NR | OFF | ○ | ○ | ○ | +| エッジ強調 | OFF | ○ | ○ | ○ | +| トーンカーブ | 線形 | ○ | ○ γ1.0 | ○ γ1.0 | +| 色補正/色処理 | identity | ✗ LED CCM | ○ CCM OFF | ✗ Color Enhancement ON(白板モードで OFF) | +| シェーディング (LSC) | 適用してビネット除去 | ✗ 未除去 | ✗ 未除去 | ✗ 未除去 | +| 黒レベル | lock | △ 要確認 | △ Brightness 240 | △ Brightness 50 | + +## 現状の出力・保存 (Output) + +- 通常は `Shot{NO}.png`(RGB24)+ `sRGB{CN}_{NO}.jpg`(TCC 変換後)を `C:\TIAS_Data\日付\時刻-名称\` に保存するが,**白板モードでは sRGB を生成せず RGB(PNG) のみ**保存し,撮影条件+飽和統計を JSON サイドカー(`whiteboard_meta.json`)で併置する. +- 白板モードのメタデータ記録項目: 機種・SN・解像度/ROI・露出(ms)・ゲイン・WB ゲイン・Color Enhancement 状態・γ/トーンマップ・Denoise/Sharpness・Brightness(黒レベル)・**シェーディング補正状態(=未補正・LSC 保留)**・飽和率・p99・ch 別 mean/max・撮影日時. + +--- + +# Part 3: 確認事項と SmTIAS-Evaluation の回答 (Q&A) + +TIAS 側の現行条件に対する確認事項と,SmTIAS-Evaluation 側の回答.**致命的に対応が必要なのは Q5(ビネット)と Q7(黒レベル)の 2 点**,残りは概ね許容(条件付き). + +## Q1. 8-bit RGB(非 RAW)の許容性 → ○ 許容(条件付き) + +許容してよい.白板平均が 8-bit レンジの中〜上(mean 150〜200)にあれば量子化ノイズの CoV 寄与は約 0.002 程度で,SmTIAS の CoV 0.04〜0.07 に対し無視できる.条件は撮影パスが**真に線形**(γ=1.0・トーンマップ OFF,確認済)であること.8-bit の真のリスクはビット深度でなく隠れた非線形なので,リニアリティだけ実機で担保すること.主指標は CoV・中心周辺勾配・動径 min/max(輪帯平均でロバスト)とする.**生 Bayer の追加実装は不要**. + +## Q2. デモザイクの許容性 → ○ 許容 + +白板の照明ムラは低空間周波数であり,デモザイク補間アーティファクト(エッジ・高周波で発生)はほぼ無関係.HIGH_QUALITY で問題なし. + +## Q3. 固定・非 identity の WB → ○ そのまま評価可 + +固定 WB のまま評価してよい.正確な根拠は「一様ゲインだから」ではなく,**「全チャンネルが同一の空間パターンを持つ限り,固定の線形結合(WB でも CCM でも)は空間パターンをスカラ倍に保つので相対指標は不変」**だから.唯一の注意: 色ビネット等で照明色が空間的に変わるとチャンネルごとに空間パターンが異なり合成 CoV がわずかに動く(Lucam の B=2.62 のように WB ゲインが大きいと増幅されうる).**ロバストチェックとして緑チャンネル単体でも均一性を算出**することを推奨(単一チャンネルは一様ゲインに完全不変,G は輝度寄与 0.72 で代表性も高い). + +## Q4. 色処理の機種差 → 可能な限り OFF を推奨 + +- **Color Enhancement(DFK23)は非線形(彩度強調)の可能性が高く害**.必ず OFF に(白板モードで実装済み). +- **CCM(Lucam)は固定線形なので輝度均一性への一次影響は小さい**が,①クリップによる非線形化,②機種間不一致が残る.**NONE 推奨**(両方を解消し 3 系統が揃う). + +## Q5. ★ シェーディング / ビネット(最大の論点)→ フラットフィールド補正で対応(独立光源で) + +- 測定モデル: 画像 I = 照明 L × レンズビネット V ×(白板で一様な反射率).欲しいのは L,邪魔は V. +- **落とし穴**: 「TIAS 自身の光で均一面を別撮りして割る」と **L と V を分離できない**(参照画像も `L×V` のため,割っても反射率比 ≒1 になるだけ). +- **正しいフラットフィールド**: V を特性化するには **TIAS 照明とは独立な既知の一様光源**(均一 LED パネル/ライトボックス/別の積分球出力等)で画面全面を撮影し,正規化して V(x,y) を得て白板画像を除算する.まず SDK/カメラベンダ(Lumenera / The Imaging Source)のレンズシェーディングデータが使えないかも確認を(Lumenera には `LSC_X`/`LSC_Y` の簡易補正があるが 2 係数の粗いモデルで要検証). +- 特性化できない場合は,結果を**「照明×レンズの系全体の均一性」と明記**し,レンズ補正済みの SmTIAS とは**直接比較不可(TIAS 照明均一性の下限値)**として留保する. +- 重要な理由: **TIAS は積分球で照明が本来きわめて均一なはず**.だとすると未補正画像のムラは**ほぼレンズビネットを測っているだけ**になりうる.レンズ補正済み SmTIAS と未補正 TIAS を比べると TIAS が不当に悪く見えるため,フェアな比較には V 除去が必須. + +## Q6. 露出の自動/手動 → 手動固定を確定・検証 + +手動固定が必須.実機で有効露出がフレーム間一定か(SDK 読み戻し or 連続フレームの平均輝度が一定か)で検証し,二重フラグのどちらが効いているかを確定する. + +## Q7. ★ 黒レベル / Brightness → ダークフレーム減算(要注意) + +- Brightness が**加算オフセット(ペデスタル)**なら均一性指標を**良い方に偏らせる**(加算 c に対し CoV = σ/(μ+c),max/min = (max+c)/(min+c) がともに縮む).DFK33=240 と DFK23=50 の差が**そのまま指標差として混入**し機種間比較が無効になる. +- 対策: **機種ごとにダークフレーム(遮光/無照明)を撮影して真の黒レベルを実測し,指標算出前に減算する**(SmTIAS は黒レベル 64 を減算).Brightness が加算か乗算かを SDK で確認し,加算なら減算,乗算なら一様係数で不変扱い. +- 要確認: 8-bit で Brightness=240 が純加算ペデスタルなら白板は即 255 飽和でレンジがほぼ無くなる → **240 は別スケールの制御の可能性が高い**.意味の確定が必要. + +## Q8. 飽和回避(8-bit)→ ヒストグラムで検証・記録 + +ROI 内で値 255(念のため ≥254)の画素数 = 0 を確認.目安は最明部 180〜230(レンジの 70〜90%).**飽和画素率・p99・チャンネル別 max をショットごとに記録**(白板モードで実装済み). + +## Q9. 出力形式・メタデータ → JSON サイドカーを推奨 + +SmTIAS の `*.meta.json` に倣い,**ショットごとに JSON サイドカー**で記録(白板モードで実装済み): 機種・解像度/ROI・露出・ゲイン・WB チャンネルゲイン・CCM/Color Enhancement の状態・γ/トーンマップ・Denoise/Sharpness・Brightness(黒レベル)・シェーディング補正状態+使用フラットフィールド/ダークフレーム名・外乱光条件・飽和/低露出画素率・チャンネル別 mean/max・撮影日時. + +## 依頼事項まとめ (Action Items for TIAS Side) + +- [ ] **独立な一様光源**でフラットフィールド(レンズビネット V)を取得する手段の確保(Q5).不可なら系全体評価+留保で運用. +- [ ] 機種ごとの**ダークフレーム取得**と Brightness の意味(加算/乗算)の確定(Q7). +- [x] **色処理 OFF**(DFK23 Color Enhancement OFF)(Q4)— 白板モードで実装済み.Lucam CCM=NONE は未対応. +- [ ] 露出の手動固定の実機確定(Q6). +- [x] **JSON サイドカー**メタデータ(Q9)と飽和チェックの記録(Q8)— 白板モードで実装済み. + +--- + +## 関連(外部参照) (Related — External) + +以下は別プロジェクト「SmTIAS-Evaluation」側のドキュメント(本リポジトリには含まれない). + +- `PLAN_01 要件定義書` — 評価対象・優先度(優先度 2: SmTIAS vs TIAS 照明均一性比較) +- `SPEC_02 照明均一性評価アルゴリズム` — 評価指標・ROI 設定・解析手順 +- `TECH_01 DNG 対応要求仕様` — DNG/メタデータ・LSC の扱い +- `TEST_01 照明均一性評価報告書` — SmTIAS 単体の撮影実績(12 枚) +- `TEST_03 外乱光影響評価報告書` — 外乱光条件の撮影手法・未補正で指標が悪化する実測例 + +本リポジトリ側の関連: + +- 白板撮影モードの実装: `TIASshot/Cameras/IScam.cs`(`ShotWhiteBoard`),`TIASshot/Utils/ImageStats.cs`(飽和統計・JSON) +- カメラ設定の出典: `TIASshot/Cameras/Lucam.cs`,`TIASshot/DFK33UX178.xml`,`TIASshot/DFK23UX249.xml`,`TIASshot/config.xml` diff --git "a/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" new file mode 100644 index 0000000..41ce621 --- /dev/null +++ "b/docs/04_SPEC/SPEC_04_\347\231\275\346\235\277\346\222\256\345\275\261\343\203\207\343\203\274\343\202\277\344\273\225\346\247\230.md" @@ -0,0 +1,90 @@ +# 白板撮影データ仕様(SmTIAS-Evaluation 引き渡し用) (White-Board Capture Data Specification) + +本書は,TIASshot の白板撮影モードで取得し **SmTIAS-Evaluation 側へ引き渡す白板撮影データ**について,**実際の撮影設定値・ファイル構成・メタデータの意味・評価時の注意**をまとめたものである.撮影プロトコルの目的・基準値・質疑応答(Q&A)は [SPEC_03 白板撮影プロトコルと TIAS 撮影条件](SPEC_03_白板撮影_照明均一性評価.md) を参照する(本書は実データの説明,SPEC_03 は仕様・根拠という役割分担). + +## 概要 (Overview) + +- TIASshot の **白板撮影モード(照明均一性評価用・`WHITEBOARD` ビルド限定)** で取得した素の RGB 画像データ. +- カメラ: **ImagingSource DFK 23UX249**(USB3 カラー産業用,Sony IMX249). +- **校正なし**で撮影する(チャート検出・ホワイトバランス自動調整・TCC 色補正を一切行わない).得られるのはカメラ素の RGB. +- 1 撮影セッション = 1 フォルダ(例: `<時刻>-白板/`). + +## 撮影設定(実際の値) (Capture Settings — Actual Values) + +各撮影の正確な値は同梱の `whiteboard_meta.json` に記録される.代表値(DFK 23UX249)は以下のとおり. + +| 項目 | 値 | 備考 | +| --- | --- | --- | +| カメラ | DFK 23UX249(SN 45610026) | | +| 撮影モード | 白板(校正なし・素 RGB) | チャート検出/WB 自動調整/TCC なし | +| 露出 | 16.6 ms(手動固定,≈1/60 s) | 自動露出なし(※ Q6 で実機確定) | +| ゲイン | 0(Auto OFF) | | +| ホワイトバランス | Auto OFF・固定 G 64 / B 140 / R 100 | 校正しないため device-state の固定値のまま | +| ガンマ | 100(= 1.0,線形)・トーンマップ OFF | | +| ノイズ低減 / シャープネス | Denoise 0 / Sharpness 0 | | +| Color Enhancement | **OFF**(撮影前に無効化) | 非線形の色強調を排除 | +| 明るさ (Brightness) | 50 | 黒レベル/オフセット相当か要確認(Q7) | +| 色補正行列 (CCM) | なし | ImagingSource は Color Matrix を持たない | +| シェーディング補正 (LSC) | **なし(ビネット未除去)** | DFK23 は在カメラ LSC を持たず補正データも無い(確認済) | +| 出力形式 | RGB24(8-bit/ch) | RAW ではない | +| 撮影枚数 | 既定 10(「連続撮影枚数」設定値) | SmTIAS と揃えるなら 12 に変更可 | + +## データ構成・ファイル (Files) + +1 セッションフォルダにフレーム数 × 2 枚の画像+メタデータが入る. + +| ファイル | 内容 | 解像度 | +| --- | --- | --- | +| `WhiteBoard_{NNNN}.png` | **ROI 切り出し画像**(評価対象の白板領域) | 1136 × 1528 | +| `WhiteBoard_full_{NNNN}.png` | **クロップなしフルフレーム**(四隅まで含む) | 1200 × 1920 | +| `whiteboard_meta.json` | 撮影条件+飽和統計(後述) | — | + +- ROI: config の `X0 / Y180 / W1136 / H1528` で切り出した白板領域. +- フル: センサ 1920 × 1200 を転置した **1200 × 1920**(クロップなし).ROI で切り捨てた周辺部(上 180px・下 212px・右 64px)を含むため,**レンズビネットの確認・フラットフィールド補正用**に使う. +- 画像はいずれも RGB24(8-bit,OpenCV の BGR 並びで PNG 保存).`{NNNN}` は 1 始まりの連番. + +## メタデータ(whiteboard_meta.json) (Metadata Schema) + +| フィールド | 意味 | +| --- | --- | +| `capture_datetime` | 撮影日時 | +| `device_name` / `serial_number` | カメラ機種名・シリアル | +| `roi_x` / `roi_y` / `roi_width` / `roi_height` | ROI 座標・サイズ | +| `full_frame_saved` / `full_width` / `full_height` | フルフレーム保存有無・サイズ | +| `num_frames` | 撮影枚数 | +| `exposure_ms` | 露出時間(ミリ秒) | +| `gain` | ゲイン(device ネイティブ値) | +| `brightness` | 明るさ(黒レベル/オフセット相当・要確認) | +| `gamma` | ガンマ(100 = 1.0 線形) | +| `wb_blue` / `wb_green` / `wb_red` | ホワイトバランスのチャンネルゲイン(固定値) | +| `color_enhancement_enabled` / `color_enhancement_note` | Color Enhancement の状態(false = 無効化済み) | +| `gamma_setting` / `tone_mapping` / `denoise` / `sharpness` / `color_matrix` | 固定状態の記録(device-state 由来の決め打ち文字列) | +| `shading_correction` / `shading_correction_note` | シェーディング補正状態("未補正"・ビネット混入の注記) | +| `frame_stats[]` | フレームごとの統計(下記) | + +`frame_stats[]` の各要素: + +| フィールド | 意味 | +| --- | --- | +| `frame` | フレーム番号(1 始まり) | +| `saturated_ratio` | 飽和画素率(輝度 ≥ 254 の割合) | +| `p99_luminance` | 輝度の 99 パーセンタイル | +| `mean_B` / `mean_G` / `mean_R` | チャンネル別 平均値 | +| `max_B` / `max_G` / `max_R` | チャンネル別 最大値 | + +※ `frame_stats` は **ROI 画像に対する統計**(白板領域の露出・飽和チェック用).フルフレーム側の統計は含まない.代表的な実測値: 飽和率 0・p99 ≒ 181(レンジの約 71%=飽和なしで十分な信号量). + +## 評価時の注意・留保 (Notes for Evaluation) + +SPEC_03 の Q&A に基づく留保事項. + +- **8-bit RGB(RAW でない)**: Q1 で許容(線形性は確認済み: γ1.0・トーンマップ OFF).主指標は CoV・中心周辺勾配・動径 min/max(輪帯平均でロバスト)を推奨. +- **ビネット未除去(最重要)**: DFK 23UX249 は在カメラのレンズシェーディング補正を持たず,補正データも付加されない(device-state・公式仕様で確認済).したがって観測ムラには**レンズビネットが含まれる**.V の除去には **TIAS 照明とは独立な一様光源でのフラットフィールド撮影**が必要(Q5).**`WhiteBoard_full_*`(四隅を含むフルフレーム)はこの V 特性化・目視確認のために提供**している.補正しないまま評価する場合は「照明×レンズの系全体の均一性」として留保すること. +- **固定・非 identity の WB**: 校正しないためチャンネルゲインは固定([1,1,1] ではない).相対ばらつき指標には不変だが(Q3),ロバストチェックとして**緑チャンネル単体でも均一性を算出**することを推奨. +- **黒レベル(Brightness=50)**: 加算オフセットか別スケールかが未確定(Q7).機種間比較の前に**ダークフレーム減算**で真の黒レベルを実測・減算することを推奨. +- **露出の手動固定**: device-state の自動フラグが二重で,手動固定を実機で確定する必要がある(Q6). + +## 関連 (Related) + +- [SPEC_03 白板撮影プロトコルと TIAS 撮影条件](SPEC_03_白板撮影_照明均一性評価.md) — プロトコル・基準値・SmTIAS 回答(詳細・根拠) +- 実装: `TIASshot/Cameras/IScam.cs`(`ShotWhiteBoard`),`TIASshot/Utils/ImageStats.cs`(飽和統計・JSON 生成) diff --git "a/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" "b/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" new file mode 100644 index 0000000..dce04e8 --- /dev/null +++ "b/docs/05_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" @@ -0,0 +1,119 @@ +# クラス設計 (Class Design) + +## クラス一覧 (Class Overview) + +**CameraBase(抽象基底クラス)** + +- ファイル: `Cameras/CameraBase.cs` +- カメラに共通する処理をまとめた抽象クラス. +- IScam・Lucam の両方が継承する. +- チャート検出・色補正・ファイル I/O はそれぞれ `ChartDetector`・`ColorCorrector`・`IoUtil` に委譲する. + +**IScam** + +- ファイル: `Cameras/IScam.cs` +- ImagingSource カメラ(DFK33UX178,DFK23UX249)の実装. +- IC Imaging Control SDK(`TIS.Imaging`)を使用する. + +**Lucam** + +- ファイル: `Cameras/Lucam.cs` +- Lumenera カメラ(Lw110)の実装. +- Lumenera SDK(`lumenera.api.dll`)を使用する. + +**Form1** + +- ファイル: `UI/Form1.cs` +- メインウィンドウ.UI イベントの受け取りとカメラ・光源の操作を担う. + +**PreviewMonitor** + +- ファイル: `UI/PreviewMonitor.cs` +- サブモニタへのプレビュー表示フォーム. + +**Config(静的クラス)** + +- ファイル: `Config.cs` +- `config.xml` の読み込みユーティリティ. +- XPath を使って文字列・整数・浮動小数点数の値を取得する. + +**LightSource** + +- ファイル: `LightSource.cs` +- シリアル通信(USB-シリアル変換)による光源の ON/OFF 制御. + +**ChartDetector** + +- ファイル: `ChartDetection/ChartDetector.cs` +- ArUco マーカーによるチャート検出・ホモグラフィ計算・24色票の ROI マスク生成. +- `CameraBase` から委譲される. + +**ColorCorrector** + +- ファイル: `ColorCorrection/ColorCorrector.cs` +- TCC 変換行列の計算(次元拡張・SVD)と画像の色変換(RGB→sRGB). +- `CameraBase` から委譲される.変換行列はチャネル数をキーとした辞書(`_convRGB2SRGB`)で保持する. + +**IoUtil(静的クラス)** + +- ファイル: `Utils/IoUtil.cs` +- ファイル I/O(CSV 読み書き・保存フォルダ生成・撮影情報出力)とサウンド再生.状態を持たない. +- `CameraBase` から委譲される. + +**GainCalc(静的クラス)** + +- ファイル: `Cameras/GainCalc.cs` +- ゲイン更新比率の計算(ホワイトバランス自動調整).ハードウェアに依存しない純粋計算. +- `CameraBase.GetRatio` から委譲される(テスト可能なピュアロジック層). + +**ImageStats(静的クラス)** + +- ファイル: `Utils/ImageStats.cs` +- 飽和統計(飽和率・p99・チャンネル別 mean/max)の算出と JSON サイドカー生成.ハードウェアに依存しない純粋計算. +- 白板撮影モード(`#if WHITEBOARD`)から使用される(テスト可能なピュアロジック層). + +## 継承関係 (Inheritance) + +```text +CameraBase(抽象) +├── IScam ← ImagingSource カメラ +└── Lucam ← Lumenera カメラ +``` + +## CameraBase の主なメンバ (CameraBase Members) + +### 抽象メソッド(派生クラスで実装する) + +- `Connect() : bool`: カメラに接続する +- `Disconnect()`: カメラを切断する +- `Shot(numImages, interval)`: 撮影処理 + +### 公開メソッド + +- `ShotOne()`: 1枚撮影 +- `ShotMulti()`: 連続撮影 + +### 保護メソッド(派生クラスから呼ぶ) + +- `BootCheck() : bool`: 起動時の前提条件チェック(設定・TCC参照ファイル) +- `DetectChart(img)`: チャート検出(`ChartDetector` に委譲) +- `CalcTcc(img)`: TCC 変換行列の計算・保存(`ColorCorrector` に委譲) +- `ProcessCalibrationFrame(img)`: プレビュー/校正フローの共通骨格(テンプレートメソッド) +- `RunShotLoop(numImages, interval)`: 撮影ループの共通骨格(テンプレートメソッド) +- `SaveImages(img, idx)`: 撮影画像の保存(RGB・sRGB 変換画像.色変換は `ColorCorrector` に委譲) +- `SaveThread(numImages)`: 画像保存スレッド処理 +- `GetRatio(value, target) : float`: ゲイン更新比率の計算(`GainCalc.CalcRatio` に委譲) + +### 主なフィールド + +- `_calibrating`: キャリブレーション残りフレーム数(0 で完了) +- `_calibrated`: キャリブレーション完了フラグ +- `_chartMasks`: 24色票の ROI マスクリスト +- `_roi`: ROI 矩形(IScam のみ使用) +- `_shots`: 撮影済み画像バッファ(`BlockingCollection`.撮影スレッドと保存スレッドの受け渡しに使用) + +## Form1 とカメラの関係 (Form1 and Camera) + +- Form1 は `CameraBase` 型の `_camera` フィールドを持つ. +- 起動時に Lucam → IScam の順で接続を試みる(詳細は `TECH_02` 参照). +- UI スレッドとカメラスレッドをまたぐメソッド(`ShowMessage`,`EnableShots` 等)は `InvokeRequired` を確認してスレッドセーフに呼び出す. diff --git "a/docs/05_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" "b/docs/05_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" new file mode 100644 index 0000000..adec6b7 --- /dev/null +++ "b/docs/05_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" @@ -0,0 +1,88 @@ +# カメラ制御仕様 (Camera Control Specification) + +## 起動時のカメラ接続フロー (Startup Connection Flow) + +Form1 ロード時に以下の順で接続を試みる. + +1. `Lucam.Connect()` を実行する + - 成功: Lucam をアクティブカメラとして使用する + - 失敗: 次へ + +2. ImagingSource デバイス一覧を走査する + - 接続されているデバイス名を順に `IScam.Connect()` で試行する + - 最初に成功したカメラをアクティブカメラとして使用する + +3. どのカメラも接続できない場合 + - エラーダイアログを表示してアプリを終了する + +## IScam(ImagingSource カメラ)の制御 (IScam Control) + +### 接続 + +- `[デバイス名].xml` からカメラ設定をロードする. +- `config.xml` の `<カメラ名>/ROI` から ROI 設定を読み込む. +- `FrameQueueSink` をシンクに設定してライブ開始する. + +### プレビュー(フレーム取得コールバック) + +- `FrameQueueSink` の `Retrieve` コールバックでフレームを受け取る. +- 受け取った画像を転置(`.T()`)し,ROI を切り出して表示する. +- キャリブレーション中は白色票の測定・ゲイン更新も行う(後述). + +### ROI クリップ + +- ImagingSource カメラは横向きに画像を出力するため,転置して縦向きに変換する. +- 転置後の画像座標系で ROI(X,Y,W,H)を切り出す. + +### 撮影 + +- シンクを `FrameQueueSink` → `FrameSnapSink` に切り替える. +- `SnapSingle()` で1フレームずつ取得して `_shots` に蓄積する. +- 撮影完了後,シンクを `FrameQueueSink` に戻す. +- 最初の1フレームは捨てる(カメラの安定待ち). + +## Lucam(Lumenera カメラ)の制御 (Lucam Control) + +### 接続 + +- `LucamNumCameras()` で接続台数を確認する(0台または2台以上はエラー). +- カメラ ID から機種を特定する(`0x49f` → Lw110). +- `LucamRgbPreviewCallback` コールバックを登録する. +- `config.xml` の `` からカメラパラメータを設定して,プレビューを開始する. + +### プレビュー(フレーム取得コールバック) + +- `LucamRgbPreviewCallback` でフレームを受け取る. +- 受け取った画像を転置(`.T()`)して表示する(ROI クリップなし). +- キャリブレーション中は白色票の測定・ゲイン更新も行う(後述). + +### 撮影 + +- `LucamEnableFastFrames()` でスナップ撮影モードに切り替える. +- `LucamTakeFastFrame()` でRAW画像を取得し,`LucamConvertFrameToRgb24()` でRGB変換する. +- 撮影完了後,`LucamDisableFastFrames()` で通常モードに戻す. + +## ホワイトバランス自動調整 (White Balance Calibration) + +チャート検出後(`_calibrating` が `Calib/Frames` にセットされた後),各フレームで以下の処理を行う. + +1. 白色票(`_chartMasks[12]`,24色票の13番)の平均 RGB 値を測定する + +2. `Calib/UpdateInterval` フレームごとにゲインを更新する + - 更新比率: `ratio = (target / current - 1) * UpdateRate + 1` + - IScam: `VCDRangeProperty.Value` を直接更新する + - Lucam: `_snap.Gain*` を更新し `SetCameraParam()` で反映する + +3. `_calibrating` をデクリメントし,0 になったら `CalcTcc()` を呼び出す + +## データ保存フォルダの生成 (Save Folder) + +`SetSaveFolder(note)` が保存先フォルダを以下の書式で生成する. + +```text +[SaveFolder]/[yyyy-MM-dd]/[HH_mm_ss]-[note]/ +``` + +- `SaveFolder` は `config.xml` の `` で指定する. +- `note` は「データ名」(撮影時)または「校正」(キャリブ時). +- フォルダが存在しない場合は自動作成する. diff --git "a/docs/05_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" "b/docs/05_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" new file mode 100644 index 0000000..c320182 --- /dev/null +++ "b/docs/05_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" @@ -0,0 +1,85 @@ +# 色補正処理仕様 (Color Correction Specification) + +## 処理の全体フロー (Overall Flow) + +```text +1. ArUco マーカー検出(DetectChart) + ↓ +2. チャート固定判定 + ↓ +3. ホワイトバランス自動調整(ゲイン更新) + ↓ +4. TCC 変換行列の計算(CalcTcc) + ↓ +5. 変換行列の保存・撮影の有効化 +``` + +## チャート検出(DetectChart) (Chart Detection) + +### ArUco マーカー検出 + +- 辞書: Dict4X4_50(4×4 ビット,50種) +- 使用マーカー ID: 40(チャート上端),41(チャート下端) +- 両方のマーカーが検出できない場合は処理をスキップする. +- ID40 の Y 座標が ID41 より大きい場合(上下逆)は警告を表示する. + +### チャート固定判定 + +- ID40 の検出座標と前フレームの座標の距離を計算する. +- 距離 < `Calib/ChartSetCriteria` が `Calib/ChartSetCount` フレーム連続したら固定と判断する. +- 動きを検出したらカウントをリセットする. + +### ホモグラフィ計算とチャートマスク作成 + +- 2つのマーカーの角点(計8点)からホモグラフィ行列を計算する. +- ホモグラフィで画像を 1545×810 px に正面化する. +- 正面化画像上で 24 色票の ROI を定義し(6列×4行,各 80×80 px),元の画像座標系に逆変換してマスクを生成する. +- 生成したマスクを `_chartMasks` リスト(インデックス 0〜23)に格納する. + +## TCC 変換行列の計算(CalcTcc) (TCC Matrix Calculation) + +### チャート RGB 値の取得 + +- `_chartMasks` を使って 24 パッチの平均 RGB 値を測定する(24×3 行列). + +### 多項式拡張(ExtendMat) + +3チャンネル(R,G,B)を指定の次元数に拡張する. + +**次元数と項の対応** + +| 次元数 | 追加される項 | +| --- | --- | +| 4 (1次式) | 1, R, G, B | +| 10 (2次式) | + RG, RB, GB, R², G², B² | +| 17 (3次式) | + R²B, R²G, G²R, G²B, B²R, B²G, RGB | + +- 各項は `ExtendChannels` テーブルで定義した3チャンネルの積として計算する. + +### 変換行列の算出(CalcConvertMatrix) + +- 拡張行列(24×N)と目標行列(24×3)から最小二乗法(SVD分解)で変換行列(N×3)を算出する. +- `Cv2.Solve(..., DecompTypes.SVD)` を使用する. + +### 算出する変換行列の種類 + +- RGB→sRGB: カメラ RGB から sRGB への変換行列 +- RGB→XYZ: カメラ RGB から XYZ 色空間への変換行列 +- sRGB→XYZ: sRGB から XYZ 色空間への変換行列 +- 各行列は指定した次元数ぶん計算・保存される. + +### TCC参照値ファイル + +- `tcc_srgb.csv`: 24色票の標準 sRGB 値(24×3 行列) +- `tcc_xyz.csv`: 24色票の標準 XYZ 値(24×3 行列) +- アプリ起動時に読み込み,`CameraBase` に保持する. + +## 画像の色変換(ConvertImage) (Image Color Conversion) + +1. 入力画像を `CV_64FC3`(64bit浮動小数点3チャンネル)に変換する +2. 画像を1次元(ピクセル数×3)に変形(Reshape)する +3. 多項式拡張(ExtendMat)でピクセル数×N 行列にする +4. 変換行列(N×3)を右から掛けて変換後の値を得る +5. `CV_8UC3`(8bit整数)に変換して出力する + +- 変換後の値は 0〜255 の範囲に自動クリップされる(`ConvertTo` による飽和). diff --git "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" new file mode 100644 index 0000000..b7c4650 --- /dev/null +++ "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" @@ -0,0 +1,90 @@ +# テスト仕様 (Test Specification) + +## 方針 (Policy) + +リファクタリング等,挙動を変えない変更で処理が変わっていないことを確認するためのテスト仕様. + +テストの種類: + +- ビルドテスト: コンパイルエラーがないことを確認する +- 回帰テスト: リファクタリング前後の出力が一致することを確認する +- 手動テスト: 実機を使って動作を目視確認する + +## ビルドテスト (Build Test) + +全フェーズで実施する. + +**手順** + +1. Visual Studio で「ビルド」→「ソリューションのビルド」を実行する +2. エラーが0件であることを確認する +3. 警告が増加していないことを確認する(リファクタリング前の警告数を記録しておく) + +**合格条件** + +- ビルドエラーが0件 + +## 回帰テスト: 色補正処理(フェーズ2) + +リファクタリング前に基準データを作成し,リファクタリング後の出力と比較する. + +### 基準データの作成(リファクタリング前に実施) + +1. 実機でキャリブレーションを実行する +2. 保存された以下のファイルを「基準データ」として別フォルダに保管する + - `TCC_RGB.csv` ← チャート24色票のRGB値 + - `Conv_RGB-sRGB{CN}.csv` ← RGB→sRGB 変換行列 + - `Conv_RGB-XYZ{CN}.csv` ← RGB→XYZ 変換行列 + - `Conv_sRGB-XYZ{CN}.csv` ← sRGB→XYZ 変換行列 + - `TCC_sRGB{CN}.csv` ← チャートのsRGB変換値 + - `sRGB{CN}_0001.jpg` ← 撮影した sRGB 変換画像1枚 + +### 比較(リファクタリング後に実施) + +1. 同一のキャリブレーション画像・撮影条件で再度実行する + - ※ 実機でのキャリブレーション再現が困難な場合は,TCC_RGB.csv を直接入力として行列計算のみ比較する +2. 基準データと出力ファイルを比較する + +**合格条件** + +- CSV の数値が全行・全列で一致する(または浮動小数点誤差 ±1e-6 以内) +- 画像のピクセル値が全ピクセルで一致する + +## チャート検出テスト(フェーズ3) + +保存済みの実画像を入力として,チャートマスクの位置を比較する. + +### 基準データの作成(リファクタリング前に実施) + +1. キャリブレーション時に保存される `TCC_ROIs.jpg` を基準データとして保管する + - ※ TCC_ROIs.jpg はチャートの ROI マスク位置を緑色で重ねた確認画像 + +### 比較(リファクタリング後に実施) + +1. 同一条件でキャリブレーションを実行する +2. 出力された `TCC_ROIs.jpg` を基準データと目視比較する + - ※ 緑色のマスク位置が完全に一致していることを確認する + +**合格条件** + +- マスクの位置・形状が基準データと目視で一致する + +## 手動テスト(全フェーズ) + +実機を使った動作確認.フェーズごとに実施する. + +**確認項目** + +- アプリが正常に起動する +- カメラが自動で接続される(Lucam または ImagingSource) +- プレビューが表示される +- 舌診チャートを映すとキャリブレーションが自動開始される +- キャリブレーション完了後に撮影ボタンが有効になる +- 1枚撮影が正常に完了し,ファイルが保存される +- 連続撮影が正常に完了し,ファイルが保存される +- 光源の ON/OFF が切り替わる +- アプリを閉じてもエラーが出ない + +**合格条件** + +- 上記の全項目でエラー・クラッシュが発生しない diff --git "a/docs/06_TEST/TEST_02_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\347\265\220\346\236\234.md" "b/docs/06_TEST/TEST_02_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\347\265\220\346\236\234.md" new file mode 100644 index 0000000..65af726 --- /dev/null +++ "b/docs/06_TEST/TEST_02_\346\200\247\350\203\275\350\251\225\344\276\241\350\250\210\346\270\254\347\265\220\346\236\234.md" @@ -0,0 +1,137 @@ +# 性能評価計測結果 (Performance Evaluation Results) + +3 バージョン(v1.6 / v1.7 / 現行)の実機 MEMMONITOR 計測結果をまとめる.計測の目的・手段・移植方針・指標定義は [PLAN_04_性能評価計測計画](../03_PLAN/PLAN_04_性能評価計測計画.md) を参照する. + +## 計測条件 (Conditions) + +- 計測手段: 実機 MEMMONITOR(メモリ観測ウィンドウ+プレビュー計測). +- カメラ: IScam(ImagingSource DFK 23UX249). +- ビルド: `Debug|x64`,`MEMMONITOR` 有効・`WHITEBOARD` 無効. +- 副モニタ(セカンダリディスプレイ): **ON**(F9 トグルは使わず ON のまま). +- サンプリング: 500ms 間隔.メモリ主指標は `private_MB`(`Process.PrivateMemorySize64`). +- 観測窓の実行スレッド: 旧版(`bench/*`)はプレビューが毎フレーム `Invalidate()` で本体 UI スレッドを埋めるため,観測窓を**専用 UI スレッド**で開く(本体・プレビューの挙動は不変の観測側の措置.同一スレッドだとグラフ描画とサンプリングが WM_PAINT 洪水に飢餓し,サンプル間隔が乱れるため).現行はタイマー駆動で飢餓しないため同一スレッドのまま計測した. + +## 基準プロトコル (Reference Protocol) + +現行で実測した 1 本の記録を基準とし,**撮影・校正の秒数を全版で揃える**.撮影は**単発撮影(1 枚撮影)の繰り返し**. + +| 時刻 | 動作 | +| --- | --- | +| 0〜32 秒 | プレビュー放置(副モニタ ON) | +| 32.5〜36.1 秒 | 校正 1 回(処理時間 約 3.5 秒.アプリ側処理で固定) | +| 62 / 92 / 123 秒 | 単発撮影(約 30 秒間隔で 3 回) | +| 123〜303 秒 | プレビュー放置(約 180 秒.プレビュー経路リークの観測区間) | +| 303 秒 | 単発撮影 1 回 | +| 約 348 秒 | 停止・CSV 保存 | + +旧版(v1.6 / v1.7)もこの秒数・順序・撮影間隔に合わせて再現し,同じ時間軸で 3 版を重ねて比較する. + +## 現行バージョンの結果 (Current Version) + +データ: [data/perf_current.csv](data/perf_current.csv)(689 サンプル・約 348 秒). + +### メモリ(保存経路 S1・プレビュー経路 S2) + +| 指標 | 値 | +| --- | --- | +| `private_MB` アイドル時ベースライン | 約 150 MB | +| `private_MB` 校正後の定常包絡線 | 約 180〜200 MB(約 348 秒を通じて**水平**) | +| 撮影時の一時ピーク | 452〜509 MB(**1〜2 秒で ~180 MB に完全復帰**) | +| 終端(348 秒)の `private_MB` | 約 182 MB(校正後ベースラインと同一) | +| `gdi_objects` / `handle_count` | 68〜95 / 780〜855(**単調増加なし**) | + +- **リークなし=天井一定**.撮影のたびに 452〜509 MB へ跳ねるが確定的に解放され,包絡線は水平.180 秒のプレビュー放置区間でも上昇しない(プレビュー経路リーク修正の裏付け). +- グラフはのこぎり波になるが,見るべきはピーク包絡線のトレンド([PLAN_04 の「結果の読み方」](../03_PLAN/PLAN_04_性能評価計測計画.md)参照). + +### プレビュー性能(S3) + +| 指標 | 値 | +| --- | --- | +| `main_copy_ms`(FastClone コピー時間) | 大半 2.3〜2.8 ms(平均 約 2.6 ms.周期的に 5〜6 ms のスパイク) | +| `callback_fps`(ShowImage 実効レート) | 約 30(カメラレート律速) | +| 本モニタ実描画 FPS | 約 19 で一定 | +| 副モニタ実描画 FPS | **約 19 で一定(飢餓なし)** | + +- FastClone により毎フレームのコピーが約 2.6 ms. +- 校正完了後も副モニタが約 19fps を維持=両プレビューのタイマー駆動化により副モニタ描画飢餓が起きない(旧版の校正後 ≈2fps 飢餓と対比になる想定). + +### 注記(誤読を避けるため) + +- 撮影サンプル行(例 61.7 秒)で `callback_fps` ≈2.5・FPS ≈1 に落ちるのは,撮影が UI を約 1.5 秒同期ブロックし 500ms サンプラが 1 コマ捉えたもの.**1 サンプルだけの谷で即回復**=正常挙動. +- 30〜32 秒(校正直前)の一時的な FPS 低下はチャート検出の立ち上がりによる一過性のもの. + +## v1.7 の結果 (v1.7) + +データ: [data/perf_v1.7.csv](data/perf_v1.7.csv)(436 サンプル・約 315 秒).`bench/v1.7`(v1.7 に `bench/v1.6` の移植を cherry-pick.v1.7 の保存経路メモリ効率化と観測フックが両立)で基準プロトコルを再現.計測マッピングは v1.6 と同じ(`main_copy_ms ≈ 0`,全画面コピーは `sub_copy_ms`). + +v1.7 は **v1.6 + 保存経路のメモリ効率化のみ**でプレビュー経路は v1.6 と同一構造.結果もそれを裏付ける. + +| 指標 | v1.7 | (参考)v1.6 | +| --- | --- | --- | +| `private_MB` ピーク包絡線 | 30s:302 → 90s:597 →(以降)**~600〜705 MB** で高止まり | ~834→660〜893 MB | +| `private_MB` トラフ | 約 150〜296 MB | 約 140〜200 MB | +| `sub_copy_ms` | **44.9 ms** | 45.7 ms | +| `callback_fps` | **17.2** | 17.0 | +| 副モニタ FPS `sub_paint_fps` | **2.94(436 中 76 行が 0)** | 2.93(75 行が 0) | +| `gdi_objects` / `handle_count` 最大 | 136 / 889 | 122 / 889 | + +- **プレビュー性能は v1.6 と数値まで一致**(コピー ~45 ms・`callback_fps` ~17・副モニタ飢餓 ~3fps).v1.7 がプレビュー経路に手を付けていないことをデータが裏付ける. +- **メモリのピーク包絡線は v1.6 の ~890 MB → v1.7 は ~700 MB に低下**(`SaveThread` の Mat 都度 Dispose+校正時の中間 Mat 解放).ただしプレビュー経路のリークは残るため,放置区間でも上昇は続き,現行のような平坦な天井にはならない. +- ※ 本プロトコルは単発撮影のため保存経路の差(v1.6→v1.7)は控えめに出る.保存経路単体の効果は連続撮影で顕著になり,自動ベンチの [TEST_03_メモリ修正効果計測](TEST_03_メモリ修正効果計測.md) に隔離計測値がある. + +## v1.6 の結果 (v1.6) + +データ: [data/perf_v1.6.csv](data/perf_v1.6.csv)(436 サンプル・約 338 秒).`bench/v1.6`(v1.6 タグに MEMMONITOR 計測スカフォールドを観測フックのみ移植・プレビューのロジックは不変)で基準プロトコルを再現. + +### v1.6 固有の計測マッピング + +v1.6 は**本モニタが生フレームを直接使いコピーを持たない**ため `main_copy_ms ≈ 0`.毎フレームの全画面 Bitmap コピー(`new Bitmap(bmp)`=FastClone 前の実装)は**副モニタ用の `sub_copy_ms`** に現れる.FastClone 比較はこの `sub_copy_ms` で読む. + +### メモリ(保存経路・プレビュー経路) + +| 指標 | 値 | +| --- | --- | +| `private_MB` 開始ベースライン | 約 200 MB | +| `private_MB` ピーク包絡線(30 秒バケットの最大) | 30s:276 → 60s:539 → 90s:**834** MB と上昇し,以降 660〜893 MB で高止まり・大振動 | +| `private_MB` トラフ(谷) | 約 140〜200 MB(GC+ファイナライザによる周期的一掃) | +| `gdi_objects` / `handle_count` 最大 | 122 / 889(暴走なし) | + +- **リークあり=右肩上がり後に高止まり**.開始 ~200 MB から 90 秒で ~834 MB まで上昇し,以降 140〜890 MB で大きく振動する(毎フレーム `new Bitmap`=原因1,副モニタ取りこぼしフレームの未 Dispose=原因2/3 が積み上がり,GC+ファイナライザが周期的にネイティブメモリを一掃するのこぎり波).現行の平坦な ~200 MB 天井と対照的. +- GDI/ハンドルは暴走しておらず,原因はネイティブ画素バッファ(メモリ)であることを裏付ける(ハンドル枯渇ではない). + +### プレビュー性能 + +| 指標 | 値 | +| --- | --- | +| `sub_copy_ms`(`new Bitmap` 全画面コピー) | **平均 45.7 ms**(425 フレーム平均) | +| `main_copy_ms` | 0(v1.6 本モニタはコピーなし) | +| `callback_fps`(ShowImage 実効レート) | 平均 17(最小 ~2) | +| 副モニタ実描画 FPS `sub_paint_fps` | **平均 2.9(436 中 75 行が 0)=描画飢餓** | + +- 全画面コピーが **~46 ms** と重く,コールバックスレッドを律速して `callback_fps` を ~17 に抑える. +- 副モニタは `sub_paint_fps` ≈3(しばしば 0)で**ほとんど描画されない**=PLAN_03 の副モニタ描画飢餓が旧版で実証された. + +## 3 版比較 (Comparison) + +3 版すべてを同一基準プロトコル(副モニタ ON)で計測した結果. + +| 指標 | **v1.6** | **v1.7** | **現行** | +| --- | --- | --- | --- | +| メモリ `private_MB` 包絡線 | ~200→**834** MB,140〜890 MB で振動 | ~200→**~700** MB,150〜705 MB で振動 | **~180〜200 MB で水平**(撮影時のみ一時 ~450→即復帰) | +| 毎フレーム全画面コピー | `sub_copy_ms` **~46 ms**(`new Bitmap`) | **~45 ms**(同上) | **~2.6 ms**(FastClone) | +| `callback_fps` | ~17(コピー律速) | ~17(同上) | ~30 | +| 副モニタ FPS `sub_paint_fps` | **~3(しばしば 0)=飢餓** | **~3(同上)** | ~19 で一定 | +| GDI / handle 最大 | 122 / 889 | 136 / 889 | 同程度(枯渇なし) | + +### 切り分けの結論 (Conclusion) + +改善は 2 経路・2 段階で起きたことが定量的に確認できた. + +- **保存経路(メモリ)は v1.6 → v1.7 で改善**: ピーク包絡線が ~890 MB → ~700 MB に低下(`SaveThread`/校正の Mat 解放).単発撮影プロトコルのため差は控えめだが方向は明確(連続撮影での隔離値は TEST_03). +- **プレビュー経路は v1.7 → 現行で改善**: コピー ~45 ms → ~2.6 ms(FastClone,約 18 倍),`callback_fps` ~17 → ~30,副モニタ ~3fps(飢餓)→ ~19fps,メモリ包絡線 ~700 MB(上昇)→ ~200 MB(平坦・リーク解消).v1.6/v1.7 のプレビュー指標が数値まで一致することが,この経路が v1.7 まで未修正だった裏付けになる. +- GDI/ハンドルはどの版も暴走せず,メモリ問題の原因がネイティブ画素バッファ(ハンドル枯渇ではない)であることを 3 版で一貫して確認. + +## 関連 (Related) + +- 計測計画・指標定義・移植方針: [PLAN_04_性能評価計測計画](../03_PLAN/PLAN_04_性能評価計測計画.md). +- 自動ベンチによるメモリ計測(別手段・参考): [TEST_03_メモリ修正効果計測](TEST_03_メモリ修正効果計測.md). diff --git "a/docs/06_TEST/TEST_03_\343\203\241\343\203\242\343\203\252\344\277\256\346\255\243\345\212\271\346\236\234\350\250\210\346\270\254.md" "b/docs/06_TEST/TEST_03_\343\203\241\343\203\242\343\203\252\344\277\256\346\255\243\345\212\271\346\236\234\350\250\210\346\270\254.md" new file mode 100644 index 0000000..4489ba2 --- /dev/null +++ "b/docs/06_TEST/TEST_03_\343\203\241\343\203\242\343\203\252\344\277\256\346\255\243\345\212\271\346\236\234\350\250\210\346\270\254.md" @@ -0,0 +1,80 @@ +# メモリ修正効果の計測結果(PLAN_02 優先度2) (Memory Fix Effect Measurement) + +: 2026-06-23 +対象: PLAN_02 優先度2「`ColorCorrector.ConvertImage` の中間 Mat 未 Dispose(OOM リーク)」修正 +計測者: 自動ベンチ(NUnit、ヘッドレス実行・カメラ実機不要) + +## 目的 (Purpose) + +修正前(中間 Mat を解放しない=旧実装)と修正後(入れ子 `using` で解放)で、連続処理時のメモリ使用量の「増え方」がどれだけ変わるかを同一条件で定量比較する。 + +## 方法 (Method) + +- ベンチ: `TIASshot.Tests/ConvertImageMemoryBenchmark.cs`(`[Explicit]`)。 + - 修正後 = 実コード `ColorCorrector.ConvertImage`(using 版)。 + - 修正前 = 旧実装を忠実に再現(`flatten`/`extended`/`converted`/`convertedImage` を解放しない)。 + - 同一画像を N 回反復し、各反復後に `Process.PrivateMemorySize64` / `WorkingSet64` をサンプリング。 +- 指標: Mat はネイティブメモリのため `GC.GetTotalMemory` では捕捉できない → `PrivateMemorySize64`(コミット量)を主指標とする。 +- 計測ループ中は GC を強制しない(本番のリーク機序を再現するため)。物理メモリ枯渇を防ぐ打ち切り上限ガード付き。 +- 実行環境: x64 / .NET Framework 4.8 / 物理メモリ 16 GB。 + +## 結果 (Results) + +### 条件A: IScam フルスケール(2440×1840・17ch・40 回) + +| 指標 | 修正前(リーク) | 修正後(using) | +| --- | --- | --- | +| Private baseline | 0.05 GB | 0.05 GB | +| Private peak | **2.83 GB** | **0.62 GB** | +| 増分 (peak−base) | 2.78 GB | 0.57 GB | +| 1 回あたり平均増分 | **71 MB/回** | **15 MB/回** | +| 推移 | 0.82→1.49→2.16→2.83 GB と階段状に上昇 | 全 40 回 0.62 GB で一定 | + +→ 修正後の増分は修正前の **約 20%**。 + +### 条件B: 小サイズ・多反復(900×700・17ch・60 回) + +| 指標 | 修正前(リーク) | 修正後(using) | +| --- | --- | --- | +| Private peak | **0.53 GB** | **0.13 GB** | +| 増分 (peak−base) | 0.48 GB | 0.08 GB | +| 1 回あたり平均増分 | **8 MB/回** | **1 MB/回** | +| 推移 | 反復に伴い増加(0.16→0.44→0.53 GB) | 全 60 回 0.13 GB で一定 | + +→ 修正後の増分は修正前の **約 17%**。 + +### 条件C: 連続撮影フロー再現(フルスケール・2440×1840・channels 4/10/17・8 フレーム) + +`ContinuousShootMemoryBenchmark`(`BlockingCollection` の生産者-消費者・1 フレーム複数チャンネル変換・フレームバッファを合成フレームで構造再現)での計測。単体反復でなく「実機の連続撮影に近いフロー」での結果。 + +| 指標 | 修正前(リーク) | 修正後(using) | +| --- | --- | --- | +| Private peak | **2.60 GB** | **0.92 GB** | +| 増分 (peak−base) | 2.55 GB | 0.87 GB | +| **1 フレームあたり増分** | **326 MB/frame** | **112 MB/frame** | +| WorkingSet peak | 2.47 GB | 0.92 GB | + +→ 修正後の増分は修正前の **約 34%**。修正前は 1 フレームごとに約 326 MB 積み上がる(フレーム数を増やせば打ち切り上限=OOM へ)。修正後は約 0.9 GB で頭打ち(処理中の一時ピークで蓄積なし)。修正後の per-frame 112 MB は主に「保持中フレーム+処理中の一時メモリ」で,反復しても天井は一定. + +## 解釈 (Interpretation) + +- **修正後は反復しても増えない**(peak の天井が一定=蓄積ゼロ)。各呼び出しで中間 Mat が確定的に解放される。 +- **修正前は反復に伴いメモリが増える**(1 回あたり数十 MB〜)。本番は IScam 17ch × 複数フレームを `SaveThread` で高速に回すため、ファイナライザの回収が追いつかず確保が先行 → OOM クラッシュに至る(PLAN_02 の症状)。 +- 修正前のグラフが滑らかでなく**階段状/のこぎり波**になるのは、OpenCvSharp が GC にメモリ圧を通知し、未解放でも GC+ファイナライザが周期的にネイティブメモリを一掃するため。見るべきは振れ幅でなく**ピーク包絡線のトレンド**(修正後=水平、修正前=上昇)。 + +## 限界・補足 (Limitations) + +- 条件A/B は `ConvertImage` 単体の隔離計測。条件C は連続撮影フローを**構造再現**したもので、生産者-消費者スレッディング・多チャンネル・フレームバッファを含むが、**カメラ取得部のみ合成フレームに差し替えた再現**であり本番メソッド(`Shot`/`RunShotLoop`/`SaveThread`)そのものの呼び出しではない。実フレームレート・実カメラ・ファイル I/O(既定 OFF)までは含まない。実使用そのものの挙動は、`MEMMONITOR` ビルドのメモリ観測ウィンドウ+実機撮影の録画で別途確認する。 +- 優先度5(Clear 時の未 Dispose)は未修正のため本対比の対象外(修正前/後どちらの変種にも同じだけ含まれ、差分には現れない)。 + +## 再現方法 (Reproduction) + +```powershell +# テストプロジェクトを Debug|x64 でビルド後 +$vstest = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\TestPlatform\vstest.console.exe" +$dll = "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" +$env:BENCH_WIDTH="2440"; $env:BENCH_HEIGHT="1840"; $env:BENCH_CHANNEL="17"; $env:BENCH_FRAMES="40"; $env:BENCH_CEILING_GB="10" +& $vstest $dll /Platform:x64 /Framework:".NETFramework,Version=v4.8" /Tests:Compare_LeakyVsFixed_MemoryUsage /logger:"console;verbosity=normal" +``` + +※ スケールは環境変数 `BENCH_WIDTH/HEIGHT/CHANNEL/FRAMES/CEILING_GB` で調整可。 diff --git a/docs/06_TEST/data/perf_current.csv b/docs/06_TEST/data/perf_current.csv new file mode 100644 index 0000000..459b22f --- /dev/null +++ b/docs/06_TEST/data/perf_current.csv @@ -0,0 +1,688 @@ +elapsed_sec,private_MB,ws_MB,callback_fps,main_paint_fps,sub_update_fps,sub_paint_fps,sub_drop_fps,sub_paint_ms,main_copy_ms,sub_copy_ms,gdi_objects,user_objects,handle_count,img_w,img_h,sub_shown,event +1.170,152.70,172.42,25.64,0.85,23.93,0.85,22.22,19.025,4.196,3.873,70,88,768,1136,1528,1, +1.588,153.70,174.64,26.29,7.17,26.29,9.56,16.73,29.364,3.734,4.596,70,88,768,1136,1528,1, +2.049,155.66,177.09,23.86,15.19,26.03,13.02,13.02,31.662,4.324,4.144,70,89,768,1136,1528,1, +2.560,155.41,173.46,25.45,13.70,25.45,13.70,11.75,30.306,3.839,3.791,68,88,762,1136,1528,1, +3.056,156.36,174.10,24.19,12.09,24.19,16.12,8.06,30.039,4.559,3.773,68,88,762,1136,1528,1, +3.538,155.17,176.20,24.89,16.60,24.89,14.52,10.37,28.935,3.802,4.196,68,87,762,1136,1528,1, +4.061,147.75,167.56,26.76,13.38,26.76,15.29,11.47,29.067,3.791,3.624,68,87,762,1136,1528,1, +4.599,150.23,172.12,24.19,13.03,24.19,16.75,7.44,29.464,3.928,3.703,68,87,762,1136,1528,1, +5.065,157.78,174.77,27.91,15.03,25.77,15.03,10.74,28.983,4.095,3.825,68,87,762,1136,1528,1, +5.565,146.05,168.34,25.98,15.99,27.98,13.99,13.99,29.534,4.180,4.328,68,87,762,1136,1528,1, +6.064,154.25,176.74,26.07,12.03,24.06,18.05,6.02,28.667,4.023,3.531,68,87,762,1136,1528,1, +6.528,155.37,174.54,25.83,15.07,25.83,15.07,10.76,29.231,3.263,4.575,68,87,762,1136,1528,1, +7.073,156.96,179.38,25.69,14.68,27.52,14.68,12.84,30.062,3.344,3.927,68,87,762,1136,1528,1, +7.557,154.78,172.27,26.88,14.48,26.88,16.54,10.34,27.622,4.246,3.669,68,87,762,1136,1528,1, +8.039,152.77,173.30,24.91,16.60,24.91,14.53,10.38,27.980,4.051,4.115,68,87,762,1136,1528,1, +8.538,158.39,180.29,28.05,14.02,28.05,16.03,12.02,28.752,3.944,3.610,68,87,762,1136,1528,1, +9.067,147.46,169.12,26.45,15.11,26.45,13.23,13.23,30.397,3.680,3.653,68,87,761,1136,1528,1, +9.542,146.93,163.78,27.35,14.73,27.35,14.73,12.62,29.623,3.857,3.421,68,87,762,1136,1528,1, +10.052,147.68,166.56,27.44,13.72,27.44,15.68,11.76,30.273,3.530,3.888,68,87,762,1136,1528,1, +10.561,152.07,174.16,27.51,15.72,27.51,15.72,11.79,28.182,3.909,3.754,68,87,762,1136,1528,1, +11.070,152.66,170.35,27.54,15.74,27.54,13.77,13.77,28.760,3.742,3.707,68,87,762,1136,1528,1, +11.559,155.12,172.59,26.56,14.30,26.56,16.35,10.22,27.704,3.852,3.887,68,87,762,1136,1528,1, +12.077,154.94,172.85,27.03,15.45,27.03,15.45,11.59,30.226,3.455,4.172,68,87,764,1136,1528,1, +12.582,153.80,173.41,27.72,15.84,25.74,13.86,11.88,29.184,4.040,3.815,68,87,764,1136,1528,1, +13.078,154.91,177.21,26.19,14.10,28.20,14.10,14.10,30.770,4.166,3.753,68,87,764,1136,1528,1, +13.596,151.60,173.80,27.06,13.53,27.06,15.46,11.60,31.572,3.918,4.177,68,87,764,1136,1528,1, +14.070,154.82,177.22,27.40,14.75,27.40,14.75,12.65,28.613,3.394,3.156,68,87,764,1136,1528,1, +14.575,154.68,176.41,27.72,15.84,27.72,13.86,13.86,30.587,3.404,3.655,68,87,764,1136,1528,1, +15.049,158.00,180.50,27.46,14.79,25.35,14.79,10.56,29.049,3.967,4.363,68,87,764,1136,1528,1, +15.573,159.68,180.13,26.71,17.17,28.61,15.26,13.35,27.946,3.434,3.662,68,87,764,1136,1528,1, +16.063,148.77,168.08,26.54,14.29,26.54,14.29,12.25,29.800,3.437,3.756,68,87,764,1136,1528,1, +16.573,154.71,176.99,27.42,13.71,27.42,15.67,11.75,29.329,4.066,4.153,68,87,764,1136,1528,1, +17.062,154.77,173.23,26.58,14.31,26.58,14.31,12.27,30.424,3.967,4.035,68,87,764,1136,1528,1, +17.558,155.46,175.81,26.25,16.15,26.25,14.13,12.11,29.549,4.207,4.461,68,87,764,1136,1528,1, +18.056,159.20,181.71,26.09,14.05,26.09,16.06,10.04,28.966,3.781,3.701,68,87,764,1136,1528,1, +18.607,160.44,181.56,27.20,14.51,27.20,14.51,12.69,30.537,3.821,3.242,68,87,764,1136,1528,1, +19.101,158.79,177.89,26.34,16.21,26.34,14.18,12.16,28.379,4.071,3.366,68,87,764,1136,1528,1, +19.561,158.01,176.98,28.26,15.22,26.09,15.22,10.87,28.319,3.462,3.952,68,87,764,1136,1528,1, +20.092,148.82,168.95,26.37,15.07,28.25,15.07,13.18,30.631,3.545,3.748,68,87,764,1136,1528,1, +20.554,155.46,177.52,28.12,15.14,28.12,15.14,12.98,30.203,4.295,4.150,68,87,764,1136,1528,1, +21.085,158.78,177.80,28.28,13.20,26.40,15.08,11.31,31.270,3.669,3.670,68,87,764,1136,1528,1, +21.592,148.07,167.60,25.62,15.76,27.59,13.79,13.79,30.165,3.533,3.535,68,87,764,1136,1528,1, +22.073,148.06,170.48,27.03,14.55,27.03,14.55,12.47,29.055,4.217,3.773,68,87,764,1136,1528,1, +22.588,153.80,171.96,27.20,13.60,27.20,15.54,11.66,29.194,4.295,3.626,68,87,764,1136,1528,1, +23.099,147.95,169.27,29.32,15.64,27.37,13.68,13.68,29.824,4.256,3.847,68,87,764,1136,1528,1, +23.566,153.84,175.89,27.87,15.01,27.87,15.01,12.86,28.429,4.188,4.128,68,87,764,1136,1528,1, +24.083,152.23,173.54,25.16,13.55,27.10,15.48,11.61,29.894,3.659,4.661,68,87,764,1136,1528,1, +24.612,148.88,169.65,24.56,15.12,24.56,15.12,9.45,28.827,4.455,3.458,68,87,764,1136,1528,1, +25.048,148.01,168.63,25.21,16.04,25.21,13.75,11.46,28.896,3.959,4.410,68,87,764,1136,1528,1, +25.581,153.86,172.09,28.13,15.00,28.13,15.00,13.13,29.458,3.579,4.157,68,87,763,1136,1528,1, +26.096,157.72,177.64,27.18,15.53,27.18,15.53,11.65,28.267,3.647,3.469,68,87,764,1136,1528,1, +26.546,151.32,172.65,26.72,13.36,26.72,15.58,11.13,30.908,3.954,4.191,68,87,764,1136,1528,1, +27.081,156.82,178.24,26.17,14.95,26.17,14.95,11.21,29.245,3.694,4.011,68,87,764,1136,1528,1, +27.583,153.85,173.13,25.87,15.92,25.87,13.93,11.94,28.512,3.923,4.164,68,87,764,1136,1528,1, +28.079,158.86,179.65,28.25,14.12,28.25,16.14,12.11,29.298,3.433,3.866,68,87,764,1136,1528,1, +28.577,157.25,179.28,26.07,16.04,26.07,14.04,12.03,28.381,4.400,4.024,68,87,764,1136,1528,1, +29.091,149.62,171.87,25.33,13.64,25.33,15.59,9.74,30.653,3.769,3.885,68,87,764,1136,1528,1, +29.573,157.89,179.07,22.80,14.51,22.80,14.51,8.29,28.965,3.502,3.913,68,87,764,1136,1528,1, +30.092,153.20,171.05,15.42,13.49,15.42,13.49,3.85,30.024,3.594,4.170,70,88,767,1136,1528,1, +30.577,153.44,172.75,14.44,14.44,14.44,12.38,0.00,27.893,2.928,3.985,70,88,774,1136,1528,1, +31.057,172.67,194.99,16.64,14.56,16.64,14.56,2.08,28.685,3.032,2.781,68,87,781,1136,1528,1, +31.581,156.09,174.95,15.28,15.28,15.28,15.28,0.00,26.230,3.404,3.825,68,87,790,1136,1528,1, +32.033,177.88,200.07,8.84,8.84,8.84,8.84,2.21,27.080,4.553,2.745,68,87,765,1136,1528,1, +32.535,204.91,225.00,29.89,13.95,29.89,13.95,13.95,22.704,3.224,2.894,70,88,769,1136,1528,1,CALIB_START +33.040,209.90,227.37,31.69,19.80,29.71,19.80,11.88,21.093,4.885,2.943,70,88,769,1136,1528,1, +33.584,204.92,227.20,29.39,20.21,31.23,18.37,11.02,21.026,5.599,3.065,68,87,769,1136,1528,1, +34.037,206.30,226.62,30.97,19.91,28.76,19.91,8.85,21.917,4.239,5.035,68,87,766,1136,1528,1, +34.553,201.33,223.62,29.04,19.36,30.98,19.36,11.62,21.355,4.183,5.371,68,87,766,1136,1528,1, +35.078,206.30,228.59,30.48,19.05,28.58,20.96,9.53,20.871,3.500,5.058,68,87,766,1136,1528,1, +35.529,196.47,219.15,17.74,13.30,19.95,13.30,6.65,20.960,3.260,6.143,68,87,767,1136,1528,1, +36.055,200.63,224.75,28.54,13.32,28.54,11.42,15.22,23.268,3.497,3.502,74,93,855,1136,1528,1,CALIB_END +36.564,202.26,225.73,29.42,19.61,29.42,19.61,9.81,20.997,2.524,3.757,74,93,855,1136,1528,1, +37.034,217.19,241.29,31.93,19.16,29.80,21.28,8.51,21.055,2.399,3.088,72,92,855,1136,1528,1, +37.546,195.62,219.84,29.30,19.53,31.25,19.53,11.72,22.215,2.368,2.957,72,91,826,1136,1528,1, +38.072,195.62,219.84,30.45,20.94,30.45,19.03,11.42,21.252,2.376,2.324,72,91,826,1136,1528,1, +38.537,195.62,219.84,30.09,19.34,30.09,19.34,10.74,21.470,2.372,2.348,72,91,826,1136,1528,1, +39.047,195.62,219.84,29.41,19.61,29.41,19.61,9.80,22.145,2.504,2.494,72,91,826,1136,1528,1, +39.570,195.63,219.86,30.62,19.14,30.62,21.05,9.57,21.938,2.454,2.531,72,91,826,1136,1528,1, +40.027,207.20,229.21,30.57,19.65,28.39,19.65,10.92,21.355,2.457,2.402,72,91,826,1136,1528,1, +40.542,195.62,219.86,29.13,21.36,31.07,19.42,9.71,20.603,2.350,2.357,72,91,826,1136,1528,1, +41.058,202.23,226.24,29.12,19.41,29.12,21.35,9.71,20.533,2.290,2.371,72,91,826,1136,1528,1, +41.564,195.62,219.87,31.58,21.71,31.58,19.74,9.87,20.755,2.531,2.473,72,91,826,1136,1528,1, +42.045,195.62,219.87,29.09,18.70,29.09,20.78,8.31,19.565,2.292,2.319,72,91,826,1136,1528,1, +42.576,195.62,219.87,30.15,20.73,30.15,18.84,11.31,22.997,2.535,2.965,72,91,826,1136,1528,1, +43.073,195.62,219.87,30.19,20.13,30.19,20.13,10.06,21.874,2.544,2.419,72,91,826,1136,1528,1, +43.546,195.62,219.87,29.59,19.02,29.59,21.13,8.45,20.182,2.610,2.416,72,91,826,1136,1528,1, +44.068,195.62,219.87,30.67,19.17,30.67,19.17,11.50,21.366,2.697,2.483,72,91,826,1136,1528,1, +44.570,195.63,219.87,29.85,21.89,29.85,19.90,9.95,20.418,2.612,2.394,72,91,826,1136,1528,1, +45.048,195.62,219.87,29.34,18.86,29.34,20.95,8.38,20.283,2.640,2.464,72,91,826,1136,1528,1, +45.557,195.62,219.87,31.43,19.64,31.43,19.64,11.79,20.409,2.633,2.719,72,91,826,1136,1528,1, +46.073,190.64,214.91,29.08,21.32,29.08,19.38,9.69,20.530,2.616,2.875,72,91,825,1136,1528,1, +46.555,212.18,236.41,31.09,18.65,29.02,20.73,8.29,22.725,2.692,2.714,72,91,826,1136,1528,1, +47.082,195.63,219.88,28.47,17.08,30.37,15.18,15.18,26.757,3.065,3.013,72,91,826,1136,1528,1, +47.597,195.63,219.88,31.05,15.52,31.05,15.52,15.52,28.369,3.702,3.697,72,91,826,1136,1528,1, +48.084,212.18,236.41,26.70,12.32,24.65,14.38,10.27,26.977,3.759,3.696,72,91,826,1136,1528,1, +48.593,195.62,219.88,27.55,15.74,29.51,11.81,17.71,25.976,3.891,3.745,72,91,826,1136,1528,1, +49.074,212.18,232.76,31.19,16.63,29.11,18.71,10.40,24.096,3.257,3.178,72,91,826,1136,1528,1, +49.546,212.18,236.41,29.63,21.17,29.63,19.05,10.58,21.916,3.712,2.608,72,91,826,1136,1528,1, +50.069,207.28,228.72,28.68,19.12,30.59,21.03,9.56,20.535,4.886,2.696,72,91,826,1136,1528,1, +50.587,195.69,219.94,30.86,19.29,30.86,19.29,11.57,23.472,5.960,3.134,72,91,826,1136,1528,1, +51.049,195.69,219.94,30.34,19.50,30.34,19.50,10.83,21.323,5.349,4.130,72,91,826,1136,1528,1, +51.560,195.69,219.94,29.37,21.54,29.37,19.58,9.79,20.132,3.599,5.487,72,91,826,1136,1528,1, +52.081,195.69,219.95,30.68,19.17,30.68,21.09,9.59,19.903,3.330,5.009,72,91,826,1136,1528,1, +52.553,195.69,219.95,29.70,21.22,29.70,19.09,10.61,20.233,2.858,4.522,72,91,826,1136,1528,1, +53.059,190.71,214.98,29.59,19.73,29.59,19.73,9.86,21.153,2.498,3.940,72,91,826,1136,1528,1, +53.588,195.70,219.96,30.29,18.93,30.29,20.82,9.46,21.951,2.655,3.947,72,91,826,1136,1528,1, +54.091,202.31,221.31,29.80,19.87,29.80,19.87,9.93,20.721,2.654,3.032,72,91,826,1136,1528,1, +54.562,212.32,231.58,31.85,19.11,29.72,19.11,10.62,22.307,2.516,2.788,72,91,826,1136,1528,1, +55.082,195.77,219.97,28.87,19.25,30.80,19.25,11.55,21.232,2.402,2.777,72,91,826,1136,1528,1, +55.594,207.35,229.75,31.20,21.45,29.25,19.50,9.75,20.283,2.365,2.706,72,91,826,1136,1528,1, +56.066,207.21,229.17,29.66,19.07,31.78,21.19,10.59,19.539,2.436,2.473,72,91,816,1136,1528,1, +56.584,195.41,219.77,28.99,21.26,28.99,19.33,9.66,20.499,2.280,2.302,72,91,815,1136,1528,1, +57.101,195.41,219.77,30.94,19.34,30.94,21.27,9.67,21.965,2.401,2.394,72,91,816,1136,1528,1, +57.570,195.41,219.77,29.83,19.17,29.83,19.17,10.65,22.408,2.530,2.468,72,92,816,1136,1528,1, +58.074,195.42,219.78,29.80,19.86,29.80,17.88,11.92,21.231,2.508,2.380,72,92,816,1136,1528,1, +58.589,202.02,225.86,29.13,19.42,29.13,21.36,9.71,20.650,2.446,2.346,72,91,811,1136,1528,1, +59.059,206.95,231.33,31.87,19.12,29.75,19.12,10.62,21.784,2.525,2.501,72,91,801,1136,1528,1, +59.577,195.36,219.77,28.98,19.32,30.91,19.32,9.66,19.253,2.398,2.548,72,91,801,1136,1528,1, +60.111,195.37,219.83,29.95,18.72,29.95,18.72,11.23,21.978,2.795,2.906,73,92,801,1136,1528,1, +61.730,452.50,452.84,2.47,0.62,2.47,0.62,1.85,28.167,2.855,3.360,79,95,833,1136,1528,1,SHOT_START;SHOT_END +62.148,243.48,239.93,31.09,14.35,28.70,14.35,14.35,27.824,3.075,3.602,80,94,836,1136,1528,1, +62.585,226.84,227.71,29.71,18.28,32.00,18.28,13.71,23.491,2.984,3.036,80,93,811,1136,1528,1, +63.094,226.84,227.71,29.50,19.66,29.50,19.66,9.83,21.115,3.127,2.750,78,93,811,1136,1528,1, +63.601,233.56,231.12,29.56,21.68,29.56,19.71,9.85,21.008,4.877,2.609,78,93,811,1136,1528,1, +64.079,238.54,239.36,31.38,18.83,29.29,20.92,10.46,19.970,5.971,3.050,74,92,811,1136,1528,1, +64.588,226.96,227.80,29.45,21.60,31.41,19.63,9.82,21.419,5.082,3.697,74,92,811,1136,1528,1, +65.107,238.54,237.09,30.89,19.30,28.96,21.23,9.65,20.598,3.854,5.372,74,92,811,1136,1528,1, +65.585,226.96,227.81,29.24,20.89,31.33,18.80,10.44,21.358,3.270,5.479,74,92,811,1136,1528,1, +66.095,233.64,234.11,29.40,19.60,29.40,21.56,7.84,20.172,3.366,5.385,74,92,811,1136,1528,1, +66.607,227.05,227.89,31.29,21.51,31.29,19.55,11.73,20.212,2.748,3.840,74,92,811,1136,1528,1, +67.086,227.04,227.89,29.24,18.80,29.24,20.89,8.36,21.083,2.650,3.396,74,92,811,1136,1528,1, +67.599,238.63,234.98,31.16,21.43,29.22,19.48,9.74,21.242,2.666,3.188,74,92,811,1136,1528,1, +68.123,228.73,225.22,28.61,19.07,30.52,19.07,11.44,20.486,2.451,2.651,74,91,811,1136,1528,1, +68.632,227.11,227.96,31.43,19.64,31.43,19.64,11.79,21.997,2.374,2.754,74,91,811,1136,1528,1, +69.145,227.08,227.94,29.24,19.50,29.24,19.50,9.75,22.242,2.472,2.652,74,91,811,1136,1528,1, +69.659,243.63,243.75,31.12,19.45,29.17,21.39,7.78,20.542,2.345,2.592,74,91,811,1136,1528,1, +70.127,238.73,238.20,29.95,19.25,29.95,19.25,12.83,21.398,2.377,2.593,74,91,811,1136,1528,1, +70.631,243.70,244.51,29.78,21.84,29.78,19.85,7.94,20.571,2.437,2.396,74,91,811,1136,1528,1, +71.162,227.14,227.98,30.12,18.82,32.00,20.71,11.29,22.195,2.419,2.498,74,91,811,1136,1528,1, +71.625,238.72,239.54,30.24,21.60,28.08,19.44,8.64,20.268,2.279,2.423,74,91,811,1136,1528,1, +72.134,180.59,181.58,29.48,19.65,31.44,19.65,11.79,21.136,2.532,2.487,74,91,811,1136,1528,1, +72.653,182.21,181.91,28.90,19.27,28.90,21.20,9.63,20.340,2.269,2.323,74,91,811,1136,1528,1, +73.126,192.18,193.14,31.72,19.03,29.60,19.03,10.57,23.896,2.623,2.708,74,91,811,1136,1528,1, +73.636,180.59,181.58,29.40,19.60,31.36,19.60,9.80,20.750,2.528,2.574,74,91,811,1136,1528,1, +74.151,182.22,180.20,29.13,21.37,29.13,19.42,9.71,21.078,2.283,2.422,74,91,806,1136,1528,1, +74.632,180.59,181.58,31.15,18.69,31.15,20.76,10.38,22.229,2.446,2.502,74,91,806,1136,1528,1, +75.140,180.59,181.58,29.53,19.69,29.53,19.69,9.84,21.209,2.527,2.560,74,91,805,1136,1528,1, +75.625,180.60,181.58,30.92,20.61,30.92,18.55,12.37,20.709,2.384,2.375,74,91,806,1136,1528,1, +76.154,180.66,181.59,30.25,18.90,30.25,20.79,9.45,21.443,2.475,2.432,74,91,806,1136,1528,1, +76.659,180.66,181.59,29.72,19.81,29.72,19.81,9.91,21.176,2.709,2.456,74,91,806,1136,1528,1, +77.167,180.66,181.59,29.51,19.67,29.51,19.67,9.84,21.422,2.771,2.456,74,91,806,1136,1528,1, +77.653,180.66,181.59,30.89,20.59,30.89,18.53,12.35,21.974,2.755,2.671,74,91,806,1136,1528,1, +78.157,180.67,181.64,29.75,19.84,29.75,19.84,9.92,21.947,2.850,2.794,74,91,806,1136,1528,1, +78.678,192.25,188.29,30.74,19.21,28.82,21.13,9.61,21.860,2.861,2.844,74,91,806,1136,1528,1, +79.137,187.26,188.16,28.30,19.59,30.47,19.59,8.71,20.024,2.868,2.848,74,91,806,1136,1528,1, +79.657,180.66,181.64,30.76,21.15,30.76,19.23,11.54,21.385,3.180,3.120,74,91,806,1136,1528,1, +80.168,182.29,182.19,29.36,19.57,29.36,19.57,9.79,21.069,3.934,2.709,74,91,806,1136,1528,1, +80.648,187.26,181.71,31.25,18.75,31.25,20.84,10.42,20.879,5.741,2.870,74,91,806,1136,1528,1, +81.159,180.66,181.64,29.36,19.58,29.36,19.58,9.79,19.697,5.234,3.622,74,91,806,1136,1528,1, +81.673,187.07,186.64,29.17,19.44,29.17,19.44,9.72,20.599,3.950,4.968,74,91,806,1136,1528,1, +82.145,180.47,181.54,31.81,19.08,31.81,16.96,14.84,21.650,3.977,4.569,74,91,806,1136,1528,1, +82.670,197.02,196.67,30.46,19.04,28.55,19.04,9.52,21.569,2.477,5.355,74,91,806,1136,1528,1, +83.143,180.46,181.54,29.62,19.04,31.73,19.04,12.69,20.818,2.760,3.839,74,91,806,1136,1528,1, +83.670,192.05,193.11,30.36,18.97,28.46,18.97,9.49,21.429,3.079,2.858,74,91,806,1136,1528,1, +84.192,187.07,182.68,28.74,15.33,30.66,17.25,13.41,26.875,2.908,5.793,74,91,806,1136,1528,1, +84.699,192.11,193.11,31.56,17.75,29.58,15.78,13.81,24.948,2.832,3.347,74,91,806,1136,1528,1, +85.156,182.15,178.56,28.46,19.71,30.65,19.71,10.95,20.719,3.129,2.639,74,92,806,1136,1528,1, +85.673,180.52,181.55,30.92,19.32,30.92,19.32,11.59,23.273,2.871,2.903,74,91,806,1136,1528,1, +86.194,197.08,193.86,30.74,19.21,28.82,21.13,7.68,20.783,2.452,2.795,74,91,806,1136,1528,1, +86.664,197.09,195.74,29.79,19.15,31.92,19.15,12.77,21.204,2.604,2.953,74,91,806,1136,1528,1, +87.183,180.53,181.55,28.90,19.27,28.90,19.27,9.63,21.286,2.668,2.764,74,91,806,1136,1528,1, +87.691,187.14,186.43,29.52,19.68,29.52,19.68,11.81,21.335,2.469,2.568,74,91,806,1136,1528,1, +88.160,192.11,193.11,31.95,21.30,29.82,19.17,8.52,20.722,2.565,2.601,74,91,806,1136,1528,1, +88.679,180.52,181.55,28.91,19.27,30.84,19.27,11.56,20.297,2.494,2.509,74,91,806,1136,1528,1, +89.186,187.13,186.24,29.58,19.72,29.58,19.72,9.86,21.491,2.481,2.513,74,91,806,1136,1528,1, +89.658,197.09,198.08,31.82,19.09,29.70,21.22,8.49,21.673,2.636,2.625,74,91,806,1136,1528,1, +90.184,187.13,185.55,28.49,19.00,30.39,19.00,11.40,20.712,2.394,2.425,80,94,806,1136,1528,1, +91.759,457.90,458.23,2.54,1.27,2.54,1.27,1.27,22.834,2.383,2.559,84,95,836,1136,1528,1,SHOT_START;SHOT_END +92.199,238.93,246.30,29.51,15.89,29.51,15.89,13.62,24.377,5.024,4.188,85,94,842,1136,1528,1, +92.664,233.87,240.88,30.17,19.39,30.17,19.39,10.77,21.412,2.536,5.851,85,93,817,1136,1528,1, +93.194,233.86,239.35,30.14,18.84,30.14,18.84,11.30,22.500,2.807,4.648,79,94,817,1136,1528,1, +93.685,227.26,234.70,30.57,20.38,30.57,18.34,12.23,21.104,2.452,3.296,79,93,817,1136,1528,1, +94.154,227.27,234.72,29.83,19.18,29.83,19.18,10.65,20.100,2.580,3.244,75,92,817,1136,1528,1, +94.671,227.26,234.72,30.97,19.35,30.97,21.29,9.68,20.619,2.925,2.455,75,92,817,1136,1528,1, +95.194,238.85,246.28,28.67,19.11,28.67,19.11,9.56,20.104,2.626,2.391,75,92,817,1136,1528,1, +95.657,233.87,237.92,30.26,19.45,30.26,19.45,10.81,21.248,2.942,2.652,75,92,817,1136,1528,1, +96.166,238.92,246.34,31.42,19.64,29.46,19.64,11.78,21.073,2.780,2.686,75,92,817,1136,1528,1, +96.682,222.36,229.81,29.09,21.33,31.02,19.39,9.70,20.711,2.783,2.920,75,92,817,1136,1528,1, +97.156,238.91,244.25,29.51,18.97,29.51,21.08,8.43,20.621,2.635,2.619,75,92,817,1136,1528,1, +97.670,227.33,234.78,31.14,21.41,31.14,19.46,11.68,19.284,2.536,2.881,75,92,817,1136,1528,1, +98.180,227.39,234.83,29.45,19.63,29.45,19.63,9.82,20.441,2.480,2.590,75,91,817,1136,1528,1, +98.712,227.40,234.83,30.04,18.77,30.04,20.65,9.39,19.887,2.434,2.657,75,91,817,1136,1528,1, +99.177,227.35,234.82,30.13,19.37,30.13,19.37,10.76,20.065,2.331,2.599,75,91,817,1136,1528,1, +99.686,233.96,240.98,29.44,19.62,29.44,19.62,9.81,18.544,2.413,2.662,75,91,817,1136,1528,1, +100.207,227.35,234.83,30.75,19.22,30.75,19.22,11.53,20.549,2.476,2.526,75,91,817,1136,1528,1, +100.681,227.35,234.83,29.54,18.99,29.54,18.99,10.55,21.621,2.393,2.510,75,91,817,1136,1528,1, +101.185,222.38,229.86,29.74,19.82,29.74,19.82,11.89,19.393,2.524,2.473,75,91,817,1136,1528,1, +101.702,227.35,234.83,30.97,19.36,30.97,19.36,9.68,21.325,2.506,2.562,75,91,817,1136,1528,1, +102.173,180.83,188.41,29.71,19.10,29.71,19.10,10.61,21.838,2.547,2.500,75,91,817,1136,1528,1, +102.681,187.43,194.39,29.51,19.67,29.51,19.67,9.84,21.170,2.448,2.465,75,91,817,1136,1528,1, +103.202,180.83,188.41,30.72,21.12,30.72,19.20,11.52,21.577,2.670,2.502,75,91,817,1136,1528,1, +103.670,180.84,188.41,29.94,19.25,29.94,19.25,10.69,19.655,2.626,2.485,75,91,817,1136,1528,1, +104.181,192.41,198.01,31.30,19.56,29.34,19.56,9.78,19.787,2.717,2.535,75,91,812,1136,1528,1, +104.693,180.83,188.41,29.29,19.52,31.24,21.48,9.76,20.915,2.868,2.613,75,91,812,1136,1528,1, +105.175,192.42,199.98,29.07,20.76,29.07,18.69,10.38,20.762,2.888,2.623,75,91,812,1136,1528,1, +105.687,180.83,188.41,31.25,19.53,31.25,19.53,11.72,21.046,3.008,2.689,75,91,812,1136,1528,1, +106.197,180.89,188.42,29.43,19.62,29.43,21.58,7.85,21.685,3.234,2.773,75,91,812,1136,1528,1, +106.681,197.45,204.95,30.97,20.65,28.90,18.58,10.32,20.748,3.900,2.908,75,91,812,1136,1528,1, +107.185,180.89,188.42,29.76,19.84,31.74,19.84,11.90,20.817,5.167,3.083,75,91,812,1136,1528,1, +107.704,197.45,201.04,30.84,19.27,28.91,21.20,7.71,20.164,5.579,3.513,75,91,812,1136,1528,1, +108.169,197.45,200.48,30.09,19.34,30.09,19.34,10.75,21.376,4.856,4.077,75,91,812,1136,1528,1, +108.688,180.90,188.48,28.88,19.25,30.80,19.25,11.55,19.874,2.956,5.737,75,91,812,1136,1528,1, +109.198,187.50,195.07,29.41,19.61,29.41,19.61,9.80,19.595,2.914,4.728,75,91,812,1136,1528,1, +109.672,180.96,188.53,31.65,18.99,31.65,18.99,12.66,20.933,2.244,5.030,75,91,812,1136,1528,1, +110.191,180.95,188.53,28.91,21.20,28.91,19.28,9.64,20.297,2.424,3.055,75,91,812,1136,1528,1, +110.712,180.96,188.53,30.74,19.21,30.74,19.21,11.53,19.479,2.464,3.024,75,91,812,1136,1528,1, +111.171,180.95,188.53,30.49,19.60,30.49,19.60,10.89,22.890,2.247,2.442,75,91,812,1136,1528,1, +111.681,180.71,188.39,29.39,19.59,29.39,19.59,9.80,18.286,2.383,2.252,75,91,812,1136,1528,1, +112.194,192.29,199.96,29.27,19.51,29.27,21.46,7.81,19.622,2.336,2.442,75,91,812,1136,1528,1, +112.678,180.70,188.39,30.94,20.63,30.94,18.57,12.38,19.669,2.534,2.402,75,91,812,1136,1528,1, +113.189,182.32,184.99,29.40,19.60,29.40,19.60,9.80,21.486,2.610,2.479,75,91,812,1136,1528,1, +113.699,180.70,188.40,31.35,19.59,31.35,21.55,9.80,19.467,2.693,2.384,75,91,812,1136,1528,1, +114.174,180.71,188.40,29.50,21.07,29.50,18.97,10.54,20.294,2.832,2.484,75,91,812,1136,1528,1, +114.697,192.29,199.96,30.58,19.11,30.58,21.02,9.56,20.367,2.636,2.603,75,91,812,1136,1528,1, +115.218,175.72,183.43,28.80,19.20,28.80,17.28,11.52,23.701,2.698,2.673,75,91,812,1136,1528,1, +115.673,180.77,188.41,30.75,19.77,30.75,19.77,10.98,20.621,2.735,2.825,75,91,812,1136,1528,1, +116.184,182.40,186.78,29.33,19.55,29.33,19.55,9.78,20.766,2.547,2.661,75,91,812,1136,1528,1, +116.703,180.77,188.41,30.85,19.28,30.85,21.21,9.64,20.234,2.714,2.636,75,91,812,1136,1528,1, +117.167,181.02,188.52,30.18,19.40,30.18,19.40,10.78,21.607,2.624,2.815,75,91,812,1136,1528,1, +117.683,187.63,193.16,29.05,19.37,29.05,19.37,9.68,20.214,2.590,2.638,75,91,812,1136,1528,1, +118.196,181.03,188.53,31.22,19.51,31.22,19.51,11.71,21.856,2.648,2.604,75,91,812,1136,1528,1, +118.680,182.66,185.59,28.92,20.66,28.92,18.59,10.33,22.224,2.557,2.674,75,91,812,1136,1528,1, +119.192,181.02,188.53,31.26,19.54,31.26,19.54,11.72,21.056,2.752,2.823,75,91,812,1136,1528,1, +119.727,181.03,188.56,29.89,16.81,29.89,18.68,11.21,22.524,2.812,2.908,85,94,812,1136,1528,1, +120.182,187.64,195.14,28.58,19.79,28.58,17.59,10.99,21.529,2.648,2.571,85,93,812,1136,1528,1, +120.702,181.03,188.54,30.77,17.31,30.77,19.23,11.54,21.440,2.550,2.651,83,93,812,1136,1528,1, +121.224,181.03,188.55,30.61,19.13,30.61,17.22,13.39,21.799,2.781,2.578,83,93,812,1136,1528,1, +121.673,187.63,193.87,28.99,17.84,28.99,20.07,8.92,21.776,2.889,2.660,81,94,812,1136,1528,1, +123.125,509.40,495.75,2.76,0.69,2.07,0.69,1.38,36.896,3.251,3.024,85,95,838,1136,1528,1,SHOT_START;SHOT_END +123.249,458.41,458.55,24.09,8.03,32.12,8.03,24.09,26.432,3.853,3.326,85,95,843,1136,1528,1, +123.701,453.37,453.58,30.98,15.49,30.98,15.49,15.49,25.476,2.808,2.821,85,94,845,1136,1528,1, +124.201,453.29,453.56,30.00,20.00,30.00,18.00,12.00,21.171,2.470,2.729,85,93,820,1136,1528,1, +124.675,459.90,457.15,29.52,18.98,29.52,18.98,10.54,21.431,2.328,2.440,79,93,820,1136,1528,1, +125.195,453.29,453.58,30.80,17.33,30.80,19.25,11.55,23.264,2.486,2.396,79,93,817,1136,1528,1, +125.699,453.29,453.57,29.77,19.85,29.77,19.85,9.92,21.449,2.643,2.377,75,92,817,1136,1528,1, +126.175,459.89,459.32,29.38,18.89,29.38,18.89,10.49,21.220,2.746,2.578,75,92,817,1136,1528,1, +126.705,459.89,459.73,30.23,18.89,30.23,18.89,11.34,21.609,2.710,2.694,75,92,817,1136,1528,1, +127.206,464.93,465.19,31.89,19.93,29.89,17.94,11.96,21.530,3.137,3.083,75,92,817,1136,1528,1, +127.672,459.96,460.24,27.89,19.31,30.04,19.31,10.73,22.676,4.578,3.342,75,92,817,1136,1528,1, +128.196,453.35,453.64,30.54,19.09,30.54,19.09,11.45,21.422,4.944,3.076,75,92,817,1136,1528,1, +128.704,464.93,463.00,31.52,17.73,29.55,19.70,11.82,21.441,5.496,3.702,75,92,817,1136,1528,1, +129.237,464.96,464.63,30.01,18.76,30.01,18.76,11.25,21.425,4.201,4.712,75,91,817,1136,1528,1, +129.689,453.37,453.66,28.77,19.92,30.99,17.71,11.07,22.346,4.378,4.742,75,91,817,1136,1528,1, +130.215,453.37,453.67,30.43,19.02,30.43,19.02,11.41,21.521,2.906,5.010,75,91,817,1136,1528,1, +130.754,453.38,453.71,29.69,18.55,29.69,18.55,11.13,24.099,2.686,5.219,75,91,817,1136,1528,1, +131.233,464.95,462.96,29.21,16.69,29.21,18.78,10.43,23.447,2.431,3.346,75,91,817,1136,1528,1, +131.707,453.38,453.71,31.64,18.98,31.64,18.98,12.66,22.760,2.334,3.671,75,91,817,1136,1528,1, +132.218,453.37,453.71,29.36,19.57,29.36,19.57,9.79,21.025,2.206,2.502,75,91,817,1136,1528,1, +132.729,454.96,455.08,29.35,21.53,29.35,19.57,9.78,22.087,2.257,2.489,75,91,815,1136,1528,1, +133.250,453.33,453.70,30.69,17.26,30.69,19.18,11.51,23.301,2.270,2.842,75,91,815,1136,1528,1, +133.720,453.33,453.69,29.84,19.18,29.84,19.18,10.66,20.230,2.153,2.412,75,91,815,1136,1528,1, +134.247,453.33,453.69,30.35,18.97,30.35,17.07,13.28,22.252,2.481,2.896,75,91,815,1136,1528,1, +134.750,181.36,182.27,29.81,17.89,29.81,19.88,9.94,21.484,2.490,2.688,75,91,815,1136,1528,1, +135.222,187.97,186.90,29.62,19.04,29.62,19.04,10.58,20.829,2.342,2.312,75,91,815,1136,1528,1, +135.738,181.37,182.25,31.03,21.33,31.03,19.39,11.63,22.034,2.469,2.289,75,91,815,1136,1528,1, +136.255,187.97,186.57,29.02,19.35,29.02,19.35,9.67,20.745,2.429,2.395,75,91,810,1136,1528,1, +136.726,187.98,188.85,29.75,19.13,29.75,19.13,10.63,21.307,2.455,2.367,75,91,810,1136,1528,1, +137.237,181.37,182.27,31.26,17.58,31.26,19.54,11.72,20.824,2.591,2.578,75,91,810,1136,1528,1, +137.739,181.37,182.25,29.90,19.93,29.90,19.93,9.97,20.912,2.470,2.426,75,91,810,1136,1528,1, +138.216,187.97,184.96,29.33,20.95,29.33,18.86,10.48,20.015,2.477,2.293,75,91,810,1136,1528,1, +138.730,197.93,198.14,31.13,19.46,29.18,19.46,9.73,20.625,2.656,2.452,75,91,810,1136,1528,1, +139.244,181.37,182.28,29.20,19.47,31.15,19.47,11.68,20.655,2.631,2.400,75,91,810,1136,1528,1, +139.735,181.36,182.26,30.57,18.34,30.57,18.34,12.23,22.857,2.868,2.715,75,91,810,1136,1528,1, +140.230,181.36,182.27,30.29,18.17,30.29,20.19,10.10,20.435,2.719,2.450,75,91,810,1136,1528,1, +140.759,181.37,182.28,30.25,20.80,30.25,18.91,11.34,21.607,2.480,2.651,75,91,810,1136,1528,1, +141.225,181.37,182.26,30.00,19.28,30.00,19.28,10.71,20.494,2.549,2.719,75,91,810,1136,1528,1, +141.733,181.43,182.27,29.55,19.70,29.55,21.67,7.88,20.139,2.658,2.925,75,91,810,1136,1528,1, +142.249,193.01,193.86,31.05,19.40,29.11,19.40,11.64,20.608,2.508,2.557,75,91,810,1136,1528,1, +142.769,188.03,183.41,28.79,19.19,30.71,19.19,9.60,20.925,2.531,2.689,75,91,810,1136,1528,1, +143.242,197.73,194.14,31.73,19.04,29.62,19.04,10.58,21.534,2.523,2.620,75,91,810,1136,1528,1, +143.752,181.17,182.14,29.41,19.60,31.37,19.60,11.76,20.939,3.026,2.610,75,91,810,1136,1528,1, +144.263,181.17,182.13,29.38,21.55,29.38,19.59,9.79,20.053,3.796,2.623,75,91,810,1136,1528,1, +144.743,197.74,197.84,31.25,18.75,29.16,20.83,8.33,20.994,4.280,2.665,75,91,810,1136,1528,1, +145.272,192.77,193.71,28.36,18.91,30.25,18.91,11.34,23.133,5.022,3.225,75,91,810,1136,1528,1, +145.768,192.76,192.89,30.23,20.16,30.23,20.16,10.08,20.022,4.504,4.032,75,91,810,1136,1528,1, +146.233,187.78,188.56,30.10,19.35,30.10,19.35,10.75,22.354,4.222,5.038,75,91,810,1136,1528,1, +146.752,181.18,182.14,30.83,19.27,30.83,19.27,11.56,19.897,3.442,5.125,75,91,810,1136,1528,1, +147.265,187.79,188.77,29.23,19.48,29.23,19.48,11.69,20.716,2.744,4.491,75,91,810,1136,1528,1, +147.737,192.76,193.74,31.82,19.09,29.70,19.09,10.61,20.571,2.373,3.444,75,91,810,1136,1528,1, +148.264,192.76,192.07,28.45,18.97,30.35,18.97,9.48,21.325,2.872,4.228,75,91,810,1136,1528,1, +148.779,181.21,182.19,31.08,19.42,31.08,19.42,11.65,20.858,2.444,3.017,75,91,810,1136,1528,1, +149.274,181.21,182.18,30.28,20.19,30.28,18.17,12.11,19.822,2.435,2.534,75,91,810,1136,1528,1, +149.753,181.21,182.20,29.23,16.70,29.23,18.79,10.44,23.492,2.386,2.588,75,91,810,1136,1528,1, +150.265,197.77,196.15,31.25,21.48,29.30,19.53,9.77,19.688,2.299,2.303,75,91,810,1136,1528,1, +150.793,182.85,183.31,28.39,18.93,30.29,18.93,11.36,22.733,2.399,2.386,75,91,810,1136,1528,1, +151.301,181.21,182.22,31.54,17.74,31.54,19.71,11.83,22.093,2.416,2.419,75,91,810,1136,1528,1, +151.770,181.21,182.21,29.87,19.20,29.87,19.20,10.67,21.111,2.413,2.445,75,91,810,1136,1528,1, +152.274,181.21,182.22,29.73,19.82,29.73,19.82,9.91,20.056,2.393,2.433,75,91,810,1136,1528,1, +152.797,181.28,182.28,30.60,19.13,30.60,19.13,11.48,22.869,2.466,2.435,75,91,810,1136,1528,1, +153.328,192.86,189.08,30.16,18.85,28.27,18.85,11.31,21.103,2.407,2.419,75,91,810,1136,1528,1, +153.791,192.86,193.83,30.23,19.44,30.23,17.28,10.80,22.484,2.497,2.422,75,91,810,1136,1528,1, +154.298,181.27,182.27,29.55,17.73,31.52,19.70,11.82,22.097,2.435,2.548,75,91,810,1136,1528,1, +154.816,187.89,182.54,28.98,19.32,28.98,19.32,9.66,21.057,2.565,2.481,75,91,810,1136,1528,1, +155.329,197.84,198.31,31.21,19.50,31.21,19.50,11.70,21.705,2.424,2.499,75,91,810,1136,1528,1, +155.800,181.27,182.27,29.71,19.10,29.71,19.10,10.61,21.428,2.582,2.469,75,91,810,1136,1528,1, +156.311,187.71,183.67,29.33,19.55,29.33,19.55,9.78,20.530,2.528,2.513,75,91,810,1136,1528,1, +156.823,192.69,193.68,31.29,19.55,29.33,19.55,11.73,21.727,2.794,2.456,75,91,810,1136,1528,1, +157.348,182.74,182.18,28.57,20.95,30.48,19.05,9.52,21.162,2.773,2.469,75,91,810,1136,1528,1, +157.817,182.73,181.42,29.80,19.16,29.80,19.16,10.64,20.908,2.785,2.695,75,91,810,1136,1528,1, +158.323,187.70,182.41,31.63,19.77,31.63,19.77,11.86,19.939,2.719,2.589,75,91,810,1136,1528,1, +158.845,187.72,185.42,28.73,19.15,28.73,21.07,7.66,19.887,2.674,2.661,75,91,810,1136,1528,1, +159.320,181.10,182.11,31.57,18.94,31.57,18.94,12.63,20.280,2.723,2.804,75,91,810,1136,1528,1, +159.831,181.10,182.12,29.39,19.59,29.39,19.59,9.80,21.578,2.538,2.722,75,91,810,1136,1528,1, +160.335,187.77,183.49,29.74,19.83,29.74,19.83,9.91,20.378,2.634,2.782,75,91,810,1136,1528,1, +160.855,181.16,182.12,30.78,19.23,30.78,19.23,11.54,21.130,2.659,2.598,75,91,810,1136,1528,1, +161.331,181.16,182.10,29.42,18.91,29.42,18.91,10.51,21.017,2.972,2.596,75,91,810,1136,1528,1, +161.854,181.16,182.18,30.59,19.12,30.59,19.12,11.47,22.238,3.600,2.683,75,91,810,1136,1528,1, +162.357,181.16,182.15,29.82,19.88,29.82,17.89,11.93,22.627,4.777,2.810,75,91,810,1136,1528,1, +162.833,187.77,188.15,29.39,18.89,29.39,18.89,10.50,22.320,5.008,3.662,75,91,810,1136,1528,1, +163.348,181.17,182.16,31.07,19.42,31.07,19.42,11.65,20.792,4.758,4.609,75,91,810,1136,1528,1, +163.868,192.74,192.76,30.82,19.26,28.89,19.26,9.63,21.539,3.655,5.128,75,91,810,1136,1528,1, +164.335,197.73,197.53,29.94,17.11,29.94,19.24,10.69,22.008,2.928,5.097,75,91,810,1136,1528,1, +164.841,181.16,182.18,29.66,19.77,31.64,19.77,11.86,22.237,2.674,3.801,75,91,810,1136,1528,1, +165.371,181.17,182.17,30.20,18.87,30.20,18.87,11.32,21.199,2.888,4.259,75,91,810,1136,1528,1, +165.834,192.75,191.39,30.19,19.41,28.04,19.41,10.78,21.320,2.785,3.993,75,91,810,1136,1528,1, +166.355,181.16,182.16,28.84,19.22,30.76,17.30,11.53,23.298,2.549,2.779,75,91,810,1136,1528,1, +166.861,187.78,188.76,29.60,17.76,29.60,19.73,11.84,22.257,2.434,2.949,75,91,810,1136,1528,1, +167.347,192.81,190.57,28.83,18.53,28.83,18.53,8.24,21.494,2.609,2.684,75,91,810,1136,1528,1, +167.840,181.23,182.17,32.43,18.24,32.43,18.24,14.19,23.790,2.904,3.062,75,91,810,1136,1528,1, +168.355,182.86,177.49,29.17,21.39,29.17,19.45,9.72,20.711,2.435,2.353,75,91,810,1136,1528,1, +168.825,187.83,188.75,29.75,19.13,29.75,19.13,10.63,19.670,2.284,2.470,75,91,810,1136,1528,1, +169.344,181.23,182.18,30.82,19.26,30.82,19.26,11.56,20.149,2.393,2.338,75,91,810,1136,1528,1, +169.861,187.83,187.12,30.95,19.34,30.95,19.34,11.61,20.185,2.369,2.466,75,91,810,1136,1528,1, +170.329,197.79,194.05,29.94,19.25,27.80,19.25,8.56,19.282,2.438,2.384,75,91,810,1136,1528,1, +170.839,181.23,182.18,29.40,19.60,31.36,19.60,11.76,19.990,2.388,2.341,75,91,810,1136,1528,1, +171.359,197.78,198.25,30.76,19.22,28.83,19.22,9.61,20.660,2.386,2.464,75,91,810,1136,1528,1, +171.868,181.23,182.18,29.47,19.65,31.43,19.65,11.79,20.755,2.501,2.276,75,91,810,1136,1528,1, +172.350,187.84,187.85,29.08,18.69,29.08,20.77,8.31,22.368,2.434,2.417,75,91,810,1136,1528,1, +172.858,187.84,188.25,29.52,19.68,29.52,19.68,11.81,22.050,2.611,2.610,75,91,810,1136,1528,1, +173.376,181.23,182.21,30.88,19.30,30.88,19.30,9.65,21.999,2.576,2.535,75,91,810,1136,1528,1, +173.849,192.81,188.80,29.61,19.04,29.61,19.04,10.58,20.278,2.500,2.357,75,91,810,1136,1528,1, +174.362,181.23,182.18,31.17,19.48,31.17,19.48,11.69,20.426,2.546,2.465,75,91,810,1136,1528,1, +174.874,187.84,184.30,29.31,19.54,29.31,19.54,9.77,20.977,2.593,2.504,75,91,810,1136,1528,1, +175.349,187.84,188.13,29.44,18.92,29.44,18.92,12.62,19.863,2.742,2.536,75,91,810,1136,1528,1, +175.867,181.23,182.19,30.91,19.32,30.91,19.32,9.66,21.921,2.835,2.609,75,91,810,1136,1528,1, +176.369,181.23,182.21,29.86,19.90,29.86,19.90,9.95,21.292,2.735,2.715,75,91,809,1136,1528,1, +176.888,181.23,182.19,30.84,19.28,30.84,19.28,11.57,20.979,2.605,2.693,75,91,810,1136,1528,1, +177.357,181.23,182.19,29.87,19.20,29.87,19.20,10.67,21.257,2.809,2.841,75,91,810,1136,1528,1, +177.866,187.84,182.20,29.49,19.66,29.49,19.66,9.83,21.614,2.707,2.785,75,91,810,1136,1528,1, +178.392,181.02,182.11,30.40,19.00,30.40,19.00,11.40,21.009,3.871,2.697,75,91,809,1136,1528,1, +178.857,181.02,182.10,30.07,21.48,30.07,19.33,10.74,20.327,4.825,2.888,75,91,809,1136,1528,1, +179.374,197.58,193.86,31.01,19.38,29.07,19.38,9.69,19.745,5.844,3.146,75,91,809,1136,1528,1, +179.895,187.63,182.11,28.75,19.16,30.66,19.16,11.50,22.166,4.532,4.061,75,91,809,1136,1528,1, +180.360,181.09,182.11,30.11,19.35,30.11,19.35,10.75,19.293,3.016,5.163,75,91,809,1136,1528,1, +180.881,181.09,182.11,30.73,19.21,30.73,19.21,11.52,21.663,2.847,5.645,75,91,809,1136,1528,1, +181.395,182.72,181.95,29.16,19.44,29.16,19.44,9.72,21.024,2.613,3.825,75,91,809,1136,1528,1, +181.867,192.66,193.21,31.77,19.06,29.65,19.06,10.59,22.196,2.938,3.494,75,91,809,1136,1528,1, +182.389,181.08,182.14,28.74,17.24,30.65,19.16,11.50,24.614,2.703,3.272,75,91,809,1136,1528,1, +182.890,187.69,183.05,29.95,19.96,29.95,17.97,11.98,19.848,2.761,3.386,75,91,809,1136,1528,1, +183.365,197.64,198.02,31.60,18.96,29.50,18.96,10.53,21.628,2.632,2.976,75,91,809,1136,1528,1, +183.874,181.15,182.21,29.45,19.63,31.41,19.63,11.78,19.501,2.561,2.836,75,91,809,1136,1528,1, +184.387,176.16,177.23,29.27,19.52,29.27,19.52,9.76,20.605,2.645,2.868,75,91,809,1136,1528,1, +184.857,182.77,183.00,29.77,19.14,29.77,19.14,10.63,19.996,2.276,2.551,75,91,809,1136,1528,1, +185.373,181.14,182.20,31.00,19.38,31.00,19.38,11.63,20.436,2.331,2.469,75,91,809,1136,1528,1, +185.887,182.78,178.71,29.21,19.47,29.21,19.47,9.74,20.444,2.502,2.716,75,91,809,1136,1528,1, +186.357,182.77,183.85,29.79,19.15,29.79,19.15,10.64,21.138,2.566,2.827,75,91,809,1136,1528,1, +186.866,192.73,193.79,31.43,19.65,29.47,19.65,9.82,20.639,2.533,2.592,75,91,809,1136,1528,1, +187.395,187.75,188.83,28.31,18.88,30.20,18.88,11.33,21.963,2.457,2.552,75,91,809,1136,1528,1, +187.865,181.15,182.21,31.97,19.18,31.97,19.18,12.79,19.454,2.408,2.663,75,91,809,1136,1528,1, +188.384,182.77,180.13,28.89,19.26,28.89,19.26,9.63,19.675,2.344,2.451,75,91,809,1136,1528,1, +188.857,187.75,188.81,29.60,19.03,29.60,21.14,8.46,20.533,2.470,2.579,75,91,809,1136,1528,1, +189.370,181.14,182.22,31.20,19.50,31.20,19.50,11.70,20.080,2.363,2.384,75,91,809,1136,1528,1, +189.890,187.75,188.81,30.73,19.21,28.81,19.21,11.52,20.290,2.426,2.439,75,91,809,1136,1528,1, +190.361,181.14,182.22,29.73,19.11,31.86,19.11,10.62,20.799,2.390,2.502,75,91,809,1136,1528,1, +190.874,187.75,183.30,29.26,19.51,29.26,19.51,9.75,22.450,2.385,2.453,75,91,809,1136,1528,1, +191.397,181.14,182.23,30.59,19.12,30.59,19.12,11.47,21.127,2.388,2.405,75,91,809,1136,1528,1, +191.900,181.14,182.22,29.84,17.90,29.84,17.90,11.93,24.141,2.546,2.496,75,91,809,1136,1528,1, +192.393,181.14,182.21,30.40,16.22,30.40,14.19,16.22,27.742,2.596,2.644,75,91,809,1136,1528,1, +192.924,181.14,182.23,30.10,15.05,30.10,16.93,13.17,26.795,2.667,2.675,75,91,809,1136,1528,1, +193.365,181.15,182.22,29.48,15.88,29.48,15.88,13.61,26.224,2.803,2.719,75,91,809,1136,1528,1, +193.887,187.76,188.63,30.65,19.16,30.65,19.16,11.49,22.403,2.917,2.849,75,91,809,1136,1528,1, +194.400,187.82,183.80,29.24,19.49,29.24,19.49,9.75,21.369,2.964,2.820,75,91,809,1136,1528,1, +194.861,181.21,182.25,30.36,19.52,30.36,19.52,10.84,21.135,3.199,2.762,75,91,809,1136,1528,1, +195.388,181.21,182.27,30.37,18.98,30.37,18.98,11.39,22.254,4.188,2.931,75,91,809,1136,1528,1, +195.894,181.21,182.25,29.64,19.76,29.64,19.76,9.88,21.778,4.992,3.116,75,91,809,1136,1528,1, +196.360,181.27,182.31,30.04,19.31,30.04,19.31,10.73,21.134,4.625,3.934,75,91,809,1136,1528,1, +196.869,192.86,193.53,31.46,19.66,29.49,19.66,11.80,19.052,3.800,5.045,75,91,809,1136,1528,1, +197.392,181.27,182.32,28.71,19.14,30.62,19.14,9.57,22.078,3.672,5.059,75,91,809,1136,1528,1, +197.865,192.86,190.65,29.59,19.02,29.59,19.02,10.57,20.679,3.005,4.084,75,91,809,1136,1528,1, +198.386,181.27,182.33,30.70,19.19,30.70,19.19,11.51,21.638,2.461,3.285,75,91,809,1136,1528,1, +198.895,182.90,183.92,29.48,19.65,29.48,17.69,11.79,22.352,2.484,3.346,75,91,809,1136,1528,1, +199.374,181.27,182.31,31.30,18.78,31.30,18.78,12.52,22.599,2.497,2.659,75,91,809,1136,1528,1, +199.875,181.07,182.16,29.91,17.95,29.91,19.94,9.97,20.849,2.777,2.453,75,91,809,1136,1528,1, +200.387,181.07,182.15,29.35,19.56,29.35,19.56,9.78,22.486,2.746,2.684,75,91,809,1136,1528,1, +200.871,181.07,182.14,30.99,20.66,30.99,18.60,12.40,21.488,2.704,2.665,75,91,809,1136,1528,1, +201.389,182.69,180.92,28.94,19.29,28.94,19.29,9.65,23.414,2.813,2.655,75,91,809,1136,1528,1, +201.886,176.09,177.19,30.19,20.13,30.19,20.13,10.06,20.922,2.666,2.879,75,91,808,1136,1528,1, +202.355,182.70,179.82,29.84,19.18,29.84,19.18,10.66,20.517,2.500,2.739,75,91,809,1136,1528,1, +202.892,192.65,193.71,31.65,18.62,29.79,18.62,11.17,21.544,2.528,2.520,75,91,809,1136,1528,1, +203.369,181.13,182.20,29.34,18.86,31.44,18.86,12.57,20.130,2.435,2.610,75,91,809,1136,1528,1, +203.871,181.13,182.20,29.86,19.90,29.86,19.90,9.95,19.516,2.364,2.464,75,91,809,1136,1528,1, +204.386,187.75,185.53,29.17,19.44,29.17,21.39,7.78,20.446,2.481,2.740,75,91,809,1136,1528,1, +204.861,192.71,193.78,31.56,21.04,29.45,18.93,10.52,20.937,2.458,2.553,75,91,809,1136,1528,1, +205.382,176.21,177.29,28.80,19.20,30.72,19.20,11.52,21.873,2.623,2.691,75,91,809,1136,1528,1, +205.892,192.77,193.81,31.37,19.61,29.41,19.61,9.80,21.285,2.543,2.734,75,91,809,1136,1528,1, +206.362,181.19,182.22,29.78,19.14,31.91,19.14,12.76,20.478,2.373,2.699,75,91,809,1136,1528,1, +206.873,181.19,182.26,29.33,19.55,29.33,19.55,9.78,20.780,2.483,2.539,75,91,809,1136,1528,1, +207.403,181.19,182.27,30.20,18.87,30.20,18.87,11.32,21.439,2.515,2.441,75,91,809,1136,1528,1, +207.858,181.19,182.25,30.83,17.61,30.83,19.82,11.01,21.104,2.508,2.401,75,91,809,1136,1528,1, +208.370,181.19,182.27,29.27,19.51,29.27,19.51,9.76,20.589,2.448,2.518,75,91,809,1136,1528,1, +208.887,192.78,193.72,30.92,19.33,28.99,19.33,11.60,21.678,2.524,2.506,75,91,809,1136,1528,1, +209.398,181.19,182.27,29.41,19.61,31.37,19.61,9.80,21.089,2.649,2.522,75,91,809,1136,1528,1, +209.873,192.77,189.04,29.46,18.94,29.46,18.94,10.52,21.274,2.753,2.583,75,91,809,1136,1528,1, +210.389,181.18,182.27,31.02,19.39,31.02,19.39,11.63,20.903,2.929,2.731,75,91,809,1136,1528,1, +210.900,181.17,182.29,29.32,19.54,29.32,19.54,9.77,21.080,2.948,2.705,75,91,808,1136,1528,1, +211.387,187.79,182.76,30.84,18.51,30.84,18.51,12.34,22.153,2.996,2.726,75,91,809,1136,1528,1, +211.901,187.78,185.60,29.17,19.45,29.17,19.45,9.72,21.548,3.651,2.717,75,91,809,1136,1528,1, +212.399,187.79,186.25,30.10,20.06,30.10,18.06,12.04,19.936,4.797,2.997,75,91,809,1136,1528,1, +212.893,181.18,182.27,30.37,18.22,30.37,18.22,12.15,21.989,5.569,3.078,75,91,809,1136,1528,1, +213.417,181.17,182.26,30.54,17.18,30.54,19.09,11.45,22.938,5.135,3.865,75,91,809,1136,1528,1, +213.902,192.76,189.63,30.90,20.60,28.84,18.54,10.30,21.032,4.154,4.761,75,91,809,1136,1528,1, +214.371,192.77,190.93,29.86,19.20,29.86,21.33,10.66,19.674,2.635,5.787,75,91,809,1136,1528,1, +214.883,181.18,182.29,29.32,19.55,31.28,19.55,9.77,21.721,2.315,4.666,75,91,809,1136,1528,1, +215.402,192.76,193.85,30.84,19.27,28.91,19.27,11.56,19.680,2.315,3.432,75,91,809,1136,1528,1, +215.877,181.17,182.27,29.43,18.92,31.53,18.92,10.51,20.571,2.363,2.833,75,91,809,1136,1528,1, +216.388,181.18,182.28,29.37,19.58,29.37,19.58,9.79,21.217,2.419,2.764,75,91,809,1136,1528,1, +216.903,181.18,182.28,31.08,19.42,31.08,19.42,11.65,22.369,2.329,2.382,75,91,809,1136,1528,1, +217.396,197.80,198.41,30.41,18.25,28.39,18.25,10.14,24.012,2.462,2.394,75,91,809,1136,1528,1, +217.892,182.86,183.91,28.24,20.17,30.26,18.16,12.10,22.542,2.581,2.591,76,91,809,1136,1528,1, +218.399,197.80,198.60,31.55,19.72,29.57,19.72,9.86,20.972,2.682,2.386,75,91,809,1136,1528,1, +218.873,181.24,182.29,29.54,18.99,31.65,18.99,12.66,21.445,2.670,2.428,75,91,809,1136,1528,1, +219.398,187.85,188.79,30.46,19.03,30.46,19.03,11.42,21.430,2.588,2.545,75,91,809,1136,1528,1, +219.914,181.24,182.29,29.12,19.42,29.12,19.42,9.71,19.860,2.748,2.487,75,91,809,1136,1528,1, +220.378,181.23,182.27,30.14,17.23,30.14,19.38,10.77,20.639,2.749,2.675,75,91,809,1136,1528,1, +220.897,192.67,192.48,30.84,19.28,28.92,19.28,11.57,20.385,2.553,2.615,75,91,809,1136,1528,1, +221.416,181.08,182.20,28.87,19.25,30.80,19.25,9.62,20.285,2.717,2.573,75,91,809,1136,1528,1, +221.881,187.69,182.64,30.10,19.35,30.10,17.20,12.90,22.182,2.753,2.690,75,91,809,1136,1528,1, +222.401,181.04,182.16,30.81,19.26,30.81,19.26,11.55,20.025,2.630,2.756,75,91,784,1136,1528,1, +222.872,181.05,182.16,29.71,19.10,29.71,19.10,10.61,21.564,2.447,2.598,75,91,784,1136,1528,1, +223.391,197.61,198.27,30.79,19.25,28.87,19.25,9.62,20.975,2.641,2.866,75,91,784,1136,1528,1, +223.904,181.05,182.16,29.24,17.54,31.19,19.49,11.70,21.269,2.412,2.583,75,91,784,1136,1528,1, +224.378,187.66,184.72,29.57,19.01,29.57,19.01,10.56,20.848,2.497,2.658,75,91,784,1136,1528,1, +224.896,181.05,182.16,30.90,19.31,30.90,19.31,11.59,20.932,2.585,2.637,75,91,784,1136,1528,1, +225.407,182.68,180.07,29.36,19.57,29.36,17.61,11.74,20.653,2.520,2.512,75,91,784,1136,1528,1, +225.934,181.11,182.21,30.37,18.98,30.37,18.98,11.39,21.335,2.598,2.441,75,91,784,1136,1528,1, +226.395,181.11,182.20,30.36,17.35,30.36,19.52,10.84,22.125,2.680,2.550,75,91,784,1136,1528,1, +226.906,187.71,185.17,29.33,19.55,29.33,19.55,9.78,20.261,2.867,2.474,75,91,784,1136,1528,1, +227.427,181.11,182.21,30.70,19.19,30.70,19.19,11.51,22.049,2.986,2.718,75,91,784,1136,1528,1, +227.937,182.80,183.47,29.43,19.62,29.43,17.66,11.77,20.781,2.999,2.792,75,91,784,1136,1528,1, +228.459,181.18,182.26,30.66,19.16,30.66,19.16,11.50,21.384,3.955,2.838,75,91,784,1136,1528,1, +228.946,192.76,191.90,30.82,18.49,30.82,18.49,12.33,22.094,4.432,3.051,75,91,784,1136,1528,1, +229.455,181.16,182.23,29.43,17.66,29.43,19.62,9.81,21.482,5.582,3.237,75,91,784,1136,1528,1, +229.954,181.17,182.24,30.05,20.04,30.05,18.03,12.02,20.654,4.538,4.527,75,91,784,1136,1528,1, +230.470,192.76,191.77,29.09,17.46,29.09,19.39,9.70,21.258,4.134,4.592,75,91,784,1136,1528,1, +230.937,192.77,190.38,32.10,19.26,29.96,19.26,12.84,21.575,3.291,4.804,76,91,784,1136,1528,1, +231.464,187.79,188.67,28.50,19.00,30.39,19.00,9.50,20.307,2.896,5.218,75,91,784,1136,1528,1, +231.968,192.76,193.83,31.71,19.82,29.73,17.84,11.89,20.867,2.401,4.176,75,91,784,1136,1528,1, +232.492,182.81,177.69,28.66,19.10,30.57,19.10,11.46,22.201,2.443,3.971,75,91,784,1136,1528,1, +232.957,181.17,182.28,30.10,19.35,30.10,19.35,10.75,21.583,2.382,2.329,75,91,783,1136,1528,1, +233.470,181.17,182.27,31.17,19.48,31.17,19.48,11.69,21.147,2.405,2.621,75,91,784,1136,1528,1, +233.990,182.80,181.13,28.85,19.23,28.85,19.23,9.62,20.058,2.382,2.502,75,91,784,1136,1528,1, +234.457,182.80,183.05,30.00,19.28,30.00,19.28,10.71,19.409,2.396,2.357,76,91,784,1136,1528,1, +234.970,181.18,182.29,31.20,19.50,31.20,19.50,11.70,20.300,2.393,2.384,75,91,784,1136,1528,1, +235.478,181.17,182.28,29.50,19.66,29.50,19.66,9.83,19.912,2.211,2.250,75,91,784,1136,1528,1, +235.968,181.18,182.27,30.65,18.39,30.65,18.39,12.26,21.718,2.547,2.460,75,91,784,1136,1528,1, +236.468,192.76,193.84,29.98,17.99,27.98,19.99,9.99,21.184,2.623,2.508,75,91,784,1136,1528,1, +236.989,187.79,186.15,28.82,19.21,30.74,19.21,9.61,20.070,2.585,2.559,75,91,784,1136,1528,1, +237.460,192.77,191.01,31.85,19.11,29.73,19.11,12.74,22.519,2.569,2.422,75,91,784,1136,1528,1, +237.969,181.17,182.27,29.44,19.63,31.40,17.67,11.78,19.083,2.558,2.359,75,91,784,1136,1528,1, +238.494,197.73,198.82,30.49,17.15,28.59,19.06,9.53,21.574,2.491,2.472,75,91,784,1136,1528,1, +238.953,187.79,188.66,28.30,19.59,30.48,19.59,10.89,20.301,2.761,2.473,75,91,784,1136,1528,1, +239.466,181.18,182.29,31.22,19.51,31.22,17.56,13.66,21.085,2.532,2.489,75,91,784,1136,1528,1, +239.986,187.78,188.87,28.83,19.22,28.83,19.22,9.61,21.485,2.603,2.483,75,91,784,1136,1528,1, +240.452,187.78,182.54,30.05,17.17,30.05,19.32,10.73,20.985,2.612,2.578,75,91,784,1136,1528,1, +240.970,181.17,182.29,30.87,19.29,30.87,19.29,11.58,21.403,2.592,2.651,75,91,784,1136,1528,1, +241.495,181.23,182.32,30.46,19.04,30.46,19.04,11.42,21.132,2.845,2.864,75,91,784,1136,1528,1, +241.999,181.24,182.32,29.77,19.85,29.77,17.86,11.91,20.117,2.529,2.680,75,91,784,1136,1528,1, +242.470,181.24,182.31,29.76,19.13,29.76,19.13,10.63,20.122,2.583,2.741,75,91,784,1136,1528,1, +242.982,192.82,189.53,31.20,19.50,29.25,19.50,9.75,21.530,2.541,2.557,75,91,784,1136,1528,1, +243.499,181.09,182.20,29.06,17.43,31.00,19.37,11.62,22.363,2.565,2.581,75,91,784,1136,1528,1, +243.966,181.09,182.20,29.96,19.26,29.96,19.26,10.70,19.969,2.749,2.667,75,91,784,1136,1528,1, +244.478,187.70,188.80,29.29,19.52,29.29,19.52,11.71,20.645,2.990,2.672,75,91,784,1136,1528,1, +244.996,181.09,182.20,30.91,19.32,30.91,19.32,9.66,21.805,4.056,2.661,75,91,784,1136,1528,1, +245.465,187.70,182.32,29.82,19.17,29.82,19.17,10.65,21.029,5.005,2.952,75,91,784,1136,1528,1, +245.980,197.65,198.73,31.07,19.42,29.13,17.48,11.65,21.766,5.197,3.467,75,91,784,1136,1528,1, +246.495,181.15,182.24,29.14,19.42,31.08,19.42,11.65,20.937,5.665,3.578,75,91,784,1136,1528,1, +246.969,192.74,193.81,31.61,18.97,29.51,18.97,10.54,21.472,3.915,5.515,75,91,784,1136,1528,1, +247.495,176.17,177.28,28.55,19.03,30.45,19.03,11.42,21.815,3.407,5.411,75,91,783,1136,1528,1, +247.999,187.77,188.04,29.76,17.85,29.76,19.84,11.90,20.519,2.549,5.178,75,91,784,1136,1528,1, +248.473,181.21,182.30,31.66,19.00,31.66,19.00,10.55,20.177,2.759,3.205,75,91,784,1136,1528,1, +248.992,181.21,182.29,28.87,19.25,28.87,19.25,9.62,22.159,2.620,4.239,75,91,783,1136,1528,1, +249.517,181.21,182.29,30.49,19.05,30.49,19.05,11.43,22.370,2.439,3.195,75,91,784,1136,1528,1, +250.022,181.28,182.34,29.68,19.79,29.68,17.81,11.87,20.864,2.514,2.610,75,91,784,1136,1528,1, +250.486,176.30,177.37,30.20,19.41,30.20,19.41,10.78,20.847,2.461,2.715,75,91,784,1136,1528,1, +251.010,181.27,182.35,30.56,19.10,30.56,19.10,11.46,22.833,2.389,2.385,75,91,784,1136,1528,1, +251.522,187.89,183.51,29.27,17.56,29.27,19.51,9.76,21.558,2.438,2.388,75,91,784,1136,1528,1, +251.994,192.87,191.48,31.82,19.09,29.70,16.97,12.73,22.519,2.336,2.386,75,91,784,1136,1528,1, +252.499,187.89,182.47,29.66,17.79,31.64,19.77,11.86,21.562,2.341,2.464,75,91,784,1136,1528,1, +253.016,181.27,182.38,29.01,19.34,29.01,19.34,9.67,21.260,2.559,2.553,75,91,784,1136,1528,1, +253.494,192.93,193.96,31.43,18.86,29.33,18.86,12.57,22.106,2.479,2.297,75,91,784,1136,1528,1, +254.003,181.34,182.39,29.45,19.64,31.42,17.67,11.78,20.535,2.366,2.340,75,91,784,1136,1528,1, +254.518,182.97,180.09,29.13,19.42,29.13,19.42,9.71,21.234,2.274,2.245,75,91,784,1136,1528,1, +254.983,181.34,182.40,30.08,17.19,30.08,19.34,10.74,20.468,2.394,2.391,75,91,784,1136,1528,1, +255.509,181.34,182.40,30.43,19.02,30.43,19.02,11.41,22.089,2.516,2.513,75,91,784,1136,1528,1, +256.027,197.90,198.93,30.90,19.31,28.97,17.38,11.59,21.401,2.417,2.639,75,91,784,1136,1528,1, +256.489,197.91,198.91,30.31,17.32,30.31,17.32,12.99,21.192,2.665,2.574,75,91,784,1136,1528,1, +257.000,181.34,182.38,29.36,19.57,31.32,19.57,11.74,19.583,2.473,2.299,75,91,784,1136,1528,1, +257.527,192.92,193.97,30.35,18.97,28.45,18.97,9.48,21.827,2.616,2.453,75,91,784,1136,1528,1, +257.983,192.93,192.63,28.46,17.52,30.65,19.71,10.95,21.477,2.646,2.484,75,91,784,1136,1528,1, +258.500,181.34,182.41,30.97,19.35,30.97,19.35,11.61,20.997,2.766,2.474,75,91,784,1136,1528,1, +259.030,181.34,182.41,30.22,18.89,30.22,18.89,11.33,21.155,2.782,2.649,75,91,784,1136,1528,1, +259.481,182.97,183.41,28.78,19.93,28.78,17.71,11.07,20.977,2.699,2.784,75,91,784,1136,1528,1, +260.002,176.36,177.44,30.71,19.20,30.71,19.20,11.52,20.195,2.650,2.667,75,91,784,1136,1528,1, +260.526,181.34,182.40,30.56,17.19,30.56,19.10,11.46,22.330,2.574,2.655,75,91,784,1136,1528,1, +260.988,181.34,182.41,30.29,19.47,30.29,19.47,10.82,21.345,2.557,2.709,75,91,784,1136,1528,1, +261.497,181.34,182.41,29.45,19.64,29.45,19.64,9.82,20.895,2.700,2.577,75,91,784,1136,1528,1, +262.023,181.34,182.40,30.40,19.00,30.40,19.00,11.40,21.157,2.917,2.619,75,91,784,1136,1528,1, +262.494,181.34,182.39,29.75,19.12,29.75,17.00,12.75,19.982,4.260,2.633,75,91,784,1136,1528,1, +263.003,192.93,192.32,31.43,19.64,29.46,19.64,9.82,22.522,4.759,2.791,75,91,784,1136,1528,1, +263.515,181.15,182.27,29.29,17.57,31.24,19.52,11.71,21.991,5.612,3.685,75,91,784,1136,1528,1, +263.991,181.14,182.27,29.43,18.92,29.43,18.92,10.51,21.786,4.315,4.975,75,91,784,1136,1528,1, +264.498,192.74,190.86,29.56,19.71,29.56,19.71,9.85,19.805,3.017,5.556,75,91,784,1136,1528,1, +265.014,181.21,182.26,31.01,19.38,31.01,17.44,13.57,21.976,2.838,4.341,75,91,784,1136,1528,1, +265.489,181.21,182.27,29.47,16.84,29.47,18.94,10.52,23.359,3.268,5.129,75,91,784,1136,1528,1, +265.999,192.80,193.82,31.42,19.64,29.46,19.64,11.78,20.644,2.708,4.020,75,91,784,1136,1528,1, +266.519,181.14,182.23,28.85,19.23,30.77,19.23,9.62,22.457,2.456,3.262,75,91,780,1136,1528,1, +266.992,187.75,183.81,29.56,19.00,29.56,19.00,10.56,21.341,2.488,2.725,75,91,780,1136,1528,1, +267.498,187.75,188.84,29.69,19.79,29.69,17.81,11.87,19.734,2.545,2.703,75,91,780,1136,1528,1, +268.024,182.76,178.50,30.42,19.01,30.42,19.01,11.41,20.620,2.417,2.513,75,91,780,1136,1528,1, +268.539,181.13,182.28,31.04,17.46,31.04,19.40,11.64,20.817,2.517,2.675,75,91,780,1136,1528,1, +269.006,181.14,182.28,29.96,19.26,29.96,17.12,12.84,23.655,2.477,2.576,75,91,780,1136,1528,1, +269.511,181.13,182.28,29.74,19.83,29.74,19.83,9.91,20.648,2.371,2.499,75,91,780,1136,1528,1, +270.036,181.13,182.29,30.43,19.02,30.43,19.02,11.41,21.159,2.344,2.457,75,91,780,1136,1528,1, +270.505,181.13,182.28,29.84,17.05,29.84,19.19,10.66,21.431,2.580,2.529,75,91,780,1136,1528,1, +271.013,181.14,182.29,29.55,19.70,29.55,19.70,9.85,20.425,2.348,2.350,75,91,780,1136,1528,1, +271.530,192.71,193.85,30.96,19.35,29.02,19.35,11.61,21.399,2.393,2.403,75,91,780,1136,1528,1, +272.048,181.13,182.27,28.95,19.30,30.88,19.30,9.65,21.811,2.427,2.352,75,91,780,1136,1528,1, +272.524,197.70,194.27,31.53,18.92,29.42,18.92,10.51,22.246,2.398,2.518,75,91,780,1136,1528,1, +273.025,192.72,192.38,29.94,19.96,29.94,19.96,11.98,20.311,2.346,2.455,75,91,780,1136,1528,1, +273.560,197.70,198.80,29.90,18.69,29.90,18.69,9.34,21.840,2.608,2.678,75,91,780,1136,1528,1, +274.014,182.77,180.61,28.64,19.82,30.84,17.62,13.22,21.106,2.465,2.520,75,91,780,1136,1528,1, +274.531,181.13,182.29,30.93,17.40,30.93,19.33,11.60,21.052,2.522,2.403,75,91,780,1136,1528,1, +275.040,181.13,182.28,29.47,19.65,29.47,19.65,9.82,20.576,2.543,2.317,75,91,779,1136,1528,1, +275.513,187.74,187.61,29.61,19.03,29.61,19.03,10.57,19.512,2.671,2.513,75,91,780,1136,1528,1, +276.035,181.20,182.31,30.66,19.16,30.66,19.16,11.50,22.261,2.701,2.577,75,91,780,1136,1528,1, +276.550,192.79,193.86,31.06,19.41,29.12,17.47,11.65,21.064,2.737,2.744,75,91,780,1136,1528,1, +277.020,181.20,182.33,29.80,19.16,31.93,19.16,12.77,20.639,2.586,2.712,75,91,780,1136,1528,1, +277.527,181.20,182.34,29.61,17.77,29.61,19.74,9.87,21.318,2.702,2.553,75,91,780,1136,1528,1, +278.046,192.79,193.86,30.81,19.26,28.88,19.26,11.55,21.013,2.908,2.956,75,91,780,1136,1528,1, +278.520,181.20,182.31,29.50,18.97,31.61,18.97,10.54,20.478,2.783,2.911,75,91,780,1136,1528,1, +279.028,181.19,182.32,29.53,19.68,29.53,19.68,9.84,21.233,3.297,2.724,75,91,780,1136,1528,1, +279.565,187.81,182.98,29.82,16.77,29.82,16.77,13.05,20.413,4.647,2.880,93,97,780,1136,1528,1, +280.028,181.20,182.32,30.22,17.27,30.22,17.27,12.95,21.128,4.771,3.722,93,93,780,1136,1528,1, +280.537,187.82,188.92,31.47,19.67,29.50,17.70,11.80,20.941,4.989,3.885,93,92,780,1136,1528,1, +281.057,181.21,182.32,28.80,19.20,30.72,19.20,11.52,21.592,3.509,5.206,93,92,780,1136,1528,1, +281.522,181.21,182.33,30.11,19.36,30.11,19.36,10.75,20.761,2.518,5.897,75,91,780,1136,1528,1, +282.045,181.12,182.28,30.60,17.21,30.60,19.12,11.47,22.888,2.760,4.942,75,91,780,1136,1528,1, +282.538,181.12,182.27,30.45,20.30,30.45,18.27,12.18,20.501,2.844,2.995,75,91,780,1136,1528,1, +283.013,181.12,182.25,29.49,18.96,29.49,18.96,10.53,20.662,2.756,3.062,75,91,780,1136,1528,1, +283.552,181.13,182.28,29.68,16.70,29.68,18.55,11.13,24.310,2.785,3.049,75,91,780,1136,1528,1, +284.053,181.12,182.26,29.90,17.94,29.90,17.94,11.96,22.552,2.811,2.711,75,91,780,1136,1528,1, +284.514,181.12,182.27,30.41,19.55,30.41,19.55,10.86,19.740,2.447,2.731,75,91,780,1136,1528,1, +285.025,187.79,186.27,29.33,19.55,29.33,19.55,9.78,19.881,2.364,2.660,75,91,780,1136,1528,1, +285.549,181.18,182.32,30.56,19.10,30.56,19.10,11.46,22.468,2.724,2.787,75,91,780,1136,1528,1, +286.020,182.80,177.34,29.70,19.09,29.70,16.97,12.73,21.559,2.528,2.958,75,91,780,1136,1528,1, +286.532,181.19,182.30,31.27,17.59,31.27,19.54,11.73,21.405,2.435,2.750,75,91,780,1136,1528,1, +287.045,181.25,182.36,29.25,19.50,29.25,17.55,11.70,21.451,2.407,2.582,75,91,780,1136,1528,1, +287.513,181.23,182.36,29.91,19.23,29.91,19.23,10.68,21.045,2.412,2.552,75,91,780,1136,1528,1, +288.030,181.24,182.35,30.92,19.32,30.92,19.32,11.59,21.813,2.384,2.490,75,91,780,1136,1528,1, +288.547,176.27,177.43,29.04,19.36,29.04,19.36,9.68,20.197,2.388,2.448,75,91,780,1136,1528,1, +289.019,192.83,189.03,29.66,19.07,29.66,19.07,10.59,21.018,2.387,2.527,75,91,780,1136,1528,1, +289.535,181.25,182.37,31.01,19.38,31.01,19.38,11.63,20.968,2.357,2.565,75,91,780,1136,1528,1, +290.049,181.31,182.41,29.14,17.48,29.14,19.43,9.71,21.575,2.383,2.446,75,91,780,1136,1528,1, +290.520,187.91,188.99,29.75,19.13,29.75,17.00,12.75,21.953,2.611,2.530,75,91,780,1136,1528,1, +291.032,181.30,182.41,31.27,17.59,31.27,19.54,11.73,21.586,2.563,2.508,75,91,780,1136,1528,1, +291.540,181.37,182.48,29.48,19.66,29.48,17.69,11.79,20.994,2.445,2.491,75,91,779,1136,1528,1, +292.016,187.98,189.06,29.43,18.92,29.43,18.92,10.51,20.702,2.390,2.426,75,91,780,1136,1528,1, +292.533,181.37,182.48,30.98,19.36,30.98,19.36,11.62,19.778,2.447,2.489,75,91,780,1136,1528,1, +293.047,192.96,190.04,31.08,19.42,29.13,19.42,9.71,20.777,2.733,2.490,75,91,780,1136,1528,1, +293.513,197.93,195.41,30.07,17.18,30.07,19.33,10.74,22.616,2.864,2.497,75,91,780,1136,1528,1, +294.026,181.37,182.49,29.22,19.48,31.17,19.48,11.69,20.435,2.957,2.676,75,91,780,1136,1528,1, +294.556,181.36,182.49,30.24,18.90,30.24,18.90,11.34,21.375,2.879,2.640,75,91,780,1136,1528,1, +295.024,181.38,182.50,29.91,19.23,29.91,17.09,12.82,21.887,2.888,2.845,75,91,780,1136,1528,1, +295.538,197.93,199.04,31.07,17.48,29.13,19.42,9.71,22.990,2.971,2.769,75,91,780,1136,1528,1, +296.057,181.36,182.48,28.90,19.27,30.83,17.34,13.49,22.428,4.427,2.926,75,91,780,1136,1528,1, +296.560,181.36,182.49,29.84,17.90,29.84,19.89,9.95,20.961,5.389,3.119,75,91,780,1136,1528,1, +297.033,187.97,188.63,29.59,19.02,29.59,19.02,10.57,21.342,4.804,3.880,75,91,780,1136,1528,1, +297.552,181.35,182.50,30.85,19.28,30.85,17.35,13.50,22.294,4.782,4.198,75,91,780,1136,1528,1, +298.072,187.96,182.96,30.74,17.29,30.74,19.22,11.53,19.987,3.563,5.229,75,91,780,1136,1528,1, +298.567,193.00,190.96,30.30,20.20,28.28,18.18,10.10,19.623,2.314,4.992,75,91,780,1136,1528,1, +299.095,188.01,195.54,28.41,15.15,30.31,17.05,13.26,23.484,2.811,6.540,85,94,780,1136,1528,1, +299.574,181.40,189.17,31.35,14.63,31.35,14.63,16.72,21.123,2.793,3.491,95,97,780,1136,1528,1, +300.083,181.39,189.20,29.48,15.72,29.48,15.72,13.76,22.242,3.590,3.259,95,96,780,1136,1528,1, +300.553,181.21,189.02,29.77,19.14,29.77,17.01,12.76,20.689,2.612,2.812,95,93,780,1136,1528,1, +301.074,181.21,189.02,30.71,17.27,30.71,19.19,11.51,21.162,2.549,2.491,95,93,780,1136,1528,1, +301.589,187.79,191.50,29.15,19.43,29.15,19.43,9.72,21.478,2.661,2.594,83,94,780,1136,1528,1, +303.231,454.16,454.05,3.65,1.83,3.65,1.22,2.44,24.336,2.627,2.560,85,96,827,1136,1528,1,SHOT_START;SHOT_END +303.606,245.09,249.14,31.99,10.66,29.32,13.33,15.99,27.853,4.208,4.069,86,94,834,1136,1528,1, +304.072,240.05,247.07,30.01,15.01,32.16,15.01,17.15,26.541,3.737,5.570,86,93,809,1136,1528,1, +304.579,228.46,235.49,29.59,17.76,29.59,15.78,13.81,23.539,2.527,3.957,76,92,809,1136,1528,1, +305.094,240.05,245.35,29.13,17.48,29.13,19.42,9.71,20.493,2.501,3.004,76,92,809,1136,1528,1, +305.561,240.05,246.04,29.94,19.25,29.94,19.25,10.69,20.913,2.609,2.349,76,92,809,1136,1528,1, +306.100,228.46,235.52,31.57,18.57,31.57,18.57,13.00,22.156,2.578,2.579,76,92,809,1136,1528,1, +306.593,240.11,243.82,30.41,18.24,28.38,18.24,12.16,20.974,2.756,2.575,76,92,809,1136,1528,1, +307.066,240.11,247.10,29.63,19.05,31.75,19.05,10.58,21.290,2.807,2.751,76,92,809,1136,1528,1, +307.578,228.53,235.54,29.27,19.52,29.27,19.52,9.76,20.513,2.741,2.752,76,92,809,1136,1528,1, +308.095,240.11,246.16,30.96,19.35,29.03,19.35,11.61,22.120,2.673,2.657,76,92,809,1136,1528,1, +308.616,228.53,235.59,28.80,19.20,30.72,17.28,11.52,21.360,2.475,2.700,76,92,809,1136,1528,1, +309.073,228.53,235.60,30.60,17.48,30.60,19.67,10.93,19.173,2.564,2.604,76,92,809,1136,1528,1, +309.601,228.55,235.61,30.33,18.96,30.33,18.96,11.37,21.762,2.529,2.776,76,91,809,1136,1528,1, +310.105,228.55,235.60,29.75,19.84,29.75,17.85,11.90,20.246,2.344,2.498,76,91,809,1136,1528,1, +310.631,228.55,235.63,30.39,19.00,30.39,19.00,11.40,22.104,2.664,2.838,76,91,809,1136,1528,1, +311.135,228.55,235.62,29.76,17.86,29.76,19.84,9.92,20.393,2.555,2.733,76,91,809,1136,1528,1, +311.610,228.55,235.63,29.50,18.97,29.50,18.97,10.54,19.354,2.420,2.598,76,91,809,1136,1528,1, +312.127,235.15,242.21,28.99,19.33,28.99,17.40,11.60,22.358,2.547,2.677,76,91,809,1136,1528,1, +312.639,182.01,189.18,31.27,17.59,31.27,19.54,11.72,20.279,2.668,2.633,76,91,809,1136,1528,1, +313.158,182.00,189.20,30.79,19.24,30.79,17.32,13.47,20.549,2.448,2.432,76,91,809,1136,1528,1, +313.668,181.99,189.18,29.43,17.66,29.43,19.62,9.81,20.699,2.442,2.421,76,91,809,1136,1528,1, +314.149,188.68,193.75,29.09,18.70,29.09,16.62,12.47,20.803,2.563,2.562,76,91,804,1136,1528,1, +314.667,182.07,189.19,30.91,17.39,30.91,19.32,11.59,21.378,2.657,2.534,76,91,804,1136,1528,1, +315.167,182.07,189.17,30.01,20.01,30.01,18.01,12.01,20.590,2.815,2.488,76,91,804,1136,1528,1, +315.642,188.67,195.77,29.46,18.94,29.46,18.94,10.52,21.210,3.069,2.603,76,91,804,1136,1528,1, +316.154,182.07,189.18,31.24,17.57,31.24,19.52,11.71,20.787,2.954,2.640,76,91,804,1136,1528,1, +316.691,182.07,189.20,29.81,18.63,29.81,18.63,11.18,21.591,3.295,2.895,76,91,804,1136,1528,1, +317.146,193.65,200.79,30.78,17.59,28.59,17.59,10.99,19.789,4.574,2.985,76,91,804,1136,1528,1, +317.661,182.07,189.22,29.12,19.41,31.06,19.41,11.65,21.258,5.679,2.929,76,91,804,1136,1528,1, +318.173,198.63,205.75,31.25,19.53,29.30,17.58,11.72,20.667,5.729,3.222,76,91,804,1136,1528,1, +318.647,193.71,198.08,29.54,16.88,31.64,18.99,12.66,20.328,5.249,4.065,76,91,804,1136,1528,1, +319.154,182.13,189.25,29.58,17.75,29.58,17.75,11.83,21.257,3.308,5.113,76,91,804,1136,1528,1, +319.666,188.74,195.86,31.24,19.52,29.29,19.52,11.71,20.118,2.591,5.233,76,91,804,1136,1528,1, +320.148,182.14,189.28,29.05,18.68,31.13,18.68,10.38,21.674,3.072,3.786,76,91,804,1136,1528,1, +320.658,182.14,189.27,29.41,19.60,29.41,17.64,11.76,18.825,2.375,3.348,76,91,804,1136,1528,1, +321.170,188.74,189.25,31.25,17.58,31.25,19.53,11.72,21.860,2.354,2.906,76,91,804,1136,1528,1, +321.642,182.13,189.24,29.67,19.07,29.67,19.07,10.60,20.766,2.376,2.367,76,91,804,1136,1528,1, +322.151,182.14,189.25,29.45,19.64,29.45,19.64,9.82,20.434,2.431,2.461,76,91,804,1136,1528,1, +322.676,182.13,189.27,30.51,19.07,30.51,19.07,11.44,21.041,2.458,2.599,82,94,804,1136,1528,1, +323.202,181.93,189.16,30.38,17.09,30.38,17.09,13.29,22.045,2.762,2.805,86,93,804,1136,1528,1, +323.663,193.50,198.57,30.37,15.18,28.20,15.18,15.18,22.878,4.839,2.651,90,94,804,1136,1528,1, +324.163,198.47,203.73,30.00,18.00,30.00,16.00,12.00,21.730,2.499,2.695,90,93,804,1136,1528,1, +324.694,193.51,200.72,30.13,16.95,30.13,18.83,13.18,21.646,2.745,2.493,90,93,804,1136,1528,1, +325.160,183.56,190.18,27.91,19.32,30.05,17.17,10.73,21.340,2.492,2.470,80,93,804,1136,1528,1, +325.672,181.93,189.16,31.28,17.59,31.28,19.55,11.73,20.755,2.731,2.298,80,92,804,1136,1528,1, +326.181,181.93,189.18,29.47,17.68,29.47,17.68,11.79,21.689,2.645,2.478,80,92,803,1136,1528,1, +326.670,181.93,189.20,30.64,18.39,30.64,16.34,14.30,22.792,2.606,2.727,80,93,804,1136,1528,1, +327.168,181.93,189.18,30.09,18.06,30.09,20.06,10.03,20.600,2.634,2.749,76,91,804,1136,1528,1, +327.690,198.48,204.99,30.68,19.18,28.77,19.18,9.59,21.102,2.763,2.718,76,91,804,1136,1528,1, +328.160,198.50,205.62,29.80,19.16,29.80,17.03,12.77,20.216,2.656,2.740,76,91,804,1136,1528,1, +328.688,198.49,205.61,30.28,18.92,30.28,18.92,11.35,20.664,2.455,2.570,76,91,804,1136,1528,1, +329.202,181.93,188.94,29.21,17.52,31.15,19.47,11.68,21.704,2.437,2.721,76,91,804,1136,1528,1, +329.681,188.54,192.95,29.19,16.68,29.19,16.68,12.51,21.984,2.527,2.561,76,91,804,1136,1528,1, +330.201,181.91,188.95,30.76,19.23,30.76,17.30,13.46,22.384,2.570,2.662,76,91,804,1136,1528,1, +330.661,181.84,188.86,30.45,17.40,30.45,17.40,13.05,22.408,2.480,2.479,76,91,784,1136,1528,1, +331.178,188.44,191.53,29.02,17.41,29.02,19.34,9.67,22.349,2.501,2.532,76,91,784,1136,1528,1, +331.683,193.43,200.43,31.71,19.82,29.73,17.84,11.89,19.890,2.888,2.601,76,91,784,1136,1528,1, +332.197,181.98,188.92,29.15,17.49,31.10,19.43,11.66,21.113,2.848,2.592,76,91,786,1136,1528,1, +332.671,188.59,193.14,29.56,19.00,29.56,19.00,10.56,21.627,2.955,2.709,76,91,786,1136,1528,1, +333.187,181.98,188.90,31.02,19.39,31.02,17.45,13.57,21.301,3.028,3.060,76,91,786,1136,1528,1, +333.700,188.59,189.81,29.21,17.53,29.21,19.47,9.74,20.835,3.166,2.824,76,91,786,1136,1528,1, +334.169,183.61,189.22,29.88,19.21,29.88,17.08,12.81,21.279,5.192,2.954,76,91,786,1136,1528,1, +334.692,181.98,188.91,30.54,19.09,30.54,19.09,11.45,20.404,6.191,3.469,76,91,786,1136,1528,1, +335.201,193.57,198.16,29.49,17.70,29.49,19.66,9.83,22.680,5.429,4.195,76,91,786,1136,1528,1, +335.671,198.54,200.75,31.91,19.15,29.79,17.02,12.77,21.584,3.602,5.606,76,91,786,1136,1528,1, +336.194,181.98,188.94,28.70,17.22,30.62,19.13,11.48,22.751,3.203,5.409,76,91,786,1136,1528,1, +336.699,188.59,190.64,29.70,19.80,29.70,17.82,11.88,21.322,2.417,5.125,76,91,786,1136,1528,1, +337.215,181.98,188.96,31.00,17.44,31.00,19.38,11.63,21.893,2.349,3.882,76,91,786,1136,1528,1, +337.687,181.97,188.94,29.62,19.04,29.62,19.04,10.58,19.577,2.275,2.814,76,91,786,1136,1528,1, +338.195,188.59,190.86,29.53,19.69,29.53,17.72,11.81,18.345,2.401,2.613,76,91,786,1136,1528,1, +338.739,181.98,188.96,31.24,18.38,31.24,18.38,12.86,21.348,2.525,2.902,76,91,786,1136,1528,1, +339.192,188.59,193.77,28.75,17.69,28.75,17.69,11.06,19.811,2.404,2.249,76,91,786,1136,1528,1, +339.697,198.59,202.42,31.63,19.77,29.65,19.77,9.88,18.369,2.278,2.230,76,91,786,1136,1528,1, +340.229,193.63,196.52,30.08,18.80,30.08,18.80,11.28,21.820,2.455,2.508,76,91,786,1136,1528,1, +340.735,198.60,200.68,29.65,15.82,29.65,17.79,11.86,24.759,2.617,3.140,76,91,786,1136,1528,1, +341.208,182.04,188.98,29.61,19.03,31.72,16.92,14.80,19.999,2.514,2.546,76,91,786,1136,1528,1, +341.722,188.64,194.26,29.18,17.51,29.18,19.45,9.73,22.037,2.686,2.489,76,91,786,1136,1528,1, +342.196,182.04,188.98,31.61,16.86,31.61,16.86,14.75,21.494,2.652,2.886,76,91,786,1136,1528,1, +342.711,182.04,189.00,29.17,19.45,29.17,17.50,11.67,21.166,2.480,2.412,76,91,786,1136,1528,1, +343.221,193.63,200.55,29.40,17.64,29.40,19.60,9.80,21.967,2.544,2.442,76,91,786,1136,1528,1, +343.694,193.63,196.43,31.72,19.03,31.72,19.03,12.69,21.257,2.527,2.400,76,91,786,1136,1528,1, +344.193,198.61,202.55,30.05,20.03,28.05,18.03,10.02,20.287,2.574,2.392,76,91,786,1136,1528,1, +344.733,182.02,189.00,29.61,18.51,31.46,18.51,12.95,22.489,2.775,2.463,76,91,786,1136,1528,1, +345.191,193.63,195.62,30.57,17.47,28.38,19.65,10.92,21.226,2.804,2.547,76,91,786,1136,1528,1, +345.701,182.04,189.00,29.40,19.60,31.36,17.64,11.76,21.424,2.695,2.677,76,91,786,1136,1528,1, +346.218,188.65,195.27,29.04,17.43,29.04,19.36,11.62,21.720,2.570,2.575,76,91,786,1136,1528,1, +346.745,188.65,191.91,30.37,18.98,30.37,18.98,9.49,21.046,2.632,2.685,76,91,786,1136,1528,1, +347.201,182.04,188.98,30.66,19.71,30.66,17.52,13.14,20.983,2.763,2.638,76,91,786,1136,1528,1, +347.722,193.63,200.56,30.71,17.28,30.71,19.20,11.52,20.427,2.528,2.788,76,91,786,1136,1528,1, +348.231,182.04,188.98,29.51,19.67,29.51,17.71,11.80,20.160,2.585,2.885,76,91,786,1136,1528,1, diff --git a/docs/06_TEST/data/perf_v1.6.csv b/docs/06_TEST/data/perf_v1.6.csv new file mode 100644 index 0000000..f74ec03 --- /dev/null +++ b/docs/06_TEST/data/perf_v1.6.csv @@ -0,0 +1,437 @@ +elapsed_sec,private_MB,ws_MB,callback_fps,main_paint_fps,sub_update_fps,sub_paint_fps,sub_drop_fps,sub_paint_ms,main_copy_ms,sub_copy_ms,gdi_objects,user_objects,handle_count,img_w,img_h,sub_shown,event +1.309,199.51,221.60,16.81,15.28,15.28,11.46,3.06,29.314,0.000,42.456,77,94,798,1136,1528,1, +1.817,206.44,227.10,11.80,11.80,11.80,9.83,1.97,28.055,0.000,51.804,77,94,798,1136,1528,1, +2.042,167.06,186.77,13.36,13.36,13.36,4.45,8.91,26.961,0.000,44.518,77,95,793,1136,1528,1, +2.497,168.39,190.74,10.99,10.99,10.99,10.99,0.00,28.117,0.000,55.899,77,95,793,1136,1528,1, +3.000,184.24,206.56,13.91,11.92,11.92,7.95,5.96,39.605,0.000,48.328,77,95,793,1136,1528,1, +3.498,209.46,232.07,12.06,12.06,12.06,6.03,6.03,38.107,0.000,49.263,76,95,793,1136,1528,1, +3.998,223.16,243.88,13.98,13.98,13.98,7.99,5.99,47.265,0.000,47.058,77,95,793,1136,1528,1, +4.501,178.71,200.43,11.92,11.92,13.91,5.96,5.96,37.476,0.000,42.596,77,95,793,1136,1528,1, +5.001,189.43,212.09,12.01,12.01,12.01,8.01,4.00,31.336,0.000,50.301,77,95,793,1136,1528,1, +5.499,197.96,215.57,12.05,10.04,12.05,10.04,2.01,35.464,0.000,52.493,75,94,793,1136,1528,1, +6.009,217.13,239.31,13.72,13.72,11.76,7.84,5.88,34.396,0.000,50.485,75,94,793,1136,1528,1, +6.505,222.43,244.86,12.10,12.10,12.10,10.08,2.02,33.597,0.000,53.231,75,94,793,1136,1528,1, +7.001,183.74,206.76,12.10,12.10,12.10,6.05,6.05,38.498,0.000,45.048,75,94,793,1136,1528,1, +7.497,185.50,208.27,12.10,12.10,12.10,10.08,2.02,30.404,0.000,54.823,75,94,793,1136,1528,1, +7.999,192.04,214.46,11.95,11.95,11.95,9.96,1.99,30.401,0.000,55.041,75,94,793,1136,1528,1, +8.497,217.09,239.25,14.04,14.04,14.04,6.02,6.02,36.122,0.000,41.127,75,94,793,1136,1528,1, +9.001,230.99,249.99,11.92,11.92,11.92,7.95,3.97,31.232,0.000,55.152,75,94,793,1136,1528,1, +9.497,186.13,209.33,12.07,12.07,12.07,8.05,6.04,28.138,0.000,47.320,74,94,793,1136,1528,1, +9.999,196.52,217.26,11.96,9.96,13.95,9.96,3.99,36.165,0.000,45.742,74,94,793,1136,1528,1, +10.498,222.04,244.16,14.04,12.03,12.03,8.02,4.01,33.788,0.000,49.352,74,94,793,1136,1528,1, +10.998,239.69,261.71,11.99,9.99,11.99,9.99,2.00,35.654,0.000,51.587,74,94,793,1136,1528,1, +11.497,259.11,281.63,12.02,12.02,12.02,6.01,6.01,35.047,0.000,47.795,73,94,793,1136,1528,1, +11.998,174.91,197.28,11.98,13.97,13.97,7.98,3.99,33.305,0.000,53.803,73,94,793,1136,1528,1, +12.508,205.79,226.20,13.75,13.75,13.75,5.89,7.86,36.762,0.000,44.177,75,94,793,1136,1528,1, +12.999,225.02,247.24,12.22,12.22,12.22,8.15,4.07,29.366,0.000,50.041,75,94,793,1136,1528,1, +13.499,232.18,254.88,11.98,11.98,11.98,7.99,3.99,28.164,0.000,51.251,75,94,793,1136,1528,1, +14.001,252.61,274.49,13.97,9.98,11.97,9.98,3.99,42.633,0.000,49.995,75,94,793,1136,1528,1, +14.503,177.50,200.31,11.95,11.95,11.95,7.97,1.99,29.770,0.000,53.472,75,94,793,1136,1528,1, +15.000,195.58,217.68,12.05,12.05,12.05,8.04,6.03,50.761,0.000,53.205,75,94,793,1136,1528,1, +15.497,220.47,241.92,14.10,12.09,14.10,8.06,6.04,41.364,0.000,43.678,75,94,793,1136,1528,1, +16.006,241.86,260.11,11.77,11.77,13.74,5.89,5.89,29.913,0.000,51.698,73,94,793,1136,1528,1, +16.505,268.45,286.60,14.04,10.03,14.04,8.02,6.02,41.821,0.000,42.278,73,94,793,1136,1528,1, +17.000,188.17,209.85,14.13,14.13,12.11,8.07,6.05,39.309,0.000,47.444,75,94,793,1136,1528,1, +17.497,211.31,231.82,12.07,10.06,14.08,8.05,4.02,33.126,0.000,45.158,75,94,793,1136,1528,1, +18.009,234.02,255.03,13.68,11.73,11.73,7.82,5.86,35.449,0.000,45.495,75,94,793,1136,1528,1, +18.505,230.39,253.02,12.10,12.10,12.10,12.10,0.00,28.012,0.000,56.890,75,94,793,1136,1528,1, +19.001,247.98,270.99,12.11,10.09,12.11,8.07,4.04,34.347,0.000,48.068,75,94,793,1136,1528,1, +19.497,168.80,186.80,10.08,12.09,12.09,10.08,0.00,31.122,0.000,60.446,75,94,793,1136,1528,1, +20.009,173.84,193.63,11.72,9.76,11.72,9.76,1.95,30.399,0.000,52.498,75,94,793,1136,1528,1, +20.505,211.38,229.11,14.11,12.10,12.10,6.05,6.05,38.920,0.000,42.424,75,94,793,1136,1528,1, +20.998,213.11,229.33,12.16,14.18,14.18,8.11,6.08,43.493,0.000,52.422,75,94,793,1136,1528,1, +21.498,246.81,266.39,14.01,14.01,14.01,6.01,8.01,37.411,0.000,45.607,75,94,793,1136,1528,1, +22.004,194.26,213.58,13.85,11.87,13.85,7.91,5.93,26.894,0.000,41.009,75,94,793,1136,1528,1, +22.506,203.28,224.23,11.94,11.94,11.94,7.96,3.98,29.013,0.000,51.502,75,94,793,1136,1528,1, +23.001,238.27,260.78,14.15,12.13,12.13,6.07,6.07,52.462,0.000,48.720,74,94,793,1136,1528,1, +23.498,256.78,280.02,14.07,12.06,14.07,8.04,6.03,39.770,0.000,45.776,75,94,793,1136,1528,1, +24.001,276.04,298.59,11.93,9.94,11.93,9.94,3.98,36.659,0.000,49.448,74,94,793,1136,1528,1, +24.502,189.50,205.66,13.96,13.96,13.96,7.97,5.98,38.658,0.000,47.199,75,94,793,1136,1528,1, +25.001,201.82,220.60,12.03,12.03,12.03,8.02,4.01,32.189,0.000,53.540,75,94,793,1136,1528,1, +25.497,215.42,238.13,12.10,12.10,12.10,8.06,4.03,33.523,0.000,52.134,76,94,793,1136,1528,1, +26.004,233.84,255.89,11.84,11.84,11.84,7.89,3.95,40.594,0.000,49.709,76,94,793,1136,1528,1, +26.507,233.03,254.02,9.94,11.93,11.93,9.94,0.00,33.198,0.000,64.163,76,94,793,1136,1528,1, +27.000,202.24,223.79,16.21,10.13,14.18,8.10,8.10,40.619,0.000,40.805,74,94,793,1136,1528,1, +27.496,230.04,253.00,12.10,12.10,12.10,6.05,4.03,30.318,0.000,52.926,76,94,793,1136,1528,1, +27.998,226.24,247.66,11.97,11.97,11.97,11.97,1.99,29.693,0.000,56.465,76,94,793,1136,1528,1, +28.499,248.00,267.83,11.97,9.98,11.97,7.98,3.99,34.977,0.000,47.231,76,94,793,1136,1528,1, +29.001,262.61,285.48,11.94,11.94,11.94,7.96,3.98,27.615,0.000,54.054,75,94,793,1136,1528,1, +29.498,204.41,227.58,14.11,10.08,14.11,8.06,4.03,35.762,0.000,47.050,76,94,793,1136,1528,1, +30.004,219.60,241.59,13.83,13.83,13.83,7.90,7.90,38.682,0.000,45.319,76,94,793,1136,1528,1, +30.505,223.96,246.54,9.98,11.97,11.97,7.98,2.00,30.344,0.000,59.134,76,94,793,1136,1528,1, +31.004,251.23,273.62,14.03,10.02,14.03,8.02,6.01,30.540,0.000,42.745,76,94,793,1136,1528,1, +31.497,278.80,300.55,14.20,14.20,12.17,6.09,6.09,39.867,0.000,51.327,76,94,793,1136,1528,1, +32.009,203.00,224.31,13.66,13.66,13.66,5.85,9.76,32.729,0.000,46.878,76,94,793,1136,1528,1, +32.505,212.93,234.32,10.09,10.09,10.09,8.07,2.02,31.006,0.000,49.188,75,95,795,1136,1528,1, +33.000,213.81,233.93,10.10,12.13,12.13,8.08,2.02,36.179,0.000,39.691,78,95,799,1136,1528,1, +33.497,201.15,223.49,8.04,8.04,8.04,10.05,0.00,32.179,0.000,32.565,74,94,804,1136,1528,1, +33.998,166.46,189.85,9.99,9.99,9.99,7.99,0.00,30.163,0.000,35.347,76,94,796,1136,1528,1, +34.503,169.31,192.52,9.91,7.93,7.93,9.91,0.00,29.649,0.000,35.191,73,94,801,1136,1528,1, +35.001,144.36,166.02,8.03,10.03,10.03,10.03,0.00,31.288,0.000,34.464,76,94,806,1136,1528,1, +35.496,160.50,182.23,10.09,10.09,10.09,10.09,0.00,28.574,0.000,32.807,76,94,810,1136,1528,1, +36.002,160.60,184.09,9.89,9.89,9.89,7.91,0.00,28.557,0.000,33.899,76,94,794,1136,1528,1, +36.505,222.89,243.32,5.96,3.97,3.97,1.99,1.99,27.102,0.000,35.541,78,95,798,1136,1528,1,CALIB_START +37.001,267.99,290.69,16.13,14.11,18.15,4.03,14.11,27.246,0.000,41.436,78,95,798,1136,1528,1, +37.497,326.42,346.48,18.16,16.14,18.16,2.02,16.14,26.936,0.000,39.428,78,95,798,1136,1528,1, +38.002,396.50,415.54,19.80,15.84,17.82,1.98,15.84,24.916,0.000,39.831,78,95,798,1136,1528,1, +38.505,265.19,288.75,15.91,15.91,15.91,0.00,15.91,0.000,0.000,43.142,77,95,795,1136,1528,1, +39.001,322.28,345.19,18.12,14.09,18.12,4.03,14.09,25.218,0.000,40.425,78,95,795,1136,1528,1, +39.498,382.02,404.94,18.13,18.13,18.13,0.00,18.13,0.000,0.000,40.588,77,95,795,1136,1528,1, +40.007,441.41,464.07,17.68,15.71,17.68,1.96,15.71,24.844,0.000,40.667,78,95,795,1136,1528,1, +40.505,230.09,253.87,18.07,16.06,18.07,2.01,16.06,57.993,0.000,40.431,77,95,795,1136,1528,1, +41.001,288.07,307.71,18.12,14.10,18.12,4.03,14.10,28.605,0.000,40.413,77,95,795,1136,1528,1, +41.497,338.89,361.16,18.15,14.11,18.15,4.03,14.11,26.077,0.000,41.378,78,95,795,1136,1528,1, +42.007,383.71,405.30,15.70,13.74,17.66,3.93,13.74,43.160,0.000,42.065,78,95,795,1136,1528,1, +42.504,216.39,241.74,2.01,0.00,0.00,2.01,0.00,29.558,0.000,0.000,79,99,851,1136,1528,1,CALIB_END +43.096,270.52,294.46,16.91,13.53,18.60,5.07,11.84,25.305,0.000,45.693,82,100,889,1136,1528,1, +43.604,329.13,350.38,17.69,17.69,17.69,0.00,17.69,26.058,0.000,46.939,82,100,889,1136,1528,1, +44.053,386.17,406.76,17.84,15.61,17.84,2.23,15.61,25.766,0.000,45.193,81,100,888,1136,1528,1, +44.573,435.92,458.02,17.28,11.52,17.28,5.76,11.52,29.837,0.000,46.692,81,99,863,1136,1528,1, +45.082,263.70,287.88,17.70,15.73,17.70,1.97,15.73,26.631,0.000,46.559,81,99,860,1136,1528,1, +45.603,320.46,344.95,17.28,13.44,17.28,3.84,13.44,29.602,0.000,47.143,81,99,860,1136,1528,1, +46.200,385.50,406.54,18.42,15.07,18.42,3.35,15.07,26.413,0.000,44.515,81,99,860,1136,1528,1, +46.687,445.87,466.73,18.47,18.47,18.47,0.00,18.47,0.000,0.000,43.691,81,99,860,1136,1528,1, +47.183,509.07,529.83,18.15,16.13,18.15,2.02,16.13,25.300,0.000,46.046,81,99,860,1136,1528,1, +47.756,272.74,294.77,17.45,15.71,17.45,1.75,15.71,24.033,0.000,48.416,81,99,860,1136,1528,1, +48.309,340.78,361.49,18.07,14.46,18.07,3.61,14.46,29.006,0.000,46.198,81,99,860,1136,1528,1, +48.844,404.52,425.16,18.72,13.10,16.85,5.62,13.10,23.948,0.000,46.927,81,99,860,1136,1528,1, +49.393,469.30,489.04,18.22,18.22,20.04,0.00,18.22,27.157,0.000,44.255,82,99,860,1136,1528,1, +49.971,539.15,562.48,19.01,15.55,19.01,3.46,15.55,26.080,0.000,43.261,82,99,860,1136,1528,1, +50.469,278.77,300.20,20.09,18.08,18.08,0.00,18.08,0.000,0.000,45.903,82,99,860,1136,1528,1, +50.985,338.28,358.15,17.46,15.52,17.46,3.88,15.52,27.574,0.000,45.262,82,99,860,1136,1528,1, +51.541,407.00,428.93,17.97,14.37,17.97,1.80,14.37,25.925,0.000,47.224,81,99,860,1136,1528,1, +52.009,461.14,485.06,19.24,19.24,19.24,0.00,19.24,0.000,0.000,43.911,82,99,860,1136,1528,1, +52.504,518.20,542.36,18.17,16.15,18.17,2.02,16.15,26.631,0.000,45.439,82,99,860,1136,1528,1, +53.104,284.55,306.03,16.67,15.00,18.34,3.33,15.00,31.953,0.000,48.114,82,99,860,1136,1528,1, +53.635,349.96,373.24,18.83,18.83,18.83,0.00,18.83,25.888,0.000,43.344,82,99,860,1136,1528,1, +54.144,414.68,437.07,19.68,17.71,19.68,1.97,17.71,25.432,0.000,41.657,82,99,860,1136,1528,1, +54.624,474.42,497.59,18.73,18.73,18.73,0.00,18.73,0.000,0.000,43.962,82,99,860,1136,1528,1, +55.114,534.29,557.51,18.37,18.37,18.37,0.00,18.37,0.000,0.000,45.461,82,99,860,1136,1528,1, +55.644,277.72,301.89,18.86,16.98,18.86,1.89,16.98,28.864,0.000,43.717,82,99,860,1136,1528,1, +56.113,337.54,361.65,19.18,19.18,19.18,0.00,19.18,0.000,0.000,43.100,82,99,860,1136,1528,1, +56.648,403.18,426.15,18.70,16.83,18.70,1.87,16.83,25.849,0.000,44.640,82,99,860,1136,1528,1, +57.125,462.93,486.08,18.87,18.87,18.87,0.00,18.87,0.000,0.000,43.838,82,99,860,1136,1528,1, +57.723,223.71,248.39,18.38,13.37,18.38,5.01,13.37,26.393,0.000,45.576,82,99,860,1136,1528,1, +58.258,289.47,309.78,18.71,16.84,18.71,1.87,16.84,26.219,0.000,44.268,82,99,860,1136,1528,1, +58.781,354.97,378.23,21.02,17.20,19.11,1.91,17.20,27.080,0.000,43.517,83,99,850,1136,1528,1, +59.291,421.35,444.60,17.66,19.62,19.62,0.00,19.62,0.000,0.000,42.656,82,99,850,1136,1528,1, +59.770,487.73,505.32,20.87,18.78,18.78,0.00,18.78,0.000,0.000,44.896,82,99,850,1136,1528,1, +60.377,237.73,258.66,16.46,14.81,18.10,3.29,14.81,26.868,0.000,46.619,82,99,850,1136,1528,1, +60.573,268.34,292.38,20.49,15.37,15.37,0.00,15.37,0.000,0.000,44.496,90,102,850,1136,1528,1, +61.001,326.16,350.83,16.33,11.67,16.33,2.33,14.00,24.045,0.000,49.584,97,104,850,1136,1528,1, +61.496,386.51,405.95,20.19,20.19,20.19,0.00,20.19,0.000,0.000,44.107,98,104,850,1136,1528,1, +62.000,138.37,165.28,13.89,13.89,15.87,0.00,15.87,0.000,0.000,37.142,96,104,787,1136,1528,1,SHOT_START +62.499,190.48,180.51,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,96,103,769,1136,1528,1, +63.004,470.61,370.42,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,95,103,805,1136,1528,1, +63.498,512.66,507.56,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,98,104,841,1136,1528,1,SHOT_END +64.007,582.64,608.52,17.68,13.75,15.72,3.93,11.79,26.312,0.000,47.603,105,103,868,1136,1528,1, +64.548,635.68,660.95,16.64,16.64,18.48,1.85,16.64,28.976,0.000,46.913,105,102,843,1136,1528,1, +65.001,687.13,711.44,17.64,15.44,17.64,2.21,15.44,26.925,0.000,46.807,105,102,843,1136,1528,1, +65.573,745.84,768.36,17.49,15.74,17.49,1.75,15.74,35.153,0.000,47.703,105,102,843,1136,1528,1, +66.187,557.44,579.28,17.92,16.29,17.92,1.63,16.29,24.635,0.000,45.106,105,102,839,1136,1528,1, +66.644,610.84,635.91,17.48,17.48,17.48,0.00,17.48,0.000,0.000,46.879,105,102,839,1136,1528,1, +67.287,680.54,703.54,17.13,14.01,17.13,3.11,14.01,30.650,0.000,48.300,105,102,839,1136,1528,1, +67.914,747.02,768.55,17.52,14.34,17.52,3.19,14.34,26.615,0.000,47.202,105,102,839,1136,1528,1, +68.658,563.43,586.34,17.48,14.79,17.48,2.69,14.79,29.471,0.000,46.727,105,102,839,1136,1528,1, +69.178,625.17,650.99,17.31,13.47,17.31,3.85,13.47,30.255,0.000,47.374,105,102,839,1136,1528,1, +69.644,672.05,694.18,17.15,12.86,17.15,4.29,12.86,27.420,0.000,49.316,106,101,839,1136,1528,1, +70.410,755.25,778.72,16.98,15.67,16.98,1.31,15.67,31.136,0.000,48.121,94,105,839,1136,1528,1, +71.053,833.51,858.33,17.11,17.11,17.11,0.00,17.11,0.000,0.000,48.173,94,104,839,1136,1528,1, +71.599,574.66,597.98,18.32,12.83,16.49,3.66,12.83,30.617,0.000,47.106,94,103,839,1136,1528,1, +72.121,623.43,647.60,17.24,17.24,19.16,1.92,17.24,0.000,0.000,45.653,94,103,839,1136,1528,1, +72.681,693.48,719.30,17.84,17.84,17.84,0.00,17.84,26.839,0.000,45.560,94,102,839,1136,1528,1, +73.343,778.35,802.11,18.14,15.12,16.63,1.51,15.12,28.921,0.000,47.755,93,102,839,1136,1528,1, +73.930,298.11,320.72,17.02,17.02,18.73,1.70,17.02,27.334,0.000,46.287,94,102,839,1136,1528,1, +74.483,362.29,389.29,18.09,14.47,16.28,1.81,14.47,27.499,0.000,48.164,93,102,839,1136,1528,1, +75.095,439.20,459.65,17.97,14.70,17.97,3.27,14.70,27.120,0.000,46.104,94,102,839,1136,1528,1, +75.633,486.70,511.36,16.74,16.74,18.60,1.86,16.74,27.133,0.000,45.443,94,102,839,1136,1528,1, +76.229,563.04,587.00,18.43,16.76,18.43,1.68,16.76,26.617,0.000,44.080,94,102,839,1136,1528,1, +76.858,312.49,337.03,17.50,15.91,17.50,1.59,15.91,31.563,0.000,46.803,94,102,834,1136,1528,1, +77.460,386.71,408.64,18.28,16.62,18.28,1.66,16.62,0.000,0.000,44.630,94,102,834,1136,1528,1, +78.212,464.61,487.41,17.28,11.97,17.28,5.32,11.97,28.492,0.000,47.602,94,102,834,1136,1528,1, +78.706,529.84,555.53,18.21,18.21,18.21,0.00,18.21,0.000,0.000,44.315,94,102,834,1136,1528,1, +79.283,305.11,330.58,19.08,17.35,17.35,0.00,17.35,0.000,0.000,45.787,93,102,834,1136,1528,1, +79.880,376.71,402.80,18.41,15.07,18.41,3.35,15.07,32.716,0.000,45.148,93,102,834,1136,1528,1, +80.490,448.54,471.99,18.04,16.40,18.04,1.64,16.40,31.630,0.000,46.378,93,102,834,1136,1528,1, +80.994,508.34,531.28,19.84,19.84,19.84,0.00,19.84,0.000,0.000,45.315,94,102,834,1136,1528,1, +81.623,573.16,596.43,17.49,14.31,19.08,4.77,14.31,29.166,0.000,43.615,94,102,834,1136,1528,1, +82.205,325.98,350.30,18.90,18.90,18.90,0.00,18.90,29.956,0.000,44.336,94,102,834,1136,1528,1, +82.808,401.68,427.91,18.23,14.91,18.23,3.31,14.91,29.557,0.000,45.272,94,102,834,1136,1528,1, +83.526,477.82,502.45,18.10,13.93,18.10,4.18,13.93,28.612,0.000,46.610,93,102,834,1136,1528,1, +84.139,549.80,572.65,17.96,14.69,17.96,3.27,14.69,34.888,0.000,46.067,93,102,834,1136,1528,1, +84.810,316.13,339.57,17.86,14.89,17.86,2.98,14.89,27.417,0.000,45.942,93,102,834,1136,1528,1, +85.440,395.12,422.58,19.07,17.48,17.48,0.00,17.48,0.000,0.000,45.294,92,102,834,1136,1528,1, +86.030,467.85,487.57,18.64,16.95,18.64,1.69,16.95,35.814,0.000,46.007,93,102,834,1136,1528,1, +86.647,531.43,552.75,16.20,14.58,17.82,3.24,14.58,28.266,0.000,46.325,93,102,834,1136,1528,1, +87.161,589.51,610.91,19.45,15.56,17.51,1.95,15.56,26.862,0.000,47.540,93,102,834,1136,1528,1, +87.851,326.30,353.07,15.93,15.93,17.38,1.45,15.93,30.726,0.000,46.881,93,102,834,1136,1528,1, +88.480,396.61,419.38,17.51,12.73,17.51,4.77,12.73,27.200,0.000,46.826,93,102,834,1136,1528,1, +89.090,472.84,495.95,18.01,18.01,18.01,0.00,18.01,26.428,0.000,44.992,93,103,834,1136,1528,1, +89.657,544.71,564.21,19.42,15.89,17.65,1.77,15.89,27.276,0.000,46.803,93,103,834,1136,1528,1, +90.163,312.39,338.62,15.82,17.80,17.80,0.00,17.80,0.000,0.000,45.970,93,103,834,1136,1528,1, +90.772,385.86,411.36,18.04,18.04,18.04,0.00,18.04,0.000,0.000,45.778,92,103,834,1136,1528,1, +91.042,417.29,444.80,22.27,18.56,18.56,0.00,18.56,0.000,0.000,42.372,92,104,834,1136,1528,1, +91.497,192.25,201.02,6.59,2.20,8.79,0.00,8.79,0.000,0.000,33.727,89,101,778,1136,1528,1,SHOT_START +92.007,464.46,251.45,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,89,101,805,1136,1528,1, +92.507,464.59,447.55,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,89,101,825,1136,1528,1, +93.002,548.56,569.71,8.07,4.04,6.06,2.02,4.04,29.354,0.000,43.473,95,106,874,1136,1528,1,SHOT_END +93.621,614.79,637.85,17.79,17.79,19.40,1.62,17.79,27.262,0.000,45.769,96,105,849,1136,1528,1, +94.355,696.06,720.46,17.70,13.61,17.70,2.72,14.97,25.470,0.000,46.657,93,105,849,1136,1528,1, +94.984,769.98,790.71,17.50,17.50,17.50,1.59,15.91,27.855,0.000,46.598,96,105,849,1136,1528,1, +95.648,541.63,565.87,18.07,15.06,18.07,3.01,15.06,25.998,0.000,44.790,96,105,845,1136,1528,1, +96.251,615.01,641.43,18.25,18.25,18.25,0.00,18.25,0.000,0.000,44.775,96,105,845,1136,1528,1, +96.933,701.02,727.52,19.07,17.60,17.60,0.00,17.60,0.000,0.000,45.020,95,105,845,1136,1528,1, +97.594,773.64,799.16,16.62,16.62,18.13,1.51,16.62,27.230,0.000,47.146,99,105,845,1136,1528,1, +98.334,526.09,550.12,17.58,16.22,17.58,1.35,16.22,24.614,0.000,46.394,99,105,845,1136,1528,1, +98.981,608.28,634.66,18.55,15.46,17.01,1.55,15.46,26.515,0.000,45.404,98,105,844,1136,1528,1, +99.688,687.70,710.96,16.98,16.98,18.39,1.41,16.98,25.913,0.000,46.079,99,105,845,1136,1528,1, +100.386,767.46,788.24,18.62,15.75,18.62,2.86,15.75,27.707,0.000,44.328,99,105,845,1136,1528,1, +101.084,740.46,756.73,18.63,17.20,17.20,0.00,17.20,27.164,0.000,47.910,99,105,845,1136,1528,1, +101.704,563.85,590.17,16.11,16.11,17.73,1.61,16.11,26.685,0.000,46.820,99,105,845,1136,1528,1, +102.426,647.36,670.18,18.02,15.24,18.02,2.77,15.24,26.993,0.000,45.655,99,105,845,1136,1528,1, +103.137,738.30,761.93,18.27,15.46,16.86,1.41,15.46,31.515,0.000,47.167,98,105,845,1136,1528,1, +103.782,805.72,828.06,17.07,18.63,18.63,0.00,18.63,0.000,0.000,46.179,99,105,844,1136,1528,1, +104.561,330.02,353.63,17.96,15.39,17.96,2.57,15.39,25.346,0.000,45.617,99,105,845,1136,1528,1, +105.189,399.88,424.69,17.53,14.34,17.53,3.19,14.34,28.844,0.000,46.374,99,105,845,1136,1528,1, +105.922,484.84,511.11,17.73,16.37,17.73,1.36,16.37,27.780,0.000,46.084,99,105,845,1136,1528,1, +106.698,575.13,600.65,18.03,15.46,18.03,2.58,15.46,27.946,0.000,45.592,99,105,845,1136,1528,1, +107.374,317.73,340.02,17.76,16.28,17.76,1.48,16.28,31.472,0.000,46.495,99,105,840,1136,1528,1, +108.192,412.86,435.73,18.33,13.44,17.11,4.89,13.44,27.873,0.000,46.463,99,105,840,1136,1528,1, +109.017,498.12,521.90,16.98,14.56,18.20,2.43,14.56,27.532,0.000,46.785,99,105,840,1136,1528,1, +109.743,586.48,608.17,17.89,16.51,17.89,1.38,16.51,31.948,0.000,45.717,99,105,840,1136,1528,1, +110.432,329.77,353.07,18.89,15.98,17.43,2.91,15.98,33.093,0.000,44.659,99,105,840,1136,1528,1, +111.133,399.84,425.25,17.12,12.84,18.55,4.28,12.84,30.481,0.000,46.045,98,105,840,1136,1528,1, +111.919,489.65,512.25,17.81,12.72,17.81,5.09,12.72,25.998,0.000,46.374,98,105,840,1136,1528,1, +112.702,578.00,600.57,17.89,17.89,17.89,0.00,17.89,0.000,0.000,45.961,98,105,840,1136,1528,1, +113.546,347.60,373.78,17.77,10.66,16.58,5.92,10.66,35.825,0.000,46.324,97,105,840,1136,1528,1, +114.263,426.00,450.66,18.12,18.12,19.52,1.39,18.12,26.936,0.000,43.893,98,105,840,1136,1528,1, +115.016,520.13,545.42,18.60,13.29,17.27,3.99,13.29,29.034,0.000,46.128,99,105,840,1136,1528,1, +115.817,603.01,627.96,17.48,18.73,18.73,0.00,18.73,0.000,0.000,44.973,100,105,840,1136,1528,1, +116.604,339.71,365.00,17.78,15.24,17.78,2.54,15.24,29.306,0.000,46.773,100,105,840,1136,1528,1, +117.377,431.19,455.23,18.12,16.83,18.12,1.29,16.83,29.809,0.000,45.485,100,105,840,1136,1528,1, +118.254,530.05,551.10,18.24,15.96,18.24,2.28,15.96,27.074,0.000,44.700,100,105,840,1136,1528,1, +119.017,624.82,649.33,18.36,15.74,18.36,2.62,15.74,26.937,0.000,43.311,100,104,840,1136,1528,1, +119.808,335.54,359.26,17.70,13.91,17.70,3.79,13.91,27.411,0.000,46.996,100,105,840,1136,1528,1, +120.393,418.80,441.20,20.49,18.79,18.79,0.00,18.79,26.785,0.000,43.754,100,105,840,1136,1528,1, +121.068,497.04,522.60,17.78,17.78,19.26,1.48,17.78,26.380,0.000,42.576,104,105,840,1136,1528,1, +121.497,192.27,201.28,11.66,6.99,11.66,0.00,11.66,0.000,0.000,34.382,102,103,779,1136,1528,1,SHOT_START +121.998,464.42,231.95,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,102,103,804,1136,1528,1, +122.499,464.55,435.73,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,102,103,826,1136,1528,1, +122.999,550.45,564.25,8.00,6.00,6.00,0.00,6.00,0.000,0.000,43.444,102,107,874,1136,1528,1,SHOT_END +123.773,630.29,653.79,18.09,15.51,19.38,3.88,15.51,30.109,0.000,44.449,109,107,849,1136,1528,1, +124.429,710.07,736.25,18.30,15.25,18.30,3.05,15.25,29.663,0.000,44.934,109,107,849,1136,1528,1, +125.171,809.13,833.16,18.86,17.51,17.51,0.00,17.51,0.000,0.000,45.392,108,107,849,1136,1528,1, +125.877,565.39,588.84,17.01,17.01,18.43,1.42,17.01,27.287,0.000,46.859,110,107,845,1136,1528,1, +126.672,655.46,678.64,17.60,15.09,17.60,2.51,15.09,25.166,0.000,47.134,110,107,845,1136,1528,1, +127.587,758.85,779.79,17.49,14.21,17.49,3.28,14.21,30.691,0.000,46.875,110,107,845,1136,1528,1, +128.400,505.48,532.23,18.45,14.76,17.22,2.46,14.76,26.559,0.000,47.626,110,107,845,1136,1528,1, +129.205,595.89,619.54,16.15,14.91,17.39,2.48,14.91,28.676,0.000,47.002,110,107,845,1136,1528,1, +130.006,702.86,721.76,19.98,18.73,18.73,0.00,18.73,0.000,0.000,43.705,109,107,845,1136,1528,1, +130.853,800.77,821.09,17.71,17.71,18.89,1.18,17.71,30.285,0.000,44.187,109,107,845,1136,1528,1, +131.624,537.08,563.24,18.16,12.97,16.87,3.89,12.97,28.911,0.000,46.573,108,107,845,1136,1528,1, +132.361,620.61,640.56,18.98,16.27,18.98,2.71,16.27,29.967,0.000,46.351,109,107,843,1136,1528,1, +133.243,717.49,739.07,17.01,15.87,18.14,2.27,15.87,29.054,0.000,46.510,109,107,843,1136,1528,1, +134.020,809.26,831.20,19.32,15.45,19.32,3.86,15.45,26.957,0.000,42.761,109,107,843,1136,1528,1, +134.881,317.38,342.77,17.42,13.93,17.42,3.48,13.93,25.895,0.000,47.095,109,107,843,1136,1528,1, +135.689,413.87,439.63,18.56,16.08,18.56,2.47,16.08,27.173,0.000,45.287,110,107,843,1136,1528,1, +136.520,516.05,542.55,19.26,15.65,18.05,2.41,15.65,28.406,0.000,44.781,109,107,843,1136,1528,1, +137.303,601.83,623.86,17.88,15.33,19.16,3.83,15.33,27.364,0.000,45.633,109,107,843,1136,1528,1, +138.061,326.63,350.44,18.48,15.84,18.48,2.64,15.84,29.325,0.000,45.363,109,107,838,1136,1528,1, +138.954,433.31,457.45,19.04,15.68,19.04,3.36,15.68,26.690,0.000,43.261,109,107,838,1136,1528,1, +139.754,530.38,553.01,18.75,16.25,18.75,2.50,16.25,25.574,0.000,44.657,109,107,838,1136,1528,1, +140.590,636.59,660.13,19.14,15.55,19.14,3.59,15.55,34.441,0.000,42.339,109,107,838,1136,1528,1, +141.362,355.17,376.00,19.42,15.54,18.13,2.59,15.54,29.980,0.000,46.352,109,107,838,1136,1528,1, +142.214,456.66,477.43,18.77,15.25,18.77,3.52,15.25,28.376,0.000,44.493,109,107,838,1136,1528,1, +142.942,543.39,567.98,17.86,19.23,19.23,0.00,19.23,0.000,0.000,43.634,109,107,838,1136,1528,1, +143.704,647.05,671.20,19.69,17.07,18.38,1.31,17.07,24.866,0.000,43.332,108,107,838,1136,1528,1, +144.339,338.39,362.36,17.31,17.31,18.89,1.57,17.31,25.731,0.000,47.304,109,107,838,1136,1528,1, +145.137,442.04,468.10,20.06,17.55,18.81,1.25,17.55,28.252,0.000,44.319,109,107,838,1136,1528,1, +145.954,535.31,558.73,17.13,17.13,18.35,1.22,17.13,25.904,0.000,45.725,109,107,838,1136,1528,1, +146.910,309.89,335.89,18.84,15.70,17.79,2.09,15.70,27.236,0.000,44.834,108,107,838,1136,1528,1, +147.731,397.04,423.30,18.28,18.28,19.50,1.22,18.28,25.722,0.000,44.679,110,107,838,1136,1528,1, +148.460,495.66,516.79,19.20,19.20,19.20,0.00,19.20,0.000,0.000,43.282,110,107,838,1136,1528,1, +149.272,595.86,622.29,18.47,13.54,17.24,3.69,13.54,25.922,0.000,46.524,109,107,838,1136,1528,1, +150.047,344.87,368.34,18.06,18.06,19.35,1.29,18.06,25.873,0.000,45.033,111,107,838,1136,1528,1, +150.849,443.25,469.86,18.71,17.47,18.71,1.25,17.47,25.118,0.000,44.169,111,107,838,1136,1528,1, +151.714,540.25,562.41,18.50,13.87,18.50,4.62,13.87,26.248,0.000,45.324,111,107,838,1136,1528,1, +152.440,636.83,660.50,19.28,19.28,19.28,0.00,19.28,25.017,0.000,43.197,110,107,838,1136,1528,1, +153.203,371.41,395.28,19.66,18.35,18.35,0.00,18.35,0.000,0.000,45.232,110,107,838,1136,1528,1, +154.008,465.14,488.29,17.40,18.64,18.64,0.00,18.64,0.000,0.000,44.859,110,107,838,1136,1528,1, +154.875,563.79,589.34,18.45,16.14,18.45,2.31,16.14,26.783,0.000,45.226,111,107,838,1136,1528,1, +155.783,289.63,313.43,18.72,16.52,18.72,2.20,16.52,31.315,0.000,43.936,110,107,838,1136,1528,1, +156.632,402.13,421.80,20.02,17.66,18.84,1.18,17.66,30.055,0.000,43.994,110,107,838,1136,1528,1, +157.497,503.70,523.28,18.50,15.03,18.50,3.47,15.03,24.097,0.000,45.023,112,107,838,1136,1528,1, +158.318,603.98,629.22,18.28,19.50,19.50,0.00,19.50,0.000,0.000,42.720,112,107,838,1136,1528,1, +159.172,369.85,391.76,19.90,17.56,18.73,1.17,17.56,26.362,0.000,44.507,112,107,838,1136,1528,1, +160.084,475.16,501.54,17.54,17.54,18.64,1.10,17.54,23.297,0.000,44.871,112,106,838,1136,1528,1, +160.929,578.76,603.55,18.93,16.56,18.93,2.37,16.56,26.553,0.000,43.610,116,108,838,1136,1528,1, +161.673,667.09,692.16,18.82,18.82,18.82,0.00,18.82,0.000,0.000,44.553,116,107,838,1136,1528,1, +162.652,395.27,419.40,18.39,16.35,18.39,2.04,16.35,26.373,0.000,45.220,116,106,838,1136,1528,1, +163.569,500.23,524.67,18.53,15.26,18.53,3.27,15.26,28.840,0.000,45.025,115,106,838,1136,1528,1, +164.330,597.09,622.70,18.40,18.40,18.40,0.00,18.40,27.029,0.000,44.727,115,106,838,1136,1528,1, +165.189,306.93,331.63,18.64,16.31,18.64,2.33,16.31,25.448,0.000,44.339,115,106,838,1136,1528,1, +166.127,427.63,447.56,19.18,14.92,18.12,3.20,14.92,25.421,0.000,45.991,115,106,838,1136,1528,1, +167.086,532.47,555.00,17.73,16.69,18.77,2.09,16.69,26.892,0.000,44.454,115,106,838,1136,1528,1, +167.939,642.33,667.60,19.94,17.59,18.76,1.17,17.59,26.619,0.000,44.190,115,106,838,1136,1528,1, +168.871,383.46,409.20,17.17,16.10,18.24,2.15,16.10,28.460,0.000,45.867,115,106,838,1136,1528,1, +169.750,486.35,511.97,19.32,15.91,18.19,2.27,15.91,28.641,0.000,46.213,115,106,838,1136,1528,1, +170.606,590.89,613.28,17.53,17.53,18.70,1.17,17.53,25.278,0.000,44.439,115,106,838,1136,1528,1, +171.389,688.80,713.75,19.16,17.89,19.16,1.28,17.89,30.105,0.000,43.293,115,106,838,1136,1528,1, +172.192,346.34,373.46,18.68,18.68,18.68,0.00,18.68,0.000,0.000,44.420,115,106,813,1136,1528,1, +173.039,447.28,471.89,18.90,17.72,18.90,1.18,17.72,27.716,0.000,44.165,115,106,813,1136,1528,1, +173.978,568.42,594.27,20.24,17.04,19.17,2.13,17.04,26.042,0.000,43.343,115,106,813,1136,1528,1, +174.770,319.63,346.98,18.94,18.94,18.94,0.00,18.94,0.000,0.000,43.972,115,106,813,1136,1528,1, +175.574,418.82,444.93,18.64,17.40,18.64,1.24,17.40,27.524,0.000,44.621,115,106,813,1136,1528,1, +176.471,537.46,558.10,18.96,17.85,18.96,1.12,17.85,33.900,0.000,43.551,115,106,813,1136,1528,1, +177.394,640.34,665.63,18.41,16.24,18.41,2.17,16.24,25.416,0.000,45.571,115,106,813,1136,1528,1, +178.247,365.04,391.82,17.60,17.60,18.77,1.17,17.60,25.183,0.000,44.529,115,106,812,1136,1528,1, +179.037,470.32,496.39,20.25,17.72,18.98,1.27,17.72,25.877,0.000,43.035,115,106,812,1136,1528,1, +179.886,570.23,593.22,17.67,18.85,18.85,0.00,18.85,0.000,0.000,44.439,115,106,812,1136,1528,1, +180.692,600.61,616.31,19.85,14.89,18.61,3.72,14.89,26.648,0.000,44.016,115,106,812,1136,1528,1, +181.496,355.12,377.75,17.41,17.41,18.66,1.24,17.41,0.000,0.000,45.283,115,106,812,1136,1528,1, +182.498,488.23,515.41,18.96,15.97,17.96,2.00,15.97,27.227,0.000,44.363,114,106,812,1136,1528,1, +183.427,597.90,621.93,18.30,16.15,18.30,2.15,16.15,26.460,0.000,45.006,115,106,812,1136,1528,1, +184.302,353.33,377.25,18.29,18.29,19.43,1.14,18.29,26.940,0.000,44.378,116,106,812,1136,1528,1, +185.120,456.84,483.25,19.55,17.11,18.33,1.22,17.11,26.627,0.000,43.524,115,106,812,1136,1528,1, +186.097,569.07,592.38,18.43,17.41,19.46,2.05,17.41,25.659,0.000,43.837,116,106,812,1136,1528,1, +187.087,683.57,705.23,18.19,15.15,18.19,3.03,15.15,27.841,0.000,45.548,116,106,812,1136,1528,1, +188.002,370.26,396.89,18.56,16.38,18.56,2.18,16.38,28.447,0.000,45.115,115,106,812,1136,1528,1, +188.891,484.00,506.75,19.14,19.14,19.14,0.00,19.14,0.000,0.000,42.997,115,106,812,1136,1528,1, +189.779,602.25,621.04,20.27,18.01,19.14,1.13,18.01,26.858,0.000,43.483,115,106,812,1136,1528,1, +190.741,363.18,390.23,17.67,16.63,18.71,2.08,16.63,27.296,0.000,44.862,115,106,812,1136,1528,1, +191.675,473.53,496.60,18.19,16.05,18.19,2.14,16.05,29.625,0.000,46.246,115,106,812,1136,1528,1, +192.577,581.83,607.31,18.86,15.53,18.86,3.33,15.53,27.501,0.000,43.859,115,106,812,1136,1528,1, +193.421,686.89,712.23,18.94,17.76,18.94,1.18,17.76,25.995,0.000,44.262,115,106,812,1136,1528,1, +194.324,377.40,397.26,19.95,16.63,18.84,2.22,16.63,26.047,0.000,43.769,115,106,812,1136,1528,1, +195.224,479.45,502.44,17.78,18.89,18.89,0.00,18.89,0.000,0.000,44.612,115,106,812,1136,1528,1, +196.190,600.59,625.90,18.62,16.56,18.62,2.07,16.56,28.650,0.000,44.777,115,106,812,1136,1528,1, +197.256,366.50,393.56,18.77,18.77,18.77,0.00,18.77,0.000,0.000,44.410,115,106,812,1136,1528,1, +198.103,468.42,494.59,18.89,18.89,18.89,0.00,18.89,0.000,0.000,43.890,115,106,812,1136,1528,1, +199.060,591.90,612.78,18.80,17.76,18.80,1.04,17.76,28.798,0.000,44.469,115,106,812,1136,1528,1, +200.025,708.77,732.59,18.64,16.57,18.64,2.07,16.57,30.369,0.000,44.589,115,106,812,1136,1528,1, +200.972,384.14,408.53,19.02,15.85,17.96,2.11,15.85,40.257,0.000,44.770,114,106,812,1136,1528,1, +201.901,484.76,507.85,18.30,18.30,19.38,1.08,18.30,33.311,0.000,44.650,115,106,812,1136,1528,1, +202.769,601.54,627.69,19.59,18.43,18.43,0.00,18.43,0.000,0.000,43.256,114,106,812,1136,1528,1, +203.791,381.80,406.95,18.58,15.65,18.58,2.93,15.65,27.314,0.000,44.391,114,106,812,1136,1528,1, +204.799,493.00,519.36,18.86,13.89,18.86,4.96,13.89,28.125,0.000,43.627,114,106,812,1136,1528,1, +205.805,607.55,630.57,17.89,15.90,18.88,2.98,15.90,25.651,0.000,45.556,115,106,812,1136,1528,1, +206.888,283.03,307.07,17.54,14.77,17.54,2.77,14.77,28.969,0.000,47.196,115,106,812,1136,1528,1, +207.882,402.25,424.81,18.11,17.10,18.11,1.01,17.10,29.089,0.000,44.263,115,106,812,1136,1528,1, +208.900,525.27,551.10,18.67,15.72,17.69,1.97,15.72,26.932,0.000,45.450,114,106,812,1136,1528,1, +209.990,649.11,670.10,17.44,16.52,18.35,1.84,16.52,26.915,0.000,45.857,116,106,812,1136,1528,1, +211.070,363.73,385.65,17.58,13.88,17.58,3.70,13.88,28.026,0.000,47.064,116,106,812,1136,1528,1, +212.159,485.61,511.13,17.45,12.86,17.45,4.59,12.86,29.526,0.000,46.709,116,106,812,1136,1528,1, +213.115,590.81,615.81,17.78,15.69,17.78,2.09,15.69,27.060,0.000,46.044,116,106,812,1136,1528,1, +214.220,334.99,358.93,18.10,16.29,18.10,1.81,16.29,24.583,0.000,45.459,116,106,812,1136,1528,1, +215.437,478.98,502.63,18.08,14.79,17.26,3.29,13.97,29.038,0.000,46.289,116,106,812,1136,1528,1, +216.489,603.27,626.93,18.05,17.10,19.00,0.95,18.05,28.149,0.000,43.884,115,106,812,1136,1528,1, +217.614,270.58,296.53,17.79,16.90,17.79,0.89,16.90,32.018,0.000,46.115,116,106,812,1136,1528,1, +218.760,408.33,430.58,18.33,14.84,18.33,3.49,14.84,27.296,0.000,43.675,116,106,812,1136,1528,1, +219.926,542.75,563.93,18.00,15.43,18.00,2.57,15.43,29.119,0.000,45.537,116,106,812,1136,1528,1, +220.955,667.21,689.79,18.46,17.48,18.46,0.97,17.48,25.455,0.000,44.191,116,106,812,1136,1528,1, +222.087,376.97,400.65,17.68,14.14,17.68,3.54,14.14,28.601,0.000,46.469,116,106,812,1136,1528,1, +223.121,503.60,526.37,18.37,15.47,17.40,2.90,15.47,25.990,0.000,45.924,116,106,812,1136,1528,1, +224.208,629.04,652.82,17.47,12.88,17.47,3.68,12.88,29.500,0.000,46.678,116,106,812,1136,1528,1, +225.282,372.49,395.81,17.69,16.76,17.69,0.93,16.76,28.372,0.000,47.077,116,106,812,1136,1528,1, +226.279,484.71,505.56,18.06,18.06,19.07,1.00,18.06,26.983,0.000,43.839,117,106,812,1136,1528,1, +227.429,619.14,644.25,18.26,15.65,18.26,2.61,15.65,33.949,0.000,44.677,117,106,812,1136,1528,1, +228.475,317.73,341.20,18.16,14.34,17.21,2.87,14.34,28.124,0.000,46.375,116,106,812,1136,1528,1, +229.525,424.98,447.42,17.14,14.28,18.09,3.81,14.28,29.454,0.000,47.083,117,106,812,1136,1528,1, +230.467,531.20,554.08,18.05,16.99,18.05,1.06,16.99,32.201,0.000,45.431,117,106,812,1136,1528,1, +231.465,653.99,675.80,18.04,17.04,18.04,1.00,17.04,27.478,0.000,45.148,117,106,812,1136,1528,1, +232.561,381.82,405.80,18.24,15.51,18.24,2.74,15.51,25.593,0.000,44.867,117,106,812,1136,1528,1, +233.613,498.43,523.53,18.07,14.26,18.07,3.80,14.26,29.983,0.000,45.372,117,106,812,1136,1528,1, +234.588,611.95,636.27,17.43,15.38,17.43,2.05,15.38,25.803,0.000,46.556,117,106,812,1136,1528,1, +235.655,361.92,385.79,17.82,17.82,17.82,0.00,17.82,0.000,0.000,45.843,117,106,812,1136,1528,1, +236.815,496.34,521.66,18.10,15.52,18.10,2.59,15.52,28.478,0.000,45.155,117,106,812,1136,1528,1, +237.847,620.80,644.60,18.40,17.43,18.40,0.97,17.43,26.188,0.000,44.072,117,106,812,1136,1528,1, +238.978,327.91,355.33,17.68,14.14,17.68,3.54,14.14,26.903,0.000,45.924,117,106,812,1136,1528,1, +239.861,434.90,458.09,18.13,18.13,18.13,0.00,18.13,0.000,0.000,45.481,117,106,812,1136,1528,1, +240.972,558.43,583.52,18.00,15.30,18.00,2.70,15.30,27.095,0.000,45.500,117,106,812,1136,1528,1, +242.070,680.54,702.72,17.31,14.58,17.31,2.73,14.58,31.814,0.000,47.752,116,106,812,1136,1528,1, +243.206,419.95,444.27,18.48,14.96,17.60,2.64,14.96,29.673,0.000,44.954,115,106,812,1136,1528,1, +244.345,541.15,562.17,17.55,15.80,18.43,2.63,15.80,26.995,0.000,45.798,116,106,812,1136,1528,1, +245.469,668.93,691.77,17.80,15.13,17.80,2.67,15.13,25.521,0.000,46.059,116,106,812,1136,1528,1, +246.507,403.89,429.15,18.30,17.34,17.34,0.00,17.34,0.000,0.000,45.843,115,106,812,1136,1528,1, +247.637,526.96,552.99,17.70,15.93,18.59,2.66,15.93,26.792,0.000,44.888,116,106,812,1136,1528,1, +248.782,664.00,686.02,18.34,16.59,18.34,1.75,16.59,25.591,0.000,44.368,116,106,812,1136,1528,1, +249.953,340.90,362.80,17.08,13.67,17.08,3.42,13.67,28.311,0.000,47.846,116,106,812,1136,1528,1, +251.142,476.99,503.02,17.66,15.97,17.66,1.68,15.97,28.792,0.000,45.973,116,106,812,1136,1528,1, +252.229,599.93,623.93,17.49,15.65,17.49,1.84,15.65,30.830,0.000,46.387,116,106,812,1136,1528,1, +253.395,308.33,328.22,18.87,17.15,18.01,0.86,17.15,25.536,0.000,45.263,116,106,812,1136,1528,1, +254.649,441.09,464.88,16.74,14.35,17.54,3.19,14.35,30.880,0.000,47.005,116,106,812,1136,1528,1, +255.659,558.91,581.07,17.83,16.84,17.83,0.99,16.84,26.305,0.000,46.055,116,106,812,1136,1528,1, +256.731,575.71,597.50,17.71,15.85,17.71,1.86,15.85,26.297,0.000,45.678,116,106,812,1136,1528,1, +257.806,373.22,397.42,17.67,16.74,17.67,0.93,16.74,35.106,0.000,46.647,116,106,812,1136,1528,1, +258.859,499.34,523.73,18.05,18.05,18.05,0.00,18.05,0.000,0.000,45.443,116,106,812,1136,1528,1, +260.147,640.40,663.22,17.85,14.75,17.85,3.11,14.75,29.412,0.000,46.404,116,106,812,1136,1528,1, +261.169,360.02,384.06,17.60,16.63,17.60,0.98,16.63,27.092,0.000,46.227,116,106,812,1136,1528,1, +262.373,502.73,527.18,18.27,16.61,18.27,1.66,16.61,26.941,0.000,44.615,116,106,812,1136,1528,1, +263.595,638.81,662.28,18.01,15.56,18.01,2.46,15.56,27.677,0.000,45.260,117,106,812,1136,1528,1, +264.672,363.61,386.81,17.64,15.79,17.64,1.86,15.79,26.616,0.000,46.180,117,106,812,1136,1528,1, +265.814,492.31,518.14,17.51,14.89,17.51,2.63,14.89,27.963,0.000,46.373,117,106,812,1136,1528,1, +266.952,620.48,645.04,17.57,14.94,17.57,2.64,14.94,27.069,0.000,46.012,117,106,808,1136,1528,1, +268.092,353.69,380.25,17.54,14.03,17.54,3.51,14.03,28.814,0.000,46.457,117,106,808,1136,1528,1, +269.166,473.94,496.94,17.69,15.83,17.69,1.86,15.83,27.007,0.000,46.633,117,106,808,1136,1528,1, +270.298,611.14,635.11,17.67,14.13,16.78,2.65,14.13,28.184,0.000,47.476,116,106,808,1136,1528,1, +271.225,272.94,298.61,17.27,17.27,18.35,1.08,17.27,26.783,0.000,46.160,117,106,808,1136,1528,1, +272.358,402.20,428.41,17.65,15.00,17.65,2.65,15.00,27.935,0.000,46.381,117,106,808,1136,1528,1, +273.588,540.82,563.57,17.89,16.26,17.89,1.63,16.26,30.546,0.000,45.786,117,106,808,1136,1528,1, +274.851,562.45,580.24,17.41,14.25,17.41,3.17,14.25,30.119,0.000,46.630,117,106,808,1136,1528,1, +276.050,381.51,403.93,17.52,16.69,17.52,0.83,16.69,27.260,0.000,47.150,117,106,808,1136,1528,1, +277.381,544.76,568.70,18.03,14.27,17.27,3.00,14.27,30.465,0.000,46.202,116,106,808,1136,1528,1, +278.556,665.39,687.57,17.02,16.17,17.87,1.70,16.17,32.857,0.000,47.197,117,106,808,1136,1528,1, +279.663,373.57,396.96,18.06,17.16,18.06,0.90,17.16,28.974,0.000,45.353,117,106,808,1136,1528,1, +280.787,503.55,525.79,17.80,16.02,17.80,1.78,16.02,30.821,0.000,45.748,117,106,808,1136,1528,1, +282.059,656.99,679.10,18.09,16.51,18.09,1.57,16.51,26.847,0.000,45.168,117,106,808,1136,1528,1, +283.340,384.08,408.09,17.95,15.61,17.95,2.34,15.61,25.515,0.000,45.293,117,106,808,1136,1528,1, +284.627,537.51,559.45,17.87,15.54,17.87,2.33,15.54,28.925,0.000,45.789,117,106,808,1136,1528,1, +285.778,676.86,700.18,18.24,13.90,17.37,3.47,13.90,27.794,0.000,45.397,117,106,808,1136,1528,1, +286.973,385.18,407.91,17.58,17.58,18.41,0.84,17.58,26.666,0.000,45.843,118,106,808,1136,1528,1, +288.311,538.50,560.82,17.93,14.20,17.93,3.74,14.20,26.460,0.000,45.707,118,106,808,1136,1528,1, +289.616,690.24,712.27,17.63,15.33,17.63,2.30,15.33,27.846,0.000,46.142,118,106,808,1136,1528,1, +290.853,403.26,425.31,17.79,16.17,17.79,1.62,16.17,25.648,0.000,45.963,118,106,808,1136,1528,1, +291.985,534.37,556.52,17.67,16.78,17.67,0.88,16.78,30.933,0.000,46.557,118,106,808,1136,1528,1, +293.135,662.14,686.80,17.38,14.78,17.38,2.61,14.78,26.368,0.000,47.429,118,106,808,1136,1528,1, +294.329,364.77,385.13,18.43,13.40,17.59,4.19,13.40,28.494,0.000,46.903,118,106,808,1136,1528,1, +295.469,479.90,505.64,16.67,13.16,17.54,4.39,13.16,28.885,0.000,47.181,119,106,808,1136,1528,1, +296.627,623.70,646.53,18.13,18.13,18.13,0.00,18.13,27.652,0.000,44.925,118,106,808,1136,1528,1, +297.739,345.18,368.45,17.99,17.09,17.99,0.90,17.09,28.095,0.000,45.079,118,106,808,1136,1528,1, +298.837,478.63,499.83,18.22,18.22,18.22,0.00,18.22,0.000,0.000,45.030,118,106,808,1136,1528,1, +300.035,615.43,639.61,17.52,15.85,17.52,1.67,15.85,29.886,0.000,46.889,118,106,808,1136,1528,1, +301.255,315.32,337.04,17.22,15.58,17.22,1.64,15.58,26.841,0.000,48.263,118,106,808,1136,1528,1, +302.331,443.00,468.54,17.67,16.74,17.67,0.93,16.74,28.274,0.000,45.864,118,107,808,1136,1528,1, +302.971,513.94,537.39,18.75,17.19,18.75,1.56,17.19,28.353,0.000,43.930,118,107,808,1136,1528,1, +303.338,417.50,442.84,19.08,16.35,19.08,0.00,19.08,0.000,0.000,39.624,111,105,738,1136,1528,1,SHOT_START +303.497,199.27,208.37,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,115,105,770,1136,1528,1, +304.008,191.35,181.72,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,116,105,761,1136,1528,1, +304.510,471.48,406.50,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,115,105,814,1136,1528,1, +304.997,525.04,539.51,2.05,0.00,2.05,2.05,0.00,46.317,0.000,49.240,122,110,857,1136,1528,1,SHOT_END +305.893,626.13,649.36,17.86,17.86,17.86,1.12,16.74,31.141,0.000,45.347,121,109,839,1136,1528,1, +306.960,742.68,764.97,16.88,15.01,16.88,1.88,15.01,32.889,0.000,49.105,121,109,839,1136,1528,1, +308.052,604.96,627.27,17.39,15.56,17.39,1.83,15.56,26.621,0.000,47.224,121,109,835,1136,1528,1, +309.224,740.84,763.57,17.92,16.21,17.92,1.71,16.21,27.062,0.000,45.647,122,109,835,1136,1528,1, +310.469,892.89,917.76,18.48,17.68,17.68,0.00,17.68,0.000,0.000,45.760,121,109,835,1136,1528,1, +311.584,599.16,623.97,17.04,16.15,17.94,1.79,16.15,26.625,0.000,45.879,121,109,835,1136,1528,1, +312.750,735.87,761.86,18.00,13.71,17.14,3.43,13.71,28.730,0.000,46.882,120,109,835,1136,1528,1, +313.961,872.94,897.89,18.17,16.52,18.17,1.65,16.52,29.860,0.000,46.061,122,109,835,1136,1528,1, +314.936,344.89,372.05,16.42,16.42,17.44,1.03,16.42,25.499,0.000,47.072,121,109,835,1136,1528,1, +316.048,475.59,501.48,17.98,16.18,17.98,1.80,16.18,25.934,0.000,45.186,121,109,835,1136,1528,1, +317.210,609.17,634.37,18.07,17.21,18.07,0.86,17.21,25.433,0.000,45.673,121,109,835,1136,1528,1, +318.502,345.33,368.07,17.81,15.48,17.81,2.32,15.48,26.254,0.000,45.492,121,109,830,1136,1528,1, +319.642,491.99,515.87,18.43,15.80,17.55,1.76,15.80,27.205,0.000,44.870,121,109,830,1136,1528,1, +320.931,640.73,659.59,18.62,16.29,18.62,2.33,16.29,27.954,0.000,45.101,122,109,830,1136,1528,1, +322.166,347.28,372.50,17.81,17.00,18.62,1.62,17.00,32.116,0.000,44.862,122,109,830,1136,1528,1, +323.325,497.50,522.57,18.98,18.11,18.98,0.86,18.11,24.176,0.000,43.995,122,109,830,1136,1528,1, +324.623,650.75,675.62,18.49,15.41,18.49,3.08,15.41,29.179,0.000,45.399,121,109,830,1136,1528,1, +325.835,368.59,391.29,18.15,16.50,18.15,1.65,16.50,31.569,0.000,46.475,121,109,830,1136,1528,1, +327.005,509.55,531.97,18.80,17.09,18.80,1.71,17.09,26.152,0.000,44.487,121,109,830,1136,1528,1, +328.287,667.20,692.26,18.72,15.60,18.72,3.12,15.60,27.417,0.000,44.510,121,109,830,1136,1528,1, +329.486,371.73,392.10,18.35,15.85,18.35,2.50,15.85,27.036,0.000,45.756,122,109,830,1136,1528,1, +330.707,530.76,555.77,18.84,15.56,18.02,2.46,15.56,29.837,0.000,45.341,120,109,830,1136,1528,1, +331.911,662.28,685.20,18.28,16.62,19.11,2.49,16.62,26.978,0.000,44.664,121,109,830,1136,1528,1, +333.136,391.79,417.46,18.78,17.14,18.78,1.63,17.14,28.391,0.000,43.988,121,109,830,1136,1528,1, +334.471,549.52,573.09,18.73,17.23,18.73,1.50,17.23,26.827,0.000,44.344,121,109,832,1136,1528,1, +335.773,718.72,743.39,19.20,14.59,18.43,3.84,14.59,29.683,0.000,44.189,120,109,832,1136,1528,1, +336.993,388.27,415.03,18.03,16.39,18.85,2.46,16.39,26.115,0.000,45.209,121,109,832,1136,1528,1, +338.221,540.35,566.17,19.54,17.92,18.73,0.81,17.92,30.189,0.000,44.699,121,108,832,1136,1528,1, diff --git a/docs/06_TEST/data/perf_v1.7.csv b/docs/06_TEST/data/perf_v1.7.csv new file mode 100644 index 0000000..f116b0b --- /dev/null +++ b/docs/06_TEST/data/perf_v1.7.csv @@ -0,0 +1,437 @@ +elapsed_sec,private_MB,ws_MB,callback_fps,main_paint_fps,sub_update_fps,sub_paint_fps,sub_drop_fps,sub_paint_ms,main_copy_ms,sub_copy_ms,gdi_objects,user_objects,handle_count,img_w,img_h,sub_shown,event +1.161,260.06,280.56,25.84,18.95,18.95,15.51,3.45,32.598,0.000,44.583,77,94,797,1136,1528,1, +1.657,274.71,294.18,12.08,10.07,14.10,10.07,2.01,27.713,0.000,46.428,77,94,797,1136,1528,1, +2.001,175.91,198.63,14.54,11.63,11.63,5.81,8.72,30.369,0.000,44.473,77,95,791,1136,1528,1, +2.497,190.36,212.49,12.12,12.12,12.12,8.08,4.04,34.887,0.000,49.104,75,94,791,1136,1528,1, +3.008,220.73,242.52,13.68,13.68,13.68,5.86,5.86,35.572,0.000,51.152,74,94,791,1136,1528,1, +3.504,227.52,250.39,12.11,12.11,12.11,10.09,4.04,37.137,0.000,51.236,75,94,791,1136,1528,1, +4.000,236.56,253.08,12.09,14.10,14.10,6.04,6.04,41.716,0.000,47.472,75,94,791,1136,1528,1, +4.497,175.67,193.42,14.08,12.07,12.07,8.05,4.02,27.594,0.000,47.003,74,94,791,1136,1528,1, +5.008,191.63,213.44,13.70,13.70,13.70,7.83,7.83,37.305,0.000,45.901,75,94,791,1136,1528,1, +5.504,203.86,226.16,12.10,10.08,12.10,10.08,2.02,32.628,0.000,50.001,75,94,791,1136,1528,1, +6.000,231.61,254.11,14.10,10.07,14.10,8.06,4.03,41.000,0.000,46.885,75,94,791,1136,1528,1, +6.497,233.00,252.99,12.09,12.09,12.09,12.09,2.01,28.033,0.000,55.010,75,94,791,1136,1528,1, +7.000,176.63,194.97,13.91,11.92,13.91,7.95,5.96,29.506,0.000,44.391,75,94,791,1136,1528,1, +7.502,193.81,216.27,11.94,9.95,11.94,7.96,1.99,39.765,0.000,48.159,75,94,791,1136,1528,1, +8.000,231.18,253.82,14.07,12.06,14.07,6.03,8.04,41.395,0.000,46.050,75,94,791,1136,1528,1, +8.510,250.10,271.02,13.72,11.76,13.72,9.80,3.92,36.538,0.000,46.257,75,94,791,1136,1528,1, +9.008,274.77,296.99,14.06,12.05,14.06,8.04,6.03,33.451,0.000,45.082,74,94,791,1136,1528,1, +9.498,199.57,221.13,14.28,12.24,16.33,8.16,8.16,36.740,0.000,39.653,75,94,791,1136,1528,1, +9.998,212.42,232.09,13.98,9.99,11.99,11.99,2.00,26.582,0.000,48.297,75,94,791,1136,1528,1, +10.498,245.04,267.68,14.02,10.01,14.02,8.01,6.01,36.717,0.000,41.480,75,94,791,1136,1528,1, +11.001,265.66,286.08,13.92,9.95,15.91,7.96,5.97,34.455,0.000,40.195,75,94,791,1136,1528,1, +11.502,297.42,320.11,13.97,11.98,11.98,7.98,5.99,29.228,0.000,43.814,74,94,791,1136,1528,1, +11.999,180.08,202.74,14.06,14.06,14.06,8.04,6.03,30.458,0.000,48.074,75,94,791,1136,1528,1, +12.503,211.16,228.27,13.89,13.89,13.89,5.95,7.94,32.742,0.000,43.771,72,94,791,1136,1528,1, +13.008,227.30,248.63,13.88,11.89,13.88,9.91,3.96,30.325,0.000,47.114,75,94,791,1136,1528,1, +13.498,246.50,268.64,12.25,12.25,14.30,6.13,6.13,29.665,0.000,45.571,76,94,791,1136,1528,1, +14.000,264.62,287.17,13.93,13.93,11.94,7.96,3.98,32.987,0.000,50.830,76,94,790,1136,1528,1, +14.502,189.08,212.39,13.94,13.94,13.94,5.97,7.96,30.381,0.000,44.566,75,94,791,1136,1528,1, +15.005,217.62,240.65,13.93,11.94,13.93,9.95,5.97,33.673,0.000,44.730,75,94,791,1136,1528,1, +15.504,236.89,259.43,14.03,14.03,14.03,6.01,8.02,46.233,0.000,44.436,75,94,791,1136,1528,1, +16.000,272.75,293.34,14.12,12.10,16.13,6.05,8.07,30.809,0.000,42.081,75,94,791,1136,1528,1, +16.510,296.05,315.25,13.71,9.80,13.71,9.80,3.92,35.439,0.000,47.902,75,94,791,1136,1528,1, +17.007,196.70,220.03,14.08,10.06,12.07,8.04,4.02,40.240,0.000,47.792,74,94,791,1136,1528,1, +17.504,210.43,231.39,14.10,14.10,14.10,8.06,8.06,26.313,0.000,47.597,75,94,791,1136,1528,1, +17.999,220.44,242.09,12.10,10.09,12.10,10.09,2.02,35.826,0.000,54.360,75,94,791,1136,1528,1, +18.497,247.77,270.81,12.06,12.06,12.06,6.03,4.02,40.883,0.000,48.338,74,94,791,1136,1528,1, +18.997,236.30,257.29,10.01,12.01,12.01,10.01,2.00,36.496,0.000,61.948,75,94,791,1136,1528,1, +19.501,197.09,217.48,13.87,9.91,13.87,7.93,5.95,37.969,0.000,46.102,75,94,791,1136,1528,1, +19.999,220.34,243.00,14.06,8.03,12.05,10.04,4.02,28.128,0.000,42.374,74,94,791,1136,1528,1, +20.502,233.71,256.39,11.93,11.93,11.93,7.95,3.98,37.076,0.000,51.569,75,94,791,1136,1528,1, +21.000,245.44,268.01,12.04,12.04,14.04,8.02,4.01,35.966,0.000,51.398,75,94,791,1136,1528,1, +21.503,272.34,294.05,13.92,11.93,13.92,7.95,5.96,28.428,0.000,45.908,75,94,791,1136,1528,1, +22.001,191.42,213.23,14.08,10.06,14.08,8.04,6.03,27.855,0.000,41.434,75,94,793,1136,1528,1, +22.496,201.39,219.42,12.10,12.10,12.10,8.07,4.03,42.023,0.000,55.677,73,94,793,1136,1528,1, +23.008,247.63,267.98,15.63,11.72,13.67,7.81,7.81,36.746,0.000,40.081,75,94,793,1136,1528,1, +23.499,278.90,296.29,14.26,10.18,16.29,6.11,8.15,36.858,0.000,39.104,75,94,793,1136,1528,1, +24.000,302.13,324.70,13.97,9.98,11.98,9.98,3.99,33.282,0.000,46.824,75,94,793,1136,1528,1, +24.505,182.00,203.54,11.88,13.86,13.86,5.94,5.94,31.118,0.000,49.569,75,94,793,1136,1528,1, +25.008,189.43,212.29,11.94,9.95,9.95,9.95,1.99,37.314,0.000,63.155,75,94,793,1136,1528,1, +25.504,215.39,238.21,14.10,12.09,14.10,8.06,6.04,42.222,0.000,44.614,75,94,793,1136,1528,1, +26.001,225.18,247.23,12.08,10.07,12.08,10.07,2.01,38.808,0.000,55.647,75,94,793,1136,1528,1, +26.508,266.27,288.95,13.78,7.88,13.78,7.88,3.94,38.305,0.000,42.311,75,94,793,1136,1528,1, +27.007,191.60,214.14,12.04,12.04,12.04,8.03,4.01,29.824,0.000,53.963,75,94,793,1136,1528,1, +27.508,202.91,224.79,11.98,13.97,13.97,7.98,5.99,34.764,0.000,45.705,75,94,793,1136,1528,1, +28.000,206.07,228.63,12.19,10.16,10.16,10.16,2.03,34.993,0.000,57.799,75,94,793,1136,1528,1, +28.498,224.29,245.62,12.06,12.06,12.06,8.04,4.02,36.045,0.000,53.240,74,94,793,1136,1528,1, +28.999,256.04,274.40,13.95,11.96,13.95,5.98,5.98,42.473,0.000,46.800,75,94,793,1136,1528,1, +29.503,169.62,190.98,11.91,11.91,11.91,11.91,1.98,30.590,0.000,53.122,75,94,793,1136,1528,1, +30.000,193.55,216.09,12.08,12.08,12.08,6.04,4.03,27.712,0.000,49.122,75,94,793,1136,1528,1, +30.496,206.91,229.19,14.11,14.11,14.11,8.06,6.05,27.364,0.000,47.649,75,94,793,1136,1528,1, +31.004,230.85,249.40,11.82,13.79,13.79,5.91,7.88,37.816,0.000,47.685,75,94,793,1136,1528,1, +31.501,155.08,174.02,10.05,10.05,10.05,10.05,2.01,28.774,0.000,58.314,74,95,794,1136,1528,1, +32.004,178.88,202.18,9.95,9.95,9.95,7.96,0.00,31.571,0.000,35.881,77,95,798,1136,1528,1, +32.509,164.47,184.05,9.89,9.89,9.89,9.89,0.00,31.738,0.000,40.006,77,95,802,1136,1528,1, +33.007,164.06,180.88,8.03,8.03,8.03,10.04,0.00,31.817,0.000,35.692,72,94,807,1136,1528,1, +33.497,183.58,206.37,10.22,10.22,10.22,8.17,0.00,29.251,0.000,33.668,75,94,811,1136,1528,1, +34.000,170.66,190.48,9.94,7.95,7.95,9.94,0.00,29.022,0.000,35.631,72,94,798,1136,1528,1, +34.500,157.34,179.15,8.00,10.00,10.00,10.00,0.00,31.698,0.000,37.676,75,94,802,1136,1528,1, +35.002,172.52,193.40,9.95,9.95,9.95,7.96,0.00,32.328,0.000,38.958,75,94,807,1136,1528,1, +35.504,170.10,193.57,9.97,7.98,7.98,9.97,0.00,31.004,0.000,33.121,72,94,812,1136,1528,1, +35.999,207.01,230.23,4.03,4.03,4.03,4.03,0.00,29.019,0.000,33.761,74,95,796,1136,1528,1,CALIB_START +36.537,269.11,289.55,16.74,9.30,16.74,7.44,7.44,28.853,0.000,41.908,76,95,798,1136,1528,1, +37.008,309.50,330.89,16.97,16.97,19.09,2.12,16.97,28.707,0.000,40.904,77,95,798,1136,1528,1, +37.573,372.65,390.36,17.72,14.17,17.72,3.54,14.17,38.746,0.000,40.767,77,95,798,1136,1528,1, +38.026,214.06,230.80,17.67,15.46,17.67,2.21,15.46,25.578,0.000,40.898,77,95,795,1136,1528,1, +38.520,271.00,287.79,18.20,14.16,18.20,4.05,14.16,26.723,0.000,39.452,77,95,795,1136,1528,1, +39.014,330.86,350.50,18.23,18.23,18.23,0.00,18.23,0.000,0.000,39.321,77,95,795,1136,1528,1, +39.522,387.62,406.46,17.73,13.79,17.73,3.94,13.79,27.964,0.000,42.001,77,95,795,1136,1528,1, +40.024,446.04,462.51,17.93,15.94,17.93,1.99,15.94,25.200,0.000,40.274,77,95,795,1136,1528,1, +40.537,260.87,282.88,17.52,17.52,17.52,0.00,17.52,0.000,0.000,42.408,77,95,796,1136,1528,1, +41.020,330.11,352.37,18.64,14.50,16.57,2.07,14.50,31.299,0.000,41.226,76,95,795,1136,1528,1, +41.520,378.66,400.55,18.01,20.01,20.01,0.00,20.01,0.000,0.000,38.153,77,95,795,1136,1528,1, +42.015,382.63,405.16,2.02,2.02,2.02,2.02,2.02,28.651,0.000,42.656,72,94,795,1136,1528,1, +42.512,245.76,270.50,12.09,10.08,12.09,0.00,10.08,0.000,0.000,42.644,81,99,887,1136,1528,1,CALIB_END +43.023,312.19,332.77,19.56,17.61,17.61,1.96,15.65,31.382,0.000,45.212,81,100,889,1136,1528,1, +43.587,367.26,388.49,15.95,12.40,17.72,5.32,12.40,28.755,0.000,46.516,82,100,888,1136,1528,1, +44.139,426.96,447.07,18.12,16.31,18.12,1.81,16.31,27.096,0.000,45.119,82,99,863,1136,1528,1, +44.586,215.30,237.18,17.90,17.90,17.90,0.00,17.90,0.000,0.000,45.226,82,99,860,1136,1528,1, +45.063,283.21,306.44,18.88,12.58,16.78,4.19,12.58,29.977,0.000,44.632,81,99,860,1136,1528,1, +45.576,336.83,359.20,17.53,19.48,19.48,0.00,19.48,0.000,0.000,44.995,82,99,860,1136,1528,1, +46.016,390.27,411.02,18.20,18.20,18.20,0.00,18.20,0.000,0.000,45.164,83,99,860,1136,1528,1, +46.545,447.11,470.11,17.01,13.23,17.01,3.78,13.23,27.105,0.000,48.785,83,99,860,1136,1528,1, +47.016,238.89,264.04,19.12,16.99,16.99,0.00,16.99,0.000,0.000,44.847,83,99,860,1136,1528,1, +47.514,298.71,322.31,18.04,16.04,18.04,2.00,16.04,26.472,0.000,44.619,82,99,860,1136,1528,1, +48.016,347.36,367.38,17.95,19.94,19.94,0.00,19.94,0.000,0.000,43.268,83,99,860,1136,1528,1, +48.516,410.71,431.43,18.00,16.00,18.00,2.00,16.00,30.873,0.000,44.972,83,99,860,1136,1528,1, +49.016,470.45,493.40,18.00,18.00,18.00,0.00,18.00,0.000,0.000,45.683,83,99,860,1136,1528,1, +49.523,246.95,268.26,17.74,15.77,17.74,1.97,15.77,25.695,0.000,46.238,83,99,860,1136,1528,1, +50.167,317.54,337.16,17.08,13.97,17.08,3.11,13.97,25.591,0.000,48.128,84,99,860,1136,1528,1, +50.667,375.63,397.75,17.99,15.99,17.99,2.00,15.99,28.630,0.000,45.001,84,99,860,1136,1528,1, +51.213,440.68,463.45,18.33,16.50,18.33,1.83,16.50,32.695,0.000,44.334,84,99,860,1136,1528,1, +51.750,512.02,532.43,18.62,14.89,16.75,1.86,14.89,27.749,0.000,46.344,83,99,860,1136,1528,1, +52.229,260.23,280.69,16.72,14.63,18.81,4.18,14.63,31.648,0.000,47.309,84,99,860,1136,1528,1, +52.632,322.45,345.66,19.83,17.35,17.35,0.00,17.35,26.058,0.000,42.345,83,99,860,1136,1528,1, +53.171,375.39,398.82,16.71,16.71,18.56,1.86,16.71,25.301,0.000,46.600,84,99,860,1136,1528,1, +53.720,437.18,456.31,18.22,16.40,18.22,1.82,16.40,0.000,0.000,45.401,84,99,860,1136,1528,1, +54.158,492.26,513.93,18.25,15.97,18.25,2.28,15.97,26.974,0.000,43.992,84,99,860,1136,1528,1, +54.611,258.58,280.32,17.68,15.47,17.68,2.21,15.47,29.008,0.000,46.427,84,99,860,1136,1528,1, +55.100,312.05,333.10,18.41,16.36,18.41,2.05,16.36,24.003,0.000,44.105,84,99,860,1136,1528,1, +55.594,375.36,398.81,18.22,16.20,18.22,2.02,16.20,27.627,0.000,44.165,84,99,860,1136,1528,1, +56.095,430.62,453.57,17.95,17.95,17.95,0.00,17.95,0.000,0.000,46.169,84,99,860,1136,1528,1, +56.687,505.16,528.73,18.58,15.20,16.89,1.69,15.20,31.722,0.000,46.767,82,99,860,1136,1528,1, +57.213,271.81,295.26,17.11,17.11,19.01,1.90,17.11,28.977,0.000,44.467,85,99,860,1136,1528,1, +57.756,338.61,362.31,18.42,18.42,18.42,0.00,18.42,0.000,0.000,44.212,85,99,860,1136,1528,1, +58.258,392.30,412.64,17.92,13.94,17.92,3.98,13.94,27.526,0.000,46.324,85,99,850,1136,1528,1, +58.816,460.46,479.97,17.94,16.14,17.94,1.79,16.14,27.873,0.000,44.466,85,99,850,1136,1528,1, +59.280,518.83,537.09,19.37,15.06,17.22,2.15,15.06,30.838,0.000,47.301,85,99,850,1136,1528,1, +59.725,266.88,291.06,15.74,17.99,17.99,0.00,17.99,0.000,0.000,45.737,84,100,850,1136,1528,1, +60.103,307.28,328.52,18.54,13.24,18.54,5.30,13.24,32.903,0.000,44.526,84,100,850,1136,1528,1, +60.571,352.23,375.62,17.07,17.07,17.07,2.13,14.94,28.497,0.000,47.995,84,100,850,1136,1528,1, +61.069,423.92,441.33,20.11,18.10,18.10,0.00,18.10,0.000,0.000,45.147,84,100,852,1136,1528,1, +61.563,480.36,499.87,16.19,16.19,18.21,0.00,18.21,0.000,0.000,44.717,81,103,852,1136,1528,1, +62.031,159.12,167.52,12.82,12.82,12.82,0.00,12.82,0.000,0.000,36.349,81,99,798,1136,1528,1,SHOT_START +62.528,178.65,207.31,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,81,100,818,1136,1528,1, +63.027,444.37,412.08,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,81,100,838,1136,1528,1, +63.530,175.86,174.35,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,82,99,783,1136,1528,1, +64.032,238.20,246.82,3.99,2.00,2.00,0.00,2.00,0.000,0.000,35.089,83,102,852,1136,1528,1,SHOT_END +64.528,286.70,309.39,18.12,20.13,20.13,0.00,20.13,0.000,0.000,43.276,88,104,859,1136,1528,1, +65.040,359.61,383.96,19.56,17.60,17.60,0.00,17.60,0.000,0.000,45.117,90,103,835,1136,1528,1, +65.569,419.79,441.72,16.99,18.87,18.87,0.00,18.87,0.000,0.000,43.806,90,103,835,1136,1528,1, +66.072,264.26,291.73,19.91,15.93,17.92,1.99,15.93,26.176,0.000,45.136,91,103,834,1136,1528,1, +66.621,331.16,354.10,16.39,18.21,18.21,0.00,18.21,0.000,0.000,44.917,90,103,834,1136,1528,1, +67.170,393.01,415.37,18.20,16.38,18.20,1.82,16.38,0.000,0.000,45.331,90,103,834,1136,1528,1, +67.721,459.63,481.60,18.15,14.52,18.15,3.63,14.52,26.230,0.000,44.463,90,103,834,1136,1528,1, +68.278,526.46,549.91,17.94,17.94,17.94,0.00,17.94,0.000,0.000,45.447,90,103,834,1136,1528,1, +68.841,298.18,325.07,17.78,16.00,17.78,1.78,16.00,30.239,0.000,46.245,91,103,834,1136,1528,1, +69.508,376.72,400.05,17.98,16.48,17.98,1.50,16.48,31.513,0.000,45.325,91,103,834,1136,1528,1, +70.090,455.85,479.51,18.90,17.18,17.18,0.00,17.18,0.000,0.000,44.483,90,103,834,1136,1528,1, +70.605,505.11,528.20,17.49,17.49,19.43,1.94,17.49,0.000,0.000,44.601,91,103,834,1136,1528,1, +71.180,476.71,498.07,17.37,13.90,17.37,3.47,13.90,28.036,0.000,47.137,91,103,834,1136,1528,1, +71.904,318.11,344.86,17.96,15.20,17.96,2.76,15.20,27.231,0.000,45.011,91,103,834,1136,1528,1, +72.410,383.19,407.95,17.80,17.80,17.80,0.00,17.80,0.000,0.000,46.313,91,102,834,1136,1528,1, +73.103,461.79,486.54,17.31,15.87,17.31,1.44,15.87,29.623,0.000,47.572,95,105,834,1136,1528,1, +73.779,545.05,570.34,17.77,13.32,16.29,2.96,13.32,26.207,0.000,48.631,94,103,834,1136,1528,1, +74.367,306.62,330.94,17.00,18.70,18.70,0.00,18.70,0.000,0.000,45.978,95,102,834,1136,1528,1, +74.916,378.43,404.18,18.23,18.23,18.23,0.00,18.23,0.000,0.000,44.358,95,102,834,1136,1528,1, +75.510,447.30,470.50,18.50,16.82,18.50,1.68,16.82,0.000,0.000,44.057,95,102,834,1136,1528,1, +76.119,516.90,541.76,18.08,16.44,18.08,1.64,16.44,27.127,0.000,44.637,95,102,834,1136,1528,1, +76.720,245.18,271.54,18.29,13.30,16.63,3.33,13.30,27.230,0.000,45.432,94,102,834,1136,1528,1, +77.357,310.20,336.88,18.84,15.70,18.84,3.14,15.70,26.400,0.000,45.657,95,102,834,1136,1528,1, +78.075,393.58,418.68,16.70,15.31,18.10,2.78,15.31,26.412,0.000,45.041,95,102,834,1136,1528,1, +78.684,463.58,488.30,18.08,14.79,18.08,3.29,14.79,25.907,0.000,44.671,95,102,834,1136,1528,1, +79.320,548.46,571.92,18.86,15.72,17.29,1.57,15.72,28.443,0.000,44.601,94,102,834,1136,1528,1, +79.983,314.59,339.97,16.58,15.08,18.09,3.02,15.08,28.371,0.000,46.667,95,102,834,1136,1528,1, +80.679,404.53,429.08,18.68,14.37,17.24,2.87,14.37,30.848,0.000,45.413,94,102,834,1136,1528,1, +81.370,471.52,497.20,17.37,17.37,18.82,1.45,17.37,25.600,0.000,45.700,95,102,834,1136,1528,1, +81.989,543.55,565.46,17.77,16.16,17.77,1.62,16.16,26.273,0.000,46.100,95,102,834,1136,1528,1, +82.600,267.88,294.44,18.01,16.37,18.01,1.64,16.37,26.342,0.000,45.258,95,102,834,1136,1528,1, +83.337,354.71,377.73,17.65,13.57,17.65,4.07,13.57,31.150,0.000,46.110,95,102,834,1136,1528,1, +84.117,444.88,466.49,17.94,15.38,17.94,2.56,15.38,28.205,0.000,44.699,95,102,834,1136,1528,1, +84.791,521.48,547.40,17.79,14.83,17.79,2.97,14.83,26.987,0.000,45.708,96,102,834,1136,1528,1, +85.425,597.09,623.56,18.94,14.21,17.37,3.16,14.21,28.515,0.000,45.795,95,102,834,1136,1528,1, +85.965,292.70,316.01,16.64,16.64,18.49,1.85,16.64,29.227,0.000,46.645,96,102,834,1136,1528,1, +86.700,377.96,401.99,17.70,16.34,17.70,1.36,16.34,31.259,0.000,45.719,97,102,834,1136,1528,1, +87.418,461.59,485.94,18.09,15.31,18.09,2.78,15.31,26.880,0.000,45.234,97,102,834,1136,1528,1, +88.098,536.73,561.00,17.66,13.24,17.66,4.41,13.24,28.542,0.000,46.153,97,102,834,1136,1528,1, +88.751,312.76,339.32,18.38,18.38,18.38,0.00,18.38,0.000,0.000,43.711,97,102,834,1136,1528,1, +89.411,386.65,410.31,18.17,16.65,18.17,1.51,16.65,31.084,0.000,44.753,97,102,834,1136,1528,1, +90.121,478.26,504.14,18.31,18.31,18.31,0.00,18.31,0.000,0.000,44.995,97,102,834,1136,1528,1, +90.833,569.90,589.06,19.66,16.85,18.26,1.40,16.85,26.068,0.000,43.976,97,102,834,1136,1528,1, +91.433,283.97,309.70,16.67,15.00,16.67,1.67,15.00,27.827,0.000,46.650,96,103,834,1136,1528,1, +91.955,338.54,364.37,17.27,19.19,19.19,0.00,19.19,0.000,0.000,44.885,97,103,834,1136,1528,1, +92.540,406.64,433.36,18.79,13.67,17.09,3.42,13.67,33.158,0.000,47.377,95,104,834,1136,1528,1, +93.035,159.75,188.00,4.04,2.02,6.06,0.00,6.06,0.000,0.000,31.833,94,101,795,1136,1528,1,SHOT_START +93.536,445.32,311.58,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,94,102,833,1136,1528,1, +94.034,444.74,451.32,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,94,102,833,1136,1528,1, +94.529,184.70,175.99,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,97,103,792,1136,1528,1, +95.037,232.79,243.93,5.90,3.94,3.94,1.97,1.97,27.022,0.000,43.170,105,106,864,1136,1528,1,SHOT_END +95.688,304.77,328.93,16.88,16.88,18.41,1.53,16.88,25.908,0.000,43.838,105,105,840,1136,1528,1, +96.389,396.62,421.64,18.56,15.70,17.13,1.43,15.70,29.245,0.000,45.222,104,105,840,1136,1528,1, +96.939,443.68,466.14,16.37,14.55,18.19,3.64,14.55,35.427,0.000,47.523,105,105,840,1136,1528,1, +97.687,298.11,322.66,17.38,16.04,17.38,1.34,16.04,28.596,0.000,46.480,105,107,839,1136,1528,1, +98.405,383.17,409.84,18.10,16.71,18.10,1.39,16.71,26.705,0.000,45.308,105,105,839,1136,1528,1, +99.049,462.44,489.28,18.63,17.08,17.08,0.00,17.08,0.000,0.000,46.443,104,105,839,1136,1528,1, +99.763,553.25,573.33,18.20,16.80,18.20,1.40,16.80,25.928,0.000,45.102,103,105,839,1136,1528,1, +100.368,268.31,292.36,16.54,14.89,18.19,3.31,14.89,27.834,0.000,47.788,105,105,839,1136,1528,1, +101.033,350.07,374.88,18.03,16.53,18.03,1.50,16.53,26.597,0.000,45.134,105,105,839,1136,1528,1, +101.680,435.87,460.79,18.56,17.02,17.02,0.00,17.02,0.000,0.000,46.711,104,105,839,1136,1528,1, +102.369,508.52,534.45,18.87,17.42,18.87,1.45,17.42,26.653,0.000,44.906,105,105,839,1136,1528,1, +103.053,503.51,523.66,17.52,16.06,17.52,1.46,16.06,27.157,0.000,46.526,105,105,839,1136,1528,1, +103.762,325.43,353.04,16.92,16.92,16.92,0.00,16.92,0.000,0.000,46.515,104,105,839,1136,1528,1, +104.444,398.52,424.95,17.62,17.62,19.08,1.47,17.62,32.069,0.000,45.310,105,105,839,1136,1528,1, +105.160,481.67,502.95,18.14,15.35,18.14,2.79,15.35,25.710,0.000,45.073,105,105,839,1136,1528,1, +105.859,567.12,588.02,18.61,17.18,18.61,1.43,17.18,26.203,0.000,43.626,105,105,839,1136,1528,1, +106.580,318.45,342.32,18.02,16.63,18.02,1.39,16.63,32.780,0.000,45.116,105,105,839,1136,1528,1, +107.368,413.49,438.58,17.77,12.70,16.50,3.81,12.70,34.126,0.000,47.351,104,105,839,1136,1528,1, +108.054,487.13,512.64,17.50,18.96,18.96,0.00,18.96,0.000,0.000,45.548,105,105,839,1136,1528,1, +108.824,578.73,601.55,18.17,16.87,18.17,1.30,16.87,29.052,0.000,45.049,105,105,839,1136,1528,1, +109.613,323.08,349.57,17.75,15.22,17.75,2.54,15.22,29.005,0.000,45.876,105,105,839,1136,1528,1, +110.432,416.77,438.43,18.30,15.86,18.30,2.44,15.86,27.884,0.000,44.510,105,105,839,1136,1528,1, +111.186,511.82,537.84,18.57,17.24,18.57,1.33,17.24,24.524,0.000,44.421,105,105,839,1136,1528,1, +112.004,608.59,633.92,19.57,15.90,18.35,2.45,15.90,26.530,0.000,45.319,106,105,839,1136,1528,1, +112.706,320.14,346.69,17.09,18.51,18.51,0.00,18.51,0.000,0.000,45.097,106,105,839,1136,1528,1, +113.391,405.23,430.76,18.97,17.51,18.97,1.46,17.51,27.262,0.000,44.021,106,105,839,1136,1528,1, +114.209,508.40,531.96,19.58,15.91,18.35,2.45,15.91,26.625,0.000,46.153,106,105,839,1136,1528,1, +114.942,585.18,606.38,16.36,15.00,17.72,2.73,15.00,24.635,0.000,47.688,106,105,839,1136,1528,1, +115.689,325.02,348.61,18.75,17.41,18.75,1.34,17.41,26.729,0.000,43.839,106,105,839,1136,1528,1, +116.635,446.68,471.05,19.01,14.79,17.95,3.17,14.79,27.359,0.000,44.873,105,105,839,1136,1528,1, +117.420,530.13,552.30,17.84,16.56,19.11,2.55,16.56,29.311,0.000,45.666,106,105,839,1136,1528,1, +118.173,621.74,646.99,18.60,17.27,18.60,1.33,17.27,52.564,0.000,44.856,107,105,839,1136,1528,1, +118.953,329.95,354.84,17.96,14.11,16.67,3.85,12.83,29.968,0.000,48.681,106,105,839,1136,1528,1, +119.738,406.84,430.75,17.84,14.01,19.11,5.10,14.01,27.196,0.000,46.024,107,105,839,1136,1528,1, +120.423,501.71,522.96,20.42,17.50,18.96,1.46,17.50,26.777,0.000,43.712,107,105,839,1136,1528,1, +121.089,571.66,597.25,16.53,15.03,18.03,3.01,15.03,27.179,0.000,46.888,107,106,839,1136,1528,1, +121.790,321.73,348.34,19.96,14.26,18.53,4.28,14.26,27.295,0.000,45.406,107,106,839,1136,1528,1, +122.216,386.87,412.88,18.78,16.44,18.78,0.00,18.78,0.000,0.000,42.337,114,108,839,1136,1528,1, +122.593,431.50,458.29,18.60,18.60,18.60,0.00,18.60,0.000,0.000,44.946,113,108,839,1136,1528,1, +123.040,153.02,161.50,8.94,8.94,11.17,0.00,11.17,0.000,0.000,33.040,111,106,778,1136,1528,1,SHOT_START +123.539,438.61,266.02,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,111,107,828,1136,1528,1, +124.030,438.66,436.94,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,111,107,833,1136,1528,1, +124.528,199.54,174.91,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,111,106,806,1136,1528,1, +125.034,232.30,253.65,5.93,3.96,3.96,1.98,1.98,46.902,0.000,55.357,118,111,865,1136,1528,1,SHOT_END +125.747,306.91,331.49,18.23,18.23,19.64,1.40,18.23,25.907,0.000,44.735,119,110,841,1136,1528,1, +126.454,398.86,424.74,18.39,18.39,18.39,0.00,18.39,0.000,0.000,45.371,119,109,841,1136,1528,1, +127.238,500.10,519.80,19.13,15.31,17.86,2.55,15.31,28.176,0.000,45.142,119,109,841,1136,1528,1, +128.192,332.09,351.49,17.81,12.57,17.81,5.24,12.57,28.819,0.000,46.616,120,111,840,1136,1528,1, +129.005,429.04,453.28,18.44,15.98,18.44,2.46,15.98,29.234,0.000,45.593,122,110,840,1136,1528,1, +129.773,510.42,535.95,18.24,15.63,19.54,3.91,15.63,26.908,0.000,43.767,123,110,840,1136,1528,1, +130.617,272.00,296.86,18.95,16.58,18.95,2.37,16.58,29.058,0.000,43.553,124,109,840,1136,1528,1, +131.390,371.95,393.56,19.40,14.23,18.11,3.88,14.23,26.905,0.000,45.848,124,109,840,1136,1528,1, +132.302,473.71,499.43,17.55,15.36,18.65,3.29,15.36,26.025,0.000,44.973,124,109,838,1136,1528,1, +133.074,570.92,595.02,19.43,16.84,19.43,2.59,16.84,24.142,0.000,42.865,124,109,838,1136,1528,1, +133.735,298.76,323.68,19.68,16.65,18.16,1.51,16.65,27.295,0.000,46.346,124,109,838,1136,1528,1, +134.475,380.61,404.28,17.56,18.91,18.91,0.00,18.91,0.000,0.000,44.287,123,109,838,1136,1528,1, +135.248,482.48,504.98,19.41,15.53,18.12,3.88,15.53,26.405,0.000,44.035,123,109,838,1136,1528,1, +136.026,572.60,595.57,17.99,16.71,19.28,1.29,16.71,25.574,0.000,45.386,124,109,838,1136,1528,1, +136.769,299.21,322.33,18.84,16.14,18.84,2.69,16.14,31.928,0.000,44.746,124,109,838,1136,1528,1, +137.528,394.07,420.05,18.45,17.13,18.45,1.32,17.13,29.195,0.000,45.328,124,109,838,1136,1528,1, +138.242,487.52,508.20,19.61,18.21,18.21,0.00,18.21,0.000,0.000,46.190,124,109,838,1136,1528,1, +139.182,584.28,606.90,17.02,14.90,18.09,3.19,14.90,34.410,0.000,46.443,124,109,838,1136,1528,1, +139.945,325.38,350.47,18.35,18.35,18.35,0.00,18.35,0.000,0.000,45.611,124,109,838,1136,1528,1, +140.718,421.82,447.96,19.39,15.51,18.09,2.58,15.51,25.673,0.000,44.667,122,109,838,1136,1528,1, +141.519,514.58,539.42,17.48,17.48,18.73,1.25,17.48,34.883,0.000,45.883,123,109,838,1136,1528,1, +142.284,611.50,637.21,19.60,16.99,18.30,1.31,16.99,26.241,0.000,44.039,122,109,838,1136,1528,1, +143.109,332.05,356.01,18.19,18.19,19.40,1.21,18.19,28.893,0.000,44.316,124,109,838,1136,1528,1, +143.788,424.13,449.76,19.15,19.15,19.15,0.00,19.15,0.000,0.000,43.168,124,109,838,1136,1528,1, +144.479,508.94,534.50,18.80,17.35,18.80,1.45,17.35,30.617,0.000,44.331,124,109,838,1136,1528,1, +145.359,617.35,638.68,19.33,14.78,18.19,3.41,14.78,26.353,0.000,45.659,125,109,838,1136,1528,1, +146.160,330.63,356.88,17.48,17.48,18.73,1.25,17.48,25.598,0.000,44.768,125,109,838,1136,1528,1, +147.005,429.37,451.98,18.94,15.39,18.94,3.55,15.39,27.078,0.000,44.220,125,109,838,1136,1528,1, +147.785,532.76,557.81,19.21,19.21,19.21,0.00,19.21,27.896,0.000,42.865,125,109,838,1136,1528,1, +148.691,295.63,322.03,18.78,16.57,18.78,2.21,16.57,29.943,0.000,44.826,125,109,838,1136,1528,1, +149.521,400.91,424.68,19.28,18.07,19.28,1.20,18.07,26.028,0.000,42.754,125,109,838,1136,1528,1, +150.369,502.63,525.73,18.87,17.69,18.87,1.18,17.69,0.000,0.000,44.439,125,109,838,1136,1528,1, +151.192,606.40,629.96,19.44,14.58,18.22,4.86,13.36,25.322,0.000,43.978,125,109,838,1136,1528,1, +151.908,316.99,343.53,18.15,18.15,19.55,0.00,19.55,0.000,0.000,44.027,125,109,838,1136,1528,1, +152.751,420.50,445.36,18.98,16.61,18.98,2.37,16.61,27.144,0.000,44.020,125,109,838,1136,1528,1, +153.577,526.29,549.92,19.36,18.15,19.36,0.00,19.36,0.000,0.000,43.379,123,109,838,1136,1528,1, +154.333,620.84,645.28,18.52,19.85,18.52,0.00,18.52,0.000,0.000,45.388,125,109,838,1136,1528,1, +155.263,335.70,359.78,18.28,13.98,18.28,4.30,13.98,27.685,0.000,45.489,125,109,838,1136,1528,1, +156.122,444.14,469.68,18.63,17.46,18.63,1.16,17.46,26.466,0.000,44.782,125,109,838,1136,1528,1, +156.901,548.00,571.81,19.26,16.69,17.97,1.28,16.69,24.870,0.000,44.644,124,109,838,1136,1528,1, +157.715,280.54,306.63,18.42,15.97,18.42,2.46,15.97,27.734,0.000,45.639,124,109,838,1136,1528,1, +158.552,367.38,391.89,17.92,17.92,19.12,1.19,17.92,25.894,0.000,45.894,125,109,838,1136,1528,1, +159.510,484.38,507.39,18.79,15.66,18.79,3.13,15.66,26.209,0.000,44.220,125,109,838,1136,1528,1, +160.332,592.70,615.34,19.46,17.03,18.24,1.22,17.03,26.368,0.000,45.705,125,109,838,1136,1528,1, +161.136,300.48,320.93,18.67,18.67,18.67,0.00,18.67,0.000,0.000,44.521,125,109,838,1136,1528,1, +162.094,412.22,436.70,17.74,17.74,18.78,1.04,17.74,25.819,0.000,44.480,125,109,838,1136,1528,1, +162.976,524.07,546.72,19.29,18.15,19.29,1.13,18.15,26.160,0.000,43.382,125,109,838,1136,1528,1, +163.865,624.11,648.76,17.99,13.49,17.99,4.50,13.49,27.173,0.000,46.098,125,109,838,1136,1528,1, +164.783,328.47,355.14,18.53,15.26,18.53,3.27,15.26,30.096,0.000,45.025,125,109,828,1136,1528,1, +165.625,428.63,453.09,18.99,17.80,18.99,1.19,17.80,27.787,0.000,44.167,125,109,828,1136,1528,1, +166.490,547.43,571.93,19.66,19.66,19.66,0.00,19.66,0.000,0.000,42.262,125,109,828,1136,1528,1, +167.428,282.05,307.61,18.13,13.87,18.13,4.27,13.87,29.609,0.000,45.947,125,109,828,1136,1528,1, +168.271,385.70,411.67,20.17,16.61,18.98,2.37,16.61,27.173,0.000,44.041,125,109,828,1136,1528,1, +168.957,470.58,492.17,17.49,17.49,18.95,1.46,17.49,27.142,0.000,44.026,125,109,828,1136,1528,1, +169.857,585.68,607.84,19.99,15.55,18.88,3.33,15.55,26.530,0.000,43.977,125,109,828,1136,1528,1, +170.772,342.00,362.13,18.57,16.39,18.57,2.18,16.39,26.285,0.000,44.670,125,109,828,1136,1528,1, +171.623,438.84,464.92,17.63,16.46,18.81,2.35,16.46,27.798,0.000,44.272,125,109,828,1136,1528,1, +172.537,544.25,566.28,18.59,16.40,18.59,2.19,16.40,25.279,0.000,44.988,125,109,828,1136,1528,1, +173.392,654.20,679.11,19.89,17.55,18.72,1.17,17.55,25.481,0.000,44.406,125,109,828,1136,1528,1, +174.329,335.71,360.57,17.08,16.01,18.15,2.14,16.01,27.004,0.000,46.455,125,109,828,1136,1528,1, +175.377,452.87,476.46,18.12,14.31,18.12,3.81,14.31,26.120,0.000,45.561,125,109,828,1136,1528,1, +176.163,558.24,580.41,19.09,15.27,17.82,2.55,15.27,26.659,0.000,44.802,124,109,828,1136,1528,1, +177.063,305.60,328.86,17.77,17.77,18.88,1.11,17.77,26.576,0.000,45.186,125,109,828,1136,1528,1, +177.962,422.39,445.89,18.91,16.69,17.80,2.22,16.69,24.557,0.000,45.473,125,109,827,1136,1528,1, +178.786,512.41,534.27,18.20,14.56,19.41,3.64,14.56,26.675,0.000,44.616,125,109,827,1136,1528,1, +179.801,639.16,664.11,19.70,16.75,18.72,1.97,16.75,29.339,0.000,43.742,125,109,827,1136,1528,1, +180.823,356.20,380.33,18.60,17.62,18.60,1.96,16.65,27.413,0.000,43.652,125,109,827,1136,1528,1, +181.885,475.65,500.32,17.89,14.12,18.83,3.77,15.07,27.070,0.000,45.063,126,109,827,1136,1528,1, +182.784,585.71,610.96,18.91,16.68,18.91,2.22,16.68,26.073,0.000,43.821,126,109,827,1136,1528,1, +183.761,315.49,336.63,19.45,15.36,18.43,3.07,15.36,26.342,0.000,44.679,126,109,827,1136,1528,1, +184.675,434.66,459.90,18.59,18.59,18.59,0.00,18.59,0.000,0.000,43.032,125,109,827,1136,1528,1, +185.581,540.82,566.06,18.77,18.77,19.88,1.10,18.77,31.166,0.000,42.815,126,109,827,1136,1528,1, +186.413,647.54,671.11,19.22,19.22,19.22,0.00,19.22,0.000,0.000,43.719,126,109,827,1136,1528,1, +187.381,336.05,359.01,18.60,15.50,18.60,3.10,15.50,28.590,0.000,44.959,126,109,827,1136,1528,1, +188.339,456.12,481.41,18.80,15.66,18.80,3.13,15.66,26.960,0.000,44.210,126,109,827,1136,1528,1, +189.319,569.62,594.32,18.36,14.28,18.36,4.08,14.28,29.508,0.000,45.692,126,109,827,1136,1528,1, +190.275,312.18,338.47,18.83,18.83,18.83,0.00,18.83,0.000,0.000,43.864,126,109,827,1136,1528,1, +191.243,435.79,455.91,19.63,16.53,18.59,2.07,16.53,28.326,0.000,44.576,126,109,827,1136,1528,1, +192.153,539.23,564.39,17.58,16.49,18.68,2.20,16.49,27.569,0.000,44.365,126,109,827,1136,1528,1, +193.212,664.25,687.29,18.89,17.00,18.89,1.89,17.00,29.643,0.000,44.487,126,109,827,1136,1528,1, +194.236,363.77,390.07,18.55,18.55,18.55,0.00,18.55,0.000,0.000,44.679,126,109,827,1136,1528,1, +195.196,481.11,506.29,18.76,16.68,18.76,2.08,16.68,26.418,0.000,44.332,126,109,827,1136,1528,1, +196.123,586.36,607.38,18.33,15.10,18.33,3.24,15.10,26.259,0.000,45.573,125,109,827,1136,1528,1, +196.996,337.05,359.38,19.48,17.19,18.33,1.15,17.19,27.940,0.000,45.324,125,109,827,1136,1528,1, +197.893,440.88,463.98,17.84,16.72,18.95,2.23,16.72,29.017,0.000,44.370,125,109,827,1136,1528,1, +198.910,559.26,580.48,18.68,15.73,18.68,2.95,15.73,28.207,0.000,44.307,125,109,825,1136,1528,1, +199.918,680.92,702.79,18.84,16.86,18.84,1.98,16.86,25.830,0.000,44.342,125,109,825,1136,1528,1, +200.844,325.93,349.85,18.38,17.30,18.38,1.08,17.30,25.765,0.000,45.324,125,109,825,1136,1528,1, +201.723,440.93,464.60,19.34,14.79,18.20,3.41,14.79,26.848,0.000,43.981,124,109,825,1136,1528,1, +202.804,556.28,577.72,18.49,15.72,19.42,3.70,15.72,27.881,0.000,44.118,125,109,825,1136,1528,1, +203.732,306.80,333.59,19.40,17.25,18.33,1.08,17.25,27.172,0.000,45.565,125,109,825,1136,1528,1, +204.774,440.32,466.42,18.23,14.39,18.23,3.84,14.39,26.391,0.000,43.763,124,109,825,1136,1528,1, +205.825,550.68,572.65,18.07,16.16,19.02,2.85,16.16,27.545,0.000,45.603,125,109,825,1136,1528,1, +206.857,238.66,265.51,18.41,15.51,18.41,2.91,15.51,27.405,0.000,44.443,125,109,825,1136,1528,1, +207.818,357.76,383.43,19.77,17.69,18.73,1.04,17.69,27.079,0.000,44.199,126,109,825,1136,1528,1, +208.842,477.99,499.72,17.58,14.65,18.56,3.91,14.65,26.170,0.000,44.756,125,109,825,1136,1528,1, +209.834,602.67,624.52,19.15,17.14,18.15,2.02,17.14,26.823,0.000,44.961,125,109,825,1136,1528,1, +210.820,343.63,369.34,18.26,17.25,19.28,1.01,17.25,28.114,0.000,44.875,125,109,825,1136,1528,1, +211.868,467.41,489.67,19.07,15.26,19.07,3.81,15.26,25.291,0.000,43.144,125,109,825,1136,1528,1, +212.846,585.80,610.02,18.42,15.35,18.42,3.07,15.35,27.091,0.000,44.621,125,109,825,1136,1528,1, +213.955,313.96,333.95,18.92,14.42,18.02,3.60,14.42,26.449,0.000,46.148,124,109,825,1136,1528,1, +214.955,427.76,449.25,18.00,17.00,19.00,2.00,17.00,30.162,0.000,43.816,124,109,825,1136,1528,1, +215.969,562.30,583.02,19.73,17.75,18.74,0.99,17.75,26.271,0.000,44.593,124,109,825,1136,1528,1, +217.051,335.44,357.70,17.56,15.71,18.48,2.77,15.71,28.289,0.000,45.041,124,109,825,1136,1528,1, +218.090,349.09,373.79,18.29,15.40,18.29,2.89,15.40,27.806,0.000,45.758,124,109,825,1136,1528,1, +219.023,469.43,494.66,19.30,19.30,19.30,0.00,19.30,0.000,0.000,43.181,124,109,825,1136,1528,1, +220.143,599.64,622.01,18.74,15.17,18.74,3.57,15.17,29.544,0.000,45.199,124,109,825,1136,1528,1, +221.138,337.26,360.56,18.10,16.09,18.10,2.01,16.09,28.270,0.000,46.237,124,109,825,1136,1528,1, +222.190,474.20,499.72,19.00,18.05,19.00,0.95,18.05,24.932,0.000,44.178,124,109,825,1136,1528,1, +223.297,612.75,635.13,18.97,17.17,18.07,1.81,17.17,26.514,0.000,45.346,124,109,825,1136,1528,1, +224.451,330.64,353.07,18.20,14.73,19.06,2.60,15.60,26.377,0.000,45.078,122,109,825,1136,1528,1, +225.552,466.77,491.19,19.08,18.17,19.08,1.82,17.26,27.625,0.000,43.254,124,109,825,1136,1528,1, +226.540,586.36,609.10,19.22,17.20,19.22,2.02,17.20,24.976,0.000,43.566,124,109,825,1136,1528,1, +227.599,248.69,275.35,17.94,17.94,17.94,0.00,17.94,27.285,0.000,46.530,124,109,825,1136,1528,1, +228.736,384.57,407.17,18.47,14.95,18.47,3.52,14.95,26.324,0.000,45.366,124,109,825,1136,1528,1, +229.796,513.05,535.18,18.86,16.04,18.86,2.83,16.04,28.146,0.000,44.126,124,109,825,1136,1528,1, +230.773,645.02,668.38,19.45,16.38,18.43,2.05,16.38,25.886,0.000,43.195,123,109,825,1136,1528,1, +231.811,357.21,379.23,18.31,17.35,19.28,1.93,17.35,25.768,0.000,44.541,124,109,825,1136,1528,1, +232.736,472.46,495.42,19.45,19.45,19.45,0.00,19.45,0.000,0.000,42.541,124,109,825,1136,1528,1, +233.799,602.66,625.36,18.82,16.00,18.82,2.82,16.00,26.265,0.000,44.436,124,109,825,1136,1528,1, +234.915,361.18,386.29,18.81,15.22,17.91,2.69,15.22,26.452,0.000,45.182,123,109,825,1136,1528,1, +236.009,484.01,508.93,18.29,16.46,19.20,2.74,16.46,27.330,0.000,44.957,124,109,825,1136,1528,1, +237.079,619.57,637.97,19.63,15.89,18.70,2.80,15.89,26.389,0.000,44.681,124,109,825,1136,1528,1, +238.065,305.58,329.33,17.24,15.21,18.25,3.04,15.21,26.973,0.000,46.364,125,109,825,1136,1528,1, +239.075,430.60,456.61,19.81,14.85,18.82,3.96,14.85,26.290,0.000,44.502,125,109,825,1136,1528,1, +240.075,545.86,571.05,17.99,14.99,17.99,3.00,14.99,24.338,0.000,46.917,125,109,825,1136,1528,1, +241.027,664.38,688.47,17.85,17.85,18.90,1.05,17.85,33.443,0.000,44.303,125,109,825,1136,1528,1, +242.174,350.74,375.86,18.32,16.58,18.32,1.75,16.58,28.446,0.000,45.594,125,109,825,1136,1528,1, +243.298,480.93,503.15,18.67,15.11,18.67,3.56,15.11,27.795,0.000,44.655,125,109,825,1136,1528,1, +244.389,620.76,643.01,19.26,17.43,19.26,1.83,17.43,24.854,0.000,43.121,125,109,825,1136,1528,1, +245.522,349.02,371.71,18.53,15.00,18.53,3.53,15.00,27.817,0.000,44.657,126,109,825,1136,1528,1, +246.674,492.63,515.19,19.09,17.36,19.09,1.74,17.36,25.169,0.000,43.285,126,109,825,1136,1528,1, +247.735,620.84,642.13,18.86,15.08,18.86,3.77,15.08,28.540,0.000,44.401,126,109,825,1136,1528,1, +248.822,353.61,376.17,19.32,17.48,18.40,1.84,17.48,25.968,0.000,43.865,126,109,825,1136,1528,1, +249.894,483.11,503.86,18.65,17.72,19.58,0.93,17.72,27.391,0.000,43.601,126,109,825,1136,1528,1, +250.971,617.97,639.64,19.49,18.57,19.49,0.93,18.57,0.000,0.000,42.631,126,109,825,1136,1528,1, +252.149,338.88,361.16,19.53,17.83,18.68,0.85,17.83,26.574,0.000,44.328,126,109,825,1136,1528,1, +253.132,448.96,473.94,17.29,16.27,18.31,2.03,16.27,30.211,0.000,46.116,126,109,825,1136,1528,1, +254.181,587.75,607.39,20.02,18.11,19.06,0.95,18.11,25.103,0.000,43.715,126,109,825,1136,1528,1, +255.380,273.65,300.59,17.51,15.85,18.35,2.50,15.85,25.676,0.000,45.334,125,109,825,1136,1528,1, +256.486,417.15,437.25,19.90,17.18,18.99,1.81,17.18,24.652,0.000,43.979,125,109,825,1136,1528,1, +257.691,547.50,572.89,17.43,15.77,18.26,2.49,15.77,28.150,0.000,45.836,125,109,825,1136,1528,1, +258.828,402.38,422.15,19.35,14.95,18.47,3.52,14.95,26.231,0.000,44.943,125,109,825,1136,1528,1, +259.925,362.50,385.71,17.32,14.59,18.23,3.65,14.59,27.946,0.000,46.096,125,109,825,1136,1528,1, +261.158,503.57,527.27,18.65,15.41,18.65,3.24,15.41,27.137,0.000,44.873,125,109,825,1136,1528,1, +262.290,655.22,679.43,19.44,15.91,18.56,2.65,15.91,25.769,0.000,43.387,124,109,825,1136,1528,1, +263.394,366.00,392.04,18.11,18.11,19.01,0.91,18.11,25.310,0.000,45.013,125,109,825,1136,1528,1, +264.502,506.26,531.49,19.86,18.96,18.96,0.00,18.96,0.000,0.000,43.963,125,109,825,1136,1528,1, +265.545,637.89,662.60,19.18,18.22,19.18,0.96,18.22,31.453,0.000,43.035,125,109,821,1136,1528,1, +266.555,353.88,378.51,17.82,18.81,18.81,0.00,18.81,0.000,0.000,44.628,125,109,821,1136,1528,1, +267.666,491.07,515.41,18.91,17.11,18.91,1.80,17.11,30.660,0.000,43.906,125,109,821,1136,1528,1, +268.757,627.95,649.57,19.24,17.41,19.24,1.83,17.41,26.787,0.000,43.319,125,109,821,1136,1528,1, +269.904,348.82,375.36,18.32,15.70,18.32,2.62,15.70,27.071,0.000,45.981,125,109,821,1136,1528,1, +271.001,484.15,508.57,19.13,16.40,19.13,2.73,16.40,25.770,0.000,43.316,126,109,821,1136,1528,1, +272.237,632.60,657.51,18.61,16.18,18.61,2.43,16.18,25.108,0.000,45.026,126,109,821,1136,1528,1, +273.456,356.41,381.41,18.87,15.59,18.05,2.46,15.59,26.133,0.000,45.505,125,109,821,1136,1528,1, +274.494,475.28,500.25,19.26,18.30,19.26,0.96,18.30,25.368,0.000,44.529,126,109,821,1136,1528,1, +275.611,614.68,639.36,17.92,18.81,18.81,0.00,18.81,0.000,0.000,44.315,126,109,821,1136,1528,1, +276.819,297.37,323.28,18.21,15.72,18.21,2.48,15.72,26.307,0.000,46.163,126,109,821,1136,1528,1, +277.897,424.54,446.13,18.55,16.69,18.55,1.85,16.69,26.755,0.000,45.123,126,109,821,1136,1528,1, +279.049,572.94,597.80,19.97,18.23,19.10,0.87,18.23,24.668,0.000,42.884,127,109,821,1136,1528,1, +280.175,264.72,286.70,17.77,17.77,18.66,0.89,17.77,0.000,0.000,44.576,126,109,821,1136,1528,1, +281.340,412.41,436.08,18.89,17.17,18.89,1.72,17.17,25.779,0.000,43.745,125,109,821,1136,1528,1, +282.539,558.36,576.92,19.18,15.84,18.34,2.50,15.84,31.461,0.000,45.237,126,109,821,1136,1528,1, +283.709,338.03,358.50,18.80,17.95,18.80,0.85,17.95,27.943,0.000,43.065,125,109,821,1136,1528,1, +284.913,367.60,391.69,18.28,15.79,19.11,3.32,15.79,27.816,0.000,43.622,124,109,821,1136,1528,1, +286.014,506.31,528.41,19.07,18.16,19.07,0.91,18.16,26.787,0.000,43.499,124,109,821,1136,1528,1, +287.222,373.85,388.14,19.04,18.21,19.04,0.83,18.21,0.000,0.000,43.839,124,109,821,1136,1528,1, +288.475,370.80,394.34,18.36,15.97,18.36,2.40,15.97,27.540,0.000,44.744,126,109,821,1136,1528,1, +289.044,434.21,457.98,17.55,15.80,17.55,1.76,15.80,27.460,0.000,44.458,126,109,821,1136,1528,1, +290.118,571.04,593.23,18.64,17.70,18.64,0.93,17.70,30.547,0.000,44.586,126,109,821,1136,1528,1, +291.272,377.00,399.32,19.06,16.46,18.19,1.73,16.46,26.772,0.000,45.592,125,109,821,1136,1528,1, +292.406,511.42,531.29,18.53,15.88,18.53,2.65,15.88,26.652,0.000,45.034,126,109,821,1136,1528,1, +293.573,636.31,657.73,17.14,15.43,18.00,2.57,15.43,28.704,0.000,46.661,126,109,821,1136,1528,1, +294.908,378.97,403.25,17.97,14.98,17.97,3.00,14.98,27.215,0.000,44.747,126,109,821,1136,1528,1, +296.194,527.50,551.79,17.88,15.55,17.88,2.33,15.55,30.350,0.000,45.502,126,109,821,1136,1528,1, +297.483,687.29,706.79,18.62,15.51,17.84,2.33,15.51,26.415,0.000,44.986,124,109,821,1136,1528,1, +298.718,367.48,390.09,17.82,17.01,18.63,1.62,17.01,24.651,0.000,44.415,125,109,821,1136,1528,1, +300.011,513.53,535.59,17.78,14.69,17.78,3.09,14.69,26.968,0.000,46.362,124,109,821,1136,1528,1, +301.292,659.59,680.52,17.97,12.50,17.97,5.47,12.50,31.059,0.000,45.237,124,109,821,1136,1528,1, +302.505,360.65,386.09,18.13,15.66,18.13,2.47,15.66,27.755,0.000,45.483,124,109,821,1136,1528,1, +303.517,486.05,509.84,18.77,17.79,18.77,0.99,17.79,29.648,0.000,44.197,124,110,821,1136,1528,1, +304.306,571.89,598.29,19.02,16.48,19.02,1.27,17.75,26.420,0.000,44.030,118,108,778,1136,1528,1,SHOT_START +304.544,160.11,168.69,4.21,4.21,4.21,0.00,4.21,0.000,0.000,29.879,122,109,770,1136,1528,1, +305.048,219.83,223.33,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,122,110,799,1136,1528,1, +305.550,445.65,419.66,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,122,109,820,1136,1528,1, +306.048,176.98,175.02,0.00,0.00,0.00,0.00,0.00,0.000,0.000,0.000,123,108,775,1136,1528,1, +306.544,227.64,234.76,4.03,2.01,2.01,2.01,0.00,27.164,0.000,44.710,129,111,854,1136,1528,1,SHOT_END +307.787,368.40,391.34,17.71,15.30,18.52,3.22,15.30,28.103,0.000,45.409,133,111,831,1136,1528,1, +308.979,517.77,543.04,19.28,16.77,18.45,1.68,16.77,26.875,0.000,45.334,134,113,831,1136,1528,1, +310.280,381.68,401.55,18.46,15.38,18.46,3.08,15.38,26.172,0.000,45.230,134,112,830,1136,1528,1, +311.625,534.36,557.07,17.84,15.61,18.58,2.97,15.61,26.085,0.000,45.027,134,112,830,1136,1528,1, +312.708,664.62,689.13,18.46,16.61,18.46,1.85,16.61,28.465,0.000,45.124,134,112,830,1136,1528,1, +313.945,380.73,407.00,18.60,18.60,18.60,0.00,18.60,0.000,0.000,44.901,134,112,830,1136,1528,1, +315.209,536.22,561.39,19.78,16.62,18.99,2.37,16.62,26.518,0.000,43.611,133,112,830,1136,1528,1, +316.450,691.19,712.66,18.52,16.11,18.52,3.22,16.11,26.165,0.000,44.102,133,112,830,1136,1528,1, +317.640,399.30,419.25,19.34,17.65,19.34,0.84,17.65,29.153,0.000,44.383,135,112,830,1136,1528,1, +318.849,540.30,562.45,18.19,15.71,18.19,3.31,15.71,30.115,0.000,45.317,135,112,830,1136,1528,1, +319.994,676.44,700.93,18.35,17.48,19.22,0.87,17.48,28.797,0.000,44.981,134,112,830,1136,1528,1, +321.218,400.99,423.21,19.60,18.78,18.78,0.82,18.78,0.000,0.000,43.588,134,112,830,1136,1528,1, +322.413,541.21,566.54,18.42,15.91,19.26,2.51,15.91,26.152,0.000,44.174,135,112,830,1136,1528,1, +323.750,701.39,725.82,18.69,15.70,18.69,2.99,15.70,28.026,0.000,44.707,135,112,830,1136,1528,1, +324.985,399.38,421.87,18.63,16.20,18.63,2.43,16.20,27.344,0.000,44.641,135,112,830,1136,1528,1, +326.178,551.84,574.01,19.29,19.29,19.29,0.00,19.29,0.000,0.000,43.610,135,112,830,1136,1528,1, +327.376,704.71,727.59,19.20,19.20,19.20,0.00,19.20,0.000,0.000,43.580,135,112,830,1136,1528,1, +328.671,417.55,443.45,18.52,16.98,18.52,1.54,16.98,39.543,0.000,44.864,135,112,830,1136,1528,1, +329.875,569.54,593.57,19.11,18.28,19.11,0.83,18.28,35.466,0.000,43.301,135,112,830,1136,1528,1, +331.170,646.78,668.42,18.53,15.44,18.53,3.09,15.44,28.177,0.000,44.798,135,112,830,1136,1528,1, +332.424,416.09,438.00,19.14,18.34,19.14,0.80,18.34,27.221,0.000,43.441,135,112,830,1136,1528,1, +333.884,590.35,615.07,19.18,14.38,18.49,4.11,14.38,30.730,0.000,45.231,136,112,830,1136,1528,1, +335.110,295.84,319.94,17.96,16.32,18.77,2.45,16.32,26.359,0.000,44.489,135,112,832,1136,1528,1, +336.309,451.47,475.21,19.18,16.68,18.35,2.50,16.68,25.103,0.000,44.117,135,112,832,1136,1528,1, +337.520,607.38,631.45,18.99,17.34,18.99,0.83,17.34,28.407,0.000,43.883,134,111,832,1136,1528,1, +338.826,314.94,340.04,17.61,14.55,18.38,3.83,14.55,28.612,0.000,46.511,135,111,832,1136,1528,1, diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md new file mode 100644 index 0000000..02ce442 --- /dev/null +++ b/docs/PROGRESS.md @@ -0,0 +1,103 @@ +# 開発進捗ログ + + + +- [x] **環境整備(テンプレート同期・docs 番号修正)** (2026-06-06): プログラミングテンプレートを初回同期(エージェント/コマンド/GUIDE_05 等を取り込み)し、docs カテゴリ番号を命名規則(GUIDE_03)に整合(PLAN→03 / SPEC→04 / TECH→05)。リモートをセルフホスト Git から GitHub の Private リポジトリへ移行。 + +- [x] **CameraBase のリファクタリング(責務分離 Phase 1〜4)** (2026-06-06): 肥大化していた `CameraBase` の責務を分離。`Cameras/`・`UI/`(Phase1)、色補正→`ColorCorrection/ColorCorrector`(Phase2)、チャート検出→`ChartDetection/ChartDetector`(Phase3)、ファイル I/O・サウンド→`Utils/IoUtil`(Phase4)。 + - 動機: `CameraBase` にカメラ制御・チャート検出・色補正・ファイル I/O・サウンドが集中していた。 + - 方針: **挙動は一切変えない**(PLAN_01)。各フェーズで計算/検出/I-O ロジックが元コードと文字単位で一致することを確認し、ビルドは全フェーズ 0 エラー 0 警告。 + - 設計判断(PLAN_01 当初案からの変更): 派生クラス(IScam/Lucam)と共有する状態に結合するメンバーは分離先に移さず `CameraBase` に残した。具体的には `UpdateRate`/`GetRatio`(ゲイン補正)、`SetSaveFolder`/`WriteInfo`/`SetInfo`(`_saveFolder`/`_ShotInfo` 経由)。後者 2 つは純粋ロジックのみ `IoUtil` へ移し、`CameraBase` 側は薄いラッパーとした。 + - 回帰検証: リファクタ前に実機で基準データ(`_基準データ_refactor前/`、特に `TCC_RGB.csv`)を取得して保管。実機の再校正は物理入力が変わり数値が一致しないため、回帰は「同一入力での計算一致」+「コードの文字単位一致」で担保した。 + +- [x] **CameraBase リファクタリング Phase 5(IScam/Lucam の重複処理を集約)** (2026-06-07): Phase 1〜4 後も派生クラスに残っていたプレビュー/校正フローと撮影ループの重複を、`CameraBase` のテンプレートメソッドに集約。カメラ固有のゲイン反映・フレーム取得・撮影前後処理のみ抽象メソッドで派生クラスに残した。 + - 方針: **挙動は一切変えない**。自動テスト不可(ハードウェア/ネイティブ/WinForms 密結合)のため、ビルド 0/0 + diff の処理順序目視一致 + 実機撮影確認で担保。 + - 設計判断: `IScam` の撮影前後処理(Sink 切替・最初のフレーム捨て)は `Lucam` と実行順序が異なるため共通骨格に取り込まず派生側に残した(順序維持を優先)。 + - 失敗パターン: 校正収束時のデバッグログを撮影情報記録とまとめて `CalcTcc` の後に移したことで元の「ログ→CalcTcc→記録」順がずれた → テストで検出し、`CalcTcc` 前に呼ぶ専用フックへ分離して厳密な順序一致を回復。 + +- [x] **PLAN_02 優先度1: `_shots` のスレッドセーフ化(連続撮影クラッシュ修正)** (2026-06-07): 連続撮影で4枚以上取得するとたまにクラッシュする不具合を修正。根本原因は `_shots`(`List`)を撮影スレッドと保存スレッドで無保護に共有していたこと(容量拡張時のリサイズ競合・TOCTOU)。 + - 設計判断: `ConcurrentQueue` 単体ではなく `BlockingCollection` を採用し生産者-消費者パイプライン化。`GetConsumingEnumerable`/`CompleteAdding` で `Thread.Sleep` ポーリング待機を排除。保存連番は独立カウンタで従来順序を維持。 + - 堅牢化: 撮影ループを `try/finally` で包み、例外時も `CompleteAdding()` を必ず呼んで消費者(保存スレッド)の永久ブロックを防止(例外はそのまま伝播。ユーザー向けエラー表示・撮影中断は優先度3 で別途)。 + - 回帰検証: 自動テスト不可(ハードウェア依存)のため、ビルド 0/0 + 実機(校正・連続撮影・複数回・連番一致)確認 + 設計レビューで担保。 + +- [x] **テスト方針(GUIDE_08)整備** (2026-06-07): 立ち上げフローの規約整備フェーズが未着手だったため、品質管理の土台としてテスト方針を策定。ハードウェア結合層(カメラ/UI/スレッド)と純粋ロジック層を分け、後者を NUnit で自動テスト、前者をビルド+手動+実機回帰で担保する方針。 + - 動機: `/implement` のテストフェーズが毎回「テスト不可」で終わっていたが、実態は純粋ロジック層(`ColorCorrector` 等)にテストプロジェクトを立てていなかっただけ、という認識のズレを是正。 + - 後段: テストプロジェクト(`TIASshot.Tests`, NUnit / x64 / .NET Framework 4.8)の立ち上げと `ColorCorrector`・`Config`・`IoUtil` 等の初期テスト作成(次ステップ)。 + +- [x] **エラーハンドリング方針(GUIDE_09)整備** (2026-06-07): 既存の実装パターン(`ErrorMsg`+`bool` 返却・`MessageBox`・`Debug.WriteLine`・`ShowMessage`)を土台に,エラーの分類(起動時致命/処理中の回復可能/プログラミングエラー)・処理方法・ログ方針を軽量に標準化。 + - 動機: PLAN_02 優先度3(撮影中の例外をクラッシュさせずエラー表示・中断する修正)の前に方針を確定し,場当たり実装を避けるため。 + - 設計判断: ログは `Debug.WriteLine` のみとし永続ログファイルは作らない(撮影現場での解析が必要になったら別途見直す)。空 `catch` 禁止・例外時のスレッド同期資源の `finally` 終端を明文化。 + - 残: GUIDE_06 コーディング規約・GUIDE_07 ディレクトリ構造規則は未整備のまま(既存の de-facto 確立により優先度低)。 + +- [x] **テストプロジェクト立ち上げ(TIASshot.Tests, NUnit)** (2026-06-07): GUIDE_08 に従い,ピュアロジック層を自動テストする基盤を構築。`ColorCorrector`(次元拡張・変換行列・色変換)・`Config`(パース)・`IoUtil`(CSV 往復)に初期テストを追加。 + - 設計判断: 本体が packages.config 方式のレガシー形式のため,テストも同形式 x64 で統一(`OpenCvSharp4.runtime.win` のネイティブコピー規則をそのまま機能させ,`dotnet test` ではなく `vstest.console.exe /Platform:x64` で実行)。NUnit 3.14 を採用。 + - テスト容易化のシーム(挙動不変): 本体に `[InternalsVisibleTo("TIASshot.Tests")]` 追加,`ColorCorrector` の純粋メソッドを private→internal・チャネル配列を受け取る internal コンストラクタ追加,`Config.Load(string path)` オーバーロード追加。 + - ハマり所: テストでも OpenCvSharp ネイティブ DLL の **x64 ロード**が必須(`IoUtil` の CSV テストが通る=ネイティブ動作の試金石)。`.gitignore` を汎用 `bin/`・`obj/` に変更し,テストプロジェクトの成果物も除外。 + - 後段: `GetRatio`(ゲイン補正式)は `CameraBase`(ハードウェア結合層)にインラインのため未テスト。抽出すればテスト候補。ENV_02 のメインソース一覧がリファクタ前構成のままドリフトしており,別途修正が必要。 + +- [x] **docs ドリフト修正(ENV_02・TECH_01)** (2026-06-07): リファクタリング(Phase 1〜5)後も旧構成のまま残っていたドキュメントを実構成に整合。ENV_02 のソース一覧をサブフォルダ構成に、TECH_01 のファイルパス・クラス一覧(`ChartDetector`/`ColorCorrector`/`IoUtil` 追加)・`CameraBase` メンバ(移動した `ConvertImage`/`_convRGB2SRGB` 削除)を修正。 + +- [x] **ゲイン補正式(GetRatio)の純粋メソッド抽出+テスト** (2026-06-07): `CameraBase` にインラインだったゲイン更新比率の計算式を,ハードウェア非依存の純粋クラス `GainCalc.CalcRatio` に抽出し,`CameraBase.GetRatio` は委譲に変更。`TIASshot.Tests` でテスト対象化(GUIDE_08 の「ピュアロジック層を分離して自動テスト」方針の実践)。 + - 方針: **挙動不変**。式・演算順序・`float` 比較・ゼロ除算挙動・`UpdateRate` の流れをすべて保持し,派生クラスの呼び出し箇所は無変更。実機で校正(ホワイトバランス自動調整)の収束を確認。 + - テスト観点: 通常比率・`updateRate` 減衰・下降補正(`target^ -- `**: そのコミットで当該ファイルが**変更前 ↔ 変更後**でどう変わったかを **VS Code の左右差分**で開く. +- 設定せずに見たいときは **Timeline**: 該当ファイルを開き,エクスプローラーの「タイムライン」でコミットをクリックすると同じ左右差分が開く. +- ターミナル内のインライン差分で十分なら `git show -- ` でも可. + +## クラッシュ修正 (Crash Fixes) + +### 連続撮影クラッシュ(`_shots` スレッドセーフ化) + +- **状況**: 連続撮影で 4 枚以上取得するとたまにクラッシュしていた.撮影スレッドと保存スレッドが `_shots`(`List`)を無保護共有し,容量拡張時のリサイズ競合・TOCTOU が原因. +- **変更**: 生産者-消費者を `BlockingCollection` に置換し,撮影/保存間を安全化. +- **効果**: 連続撮影の確率的クラッシュを解消. +- **差分で確認(VS Code 左右差分)**: + - [CameraBase.cs](../TIASshot/Cameras/CameraBase.cs) — `git difftool -y 5df961c^ 5df961c -- TIASshot/Cameras/CameraBase.cs` + +### OOM クラッシュ(`ConvertImage` 中間 Mat 解放) + +- **状況**: 連続撮影で `ColorCorrector.ConvertImage` の中間 Mat(`flatten`/`extended`/`converted`/`convertedImage`)が未解放で数十 GB 積み上がり OOM.IScam 17ch × 複数フレームを高速に回すとファイナライザ回収が追いつかない. +- **変更**: 中間 Mat を入れ子 `using` で確定解放. +- **効果**: 連続撮影の OOM を解消. +- **差分で確認(VS Code 左右差分)**: + - [ColorCorrector.cs](../TIASshot/ColorCorrection/ColorCorrector.cs) — `git difftool -y 0003cc2^ 0003cc2 -- TIASshot/ColorCorrection/ColorCorrector.cs` + +### Lucam クロススレッド GDI クラッシュ + +- **状況**: Lucam は二重バッファ `_bmps[]` をコールバックスレッドで Dispose する.入力 bmp を直接 `picDisplay.Image` に載せると UI の `OnPaint` と別スレッド同時アクセスでクラッシュしうる(v1.6 からの潜在バグ). +- **変更**: 入力 bmp は「読むだけ」に統一し,表示は呼び出しスレッド上で UI 所有コピーを生成する設計に変更.修正は**表示側(`Form1.ShowImage`)と入力供給側(`IScam` が自分の `ToBitmap` を破棄)**に入る(`Lucam.cs` 自体は不変). +- **効果**: GDI 同時アクセスクラッシュを解消. +- **差分で確認(VS Code 左右差分)**: + - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs`(`ShowImage` の所有権変更) + - [IScam.cs](../TIASshot/Cameras/IScam.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/Cameras/IScam.cs`(入力 `ToBitmap` の破棄) + +## メモリリーク修正 (Memory Leak Fixes) + +### プレビュー経路リーク(原因1〜3) + +- **状況**: プレビュー表示のまま長時間放置で落ちる.`ShowImage` のフルコピー Bitmap が毎フレームリーク(原因1),表示バッファの取りこぼしフレーム未 Dispose(原因2),`PreviewMonitor.UpdateImage` の上書き前未 Dispose(原因3).撮影しなくても蓄積する. +- **変更**: 表示バッファの所有権を UI 側に統一し,取りこぼしフレームを確実に Dispose. +- **効果**: 放置クラッシュを解消(メモリ天井が一定に). +- **差分で確認(VS Code 左右差分)**: + - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs` + - [PreviewMonitor.cs](../TIASshot/UI/PreviewMonitor.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/PreviewMonitor.cs` + +## 性能改善 (Performance) + +### 副モニタ描画飢餓 → タイマー駆動化 + +- **状況**: 校正完了後にコールバックの毎フレーム `Invalidate()` 洪水で Form1 が常時 WM_PAINT 保留になり,同一 UI スレッドの副モニタが描画飢餓(`sub_paint_fps`≈2〜3). +- **変更**: コールバックからの毎フレーム `Invalidate()` を全廃し,両プレビューを ≒30fps の UI タイマー駆動に統一. +- **効果**: 副モニタが steady に復帰(~19fps). +- **差分で確認(VS Code 左右差分)**: + - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs` + +### フレームコピー高速化(FastClone) + +- **状況**: プレビューで毎フレーム生成する `new Bitmap(bmp)`(32bppARGB 変換を伴う GDI+ 経路で ~46ms)が律速で実効 FPS が頭打ち. +- **変更**: 同一フォーマットの生画素を `LockBits`+`RtlMoveMemory` で行単位コピーする `FastClone` に置換(所有権・スレッド安全性は不変).FastClone 本体は新規 `Utils/BitmapUtil.cs`. +- **効果**: コピー ~46ms→~2.6ms,実効 FPS が倍増. +- **差分で確認(VS Code 左右差分)**: + - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 609baf6^ 609baf6 -- TIASshot/UI/Form1.cs` + - [BitmapUtil.cs](../TIASshot/Utils/BitmapUtil.cs) — `git difftool -y 609baf6^ 609baf6 -- TIASshot/Utils/BitmapUtil.cs` + +## 定量結果 (Quantitative Results) + +3 バージョンを実機で同一プロトコル計測した比較(詳細は [TEST_02](06_TEST/TEST_02_性能評価計測結果.md)).保存経路のメモリは v1.6→v1.7 で上流が改善済み,プレビュー経路は v1.7→現行で本フォークが改善した. + +| 指標 | v1.6 | v1.7 | 現行 | +| --- | --- | --- | --- | +| メモリ `private` 包絡線 | ~200→834 MB 上昇 | ~200→700 MB 上昇 | **~180〜200 MB で平坦** | +| フレームコピー時間 | ~46 ms | ~45 ms | **~2.6 ms** | +| コールバック実効 FPS | ~17 | ~17 | **~30** | +| 副モニタ描画 FPS | ~3(飢餓) | ~3(飢餓) | **~19** | + +→ v1.6/v1.7 のプレビュー指標が一致するのは,プレビュー経路が v1.7 まで未修正だったため. + +## その他の変更(概要) (Other Changes) + +主軸ではないが,あわせて入った変更.差分は `git difftool -y ^ `(パス省略でそのコミットの全変更ファイルを順に開く)や `git show ` で辿れる. + +- **構造リファクタ**: フラット構成を `Cameras/`・`ColorCorrection/`・`ChartDetection/`・`UI/`・`Utils/` に再編し,`IScam`/`Lucam` の重複フローをテンプレートメソッドに集約(挙動不変).`e278f27`(Phase1)ほか,`8a00494`(テンプレートメソッド化). +- **追加機能**: 白板撮影モード(`WHITEBOARD` ビルド限定・`2854dba`)とメモリ観測ツール(`MEMMONITOR` ビルド限定・`243ddeb`).いずれも配布ビルドには含めない([ENV_06](02_ENV/ENV_06_ビルド構成とビルドフラグ.md)). + +## 詳細索引 (References) + +- 全変更の経緯・設計判断・失敗パターン: [PROGRESS.md](PROGRESS.md) +- プレビューメモリリーク修正の詳細: [PLAN_03](03_PLAN/PLAN_03_プレビューメモリリーク修正計画.md) +- 性能評価の計画と結果: [PLAN_04](03_PLAN/PLAN_04_性能評価計測計画.md) / [TEST_02](06_TEST/TEST_02_性能評価計測結果.md) +- コミット一覧: `git log --oneline`/ファイル単位の履歴: `git log -p -- ` diff --git a/setup.ps1 b/setup.ps1 new file mode 100644 index 0000000..9554e25 --- /dev/null +++ b/setup.ps1 @@ -0,0 +1,105 @@ +# ============================================================================= +# TIASshot 開発環境セットアップスクリプト +# 実行方法: PowerShell を管理者権限で開き,以下を実行する +# Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass +# .\setup.ps1 +# ============================================================================= + +$ErrorActionPreference = "Stop" + +Write-Host "========================================" -ForegroundColor Cyan +Write-Host " TIASshot 開発環境セットアップ" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "" + +# ----------------------------------------------------------------------------- +# Step 1: Visual Studio 2022 のインストール +# ----------------------------------------------------------------------------- +Write-Host "[Step 1] Visual Studio 2022 のインストール確認..." -ForegroundColor Yellow + +$vsInstalled = Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" ` + -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*Visual Studio*2022*" } +if ($vsInstalled) { + Write-Host " Visual Studio はインストール済みです.スキップします." -ForegroundColor Green +} else { + Write-Host " Visual Studio 2022 をインストールします..." -ForegroundColor White + $vsconfigPath = Join-Path $PSScriptRoot ".vsconfig" + winget install Microsoft.VisualStudio.2022.Community --no-upgrade ` + --override "--config `"$vsconfigPath`" --quiet --wait" + Write-Host " インストール完了." -ForegroundColor Green +} + +Write-Host "" + +# ----------------------------------------------------------------------------- +# Step 2: データ保存フォルダの作成 +# ----------------------------------------------------------------------------- +Write-Host "[Step 2] データ保存フォルダの作成..." -ForegroundColor Yellow + +$dataFolder = "C:\TIAS_Data" +if (Test-Path $dataFolder) { + Write-Host " $dataFolder は既に存在します.スキップします." -ForegroundColor Green +} else { + New-Item -ItemType Directory -Path $dataFolder | Out-Null + Write-Host " $dataFolder を作成しました." -ForegroundColor Green +} + +Write-Host "" + +# ----------------------------------------------------------------------------- +# Step 3: NuGet パッケージの復元 +# ----------------------------------------------------------------------------- +Write-Host "[Step 3] NuGet パッケージの復元..." -ForegroundColor Yellow + +$slnPath = Join-Path $PSScriptRoot "TIASshot.sln" +if (Test-Path $slnPath) { + # nuget.exe が PATH になければリポジトリルートにダウンロードして使用する + $nugetCmd = Get-Command nuget.exe -ErrorAction SilentlyContinue + if ($nugetCmd) { + $nugetExe = "nuget.exe" + } else { + $nugetExe = Join-Path $PSScriptRoot "nuget.exe" + if (-not (Test-Path $nugetExe)) { + Write-Host " nuget.exe をダウンロードします..." -ForegroundColor White + Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" ` + -OutFile $nugetExe + } + } + & $nugetExe restore $slnPath + Write-Host " NuGet パッケージの復元が完了しました." -ForegroundColor Green +} else { + Write-Host " TIASshot.sln が見つかりません.手動で復元してください." -ForegroundColor Red +} + +Write-Host "" + +# ----------------------------------------------------------------------------- +# Step 4: IC Imaging Control SDK(手動インストール案内) +# ----------------------------------------------------------------------------- +Write-Host "[Step 4] IC Imaging Control SDK のインストール確認..." -ForegroundColor Yellow + +$icInstalled = Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" ` + -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*Imaging*" -or $_.DisplayName -like "*IC Imaging*" } +if ($icInstalled) { + Write-Host " IC Imaging Control SDK はインストール済みです.スキップします." -ForegroundColor Green +} else { + Write-Host " IC Imaging Control SDK が見つかりません." -ForegroundColor White + Write-Host " ブラウザで The Imaging Source のダウンロードページを開きます." -ForegroundColor White + Start-Process "https://www.theimagingsource.com/en-us/support/download/" +} + +Write-Host "" + +# ----------------------------------------------------------------------------- +# 完了メッセージ +# ----------------------------------------------------------------------------- +Write-Host "========================================" -ForegroundColor Cyan +Write-Host " セットアップが完了しました" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "" +Write-Host "次の手順を手動で実施してください:" -ForegroundColor Yellow +Write-Host " 1. IC Imaging Control SDK のインストール(Step 4 参照)" +Write-Host " 2. TIASshot.sln を Visual Studio 2022 で開いてビルド確認" +Write-Host " 3. config.xml・カメラ設定ファイル・CSV ファイルの配置" +Write-Host " (詳細は docs\02_ENV\ENV_02_環境構築手順.md を参照)" +Write-Host ""