From c9d2805ccd2079c5a10515e6f65fcbb2aa7ce503 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Thu, 28 May 2026 11:31:56 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[FEAT]:=20neuron=20Phase=2017=20=E2=80=94?= =?UTF-8?q?=20scale-up=20validation=20=EB=85=B8=ED=8A=B8=EB=B6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - notebooks/02-function-level/17-phase17-scale-up.ipynb 신규 - 코드 변경 없음 — 기존 framework (Phase 15/16) 가 모든 config 지원하므로 *scale 자체의 영향* 검증 - scale-up (Phase 16 대비): - hidden_dim: 128 → 256 (2x), n_layers: 4 → 6, ffn(L): 256 → 512 (2x) - max_steps: 1500 → 5000 (3.3x), 추정 params: ~1M → ~5M (5x) - 4 mode × 2 seed = 8 run: - dense_large (target reference) - static_prune_50 (Phase 15 at scale) - DST_RigL_50 (Phase 16a at scale, period=200/swap=5% — 16a 의 50/10% 보다 보수적) - grown (Phase 16b at scale, ffn 256 → 512 at step 2500) - 자동 verdict 4 + Phase 16 vs 17 막대그래프 비교 - 핵심 가설: - DST_RigL ≤ static (Phase 16a advantage scale 한계 해소?) - grown ≤ dense_large + 0.02 (Phase 16b gap 축소?) - plateau 도달 분석 (마지막 500 step drift) --- .../17-phase17-scale-up.ipynb | 491 ++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 notebooks/02-function-level/17-phase17-scale-up.ipynb diff --git a/notebooks/02-function-level/17-phase17-scale-up.ipynb b/notebooks/02-function-level/17-phase17-scale-up.ipynb new file mode 100644 index 0000000..cb82b80 --- /dev/null +++ b/notebooks/02-function-level/17-phase17-scale-up.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# 17-phase17-scale-up\n", + "\n", + "**neuron Phase 17** — paradigm 의 dynamic method (DST, Net2Net grow) 의 **advantage 가 scale-up 으로 발현되는지** 검증.\n", + "\n", + "**배경**: Phase 16a/16b 둘 다 framework 검증은 PASS 했으나 *expected performance benefit 미실현*. Phase 16b Notion 분석에서 원인을 *본 setup (~1M params, 1500 step) 의 scale 한계* 로 결론. RigL/Net2Net 의 reference paper 들이 large-scale 에서만 advantage 발현하는 알려진 패턴.\n", + "\n", + "**핵심 가설** (scale-up 효과):\n", + "1. **DST_RigL ≤ static_prune (16a 의 advantage 발현)** — 더 긴 학습으로 swap cost 가 amortized?\n", + "2. **grown ≈ large_baseline (16b 의 gap 축소)** — 더 긴 post-grow 학습으로 새 capacity 활성화?\n", + "3. **scale 자체의 효과** — 큰 모델 + 긴 학습 시 paradigm 의 dynamic 의미 증가?\n", + "4. **all-finite + smooth convergence** — 확대된 setup 에서도 안정성?\n", + "\n", + "설계: 4 mode × 2 seed = 8 run at **scale-up config**.\n", + "\n", + "| 항목 | Phase 16 | Phase 17 (scale-up) | 배수 |\n", + "|---|---|---|---|\n", + "| hidden_dim | 128 | **256** | 2x |\n", + "| n_layers | 4 | **6** | 1.5x |\n", + "| ffn_dim (large) | 256 | **512** | 2x |\n", + "| max_steps | 1500 | **5000** | 3.3x |\n", + "| approx params | ~1M | **~5M** | ~5x |\n", + "\n", + "4 mode:\n", + "- `dense_large`: 큰 모델 baseline (target reference)\n", + "- `static_prune_50`: dense 학습 후 step 2500 에서 50% prune (Phase 15 at scale)\n", + "- `DST_RigL_50`: static 과 동일 + step 2500 후 period=200 마다 RigL DST swap (Phase 16a at scale)\n", + "- `grown`: ffn=256 시작 → step 2500 에서 512 로 grow (Phase 16b at scale)\n", + "\n", + "arch 고정: `hybrid_around_one_around_one` + `use_full_graph=True`\n", + "데이터: TinyShakespeare (char-LM, block_size=64 유지)\n", + "시드: [42, 123]\n", + "작성일: 2026-05-28\n", + "연관: Issue [#80](https://github.com/EinSofINTEREST/GraphLM/issues/80) / Phase 16 메인 [#75](https://github.com/EinSofINTEREST/GraphLM/issues/75)" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## 0. 환경 / 의존성" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import annotations\n", + "\n", + "import math\n", + "import statistics\n", + "from pathlib import Path\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import torch\n", + "\n", + "from graphlm.data.tinyshakespeare import (\n", + " CharTokenizer,\n", + " TinyShakespeareDataset,\n", + " load_tinyshakespeare_text,\n", + ")\n", + "from graphlm.neuron.hybrid_transformer_demo import (\n", + " HybridTransformerTrainConfig,\n", + " train_hybrid_transformer_lm,\n", + ")\n", + "from graphlm.utils import safe_perplexity\n", + "\n", + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + "print(f\"device: {device}\")\n", + "print(f\"torch: {torch.__version__}\")" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## 1. Config — scale-up" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "text = load_tinyshakespeare_text()\n", + "tokenizer = CharTokenizer(text)\n", + "dataset = TinyShakespeareDataset(text, tokenizer)\n", + "vocab_size = tokenizer.vocab_size\n", + "print(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n", + "\n", + "# scale-up — Phase 16 대비 hidden 2x, layers 1.5x, ffn 2x, steps 3.3x\n", + "HIDDEN_DIM = 256\n", + "N_HEADS = 8 # head_dim = 32 (256/8)\n", + "N_LAYERS = 6\n", + "GROUP_SIZE = 16\n", + "BLOCK_SIZE = 64\n", + "BATCH_SIZE = 32\n", + "LR = 3e-4\n", + "MAX_STEPS = 5000\n", + "DYNAMIC_AT_STEP = MAX_STEPS // 2 # 2500 — prune/grow/DST 시작 시점\n", + "DST_PERIOD = 200 # Phase 16a 의 50 보다 4x 보수적 (16a 의 swap-cost-too-high 문제 완화 시도)\n", + "DST_SWAP_FRACTION = 0.05 # Phase 16a 의 0.1 의 절반 (덜 공격적)\n", + "DST_END_STEP = MAX_STEPS - 500 # 마지막 500 step stabilize\n", + "SEEDS = [42, 123]\n", + "ARCH = \"hybrid_around_one_around_one\"\n", + "FFN_SMALL = 256\n", + "FFN_LARGE = 512\n", + "\n", + "# 4 mode 정의\n", + "MODES = [\n", + " {\n", + " \"name\": \"dense_large\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": None,\n", + " \"prune_fraction\": 0.0,\n", + " \"regrow_method\": None,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"static_prune_50\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": DYNAMIC_AT_STEP,\n", + " \"prune_fraction\": 0.5,\n", + " \"regrow_method\": None,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"DST_RigL_50\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": DYNAMIC_AT_STEP,\n", + " \"prune_fraction\": 0.5,\n", + " \"regrow_method\": \"rigl\",\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"grown\",\n", + " \"ffn_dim\": FFN_SMALL,\n", + " \"prune_at_step\": None,\n", + " \"prune_fraction\": 0.0,\n", + " \"regrow_method\": None,\n", + " \"grow_at_step\": DYNAMIC_AT_STEP,\n", + " \"grow_ffn_target\": FFN_LARGE,\n", + " },\n", + "]\n", + "print(\"\\nScale-up config:\")\n", + "print(\n", + " f\" hidden={HIDDEN_DIM}, n_heads={N_HEADS}, n_layers={N_LAYERS}, ffn(L)={FFN_LARGE}, group={GROUP_SIZE}\"\n", + ")\n", + "print(\n", + " f\" max_steps={MAX_STEPS}, dynamic_at={DYNAMIC_AT_STEP}, dst_period={DST_PERIOD}, swap={DST_SWAP_FRACTION}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## 2. Sweep 실행 (4 mode × 2 seed = 8 run, GPU 권장)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "results = {}\n", + "for mode in MODES:\n", + " for seed in SEEDS:\n", + " key = (mode[\"name\"], seed)\n", + " print(f\"\\n== mode={mode['name']} seed={seed} ==\")\n", + " cfg = HybridTransformerTrainConfig(\n", + " dataset=dataset,\n", + " vocab_size=vocab_size,\n", + " hidden_dim=HIDDEN_DIM,\n", + " n_heads=N_HEADS,\n", + " ffn_dim=mode[\"ffn_dim\"],\n", + " n_layers=N_LAYERS,\n", + " group_size=GROUP_SIZE,\n", + " arch=ARCH,\n", + " use_full_graph=True,\n", + " block_size=BLOCK_SIZE,\n", + " batch_size=BATCH_SIZE,\n", + " lr=LR,\n", + " max_steps=MAX_STEPS,\n", + " prune_at_step=mode[\"prune_at_step\"],\n", + " prune_fraction=mode[\"prune_fraction\"],\n", + " regrow_method=mode[\"regrow_method\"],\n", + " dst_period=DST_PERIOD if mode[\"regrow_method\"] else None,\n", + " dst_swap_fraction=DST_SWAP_FRACTION,\n", + " dst_end_step=DST_END_STEP if mode[\"regrow_method\"] else None,\n", + " grow_at_step=mode[\"grow_at_step\"],\n", + " grow_ffn_target=mode[\"grow_ffn_target\"],\n", + " seed=seed,\n", + " device=device,\n", + " )\n", + " out = train_hybrid_transformer_lm(cfg)\n", + " results[key] = out\n", + " n_cycles = len(out[\"dst_cycles\"])\n", + " print(\n", + " f\" final_loss = {out['final_loss']:.4f} (ppl = {safe_perplexity(out['final_loss']):.2f})\"\n", + " f\" params = {out['final_param_count']:,}\"\n", + " f\" sparsity = {out['final_sparsity']:.3f} dst_cycles = {n_cycles}\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "## 3. 결과 표 + 자동 verdict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "print(\n", + " f\"{'mode':>16s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n", + " f\"{'params':>10s} {'sparsity':>10s}\"\n", + ")\n", + "print(\"-\" * 75)\n", + "for (name, seed), out in results.items():\n", + " fl = out[\"final_loss\"]\n", + " print(\n", + " f\"{name:>16s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n", + " f\"{out['final_param_count']:>10,} {out['final_sparsity']:>10.3f}\"\n", + " )\n", + "\n", + "# mode 별 평균\n", + "print(\"\\n== Mode summary (mean ± σ across seeds) ==\")\n", + "summary = {}\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n", + " params = [results[(name, s)][\"final_param_count\"] for s in SEEDS]\n", + " sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n", + " m = statistics.mean(vals)\n", + " sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n", + " summary[name] = (m, sd, statistics.mean(params), statistics.mean(sparsities))\n", + " print(\n", + " f\" {name:>16s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n", + " f\"params={statistics.mean(params):,.0f} sparsity={statistics.mean(sparsities):.3f}\"\n", + " )\n", + "\n", + "# 자동 verdict\n", + "print(\"\\n== Verdict ==\")\n", + "dense_loss = summary[\"dense_large\"][0]\n", + "static_loss = summary[\"static_prune_50\"][0]\n", + "rigl_loss = summary[\"DST_RigL_50\"][0]\n", + "grown_loss = summary[\"grown\"][0]\n", + "\n", + "# 1. all-finite\n", + "all_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\n", + "verdict_1 = \"PASS\" if all_finite else \"FAIL\"\n", + "print(f\"1. all-finite: {all_finite} [{verdict_1}]\")\n", + "\n", + "# 2. Phase 16a 가설 재검증 — DST_RigL ≤ static_prune\n", + "diff_rigl_static = rigl_loss - static_loss\n", + "verdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\n", + "print(f\"2. DST_RigL ≤ static + 0.02 (16a 재검증): diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\n", + "if diff_rigl_static < 0:\n", + " print(\" → DST advantage 발현! Phase 16a 의 scale-limit 가설 입증.\")\n", + "elif diff_rigl_static < 0.005:\n", + " print(\" → DST 가 static 근방까지 도달 — 부분 advantage.\")\n", + "else:\n", + " print(\" → DST 여전히 static 보다 약간 열위 — 추가 scale-up 필요.\")\n", + "\n", + "# 3. Phase 16b 가설 재검증 — grown ≤ dense_large + 0.02\n", + "diff_grown_dense = grown_loss - dense_loss\n", + "verdict_3 = \"PASS\" if diff_grown_dense <= 0.02 else \"FAIL\"\n", + "print(f\"3. grown ≤ dense_large + 0.02 (16b 재검증): diff = {diff_grown_dense:+.4f} [{verdict_3}]\")\n", + "if diff_grown_dense < 0.01:\n", + " print(\" → grown 이 dense_large 근방 — 0-init activation 충분.\")\n", + "else:\n", + " print(\" → grown 과 dense 격차 여전 — post-grow 학습 시간 더 필요할 수 있음.\")\n", + "\n", + "# 4. plateau 도달 확인 — 마지막 500 step 의 loss 변동 < threshold\n", + "print(\"\\n plateau 분석 (마지막 500 step rolling mean 변동):\")\n", + "for name in [m[\"name\"] for m in MODES]:\n", + " for seed in SEEDS:\n", + " losses = results[(name, seed)][\"losses\"]\n", + " last_500 = losses[-500:]\n", + " first_half = sum(last_500[:250]) / 250\n", + " second_half = sum(last_500[250:]) / 250\n", + " plateau_drift = second_half - first_half\n", + " print(\n", + " f\" {name:>16s} seed={seed}: drift = {plateau_drift:+.4f} (< -0.01 = still learning)\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## 4. Loss curve 시각화" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\n", + "colors = {\n", + " \"dense_large\": \"tab:green\",\n", + " \"static_prune_50\": \"tab:red\",\n", + " \"DST_RigL_50\": \"tab:blue\",\n", + " \"grown\": \"tab:orange\",\n", + "}\n", + "window = 100 # scale-up 이라 더 긴 rolling window\n", + "\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n", + " smoothed = []\n", + " for losses in losses_per_seed:\n", + " smoothed.append(\n", + " [\n", + " sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n", + " for i in range(len(losses))\n", + " ]\n", + " )\n", + " arr = torch.tensor(smoothed)\n", + " mean = arr.mean(dim=0)\n", + " std = arr.std(dim=0)\n", + " steps = list(range(len(mean)))\n", + " ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n", + " ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n", + "\n", + "# dynamic step + DST end 수직선\n", + "ax.axvline(\n", + " DYNAMIC_AT_STEP,\n", + " color=\"black\",\n", + " linestyle=\":\",\n", + " alpha=0.5,\n", + " label=f\"prune/grow @ {DYNAMIC_AT_STEP}\",\n", + ")\n", + "ax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.4, label=f\"DST end @ {DST_END_STEP}\")\n", + "\n", + "ax.set_xlabel(\"step\")\n", + "ax.set_ylabel(f\"loss (rolling mean w={window})\")\n", + "ax.set_title(\n", + " \"Phase 17 scale-up (hidden=256, n_layers=6, ffn(L)=512, steps=5000) — 4 mode (mean ± σ over 2 seeds)\"\n", + ")\n", + "ax.legend(loc=\"upper right\")\n", + "ax.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "\n", + "out_dir = Path(\"../../runs/notebook-neuron-phase17\")\n", + "out_dir.mkdir(parents=True, exist_ok=True)\n", + "fig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\n", + "plt.show()\n", + "print(f\"saved: {out_dir / 'loss_curves.png'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## 5. Phase 15/16/17 합산 비교 (scale 영향 시각화)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# Phase 16 baseline 수치 (Notion 정리 결과 기준):\n", + "# Phase 16a (hidden=128, n_layers=4, ffn=256, 1500 step):\n", + "# dense: 1.8999, static_50: 1.9777, DST_RigL_50: 1.9831\n", + "# Phase 16b: dense_large (ffn=256): 1.8999, grown (128→256): 1.9428\n", + "p16a_baselines = {\n", + " \"dense\": 1.8999,\n", + " \"static_50\": 1.9777,\n", + " \"DST_RigL_50\": 1.9831,\n", + "}\n", + "p16b_grown = 1.9428\n", + "\n", + "# Phase 17 결과 — summary 에서 추출\n", + "p17 = {name: summary[name][0] for name in [m[\"name\"] for m in MODES]}\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(10, 5))\n", + "modes_plot = [\"dense\", \"static_prune_50\", \"DST_RigL_50\", \"grown\"]\n", + "x = list(range(len(modes_plot)))\n", + "p16_vals = [\n", + " p16a_baselines[\"dense\"],\n", + " p16a_baselines[\"static_50\"],\n", + " p16a_baselines[\"DST_RigL_50\"],\n", + " p16b_grown,\n", + "]\n", + "p17_vals = [\n", + " p17[\"dense_large\"],\n", + " p17[\"static_prune_50\"],\n", + " p17[\"DST_RigL_50\"],\n", + " p17[\"grown\"],\n", + "]\n", + "width = 0.35\n", + "ax.bar(\n", + " [i - width / 2 for i in x],\n", + " p16_vals,\n", + " width,\n", + " label=\"Phase 16 (~1M, 1500 step)\",\n", + " color=\"lightblue\",\n", + ")\n", + "ax.bar(\n", + " [i + width / 2 for i in x], p17_vals, width, label=\"Phase 17 (~5M, 5000 step)\", color=\"darkblue\"\n", + ")\n", + "ax.set_xticks(x)\n", + "ax.set_xticklabels(modes_plot, rotation=15)\n", + "ax.set_ylabel(\"final loss (mean over 2 seeds)\")\n", + "ax.set_title(\"Phase 17 vs Phase 16 — scale-up effect across 4 modes\")\n", + "ax.legend()\n", + "ax.grid(alpha=0.3, axis=\"y\")\n", + "plt.tight_layout()\n", + "fig.savefig(out_dir / \"phase16_vs_phase17.png\", dpi=150, bbox_inches=\"tight\")\n", + "plt.show()\n", + "print(f\"saved: {out_dir / 'phase16_vs_phase17.png'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## 6. 결론 / 다음 단계\n", + "\n", + "(셀 출력 보고 사용자가 채울 영역)\n", + "\n", + "**핵심 질문 답변**:\n", + "- DST_RigL advantage 가 scale-up 으로 발현되었나?\n", + "- grown 의 capacity gap 이 축소되었나?\n", + "- Phase 16 대비 모든 mode 의 절대 loss 가 명확히 낮아짐?\n", + "\n", + "**Phase 18 후보**:\n", + "- (advantage 발현 시) 16a + 16b 결합 — grow + DST 동시\n", + "- (여전히 미실현 시) dataset 확대 (OpenWebText subset) 또는 method 개선 (Net2WiderNet duplication / RigL ablation)\n", + "- (명백한 우수성 발견 시) scaling law 분석 + 결과 정리" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "GraphLM (uv .venv)", + "language": "python", + "name": "graphlm-uv-venv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From ccb984bdf5b5b6dc71d11d3434b47856ee025876 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Thu, 28 May 2026 15:06:51 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[FIX]:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81,=20=EB=85=B8=ED=8A=B8=EB=B6=81=20defensive?= =?UTF-8?q?=20coding=203=EA=B1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gemini #3314998767 (cell 4): DST_END_STEP = MAX_STEPS - 500 이 MAX_STEPS<500 시 음수 → ValueError. → DST_END_STEP = max(1, MAX_STEPS - 500) 로 변경 (빠른 디버깅 시 안전). - gemini #3314998775 (cell 8): plateau 분석의 [:250] / [250:] 하드코딩 이 짧은 학습 시 부정확. → 동적 half 분할 (half_len = len(last_500) // 2 + 조건문). - gemini #3314998777 (cell 10): arr.std(dim=0) with single seed → NaN 으로 fill_between 깨짐. → arr.size(0) > 1 일 때만 std, 아니면 zeros_like 로 안전 처리. --- .../17-phase17-scale-up.ipynb | 204 +----------------- 1 file changed, 4 insertions(+), 200 deletions(-) diff --git a/notebooks/02-function-level/17-phase17-scale-up.ipynb b/notebooks/02-function-level/17-phase17-scale-up.ipynb index cb82b80..2a6873e 100644 --- a/notebooks/02-function-level/17-phase17-scale-up.ipynb +++ b/notebooks/02-function-level/17-phase17-scale-up.ipynb @@ -94,78 +94,7 @@ "id": "4", "metadata": {}, "outputs": [], - "source": [ - "text = load_tinyshakespeare_text()\n", - "tokenizer = CharTokenizer(text)\n", - "dataset = TinyShakespeareDataset(text, tokenizer)\n", - "vocab_size = tokenizer.vocab_size\n", - "print(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n", - "\n", - "# scale-up — Phase 16 대비 hidden 2x, layers 1.5x, ffn 2x, steps 3.3x\n", - "HIDDEN_DIM = 256\n", - "N_HEADS = 8 # head_dim = 32 (256/8)\n", - "N_LAYERS = 6\n", - "GROUP_SIZE = 16\n", - "BLOCK_SIZE = 64\n", - "BATCH_SIZE = 32\n", - "LR = 3e-4\n", - "MAX_STEPS = 5000\n", - "DYNAMIC_AT_STEP = MAX_STEPS // 2 # 2500 — prune/grow/DST 시작 시점\n", - "DST_PERIOD = 200 # Phase 16a 의 50 보다 4x 보수적 (16a 의 swap-cost-too-high 문제 완화 시도)\n", - "DST_SWAP_FRACTION = 0.05 # Phase 16a 의 0.1 의 절반 (덜 공격적)\n", - "DST_END_STEP = MAX_STEPS - 500 # 마지막 500 step stabilize\n", - "SEEDS = [42, 123]\n", - "ARCH = \"hybrid_around_one_around_one\"\n", - "FFN_SMALL = 256\n", - "FFN_LARGE = 512\n", - "\n", - "# 4 mode 정의\n", - "MODES = [\n", - " {\n", - " \"name\": \"dense_large\",\n", - " \"ffn_dim\": FFN_LARGE,\n", - " \"prune_at_step\": None,\n", - " \"prune_fraction\": 0.0,\n", - " \"regrow_method\": None,\n", - " \"grow_at_step\": None,\n", - " \"grow_ffn_target\": None,\n", - " },\n", - " {\n", - " \"name\": \"static_prune_50\",\n", - " \"ffn_dim\": FFN_LARGE,\n", - " \"prune_at_step\": DYNAMIC_AT_STEP,\n", - " \"prune_fraction\": 0.5,\n", - " \"regrow_method\": None,\n", - " \"grow_at_step\": None,\n", - " \"grow_ffn_target\": None,\n", - " },\n", - " {\n", - " \"name\": \"DST_RigL_50\",\n", - " \"ffn_dim\": FFN_LARGE,\n", - " \"prune_at_step\": DYNAMIC_AT_STEP,\n", - " \"prune_fraction\": 0.5,\n", - " \"regrow_method\": \"rigl\",\n", - " \"grow_at_step\": None,\n", - " \"grow_ffn_target\": None,\n", - " },\n", - " {\n", - " \"name\": \"grown\",\n", - " \"ffn_dim\": FFN_SMALL,\n", - " \"prune_at_step\": None,\n", - " \"prune_fraction\": 0.0,\n", - " \"regrow_method\": None,\n", - " \"grow_at_step\": DYNAMIC_AT_STEP,\n", - " \"grow_ffn_target\": FFN_LARGE,\n", - " },\n", - "]\n", - "print(\"\\nScale-up config:\")\n", - "print(\n", - " f\" hidden={HIDDEN_DIM}, n_heads={N_HEADS}, n_layers={N_LAYERS}, ffn(L)={FFN_LARGE}, group={GROUP_SIZE}\"\n", - ")\n", - "print(\n", - " f\" max_steps={MAX_STEPS}, dynamic_at={DYNAMIC_AT_STEP}, dst_period={DST_PERIOD}, swap={DST_SWAP_FRACTION}\"\n", - ")" - ] + "source": "text = load_tinyshakespeare_text()\ntokenizer = CharTokenizer(text)\ndataset = TinyShakespeareDataset(text, tokenizer)\nvocab_size = tokenizer.vocab_size\nprint(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n\n# scale-up — Phase 16 대비 hidden 2x, layers 1.5x, ffn 2x, steps 3.3x\nHIDDEN_DIM = 256\nN_HEADS = 8 # head_dim = 32 (256/8)\nN_LAYERS = 6\nGROUP_SIZE = 16\nBLOCK_SIZE = 64\nBATCH_SIZE = 32\nLR = 3e-4\nMAX_STEPS = 5000\nDYNAMIC_AT_STEP = MAX_STEPS // 2 # 2500 — prune/grow/DST 시작 시점\nDST_PERIOD = 200 # Phase 16a 의 50 보다 4x 보수적 (16a 의 swap-cost-too-high 문제 완화 시도)\nDST_SWAP_FRACTION = 0.05 # Phase 16a 의 0.1 의 절반 (덜 공격적)\n# 빠른 테스트 (MAX_STEPS<500) 대응: max(1, ...) 로 음수 방지 (gemini #3314998767)\nDST_END_STEP = max(1, MAX_STEPS - 500) # 마지막 500 step stabilize\nSEEDS = [42, 123]\nARCH = \"hybrid_around_one_around_one\"\nFFN_SMALL = 256\nFFN_LARGE = 512\n\n# 4 mode 정의\nMODES = [\n {\n \"name\": \"dense_large\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": None,\n \"prune_fraction\": 0.0,\n \"regrow_method\": None,\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"static_prune_50\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": DYNAMIC_AT_STEP,\n \"prune_fraction\": 0.5,\n \"regrow_method\": None,\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"DST_RigL_50\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": DYNAMIC_AT_STEP,\n \"prune_fraction\": 0.5,\n \"regrow_method\": \"rigl\",\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"grown\",\n \"ffn_dim\": FFN_SMALL,\n \"prune_at_step\": None,\n \"prune_fraction\": 0.0,\n \"regrow_method\": None,\n \"grow_at_step\": DYNAMIC_AT_STEP,\n \"grow_ffn_target\": FFN_LARGE,\n },\n]\nprint(\"\\nScale-up config:\")\nprint(\n f\" hidden={HIDDEN_DIM}, n_heads={N_HEADS}, n_layers={N_LAYERS}, ffn(L)={FFN_LARGE}, group={GROUP_SIZE}\"\n)\nprint(\n f\" max_steps={MAX_STEPS}, dynamic_at={DYNAMIC_AT_STEP}, dst_period={DST_PERIOD}, swap={DST_SWAP_FRACTION}\"\n)" }, { "cell_type": "markdown", @@ -236,80 +165,7 @@ "id": "8", "metadata": {}, "outputs": [], - "source": [ - "print(\n", - " f\"{'mode':>16s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n", - " f\"{'params':>10s} {'sparsity':>10s}\"\n", - ")\n", - "print(\"-\" * 75)\n", - "for (name, seed), out in results.items():\n", - " fl = out[\"final_loss\"]\n", - " print(\n", - " f\"{name:>16s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n", - " f\"{out['final_param_count']:>10,} {out['final_sparsity']:>10.3f}\"\n", - " )\n", - "\n", - "# mode 별 평균\n", - "print(\"\\n== Mode summary (mean ± σ across seeds) ==\")\n", - "summary = {}\n", - "for mode in MODES:\n", - " name = mode[\"name\"]\n", - " vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n", - " params = [results[(name, s)][\"final_param_count\"] for s in SEEDS]\n", - " sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n", - " m = statistics.mean(vals)\n", - " sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n", - " summary[name] = (m, sd, statistics.mean(params), statistics.mean(sparsities))\n", - " print(\n", - " f\" {name:>16s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n", - " f\"params={statistics.mean(params):,.0f} sparsity={statistics.mean(sparsities):.3f}\"\n", - " )\n", - "\n", - "# 자동 verdict\n", - "print(\"\\n== Verdict ==\")\n", - "dense_loss = summary[\"dense_large\"][0]\n", - "static_loss = summary[\"static_prune_50\"][0]\n", - "rigl_loss = summary[\"DST_RigL_50\"][0]\n", - "grown_loss = summary[\"grown\"][0]\n", - "\n", - "# 1. all-finite\n", - "all_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\n", - "verdict_1 = \"PASS\" if all_finite else \"FAIL\"\n", - "print(f\"1. all-finite: {all_finite} [{verdict_1}]\")\n", - "\n", - "# 2. Phase 16a 가설 재검증 — DST_RigL ≤ static_prune\n", - "diff_rigl_static = rigl_loss - static_loss\n", - "verdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\n", - "print(f\"2. DST_RigL ≤ static + 0.02 (16a 재검증): diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\n", - "if diff_rigl_static < 0:\n", - " print(\" → DST advantage 발현! Phase 16a 의 scale-limit 가설 입증.\")\n", - "elif diff_rigl_static < 0.005:\n", - " print(\" → DST 가 static 근방까지 도달 — 부분 advantage.\")\n", - "else:\n", - " print(\" → DST 여전히 static 보다 약간 열위 — 추가 scale-up 필요.\")\n", - "\n", - "# 3. Phase 16b 가설 재검증 — grown ≤ dense_large + 0.02\n", - "diff_grown_dense = grown_loss - dense_loss\n", - "verdict_3 = \"PASS\" if diff_grown_dense <= 0.02 else \"FAIL\"\n", - "print(f\"3. grown ≤ dense_large + 0.02 (16b 재검증): diff = {diff_grown_dense:+.4f} [{verdict_3}]\")\n", - "if diff_grown_dense < 0.01:\n", - " print(\" → grown 이 dense_large 근방 — 0-init activation 충분.\")\n", - "else:\n", - " print(\" → grown 과 dense 격차 여전 — post-grow 학습 시간 더 필요할 수 있음.\")\n", - "\n", - "# 4. plateau 도달 확인 — 마지막 500 step 의 loss 변동 < threshold\n", - "print(\"\\n plateau 분석 (마지막 500 step rolling mean 변동):\")\n", - "for name in [m[\"name\"] for m in MODES]:\n", - " for seed in SEEDS:\n", - " losses = results[(name, seed)][\"losses\"]\n", - " last_500 = losses[-500:]\n", - " first_half = sum(last_500[:250]) / 250\n", - " second_half = sum(last_500[250:]) / 250\n", - " plateau_drift = second_half - first_half\n", - " print(\n", - " f\" {name:>16s} seed={seed}: drift = {plateau_drift:+.4f} (< -0.01 = still learning)\"\n", - " )" - ] + "source": "print(\n f\"{'mode':>16s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n f\"{'params':>10s} {'sparsity':>10s}\"\n)\nprint(\"-\" * 75)\nfor (name, seed), out in results.items():\n fl = out[\"final_loss\"]\n print(\n f\"{name:>16s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n f\"{out['final_param_count']:>10,} {out['final_sparsity']:>10.3f}\"\n )\n\n# mode 별 평균\nprint(\"\\n== Mode summary (mean ± σ across seeds) ==\")\nsummary = {}\nfor mode in MODES:\n name = mode[\"name\"]\n vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n params = [results[(name, s)][\"final_param_count\"] for s in SEEDS]\n sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n m = statistics.mean(vals)\n sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n summary[name] = (m, sd, statistics.mean(params), statistics.mean(sparsities))\n print(\n f\" {name:>16s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n f\"params={statistics.mean(params):,.0f} sparsity={statistics.mean(sparsities):.3f}\"\n )\n\n# 자동 verdict\nprint(\"\\n== Verdict ==\")\ndense_loss = summary[\"dense_large\"][0]\nstatic_loss = summary[\"static_prune_50\"][0]\nrigl_loss = summary[\"DST_RigL_50\"][0]\ngrown_loss = summary[\"grown\"][0]\n\n# 1. all-finite\nall_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\nverdict_1 = \"PASS\" if all_finite else \"FAIL\"\nprint(f\"1. all-finite: {all_finite} [{verdict_1}]\")\n\n# 2. Phase 16a 가설 재검증 — DST_RigL ≤ static_prune\ndiff_rigl_static = rigl_loss - static_loss\nverdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\nprint(f\"2. DST_RigL ≤ static + 0.02 (16a 재검증): diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\nif diff_rigl_static < 0:\n print(\" → DST advantage 발현! Phase 16a 의 scale-limit 가설 입증.\")\nelif diff_rigl_static < 0.005:\n print(\" → DST 가 static 근방까지 도달 — 부분 advantage.\")\nelse:\n print(\" → DST 여전히 static 보다 약간 열위 — 추가 scale-up 필요.\")\n\n# 3. Phase 16b 가설 재검증 — grown ≤ dense_large + 0.02\ndiff_grown_dense = grown_loss - dense_loss\nverdict_3 = \"PASS\" if diff_grown_dense <= 0.02 else \"FAIL\"\nprint(f\"3. grown ≤ dense_large + 0.02 (16b 재검증): diff = {diff_grown_dense:+.4f} [{verdict_3}]\")\nif diff_grown_dense < 0.01:\n print(\" → grown 이 dense_large 근방 — 0-init activation 충분.\")\nelse:\n print(\" → grown 과 dense 격차 여전 — post-grow 학습 시간 더 필요할 수 있음.\")\n\n# 4. plateau 도달 확인 — 마지막 500 step 의 loss 변동 < threshold\n# 짧은 학습 (MAX_STEPS<500) 대응: 동적 half 분할 (gemini #3314998775)\nprint(\"\\n plateau 분석 (마지막 500 step rolling mean 변동):\")\nfor name in [m[\"name\"] for m in MODES]:\n for seed in SEEDS:\n losses = results[(name, seed)][\"losses\"]\n last_500 = losses[-500:]\n half_len = len(last_500) // 2\n if half_len > 0:\n first_half = sum(last_500[:half_len]) / half_len\n second_half = sum(last_500[half_len:]) / (len(last_500) - half_len)\n plateau_drift = second_half - first_half\n else:\n plateau_drift = 0.0\n print(\n f\" {name:>16s} seed={seed}: drift = {plateau_drift:+.4f} (< -0.01 = still learning)\"\n )" }, { "cell_type": "markdown", @@ -325,59 +181,7 @@ "id": "10", "metadata": {}, "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\n", - "colors = {\n", - " \"dense_large\": \"tab:green\",\n", - " \"static_prune_50\": \"tab:red\",\n", - " \"DST_RigL_50\": \"tab:blue\",\n", - " \"grown\": \"tab:orange\",\n", - "}\n", - "window = 100 # scale-up 이라 더 긴 rolling window\n", - "\n", - "for mode in MODES:\n", - " name = mode[\"name\"]\n", - " losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n", - " smoothed = []\n", - " for losses in losses_per_seed:\n", - " smoothed.append(\n", - " [\n", - " sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n", - " for i in range(len(losses))\n", - " ]\n", - " )\n", - " arr = torch.tensor(smoothed)\n", - " mean = arr.mean(dim=0)\n", - " std = arr.std(dim=0)\n", - " steps = list(range(len(mean)))\n", - " ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n", - " ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n", - "\n", - "# dynamic step + DST end 수직선\n", - "ax.axvline(\n", - " DYNAMIC_AT_STEP,\n", - " color=\"black\",\n", - " linestyle=\":\",\n", - " alpha=0.5,\n", - " label=f\"prune/grow @ {DYNAMIC_AT_STEP}\",\n", - ")\n", - "ax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.4, label=f\"DST end @ {DST_END_STEP}\")\n", - "\n", - "ax.set_xlabel(\"step\")\n", - "ax.set_ylabel(f\"loss (rolling mean w={window})\")\n", - "ax.set_title(\n", - " \"Phase 17 scale-up (hidden=256, n_layers=6, ffn(L)=512, steps=5000) — 4 mode (mean ± σ over 2 seeds)\"\n", - ")\n", - "ax.legend(loc=\"upper right\")\n", - "ax.grid(alpha=0.3)\n", - "plt.tight_layout()\n", - "\n", - "out_dir = Path(\"../../runs/notebook-neuron-phase17\")\n", - "out_dir.mkdir(parents=True, exist_ok=True)\n", - "fig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\n", - "plt.show()\n", - "print(f\"saved: {out_dir / 'loss_curves.png'}\")" - ] + "source": "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\ncolors = {\n \"dense_large\": \"tab:green\",\n \"static_prune_50\": \"tab:red\",\n \"DST_RigL_50\": \"tab:blue\",\n \"grown\": \"tab:orange\",\n}\nwindow = 100 # scale-up 이라 더 긴 rolling window\n\nfor mode in MODES:\n name = mode[\"name\"]\n losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n smoothed = []\n for losses in losses_per_seed:\n smoothed.append(\n [\n sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n for i in range(len(losses))\n ]\n )\n arr = torch.tensor(smoothed)\n mean = arr.mean(dim=0)\n # single seed 시 std=NaN 회피 (gemini #3314998777)\n std = arr.std(dim=0) if arr.size(0) > 1 else torch.zeros_like(mean)\n steps = list(range(len(mean)))\n ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n\n# dynamic step + DST end 수직선\nax.axvline(\n DYNAMIC_AT_STEP,\n color=\"black\",\n linestyle=\":\",\n alpha=0.5,\n label=f\"prune/grow @ {DYNAMIC_AT_STEP}\",\n)\nax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.4, label=f\"DST end @ {DST_END_STEP}\")\n\nax.set_xlabel(\"step\")\nax.set_ylabel(f\"loss (rolling mean w={window})\")\nax.set_title(\n \"Phase 17 scale-up (hidden=256, n_layers=6, ffn(L)=512, steps=5000) — 4 mode (mean ± σ over 2 seeds)\"\n)\nax.legend(loc=\"upper right\")\nax.grid(alpha=0.3)\nplt.tight_layout()\n\nout_dir = Path(\"../../runs/notebook-neuron-phase17\")\nout_dir.mkdir(parents=True, exist_ok=True)\nfig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\nplt.show()\nprint(f\"saved: {out_dir / 'loss_curves.png'}\")" }, { "cell_type": "markdown", @@ -488,4 +292,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file From 43a0a18e985552185e9eb17fd5349acc3f52a911 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Thu, 28 May 2026 18:18:58 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[FIX]:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81,=20scale=20vs=20hp=20confound=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20+=20Phase=2016=20source=20=EB=AA=85=EC=8B=9C=202?= =?UTF-8?q?=EA=B1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Copilot #3315013786 (Major scientific): Phase 17 의 DST_RigL 가 period/swap 도 함께 변경 → scale 효과와 hp 효과 confounded → DST_RigL_p16hp (Phase 16a 와 동일 hp, period=50/swap=0.1) 를 control 로 추가. 5 mode × 2 seed = 10 run. - p16hp 가 순수 scale 효과 측정 (Phase 16a 와 직접 비교 가능) - p17hp 는 hp ablation 참고 - cell 0 markdown 에 confound 명시 + 분리 설계 설명 - verdict 2 (DST advantage) 는 이제 p16hp 기준 — 순수 scale 효과 - verdict 2b 추가: p17hp - p16hp = hp 효과 측정 - Copilot #3315013726 (hardcoded baseline): cell 12 의 Phase 16 수치 출처 명확화 → Notion page URL 주석 추가 (16a / 16b 각각) + config 명시 + 향후 CSV 자동 로드 검토 노트 - CodeRabbit #3315689817 (ack): 내 reply 에 동의 + learning 추가, 코드 변경 없음 - Phase 16 baseline 막대그래프는 p16hp 만 비교 (같은 hp, scale 만 다름 → 순수 scale 효과 시각화) --- .../17-phase17-scale-up.ipynb | 314 ++++++++++++++---- 1 file changed, 258 insertions(+), 56 deletions(-) diff --git a/notebooks/02-function-level/17-phase17-scale-up.ipynb b/notebooks/02-function-level/17-phase17-scale-up.ipynb index 2a6873e..001ae3c 100644 --- a/notebooks/02-function-level/17-phase17-scale-up.ipynb +++ b/notebooks/02-function-level/17-phase17-scale-up.ipynb @@ -4,41 +4,7 @@ "cell_type": "markdown", "id": "0", "metadata": {}, - "source": [ - "# 17-phase17-scale-up\n", - "\n", - "**neuron Phase 17** — paradigm 의 dynamic method (DST, Net2Net grow) 의 **advantage 가 scale-up 으로 발현되는지** 검증.\n", - "\n", - "**배경**: Phase 16a/16b 둘 다 framework 검증은 PASS 했으나 *expected performance benefit 미실현*. Phase 16b Notion 분석에서 원인을 *본 setup (~1M params, 1500 step) 의 scale 한계* 로 결론. RigL/Net2Net 의 reference paper 들이 large-scale 에서만 advantage 발현하는 알려진 패턴.\n", - "\n", - "**핵심 가설** (scale-up 효과):\n", - "1. **DST_RigL ≤ static_prune (16a 의 advantage 발현)** — 더 긴 학습으로 swap cost 가 amortized?\n", - "2. **grown ≈ large_baseline (16b 의 gap 축소)** — 더 긴 post-grow 학습으로 새 capacity 활성화?\n", - "3. **scale 자체의 효과** — 큰 모델 + 긴 학습 시 paradigm 의 dynamic 의미 증가?\n", - "4. **all-finite + smooth convergence** — 확대된 setup 에서도 안정성?\n", - "\n", - "설계: 4 mode × 2 seed = 8 run at **scale-up config**.\n", - "\n", - "| 항목 | Phase 16 | Phase 17 (scale-up) | 배수 |\n", - "|---|---|---|---|\n", - "| hidden_dim | 128 | **256** | 2x |\n", - "| n_layers | 4 | **6** | 1.5x |\n", - "| ffn_dim (large) | 256 | **512** | 2x |\n", - "| max_steps | 1500 | **5000** | 3.3x |\n", - "| approx params | ~1M | **~5M** | ~5x |\n", - "\n", - "4 mode:\n", - "- `dense_large`: 큰 모델 baseline (target reference)\n", - "- `static_prune_50`: dense 학습 후 step 2500 에서 50% prune (Phase 15 at scale)\n", - "- `DST_RigL_50`: static 과 동일 + step 2500 후 period=200 마다 RigL DST swap (Phase 16a at scale)\n", - "- `grown`: ffn=256 시작 → step 2500 에서 512 로 grow (Phase 16b at scale)\n", - "\n", - "arch 고정: `hybrid_around_one_around_one` + `use_full_graph=True`\n", - "데이터: TinyShakespeare (char-LM, block_size=64 유지)\n", - "시드: [42, 123]\n", - "작성일: 2026-05-28\n", - "연관: Issue [#80](https://github.com/EinSofINTEREST/GraphLM/issues/80) / Phase 16 메인 [#75](https://github.com/EinSofINTEREST/GraphLM/issues/75)" - ] + "source": "# 17-phase17-scale-up\n\n**neuron Phase 17** — paradigm 의 dynamic method (DST, Net2Net grow) 의 **advantage 가 scale-up 으로 발현되는지** 검증.\n\n**배경**: Phase 16a/16b 둘 다 framework 검증은 PASS 했으나 *expected performance benefit 미실현*. Phase 16b Notion 분석에서 원인을 *본 setup (~1M params, 1500 step) 의 scale 한계* 로 결론. RigL/Net2Net 의 reference paper 들이 large-scale 에서만 advantage 발현하는 알려진 패턴.\n\n**핵심 가설** (scale-up 효과):\n1. **DST_RigL ≤ static_prune (16a 의 advantage 발현)** — 더 긴 학습으로 swap cost 가 amortized?\n2. **grown ≈ large_baseline (16b 의 gap 축소)** — 더 긴 post-grow 학습으로 새 capacity 활성화?\n3. **scale 자체의 효과 분리** — control mode 로 hyperparameter 와 scale 효과 분리 (Copilot #3315013786 반영)\n4. **all-finite + smooth convergence** — 확대된 setup 에서도 안정성?\n\n설계: 5 mode × 2 seed = 10 run at **scale-up config**.\n\n| 항목 | Phase 16 | Phase 17 (scale-up) | 배수 |\n|---|---|---|---|\n| hidden_dim | 128 | **256** | 2x |\n| n_layers | 4 | **6** | 1.5x |\n| ffn_dim (large) | 256 | **512** | 2x |\n| max_steps | 1500 | **5000** | 3.3x |\n| approx params | ~1M | **~5M** | ~5x |\n\n5 mode:\n- `dense_large`: 큰 모델 baseline (target reference)\n- `static_prune_50`: dense 학습 후 step 2500 에서 50% prune (Phase 15 at scale)\n- `DST_RigL_p16hp`: **Phase 16a 동일 hyperparameter** (period=50, swap=10%) at Phase 17 scale → **scale 효과 only 분리**\n- `DST_RigL_p17hp`: Phase 17 의 보수적 hyperparameter (period=200, swap=5%) at Phase 17 scale → **scale + hp 동시 효과**\n- `grown`: ffn=256 시작 → step 2500 에서 512 로 grow (Phase 16b at scale)\n\n**Confound 명시 (Copilot #3315013786)**: `DST_RigL_p17hp` 만 보면 *scale 변화* 와 *hyperparameter 변화* 가 confounded. 두 효과 분리를 위해 `DST_RigL_p16hp` (Phase 16a 와 동일 hp) 를 control 로 추가 → Phase 16a 결과와 직접 비교 시 *순수 scale 효과* 측정 가능.\n\narch 고정: `hybrid_around_one_around_one` + `use_full_graph=True`\n데이터: TinyShakespeare (char-LM, block_size=64 유지)\n시드: [42, 123]\n작성일: 2026-05-28\n연관: Issue [#80](https://github.com/EinSofINTEREST/GraphLM/issues/80) / Phase 16 메인 [#75](https://github.com/EinSofINTEREST/GraphLM/issues/75)" }, { "cell_type": "markdown", @@ -94,15 +60,108 @@ "id": "4", "metadata": {}, "outputs": [], - "source": "text = load_tinyshakespeare_text()\ntokenizer = CharTokenizer(text)\ndataset = TinyShakespeareDataset(text, tokenizer)\nvocab_size = tokenizer.vocab_size\nprint(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n\n# scale-up — Phase 16 대비 hidden 2x, layers 1.5x, ffn 2x, steps 3.3x\nHIDDEN_DIM = 256\nN_HEADS = 8 # head_dim = 32 (256/8)\nN_LAYERS = 6\nGROUP_SIZE = 16\nBLOCK_SIZE = 64\nBATCH_SIZE = 32\nLR = 3e-4\nMAX_STEPS = 5000\nDYNAMIC_AT_STEP = MAX_STEPS // 2 # 2500 — prune/grow/DST 시작 시점\nDST_PERIOD = 200 # Phase 16a 의 50 보다 4x 보수적 (16a 의 swap-cost-too-high 문제 완화 시도)\nDST_SWAP_FRACTION = 0.05 # Phase 16a 의 0.1 의 절반 (덜 공격적)\n# 빠른 테스트 (MAX_STEPS<500) 대응: max(1, ...) 로 음수 방지 (gemini #3314998767)\nDST_END_STEP = max(1, MAX_STEPS - 500) # 마지막 500 step stabilize\nSEEDS = [42, 123]\nARCH = \"hybrid_around_one_around_one\"\nFFN_SMALL = 256\nFFN_LARGE = 512\n\n# 4 mode 정의\nMODES = [\n {\n \"name\": \"dense_large\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": None,\n \"prune_fraction\": 0.0,\n \"regrow_method\": None,\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"static_prune_50\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": DYNAMIC_AT_STEP,\n \"prune_fraction\": 0.5,\n \"regrow_method\": None,\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"DST_RigL_50\",\n \"ffn_dim\": FFN_LARGE,\n \"prune_at_step\": DYNAMIC_AT_STEP,\n \"prune_fraction\": 0.5,\n \"regrow_method\": \"rigl\",\n \"grow_at_step\": None,\n \"grow_ffn_target\": None,\n },\n {\n \"name\": \"grown\",\n \"ffn_dim\": FFN_SMALL,\n \"prune_at_step\": None,\n \"prune_fraction\": 0.0,\n \"regrow_method\": None,\n \"grow_at_step\": DYNAMIC_AT_STEP,\n \"grow_ffn_target\": FFN_LARGE,\n },\n]\nprint(\"\\nScale-up config:\")\nprint(\n f\" hidden={HIDDEN_DIM}, n_heads={N_HEADS}, n_layers={N_LAYERS}, ffn(L)={FFN_LARGE}, group={GROUP_SIZE}\"\n)\nprint(\n f\" max_steps={MAX_STEPS}, dynamic_at={DYNAMIC_AT_STEP}, dst_period={DST_PERIOD}, swap={DST_SWAP_FRACTION}\"\n)" + "source": [ + "text = load_tinyshakespeare_text()\n", + "tokenizer = CharTokenizer(text)\n", + "dataset = TinyShakespeareDataset(text, tokenizer)\n", + "vocab_size = tokenizer.vocab_size\n", + "print(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n", + "\n", + "# scale-up — Phase 16 대비 hidden 2x, layers 1.5x, ffn 2x, steps 3.3x\n", + "HIDDEN_DIM = 256\n", + "N_HEADS = 8 # head_dim = 32 (256/8)\n", + "N_LAYERS = 6\n", + "GROUP_SIZE = 16\n", + "BLOCK_SIZE = 64\n", + "BATCH_SIZE = 32\n", + "LR = 3e-4\n", + "MAX_STEPS = 5000\n", + "DYNAMIC_AT_STEP = MAX_STEPS // 2 # 2500 — prune/grow/DST 시작 시점\n", + "# Phase 16a hyperparameter (control — scale 효과 only 분리)\n", + "DST_PERIOD_P16 = 50\n", + "DST_SWAP_FRACTION_P16 = 0.1\n", + "# Phase 17 hyperparameter (보수적 — 추가로 swap-cost 완화 시도)\n", + "DST_PERIOD_P17 = 200\n", + "DST_SWAP_FRACTION_P17 = 0.05\n", + "# 빠른 테스트 (MAX_STEPS<500) 대응: max(1, ...) 로 음수 방지 (gemini #3314998767)\n", + "DST_END_STEP = max(1, MAX_STEPS - 500) # 마지막 500 step stabilize\n", + "SEEDS = [42, 123]\n", + "ARCH = \"hybrid_around_one_around_one\"\n", + "FFN_SMALL = 256\n", + "FFN_LARGE = 512\n", + "\n", + "# 5 mode 정의 — Copilot #3315013786 confound 분리 위해 DST 두 hp variant 모두 포함\n", + "MODES = [\n", + " {\n", + " \"name\": \"dense_large\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": None,\n", + " \"prune_fraction\": 0.0,\n", + " \"regrow_method\": None,\n", + " \"dst_period\": None,\n", + " \"dst_swap_fraction\": 0.0,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"static_prune_50\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": DYNAMIC_AT_STEP,\n", + " \"prune_fraction\": 0.5,\n", + " \"regrow_method\": None,\n", + " \"dst_period\": None,\n", + " \"dst_swap_fraction\": 0.0,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"DST_RigL_p16hp\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": DYNAMIC_AT_STEP,\n", + " \"prune_fraction\": 0.5,\n", + " \"regrow_method\": \"rigl\",\n", + " \"dst_period\": DST_PERIOD_P16, # Phase 16a 와 동일\n", + " \"dst_swap_fraction\": DST_SWAP_FRACTION_P16,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"DST_RigL_p17hp\",\n", + " \"ffn_dim\": FFN_LARGE,\n", + " \"prune_at_step\": DYNAMIC_AT_STEP,\n", + " \"prune_fraction\": 0.5,\n", + " \"regrow_method\": \"rigl\",\n", + " \"dst_period\": DST_PERIOD_P17, # Phase 17 보수적\n", + " \"dst_swap_fraction\": DST_SWAP_FRACTION_P17,\n", + " \"grow_at_step\": None,\n", + " \"grow_ffn_target\": None,\n", + " },\n", + " {\n", + " \"name\": \"grown\",\n", + " \"ffn_dim\": FFN_SMALL,\n", + " \"prune_at_step\": None,\n", + " \"prune_fraction\": 0.0,\n", + " \"regrow_method\": None,\n", + " \"dst_period\": None,\n", + " \"dst_swap_fraction\": 0.0,\n", + " \"grow_at_step\": DYNAMIC_AT_STEP,\n", + " \"grow_ffn_target\": FFN_LARGE,\n", + " },\n", + "]\n", + "print(\"\\nScale-up config:\")\n", + "print(\n", + " f\" hidden={HIDDEN_DIM}, n_heads={N_HEADS}, n_layers={N_LAYERS}, ffn(L)={FFN_LARGE}, group={GROUP_SIZE}\"\n", + ")\n", + "print(f\" max_steps={MAX_STEPS}, dynamic_at={DYNAMIC_AT_STEP}\")\n", + "print(f\" DST p16hp: period={DST_PERIOD_P16}, swap={DST_SWAP_FRACTION_P16} (Phase 16a 동일)\")\n", + "print(f\" DST p17hp: period={DST_PERIOD_P17}, swap={DST_SWAP_FRACTION_P17} (보수적)\")" + ] }, { "cell_type": "markdown", "id": "5", "metadata": {}, - "source": [ - "## 2. Sweep 실행 (4 mode × 2 seed = 8 run, GPU 권장)" - ] + "source": "## 2. Sweep 실행 (5 mode × 2 seed = 10 run, GPU 권장)" }, { "cell_type": "code", @@ -133,8 +192,8 @@ " prune_at_step=mode[\"prune_at_step\"],\n", " prune_fraction=mode[\"prune_fraction\"],\n", " regrow_method=mode[\"regrow_method\"],\n", - " dst_period=DST_PERIOD if mode[\"regrow_method\"] else None,\n", - " dst_swap_fraction=DST_SWAP_FRACTION,\n", + " dst_period=mode[\"dst_period\"],\n", + " dst_swap_fraction=mode[\"dst_swap_fraction\"],\n", " dst_end_step=DST_END_STEP if mode[\"regrow_method\"] else None,\n", " grow_at_step=mode[\"grow_at_step\"],\n", " grow_ffn_target=mode[\"grow_ffn_target\"],\n", @@ -165,7 +224,92 @@ "id": "8", "metadata": {}, "outputs": [], - "source": "print(\n f\"{'mode':>16s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n f\"{'params':>10s} {'sparsity':>10s}\"\n)\nprint(\"-\" * 75)\nfor (name, seed), out in results.items():\n fl = out[\"final_loss\"]\n print(\n f\"{name:>16s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n f\"{out['final_param_count']:>10,} {out['final_sparsity']:>10.3f}\"\n )\n\n# mode 별 평균\nprint(\"\\n== Mode summary (mean ± σ across seeds) ==\")\nsummary = {}\nfor mode in MODES:\n name = mode[\"name\"]\n vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n params = [results[(name, s)][\"final_param_count\"] for s in SEEDS]\n sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n m = statistics.mean(vals)\n sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n summary[name] = (m, sd, statistics.mean(params), statistics.mean(sparsities))\n print(\n f\" {name:>16s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n f\"params={statistics.mean(params):,.0f} sparsity={statistics.mean(sparsities):.3f}\"\n )\n\n# 자동 verdict\nprint(\"\\n== Verdict ==\")\ndense_loss = summary[\"dense_large\"][0]\nstatic_loss = summary[\"static_prune_50\"][0]\nrigl_loss = summary[\"DST_RigL_50\"][0]\ngrown_loss = summary[\"grown\"][0]\n\n# 1. all-finite\nall_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\nverdict_1 = \"PASS\" if all_finite else \"FAIL\"\nprint(f\"1. all-finite: {all_finite} [{verdict_1}]\")\n\n# 2. Phase 16a 가설 재검증 — DST_RigL ≤ static_prune\ndiff_rigl_static = rigl_loss - static_loss\nverdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\nprint(f\"2. DST_RigL ≤ static + 0.02 (16a 재검증): diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\nif diff_rigl_static < 0:\n print(\" → DST advantage 발현! Phase 16a 의 scale-limit 가설 입증.\")\nelif diff_rigl_static < 0.005:\n print(\" → DST 가 static 근방까지 도달 — 부분 advantage.\")\nelse:\n print(\" → DST 여전히 static 보다 약간 열위 — 추가 scale-up 필요.\")\n\n# 3. Phase 16b 가설 재검증 — grown ≤ dense_large + 0.02\ndiff_grown_dense = grown_loss - dense_loss\nverdict_3 = \"PASS\" if diff_grown_dense <= 0.02 else \"FAIL\"\nprint(f\"3. grown ≤ dense_large + 0.02 (16b 재검증): diff = {diff_grown_dense:+.4f} [{verdict_3}]\")\nif diff_grown_dense < 0.01:\n print(\" → grown 이 dense_large 근방 — 0-init activation 충분.\")\nelse:\n print(\" → grown 과 dense 격차 여전 — post-grow 학습 시간 더 필요할 수 있음.\")\n\n# 4. plateau 도달 확인 — 마지막 500 step 의 loss 변동 < threshold\n# 짧은 학습 (MAX_STEPS<500) 대응: 동적 half 분할 (gemini #3314998775)\nprint(\"\\n plateau 분석 (마지막 500 step rolling mean 변동):\")\nfor name in [m[\"name\"] for m in MODES]:\n for seed in SEEDS:\n losses = results[(name, seed)][\"losses\"]\n last_500 = losses[-500:]\n half_len = len(last_500) // 2\n if half_len > 0:\n first_half = sum(last_500[:half_len]) / half_len\n second_half = sum(last_500[half_len:]) / (len(last_500) - half_len)\n plateau_drift = second_half - first_half\n else:\n plateau_drift = 0.0\n print(\n f\" {name:>16s} seed={seed}: drift = {plateau_drift:+.4f} (< -0.01 = still learning)\"\n )" + "source": [ + "print(\n", + " f\"{'mode':>16s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n", + " f\"{'params':>10s} {'sparsity':>10s}\"\n", + ")\n", + "print(\"-\" * 75)\n", + "for (name, seed), out in results.items():\n", + " fl = out[\"final_loss\"]\n", + " print(\n", + " f\"{name:>16s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n", + " f\"{out['final_param_count']:>10,} {out['final_sparsity']:>10.3f}\"\n", + " )\n", + "\n", + "# mode 별 평균\n", + "print(\"\\n== Mode summary (mean ± σ across seeds) ==\")\n", + "summary = {}\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n", + " params = [results[(name, s)][\"final_param_count\"] for s in SEEDS]\n", + " sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n", + " m = statistics.mean(vals)\n", + " sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n", + " summary[name] = (m, sd, statistics.mean(params), statistics.mean(sparsities))\n", + " print(\n", + " f\" {name:>16s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n", + " f\"params={statistics.mean(params):,.0f} sparsity={statistics.mean(sparsities):.3f}\"\n", + " )\n", + "\n", + "# 자동 verdict\n", + "print(\"\\n== Verdict ==\")\n", + "dense_loss = summary[\"dense_large\"][0]\n", + "static_loss = summary[\"static_prune_50\"][0]\n", + "rigl_p16_loss = summary[\"DST_RigL_p16hp\"][0]\n", + "rigl_p17_loss = summary[\"DST_RigL_p17hp\"][0]\n", + "grown_loss = summary[\"grown\"][0]\n", + "\n", + "# 1. all-finite\n", + "all_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\n", + "verdict_1 = \"PASS\" if all_finite else \"FAIL\"\n", + "print(f\"1. all-finite: {all_finite} [{verdict_1}]\")\n", + "\n", + "# 2. Phase 16a 가설 — 순수 scale 효과 (p16hp control) 로 검증\n", + "diff_rigl_static = rigl_p16_loss - static_loss\n", + "verdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\n", + "print(\n", + " f\"2. DST_RigL_p16hp ≤ static + 0.02 (순수 scale 효과): diff = {diff_rigl_static:+.4f} [{verdict_2}]\"\n", + ")\n", + "if diff_rigl_static < 0:\n", + " print(\" → DST advantage 발현! Phase 16a 의 scale-limit 가설 입증 (순수 scale 효과).\")\n", + "elif diff_rigl_static < 0.005:\n", + " print(\" → DST 가 static 근방까지 도달 — 부분 advantage.\")\n", + "else:\n", + " print(\" → DST 여전히 static 보다 약간 열위 — 추가 scale-up 필요.\")\n", + "\n", + "# 2b. hyperparameter 효과 — p17hp vs p16hp (같은 scale 에서 hp 만 다름)\n", + "diff_hp = rigl_p17_loss - rigl_p16_loss\n", + "print(f\" 2b. hp 효과: p17hp - p16hp = {diff_hp:+.4f} (음수면 보수적 hp 가 도움)\")\n", + "\n", + "# 3. Phase 16b 가설 재검증 — grown ≤ dense_large + 0.02\n", + "diff_grown_dense = grown_loss - dense_loss\n", + "verdict_3 = \"PASS\" if diff_grown_dense <= 0.02 else \"FAIL\"\n", + "print(f\"3. grown ≤ dense_large + 0.02 (16b 재검증): diff = {diff_grown_dense:+.4f} [{verdict_3}]\")\n", + "if diff_grown_dense < 0.01:\n", + " print(\" → grown 이 dense_large 근방 — 0-init activation 충분.\")\n", + "else:\n", + " print(\" → grown 과 dense 격차 여전 — post-grow 학습 시간 더 필요할 수 있음.\")\n", + "\n", + "# 4. plateau 도달 확인 — 마지막 500 step 의 loss 변동 < threshold\n", + "# 짧은 학습 (MAX_STEPS<500) 대응: 동적 half 분할 (gemini #3314998775)\n", + "print(\"\\n plateau 분석 (마지막 500 step rolling mean 변동):\")\n", + "for name in [m[\"name\"] for m in MODES]:\n", + " for seed in SEEDS:\n", + " losses = results[(name, seed)][\"losses\"]\n", + " last_500 = losses[-500:]\n", + " half_len = len(last_500) // 2\n", + " if half_len > 0:\n", + " first_half = sum(last_500[:half_len]) / half_len\n", + " second_half = sum(last_500[half_len:]) / (len(last_500) - half_len)\n", + " plateau_drift = second_half - first_half\n", + " else:\n", + " plateau_drift = 0.0\n", + " print(\n", + " f\" {name:>16s} seed={seed}: drift = {plateau_drift:+.4f} (< -0.01 = still learning)\"\n", + " )" + ] }, { "cell_type": "markdown", @@ -181,7 +325,61 @@ "id": "10", "metadata": {}, "outputs": [], - "source": "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\ncolors = {\n \"dense_large\": \"tab:green\",\n \"static_prune_50\": \"tab:red\",\n \"DST_RigL_50\": \"tab:blue\",\n \"grown\": \"tab:orange\",\n}\nwindow = 100 # scale-up 이라 더 긴 rolling window\n\nfor mode in MODES:\n name = mode[\"name\"]\n losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n smoothed = []\n for losses in losses_per_seed:\n smoothed.append(\n [\n sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n for i in range(len(losses))\n ]\n )\n arr = torch.tensor(smoothed)\n mean = arr.mean(dim=0)\n # single seed 시 std=NaN 회피 (gemini #3314998777)\n std = arr.std(dim=0) if arr.size(0) > 1 else torch.zeros_like(mean)\n steps = list(range(len(mean)))\n ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n\n# dynamic step + DST end 수직선\nax.axvline(\n DYNAMIC_AT_STEP,\n color=\"black\",\n linestyle=\":\",\n alpha=0.5,\n label=f\"prune/grow @ {DYNAMIC_AT_STEP}\",\n)\nax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.4, label=f\"DST end @ {DST_END_STEP}\")\n\nax.set_xlabel(\"step\")\nax.set_ylabel(f\"loss (rolling mean w={window})\")\nax.set_title(\n \"Phase 17 scale-up (hidden=256, n_layers=6, ffn(L)=512, steps=5000) — 4 mode (mean ± σ over 2 seeds)\"\n)\nax.legend(loc=\"upper right\")\nax.grid(alpha=0.3)\nplt.tight_layout()\n\nout_dir = Path(\"../../runs/notebook-neuron-phase17\")\nout_dir.mkdir(parents=True, exist_ok=True)\nfig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\nplt.show()\nprint(f\"saved: {out_dir / 'loss_curves.png'}\")" + "source": [ + "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\n", + "colors = {\n", + " \"dense_large\": \"tab:green\",\n", + " \"static_prune_50\": \"tab:red\",\n", + " \"DST_RigL_p16hp\": \"tab:purple\",\n", + " \"DST_RigL_p17hp\": \"tab:blue\",\n", + " \"grown\": \"tab:orange\",\n", + "}\n", + "window = 100 # scale-up 이라 더 긴 rolling window\n", + "\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n", + " smoothed = []\n", + " for losses in losses_per_seed:\n", + " smoothed.append(\n", + " [\n", + " sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n", + " for i in range(len(losses))\n", + " ]\n", + " )\n", + " arr = torch.tensor(smoothed)\n", + " mean = arr.mean(dim=0)\n", + " # single seed 시 std=NaN 회피 (gemini #3314998777)\n", + " std = arr.std(dim=0) if arr.size(0) > 1 else torch.zeros_like(mean)\n", + " steps = list(range(len(mean)))\n", + " ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n", + " ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n", + "\n", + "# dynamic step + DST end 수직선\n", + "ax.axvline(\n", + " DYNAMIC_AT_STEP,\n", + " color=\"black\",\n", + " linestyle=\":\",\n", + " alpha=0.5,\n", + " label=f\"prune/grow @ {DYNAMIC_AT_STEP}\",\n", + ")\n", + "ax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.4, label=f\"DST end @ {DST_END_STEP}\")\n", + "\n", + "ax.set_xlabel(\"step\")\n", + "ax.set_ylabel(f\"loss (rolling mean w={window})\")\n", + "ax.set_title(\n", + " \"Phase 17 scale-up (hidden=256, n_layers=6, ffn(L)=512, steps=5000) — 5 mode (mean ± σ over 2 seeds)\"\n", + ")\n", + "ax.legend(loc=\"upper right\")\n", + "ax.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "\n", + "out_dir = Path(\"../../runs/notebook-neuron-phase17\")\n", + "out_dir.mkdir(parents=True, exist_ok=True)\n", + "fig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\n", + "plt.show()\n", + "print(f\"saved: {out_dir / 'loss_curves.png'}\")" + ] }, { "cell_type": "markdown", @@ -198,22 +396,24 @@ "metadata": {}, "outputs": [], "source": [ - "# Phase 16 baseline 수치 (Notion 정리 결과 기준):\n", - "# Phase 16a (hidden=128, n_layers=4, ffn=256, 1500 step):\n", - "# dense: 1.8999, static_50: 1.9777, DST_RigL_50: 1.9831\n", - "# Phase 16b: dense_large (ffn=256): 1.8999, grown (128→256): 1.9428\n", + "# Phase 16 baseline 수치 — Notion 정리 페이지 출처 (Copilot #3315013726 — 향후 CSV 자동 로드 검토)\n", + "# 출처:\n", + "# Phase 16a: https://www.notion.so/36de8b70b7aa819aaa54d561fc222fa1\n", + "# Phase 16b: https://www.notion.so/36ee8b70b7aa811bb354c4fc98a484ed\n", + "# Config: hidden=128, n_layers=4, ffn=256 (16a) / 256↔128→256 (16b), 1500 step, seeds [42, 123]\n", "p16a_baselines = {\n", - " \"dense\": 1.8999,\n", - " \"static_50\": 1.9777,\n", - " \"DST_RigL_50\": 1.9831,\n", + " \"dense\": 1.8999, # Phase 16a dense (ffn=256)\n", + " \"static_50\": 1.9777, # Phase 16a static_50\n", + " \"DST_RigL_50\": 1.9831, # Phase 16a DST_RigL_50 (period=50, swap=0.1) — Phase 17 p16hp 와 직접 비교\n", "}\n", - "p16b_grown = 1.9428\n", + "p16b_grown = 1.9428 # Phase 16b grown (ffn 128 → 256)\n", "\n", "# Phase 17 결과 — summary 에서 추출\n", + "# 비교 mapping: p16 의 DST_RigL_50 ↔ Phase 17 의 DST_RigL_p16hp (같은 hp, scale 만 다름)\n", "p17 = {name: summary[name][0] for name in [m[\"name\"] for m in MODES]}\n", "\n", - "fig, ax = plt.subplots(1, 1, figsize=(10, 5))\n", - "modes_plot = [\"dense\", \"static_prune_50\", \"DST_RigL_50\", \"grown\"]\n", + "fig, ax = plt.subplots(1, 1, figsize=(11, 5))\n", + "modes_plot = [\"dense\", \"static_prune_50\", \"DST_RigL (p16hp control)\", \"grown\"]\n", "x = list(range(len(modes_plot)))\n", "p16_vals = [\n", " p16a_baselines[\"dense\"],\n", @@ -221,10 +421,11 @@ " p16a_baselines[\"DST_RigL_50\"],\n", " p16b_grown,\n", "]\n", + "# Phase 17 의 p16hp 가 Phase 16 와 같은 hp 이므로 직접 비교 (순수 scale 효과)\n", "p17_vals = [\n", " p17[\"dense_large\"],\n", " p17[\"static_prune_50\"],\n", - " p17[\"DST_RigL_50\"],\n", + " p17[\"DST_RigL_p16hp\"], # ← p16hp control 만 비교\n", " p17[\"grown\"],\n", "]\n", "width = 0.35\n", @@ -241,13 +442,14 @@ "ax.set_xticks(x)\n", "ax.set_xticklabels(modes_plot, rotation=15)\n", "ax.set_ylabel(\"final loss (mean over 2 seeds)\")\n", - "ax.set_title(\"Phase 17 vs Phase 16 — scale-up effect across 4 modes\")\n", + "ax.set_title(\"Phase 17 vs Phase 16 — 순수 scale 효과 (같은 hp 로 비교)\")\n", "ax.legend()\n", "ax.grid(alpha=0.3, axis=\"y\")\n", "plt.tight_layout()\n", "fig.savefig(out_dir / \"phase16_vs_phase17.png\", dpi=150, bbox_inches=\"tight\")\n", "plt.show()\n", - "print(f\"saved: {out_dir / 'phase16_vs_phase17.png'}\")" + "print(f\"saved: {out_dir / 'phase16_vs_phase17.png'}\")\n", + "print(f\"\\nphase17 의 DST_RigL_p17hp (보수적 hp) = {p17['DST_RigL_p17hp']:.4f} (hp ablation 참고용)\")" ] }, { From bbbab9a8ba67f7d0f7975d70d947b72e2473ac15 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Fri, 29 May 2026 11:44:21 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[CHORE]:=20Phase=2017=20figure=20=EC=9E=90?= =?UTF-8?q?=EC=82=B0=20=EC=B6=94=EA=B0=80=20(Notion=20=EC=9E=84=EB=B2=A0?= =?UTF-8?q?=EB=93=9C=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/figures/neuron/phase17/loss_curves.png | Bin 0 -> 127948 bytes .../neuron/phase17/phase16_vs_phase17.png | Bin 0 -> 70351 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/figures/neuron/phase17/loss_curves.png create mode 100644 docs/figures/neuron/phase17/phase16_vs_phase17.png diff --git a/docs/figures/neuron/phase17/loss_curves.png b/docs/figures/neuron/phase17/loss_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..f979339fd1030d29c105a1d809af8f99bf2afe96 GIT binary patch literal 127948 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

