Commit 3b38330
release: PLAN06 devbase project サブコマンド導入 (#33)
* chore: release/PLAN06 ブランチ初期化 (Draft release PR 用)
plan: issues/PLAN06_project-subcommand.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: PLAN06-1 project サブコマンド group + ハンドラ共有 + container 非推奨委譲 (#34)
* chore: feature/PLAN06-project-group Draft PR 作成
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: PLAN06-1 project サブコマンド group + 共有ハンドラ + container 非推奨委譲
- cli.py: _add_project_parser を追加し up/down/ps/login/logs/scale/build に
省略可能な [name] positional を付与
- cli.py: SUBCMD_MAP / _expand_argv / _dispatch に project を追加(prefix 解決対応)
- cli.py: ショートカット (up 等) は非推奨の container ではなく共有 cmd_project へ委譲
- container.py: cmd_container 本体を _dispatch_lifecycle に抽出し
cmd_project (推奨) / cmd_container (非推奨 warning + 委譲) で共有
- name は up/scale の project_name へ畳み込み(ディレクトリ解決 / cd は PR2 で実装)
- tests/cli/test_project_dispatch.py: parser / scale positional 非曖昧性 /
prefix 解決 / dispatch ルーティング / 非推奨 warning を検証
runtime 挙動は従来と同等(リネーム + 委譲のみ、cd なし)。wrapper (bin/devbase) の
project ルーティング + name 解決は PR2 (Task 2) に分離。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(cli): project login/build の引数曖昧さ解消 + name 未対応の明示警告
PR #34 round1 レビュー対応 (codex / gemini)。
- project login / build から `[name]` positional を削除し、単一 positional を
index / image として扱う (旧 container login <index> / build <image> と一致)。
`project login 2` が name='2' で index=1 にログインしてしまう曖昧さ、
`project build web` が name='web', image=None で image 指定が無視される問題を解消。
- 共有ディスパッチャ _dispatch_lifecycle で、PR1 未対応の name 指定時に
「カレントディレクトリの compose に作用する」旨を warning 出力。
name を黙って無視して意図しない compose に作用するのを防ぐ
(up/scale は既に name を受け取る経路のため対象外)。
- name 解決自体は設計どおり PR2 スコープ (docs/plans/PLAN06_project_name.md)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(cli): PLAN06 round2 レビュー対応 (wrapper project 到達不能 + up/scale 警告ほか)
- bin/devbase: resolve_command 候補と dispatch case に `project` を追加。
これまで `devbase project ...` が `*)` 節で unknown command になっていた問題を解消。
- _dispatch_lifecycle: name 指定時の未実装警告を up/scale でも出すよう変更。
PR1 では全サブコマンドが CWD の compose に作用し name によるディレクトリ解決を
しないため、up/scale だけ無警告だと「指定 project に作用した」と誤解を与えるため。
- SHORTCUTS: 死んだ group 要素 (`('container', sub)`) を除去し subcommand 文字列に簡略化。
- _add_project_parser: login/build が name を取らない設計意図と PR2 での --name 方針を docstring に明記。
- tests: wrapper の project ルーティング (test_wrapper_dispatch.py) と
up/scale name 警告のテストを追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(cli): _dispatch_lifecycle の up/scale name 警告テストを追加
round2 のレビュー対応 (container.py:100) で up/scale も name 指定時に未実装
警告を出すようにしたため、その回帰防止テストを追加する。前 commit の編集が
既存テストの記法不一致で取り込めていなかったため本 commit で補完する。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(cli): top-level build ショートカットを wrapper の実経路 (shell) に揃える
bin/devbase は top-level `build` を shell の cmd_build (devbase-base 依存検出 +
2 段ビルド + --no-cache 対応) に委譲しているが、Python 側は `build` を SHORTCUTS /
_add_shortcuts / help epilog で `project build` ショートカットとして広告していた。
Python の project build は単純な compose build であり、wrapper 経由の `devbase build`
は実際には shell の cmd_build を通る (共有ハンドラ経路にならない) ため、広告と実経路が
乖離していた (codex major)。
Python の project build へ委譲する案 (codex 案1) は shell の base-image ビルド
オーケストレーションを失う回帰になるため採らず、codex 案2 を採用: Python 側の
SHORTCUTS / _add_shortcuts / help epilog / _expand_argv から top-level `build` を
除外し、実経路 (shell cmd_build) と広告を一致させた。project build / container build
サブコマンド自体は維持。整合性回帰テスト 5 件を追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(cli): PLAN06 deferred 3 件対応 (parser 共通化 / shortcut name 受理 / 登録順序整理)
ユーザ指示により cross-review で deferred としていた 3 件を本 PR で対応する。
1. [minor] _add_container_parser / _add_project_parser の重複
project / container で完全一致する login / build サブコマンド定義を
_add_login_subparser / _add_build_subparser に括り出し共有化。分岐する
up/down/ps/logs/scale の [name] 構成は呼び出し側に残し可読性を維持。
2. [minor] トップレベルショートタットの [name] 受理と伝播
up/down/ps/scale を project サブコマンドと同様に省略可能な [name] positional
を受理するよう _add_shortcuts を更新。ショートカット経由でも name が
_dispatch → cmd_project → _dispatch_lifecycle まで伝播する経路を通した
(name の実解決は PR2、PR1 では未対応 warning を出す)。
3. [nit] commands リストへの project/container 登録順序
_expand_argv の commands リストの並び (_create_parser 登録順と一致、
group 直後に alias を隣接配置、project=推奨 を container=非推奨 より前) と
prefix 解決が順序非依存である旨をコメントで明示。
回帰テスト: shortcut の [name] 受理・伝播、login/build の project/container 一致を
test_project_dispatch.py に追加。pytest 全 suite 348 passed。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム (#35)
* feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム
任意の CWD から `devbase project up <name>` / `devbase up <name>` でプロジェクトを
指定操作できるよう、プロジェクト名解決を実装する (PLAN06 Task 2 / 方針 A: wrapper cd)。
bin/devbase (核心):
- maybe_cd_project を追加。project/container <sub> <name> 及びトップレベルシノニム
<sub> <name> の <name> が $DEVBASE_ROOT/projects/<name> に実在する場合のみ cd し、
COMPOSE_PROJECT_NAME / ./env を cd 後に再設定、argv から name を strip して下流へ。
- 実在性ベースの判定により login <index> / build <image> / scale <N> の既存
positional と曖昧にならない (実在プロジェクト名のときだけ name 扱い)。
- build は shell 実装 (cmd_build) のため、この wrapper cd だけが build の name
解決手段になる (方針 A の核心)。dispatch を name strip 後の _DEVBASE_ARGS 経由に変更。
lib/devbase/commands/container.py (Python 防御フォールバック):
- PR1 の「name 解決は未実装」warning を撤去し、_resolve_project_name で
projects/<name> 解決 → os.chdir (wrapper が cd 済みなら冪等 no-op) +
COMPOSE_PROJECT_NAME 上書き。chdir は _dispatch_lifecycle で一括実施
(down/login/logs は project_name 引数を持たないため per-handler では救えない)。
- 存在しない name はエラー + 候補一覧を提示。
tests:
- 新規 test_project_name_resolution.py: wrapper cd / argv strip / 曖昧性回避 /
Python 解決 / 候補提示を検証。
- PR1 の未実装 warning 系テストを新挙動 (解決 → handler / 解決失敗 → abort) へ更新。
- build dispatch の文字列アサートを _DEVBASE_ARGS 形式へ追従。
全 359 テスト pass。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(wrapper): project build/login の name 解決を抑止し positional 衝突を回避
`project`/`container` グループの wrapper name 解決を parser が name positional を
持つサブコマンド (up/down/ps/logs/scale) に限定する。従来は全サブコマンドで第3
引数を無条件に project 名解決していたため、`project build web` の image=web や
`project login web` の index が実在プロジェクト名と一致した瞬間に strip されて
別操作へ化ける衝突があった (codex round1 major 指摘)。
トップレベルシノニム (build/login 含む) は Python parser を経ず shell cmd_build /
wrapper cd だけが name 指定手段であるため、従来どおり「実在 project なら cd」の
存在性ベース判定を維持する。
project build/login グループの衝突回避を固定する回帰テスト 2 件を追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(pr35): deferred minor 2件 — env source 方針の注記 + 候補一覧 truncate
- bin/devbase: maybe_cd_project の source ./env に設計判断コメントを追記。
set -a の export を後続へ引き継ぐため subshell 化はできず、env は信頼境界内
かつ既に L24 でも source されるため新規リスク増は無いことを明記。
- container.py: _report_unknown_project の候補一覧を先頭 20 件 + 「... 他 M 件」
に truncate (多数プロジェクト環境での 1 行肥大を回避)。
- tests: truncate / 上限内非省略 の回帰テストを追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(pr35): gemini round2 minor 2件 — Python フォールバックの env source 整合 + list 同期注記
- container.py: _resolve_project_name に _load_project_env を追加し、wrapper の
`source ./env` と同等に project env を os.environ へ反映。wrapper を経ない
直接起動 (`python -m devbase.cli project up <name>`) でも CONTAINER_SCALE 等の
project 固有変数が欠落しないようにする。name 指定は env 由来 COMPOSE_PROJECT_NAME
より優先 (env 反映後に上書き)。単純な KEY=VALUE のみ解釈し変数展開/コマンド置換は
非サポート (安全側)。
- bin/devbase / cli.py: _PROJECT_NAME_SUBCOMMANDS / _NAME_RESOLVABLE_SHORTCUTS と
cli.py の parser 定義 (_add_project_parser / SHORTCUTS) の同期が必要な旨を両側に注記。
- tests: env 反映 / name 優先 / env 不在時の堅牢性 の回帰テスト 3件追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動 (#36)
* feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動
`devbase project list` / トップレベルシノニム `devbase list` を新設し、
$DEVBASE_ROOT/projects/ 配下を NAME / PLUGIN / STATUS で一覧表示する。
- lib/devbase/commands/project.py (新規):
- _resolve_plugin_name: symlink 先から plugin 名を解決。PLAN04 の同名衝突
suffix (carmo.takemi) はリンク名のみに付きリンク先 dir は素の <proj> の
ままなので、リンク先を辿ることで suffix 有無に関わらず正しく解決する。
- list_projects: projects/ 配下 (symlink/実dir/broken symlink) を列挙。
status は status._container_status_for を共有 (取得不能は unknown)。
- cmd_project_list: 整列テーブル表示 / --interactive で番号入力選択 →
project up 起動 (新規依存を足さず stdlib input、非TTY は EOFError graceful)。
- lib/devbase/commands/status.py:
- per-entry の _container_status_for を抽出し project list と共有
(cmd_status の挙動は不変)。
- lib/devbase/cli.py:
- project list サブコマンド (--interactive/-i) + トップレベル list シノニム
- SUBCMD_MAP / _expand_argv / dispatch に list を同期 (DEVBASE_ROOT 必須)
- bin/devbase:
- resolve_command 候補 + dispatch case に list を追加 (name 解決対象外)
- tests: test_project_list.py 新規 (25件) + wrapper dispatch に list 経路 4件
pytest: 395 passed (baseline 366 + 29)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(project): PR#36 レビュー対応 — l→login 互換 / status 並列化 / 堅牢性 / 再入力
- [major/互換性] `list` 追加で ambiguous になった `devbase l` を `login` に維持
(bin/devbase resolve_command + cli.py TOP_PREFIX_PREFERENCES)。`li` は list のまま。
- [major/性能] list_projects の `docker compose ps` を ThreadPoolExecutor で並列化
(cwd= で完結し global chdir せずスレッド安全)。
- [minor/堅牢性] _resolve_plugin_name が `/projects/proj` 等で `/`・`..` を
plugin 名に返さず None に。
- [minor/UX] _interactive_select_and_up を誤入力 (数値以外/範囲外) で再入力ループに。
- 回帰テスト 6 件追加。pytest 402 passed。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(project): PR#36 round2 — KeyboardInterrupt 中止 / prefix preference 同期テスト
- _interactive_select_and_up: Ctrl+C (KeyboardInterrupt) を捕捉し
traceback を出さず中止 (rc=0) として扱う (minor / 堅牢性)
- TOP_PREFIX_PREFERENCES の bin/devbase と cli.py の乖離防止のため、
両者の preference 対応表が一致することを検証する同期テストを追加
(major / 正確性)
- 回帰テスト 2 件追加 (keyboard_interrupt_aborts / synced_with_cli)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(project): PR#36 deferred nit — _load_project_env と shell source の仕様乖離を明文化
gemini round2 review-body の将来課題推奨 (Python パーサと shell source の env
解釈が乖離し得る) に対し、仕様統一はリスクが大きいため制約のドキュメント化で
対応する。
- _load_project_env docstring に shell ``source`` との具体的な乖離ケース
(変数展開 / コマンド置換 / 行中クォート / インラインコメント) を note 追記。
いずれも wrapper を経ない直接起動のフォールバック時のみ影響する旨を明記。
- 乖離挙動を pin する回帰テスト test_load_project_env_diverges_from_shell_source
を追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: PLAN06-4 補完 + docs + CHANGELOG + container 非推奨告知 (#37)
* feat: PLAN06-4 補完 + docs + CHANGELOG + container 非推奨告知
PLAN06 で導入した project サブコマンド体系をシェル補完・ドキュメント・
CHANGELOG に反映し、container グループの非推奨を告知する。
- etc/devbase-completion.bash / etc/_devbase:
- project グループ補完 (up/down/ps/login/logs/scale/build/list) を追加
- プロジェクト名補完 (_devbase_project_names: $DEVBASE_ROOT/projects/ 配下を
列挙) を project up/down/ps/logs/scale とトップレベルシノニム up/down/ps/scale
に追加
- project list / top-level list の --interactive / -i 補完
- container は補完候補に残しつつ非推奨マーク (zsh description)
- docs/user/cli-reference.md:
- コマンド体系図・エイリアス・ショートカットを project 体系に更新
- 「project グループ」節を新設 (name 解決 / project list / --interactive /
login・build が name を取らない理由 / 親シェル CWD 非汚染)
- 「container グループ (非推奨)」節に置換
- docs/user/container-operations.md:
- 冒頭に project 体系への移行注記、scale/logs 例を project 形へ、
project list の横断一覧 vs project ps の単体表示の役割整理を追記
- README.md / docs/user/getting-started.md: 残存する container 直接形を project へ
- CHANGELOG.md: Unreleased に PLAN06 (Added: project 群 / Changed: container 非推奨)
- tests/cli/test_completion.py 新規 (bash 補完を source した動作検証 8件 +
zsh 静的内容/構文チェック。zsh 未インストール環境は skip)
pytest: 374 passed, 1 skipped (zsh)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(completion): bash top-level ps の -a フラグ補完を project ps と対称化
軽量レビュー nit 対応。bash 補完の top-level シノニム `devbase ps` は
プロジェクト名のみ補完し -a/--all フラグを補完していなかった (zsh / project
ps は分岐済み)。$cur が `-*` のときフラグ、それ以外は name を補完するよう
project ps (cword 3) と同じ挙動に揃え、回帰テスト2件を追加した。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(docs,completion): PR#37 レビュー指摘3件対応
- README CLI体系セクションを project 主グループ + container 非推奨注記へ更新 (cli-reference.md と整合)
- bash 補完に cword>=4 分岐を追加し project ps/logs の name 後フラグ補完に対応
- _devbase_project_names を find -L ... -type d に変更し dir/dir-symlink のみ列挙 (壊れた/ファイル symlink を除外、zsh と整合)
- 回帰テスト3件追加 (壊れた symlink 除外 / project ps/logs フラグ補完)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(completion,docs): PR#37 Round3 指摘2件対応
- completion: _devbase_project_names の `xargs -r`(GNU 拡張) を排除し、
find -L ... -type d の各行を POSIX パラメータ展開 ${p##*/} で basename 化。
BSD/macOS でも候補が空にならず移植性を確保 (symlink dir 限定は維持)。
- docs: cli-reference.md のトップレベルシノニム名前解決の記述を正確化。
bin/devbase の _NAME_RESOLVABLE_SHORTCUTS に login が含まれ、login <name>
も build <name> 同様に存在性判定で名前解決されるため両方を明記。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs,completion: PR#37 Round4 minor 指摘4件対応 (最終スイープ)
- etc/devbase-completion.bash: `list` / `project list` の `-*` ガードを外し
位置引数を取らないサブコマンドで常に --interactive 候補を出す (zsh と整合)
- docs/user/cli-reference.md: Mermaid D1 ノードから login [index] / build [image]
を分離し [name] を取らないことを明示
- etc/_devbase: `project ps` / `project logs` の name 補完を _arguments の
positional (1:name:) に統合し、名前入力済みでも候補が出る問題を解消
- docs/user/cli-reference.md / README.md: `devbase build` が project グループ
ではなく bin/devbase の shell 実装 cmd_build へ直接委譲される旨を明記
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(env): プロジェクト切替時に呼び出し元固有 env キーをクリア (codex指摘)
別プロジェクト内から `devbase project up other` 等を実行した際、対象 env を
上書き source するだけだと呼び出し元プロジェクトにしか無い env キー
(例: DEV_SERVICE_NAME) が残留し、対象プロジェクトへ誤って引き継がれていた。
- bin/devbase: 起動時に呼び出し元 (初期 CWD) の env キーを env_var_keys() で記録し、
maybe_cd_project の対象 env source 前に unset。共通キーは対象 env が再設定するため
対象側の値が勝つ。
- lib/devbase/commands/container.py: Python フォールバック (_resolve_project_name /
_load_project_env) でも同様に、chdir 前の呼び出し元 env キーのうち対象 env に
無いものを unset。
- tests: wrapper / Python 両経路の回帰テストを追加。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(wrapper): ct alias を name 解決経路に統合 + 衝突注意を強化
PR #33 cross-review round2 codex 指摘対応。
- ct alias 修正 (minor, bin/devbase:319):
name 解決 case の `project|container)` を `project|container|ct)` に拡張。
`ct up <name>` が container と同じ strip/chdir 経路を通るようにし、
従来 `unrecognized arguments: <name>` になっていた回帰を解消。
alias `ct` 自体は cli.py 側で container へ解決されるため Python へは
`ct` のまま渡す。回帰テスト test_wrapper_ct_up_name_cds_and_strips を追加。
- 衝突注意の強化 (major=却下に伴うドキュメント補強):
login/build/scale の存在性ベース name 解決は意図的設計のため挙動は維持。
positional 引数 (index/image/service) が実在プロジェクト名と衝突した際に
project 解決が優先され引数解釈が変わる footgun を bin/devbase コメントと
docs/user/cli-reference.md に明記。回避策 (対象プロジェクト内で実行 / 明示
切り替え) も併記。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 0344610 commit 3b38330
18 files changed
Lines changed: 2862 additions & 161 deletions
File tree
- bin
- docs/user
- etc
- lib/devbase
- commands
- tests/cli
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
8 | 14 | | |
9 | 15 | | |
10 | 16 | | |
| |||
15 | 21 | | |
16 | 22 | | |
17 | 23 | | |
| 24 | + | |
18 | 25 | | |
19 | 26 | | |
20 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
78 | | - | |
| 78 | + | |
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
84 | 86 | | |
85 | 87 | | |
86 | 88 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
15 | 36 | | |
16 | 37 | | |
17 | 38 | | |
| |||
21 | 42 | | |
22 | 43 | | |
23 | 44 | | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
24 | 55 | | |
25 | 56 | | |
26 | 57 | | |
| |||
168 | 199 | | |
169 | 200 | | |
170 | 201 | | |
171 | | - | |
| 202 | + | |
172 | 203 | | |
173 | 204 | | |
174 | 205 | | |
175 | 206 | | |
176 | 207 | | |
177 | 208 | | |
178 | | - | |
179 | | - | |
| 209 | + | |
180 | 210 | | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
181 | 278 | | |
182 | 279 | | |
183 | 280 | | |
| |||
187 | 284 | | |
188 | 285 | | |
189 | 286 | | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
190 | 354 | | |
191 | 355 | | |
192 | 356 | | |
193 | 357 | | |
194 | | - | |
195 | | - | |
| 358 | + | |
| 359 | + | |
196 | 360 | | |
197 | | - | |
| 361 | + | |
198 | 362 | | |
199 | 363 | | |
200 | 364 | | |
| |||
0 commit comments