X*ZnninFv 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%0DI_f_*fH1JtM{0+tD{4@aHaDVU zmof0V$POlsGFXRbFE`93@S192$Snm3F9``te0SYJz8&^#BeL?+Wn#fRDSfMIA@T*S z#5hI64z@=kBeaf3DjQ5M=eaIgmfd~2F7C-~pr&%fBgMRXsYJ|eXLipRwJ-vc zjlPZ88wGl`eaBTOdBxFy+_anQ_ug_8>@In6xD9Lcb-!@y_ndL;0w<_*VSANWI@Ri( z)r{8nVYmPpc$nq0mi5PL-e~YX<2)jkUNl|AGdTA5o?h3l^x|vRoQ?4|0OYGA3<;#8L$z)MiPSCQiaI|*JE;uBQ=kn+h>8sO(aR_dZiu}`o zWO8wFkrn>Ou$YBj9z!_{K?Ua~3N_{o6(c(YTv$6@WE6mHougI)xa;UL*(K$V=mus& zsX9uw6Dq)h^9>qjfYE%BjT}!!YI&~bS5Bzrn4o+13XG0{=E|SJIYq;AK$f!s74NfQ zOjinAs}dEm@q_izNzv`PAzBfq6$hecPxQ^=8q$PEH&J8hcbj=8G;Q)A_C1OqfH^L@ ziIOvp;-i%f2OMX8t_?#d+e<# z1n5lDet~SfJlcGrEap7oC;-HW<^E#~aVyljrK6Q}=tSe0>t%sAQ1><iK$W12^b1@BIdKv@AQrhY8e~TSNbvM;cVG{puelUg7-+0m=H#p>f@Pq&F zqapt-K=6O$PhAb*|NStc@LWdqT#dr#`oPLgNnJgj`}jXf@~^k}KLm094!cuW?0l#7 ze5xNwE$X`UO^probZCzdn(34k-y;F?yFJ-;=BLig9yuEDA}+u#{NARJFG5JUdL&IM z_;|_S!qjDRLOMt7m77}v-B~f+0XJf{5dkLj)Ek5l5PT&?4#3}N6=0|rDMK|Y|dPY5LdCLz4 z84B1g-${gKs~S$Lk6hDee6oENb?RJ8Cr`c_qk}ro2WTjy3DM2s2ZePX38)0?zO0`Q z&>=}WB54*F=}tOX=V+UHgc>rAQ5{Ik$MSnopz=$IGY$f?$T&zX*{O5^tbatByEhB!rcpBkYS_I z9XDN5vM4{%1s%4Qq^Yi|+&a5s|HeFonT_!Qu~DIZ&`3#1y%rhi=J--i@Eb4I8~acu z=7D=*F$iy<`~~sT0VroB(kqRS`r(^CB$bdYq;UNYRx*eb0gvix68gH2j~_OkBsJnT zwGv6-KO&PxGuH!^Kt7AIXvb4E>QbfC-M(cu5EyrM>JDulD ztLF@Y77Z06-`#R;Ov=e&1!&PNAb#Eb>lZOF9pS)0G`F>lL}~r=W9a2WG}Q8;x_cZK z)1C3qdhJL8v^4-qPl`Ywyf&>27@xhk0M1&6*F0%zm9E{N?p^>*H%$Pz0;pp#59QwM zz<~+xb$JGZqiiL)kM98R5(4ES{ULZ%qlq{uYMY7=5ajVSl!dj}aJH4sazoH=rjB}N z8btF^v7tp^<@&aQSg16xaO}{EK(xoU5$S?zgaaDW)NhvY0C#2wNH3`GG0`PGO8#hR zYR<0Z7A^x;yzUBAC6hbd)xgwAU+!EHM(6i3wdSK{BA*Ya$XLAR!+&Nv=aWQDM_2q0dlUaM*VQ#jg8qMt5B^X3Z1K{rpYSOfIIxhu(~*ztuA|;F`V*mkp`poO t(Ota>zb=0DhLXhV>J2x;@zoo{dwS`#Ppq(B-bDQ^C$03P;IX0q{{pN<+}r>F literal 0 HcmV?d00001 diff --git a/docs/figures/neuron/phase17/phase16_vs_phase17.png b/docs/figures/neuron/phase17/phase16_vs_phase17.png new file mode 100644 index 0000000000000000000000000000000000000000..57abe6a11e7376925c53e6ab9836de1e5f431637 GIT binary patch literal 70351 zcmc$`cR1F2{6FrTPIcO)J*c<|k(5z{hIJdso>63z>`k49B*|^>LiWfm^K>er5Vx(U zP`1d({ytuvI-k!!-|P3s@49}!`?|W$vEJh~p3leg@pwF6KIhI#uUoxqH3I{~I;xC> zG6Ta30|tiQ-~G7)-+e>QNt5_S`J6*IjVoCT(=cu9gPO7Rc?UiF)49b6GU)ZiQRNv}0$~L8U_%A6H`M7#b!@B}6!&(h}e6puI z1-Pa<-A0)4&}bKTYuF1-M2TL9T)g_`TdUj{`g#d zsm12->k9^kQ7%Tl|Gx6MA+h$?7bjWvZ(8>2i~BM%FMj<$1BLPbr$2H2;^OT5>cZhy z&!4lVoO$N;sy150=;!;KPBQgBr|Z1fx-DpE9J*%Wb?Uyzv8!pk45=ubaeC)<2T6- zkL1$qzSNp`6!2^)>-zBVxp#Z1Tj9OE;+ck(_xit&b-RxD_)x0o^rIEtdbuWb>Mfb) z4Mm%W+H!kGMq=LH4}4P-DHJSZ-6_+nuC6W{DVVW(D_4S)->wvsx|r%PK0`){FxwLM z8RcTf;UjKc=SyAHq~euEMn)n;-5k^B#;2!S^33RY#x=XnKed%yTwEk?vU&^0gIxmV zeS=x$>P7bbjKjK&&)f4Y9F`UrG+XLoM2jN?EJ8jM$b`*Jk6H}3=i8Xm)3uHo;U}l8 zy3JqQ-sCzvk>WYiyZ!j_!R8D)UOV5siL0%xjqT!% zs*Z_%dc3^(%Ujp4UvHcAzf)db{?}iBQK-Gu!M-iWsseIzbNB4oL!s{9zkhskvgz6N zl@4D&oLX3%8*P7l@p^R#Pvi?Fc73POPPO+%4x8WkCnY5bI}RmF`!iE%mR455!Vczi zj|*RFqs{B%ZpwymhkwZKOtk5)FvA>VXX?jGt)nk%ypbpQk8YW}R;<^eOH})oL%N!6 zxh9I|I-WdnpUFv7jLnn}Khp2ZTXtBaz;j{t*pldNnM6v0m27BO?9+sj?W*aTO6zv< zzYXEh;rCi}cj#|mYxek!;cD2}BqGB7Pbb{Jzn$2;V@ERPK2@*Om6o6oDcD~;S|<1D z&p@H;&mKe_w@Y>T_IcNF+XUm=#wW-v3>~vXK+3K}x8?jskF1_0L2+w45c3(igb(fx0{FtBk z<;$11S^3^5zVh*(-B}C42Q|1m1qCbob|;1M>Q}#ie?CPe>7M-wxe)Gb*HMYdLYDpi zEsA|CT2rri%U>M7%)qcw)EM#L>Xw@7YFSC&ZB1B$lh0P}?Hg!Hi{LZ7cKYZU@AdsyDzt==_r*HtT|FGwp}US;x~*5@{IEV=dJsEW zJJ;B+z0f+g@gbYsQ`=rzY;0^>!?j%FnmZ12U+QAhQ$ibK%FSO7XX_^&b^GjY_p0qEIAMlFq7OdV}~3rP|utxh$H~%{xn;3R<;qd3|tm zcz(V^Nk>_gzSja9)z;Sbj@{`vYz723uJc9qcPA0gdiwe}u*R^y!kK(W^UvP)7n^-G zG0G}^PeNxD(=gDS5o!DR4X22R$kU>tRP3B0r%}D2$>-0X=X=aKP7XB5Z9S+Sl$Mr; z{nY#EQyij->Fh-R>UHb<98c)$>w7FMOyh2OQPI%~qp_b}`VQvSiP5KqJL0X1F^&!+ z@3b(aA*H3I4T%bA))J0x&x z<#4E_s>+5QiYB4VxF({1y35PoQ83Kk-(Tw9o)pB$u#sq&@gAjx*+~JbcK(@}neZmB z?_VFXE5@XMu8B;O31A_?6!9ZS+{@EpwDUaTfZSUbXBQW;`&3et9|Z|oX=7dnOQ$>O zm3zISK9mKy#`SwTU; z!~!fPb$q|~n!nQrP7Z>NOt=e)Vu?FvTE%!~re`RUy z1yq^UsWSZuc;|bBmeSyVG=d5!uTu-9R}4M`re*G z%%o9v@7|4QsXjg0)q+`_z)NxH6j+i3lT!2G)OGpki}(#p;o!`-FGY^S5t-+U6Y;+m z&;DATxbme*G>qW3&YfAj*}?nI+>)t8PD~3w zYJ$~agJc_=m6cUeTB;ytS`#gz0UUI@@sQip&@MsCuzP?5h_HiIfd@#0og8dwDt5A_ zDtDE6IDC4sD%Y_tR=fpqmo2_N8G(8bVa9dr)6Mz$`7IkaJ^)Zi^;%l2jyj&JRs8qg zCkfKR&Qz(15XiUta(4Oh<^BEiB!WM%Rxp_d6k^5BBeKf(8RdpOk_#oFoA#-YTdOU{ zNWrao-YxO^0KiPZt?$JJZW$=7d7!{$Kzc0!+Z^_J9v;EMkt}gv+*RGNAX-J^P z6Ug)R!?S?)*4EZnH8lzrEt$cHDlwvNiAjpF-^7wLRNs1XgF~#8Joq+ary9MO~*%g#Ahm*KOWW~DGt7*U_ zvcX(<@Ixt>&-&VZa%-PGdnW8UkxWSevLKfgo9Wry`zBlkOQD*^<{Kesm5NK1yca9{(FH4O}ylbBMDj9kKY`Q|*L!6Q~S8t_I@uNF7w@`fCUd9Sox%x0*LOjLLere{@moFx7fMu0v ze3+$*$Bz%w`J9}bR5~zVBGprf*L<=^905LSvpvRMZkM7~_=_*Lrq929ct(mUB`qy& zXliPjKDQgdONo|^r>VGq|31fHy6)2kjw%4}ier;Z!MlYnhh+j-nv~2TW8A?nYGxaZ zjdUl)dLEHIQdCqFv9O-?U8!4(sgaRU(4}_;R*@+u%35X>^vVV6OPyFemuPnZyN(3A zxw=MFTQsF^?VXX2;IHDS>ih6v_eA%ThVBUBb_bx83)Eq^|O|+OokuG;sx-?z7c>j`cKKDL zs-^8>+qq^7#|8J<3A3p7iUa^zW6eakZqmr)?2+bch2&3dqo9;lYFc%HoKITN$cZ_70Bo>Qp*uvA{N%2mFZ}8 zUKm|`eDQf)Iz3hGAT9&|&&uSsV7-LdiMQ-}YG*?C5}KbA+Z9M^jZn91fq{XzH*iAs zzy=0}7k77JN$it!L!2nE?#cwRj4a!aD#Kb!OLDO;3hNgzRkYd@g$_Ga*kjf{%Fq;f zFF~Vgj~BpEKc%#N@MUG?f#wCtq1=W-YkkCGu4-W(?L3kd5&0a3TC0Bba=jFmGT! zaofR*)QXy#VTiaphV>ZD8WQ+;SSJNT(|t7CWoc6W%o(aF%4P_H*p&AXtS`SWGHPcX zAW0TQXP36+XwmIyT4-qKKmYt=(DWJ5H*xMGHb63xh&Fdj-$)_fQDthoOAPi;$1OO*zxSy{`RR&x#n1uabAlv z2d)K_>FDa}QaEdK>##i=TUk-{Bpl<*=OLhn%NYL~|@A_2ZRss$K zs=x?9Di*F&Ls|)s!WT<7xtF=ms6M%J@qCH1(pE0jw_jqtGFPnI)pvb^*lkCiIf5Vn zUH}644Ya?B8PF$m3NMF;Y@%{)s$vCv&8->i<^m=F@E|Ys5Rg~0{W--zE9dqNg&W^> z2cHmNgp9naH@n2;8v#5y**>%4S@ClV5+$Pv$z5(JGf7>no~fIH!LP2Yl*V@g1{UT@ zTN0?7nT}mKd40vY24IdRtXZ{8-L|}PB~=ziGdzeI7G`|L^z7V-mCHizHXxqz#o5=E z`T@F6ZOu?G6rq+p8!h|@i%5wewW;ZAt!b#ChK7ep&O~NVz>l&?#=^r%br_>kr|Au+ zG$kv=AMfXaZv1x^d%$_Bqaf%DcYt`8Zp9dwWNQh~Jf!7-u_t_?(!S zm`_g7$Bv%fUZYtj``7G=f1vd8bF9l2S{M$|W6Ovyp5DrF?j*2hk=t}8N#=O^s#9i}D3G-oIKTPdr|S zO2FO{BQnsM9sk$$>k3A-wY52gg`v+boRg8c?e5`$rES_=+up8?8dd#u2#-T|#X9<~ zX_S!aDD=r#J}oXj=rGWjD46B-t+As+}{Cfup{62OptisOGQ5}e@>G8!gsK{UD=_{zl zxs8^_aD1P38y)MeOw}pO1SU4*%0*pQad)Re6&o)v?@e!SY1h%o(Jp-gzQODW*nO6- zi8`(Vn2#q=dwy$OQ>mL1R_Cj9g%@tThYufC_EK_*94$r-bM5!#Z)k@%rKhJiX6cK2 z052oI)&sj4L_fgz1arDvprVj&#!lqv9PJ1~zFe635=&6G{fEDQBg?BHZRa*18D-qP z5qwN8W%{}I1~%$WWd1R`O~IThiOHz%5_=*sw(WUlMkXc)`kRKbZ+nCo9Q;(ugjI(E z?q#Zia+e0rN37FCFKONKAPzyVV*N7romSC%j@!Oy^}4s`xc&6Vc`ygZJbx>TXIbnl zT@(ZHH&)qj2{HAh3#zF8FW76~QoAjR8N0@%YY`UUcY|5MfyeIvn5fT zeW)o33_KfiA_c{k9+DKflLKPV!t7ucK~J7@!$P@&n?_5oEn8VJ;86%j>Kkikujh52 z)N`hTrHf^^U*CFZHKdbU+15#J$>ek!copd`S3UtHB#D#xVgE9{BjdfCqLZ8DrJhdC$JrF zmI%mykemArzXkhgiKVJBk5E(?LY`^ok9Zy18+z$)R0W0$SH%vATOZX5Zas48)dNNG z1yzIxQqVd~4yb`plfj-t&Zx&ADLAlp%5`>j+C)6fai6ihdGlrps(bAc=WOhy13Ef7 zxx&^(T~cgiV+r1X=*g2lx}ta!U>}8g;B3@ktHZGe6q)JEzBmjvzZ4oO{0t^4QK17Q z?5#wAnJ2IPp7^LZQ@=dsMLi`Nuq$G! zV74$#BP(KRHnE=YY6%1FMmid6$y1D~=q&m%hX1teU@7dTB zE)D!D-CcTJD(qZYb?Gh(4-EmpDWwr+wx3@3?3j}ous)8RtaI_=#hikIdycGg-;)ta zb4=zwRLn9WXso!&1d}B`#Ka9o=o1bVG*;Vqhq3| zv0nK$?3_S9KR@6t)Paw8bgx;p%4h1Cv4M}X7h$^b0-zaBoX|x!O-s;_3lBbYe%9*N zbnTsClflVpWz;ijrLGRthQcmSivmk6d6tnvU;rQ6{%kOsFD*ip5S3MPjTNX3_xGRa z`SNAE;X*=Lmi8Si^M1Q4DC;Qq*!%xjzC3(n-IAc|gef)4*d68nsMW3DbS6<(RqzTq z+1Y$-M}A{C`444jX*+nE`!@z!vUow%kje#!I+0EO^y$-i_WjCD2>k7SHvk#a!C9Ch zuNZeptzWZ-PRL=?xBIBbpTR+59#`ZCz3yMH5k^xx-`otWy>afb7%`7jJa`JK zMFJNxT4Sow*uEz|42e*1P*WE=gAChBUiD^wb4tbHg6j#V-;;c4hX!%MS+y!7kS z;P^PIXU9sLtAfdUe$+r^o{y|a|J(~rp~-u%XEFii#X<_$2m;PuFEE{OemmskjE(p7 z>C=AD5IH$H%D_7El_2br9-i@*r4caznN$)N5Mc6}8Gl4#XaK7;m)GLFu*>+RsJg+f z(X6*`&r!3Or^@x1o34+8153fn0LDn>8N6IgU-2H4m3rkpCI=K4)CMrF_gNS(b3Q}i zmx7#P_VUhF{|VZ-3d}a@n??W|=TQwlJRWq6e!NSnW_BEqnqi1;xzlJ2 zu9PI~FklL9Wo#Gg@jEgnnS|{*%$8A4qogOuYXTvmpYRQOJSr`yEo#D#O4Io5`_6$i zJYW=7CHrFTk$ryys8`ufrijTxKUJbCEiAjnaxX8xokyh(YGgJdP6dN(6!luvefaQU zb)--h06dS7P@#;KpH%$RXjj(4+_aplz~*OFRaDgRiQa^V5Mn#Za_snVGZa~b&H!(m zoK-d}3;d{z?2jyRd1`oke&$={Ow{GBGN$1i1(Yv`-B1jAy@vKxT?E?Zt>11TN~!DN z%Vwy0>a)rh&9(0kcGw)l5aiJ9mJyh{YBPH>s$USlF^FUYOM_}A_s7a7i4-sVmSeia zd7>}Cb8*IG0f>OC5Aq0Gwp?=kYI%6aM2B^GxYcFeQr8^_ByxVtqS|<9I-qRNhYt@B z9tXkcBr4Rg&fZSLsDpAjA5cxU2|!AuUQ4nPYjyYrVD4s+o%wFlm-Ef&Qiu_<;Ow=I z*r0yoH0FH}v=96o@FN{igHl=~-qzaMM=mRjB zdq+pDWveA9`jix4@PW4vuW!SxF~??j2f{HE?gtAB080vN?(9HX)+cvnEJr$?wJA|y zH-R*yG6eMsP?!XE1qAIY)oBpNzIIDhYFN{gAaG6bTF~P{b93#Ky(gOUP3uqd>Xp1j zY)Zo(s%~r30_!JGQ#8=<$k%mpAQ<8mFJYe&j`1u1GNsNRyW%eWAtP@O6vHRgFOEt;CFq&5INlDLA2 zQGg1?FM6pqR=gawS1N=DB1+zCti5p9wC7a-D)T&)fGI4JcV3}F@bvVQjTI~9(#T9- zT$r;!5k$?=^^1>>KOrhgu((>5-g(e`gjfcOZG3oUB>+R6CEc0w4!nVYSpy~CvP~Ja zcL@w5D^crqgw1}l`FVr z8~58At2V2aINLz0liaP9wSqF5Wxsvz~e` z6s_NLY~RY2E9stAz~dj+RwQrh0^|c}D?k({?A#jT6_QDy;YkH&)_m@CJIh7Kk#{Lb zBm@*&%TGXPR0HvFAM7KU^alkte7FVbEO1fU?b(LjZP}3iED&g2kpy?o&45QHL?2zA zb|cSYH&QOYN$no|zQxo~+qPj5K5;v$2k#D0WeBy2gwsyeN?>51IJpo1Q2(zw1wqW} z^jh*Dbv-Z}m1#XK8zZX_b3zL{87zjTviCBEzeRrFR=mq7hlPd3!uV@m+KUE{+x0=5 zDm}x)8F+3^=wSG3{Kl5Z1pEh|eLPw@5?GWzYVQeqmCnPMi9x0|2o~%Tx}1)3?sZ+A z;%~qGX6!b60_Dhx>-+T<*ndg1Mca=F3!CFDl}7f1n_#^4uX%xzjTJ_e`|QkE9vwkn zsK8seRAr8u)ZVp=yiwripUj*oWYH{-I(ck>_kZ-w57_8;9dsaW3a#kwc*g@W>fg@? z@f)HLzJGogR}pme@8_z-X%^xR`SIBoaQ`-J9RGe~C`2p&`C;@?P+obp&!{Fs4Rke9 zhK8~?%CaAyzr7l;@Ou0DlD#+Vtw<9+YVc!pZ{E7a?(pAz=1uT57mCu(;qXm?cO~E4 zIF3nYl>VQKs2~VzZj2$^+0W1aYcEGOb>Qcvt}Zdg*K@?zhc#Yg_}hyHed*Z+=QKmw zuh(VN0-fdV?mjWpb``1)W!YC zHH7g7*|yn1{+Bo9Bn!e%_>Yi>AZo=Zy^LYW3T%6#+Za;vB&Y=m#TWNoSN{8sj6U_I z{KKod`})FO)H5)!NW2R?bNcip{#~0Lxc}#hE(;%-UkChla(rx7G+aV{3o7MI#E3!g zY=Bj}}U*j)$~@}O7ffB-~X z$AUWRzgPU8gBK7bmws6ZyFvt!vq+vo0Ix@3t@iNra-dp@awIrSB2#(HO*Nq^C;I1B z9&Odvp}ZQP9EpS{7jxw2yfesL!@b#o&1QQ773~-2U5H!&2-}48N&FD-DaaBU6(qe+CtgdTLz?(>^OL!$YDeJ7+t3fLZF4?&13$j?mxj!i`lgU+#X z*gkAjs8zmBd;fiT8DUfii2XE5%DIQ9hc+)`sFKhfsaxftzEt~uMlOhBf4>?dc;+vD zlc=!MF{-$F4fiTmDuN=(v0!KOY`UdXW-v+iU`3GdlYx2zW-aN7eiSp*N2`u+{r6rU zqTynC;|YR^&>6t-s6cTp|hB2=b zAHDZ-A@Kq)D+4A9V3qHv1e23VkO6ku>&{NS_YM|#l=7tLqBaDLTh65W!LT`s3vx%dmpk&W>HGE&@p+oB#7}(W2 zc6%JGHe0fSJWHa$LI;K@2y}>xn_Fe-&y`Q%#maX@A()<#v31w3h)<#HYu2sHcaB8{ z<##KE%uT`%p?vWI3I`i*czesy^vc}BIcz8^p+c)7R;eY*??lQPc)meAsNVGMn0skS z31Cwf-#o#X{dqee!c23jtP$wod zyuIl}U;Ql1YTX`-_0+SmuVEkSkM|dAz^qPy-zm%X#598tLJR=*Vd`Eujwe708@tD2 z)HSnY)Lr3+Bv2j%n-_RJE_Ev)S_+j|ug0GM6DMeBwcp7583Ml=<57cw!6;@>HmG}Q zIwoOhNw)4PBc3AY-kZ||$u2J}EJP9aMFzqS$)ZsP&WrO;Ng<3SnhHh9#(cL95H`_a z$s46&8`(sp1mF>1iO_~Xe$Tf29sss14VCkyY-hFL^`dUOZ5<*IH)B{d#!_#P3Ywq{?(~!LV-ji3(~y_l_rlUqMVtyBV{_jv+y@{n3 zImLGtY3EMtrobJq7bKcY!jBjcM2oOhXMf^TJEjEB=3<|WWK|~^8aR>#sZ{b6CJq z@t50X7Si=fNhP%F@P)s1bUHad>1L#-$1#1I96xlvs1GCgmc}OchH(S-AGtE2Xb=Qs z@660htP_n83+*B5!d(UNL7wCeY=acAET?I2re4iVoAkq_Q5|@| zzs-dpeSp&t1V`JRR}Z)GXq&#ezaL~gpT*p)tqJS{vxxup<2_UqJhG5E8i*Q+az*-% z2;v!G%gK;~0Z2Q2b2VR#2{y;t71u2-E#ZEv*fCnSDtsMlDeF-KFtJIfLaJL@GyqTh zY-P3WSvtdrUNr7};lcw-xY2`d`p=Mma!4Ybe{++(4|WG3nOw2j#pb`BLF7!x#S==_=p*MGOIsmr5<_s*J>P(?T3;!Vnqp?^5VRf!%=h%Okd%{UK2} zLFQ-^{)=eA@c&5a2qlWvz%!thuE|HhFd))BwaAv&hQ&!USASd9h@C?yP0+{ZPz9Ca{h7nnb<)fZTS{23l%U=6N01MF}4vzrhblAOmYU1v+dyeA#9d*C;b{bCJd+ z5`B<^&&G;nKqw%d#Kad!;{J^YlnUWTBr&V%Q2RD}UW~f}KuaZ_o+gAynaC^!Gt!@UzxPWbs%;d;>9c1Hs zjgBDsW>JbXqTE-Bgr}OkJ<#1-pUnqY@;Q+l6Evt#dnl51w^xB@0hdG|Juz63%pSRZ z>+Vf*VNBwlC#t(Q^=5TVu(n5ux(QaVyB%l#vk_pQD^g~WZSNgG(8Ogc*S~@jkxaU3 z7M5uut}8lP_=2=qRtEqN2)EI2R}>An=Tlsh}dL zBY?|i!F82_sY%6bqVkVw8;XXnBy1`r4CJaM@2RMn*;!fF{Loqi65_xb#I7uY$$=Qu zVX?v59_*Luq)_H;(P_q;`?%E_FwneB!^h@EUORF9wbkN_S>LA5MC~vG5qm*m@ z4PA^}XKUr4=l72w#;}CospwZbVg*8iODiWKgjfHNwe_fs6=-5h*?%PRb_$pWAsjnk zxd4$0DM#LBdu=cm?0<% zmVy-+`b$<;86er;s>TRe>uu#!me_ts_bmeFo6GaGJXBQFJGOS*WWPDLq?b(WOF47$ z$lKI&1qthaJGpvm)AlqNisHfEg@uT^o`*`s8Z3Fj+3V}R@va1LrB+>K=Mf28uCLs% zWzQaNYGNBtR-G*;-U#&xaa0b1hSorwVHwunbP=(XmVk^P@w8Baux>p)2~f7B+d3Ih zpF{pi!IlwEMjT8u#1d(O0-R^rc7!DPpvSkXkP_Iaz`y?4o!G3fWgY`vse^#8K_vb> zGZlDs>MdiLVJ2J0B&>>}@iyI&F^Qk0&AtLo7M;Y%vMluzXh+`ub9P!-&ZnWkdZ$vzY!GjHvJNFMi%H(i| z26Xth_%11a>0>DMiNU2BtZRgj_2rL8S2BEf|Lly2#D`~03?OH8Ufh}j$$@>UrQ?!kp;f6W36@`KX#7_T}&EDLCR;3Kjo z_;TZeAKsO?sL=S)NU(0_5lZ`_eu?v@;p`i(9$IP1#v2@l+tn}!zLQ53HoZn{nx1UU zHWawPm(eCt5G09N#ck6Mo>N~Kvg(q2y26&K}b?((90#yqXH^c?F-a7Oz+=3_`&t6j&Q7e!~JzM*Jt{Nyu^Wpw-i$br1~z zOyZU_v4kZLDPXhlis1CPh)tW{H}3^29*|%t5lF^nmk)b@h!<(>DDg&$kigkM=r2V2!p`dla5K*JWsxXM znnAANE=Y30!xFhaL%&=PaJ3m20HlB}aUA0&f*F5KvTuqFKvf|XF+6S^^3Gb6-wqOVlc)5(KXp+#&8g6f5jhnwo zq9jV+2$Z})aF2lQU)R?w;a1H*et!R7^ugdP^82!7WB@t96`}N_CRnY5w9ahR0b3!& zp|T%cC4g7vSf|8Qwqos$2f*f}OC>S$CneG?b2&f|)%_OF(c=g}*@?HhuU+ zObddg?ODWFiJi#qA2k{rgIf(sxPr&wB#Y4QT;@)|i2XO2`7}QFr+)jFD)tFNqHehHx56Oz7QGj6Wf`i~(vH>~Rge z8VlP+m`Dug|C%1e?j?wnkdkoOC5jqh#tv|P=Dl;E0NFhSq87R;ln#k+Q`#2r*d-9Y zo`ZPDBKUFgUh7I0?sr!n`}+01udgqXCF^i+v@WVb`dlL9SmR1y18%BPt*}H;^9c>6-hg0aM-q3BXi<99=55G?vZ3X!VUh9v7_?!fsRPps-E2 zHh@w?y&3O*c&NWW1#=P}qI%~FjBw|lTsgJk`m+h1CA738L;fH=O=aIdtpQ4v9vB7e zYcFxhy;=9>9fCWBiadN&=kowk4&fjuRN#ND^f|<&2&57a9IIZhh>$^2qrfBn{;A!8 zW@;QPjnx+pzpx0AvV<||M;}ez8y(Cxd{cH1yk$^mWBFygxd*I#9_BqFqPBGkBi#uu zWG;y=OM@K+det4+xzj@p%HO_Z6M40yCT8 zCKlsIx<&S!)r$xdsf1GoiEuzM=C1uaxGRa)l7m$4hU$VlHwPRP;rqETV?jqBuiq=i zO(h~OzeyOsau2bl{rGI$49a@lj>9L3f`=vU}_fG**Hvm0Pyxgwe2lydmVF%OX zWItURz)>0hdOm$(fdvW?M-KRmXuNMi&X6<$X(}1p#TZiAGA;@PzW1v)VcS1ytFi!dd-7TbB2;hVe5(FQ>btLRL{{-3!VTO71%T6edbCBH% zH!D$TQD`P3;1OdS>N%oQ62yQ}zq_Ri&io9(Y%}l_L>D9y9x+y+4Ap>S2^IH)X7m?S zZ-f{lHhQ>;(y`@8dIon4bDbQXKtPU}a0w{LP~~7G$5vag;(Bv`MSI?@(`SeNHmJ=?DgD*mdF4!ctApi$CPvC z`*&h&{?Q}};Te%CqNxsC6ft3t_7{Y7VVh4k$d{-s2=r3{F9508TeH$_xLp7{=2bc( zor$s0lAf!q>*U5V3||CHc2HnB0SUnX4Z=4PTwLsyUKyGI(t$9Ma1TBNE6sR8IkdY(YGZ0gk{NeuZ_03Zr(o^uGPgvlZlp48kNHz-chxJ5jVB+r5_3OcB9 zh=65`oK?cY^|(M{N1f`hCLA(}cgUe6HxmAVkRFO+GcVG!ju=&&;^9f?A!EtOU_ zHzEQcCqp9zj)3XglNj83WCQ!pZ+4PSHtBnNX5ko#SJ+Zu(Q6X)WT?`Q74zVSvw=_^q;+rL3ikkv@mwm2 zcR`p$C;PC!h=p?+bv-ML{2V4r5++c0P#Xslc^)fx-fyzo*6VCvuItGB&)CBd2x#{j z79H`02^D2;0~>Jb*i=ebAZRVuykBqH2m>K;_Ik{ZRYLCnU-B+H7MD7B&wSfnS@hqq zr##P2CU^}rK4?w_D4ajctOVr|lQ@(s^7li(n(I%N@t&p$|3O*SKddkM0&Q)hlPItb z*zlhmLK%3v%4PdD(rf$g=jx@4NbA^PHtl=apR)eC2CQrUA2sM((u5iIWvc7B-f!H$ zZ>OmmhmNxMuZOdi_$7wR7_4}nMP)jjeqz;tQFhspW3Az(f;-mAb`Pab`)*V5u8p1y zkk)|wLm%UHwQq@=`IhJST3sze@40~u<$#WmRpUo=gb%&C7=6rBchS=`RXL-m*=pfH z^{kuIsB-R#$*$JX2M@a}{w_T8X^R{>{fO3x&YClrihC*@LTzv{gZAAzJciuchYeO= zU<1&PECPvkuhATG95`$<8UGrliXfzr6novH7jz<=0ldO>v%P(<(~+=|s$ z9Kf9fZ>qv*X*vh2AMLp?sS$n5<}^*U$li>&%Ryn>E2zPG<_E?i!X}grQmctAem5j7 zx9aMnQ=c?ZN}R(YhWlziOg&;L&;LiOze=HJf0IT(#p5y?*hQFHv#!rgn-wM{Ek=p( z`oy~xi}ere_YyBhvwswuZ~yFq4tU>?L)skFRM<_TJ{`0Bd>1P}9t*JI6E&=b(0{-H zemN)DLELKtHsQTD_iLJ(CWjn4Z=StlsfKjZjDrrA;#vbN2S+!7*T6$(@iHL<^6~0t zqH7JA|7dl>DG6m#^Abq{p4WoQ?^6-kOwm3!3&RI%{_!gxu41RfBS#Xu5-P5G#IB|! z#l0kD0(A4qS!&CYjzG}YWWw+p+0IMZlTb|t;Eqy9k^vYVq4=^2|7W0}gm;-NnoYIa z%?ajP*Xte(ZY#LW%+g|J}QHTefT=omeTbj?ogXUS)tPt4|mWxHvgBZ1BIKfAv!JvuCGJ ziRQ1^z?@FpqX11*CR(_Yn;4=c`CQ%dNIkm9yroKkmUr=e5#`?J;fNC+x5@_S8fs}R z_XAZT{+P_StY@JrW5ho3Z~la=OBMlX;!DoG_=)J_U^8QYBPja%T{4vrHi!Y1TM(}d;)BJl&T^I06lu?57+fxhsggy;jA@S~L9Y$2+x3ryMO)qnV`8Mi8r6Mrn4?}6YzKMK%N3Pgvm~~QF8VHcuV7SgAHgU z1AtNk&_j~tz-g3N!L<)sx5%Bk4en=oc=^#W?Fvh6zI{Fs1c@CDf4Y6x5I-4)}+ z;fWh}4IkA^7L0W;y5`eRWG`|y@4Tf$@N+)Uu3KeR#3hE#h zCSII{KS%>{sp}gcUhc0+(+raj_#%5qxOVJth&-gM=RhM4TzCy{uj6 z8oW4bc&lu|Gc4uuwZE3<8-2MPoObS6xrE21A9=IWWAl{5so5-_(+Y7h=CJj`@`Rtua@Yj z1-2zT4T3U~6i;t$v<`~8DoCTm?`t)`G=2XOip;-<90-g=`jOeNz{<#_#I{C{w;a$n zK@fa&Xnee3-Z1GE#U(txK3h4)d{7v{@GT@+;^YEtD-WV9(U7=+5$h;a6gG``HZ=?} z>6=1VgGCTE1{hocbEixao@qUc(ZZ618CvIvFBZQc$0~LAE%4}`lwlYL@;nz@J-&bR zhO7Q29VHoBE>41}dj#mrl%fDv4I350m#n(aju7^rMB@D(!VL@$Z1tGwKOk(|_h4vf zs1Yp&GLzbc7S;&aH29ilC%h)F%>Uh4YV2V5rD`|P?O)1;s7@=2(~o+24ZqK)tBwr! z@=&?-Q)m!2Xjs2$Xg>`4czkZvDj zGf>wcaASy&6qY{?GA4mciwwlO;N&IH~cC{yZJ$UsKX7dM{{ZvCnmrN8-xPIT) zkPVe(xOK|klUY>OqiiUJK;Z47MHY2SqgFP<`C5ne262$%LU^KtH0+EQ9vu)9tFIV- zIt(tsyCy>NX^{FDjScZ30lTK`<7&<3JCEeZz(+U?gz?a~?e5g`hw>7zDG)Sh+NtX+ zh!LKgk3hIEV61z2E2}{NHsVFC-kX;do<+Gf0p1}Q6IXqI|8>%}1#ZCt(Fv&{f*gc^ zNLaDs3@9ODyCw^hMtlwQBbq)JabXfM(aOXI!HxK+$`__0N#iM+Sy0}xS3j}V!MG8J zE5flUoEWRxEqYO~ff^@mqQPu(Au^Rrd-kZpGX$A$023Z?&k5LAIUFP)>BzyAN|$6y zWR+28QxCiw7q{x*l|&YNyIDR?D=<-{oD1;k#~eW`tL;WTQeIi3@KUu69ex& zRr$)5+gdZF#ZGEzwvzc~?Goklhqdjn2Yo-+(NTZcfB*0sbtzI|A9ZHUmd3ApJyqX+ z`!euNQgQ2>-cLI4nxD7Y11}D^U@% zUVpZ+w+>*1LhV#?Kg$vlHCK3>?QNVaqvV@g=>0Q`GElJmuVmd;C1_QoDAI z4cUg;{|q2Z5C#meMxopnj5*OP33NtM&WEoM$DN&r8$%V@A(-_}kCr{l)GZh2n?s3S zc6N49KLd&2MTkJcOJS#P9n9u_hNG+yW$Dl)LDnr(q3vUt`Qc&ckPIr1vAk{CJvf;5 z_uqeWO#Ap`Mx!sE9AE=ZqcT-Np4h@bMVljDwHG;%KH5h}2&7GHprbGgc(+h2H#2N10X2vY@s4zcf4=1#A8AyR!2n+@{a0LBV3>IN$8IyS~7o zCR`tw0$kctcBQ!%DCfbomV$OTrH@xb{dve=WV@I!Q;_*_mjcICXtrt(bi!o)lW zn=Cigr+~XHQevweWC{wEL|~k)k?==7WGA*NZW|hCNo-;{a%K_2rE0#pTCO1I)c_QZ zwqI(k3O1a@AKIgwfWGn0QZYEJ!ZnZ>oq>Najm0p@K|P4W#9079lS8Xu;G3-w(><^6 zA+>t@p>*(Zm99g7lG^;pXPrX58mZT)!4eENmHXl{FI`Gry!ekn?mP~zfCv&mkgy&= zkjTF{9AT;*k(-^ZRD3U5HC0{eguFtv$oA-LbbFps35D=? zIPXIVq?g%DMhiiGG?=Yaa>wDPieyqWjfAw)2j2p*c$yWQ)ddTJ4#~ItwYZRcB@W|a zqhfaNHbT3!CEY(*Oj`|Yd4*A2`l(LAxoGviNNvUS{nc86q}-qcb88)`?Pg>DmM4$*Zo}s=364KkGAEjh&Wja@uY0|*j%%_$h|)fUMw^J zh@9TnX~xmQ!uA)+XT9DNn_s}Jh}&#lft8<2)@HfmkFB#t-jzMFY_m&tt{ zIAo$9_$|`SRz`!eF0wHQBSTe&Sz4iYQ?7EHY^UVV(QjyK0H~G)Z|<-9g+v~hE`qYj zu_u;U518G2#C1nw6pCYf>@Wm*;_vtll^dx~xC%uf`1X0;!gOTzMAyGCgin>8*Oji^eO|i`4 z@#Z&dw#>KcRQ0L}d)O-%(s%t6TabW`Af%=Kcj383PSf|q7Cy-}WpwRR=ks6am$rJJ zMndfVnh+l4jz_+FJaWxQ2*-xwzgeR+Y=&qL)A?DD8!wAv z!{p(209sQ)4U6L}^+@Fe09TJ+ykumAPEaYsH!3MR@+6S6^EQ_L7X#a z5&-AL>f|)789fL#y|Ku_f*kY(b%Px4fmRHaAFh)aQ5E#ek@Epn7Eno>VHx1j0|7v? zz>Wd;&VOs_RKzkS2Zg|_bAmW;umhA~blS?u7>5nokEe#p^+as8FJ30w9gYfQ>j2{S zh8?*djcnvVFw#;D9z0pYSI*4r&QAlh7FiT zYX(~g<(ivw)uirC_36`pvF5K?zrML$Esa7Q7Ot??%J~x}KRR?PfWLnvO=o-AY19z%Fo=y=LFhNcm%yTmVt_^JK{>bWHGrNBM=7STQr7a_C? zX14_n>pfj6PxQoFr_JRS_xo zTRUG$to?MTv^0Yld5OOn^McaGLfQM05+bK6NCg4x6$v^1{TB&uMLakNy*BMFpK&As zX|zwnmL|fib^6}WIlI%bO$WL}#D9`QA2N2szXnqm=~ZBN;Mn#BayObglM%V8Osly$ z4B85?KVNdK`c@F|t1*lrY|BA)d2*z!pjAX0`?t}*aO}k(Hc6GMA{$KwdbVj*@cbPDAefP%6{!v}+SnDG-kK)syo>A%#M(3c$IcasJZ($uO5l+Z^~m zI0v~&2Or-|jhL3*%tdAItCt=aJWI!A?kBHZaVBnb)i>*3eEZcx4o>FZD{k@athiCg zdwfLyj|6-7)St@$ZI=J{{>Ow?i8t`hP9VIeL3FTnaPXUMkAT%mFyF7=1V<7W52OFo zAYB}%cF9F^{ko*gL#RquzawV`VXp^%@EreA$BS^y;SX<-8DtY$0tzQ7tt3PavY->j zQK_;W6a4k}_j4Y#N)YQcY3e1m697^bG=L#t?)l=08g`cz%?K$#yVNxw@H=k0(~Y-U z7=fJdGTkQ*{ko3xG_LaoW{%AscM(|RXe5kF>|OKg=Ou2+L(F_W!`L+K{;k$;=qL!G$o{ zC5nbbSz|`B4@HG2V~r?M_UiXM8eN9Z{rLXw$Njw@zx(&c?T^pLsO!4k*Zci?ov-se z&f_@F%2NuC?Kx-P`cKk7O}qEi^9j}J(ZQ0J$K+{#wHN%!sXPhpix?Gb^IvzX>~G40 z7=%MI#JU6`hM2YWQI`GIYEtm4=jpkAo8K~h42Dxho49WJ%Bo@@QG@e$(e56=1Ls`s zk?pF|5?zB9my-% zy{lHBdhw@?=)}dTY6D*nqKJO-U^AvErT}0kr^Ze5e|5>9OXj{@Id|wOxQ3O|+hNU9 z%MLkAnR$3&{qrZFo6*&!B;G{OCv4~Y)~Ma0g_FEpj8ILlx`yV5otew;*({q2?_|Ep z6WYe#IS*sONq;~}KYW0TWj#qEdDx0!U{bvSN5&tkr-dc4ImdiZf$x|Y>R zrYr`g-^AP;AEA;YJj?L(rMFj)l0N-uepoeF44&UTN*1}CL`zQ(ZuB%GWBw#x4CyWa z5le`KLv*|715)Y9o0fd~0n999wM*&q6)t1B4HzRBx&tbHpNBoo>*CNd^Rb1pa)ptM zz9G)0E{-nqXE>J3X+5CyX}?R=4Yt+N?#(^gwzBQZeOtffK_4ozZ@vD%W37$nALKTf zmLDgPyN=F}Lp+uLBG#A@AdZ25HRJ#9OUzJ$;lEO+H}`vJ$@*rGT;fQ+!y={llB!fD z^BAfJ5wlK{mzl82e*4Gh{CSTk$QZJfS4JeIiq@+MNk^Pjxi3scj!!X%0l<5aNh8#r zRVn|)kJGyJs^I~5L9#h|QEln&$QhMmy&uUxMzx>8DUsSAlN1!tKfw~)L7W=N8=YQS za}LyAaiY7fHAmz2yGx{Z>;{rcgQO+KZMNblk>)K&vt=EA5VHmKd+6o|6Ffzh#n+~M z^4IwnWH5zH*;&*B=`fV<6jBmd810}{QUiwxdr_SSy_@{p5wQ0_hAn0XbO{G?$mvU@%1w@G6aHpe0X&f8GC(mXQ&>8 zdMA(;m-6o&PvBs}3Db|o*x-W;Txf)Q97MesQ)MU5aN!B_14yb>CQ+W5Z~xrA*|w$! zTHYsBF5!^Eg*_Q#UOP)lM71v7M6}#5KI4XjjaR#Oa#X1A%6F->A-BMj9#L=L1}!}; zSrn|hZ=tcWK^AdOYud4z{L}^GgiKx5vz@S+o0ZMWy?vMB=^Ym$XuXok;gM(M4$ZJB z@}Vo2S53|a{!iiXPw+aDEf0|B$xh42>+b`P#wc$fNk^a7(^TW!g?WqGOwCB48j7iM zgdM^eSShFtB0A8ISoqu%A$?=X6h!5u7Uld>7A5Yr$iD?g57tVWx61c5AwayBYy_aa zt3-r{$0KIZshf8RlzkYEL-?tuJWGlbi4|)`0$OVzi$%>_oH{h(I3~UT^i-v(@sy)8phJp_UyW;n3~PiS`z| z(#gr`rxO)hjQ#$n*S2%z{^z~-_JEG`lwb^m2w5P2ii#@&LEq~6@pY!rV`$K?$cx0# z8%44l6Tcd(EUtg~&6N)Y9I*Xl9wV7d>=TMlTN97rdHA>H$Z~4#agV5l6v#4$2S#4yHBw~I>3G{#{;z&efn1HXJ(@3WUf>wCowef~h??z!wx`DXXKxW1u9Fe(K4gt3) zkNu1Q=B>tkVqVdwemh>m3Vmk`_Yh%^waRQdl#N@DX<9)81=Qi>$Dx;Yl~Gw9mH>%9 z27a@CH!Oo?+SLTJbMwPGo8Is}LMuebdERgE!5_Lys1Xq{dB>}l=L==_RL(eM+IKyE z`q*~JzV)|q$Mq~o{&=x^+P$N#e|+6CD!bC$F5G_t(XH!An_8c;9uX^&YXZGm;R4r> z_zpHL#|VaJ+8utjoYQK}*)x|1p;ao{AnpEu)P$XoTKY>t08zDJ*|LIouJyG+6=q@# z#Dlu8Crq5U+(@!(`Q&Hw5)4y5P>SN<4(;Lp5YPe@jQ=-Pw#f`Gc{_*I&nX)G{hj*giF+K9TykRUz*0j zWqL+=f)?wk0=Ky1p&EV!M8f$}gxBDUrlF_Sf@E-;>evY+3u=RG+!VmtVM4{GHh}o^ zDpk*aFWbK?f17(BP?ahzKwA}DzHrfI>;GECos}R8Zdd5-UGt>fjm>@LvorwKkFALv zRq=kMTAG$)3ZPkX)M zo?5z*%RrV!#HC%K&7pWm$3vpqynZsG9nzWNK{+)41N zl%weik#vbienx^=D%@g^X@_lNiMIa}*lC3$|CQ2c1I6o^=xEoKW%DmBpnaKhrOJIV z+d6)~Z*C-Iafvp5$S{d5rGnmMHEz^sr}Z)LeCy177Y!0X<^u4 zHTQ3Bl zQ|;Lx-5*bZ>MZ|}N!fhyQ79*up04i@96-=HUjH-L(6HGP_H-+s|2>YTT84kujTV7A zbO@R2UTwwm^J7Acrdhmyn4g>b5;1T75DgTK)}#CSLi1Tv)y9PrBo-v!L9ES`m}B58*QhP^Pv1=)=S8Jd$bYYD$9Hwv@hd8F zeMx!tgwD?Yk-;|Ja^2jQ@T&U;_qD)R;B;J^gOnqcomrOXzr<7>;Qg=5I>8elO_X_> zdYv308|26~yyB*_1Wyl=9K)jOQ$EA$#feG7Vyj={?~vL!v{DBgW( zSN`uCPWf>Rfblqjxr>I2Fss&8Zy?%8UilyCA7ZKiIJqZdVyvRQslQ3Y{^QL6CN%XZ z$tj(-pqwJM%+51O(?{BdlRR5s=S$TZ$X@H@e2*>@K9vC!EhFAv0kvEKaB4#5Oo5@; z$JW+1;1-C8w8)unUQR$W?EK!>j<&BX4J7F4YCx9&l2nl=OaVO1Jf1%owAhTa?#|$p z{r;NqFYX2nhTZ%C>??tn%A>EY6Priq=BHZl;WOnag<+-^_jhJ9+_LWR4)r^b5wE`rCZJP0be6cCFzK@two0`@-MzKNpvGT zN*sM1$*qbH&N@J3H^(}hcWmtyLYLlOI<;JDkWYO_x->7tNsffHrMrG<2DFw~_HXkR z-p-l!#q7Z#<;G7syB(1Z{Nr&pbE2}Z#qNO5pZ{m({M_GWelIJ5BvK`&f<&b2=wcOu@u2R*Lnz*V_ zL(+YU_$=i#f#`RsF+|XV@v5#pDyS$^s5#^Z)P1t9coPN}P<%ZQVS}$ z7wBarJAd|ql&~4jHFCY?i>R$UeUABeZI|9W+*AZ8(1UVrYe|Asjx&rf1aVb8U*Fsp z?{McOH>0L??k1iEL-goBL_6)IsU%L3nr8Ik5G-0mz6%6=;~r5>8G zclSa+gOn{5(+ZFbvD-LRhVx;XU$%QK`kxVJx6ObVuV{iAk)RL%jCuA3+Y?=x zqokr7t_w}0I0|5Vf@}M*2i1z8(b8;3ylh_G`#aqzGT z*zJxEIMu|F{VL-}WkHD8pC=Q_hJn+6#6mMse+Z-vxgE zPh$maecjD*>IU5^op#Tn((?&(U$=Dmd&ZcCYOoZk?J5f!r6OsjC{8G}oj#nF@>0$7 zNRI0X&S2nWVSqVq(oV zC|xE0MYcb3!pyvVl(JAZytMZvHzfyem*m69iBV9`OaT->&hMs$P}&8hB;5vHzP4=qDI`ziW!04$!nnNBg#wS)H)pB&YhOs93H}| zXB4J5I4ozFuc_LdU6*6sW4B+aCIU9?_#p$ zmvlt8X+;BP+1k?P3V5Tw&2A5hD7nP-4=8xb)N64aZ&J zHz5!8pfHJN-pp3kXIB$>^Hw6EI7`@rYlh7wPW|`4k7wtFMp33Qa9T=>AIV%jJ6R}^ zr_>>$==kx?&5o!w$9zmt<20|?*+jZb6Lu%Hxa6(>swFvKPtn*ny|u;T>l;Uv=^oV) zcQ{9R8xg;vQr@lhPFn3`05L?9QViV*YG^(d?3)srG!+RTOy1ym84q3*T_>5N*OD4M z5q3reA+KoO)%hWeZxOo+PaXLnY?*C-Lt87#Gahh|eAvm2M$qxmfd}VdCtcuem_GL4P3CKbve z1VUcC2GoERlVjJn`q%H4@hmY7ZqqtBP)fB8Vq9`si~RL7)4gWz5>`Bafyrte5z~N$ zo#38;FfYS^5q?q$w|Cj5`|(Zl%He3GQ7UBmOF$vuJqk-ioIr`#o$_nf?XmgqZ^*+- z+3v#H_(i2=tSLBlK`0W58{wDCXuZK=HX%TP1D3*VOmV^Nq(tz0@D3&Dq`mq_Zs_ED zLmV6yR6LRV$w|u^^K0HLbaU>^mgfif1-kz>Vwp#=75xK;dY{>S*4g@E>?O}XAO6t& z;+lJBtJk^It3$6!y~h3dX{Syd0w>JyecZaWo#n9!B_6(>x^7*oX-=aaJ#70`lScI4jYT(QBju< zn9GcrHO>TfIIE+Q2M(DhKpFXnUlf^6jKjp8CaNW3m#;a3~apqjQRR88hT%lK3;zyuj zRa$k93GgTjl=!kp73>SDS08vCCe44mRz*4f3c+Aj)@=hhsTt?B7Qk@G_L1hhGT)NB zaR2^&Mr>wZyam5t#kzH4KK!}ha)JgJ^n{CURKR(Hm>~P(A6_h|(TY{8wte);XDJ+O z)(?*$BV}Y-fVjgO=TzD4us8qC7&`ea3n?rYq%sW$Zp+P1_m!n-8Vot%-KOQd3l%^r zD6cwrFs|G_ye8O8Di!1`3@#}f0P9K;Ao)DIGK`M!o{(VkcB{MFvrLpNk9UO%Rq+jQ zn~VXFUib)8XL}NY(fzTZ`sYvkr5+cnMGN_wWv1BNsCxeI9@hE4VYo4-(^uy1#rJhS z&9_-G7=HNXzxRXYMO|g|ASZZAoAJ!{L(=tQE<-o2>>iN+`7>*r@|c%51sErbq3-Us zCNxTYamscsZEnr=dU)A#F2&=*#*G_G)P49#bVXPZp$;+m?_xM^I``8mnJSSc#8Qxt zb};7utbM3QSTk27RT`+V{bv3@8|JrVvB)Qz3molW?vl3;9mXWutuzObv=Urw&KSC^2{f!d?H#*xnXj^wU9A}=-Yol4Wy@|= z_KcyL%q)0T8Ef5|`)8f3xtP{bC+Ueeh*y|Qn}C>x6XX@i>5RKBdzQaTXWl%;`rEKe z?+jCIB;A27UAmYSEa69Q=jbzJo>De;@SoZfdYt|(0H>a|_&R&_`@hrhxz^G2A5hF$v=uz6E@oEjAx$f9@ z=iz5pN3Zo-v3z+zdgSXK>f~Fw&0e!+#_KK&$Js{X?g0Z>;$-E8V|(O3(_U{_xuH&$-gj3IYf2}u=5(vo-Cq7wE_K+lQ|{YG zdL`0RAKKhs2I$j&oNtt88(oF@bLWZ@9|uv^E|y!Aryk{uBFC{_eg!N+9|jYlrkUe; zqv~0YKFc&rPq`-eVJ0`?0gkYKMyXJRoIr`agTXzcgB?f;_B!m1Xwa(F02A5BfEzPX zpRHQ8s^VWL=QWsnT-ST~Utp$h75_zfC_WReH>xEI&-@iuCbjGkD(e}DY77smEj&HB z%)&hwxjoqH41`;w9psAwX%S<3cI$R1WI~QDuzlfc>y|8$9k4~MT6g?TzdW(e`(=*^ zL#OuHuf|M1@Oj-DDK!^Zy`l&AYNBoCz2jAUT6OgOwGDr(l-=^5zrDnu{&Y-C=!JWU zo*mDUk|4(}qTZEh;r$Z?nMH2m9Z+6M$Qd5|EL;OgOt;h0TyD&uL1;L)Ny5vU-XD{_^Q6rGG z(+XpVCs$f!U8a$dQCadjLZM~u{?TknQ$S{B=Eu(mBkVV+=t*p4u0`HFWf2MLBv361 zI*ElsyZ)AC2y|VZJbBWkYuAg+7ARf1^cILfTyNr=YzEdt!l^g*$fVa+Q&Cr{QLd)S{yVrycDcqB*XKem}Q z&UtiLsQq%=c~2l2ZH2bpdur6IiN$0GI<4KP62gbBi14J$(G+da&5Y5wzi*O)VaE>3 zwhT3dk7M;rHxV@1`{uklO4+C1gWCRQi@UE3!yrV-|5<4^X>4m3b4R!CgEeUrKPfzl z*d|8Pla}=mf_iF{U@){G)E5fzJy(wK|pknpZxgo^}+`?%HNQ?KJx!{?$Q9b{-Z!J zym7*jX}9#z(UJT1wNPXr0g4#ZbNu+-%8uT+g*q86lEdkbJJ;Ke1VY+gnz4c01~l5X zJet@AjUu;6#Lgsz*%N^B)mtM4Q?nsf9eh}c%~t14oVw4hc3FiFIR1#aK7}$Bi53J7wW<*WNr>P@VrsIk8MT zA^?E1Bq?(hULN)^wfb^UzIWkw+_(QEyJ=YWDM4G;sog0XVY^t8N3kgMxTLcuug${g zCGo>A!i*}#ES2r#s5&5qHeM~$UDzs49BscNrWckD-1yh~$!^8sHPui_fJvJb*KcrM zl0i$4lZm`$E2VZn`N7c>e7_vHSgo^3JjJ(tx)Pg(CpS#6%34|L)1h^W+abyE;nLFKLKb&8J;MF9#3LfAvh) zQ>PpY5YZl}@d@2cg{G#`kex00`PicVi%+@RBk&3N*F7-trj?jfs~Ht+U&}HJ7zHQa z!S{1v&yl;4yF8%!M;Enz)8@@9{QPQ%U73E-H~+&8X+JctSUe0X1!RrAiWe^)Uhl10 zjlr-1BZ0Z)DBs`!ys zT>RXZBm`MxL=R}HXfB;}?LfHwixso>Xj^-k9Xz(Z4sqt!bW*ae{*Zg)Q?8+Pt5@&v z`RAWoxAm)LUJh?c>S?1w37KzBh4!qV-tBw2+@?97HiHl;Gjn4>2y{zm}3bfq$|9Rr9=s^ zjApR@1*G~VQ;N%xE;q`t^OK82TGMF z0fM=AFPrkKi)9{} zZ+zX1F|FtBccGD~V};ZCir;bbH!sz-*yIEGX}rNOx&BY(%+IuSb#pRm*j4hs_X9TZ z1PC9R1|jd~$VW?;E=4W1TJ*w*F@pemE;u^8yQ&dF7P|iyK&38lD>__0ESzU@yj`($ z>Bbi?rYJkTibMT}bu{OpDn=8yQD}o2HNN3)>1k4D%3NXfIS=M8TzNlM7IEc-Kw}*@ zJyBc&NNVhTRShbSq%y{D`q+mr5xtM8RJSI0cmx6;Z(${#=Eh%kVZJJ>E&9XXCzO{e zS<-E~3-m-@8wgA2cI$>UYkmt?r+H8l{z5-BkPfGKEp%;0;9J}ZAi2THCs_%D&$u_v zzHgH}{b~2er_zwjIe`b`#oGTmwj0%PE-i50hiN6Mxg?$k8|3U}CTg4HaWp&naQcrq z*lyIxlI6>bi7qw-^sod#dHI`n>fAY)n$UMZ4@zi_-}(5t78lU0pOKpreAEq*#||2T z*LEG|8%NBr%3mrses`y&rF$Y8dX^l(;pVX|V(^F!#`^ZwD)N|GMq|n^WnK0?dX?n! ze2_j2#78C|R@ql5@8!8Kn^NHCHy6j#nV)oV$sIDxIFOn+5_tdFtw?1Z>1Y?8X5R2O z8hV6Pi-t-N6B8q=v=wXC?4VA-9>pfvijGomW@6A|@^PLtbm&kaLkZ$`FrB1&9ZYpm9y|#tLS!pVs6QvZ8p{+`3X-I z*Ic|C@ZWkyTbNgNZZ{y599z;sPVPImC%$&* z{M~n5O=#+iT=TkKrDVxIDXn&F9-;wH#GB;IeT13^l+L{<_$7FS{6k8)?Lt=mJI*{f z=PgVkF(Sr_ec4WKuko|Wyf)#yMa!1`IZwUst(}}1+qKbk$3bYbmn^sbcx$!zNAu>* z`{nmrj$3QJ<|}9T%y_gnL9fwh-H1x9$WV43eMA%&_1xaxeoW9B--X*(rcW%=>(fg+ z(|`D%tCa?G-9WNMd?J4isQ?XVeTrZh=(t{<=tEaAPjNHNw;+^f2fVX_1v0Yrk{kyS z+m{;Q5|!PT%*+PUaz8)EZ5ePUg9w|aXt>bXZ}4~(8G{OBQUZH#?*qS9X&cPbJwwsc z#N+G*e5VI&Gsm{0*N>4HQcp-z44Panu||y=%h#@z<9{z2R=xW6UCxsX1PKxUAw2l% zU7myblenpVy!d7Iwsj)QGk{)RehhGu=4=G32&doE>*I+T{cik_YP*`1nzQ0=a`s=t zlJA$hT=VP|b zD;0l=5cG61>o;7PF2TY3?_bIq?Px%aynbMBXmr;hFnGF{VlQ4Sa?KZ7xSc(bJ$L*S z=;7+q1=y_j+ffb3un$EZfaqpG+xv~yn~#&UDuhh-8dp+ZZHwQAKW{a|{25EwgoSO2f% zM#X-*^_1|koKGh+yVE+2(-zylOQYlP7_zh@YES<0bx0!Q%@-@rg!kzBEUIMBQoASF zlZpo<#|P(cJp-Gih$~g1!elAlx;a7_v#retCI4%n}v%ljlDlWO~a)1aL z;z_%F8FbLuKW9FBVmPSUZZE1`yf&G+Ma7{ z+|!VY za>rgTle)(pPukm6<9&FGwpo|@c;DZ$QoRDY%aWwcpFbZMjR3 z%r6%g#Vi6ENNJ8BF+%7%%Mq42M0(IGUA#4$E^_S|a}G86Bmd8=jtm>LC&^{wEX_=v zdav@~r+>Bf^?nFI3L?7CKTS9Qu>Y8#Bo0oE3_B3#VZM0Zy8a=>-DD$6?xScZM`rGC zeVR;yEtr;0JBG;4|SnqDxx>c^t%CQJCA}JGuwe!Pwyvx8(?(Y9p z6U+-F)ugTzzk(jh3a}@pLaEuH_9t~^OZ@^C(uY4xTR1$WJ9$Nb$@;TMqirnb=yv#T zi_Q!+6fAWC2kd`zMmYDRB_eI`^6th>gs`g}@Igh~p_`+lA6Y<7W()8#j>0SN7n&Wq zu}sAc8N?YDcp_ly)=_A3g8PRBet4M>G@OA4FMj)FTTLWM-ep6oPYB(GkzQ8H=Ed)S zFy+$WjMMeiI??Dd%9DPS?mAG67FJfh`9ta9053p?zq5lm>+j`Gg)$CLAvD3wJkFNu z1U^h@jY&zr$ZYwRP`}mzOZo66ON~6!yonpeEm3p?gcHf*l8?J>EZd>E-+Q~^46Sw?R_B6y&J>iwcix9f~y!dv~~XP8PZz)f0Kg0m(6eeb6rYGic?CL z?zQCvRoJIp{`IsU*DIx3Ap3}pM!2W>ksKYgFna1Inlk;hektS>3Cx(&7J z)X@mb4}W(8g_w%(7Xz6XX%`D0XW{6iq$Kq-kx~2yctmgT^x3m#pZ7O`i+HtoM&1A6 zJN98GPT$y-deuGDsVR}g%~=@Ym}_;Je)ZwH-wzZ-Q)SdFE96LhFzm?st9AM|gz^;_ zK%KV#UKQo>goW@A8=T&xWGhy$4pMo=0k}d2-&kg|lpM8c*B(g=tV{Rq4ul|D6`l_NYB7_c-}NB)OayUAJZQ#~^lbmNdgyj9o_hts zi1>IU78XsKgdKIGK8}3#puTgzciS@n$Y4JMWa;JZ<%#yU^s{O6AsZ z!S6T@u4?l!^+1zpMT2$hlz;jdN{u4F5R{5RQg1juDDK1L+vQx^rw`z|Hw7_QR~K<8 zP3$~RCQ{g3`ar?RGm^R%kKyM%5~#8m}e`o8X*9O4}XNyIug-5T3Vzf6F*XW8TTlbQU8(db6eR z>#Wp%H=fanzP{_6XYl$i<-ORakFgGJc$j1+IQ z9b8e@Ja>Gu*se&k_G!F(ojU$L$Ibh5RcQY%V=;$uE}gX%K&|QMt4-}<@o-)ARcDim z2uM{r!IadXVHAEndQtsk*l}lt#4gGF?v6%HWzs#O$^_}nAzs-O^gR_oh=F4A-xpMB- zS#~Ob$#iwU{`$g;>D#Fvia773yHdjr+FYZtM~E9niv|rI`JGP1eNK=g39&LuBD7kc z&`z3;z0qDhJ*IH}u>I{!T!Z1-S|GhPq@$cRln8wz&mWh6^HZPSxlclXusjD;bE2a= zAhKF?{LPy;3tt;k*`iOlXa9q7gDn5ons;Mr=Jh{wABVO59~4tw+t&?SH?_0Zp(nG2 z@Y6fr&aLzvm2F;rQzq1XI8Ppuz~76Y*1QP=&2eAWIlDZ;*)EnAd||427eJH5;1igQ zqwHI*YAO5Cy9a$Ug!7bBPs0gsO#s%&1UpF#=u3?2xd60pfQ>Z2jku?;|S6eu09q{L;&1f!ThEGim4R-5|MfS(OBTf zB8?7Jv#Zc*;_%4!a;l#{Z(eUz#%0QQc&^8n2pwTlGS=xsLk8}*N6>a;l{APF7|)ACVCo@RYPs3OArA<&;!-uuH&dAmZK_S2nYT>_BUro>GBnvxMPCU zmMm~kEHP+ zWxZzWO4UFnK>zFrHhPV0Y>qhB+X@;Y*_9AQI-aohx}xQ>=OD`j%TC45A8+qlMei~8 zT$G~U@Jj*55PFA9Rs#XOX)g*{c@s)-X1r#{WK0`Mr$xzlTr% z-?w75{C7eA|D!k2BECbn&Yfo`0gX=vO!9zw*TAjatHmn+d;9}9bJ4j;$Kh9scP?me8t5o@& zqe1F+Nm@V_9Z1$~8r*|Zeu){p5Wxs*H8ti51SikG7Wh&WDr#+=nvdVm%+Tl_YfrQn z&qfcfng4-xlje{9>M5j~tBK12eCPgs3p>pWWJpsGZIR(r&AtPE<=_Rf-vY55 z%rN=#40?sz!=Cf!KuW%=_ekU?7$NR!Unb*olQan6Fw)X7u|gzBOj zc-OM&>jzJJ)T}K{JjKd2YsNfE4PhMlkBKEql<3Q>k}UxN*IXCmR{w8gNV=1pjkYGh zgd*3{|NgtW9VKV|iIout;EI{5^ch(aSP4=G{Tokf`MPz#)6N*l+Js;iuL<`|SSxd2 zO#as!JGri3P1lE`sjGz4v6@O1FTRno{QB6lK$OeVCvaD?ka2CNs6d^C#OPvE>_IWw zywfukv?!0@)QwuO$hgvzL!Vxme4s$xk6qoGq)jZ@tK)_5%D83Td*PdTpK!jQ?W>7% zb1F^cZ!KR<_~&m=53Y^*+TN;i@mpGV(C`|K&7~ty%Z^R+=FHF&aE53e;nAYINRk^1C*}Ifyn?- zMqJ)C0ysRE1;Zi0H(>Vbru>q5rNk;yt&!~dI{89%%z2%hTdzrz zCdtok-*%Vtrbr}Ev`|Y=J-E^=!kBNhwe|Ixe|q0qWW5Lb2A+6#sCw!LfFEG;TZ~k@ z9(h3WlYf{>H;Sf)AELAppOfy3Ozp{N1CPFnWPrl0BM=(5Lu&2P=y0YsV#`PkhBz_LRd_t`<)K`{hoGe_)tY=JGBl;v7GXf)0t6J{Qi3iNkQ?ECxAxPZmVf}Fd z3hZ@8i-rx;ibVtr??2`1`{%#>bI{IV7jpBKuao7@Yxiq!VC@d+w7%H9oJ0Ha*m`-a z!iw1~jd{HlIx6eq%ARRvM&u0hKl#5&0?+h+XJ7yS=#l^b{|{g0S~<$y-96=;b#h;z zG32%~LROm_U$~qzL$?G5KG?F-#U8Xr-agbJ5(^%{MXCGwQ|Hdb(J~2u7IG5V3tfc= z7{!2vjIG$uEFDNIbG-T7{mg|F@XtO>g=8$Nc5)wxGL~fK0!bqV=JCFnf<$Smk!xSJ z&0Hdym%5$wF`+{JS@hnja~>+s#Fh}D3d9F*0Pg|2zW{s$Od~{`TA|GhPf4Z<+HlTBPnOo2eV^nu`<+mItFbP50h;Psq(DnA@;SY_dt*U^A-QQPjfc0LDSku362 z6PIH_ZH!KxI%SXOPwPp;$ut&7J^^H5m#r~a5iBA0H~q|vwbuE-&<0SaiiuDLf{+=d zVx&OR;?(Ftb@D%yoNVYuC&cwj)?yS?{L_39w6KuQPZ<4LhJ7 zHIP6`)Om7y{XXYA!Xe)P*syO}=`+=8zt7t)cX0X8wp-z;;cXc;`dwX~=F-D=hHcCQ z_+xeuTn4L)TC!xxNA`XVQdb60&X?ZTwp}|HjF{O)ltiAY&!?700Z>T1-e zn{uZ0^-oJt&+VWI9kagd8d(vmr#s$)z zGeOu0ntx@BrE`4lcc8PJgp44W;(X`Y=tD2spI@aK$v8`!t$87y%a*_YO)q*pK)6H%D4s>%5y{&NnCTbS)qCX~BYB zO;q=T#ExeLUfp7u+7bhK92p}+UgatSy%v>k zQhRWJ#6x}Y>&H@R3sYuXX!A!$VkRwSN6$7-X0hK_rXM14FLz>K)f<+G=72S^7urh- zJm%m6Gdz3zS6VPmX%lM}zC|_hR%o>mC^wiEa+hx1F40rD%_t5aTPfaK%s`+bEP?TP zHa^)|2`^8BCH4j|R*xN`gc7!QyysHo%Ue{fx_-K1h)`PrCWt^pkR-t#PL(AAI=37) z)x{&Xw&(9EL#Mu>m5SFqRj4)E#ril=3KM~sB20t_wYJf$mrbx@mAe|W$FD`=0gzUq zA*Bx1XisNTnf#ah<|6Ol`?`@e|CJ0JaBcn0CSk+2cgl8!`o%413!49AP)Att>#a{t8lMxwu-`9dKepxZzKy;DOX zmYYoM;DUx11?T?yD_xg43(vF9DUb4GEP3nc_Kl;rj0Qta;j}e|YNBCUTlWLUoqWK; zFw=LJyvwf)TOSA6BaZ?Jr#221JRSg3#F>ZiVT$rUX)q*)Iax}M`pq}rG@Wp_o0~t- zy^=mU{oP;{s0Jk-r;Q!;k)f`Oi1UUGb-!NS4YasvyY-}zpk2$BmAq~=9Q{FqaY2o@ z5y_}>{EoXWJ>_mPs)v@D5+jZ4+h$W&^}$4dPKEs9htV#;;kY`DJ~E75Nvb^Z@~(}P zRw6f$7M?zK?AX43hw1By_KxyyGvKV|o=iT#2~n!z!nq$kUhDxw-i}kxyXhV zF#7h$PLkfVn}1gNkQ-y78?`V@ZV+~52au!9n#kku^_n#4gFfq0lk;ul>8ZIlqAWya zKXaD53+6pT3YRk+Z2)HcTja~T71i4Y?$DZ{29VVT$$s>dWtUI4s!_XP!yaPGeDTHE zelBpaz}N$@rKbtXOyYX=>!+q4tY$bm=$^-yZHXHpkmgf?c$KY(UVrs*dm0bI?d3tp z)_>)EweW^1XU?8oZq$Sc$m_BIxI}5LJ>Ro!R^Q0tH;-OlSnac;gU$eZvp%H>0ea8` z5U54*m%Xx|SV4r%MoQwKp`^@2C02Ej8~`j=Dx&*)6I_~fj(+U-nc>FyfGt}_K;@An zRc2_2O-68M2kaTXR3qP6(eky8eiA=T;w1Ox{xX@EKFY7Z?<$3PYSl|%J(DQ1k38SR zE=$T9|&9NWp|w8u3m0mQAK*g5DwbdT8oLhEk3Al47N^LM}n! zl}J~M5~EE^i}VhcvuZX7$sL5g(k@n}!zn4lJtNv#7Ww@1-XQ$a+Rd6Z>&R0R?B0(c zthx<4OG_T7nXN}7E?|cy8(2tRbrEmP&W2^CcgE9KS9|5~b;JBQJicIAQdYP^c$yEplK6DWt(Dst;4e?KLc_rjyeKA|`P#?HQfe zoaDo5U>U>XIXj+j#XeGYP;C7;a>b{W5rot&Sa43opZsV(*-d@ECN;u2cM$ourff?T z1Cd~L^OA;~k9MSnU8^U0{jHicYsyMS^)pHxbYG~AM$8v zfJBTM()Q;!gUZgl$+nn4Hoes77H}QON*;k`|M=rA(ta#h1(IchD>WCl*~F7Ce0A@Txe zrnt+x)dawJz{OHuef9nF$(V=PP4#L-!*4*N$QPRc==#zYYy0f7+f^FrBJ1LqRhPD$ z*P-!-_TzAPZ9ov~%7WLNsY#hBy@jv|6%`GZ?u=V-+0-K(Obuv9S4Oo!%KY+A-_%cb zk&WcZ7N@l2c=@PX?LLt~e-s{{J<*TYqAkujQo3qYuQx7qTw{r%Sx}a@v!=ZthMo{1 zRg=WHxlLT!FUtt5Ito!C7M3EoZLXY=&_UzR}j#t{_^FdBWfdVISL zU|y!>UR_>LVc43ekfhr0VzO$ylRQw1)i?rb5Rc*SbmwbvT5TiX=@5FN@4*t+$wt$> z7qfwdlX3>2P$+MmOMI;h<(hRJ2Tx!p+pwaI%UO>ww%EcOXa|K4W5VLdvdLs7Jbi6@ z4MEi^4`FT<6DUIvjqc#uva<(Eff1TBB@+WOK1b%z#IjyAIyEzA-SiAQxy6dT?(B7V z%bAspx}Ki4QPwR4&?QD;Wu}S8j)iayT}^yRD@U` zzIR|iFO=Zz7(P;vu94{-o~ENXjOCCZ@-DnyTl+|ha|XkUnlNYOaYw2m?c0img9fn7 z96ENKB~CBLt%_x!`o3`bp8Oow%I6qF2V-{g0nrDNIW{dU?Cf*qco}9MJg=!u^w+e6 zA#5nkap~K{|D3`UrM1kFl^=`9p#Y$hkfpp5XbcEFk8{KfaGe@*Qhd`H1LF;%gG5Dj z1ljModi82D9NjrwvQTY~K3n7Q>*Pt~B=9ztQHEzdpJ8Ems1@nnSZANC%Jh16Y55^t z`850xe#bm<6f9D8Bo|Ex>0^QkRdFcB?-l=Gn%=Zpcd8!mM_{-<;e1>5H|e1pLwkIY z=Awsl6KRToM2g21UQWR)u6Q;d^LzZ?PaPAICswXpIg2cD1dk+-C6jD2ElcMsCrRT5aE|df&%0z3DQ4xr$)%7pfQ5sgO4mo7nSi*?9up)&@ zodqZnn&yN?OBksTRyJw^0LNCzt5t)rAJo&?HRRjP*HV+6e9T-=Mbq7jjY zNz$$%CIN4bT!f*0=hm&7{rV+*oIJi@uS^v}^o^9f;Jnh{e#FX|B1-VK^_n-2U-eTr z6GrW5Is=r;^G7*&sGrtnz@f6^w&`&zfa;iQirn(}-*!?ydg|Zz|_mrSGCgkRFUgG4+6iBH&O&%XKqejnFm7 z1ByGmuz4U~8w#ChSh7K*oo+(WmF5~h=_GaAm~tIn_H#;ilgJ7(#IS|q_qV$-0>exJ zM1-7?EVk%pkdwq_g9Z_Y0BQ$H*@~l^tnQ}18&lzB3CLo98ePp$YC@R>ohW&%yEPke zc$lO>9APR`;jCuCGOt^&UKiLAjgxw%Uk=^O=jSadjU~9ZZW`37;oXM(06&^j*d8LGUL^yx%N<845qs8dYR%R(*O&&}u=Ixresp$#3RcbgbaJz;Ha4Fc#;na+JOS1TTcFE&pJ%J}NN(J?G5y5x z6M6CN62$C@`187{Ws>zr!Kx{duhW{G7EU4i6&?}dm8cg>Z=$B<1X4Fi3y;Go17OXcL39WWQ!u6@>>y(dUcS)q6+2lG|52~z`?BZ4i&p%tOU62)0 z55R?{UQhN6*J#z*_aA#%!)`mM`W-dDhOh;r@pzNwQbL`~wiu<`D_ z4!ubcApx9c^HE?`(TfeK72Qd}Qs{&>UZWx=ZnM%aFU zzE{@qvV%p~H)YI7?M5;sdA6V!K?oX2S+wX1?CHkYJju#Z!{2BpgZ1TQcRQt`FAE}n z+yhALcDQW)uq&2iSF&dTyOaz)^n5FO56Y(Kt2 zdojowAiDu{HS@QSJNdDzD!i_Pj|7G%eq=>=TQ{mx=frNBqzg{D@7^;ipw!7?gM;+GVa2SRJ;bQH@eRuudIhXHclXHj zzeu0+K7{7^03Z#^IbT){A9(PGbGxCPb|s~^1YP%|TDlrAnqcqu@FC~DYbX+mW3G)? zTe3bH?s|mKZP!^ek{K7i{jxuAgw38PnO@rFYPG!(}7yvaj<542{z;VbKH`CMC?@WRy;6wrJs(XlG)*su>0Ly}t zdFjyGLI>q#_$M!>(JwwnCv_A)GqON*q9DA3o^5xVH;<3`u@as1Vg1|XzM0UK{9q`I z5?$*E9^;ee+p>~9!mc!?YSv?EN+7OlV{M(#7=wld)cZqe$oTQh`(x&3$qo!d7&Sm` z*U%GH!d|?3H2}P9xULSlP?T%v?W{iWk+R~^2LS1Ijr9J}w?ts=Prffn2$i!P(+{VM zo6qUwNbjDIvz3EX^kTeXB(m3Kirh>}aI)WQeC_%EH8`@|Y)6v+8D+Q~$E)_z$5t}N z6OGKlf808;J&qbm$^~>~ zIxK~?qKD00dG$9cIWq3Lu!M*;s?^j5mCH5>hS%XNKYF~6x89*eu=?Cx8=s>E4f~q> z?mM;|{$1>6##nX~^lpUhL9f$}`>l~ajQgpeX%kd4)`6u*UD)uW4rDah@}cSc)h!Ng z&@vKUZclxHXCmv%2Rl({QS@!TeA!9%TCB{M@tdY*#(XDJKyj&5a5KGJ%rE01R$fD5`=O4@QT>zqoJ0-GaSB#y{orf=b99v)xZ!)L&k=DvP!0(o z3n-EKFzh^igCXh;a~v*Tv&M5xA_=V^W0~FrB>%Z7^>rtr4BtEV?@49$xRiOj<^-vW z-~xCW3l{Fc>~*`THtm&dv92oEl*24QAUoB7YFu%MS$W1g*;A(6__3g}Ml>FM=m$2< z`F_{zM(Ej>FVFq#5$$~v5%7yq^c3juZ$bdxY|7*B$t`V}Y$*GIOK3xmyfG9t^vYb- zE%4)SS7Gl~v{H*+pTnCd5eZ_cAycM4b&7&S7xM~`3S zTF9;&#fkO`EUwm_2Gt0BeQt#uIZ|R)i&m{h{yFP&h>XkW?Lc%|fexCSNY10^M!t{C z8Zrhm*dHT4`RGQm-H~=P!XjIcud>MENYZw)`?SDtR}pIpW2tH+#Pm#Rl2h#Ddv60l z*NBTJW%gl+g4L#Ykg}4*E2B5*qtT9$t&~W+<<|`#uH2VSTMoU>>lfm=q*PdY0$6y= z@LOPs67R@>QDi1rmdb%jsdE)>w|~1&54XDzDj1N})OTBYiK8J0X%f5mW>3-^1tScF zHzt7#T+RBdG@TvL5y)*-$tyUq_AUr-z8`VK88sYAB@Kq<%id=VBCP#--F~OV+bIF1 z8L% zw$ImCEpOYpwX@0#1!|Gmsb|FP=P5{)Bf%oMErdutQ=-2TJ#a0^tXZ>LiCRf9F1L8W zFD&wm?nV1-=~9|CrE&s`RzEUR?uFaJZR#5MHgEO^Er`8C&y>-@iLTbqDEya>avm)a zsDa37A$BIs;)Yl;X>2o$(cFdAe)B_2v*X)vk^3y4O;rEGYNmQ ztO0x+Sq$Q-D@J4bxOor=PU@@2TQAv3)2R$sw@KJqNOJLr0hVxhKklF@h{U8 zA5zHT1+<-Xny}=zb7y)3pD(Qsmd%YRv zp;W_Tz7dWy{lzY#B9%r_&Q;B~6Qw0{eeRp@csScQ_g6NW)skPr(c5$S3@+2X{@hOqJBKIngI5-k1h`iTIl_*hz0Z7xI zuRXHKD>*Xns_7t&VpLz}LfHO}I&|&}LtXD3A1%D%8P98*Ql|J|78QN0bLz2kbn`}H zspHK*$lgj8Ve6-7%#$3O6(aX07K0y=tCk&f=cRzH$`tnO*;DZWIPGEM2wof=4jjA< zP*Tzo?CWY;q`R!AbcH|P(wvUf~l9%Yde%QqBW$sFU#oJ^X}cd z9)}uyW~lqBaAB7n*$4jdFcVrxL#BL(`IFWgbqbnDBW=pR21=n3>ti={!ICahy$U%G zE>;LH0jg)sUI#I;&^h!6zR!+gig9pAfmkA3C0|%U!%ZT1vEwDu$G9OuuAb!fDH1OVEhO_f zgF}qk<6y7j&Wvg>&^Nb0uRX>(b?Vas0^f@+G?pCW(+xr(Ag^trFQtmvq->I0q+F^o zXGY;rlGGq!DYVw~IBBA)#$h!%5|Jn6yqUVFQp;GUi_g93iD@u9B-&|iQD@U348&|T zSaiel_g(AIO3WKp0-8UZ+aEyo^F;PNCBV^ijkC! zCRx376*u4j59q#fDV#vDAU9MonH62?LMFqP*rHi8wE(_$nSOXi+m&)DB~J$4h@%<& z)(j65K`1Gy^qEXErZvanhLV)N2;b$jI$PVc*of9~lats9?*~v{Ee|xKZ$VvxKuiGqeijK6@KCL{1=h6^@ej zvcKpp2l2$z7BS7JIIcgZ1~_&HNb~V90~Wphd6LyFl1P+@cbv~UnedBgXs2qTF!w2iMd%@d(rDzldi7>R3FKml2?cH?5c5~)(D#eGgqAg)3sb5PnYxF zmYW;?c=H@73qe(!ziFV2;YjsnVy!$G;p)onjc{Ogb-uy~wYi6{d_T%lm(_ zN(x@8Hl5&Xoq$98?S`FQwUJHu02jA-wVbV!r)vcyunx13)ijAKXDIb;{Dor}ef|CI z261CSre0CT2t|-@fq)9N$mj^4f%c%THYpO#fQ+^N%a+x&QxZ&ykq1A5bFQz@+;f{A zw$WHFG33#35^_18!tZ0$Y6ttIO!u9KGUk(j)#L<|F&#!hLF%i~Q^GR!8!5eU@fxvw zg3rDQ*`GwPuB2R&OLC^#w4#skRK}#XE?{`mEWY=W_yXH<3$yY?9FT1?eU{AA^>@m@ z&ARdvqQxLVmLClhPvi6Km=HT8fv4|K`O-E&H>6JNFv7xZIdJU3vKNYEtzi;+I;z>wLv_+Wou=J=KH3)BAJRS{zX~f55oBc76cw1b z3#@;vDI&5De{2}@SF4QUr(aD|6ZkhQU&)f(t~nR}tyRWzR+4NgS2P-&G^OR)3J(V6 zj*b0?7C~G$88u}1PdXT?W&~bF@vLTedQ-kl^rsy!d~@H4?3|6;u6TN! zv$|1r1J`WQPAT7Kk+Ou%nL8R;GRL6Ys2)15fT*>>jn^msW|ivQgbU^FbYB1Q(RSs! zes&|A|G00H`*N{xKY(E1K?O>XpT4fHo5aR|rGnl3Hjw6M=kG0Vd}f%um=@v#js$Y{ zO9Ck1;g|Dzp#BdnN%a$C@=jNUYDevBeL5jWnIVfw%XLa2jW7~`f?e4K^4o=-z72W4 zm?OhZ4djJCv}oPBJ{1&bG4bD#4N05d;(o+^4}}cH1You3ia$FN4Co0(597l~z|~+PS#6u(wyJ!Alxn@%hjGa>#%;O**-mHRHDQVRD$?Q#rbmI%^h@ieJejvFii_ z1ycq6T%o3N#F)`*oM~%w7IoJyMx>+@B7NNudfzD4{KJ>7Oql6Ao8(k!FZIw0t@fRf zue$K~;0VWH7Am%q$V;LY!R%C94y0%V$g^m`AXCg^AMpK^_;x4U8(Up3_t^SIZev69 zzo8%Nj?vao>I0P=n$re#!+BWCP&$Htjos=`SLkPQj9@~fHy+7?9A(+BJsO8^II%bd zs5}+|j6N42t|vIODI>7E6Hk}qz0UoJIbGtb{z6!==Z!_rSB&hi5blE`D4;4i(RSsv zVHA`DT0sl>A|02$kYuNOwYO2e5BU-X#8Q8kWs_R1_Rs!$5yw9nxdqKin&sW$fFuZ2 zpax2OQTwAC>(5+GpTXs-Zc(id6Rg6I`zD<}le&1X;IlqG+iu|)6NOI7sM}bx%Q1w8 zs}4uGN%K>kR8;S8jx}G^t+q^o>29|gcXO82-plF7CZ%R?!ZA5vE%6SX6 zQ;LdSR;+T`nr|ZhpWe>It>^p;``QR}6p|jux>hzqaNWwRcAx81V6; zt*gb_e8g;yy&)GKEQ+~&RJ4(pn53~vij@{+sfXlt5qroYB1aLyvG7)D?t+JCrF#-P zA%X`lWHkCWgKxc}EO580PS-c@-$x5G3%M$VXHYh@e0P1A2%{;OXE(AqgN}YD$gBZ* zg#%asNTQ*^=qqn-it|H4P*Zp=@9m-e=ib+Ex5}C<(nM4?HKjByshv-TN>)~|v81Sd zYioqFl6W0TgJU9vy~4+X^;Zqn^#R}0y~4o3y71k*9%Q+|P;YSMG9*_BL$MI!o;TRf z`^osZhY*K#`d|8QAMLP(FOsp!kiL@ZG&g@@p551DC&U2}tknHL$;$9DQOi*>Yb=Kj zQeFD7!8M|X>P!PHjk2W4WoMr!)HLYOWG(ruh0Fkzp{r-9JHaQ2DHMg8)IXyuv)#Qt zdD}ALN!Soj)zLpx{hOzqQI3TRKa7^9Bdf zj=bj*EyDUqg=Z%_;h(>vOM-zODDqmMlABlFrUUhJyzUZ1cHF46Hn{-LD>@PBP(7@j zrwyqL5w3|JLk>}aI92#OA;sA-L#Q+!XH0@?9&<`#i2BBe(%QWzIWx*;HsYQQ@v^5K zl4pV(M7_P2(nKzZ%+QhW@^9RQ3>gwS*!}&NQ)|2hv81Rpdrh<=i7k`~bGJV`JKEm! z&3%1ANZhvFk<>JbaBKY0kz;A8D!V6yq^RRCe2jOVRIuh)uWt^DT1%p-dz5TMlU?jW zpe9)W^rKzuWJo>y^NdBlrFBT=w+@zF)f~s?zEmp6qfpXE7aHu|#L$2ne-TO#W8EUEJiWaS#0_!i5H;&rP{QTO@D@3Az zmi-|LlW1wEi+{Xz>(+g)2La+@p}H~l!a-Ji4JSJX(QwturT4Njm6ZGv5`JC`6FNuB zam@B;60@-)Go{(Ece5scC%w_9iQ{ozP!vIOzexrJBwQ*gDw1p-V%-JsJq_YJ#$vFrj-_>oj%ay+Mm zG=7K0&y%Le;8VNR^L7IC+M(cVEK6lv)_;$GpQ1lr=|WY!8T zBllW$ul+_sPI^9K;^;3Y-BmMwkFxbt8bw&!8cYV2AjoF7yr&!?gzi0;jCDfWERFGS zXuG7})f&WuyCX3=5@N}lLE_DDOssJ+a#p0|7s*Pv-3##>ukuPbTK zvI>@=)UOLGBaV%fsc7J3m8bd4pL04Hd?O%^CBQ(%X|E5)s!2N`$QB9E+^={X48}s` znV8D}ZusfH@xW3IDOR0S_s6#5|IvA}v6sTJJr5|e>zR6~2X!v<9Im|a>IT}BEb;`2 z2IxnWFu{i{6pby^@PuZTQ~m_?i7<7{R$rgOo*us(Zj|FyD5rv$wp790Af_QV=7z{ zv;q=Uo)mEqhex(s{nkiou(8#WM}XaQ^Yk)av_^^yP-ikpFN!!dihyPJ$LEH9sO&+Z z#=}rv0k`24<{&b1R6}&O5@j96)m1BFF17rbGHU$CP6gVpdpZfv@wSZ$yJHL+~^;JyR{R3$9<9IUKbzs-n;6LFWT_ zqy-i}jRqx}LRE{aq0^$f4}Ya^N9ff(mZkLA9qH{+pIZY}Av1sK#^J&7AZQn9hxA$@ zemsFRT|ivT{Vxvfl|fO)uV|-Vc{^BUN*1`4Pde7~;#1{hObt*%)T>Y!qEM3;LEa(g z2KPu30!wC(4JC;X4XlzL?$DU@XAtovA(wvqQq%vQpY5#C6@Ztt=919 zqBI4cT`pW*{^iTw$k5St^%NK4scNI7?c}5GVq` zVUn?~wBQ1`J)+~7WA}EsC!Rho2frb#7zzM7k{qI_={2=v zVj!hvm6H=i!oaM5I3pI{cc%h?!IRoU?Peyo3pU*t`0=Rnr;3WPxPRu~c6^i2wbSX^ zuZ%u}@;bMY#L-9tNnCJ6#zR>NL=jCpc6kCtb&zPY_vFD7NNx%`Fzw;q$BmKnvsSeH zKf*nmo#@f_jF9JibKLGODX5p3Yvg|g9=lZ7vl!L-)z2vGuhhPN{rY^!D)DOwgL*#B z`n%`N$$!4W`jf>uP{%*x;ZaaNB2TtGu$#o1kUuA-u#fv7304X7h)GNxJYgMV*r&uf zglu-6N`JDAo$T;1y`MQXhLR%J97rgFJ~RSLA=)8{BjV}>^f+p*qR72O-BJ{*KQ+#2 zQ)Kne@((}eK=N_6YYK0xJPsd^8r((azD!@9Xu-@nVyqutW%SS0=&b~GisKfZ4( z@=vOqV5U6&>sv0I7RVM`T()_|1?HiVwM81@LIfunI^qECz9=NPl@Ejh;q)4{1hC~A z)lD^Av5!{TB-Y+AT*tUg>lMqFC(TmLKwoPL*@csnCN;e7eO4waz1`}O+^a`m%TCf{ zI$NYbqzy&OAmk1)uG{eh(Js)=0AX>6n^BRZo_BxdAZsk<#@_r^{uVV-kB8?-vWy_2 z7|(IRAn13k)iOC%p{($Y0ZA|5FGNuJYq4JPkuq>q))Z03pxlTcIykLyKEb?%|6m`%5SF4wTA5LzH6hZZHnI+)jtxa=pH!mV_2r8fohjs zy63-r>YIM#PW(^jn&7~aPu|J-1U>|i^-`erqn}1SNKfB_OVMdsACYxh8Lm>vktE|| zZ#Ujpp>F7etz=-@kqZ}sF(^tNdk0La%_K+a=N7?U1QG0Nuw+GHzG#790E; zH*P$INw5_gp?ge$QALPT^(`&K@_)WxNpw-4lz7F1@R~g@UO4&Gd5s%WIB;&&g^!m`MCdc+2ftCO6xcS zAD_(L8MtrX(4j-?EqPaJ7yoo5xx95{Sz8Grn`oK%A!KA-1WUVL2?^0s0MUo>O57>+ z;(e&SHsEMQZM&unnU4+;UI{tw`lUWQ;oj_q4?leL=;ov(%h@%-KHHda_|kP;^Ny_M z{gGjR=JuVo!@{kSgdp87uEMdbBBO)9GKKs_wi?7TkSE)onAi_zdy1k7A{d$aim9`; zwRNNl-V*Z0<$2Np@ae+~GnXvsg&uRyo;@0e(jP^e-ZAgqeLG|tKI1AOv?o#Zl=Ci{ z__W!maV!B%jD2)SFib04ViG)Ww()`3sizh677F2w5!o!BQ207+zh6e4JG=+Q%LC`k z=>!#}e%@l*N^+6wq~4Ocn@_mVSn%9{>hi(ue5>8Tk_Rk3jVZhFIC63BXwobc{;s=r zZ4gxn4NQEx=yvV8l~x6cSU5K{uREE1Gid+r-7OI}4T4%@EQaxpo&NrMy?X89Pm9)V zr~Kw1RZusQM8Z^4)WmMMb6pdY&zlcjSr+;!AJg>;W&BZC`&C|EeX_Q6mBXvr$ceLT6JqD? zZUoAkg{{zGogsKWK}WT0-#!Z&8|fYu6f~ApH_}bstnYKpYn;t;nCCOFc7Tq0)~i;T zk9q8L>iqdOCm;DgTBy$k!`Fa3(plPu4I0c}GMZqJ{!&>)aWunW)pv6T!34o33tA!q zglr+uL*rR3C=rF)n+1u>#?MILHqPi*3 zu~@p10Ku46YXnep&sHr3y+#0rlc*gaGTlIy1A7*OAuN z3f#Ce@c>BvK2n|t*DlPZG9f*!W91Wu6~k`N%M82v;6W=kfdC-1f9=# zv)eW{ksV4_mXP}ehBcKJ%H;cpF3&_uSWs9vkbWV@Pn|M}8XPujI1gD-UaqUBcdhby zwAB&)0R#Rb5e8})HfvS~M41ae|8z~ru^Tz^I?vpr>%o%aQBfpqQlIoRFxU*;zY`6e zOqv;EZ$E?<0~&pocY$11AF$rmW8S1PPPnS*_N24Li_q6a*mjbf-Sep$M%<-H(8fjsN1ol%33M|H$l%v z-dj;}Hv;5d6g4eZ^+Ls2 zLJ`~btgINj@B@B+CdJk5M&oFSf!^jM?7V+}9EusYA7PLg<~mJj45+2rBQyVR0vHnI zPe24z6a%kK%%3kjr`4>{^tP8&rYEg}AhH~QcndUmog7~Aik`BHK^=ByxRaMnpVPSU=`Clhb7oeNw*$(}ZT&t|V zULinG;ObRk2_WaVe)+d=$6{l5ak2g( zEmH3XN*@Z0GB}7&X=z^ZW9<0x8}2%%=H(qka-@|1)8L6qpYClMW36U$5KhfV%r*mx53uA&8oruhf#0 zmL-Y)gNjw2p7*F>W2v?esLJddphObKcJyc_m2M|Vw3)yq9(Ag49N?N@OaqW1tgnYZ z=AZP)>(lH@NyZ=w`ZXLE`B}1|X{Mb%|kLfEDQwwpi+4I#J=G(8I z4(uGL_9|lF2E`LZYl~yj3zrlW6%C#+;Wz9%W4;rwt|;jn_U>lQ=VMlJwCj&>P20w9 z2y}x8Ok+mKe784E{v@Is?3eIbm^>8Pk4sfn|5Blb)XA(uZ!pb(7yE z+;L6ddTagVTjRNK(V`R4(Z%R|@H%6sOlg>cyZz4QW|0fXvi=QkCuIIH#`(~k% zp{1MRc%mKC!!<0Hc47)yA1*0xvJUJrV_8I8{6Uo9xtfo)4L(%A?~f^==i1}EW~GJ( zqYPSc|7Cqp%j^maoYmx1&#qlN7#jK$+yh>;?a$;knfK}zu7rWP^;#K>ENJFisX}eM z`txB67IY=mH;0|4c58=2^^4z`M($1rSvZ&BGiSDgEbN3~zI39|zGu&-LRCb~5XWCS z_7{lV4i{zT>1n~)RaH}~04`OaR#^&Q+ZbKZvU+GRa(pc0{71Y){` zq?z-2IZU3Mfy_(x2OHFwP-j7G_+97Oke*Ig{4<%TG(BCy$e|1O7S#Fex63(;^rVFHR(aHm{|&_HDGvStM4# zL@BNb+Kb!sbgT3Hud^xA1q)5kAkaUZf=W1abID*&m^2B1GZ1G1f-`ka`%E?H`t{1t zqORTi+@tjYH~5)ybbhjeXt)BNI%g{MJ9JQ5i_Z|ufTm?rYN2C6$~w$iZh2oXTWfay zW&82@jpXV(7bF#Wcvzny^#I@8uu-GKR8}ddmfXuO?gw|!v+(){-`dp#1Y#Pr4nB5{ zH!Y2eX+G5EW#;kdXolj(-j_|NUY1m*m@tK4h8 z!AS%USmSl%Q%zwrUq^Dm61;d*d@noJY(V8&&=`xTN5rT09e5 zC;)0`x8PJ$g`#CoJDY(MOv1)yGe-zf!>EZ9+Yq+SAw{)a%hVqbq|(E_oLyS**<Wh)~v)o1}v5{e1CbAADh`?K|T1HB(hP< zX}Bi*3cyCXx+Alh9P6lr=Hp7Sd!Nv|uVVlsEBD95#25v2!@{74Fa{D*ABIM{u^0=$ zLw%tRyeTcR&Rc1bf@e_5xOGc8W#PG{Kxyd~lVW zxDAR5hCPEcdO(@^$?+JS7JG7En_Zt0XTjPaPrFSQf@>6Rt^4rI9~T<9XU}y~0x(YV zV@HW~3K=~R_uyyS8wB>fJ^7>7KA%GK%gHS+MbOM?)x;opxXmYNsBYe-#l^wcYqzei zc|VL_VM)obv1411x3o@Gyrh~)IpXZuhYiMu&Ds(_NLpN{SzNw+*~0T>_72ZtU1uE+4QK3U~$!Vl=a#2juK!SUF$LX^g>Z@qN-g;!!^3d4cJ?vf!#^s@%m) z*co<9-6i)zAc`W4eSk%GGhiyc*vQ6kB}QPwNdnsp9ona|X7tFBss#kcpb%}94@$H_ z-}cm{7=syc=1fa~3e`vpP|*=wL`FucA_**-nwjmyhg;``1^fFqBFa>Icz5gfnA)nI z(9)x)Owpu7UjiQBHa$GDU{ls!8XiXY^Spdzn&(~qpA&SAOxFqUIdMhMO`EAxwP?2p z0)`gepYx*}S%b~XkbmK2@5DUU+~AY>eTTA(4t#$q`HjR7f<`ceRQCD>1k43No6TrZ z)WnD=iWs010Wy&d?P5kRUVOU6Xq-Ufl;9t)EHf>}|BWb@I5+U%!BGf9lu*TW=-hb= z>2kqWMIo8zEJ~6IhsMpE>8fhPYSJDuh_B`D5(ydYAYaxSkw_CwI{Ru{ED&}Xq0PF z+W|(Cl@m62+MClbMThBmfVWtg&-kjgC z8PsP)Q7lHezBO2g){9J=4TtLpI&fg?$&=kE!s&wh8hxZ_&6+iwmO}irYQ1{O<%mg* z=`AZ)h4TwMf!2xht@R;`Jj&bKl8ZZ=4x9L}Tk}08I&gNU&XlLFZZ&R^F-yyji)9dR zS84ljmHm)chpQj@Xqc^S1Bjsr!26wWtK@reEHz#9{2|UO*lG5`d)nS!qmjJP5MeJ$ zG$Ra>zy!9JejRNU6q2@~=}~GFAY{Nqj}00( zE}~>=9wH2vC$Z}Q8Lf15X#HWC3aX{&Q(HWixy@xzG#eDD`(!q z8x{bTM7s=!^MX{(ocob>6u9>Z{`3)zlCsCUN6|;yILW!M&HZJAFuF6O+(IA~M_o>{ zboANq4(XA4jkiZm9Mn07hLpi9V6!k=o}+l+jhi;f-h!HjP$UTCN|Qu_TT1dX7XA(5+X4H(@FvL=|SImOv(p zCeV6DCFpf~k*mzEee>*GH*!vYa5u2T31bzX-DjsuYrCh{f{IXRR9;Lrw#*)51TVykAnAwStVO&2OpH=^@qixXM{rf+m5syQU z0`N3n`Ci8$s39i)Z4gm1YR4Nqv#Y8)T(R(yl|OzI6&KetIi<_$(F8)fUaL0SHbE{h z*^)N!#Z=)**xvP@a^48ANz#W|rQQ+l+j=3m6lw(3ldK(YY&~QCa*qZ@)3@Pj5#&T1 zKi+_^K}n}Ez}uV@hCb;ji6Q+ml6BRLWd8v}ovf8a^{xrH< zEk?#Q!A!%;w;PNNd9Xtqc`;0YA^=ge<{pTU(^tb|T1T2YY{SbDa}t(wMPd@e4lTzxp6I;RzB5>6FM*3+=GnA z_4M>s8X8YtdrczyY}UHUJge;GDUF2-yP1l$`d(;kq0=-yZ{|jMUY_`q$c!-`M{u}d z=I+;4UG~W+XksXIH1^CEH%# zO;L!wvDhuyqu1G|wK>J94<5wZeJC5c*Sv23%trk0o=m|)(lJGy7#c`ty0Gw76H_5~ zd_ctGCQeMFx?iKem&uq(W9hIl0`Q5qFT|SRQmA{Z4`)>QDZF;1on1r1WUfUM{N>O^ z2v&P)^jp!LPIV>p<2#J6N@#oZp+ho`jr9B;S%biw!`XA{9!GC!PT1Z*h)#5I6`cX` z#JqT*iDfH&UoGFPAt%7Mwg%zYE;NR!MjUl4B7sCpBXrVA$=iDiOH zu!I0mWaM#2?QGZIwQ3C(mw3fJud3v7o<;Avk5zbu)!joI8`sd@7lip#ke5=8wi-bt z-xdniIenD39)l*j`n9UVc2X2|aV?-q1wvhc-DiM(cyh88C%e7?FZJw|rdv|i@r6%2 z9rn2~!rs0$_0k38^V6=>ePqIj*8g51UU}W^HQ(~;TNBwYDKgy6D+ogk#I2;PV(X3_ zeWIq7*6*CTtX~4Xl9V-SuT*KV#28PKihbcR0*bGjXT7RUzxV<1@(_SH2oqZg$xoa3 zj+J>Id>$YFD1P4N<-{&^u?uT%fWg43xBUJ0VE_;qm5a{XjOIlYQgy2{DOvAT>Ce(F z`p7uuP(oonBlJv}W*-*~T#`w&yJ^YyTeojhFQUK;Q3AFF98IRmk1f4>HvlU5KA5eb z%HH(X5gYu!BesoO1NZ#|Q{XZ0vh|E1BY`h$BJ~_aU&LhKG9SR%p)lyut(#a)Z*<+l zh_Pvc01&N4C)PvA8S%%<6YXCaii}bEAV7QxYnj#nLjxl0hl3f>jml-b80{CPmX0OGmacUh|WUTk|9IX zgmYmwj{H>Laq+J*`#8GZ2=2+v%cE6(6V3urK*9U>K8bD)b?d$P{~C64m3_EiQif0B z=QV5Hx-~dcS?oI9Pb|Q_0284*DM3@i>JnYWO+76cR}`pA=xGGdkXetbD6jK`2-AQt zoVe&gZKJZHqEw<(%=?0m7v&>uTsPk=bjhgW*C1R%!xm>qu*lisNOv+dJ$H2gAATpq zbeq}pRU6QEOLnlRu<)K^dy;{~gmem5LsSzG?S6X2?7HQ%niFE)rS5lncb(BUD;Uk7 zC2 z_&=w%G~K);iAsU)ZEoky+)?+?-+qP1{N5xH{s^h7;jay@?f>7u`n5nS{l2&V@awn# z{x{)&=U={)Uq;)*bwN+vUh$uoO@Hx%|NWb#TmHMEVj6+7ga3Pnx_=Hh|HY>N_wU~~ v|9>Cgzr$Yl&jb6}{CEBS|9pH#t