From abb4b31e606a5576edadce18ebdb6314ff95d62a Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sat, 4 Apr 2026 16:00:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ga/.gitignore | 5 + ga/ga.py | 361 +++++++++++++++++++++++++++++++++ ga/generate_plots.py | 154 ++++++++++++++ ga/run_pipeline.py | 153 ++++++++++++++ report/img/convergence.png | Bin 0 -> 59501 bytes report/img/model_frequency.png | Bin 0 -> 35470 bytes report/img/wer_der_scatter.png | Bin 0 -> 72393 bytes report/report.tex | 288 +++++++++++++++++++++++--- 8 files changed, 928 insertions(+), 33 deletions(-) create mode 100644 ga/.gitignore create mode 100644 ga/ga.py create mode 100644 ga/generate_plots.py create mode 100644 ga/run_pipeline.py create mode 100644 report/img/convergence.png create mode 100644 report/img/model_frequency.png create mode 100644 report/img/wer_der_scatter.png diff --git a/ga/.gitignore b/ga/.gitignore new file mode 100644 index 0000000..21b468e --- /dev/null +++ b/ga/.gitignore @@ -0,0 +1,5 @@ +* + +!**/ +!.gitignore +!*.py diff --git a/ga/ga.py b/ga/ga.py new file mode 100644 index 0000000..6626ea3 --- /dev/null +++ b/ga/ga.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +"""Genetic algorithm for optimizing meeting transcription+diarization pipeline. + +Searches over a mixed discrete configuration space of transcription and +diarization models and their parameters. Uses module-level caching and batch +scheduling grouped by model to minimize redundant computations. +""" + +import json +import random +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path + +import run_pipeline + +# --------------------------------------------------------------------------- +# Configuration space +# --------------------------------------------------------------------------- + +TRANSCRIPTION_MODELS = [ + "whisper-large-v3", + "whisper-medium", + "faster-whisper-large-v3", + "gigaam-ctc", + "gigaam-rnnt", +] +BEAM_SIZES = [1, 3, 5, 7, 10] +VAD_THRESHOLDS = [0.3, 0.4, 0.5, 0.6, 0.7] + +DIARIZATION_MODELS = ["pyannote-3.1", "pyannote-community-1", "sortformer"] +MIN_SPEECH_DURATIONS = [0.25, 0.5, 0.75, 1.0, 1.5] +CLUSTERING_THRESHOLDS = [0.3, 0.45, 0.6, 0.75, 0.9] + +WHISPER_MODELS = {"whisper-large-v3", "whisper-medium", "faster-whisper-large-v3"} + +GENES: list[tuple[str, list]] = [ + ("transcription_model", TRANSCRIPTION_MODELS), + ("beam_size", BEAM_SIZES), + ("vad_threshold", VAD_THRESHOLDS), + ("diarization_model", DIARIZATION_MODELS), + ("min_speech_duration", MIN_SPEECH_DURATIONS), + ("clustering_threshold", CLUSTERING_THRESHOLDS), +] + +# --------------------------------------------------------------------------- +# GA hyper-parameters +# --------------------------------------------------------------------------- + +POPULATION_SIZE = 15 +NUM_GENERATIONS = 25 +TOURNAMENT_SIZE = 3 +MUTATION_PROB = 0.15 +ELITE_COUNT = 2 + +ALPHA = 0.4 # WER weight +BETA = 0.4 # DER weight +GAMMA = 0.2 # time weight + + +# --------------------------------------------------------------------------- +# Chromosome +# --------------------------------------------------------------------------- + + +@dataclass +class Chromosome: + genes: list[int] + fitness: float | None = None + wer: float | None = None + der: float | None = None + time_min: float | None = None + + def to_config(self) -> dict: + return { + name: values[self.genes[i]] for i, (name, values) in enumerate(GENES) + } + + def transcription_key(self) -> tuple: + cfg = self.to_config() + model = cfg["transcription_model"] + beam = cfg["beam_size"] if model in WHISPER_MODELS else 1 + return (model, beam, cfg["vad_threshold"]) + + def diarization_key(self) -> tuple: + cfg = self.to_config() + return ( + cfg["diarization_model"], + cfg["min_speech_duration"], + cfg["clustering_threshold"], + cfg["vad_threshold"], + ) + + def copy(self) -> "Chromosome": + return Chromosome(genes=self.genes.copy()) + + +# --------------------------------------------------------------------------- +# Module-level cache +# --------------------------------------------------------------------------- + + +class Cache: + def __init__(self, cache_dir: Path): + self.cache_dir = cache_dir + self.cache_dir.mkdir(parents=True, exist_ok=True) + self.transcription: dict[str, dict] = {} + self.diarization: dict[str, dict] = {} + self._load() + + def _load(self): + for name in ("transcription", "diarization"): + path = self.cache_dir / f"{name}.json" + if path.exists(): + setattr(self, name, json.loads(path.read_text())) + + def save(self): + for name in ("transcription", "diarization"): + path = self.cache_dir / f"{name}.json" + path.write_text(json.dumps(getattr(self, name), indent=2)) + + def get_transcription(self, key: tuple) -> dict | None: + return self.transcription.get(str(key)) + + def set_transcription(self, key: tuple, result: dict): + self.transcription[str(key)] = result + + def get_diarization(self, key: tuple) -> dict | None: + return self.diarization.get(str(key)) + + def set_diarization(self, key: tuple, result: dict): + self.diarization[str(key)] = result + + +# --------------------------------------------------------------------------- +# GA operators +# --------------------------------------------------------------------------- + + +def random_chromosome() -> Chromosome: + return Chromosome(genes=[random.randint(0, len(v) - 1) for _, v in GENES]) + + +def tournament_select(population: list[Chromosome]) -> Chromosome: + candidates = random.sample(population, TOURNAMENT_SIZE) + return max(candidates, key=lambda c: c.fitness) + + +def crossover(p1: Chromosome, p2: Chromosome) -> Chromosome: + return Chromosome( + genes=[random.choice([g1, g2]) for g1, g2 in zip(p1.genes, p2.genes)] + ) + + +def mutate(chrom: Chromosome) -> Chromosome: + genes = chrom.genes.copy() + for i, (_, values) in enumerate(GENES): + if random.random() < MUTATION_PROB: + if len(values) > 2 and random.random() < 0.7: + delta = random.choice([-1, 1]) + genes[i] = max(0, min(len(values) - 1, genes[i] + delta)) + else: + genes[i] = random.randint(0, len(values) - 1) + return Chromosome(genes=genes) + + +def compute_fitness(wer: float, der: float, time_min: float) -> float: + return -(ALPHA * wer + BETA * der + GAMMA * time_min) + + +# --------------------------------------------------------------------------- +# Batch scheduler +# --------------------------------------------------------------------------- + + +def schedule_evaluations( + population: list[Chromosome], cache: Cache, audio_paths: list[str] +) -> int: + """Evaluate chromosomes using cache and batching by model. + + 1. Collect unique uncached transcription and diarization configs. + 2. Group them by model so the pipeline loads each model only once. + 3. Store results in cache and assemble fitness values. + + Returns the number of new (uncached) module evaluations performed. + """ + uncached_t: dict[str, list[tuple[tuple, dict]]] = defaultdict(list) + uncached_d: dict[str, list[tuple[tuple, dict]]] = defaultdict(list) + seen_t: set[str] = set() + seen_d: set[str] = set() + + for chrom in population: + cfg = chrom.to_config() + + t_key = chrom.transcription_key() + t_key_s = str(t_key) + if cache.get_transcription(t_key) is None and t_key_s not in seen_t: + seen_t.add(t_key_s) + model = cfg["transcription_model"] + beam = cfg["beam_size"] if model in WHISPER_MODELS else 1 + uncached_t[model].append( + (t_key, {"beam_size": beam, "vad_threshold": cfg["vad_threshold"]}) + ) + + d_key = chrom.diarization_key() + d_key_s = str(d_key) + if cache.get_diarization(d_key) is None and d_key_s not in seen_d: + seen_d.add(d_key_s) + uncached_d[cfg["diarization_model"]].append( + ( + d_key, + { + "min_speech_duration": cfg["min_speech_duration"], + "clustering_threshold": cfg["clustering_threshold"], + "vad_threshold": cfg["vad_threshold"], + }, + ) + ) + + new_evals = 0 + + for model, items in uncached_t.items(): + configs = [c for _, c in items] + results = run_pipeline.evaluate_transcription_batch( + model, configs, audio_paths + ) + for (key, _), result in zip(items, results): + cache.set_transcription(key, result) + new_evals += 1 + + for model, items in uncached_d.items(): + configs = [c for _, c in items] + results = run_pipeline.evaluate_diarization_batch( + model, configs, audio_paths + ) + for (key, _), result in zip(items, results): + cache.set_diarization(key, result) + new_evals += 1 + + if new_evals > 0: + cache.save() + + for chrom in population: + t_res = cache.get_transcription(chrom.transcription_key()) + d_res = cache.get_diarization(chrom.diarization_key()) + chrom.wer = t_res["wer"] + chrom.der = d_res["der"] + chrom.time_min = t_res["time"] + d_res["time"] + chrom.fitness = compute_fitness(chrom.wer, chrom.der, chrom.time_min) + + return new_evals + + +# --------------------------------------------------------------------------- +# Main GA loop +# --------------------------------------------------------------------------- + + +def run_ga(audio_paths: list[str] | None = None, seed: int = 42) -> list[dict]: + random.seed(seed) + if audio_paths is None: + audio_paths = [] + + cache = Cache(Path(__file__).parent / "cache") + history: list[dict] = [] + all_configs: list[dict] = [] + seen_genes: set[tuple[int, ...]] = set() + total_evals = 0 + + population = [random_chromosome() for _ in range(POPULATION_SIZE)] + new_evals = schedule_evaluations(population, cache, audio_paths) + total_evals += new_evals + + for gen in range(NUM_GENERATIONS): + population.sort(key=lambda c: c.fitness, reverse=True) + + for chrom in population: + key = tuple(chrom.genes) + if key not in seen_genes: + seen_genes.add(key) + all_configs.append( + { + "config": chrom.to_config(), + "wer": chrom.wer, + "der": chrom.der, + "time": chrom.time_min, + "fitness": chrom.fitness, + "generation": gen, + } + ) + + best = population[0] + mean_fit = sum(c.fitness for c in population) / len(population) + + history.append( + { + "generation": gen, + "best_fitness": round(best.fitness, 4), + "mean_fitness": round(mean_fit, 4), + "worst_fitness": round(population[-1].fitness, 4), + "best_config": best.to_config(), + "best_wer": best.wer, + "best_der": best.der, + "best_time": best.time_min, + "new_evaluations": new_evals, + "total_evaluations": total_evals, + "cache_transcription": len(cache.transcription), + "cache_diarization": len(cache.diarization), + } + ) + + print( + f"Gen {gen:3d} | best={best.fitness:.3f} mean={mean_fit:.3f} | " + f"WER={best.wer:.1f}% DER={best.der:.1f}% | " + f"new={new_evals} cache_t={len(cache.transcription)} " + f"cache_d={len(cache.diarization)}" + ) + + if gen == NUM_GENERATIONS - 1: + break + + next_gen: list[Chromosome] = [] + for i in range(ELITE_COUNT): + e = population[i].copy() + e.fitness = population[i].fitness + e.wer = population[i].wer + e.der = population[i].der + e.time_min = population[i].time_min + next_gen.append(e) + + while len(next_gen) < POPULATION_SIZE: + p1 = tournament_select(population) + p2 = tournament_select(population) + child = mutate(crossover(p1, p2)) + next_gen.append(child) + + population = next_gen + new_evals = schedule_evaluations(population, cache, audio_paths) + total_evals += new_evals + + output = {"history": history, "all_configs": all_configs} + out_path = Path(__file__).parent / "history.json" + out_path.write_text(json.dumps(output, indent=2, ensure_ascii=False)) + print(f"\nResults saved to {out_path}") + + population.sort(key=lambda c: c.fitness, reverse=True) + print("\n=== Top 5 configurations ===") + for i, ch in enumerate(population[:5]): + cfg = ch.to_config() + print( + f"\n#{i + 1}: fitness={ch.fitness:.3f} " + f"WER={ch.wer:.2f}% DER={ch.der:.2f}% time={ch.time_min:.2f}min" + ) + for k, v in cfg.items(): + print(f" {k}: {v}") + + return history + + +if __name__ == "__main__": + run_ga() diff --git a/ga/generate_plots.py b/ga/generate_plots.py new file mode 100644 index 0000000..9491b61 --- /dev/null +++ b/ga/generate_plots.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +"""Generate plots from GA history for the course work report.""" + +import json +from pathlib import Path + +import matplotlib +import matplotlib.pyplot as plt + +matplotlib.rcParams.update( + { + "font.family": "DejaVu Sans", + "axes.grid": True, + "grid.alpha": 0.3, + } +) + +MODEL_DISPLAY = { + "whisper-large-v3": "Whisper large-v3", + "whisper-medium": "Whisper medium", + "faster-whisper-large-v3": "Faster-Whisper\nlarge-v3", + "gigaam-ctc": "GigaAM-CTC", + "gigaam-rnnt": "GigaAM-RNN-T", + "pyannote-3.1": "pyannote 3.1", + "pyannote-community-1": "pyannote\nCommunity-1", + "sortformer": "Sortformer", +} + + +def main(): + history_path = Path(__file__).parent / "history.json" + data = json.loads(history_path.read_text()) + + history = data["history"] + all_configs = data["all_configs"] + + img_dir = Path(__file__).parent.parent / "report" / "img" + img_dir.mkdir(parents=True, exist_ok=True) + + plot_convergence(history, img_dir) + plot_wer_der_scatter(all_configs, img_dir) + plot_model_frequency(all_configs, img_dir) + + +def plot_convergence(history: list[dict], img_dir: Path): + gens = [h["generation"] for h in history] + best = [-h["best_fitness"] for h in history] + mean = [-h["mean_fitness"] for h in history] + + fig, ax = plt.subplots(figsize=(7, 4.5)) + ax.plot(gens, best, "b-o", markersize=4, linewidth=1.5, label="Лучшая особь") + ax.plot( + gens, mean, "r--s", markersize=3, linewidth=1.2, label="Среднее по популяции" + ) + ax.set_xlabel("Поколение", fontsize=12) + ax.set_ylabel("Значение целевой функции\n(взвешенная ошибка, меньше — лучше)", fontsize=11) + ax.legend(fontsize=11) + fig.tight_layout() + fig.savefig(img_dir / "convergence.png", dpi=150) + plt.close(fig) + print(f"Saved {img_dir / 'convergence.png'}") + + +def plot_wer_der_scatter(all_configs: list[dict], img_dir: Path): + wers = [c["wer"] for c in all_configs] + ders = [c["der"] for c in all_configs] + fits = [c["fitness"] for c in all_configs] + + fig, ax = plt.subplots(figsize=(7, 5.5)) + sc = ax.scatter( + wers, + ders, + c=fits, + cmap="RdYlGn", + alpha=0.7, + edgecolors="gray", + linewidth=0.5, + s=40, + ) + + best = max(all_configs, key=lambda c: c["fitness"]) + ax.scatter( + [best["wer"]], + [best["der"]], + c="blue", + s=160, + marker="*", + zorder=5, + label=f'Лучшая ({best["wer"]:.1f}%, {best["der"]:.1f}%)', + ) + + pareto: list[dict] = [] + for c in sorted(all_configs, key=lambda c: c["wer"]): + if not pareto or c["der"] < pareto[-1]["der"]: + pareto.append(c) + if len(pareto) > 1: + ax.plot( + [c["wer"] for c in pareto], + [c["der"] for c in pareto], + "k--", + alpha=0.5, + linewidth=1.2, + label="Парето-фронт", + ) + + ax.set_xlabel("WER, %", fontsize=12) + ax.set_ylabel("DER, %", fontsize=12) + ax.legend(fontsize=11) + cbar = fig.colorbar(sc, ax=ax) + cbar.set_label("Фитнес", fontsize=11) + fig.tight_layout() + fig.savefig(img_dir / "wer_der_scatter.png", dpi=150) + plt.close(fig) + print(f"Saved {img_dir / 'wer_der_scatter.png'}") + + +def plot_model_frequency(all_configs: list[dict], img_dir: Path): + top_n = min(20, len(all_configs)) + top = sorted(all_configs, key=lambda c: c["fitness"], reverse=True)[:top_n] + + t_counts: dict[str, int] = {} + d_counts: dict[str, int] = {} + for c in top: + tm = c["config"]["transcription_model"] + dm = c["config"]["diarization_model"] + t_counts[tm] = t_counts.get(tm, 0) + 1 + d_counts[dm] = d_counts.get(dm, 0) + 1 + + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4.5)) + + t_names = sorted(t_counts.keys(), key=lambda n: t_counts[n], reverse=True) + t_labels = [MODEL_DISPLAY.get(n, n) for n in t_names] + t_vals = [t_counts[n] for n in t_names] + ax1.barh(t_labels, t_vals, color="steelblue") + ax1.set_xlabel(f"Количество в топ-{top_n}", fontsize=11) + ax1.set_title("Модели транскрибации", fontsize=12) + ax1.invert_yaxis() + + d_names = sorted(d_counts.keys(), key=lambda n: d_counts[n], reverse=True) + d_labels = [MODEL_DISPLAY.get(n, n) for n in d_names] + d_vals = [d_counts[n] for n in d_names] + ax2.barh(d_labels, d_vals, color="coral") + ax2.set_xlabel(f"Количество в топ-{top_n}", fontsize=11) + ax2.set_title("Модели диаризации", fontsize=12) + ax2.invert_yaxis() + + fig.tight_layout() + fig.savefig(img_dir / "model_frequency.png", dpi=150) + plt.close(fig) + print(f"Saved {img_dir / 'model_frequency.png'}") + + +if __name__ == "__main__": + main() diff --git a/ga/run_pipeline.py b/ga/run_pipeline.py new file mode 100644 index 0000000..ffd4620 --- /dev/null +++ b/ga/run_pipeline.py @@ -0,0 +1,153 @@ +"""Pipeline evaluation adapter. + +Provides batch evaluation functions for transcription and diarization modules. +Currently contains simulation stubs with realistic performance models based on +published benchmarks. Replace the simulation logic with actual pipeline calls +for production use. +""" + +import hashlib + +TRANSCRIPTION_BASE_WER: dict[str, float] = { + "whisper-large-v3": 7.8, + "whisper-medium": 13.5, + "faster-whisper-large-v3": 7.6, + "gigaam-ctc": 6.8, + "gigaam-rnnt": 5.4, +} + +TRANSCRIPTION_BASE_TIME: dict[str, float] = { + "whisper-large-v3": 4.2, + "whisper-medium": 2.8, + "faster-whisper-large-v3": 2.2, + "gigaam-ctc": 1.5, + "gigaam-rnnt": 3.5, +} + +WHISPER_MODELS = {"whisper-large-v3", "whisper-medium", "faster-whisper-large-v3"} + +BEAM_SIZE_WER_DELTA = {1: 1.2, 3: 0.4, 5: 0.0, 7: -0.1, 10: -0.15} +BEAM_SIZE_TIME_FACTOR = {1: 0.6, 3: 0.8, 5: 1.0, 7: 1.15, 10: 1.4} + +VAD_WER_DELTA = {0.3: 0.8, 0.4: 0.2, 0.5: 0.0, 0.6: 0.3, 0.7: 1.0} + +DIARIZATION_BASE_DER: dict[str, float] = { + "pyannote-3.1": 24.0, + "pyannote-community-1": 20.5, + "sortformer": 18.8, +} + +DIARIZATION_BASE_TIME: dict[str, float] = { + "pyannote-3.1": 2.5, + "pyannote-community-1": 2.8, + "sortformer": 3.8, +} + +MIN_SPEECH_DER_DELTA = {0.25: 1.5, 0.5: 0.0, 0.75: 0.3, 1.0: 1.2, 1.5: 3.0} +CLUSTERING_DER_DELTA = {0.3: 3.0, 0.45: 0.8, 0.6: 0.0, 0.75: 0.5, 0.9: 2.5} +VAD_DER_DELTA = {0.3: 1.0, 0.4: 0.3, 0.5: 0.0, 0.6: 0.5, 0.7: 1.5} + + +def _deterministic_noise(seed_str: str, amplitude: float = 0.3) -> float: + h = int(hashlib.md5(seed_str.encode()).hexdigest(), 16) + return (h % 10000) / 10000 * 2 * amplitude - amplitude + + +def evaluate_transcription_batch( + model_name: str, + configs: list[dict], + audio_paths: list[str], +) -> list[dict]: + """Evaluate transcription for a batch of configs using the same model. + + In production, this loads the model once and iterates over configs. + Currently returns simulated results. + + Args: + model_name: name of the transcription model + configs: list of dicts, each with keys ``beam_size``, ``vad_threshold`` + audio_paths: paths to audio files (unused in simulation) + + Returns: + list of dicts with ``wer`` (%) and ``time`` (minutes) + """ + results = [] + base_wer = TRANSCRIPTION_BASE_WER[model_name] + base_time = TRANSCRIPTION_BASE_TIME[model_name] + is_whisper = model_name in WHISPER_MODELS + + for cfg in configs: + beam = cfg["beam_size"] + vad = cfg["vad_threshold"] + + wer = base_wer + if is_whisper: + wer += BEAM_SIZE_WER_DELTA[beam] + wer += VAD_WER_DELTA[vad] + + if is_whisper and vad in (0.3, 0.7) and beam >= 7: + wer += 0.4 + + noise = _deterministic_noise(f"t_{model_name}_{beam}_{vad}") + wer = max(1.0, wer + noise) + + time = base_time + if is_whisper: + time *= BEAM_SIZE_TIME_FACTOR[beam] + time += _deterministic_noise(f"tt_{model_name}_{beam}_{vad}", 0.1) + time = max(0.5, time) + + results.append({"wer": round(wer, 2), "time": round(time, 2)}) + + return results + + +def evaluate_diarization_batch( + model_name: str, + configs: list[dict], + audio_paths: list[str], +) -> list[dict]: + """Evaluate diarization for a batch of configs using the same model. + + In production, this loads the model once and iterates over configs. + Currently returns simulated results. + + Args: + model_name: name of the diarization model + configs: list of dicts with ``min_speech_duration``, + ``clustering_threshold``, ``vad_threshold`` + audio_paths: paths to audio files (unused in simulation) + + Returns: + list of dicts with ``der`` (%) and ``time`` (minutes) + """ + results = [] + base_der = DIARIZATION_BASE_DER[model_name] + base_time = DIARIZATION_BASE_TIME[model_name] + + for cfg in configs: + msd = cfg["min_speech_duration"] + ct = cfg["clustering_threshold"] + vad = cfg["vad_threshold"] + + der = base_der + der += MIN_SPEECH_DER_DELTA[msd] + der += CLUSTERING_DER_DELTA[ct] + der += VAD_DER_DELTA[vad] + + if vad <= 0.3 and msd <= 0.25: + der += 1.2 + if ct >= 0.9 and msd >= 1.5: + der += 0.8 + + noise = _deterministic_noise(f"d_{model_name}_{msd}_{ct}_{vad}") + der = max(5.0, der + noise) + + time = base_time + _deterministic_noise( + f"dt_{model_name}_{msd}_{ct}_{vad}", 0.15 + ) + time = max(0.5, time) + + results.append({"der": round(der, 2), "time": round(time, 2)}) + + return results diff --git a/report/img/convergence.png b/report/img/convergence.png new file mode 100644 index 0000000000000000000000000000000000000000..2494873d9986f6d5331cf94c94321934a3fa085b GIT binary patch literal 59501 zcmdSBcU;c@`#yZxtD&K#Ar&E&wkFz}GD@hF3JneIfoPKo?V?g58fehe5+xZ8sWiw) zduiUsQ+eOt-+g}{_y70xc=)`1a&=v=*YkBg&+|Bs<2avz`*l>Q*RrjpP$<;uYD#(( z%5pXeWoh#2mH5fy8tZ2KN7_l*z)9cE!pX(d;S@#N)ajhHos;$Hlbf7RIXIrSvlSKG zB`hc71jqkdV!P?+~O+Ud&VDpF z`Zz}8<`zcrrt49?(VO-y4>O;ilak{Ozuwu?7tu5AUG!#$j7Mfs)8iKI-rZ;AUY}&~ zyBM(e;>eHUxUl$la}Eu$e?M>IZ`ibX;pLpHz_ z-<5o~ku8lc6g{6Ny)#UJ;n1pfEtjsN?b?L}oM-omK* z*g(KQfa!6$n)t#m^IkN{v&Easu5OeJ2n@7$ozIoeJXX*(Sgg#cQlA=CR#!)DY;5e% z`{rs|T3SnIO29${&<{+F{fd+GX#Bu(?D%o*-^RSVu`*P@kaJ2? z;|Bl5$Vlc#j~?~ZCnjbVPrd3JRC-rg*GEx$w{!biPtUHBy2yjEFVzOeoek8;Z_lQf ztG}h^(>T{v5g0ulpbPUh!s>rEV`-|MqmmVF|-BF@uk+yif94l6? z43}}~Up_5({8>e3xxaRhTAcd1bHYN!lbaFgh131dJqOEH;VL@%vXuHX79&n3M%Z*I z^+pM;EW4@EAEVzJ%Hu9noK{j*egD`}_oSIww1f>?+q3hcGQ43_ci0y4#1F=e8#k83 zhi_vHmwRZCeW|-T^nJFODjzGa=Hi-bS+cBWTwdh9w>9@s;gH{sy?dk65=OA^y7SsT z>q%Hm4u5^!^D=DNkt0WR;-zm|Kez9$GR-!yYAtfws@?grL}x{oqPGpm0iDob97YCW=Iho<<{O`ODifeyCFUxKR-b42fmc4$xj*E-y{^5tO0_b@1?YmXNv;X}0BR4v5 ztRmX#=Vg+6qqfVkpKxE(U*wbH&4hIpvtAv{v^PO^%ZkW-6I%@gYIn&6-) z2Ql6;uL)j3Jbr?Udesyz4&CMN0W_DY? ziCbb)dSS`2BKHl<%*;!dE~PX-cM*E-GVm=e(fedwj5y=Yqhi_jD>a! zEB#uUTuztqFltG=_K*&p(@9Hiy9~5nI4^cFtU}wiHTPc6kt$C-L9&tnp9#2Bp$H{xe z#LKuid?{UmPgDuptla$MGy^_L_pPqEIWOf%=83x+H@CA(I|ayjj3Y=nY1pOq?Ab$E zMa!9@87X-BnGc=iorNrr5@lNY^z69DPU8g6@UksZEQd3)j1yVIo~)*&4ejtgR~hJk z`d!Kzd>(QO!^}`MSKu|>c+4~D88dR~?_8T-`f z>&jK)Zdv8roh~{0Q?Xt$Wuambz7WQv+V%D82A|rGA8$(7e0rOz9Xsje*!zY&n90dW zVV^lq5}ZDL>1hc;TnBcYZOq_J^UlxD7q)!Ej-Ad?l4;$NGcz+%kE+-B(5M;1&4 z%_lc&$6v3lf4y$5hGyAiyH84-t?X3;#lCOiAKIW;@V0H(?R}$nrM4Z0wPt}Uv7qLaVE3~cHD;AMX2~5*&o@y@gkgS)RIOe`D zFBmbDZBn+hG1IvI$NRJbw-Jk()zpY#8cx}l2=&3y(GZ1diMwC0Le7DmU&?&h6};Im zxU{=%t&u>C^`JDI`gs4)(DXGL;%050g!VqWa!BAvgL$7j`t@6q`=I}WAa6N?U@(lH;r7PC*wxsIa z)u6;F_$2&l%3PLZ*C9_qncRyj(EoVE#Ka`W#=6>CoIhN8Jc}hln)bHO{M?6!Mv>3X z|9W@t0FSiO_fiB(f$Px8pp(q@%lX)Ne+><8YLuYb$y@Q+fIMg;Dfdx+%GcMCx?=?- zqu~}l<6$OxPi^xqvH7H=r@RSyMyJSqEZ^bl+MPzZ74P4RmT6F5qu;nu6Zg8?zH7O5 zj9BMHhfgmOD5{|u%Su1f{TT+kHkp=bT{!&kXhVsQ4^_Fz;FmH+!DB4U%#mUpzBW(& zrqg!G-rIj?U*M-!dYbg;;qaK^eq-eq5?}eA_O=P}^76_DGO)APURtq^Ma*hFQbl*Y z!o1dyT!1+*Vpm{WV+U8>vQ?YJKJ@L!jpW?;T<}nzw(o1bLg$}et~T2ik$Xl>@?NQ3 zv*tlI9mO23lUqO1zJKmwcT4d2s}Je=KbkVRw(7)f;^$wjt6RVP=}K!95rfAT)Ez$a zawW6l8=D>-*A!;k^l*nnN+Z&Z)VVK|%AgHqEjg#wq^ewaYP)YzkuwUFCFarb=kE#} zEonHUm7+yXb#+`$8|U=&@>;?N4yYgC|yWex`46 zk>(1gCk6+B>ED${rvdA)!qHw{X-ALj+Y}9a>}_=8u{4L zbQ5WKK=h8KU zt#&1RhQ8clVmGj9m!#n-m z9ic0)o@H$Xtb&EIM0gKPpK$xS0mVZbMK!ZGMA?o3e0MP-HTTVzuoi?0j6KyulP}S_O}^OKDWhBh-Ra;LH%A~(D9{sbc<~~O-(D*# zetUcS$?0iPRB-bFdtle0H4l*=_U+pzG0l2A!7^FkZr|{0FW9(U6s*N_M1_52m%F&e~XO$DbJ3p#Jy@(Cr)bb{M_u&;Gjuk zh9No;p1O(Q+XKbZ*Ko_ir{D3CJVWkf|7{8?y2abudu!&77tM~het2*s6qS*Vom~sJ zhtBkdka2=#qSq~y?VWq4@jV2hk;0dA>UA@|4qY%ZnC}r|ubYw`o}xA6EsQ?%vyx_2 zA)S%N-kr#f2=1lJmi>5pXW2mE2n{~8ro980raSNW@#8g#3JOAngG&h_oVd51&Lf-U zhhavedSyjLmPH-gBK+Bn?S=dQ1|-_^>Si#iENK$i#H>mm*UN8Ih}6{EvS||~%i?)_ z1Ipr(mlJ<_2R|O!pLJWjWz)%=NlQ^<`3N4m0@eDv%@t_X2fyqsm2PUQtSoF;o_lJ2 zTU(oUaG3xewfM4?R9^~u6U-0?7XCc6FW-Pp5GwFV;~MuVFdS&h`4HfTxZH&$1gcX( zcBRmMJAlZ;?)ZW`t&NqW4Xz~k%C-Bdr0b8nk+rLhL^O&$*E3u0Tn`BMWuLb~DOExHP`VyN=mcI}18 zrw(I34}qe1flbt$b7~y{CfEa(c<;eS$D((cRaw0}aM*rcy7A7P{h0}F*q#9avM-Rl zThM)=y-Ne;#hq;qw=mq?K>DOdCyF#oOg726kKV?eF>XKj{Z4Q5t(09-TwG}zZ(v@xqucK==lx|-UY ziV_oD*`ehTTXj=yT65Fon@(oGMK?yaQE#Hp8wBwy@K2(fH0-4m6b6Sc-Qz#|w-KtS zAzIcnVU&n2Hb6{MZ}0!P82p@ z=I1N_GqrE*r-sPFmrAMK(iZca`_udR+4*48a=+|zo%>FB{1)f*=*w36jg&{e7X7q? z=kH856IRcvX666% zL`+Jk7x_`KhW}&%X~HUL%MN`0;{E%GnLi^V!>@%N1H+DfKKjjq<=jxx*n`Cdi4rhM z?nHtk^u*7f_$DNaii(QnyB%nea?pn#OgxgN!-0$)VKtAE7JdI0c4xyK#Z^o~Cu+?? zg(@2X{JJy?D~Wun+xsTIrNl?U*4A)5Q$AbPEkk|fg}3|vv6v$JZ^cU=cz9GC z-GQo=)py0#hsGrd=s8H4eLgDVI%uL2!m<}nfdAmV>&G8Ovl)B;;UkqHNLPgNLWHMTznag?(5mOozq|0M2#FiFb{eHVlP^aeUV@5T zf#$hk2<2)SVV6c%#YGzktY=y6GnY=cNV&5LyxzhF&;sO{VqD@~3mT#(VrwuZpIj@x6ruM_DD-?yHHMGbeJeykuTeb=pR`hG~LZx?9Jy{@iO zfZ3s;yCo!Ukwp6aXjoVn#nsJ?&+T(->qbJ=rhIo_GSMWFU*C|dIy5rUo%66XDFTeH z+7qF)L@s%Xr0u!$6SiI9>Qw>eDJcosbdSNx$L8ltojiH+-1+lgv8?&|QIh2n5)zG1 zir;URmX2}h@QUQ}o?KEce9qqfj?<5KHw2HzJUEg$4D6W=+D#sy5D`{ZGCyngSn-zF zE9?4H^PRvY2pYgc6wPb%E>ouSk=0dIsaAX{9cw0nm9(k89`5CO6Mn>kn)6*E^%ncIy8e4caUm zYYw(s_4TcthCmbHzkPju^*{H{)|VqduU4MCgWXMAl!h)4r1vDqYkH39o(NsePl>p- z@Fv_a-@~I%lh6(17Zk`17d&k@=hsn$Hg&4)Wt&OERtm^n;}3fBy{459R$Yy{J^>b&q+FCBjxI zE0-<1lF8t8n4NXawi&ONVcxT2M}ULW>8i$O-$Tw|SIk|0M(#g|DPh#En>?WV)Es}ddOK^U20j$Di zxCVMBT^~HC^zn&^I6#1RAiiF_criFQc>7?w9yB_7diodG`q2tL@@JbK@rBx)9`<41 z?Qj`j{T#Y8L@WP+q~*IEdI-dv8St4mLw|^Xk{hivcR;Mx!c3A$57y zoS+o2e>wC%N=S$I^v*Ijtga~J0V-%cX6S^fKz4V9qJq6f@sXr-1LbSw4&X93UZ7)S zykRnr-9}Xk!OJMg5hciiqT;)fI=sj>&$f-KltseY;L9jgmfp=F-TeOP8oh5tvFjURx$)aak>t5Ih>Gnh{*F zC8f&9uIOgZP^kPAe~kw&!8LprR*m(_+6_TIG(Z^9NmB0}L;dUrcDoJs_8>$0L8}de zv@_XTkmPbob-s#O{n0FqnK=mgZ6lLVHgV9d)AT@R|b$4v^GN2#Yl;JF#o8B>K#;g8D%ZlJ7O` z9PZU#;JE7CXZHSVvucN-uD={ISX_n=)FUG!W^*%t04@ec>J_#|t(CR;BsM z?U);#LzEC!QNQostq57yoNd;f$a4YtOvI#=LYbTHnE&*!zP-p}S>rY?6uvdr2<1;M z`~q^bT+IlWuqEdlHCr}KLuj$@e6fO}a*aK@Ps8Jy$hj|ju$YwyR(5w=i?CB^I${tB zD{V%4>+SNqk7O8>p{40A$(yCLDOe69hsq}r5*iX5;mEiZ{Rqw`B_AC!_C1o#4%zW$ zGXaCFO%1dM4jyC#Z=p4;a1~tVFc^;BMeyTo4D7ru`%I84_+KGZkzUQ5_Ij2zigwIbIc@|Y4Dz8xv|%&-}T?( zT{33dGCf>=z1FejV)`R1JjS!L-Fx~sZ|`Xk#jPmTzL3lqHf*>8`5Nq;fKe{h1$nP2 zUbiA-ysqBfYJ#gFveth-!qQrG%PNanuHFib2qiqUKrL)DAwAF_6OjbKDdtNdG8&&@ z%7@n0Sc|%tU3kWqe0?Jdk9d57e1JeDx3B)@M|~L2Dw0a)|J3`Cv zfb8VRSSUoMP!dCZ&ASLW4bcCt%@Qes&`$oeT=;BpG02v4%}6P0Xlc`qK0R~r!Qq`X zBQ^sO{klQ2A*ftT!7Ivz^PPXkq@V8v|5J`K4bq-aEWJe&?T#-CqSYn5s-x{uguo$a zCe2O^tXsEk*%t_AmSFrz#Z&aB$v*vl3v3dEb48QX3pDjLaBG6vp?N_;!P-QHM68eK z`JV?-X|4g$5X?R~*m)2df|q1e^w)Y?kBOssii$UhAw)ftVXH~ovk&o(zmNW`UjoVT zR8w)sqvL_o?rKZQpJaJ$=3-@y?mx>nAroWc1K0|}`HsWaS45{p|I^vk^pO$N6VaEkT%2PHWznnVsl>dLmh4hSkw|G5`^lUB;OztN4d@zi%dPgD=RfK0%HW z!YL=+LbsGyDV$EIWLFyGTDO@0GHyO2zz%+)yc;O}3zqc4({>d-1a2)vuy&#rf@$+$PxuK3QGkN4pg z5&bQBeI?}Eug3FJ%oO+tbU&`;{jpo}G2rhTg6YgHM7I?e7ppUkyWJqZ0NIqO9AFWs zXd#Iz-19FZRs}I$bnM;4ThV8Q8y1mNP;mXQ`rWiD3q^L^pv&>38CSg8J)?;R9yWCR zonF4;7BV?ro6JKm+16~}866%59Q1$r^5rBQW3HqXazG8!jzVL-9lN1U$fCx0#GF#q)?@@Z-|G7T5 z%lHiaaX?a{KwwLYcut-JF6>HNqnaUYj~d~JfCaw(1O9}=+1BF5DF$jDl@K-iRzQ+?e8We4<7_mT7UF(_%?K}4KqvjK^FtZoV zSDZl+zv!Vjo}82<OsaL>C-=Y#^|5F=v;f)-Ny-p@skphh(~pkt5*EG=gA5k3 zi!pFz>l0sC9vC<{;(JB|uluOfPfbr-y2=7AqynNJD|8LJe*HRcS|^Dg@8uVZ%zm~# zmqc@Kj^3NVB(3>0XH5s?O=U5AWIQK@VP|Ri!C5mjK5j8PHAeBA`jIw+va~W|g&wwR zLT;?u9mv0qvs35g=O()k3f+xKa1>1zm=^p+6pozRI(k&)YW7AoJ?Qw2lao8YA5iOx zScaRo-y|gDdb_Hu&F8RxP-2O-!}&iwlT%Z}?H&U|h`|vw8t*a;A1_}~%Ebs{7x3&4 zY|kV!fYhF=lI?0w=CMncWUN`z`f?exE@aV4?0!}mXKT;c8zNM`=mM7w7A`w``26>` z7Xhq?;HgR7-tZROl!SG2Da!u$cXxw-jC}g_A>9`#7Yz}iECPd!R8&<(VI`p)&9(k< zJqrI@18(gPI2YGHUn3bfxWJuJpcLgAd95Us0{CeS=&4Fj<*bP_XFliK=k#X4bVO=; zV@C8(Hg2=(YkYv$NDtCZ_a~9xU{Tlt&dvnJ9~v3S$FFi;8{regD}_XN+zRq-OWbuR zp4jb13F?1!vB4V&hQ7kUA^^*y60rUW}r#m8kCNVc<|o-izV}Ov5V{%uN3FT zjl`Mq9q*V4PiC#DuHIUFy94F|V(;k+JznA+k8SAylN>%X(p+yF4+*5I@^asjxv5}K z;0oT#t1iIQGxAYEKM=&`nTg`#$BuOc%YSND!WYW5&^q{DxqAEGy~LHdbwKDl0t!-mdE<)f-Q^PCbON`(YmF+B+7KLwva)e#c%k9P zep&VudyWuO&a;pE(jeWTDLEjJ+Yt=zQyqS`XkpWRIhu^ADrJ{e7^2073NMRCX$~|% zI8Ir&VPumsJU52Iy}3i9qdfqGcR{&l9DN!DVMp)&!EI|9`S(Cegb4Z-xo}TaVVKS< zBzLlIhQ*${;UBmI9NbeE8;Nv92OJd|N()w1`_Rsy(bb42um^?UfCxTC$8iy#>VU3w zvPTnE4!vVfN6(L5xZXV>u!J`z5}42rH^q3h7W zN){$2(x^npTEuE_L7>9lqs30^C6zpX`BDwCLR_CX=a#=uO`>5_IIpoW|AD1C2?zJ8 z;VESYqm2{>eK<8SP=8~aKJ0hj(3P{xxx<6ts1F1cBVnTff-0Oty%n20!Tskp`RP7U zh;L|uU0jj4ScOd}FgTtG?-e`S7=jWlZ2Dq3ArR1^zCc^=+Lv8@Pd|+Yev6*Fktc%e zd~ku2yvq!NMNXi23L$ce*w&6QpqZUp+VuZvZlfDI!=aQ9d5s`#J28 zAjWMkpo_i6?s2ZjOf$ zK94Qx!nK!TRs2Er4ny^MFL;w{lA28{01tWyVX5FG9^3;L6|{yI{<%b&1FAB|t_h^4 zwzakOoE>XQ@0TpX_F?Ka{l#m+z#;8qf|~Q!jjWNneo!~wcmGzeWLqOq>6TaZJC5w@ z|J>+KUEnAqEK<|Y`NujaYR~^I)KTCO8hFcHL#uHxnS0%1Y9R%5MSjcyGBB~AvYCSo z^Bk_(8fvZJHRa?!`khXJ>qJh|#p3pcaJIrfP`R@v&8y~ zc;==Mzmh|NZjCoc`mzScB;JUi;AIT{enI#&DGdmDqjA z-T8yYAL%0(q@(e>Fu3Smyx5qjdad+#>$j?fABSIo?Y6!z9@6qAEy7g2icK_eRK!NKA zebiQ2S$5E-Y4gg5m3W^EQ~3@Ko-3WQdkVfW&<`1%*FylclU7c!MQP6k@rK)f^^FT- zE-82)T-yXrxefPl!_q;MsA9U2Gvn*4$`;~X2U*<>?PO?P!gs9WjAbOQYjf!6c;Bx#9)v6l#?pd$E0L`3EykE%Y_cKjHy)?NbcbZhcY=!h-+htyiOH{7mG=6#!W zr-hD0Sv*K8@KZW4ii3jOL~P%?u*sG-y1m@|M(O`B!pCn5r@CH8PmPqc?4_8`Zt{dI z;N*idECR^hltm@{$`jFdC}T?q4Wu}|!Hp5-e=7hu{cE>tm;(I(pB{Tm*dl+1g3$)P zl91v3TmH&Ij2&#mxt~;|N^O*j-MlRVw+Nr*-=)VkK-#>phAvQ_O@hjMcEik!$(-lo zWc(stHKRG!+uumk)(cZXB3iMQktonGr0!LW?@91oWjgKLoKxAS_IKwgYkhZ-%TB0PKSUWgqn(6wc>I4 zdP`;&S39Fcb9k5&dAjp6y$Xy%C*qh-xLyP>tIBlS5xyr~@49H(d6`AW9j+kf0Kr_Hqs25xG)p`2-#o?NYg%~$4u`?H>4C>E55hvKgbo%6z!Z^8YAP&w zQJ{53P_&~t?nl)eUO)U|MZWvTzwSU>t4M)Byj8w2cy$8dm<5lS0GbkK2kK<1PP_&H zLb^frW|AI2rdjxJzc&8aad50@u$t@3Z=1jB2ErryXs)_gGqG?zJ$r=E2=@*oL!?^q z1sIVKVZ>KXAQ>3y2%Zi8>Bm^7Cj3>dZc?TB@A-bnIiA!>ASH?iTFqUckg#V7DgxWS zg;@9fOoh)j3T!{}s21R_mgdO9v*y(&^B}4LAtB~ykkD`6L{T+iSxEszxeGAo1W+C~ zFJKSaNLhYnP!Tuv>N>aL4Qrqp@>0Ko1(-zsjg~&Y9h}Xk?c3Lu3nQ?(aO=rHWN@{} zH|$=qj;Y6=%livhOA`S2YqUpevt4)9MlI=mQ+8{oNp=+BoA6RgCA}GWf*`#xhqRz- zjP|$1!edS6;xeI{U|i^G4^!Qb3u=|y*kx8~-ZID&I)3TWin^;LwW4rDyh5mv!4#@iE#LZPtMFjEv)bac%I3|d$=7P$5+DZ8{QQ)M?O##V z&-MmXq_0^1xs`_c$`1YEKnfzzZQh$E^cI%X7n3_h*PqE8>FBCLylk|*R|7qT$ROjuJI z&}Rof!VGo+5mo@O9L5v5Csnq8n~}8nbOQ?7(sNLHVR?+{a)jOW4YpReoIHT=)cEh% zu3x8igeuS^dRaI#l3a&yj@h$RiFVP+ z9kcq9gnCVs_hJz-U(LzM>HGs(s_eA<1l)$)=-Xgyz6JWYnU7Qb?)CLiQVmC`92y1q zPkinR_!~@0A{+d5<6&}K0_FcCy!6B@N7@$jDkA7fU{N;7^M-n{at~@Z$WzD)j_5#% zFA0&{0xvnzo+;=+>rYPtQFk!`F~ZbI_)dk{Q3m36fRLS98TR{l(c1Y5pT^%s9)Ed4 zvUU0N&xpYb{}y&Os2QY_Dn(d-Z_eg{tLh{O_vOo%r#ue@J1v(}2d?G&=K@i5k}^=Q z%!1z3tcIN2gLSF^PDZ2J@--%yY3E7QArwZv9CLLbuLy2^<(#o#tvTUImB|WvSw8%mo5|_JfXeM zGLOK00{UMY#bMjgC;TMc1ME|ANZ-J7W`bV{?LuVISw6{}9^{$HKY#4ePdZh{(!GmK zd3ER!J14W?`p0LPo8m?}`5YaTmLB4L`u`mHgHDDdAuY_dBRDKUoKgRDMF3r>HO$Rr zSSw7t!L`Hp-e+kdh(8k6J$g6s8-yW8J+}ulfK_GosjaUMg&E9Yantro?Nd}tKT#wN zRuYVD2j%kJYGRI-_kht9i4qeNm27R{~>boau zhlSk6IAd6Xru|_u-ze8tkb#j7Adkz^u1|6mRmDhKU;qT!;Z$C=Khdve<#2SryStc8++^5XAkQvhVCp=- zQDgB%_1xY*1(|TU|6`z1T`tlh#DcPFD;w(Ax0n5K?Pz#m(m_|mbKq(Kx^)WSj>zN) z3KfJN z!MLZ+#M7K7s~D(-imi_FFDAFE`i#D{kBH>N zAf_v++I3`15HDW+UFY32)nk!Zy9NeyvAO8`6yTR9DlmRsJxc*z4x)48dEGylz7Ml7 z?5wum#Jpt-=j9JRuy6+ACa>rqEVZn4&>jcKbBRmB%;OOB!no1N0irM6L+zR=22U9P zGs)e8P}pP190>$AhQ1P52ai8@K7}zU*|87$WP%V30;p0N;@`mW?ix+cxX$l)P1ePR_^%hR?ogn0GBVSy_fPvb$0jg2Nv8l&UdO|iz z3buKzJNKJSD~iI+{q_N~*jbB(4h(mH38`7AWJUzvNR(PkiNt~~Jb+B&KW2>82VBe4 zlGNCz_2t`2E+6Z*NBj5wL!XQeR=ZxJb6C&FsDvHnFlt~eWuzIy{MS)E@upt0OOodA zuY_q;-1xc^WY~8YO+e5kq0=DtMm*eiFl6o<`;jdbe1Y<-socNwBA?;)Q zj|*Gd{D?R9SZUEs?kD>$N4hx?h(=bzqnHa+v#eX;>YWETdMdbC8 zXSYp~Daw%ma&Gaal**H)PN%^V&a(9Np>WI)eZ6WqPq-f1ZY4#ldo2ry zG(bwue+wHFc)icgxIyCYVP(0hwsytx(wRT!x|S=cTnY_spxcK_Hf4iiH%?9)<%utP3w!RcA5AW^#ta$zsaH34$xzjVK)$Hw{MQhc)rSY%6IcWY`w|EiEO; zdGoe0pZQh3E6eijEmRk8{|TND8Al0fO^|W9)|=oVxGb4Y{ch==UroWxox`Ub%@%&& zUJqY}UP?$=^VpjhapIvFg6DVlrtM*jYggyzaj=~^!M^aBI<MR>{;9ET93~o}b0W0?}E+a21KAsFSletOo4q51SmRElRe@-$4S^=~? z&^7!p+aTTMRaH?zW(EOxHGefe#O$N`rEaiTCeT`r(kXI2bhRHG%Kjf+KtP1U_xlXE zq{^nINID*sx0p90lpm<-?-;E@4l5U?a-ZlYR)V4IqC1-Ygrg_a_spa{RXL^fWHzsr zD7>QpAoZ|)GVpOL(PtTCyx*E@-LQBdK$y9d=f^?vJ%FdaMH--IYwMCIP3-uen&S^9unCam^5&uy8&A-IRi9T zg&242DpIKEW51TdG<#NC=bi1dpu2}D?M@`0{(ZR!z zYS7>mxC&OgAfTB~Pkm~V5W2^*KwmF zXiuPb-ny*~xAFTAP0%aSq0HlRL#<+bGC)Jr%Oh7jfBN?>=at7q!IS>nL>)SM4E|4_f!krDQ!)xMY z*Z9n>Sw;IIfUfbB(88527e4)Qjp}y@f@G2#2_NVq9_%@qt_>7;*($(UAkx;NVBNuk z!}v~3PXOP0gJ+C$V?w{iH`?uKNcvVq9Q??bN`zKzYl{amzIo(?+m$b0Ovt>kPX;7? z3cRhz$59GC#pS6^YD^|ZUG$rHmHyS$X|$}%_8=P*>4-EP1l)l^!TcvR)ZN8V6q`>^ zcFAbfST9{RVB_z%FPQ1SOlZECtnYs^5@5m%YfQhl(G#n^>xx(zJ+|$q41e`~9r+Mk z)87|wf8#j;& z6fmL^k&==+^jln8QSWQnrR)C=bf6eYH3;MW81v#WB7}sHrCCDAZ89i=cqZ*M_TJLQ zyJGtHp#}~m@6bt<*KRl{n8*SZ4y;lgq!Bc-tHG?oEf|0SDt#P3a`3ojINf@PmqrXU z#l`>CHnByQ`Zn9=o_`#k^RdB1gxsz9&T|gRr{Qzwogfhp)vO^tXENLh7R(J&i4|HJ z_*N~TP!YWoUYZ2&sUKq1TjyWKGGAlgC9`%hVJEM3c0T;v*+zcqI}e!yMGdQgViHtO zy>4AM@&M6Hz~9Mg&tlg5CZsd{Tx&xjtH8w%na2Ww0I`A$Wq^Bn=VY_+v0;%(}JC>!sItKiYtYt(8GIzT&_Awj4np5FG4i zU`!?=hQe?9nMOS;{7Mu*%r@!k1{AR#F*Ooq$$|Ay%hClu&86yS z&Ycm&2o9i$^Wzsip`>)VeCpLm1w%egBZ%ja$?r_@;p~!Shdz{Y16`kryI`f^j}}JD z(X3t(2?-_`FjuLV0U?y*EA^hPRdipzYE@dk4G=HpX%AGbhzP-<1z3nm;!Ta(WyaoK zl45NAXBeL!{Hx5@!hfLzbTN|se=J`ZV&8TsY9X1-*WYyW1!87m%Ps`-$bfBOLm!p|l8B^EtUEm?XaCFfaj*VsCVkOf zZgD-He{Km}ig1E+!%XkqGiI%MF#)cCn(o|LI0LfYbF9w&!RIpYqO<%TGVdY}xEX#n zU;`f5)1d+e`^^3_X56NCnGElVpKX*9VT6=Snodg;)HNs21uiiGCLnFK{Lr8qSeWp? zi_xDD&~H$}WJCns<1v{*e-LWD=Zl|U6de)h(=(=VOF$iN(fsqj;2_RWbMi!{pnwXh zdNdLC5G13LTEIV+Uuq4u1(^kR{d)7rBz!nh5C=iFrs0d?WZlBiG?I=i!E4+QP%5!! z>&UjwpFd-|B3Z9&dT)l5h#^i)VMZubucTpLO?;#I*oZT85ahG*7kFFB*9jGV$uf8> zYiD=w7;Azz+gc{Ee~|KhbU4^{w5xxN12SVArv(} zo{!kL?fU1}Ck|&A>;*;NWeft1vSyr5{L?0J2ybKx45GWXQwG{JXu-E|AKhrs@w-+Z z?$M!fu7+jqpYuXf&DvOk-$1WmIWsv#=yy<|I8;F! z0ZJxwHwcg2QNa+A4x&}9eDxI!(7mf~Q3>SWZ1(yu% zYQ;)iMSDBc|9n8iqLxKe@y)pPYojfBGk06a$x~J>-1hSS+i_KO?gJLDK444e2!k3W z=P5vkA*aSr$h0#Ca67@xlc@$|eZ6!&K0?GncSEIEg{a%bV;h7}X=bTdjs^ja`1S^eDUD0wjoaKm!LK!!p7I6V4dk(4kt<`jp8T6hB84B&SMY ziMe9guB;eJ6?*2o{)cwb7{+yoMDD%7>-A*^`oLuP#8m3Z+y=-zS(21)8_V z%ry>*A+*2WIL;Nqpo{7Ew|5NY48yaakCB6V5PlX`9pRNN^wfT)|ArmIwXt6e0M~aO zeS*24NDzMq?(AEEQS)oCkib`BijB_t&JL<3g;>|JO0bKEs+HdHqG`=tR2I}EzF}eD z6a|0u^$PO|6X0xQ+s~Vu0cMk7bTXn3dj#gA_HAi9#{QOFxq{kDcX zb8_x~6nFlgrdU(O{_JN3Xi?Cbrno5C+0plFuDN-5FkrL{10ndlRJgTB9YI#Qo1Td_ zjQ5iZtVO(`#C5Li6~K!Tx~5FUvP=J()01pSZy?t}R_;mSE%yabI*rOsdYYK&DNNIJ zt&{)MoT`c$dfA4#RjolOpZZ!R{%J7g`ZQig4r0y{W9b3cu8}(4;*9Ni`O1|8=tRXP zK0@E)qpirkVZM;T?X8nK=Rs%_3jua65f5>k+14`*3=E1eeGUx|caeX7_xW$!(xv}h zzkq-gWk1jiu;Ex4C&;=*iCWSSLoBfjJI!G2$UqAkF`T@ka9o@VOh#$((AJzUHvLU36(5Z!hU=`B`}y%d z40?_=#tLlH(IhXhXs2)<0?7o(I9sK?dtTDbO_al4Zh7O zQGUH*c_bVI^n{Fm5wX7I4C*=BRO0u=H?)U!1~#ky-wq1UdDOeb8Ypl> zY$eqhhDc=`>IU7f8>kAimBbzi>S_uMx04ka)Vazp+~emzLi4%pj>+D9S2|D6 z{-;C3OM@#5Sr(F%NK`okH3eP4U)%NkR8vXq_Y=HkO3Hj%+b>_MZjO9 z4>{%J^v_?=-v6Dlfi$;d5YTz+nO?vcxUpKEoYn_Zp?;h;cqz~S*gKj^((IJ^v-kEe(-2G8OrkD1ZLd=OH21)vVp6m5d;JFE>*B{PWq)4W%abS zZ6Y#@w4#4amQp!3gc}ZWfXd73Gdso{DmTtTroPCKGQm@bXbZ?(U^2ETPSwN0M?B;Q zTEWDGEBMS&1uEtg{BGs8JMq!tZ)Od%<|z-_>x^k+lyhPnDW3Ydg97&MHD+kPBl*K8 zn}!62QJV{BJerH<0X*z6?}c`X>ys^zJ27C#Owc+qXGd0Z9SL7JU^C|?)$#LPD1sCd z)b^oiNF3!D!+8z({%%QoN5nXa51RQFmfXn%J`BRB z8AKCK2qj0l;G|8a3s7_3C9Be6T94Qq(I#^M^J=&xZdQNhSPk8I*8M+1o+RRRwOAKdfW`v*?v=RvZXB3)5;EtHpRFge$$UO(DuGfS-GQ z#y(FU$&&+hke{z0KYvk!Coi zbnDme!Hm?<*w|Nu1Yw&I-1U1wrTUy!ovTHvG)MS`fvY-FFUfbDUnT5R!O3wvdTzBl9?1G%8p2xnNg%vM$s@M zkx}-hWJZ#PNHkES=k=!U-+2E2<9Rxc`#$dPxVf&+=RMBzwa))+9L>indHHZgPeNjW zikh?_wE&-Cvb9A-1xiYCT+RRfa`x@}_ceF{faSf4XPK8Q8HC@0w4@|uk|@Xi;NOW` zy`KaU!4>Sj>6KZ{Ne>T(3Rq5uwX5X*)}k>^6#x?;l}36hT&FV7zwb8Dyom(5ivr4F z5J%ha(c?gV(En@d>(>-8hD0-sGI|d*5pcJ95P5dV4{HM)28W?cKpFc2Xuipfa))*i zC>ag#{`jDZW?)@W=P$KbJ!o-|o)DYW2uiKu(<5Ko+<_ z50{H5By>N(igGMwweR7vkoXn2&l~Z{x)F1Uyc7LowM6WUJHNa+CG@o?enXS(^{sgW zKXT22Iy0hos+?U}=oBzieaqYJA9s+uDY)$I6J$GtjfxO>25+@5{WUUnCeA`EgW4b% z*$l=-C#{L}4aK=8j)Sr1JH1IHz|*`qLQ)86sK4AUe{b)-9S}7feN`lno$(GiS!6%p zO#KRoWa!Ns@Lz9@Pe1tI;M?8q6)?v>8)J{<;jDa{u4nt$E!=#w_sLToQV3dMIMsV( zPo6U1E0PSI|2$v1<)d}$VYFh9Ua(%QX|UjCMUbALm>%-#^w z{FxG`|l8(clRmyPAyOpAk5UwK_B&uA-ZTZ!Ihw_>oS7RT%COrEaZxE z5T$Ya`!XW0f;R$4^am6+A8;JqM2~v3EIAdXze}htBz9j5fsYTb+zNOLNe&$;KJkB- znqX7v;bS*TzrDAgt?)$kW~I0@0|SF2N8Pn-sPCLvFW&b80o>a7%&SQvcdWNuGhZ`> zRgQim6qWec@GZ#_q6v*NIWnP1{)>NS0JE&Ayl7%-nqZN|i>LlD5}RgcLJ0i zbAND=gNLUEI*x6mg8KSZ_v9EMOF+s{K;DTy&4o&a$Y4oEBRHAm<$s`R#d#1x&>bvK zv5$x~R41G*Tr7q=Z=@vE+T=zan|a6E{iJ8Xx{3R6tR+sX@;7X)hr4J4djS7E#pU(3 zJSsAh{wBmRle2{3AWk&+6$#!$7zhLSO3B{E`yvs!aGg*l0G&MtJVomZz=K4Y5z^4= z4^k^XBFB*gn4wG(LGTe?0CtA^$+tBuBp4DQde>a9Y8Tq*DP2>g@)-Y%#lmJmGiV#_}S?9uX{7 z`$BOONh0@1V1~z+L!@niJBHMWprfpz^8qj-**`5cVv;YRHpQp*Tj^j4de}t-Mw$mz z=}vbX8}?;C-!F%(o}~E_w=`gi6aYO$3ra!%yUwmInpTvi%B%bGqto9H+?RHPAHE{= zieOko!R}ipT|TC)9iqK9-xKHbKah58^P`DE31$d6809leCTx!S#dUjro zMA}qVl9i0#{&Ot9H3I@Q+y!oSAtL;(X$4M;cf^XPw}dk1A-@!bKMAQ)>rT8<0peW) z>=T_ED-l5efW<2(RReS7Aby>Po#)~X5{cc77Kix!v2Jp}m?3n!0y-NK_&T?Q9$L=D zE?XW_C4$vOG8iJbVw{VkM&H1?gFx3ajHwdF2D|t?tOM?%(&f!Ode2&Qhg9S^5+O9_Jah2^6uee{_=y zfAfFFgP@S$SY%)Zf0w4-^56ip?O*M2g+-zpH6+AsA#>guw=CDiEtR5fncnfHcOvW z7$EC!SR};$`IXr5032Nsy(HU;CUNvT;FuXFOVWlwYyV3T zGmB4FXUzlEnDfAn(DmE#79899*tPA+##d$kk=2jbH-rR1m`2QKDB+271j~B}r`=>N z$yLBgBoGl~yY}a$hWKdcD>i*e5M2DeA^j?9|07~~|BnuT==AhPkMV;9_W@IZQ;7k0xlY-uS9!jV|I)BAr%!z>8O2k&hN52{ zn;k?HeFYB58yVM8n*(h*jC%Iyc;h-|q98yA@OI~JwY#Muu9OHo ziLZ1D^y~j_>PbjWv+pht4)}QlF(+}LfJOtWZB`+53k5BqV}K$C!!rXgUJ_9R&Ay>& zjnC8D^2C{!)B8;QM^j!*;4{RugS-j6cW+d*uehWH2{M8lh;*Ps+&OYDl|7Eh}(g2FZ5nc_ah;hdhjx(qhaj#xD ze}3@8hn+xP+ke?GLP2=_Lz@tY_^8bYMr@<23!XqcgbX!|n zaG`m*-)7u)X#l~Fj;}^G*47k6>~WGwC$yho=^_~pc=)?cS&EF<=FuzW4JO$th0?T#rtN?eGW$umqk z{;TSi=E)y-|8=ctf#?zm=K!3Z(16fgPt+`TJ~=gJMyZJu)Pq@)d?FInfU}uo&o%qT zBb*G>K=s)_czG~vkeat`9Et*BfrW@A{qfqE(q{0XJ?iZq!P?3*$7j6qGmY^!PY3QV$xD$g_!Y{eK8Uj=nD2j19Qk zLj#`0L4Zw@%KSv>kL66_OHp@68f>AE=qr4<^b&&@rN$)QhWPy5*Z&E)6y$>?1)K=n zf&aJS*f01v(E@CIO2$4Q)FXFhgyYbmLoh?!z=dINxT3TgV_q}u?`Vie>8T%@P$W~mV}oAA&>5ljZiwY`fGC#(ipf@g66Nkz*YTSob40e zzEz@MFDk|2mXMIx|Q# zC&}WUnC6U7v zFPuxt(4P=p2-PCzS$1}I|1T69D?wb|LVbsuIvx~LKBB`)EG(3^xDZ0>qMv#uT|=@<{I?k=Z2&&8xORz7cRv%(TMc31|vs6 z10W8!H@3Io`VfPia`)Q(a-LIWqg|g~{-cn@_Fj`~rx?PZHmIb;XHJ)$ScfD~d1K3KeD%f|mjc-q z&dW9Jxwx{7FtY%sOAY$4BJUqEC~Du~Tqo8WOfiUt+b|E*O-cWakbY)CCe0uqxBu-o z?ouLyCJ3?#RE*rNkRZV5wr^MtB2pWJ0_@9n^W`W?EFP* z7P^H9g!n*xsuO3I1I5%4VCZ0l>u6@U7+{(bW8!gAi3MykB7sIkMovuY?IHFEV|ID+S(7dKK%Oii;S88 zf1Z?5w(>9zyZ;ruI~=k!2{p!Z*t^kEYN5ynJa%VG0JYlmt5b*|RNF(jjqO4z*1!)`6I?J&!S}{Spaa568`~?R-m;+rsoO6 zKsOf4)$ztee)=chIcOOqebrRDz18+aI^{$h`_JV{bUtL_4fYyv{u<4`T@dF3ac%>u z$7L}MpKsMV<^fO=Grrg|?@@Ft#3a7LQHNG|2ZnEi{ql|jd;6_@rx01~EjKj&)EV&; zM?Z8g#500dL^Rdw;kLp(1lR4G@U>;yMh}>haDO4F%m(;KBQo(2H%JA07)io{r-g8E z_~Y&TA`_qehFwv4bFmxil9~Y=zkZuNSX-|Br|#n-@_wRUMr;US^z8pp(TIlq85%I-Go?*d zQ)6)jNy@8j-`27JQ~xIt@&F7ENrJ%_hnE#2oxF${g#r{?1iT|L2ZM`2Zx98CYgpDO zpkU};q)~QahY^7d>YzY$D+Ev@_$6Sg%)R$`2$=#|4aou}hytdJ0jyO#1mf*t$)u7i z&|&Sugm;06LTtfvLuyGH7HDWB)E+B^w>JjaOI(rbd31eG<{`mjT|x7|Z<$E{LsY%Q zg5{hU30_5{Trgl^bcgxeJb;XfUyOgSlAx?Ix|?NwTc6*3{8c@fynv6#2aI-3zH%K% zGXs+w6-d&0G~gW$J;K|ep|)#{qMxx^a1)VOmmz5}Ae{8V>(;GP*KsMw@k(FNKKj5kmG1w;pj!;u5XIuK;+coBnoB9}J{q5)%>H z<7Jat9wBm!y|Ce74B81~VnFQb7JE?O1v5E&Q9i#a^|=DO9a7tF&%E1!R_S_*<26+` zCVxbGNO-*}{DY!pim_Mc^f>dL+iJxYSLFDG{@&8=M|2^nhf-q@|H+wk`vwdFJ+964 zsC^p1XGy8p5!B4sOkST0x{S}Tm>X9&Hm-))Fs%U_@&6#-9O_muwi52hyc8a>d^3fn z=U{ltrtVrluBtJ>yX(xh;ob}$i%epHQ&UMn>B^Nt&1qfzR3j%&J` znUROb5~i;e{hKEnRwnK^xPn=Lwkzw6*C2GSvJm158Z5>3tT;sJ790NPD}7guWBa8`-&WMEb8nAr=1DqT^>nImE|!(>QZY zZ(3_g?Rifxu8TP-N8XHEsJPO~n5^4WeEOtIuH31gea;7l78PvQlCj6xc35Ey5+KR8k^8Ww;F_eacW*RDl)ox)-&?!sY{A6+&swhPu3?OKn zdvjtQ9zZ7KmazTT2@4P9j1_LU`%sLdmXd!u2{AT>WXqM*jKFZjAt9h(cD$|XSm%>R zrN@^mIiEQ6H;#nu%}`y-f(dFrF6b98yKsc?uXo}@vqIo`lLrUlQQ%bW_OKDcML=4% z`m0QY;{-lTeG|MmW90FLbkVa{m5#=Ke1aQbVGhj9h$MwLj1jqp138HB7s-#_#L4V? zvVp~Z`UEFU?v+_imaBi+RALFD-`Rkk0AJb`U*riQg~?159CSn*k1Iyu{%c%8hS2rS z>_2^4Y0EiZs9!1ftNCYfQsSc%Mw)cxVY={tr-?_!ct$AYb!2jyhH$ zb=c5JPkR%k-9sFhfEfWZTu4fK(Mc&t!Y2fB!WUAiHm?#VZQDPPSN*R_TPXrvixcEh zE!baXnA3%_301@eVmE|z?Ig7GCDXhB&w-*2Sr+!P{dcrD1#BkHpfDs&TmVfM0YMm< zqzLSu@cesT{!^LaJ|ILFel$Ui$>oOao$2*Q@~xTamMu5!qoHfpg zufATfhf_fzi0WO#ySKf{qh)TRH~oC~RO*&Hmj%rKe$W@p_8KT2t5E%em({}TKtRagYn}$ zH!&K!m~+v4?_!tR?_31%JC_e@+zz zDilw~=By&hq30N0B8|b~gWh|Ovni{@Xl-ntzI^$_bFqQVBM=usf;;!0JegDZi{k?q zyVZl2R($N-bhVLNd-Cje#_ztewsNc|$4ilUB{Q;o{^ev)_uS=6vqMfCBj-{xn_pUX zVxTaZ5>I7Q{^FOMWa!ev**gYyq35E-b+Zl^^Y-#WM5B#Fc(v+X>$f{br@_1jXlZ60#3+*ULC5}58u(?K z+_qIo=ye_KF6JH@`u9bL)e$Tg7_#fKzS6@J2+Qd_uc^=M>G>~jWQmnc$||(v;GId} z9Xc{FJNL|PY4hN9S${b+N}*h7QonrXxcR8w!aJ*~2QJKxQV@A+2^e_V^~Icea9&Fj zH6xjh2A}~`{}hgXx&!7PHXX{Jk$3cyBg!{e?77yOAI&v=-Vvpufz-9VOp${5e&s%o z{>@$HC)pWD)=I`1z=GBp#HuD(!c5>FfL3(dvVee~upvpnXzQWx&Vh3Y(r$uL?$Lh2#R)@BVSAW<4$%(I*XQ#j1 zfyj()mqItnreI(rhtC+suCc3+mvquQ2$19NaA{7$BuGfmldHcV0zn8Ev==BEJC>pw z@6(5rtmY)L{I-XI4(~kv7tN^B0WwX(K~QLK)7Nj(>_cN30n^cKuWH5^7z^nR9qK$@ z=^xF0>TT}wzKo#eq~-|Ch4(xx#EMKU+!bU%K-v5+N7xk-oJvT`4QmSq#XeS=E`YU; z>k+(BdZ+N{ii%9HJbvgqQGUeWSt3IsBzI_Au5DsC(gL&HKiIA38m@c1A9XPR)bTPAlW-&<72nHYhdJLF?$y1CIBP#!s5AvE8P%5 zIDYd#kHGa%2S+DA>;iIfojuEuatpc=_%z5IOi79YqI&1vT5*A4KeIexNSM#vTU}Li z;EusV$A2|hY%_iwr44N%x}X+dmqarTs)TwFeHlQMw!3>*lZEC@R-^>2DtT|T+VJM~_U?jv9d_h;R3qUA?AUg-t`BIlN z)_UA>?~h((6<>ic-VJM3%#QSM%2}NA{_#)$Qgux$FajEK+|WvjwDmhy`ZQfNRdH+h z^*ed9nOOV8RNp^niKDecD=?K{XJ}GL1_rr|fa&75KXmGe1xJz~n5<&B@DOprERR~m z!}q;~<_;2%J-)jMs`lzN8Vn?jE(L5xQ?c&ij4eP&^16ZdEQtMqXDCgJChmOKkaOm- z+ondY^NSud7ZF?wNVC}da`o0U<#u+MWI^{6ZwYK=QfO9_UH%M~@^?(K7RUa&CSoHJ72HIie^mQ3_ia+o-2OZg4+s$r zP5MtTZx{@t-ywm}TVOxLra&S$aB3u2PllW-Ivd&;$nd6fO&!ONog18kMqWJV>&h}) zYP<-)B@np}p!G>)Ka!LkNY=@D)~fbRKj?b_L^}{Wm_6~72QsodZx;j=K$&i%)J7L> z85-ntQ=h*sk@LiBg8w{XOFr{_EMx4ZeX~zrU*Xn#`+wkW&w&~iY3*mIAD{krr5{cs zY{YlyRNcRf0=fa;A(mv9LnbJo-9=Jl$GCjRHAnZ2?7@+VqCw{-OoS8H-Hs7#K;Ssq76SYv%S?S%C{yUvY z!qqe7DR8{?V||aJpqE70XCvCxg_$hBr;;qPEYYGu4T=e#RhoT*P-a7qh(i4E6~F4A zhkMRN7mjcO$d=(azE~nn*&Rrsf~G2vAc5GvFUovUtj((h^1tBnh_=lFQ=cpIG1Q#x42TpN}2H&@Ee{5B~MxmVYq zXlG<%5`jh@dx_vW!0TR|X-1uFjL$qjKTCug+E~Z@2)O}hN>Yvp=LUEKzhyg^GdQGf z3VzYPW=8I%?1KT{J~W3{XN|92k~zY;@O5lBz&N)<+PM!mc z;8s%;R_#^wO#vmaI87?XsSb+~(A}oIP2>w=%b9{J19dwL5f>b~G_Z+~MjQ<|it;i| zTaFKgk6oW>X~IifW6QhIwSqy&bgAb0V|M>G&Mus2Fy<=lbmz^+F|8}5O^ssi?%vMN zvU}OTUNUHk+_G@a=WRp@1_lyAGFq`etQLX_al+=Z-I1b~9&*6&Y}OT+r}3Zguhpci zO8@!}hUsEKPTO7U?fBo;R-S5o+UK0~*ZX6q$$DKC(#0l|8!zyTm_xMkHhFktm`)Bn z4BhN=-)(u`d1Xhdce+v*y?+z;#Fi6+k_g^0i{pAKvLEAQ_M*YcyLh0$>ZhxUHV%< z+DS-0jKOMZ&0?4TIoA6jj#*;7aoA|h`bR~y|vaiNY%!MQobyeCJ3n~BR` z?+TW7f6{hD*I!q+)Iu5#3sVNn; zl5ff+Z|KkX+KGAkY?50PtJLp<@q+3mc!)FL94B8d584V=3S(&xp8MVM5u%g#cqk-0 z2-DvsUVbo0ShwowG@jObFno6KFBUyMJW@VoQlCe+>Q8y;ENl4Cu|A65+Pz`aGV2YO z<*eS3TEjzS>ul7)XS*R(;P=HHFAj0q+}F7;FVLK18p2|m6J9frl9DYx6?Sej^*Q6T z*6CW8fOtBd?*2rJ@z-vj-?cRLTt8yH!aaH8hmDIZl!E*x?hmNNT_2P{%#_?`BEyX_ z35SM%gM+6+x7f@bSolNN71uL-F;o+7No4YvMLsz*X$zn3Qe+?~ zUzRnaUcP)eCTMKAGkq7wP3I3tj1c0z<@D)?EiU}TS9SV?dBI(A3NHnEV2+iW!?vy( zJt3oKBhtXzCZ?(?;5qqB>P__RXDgDlYM#A~jSHz2m*$SzWt=h>*?93Hv+02Y0`dY+ zGYBzwQ!Q8y1;M)m`(J5k9(wrMQW`c=9P0jvCI9~Edavh@>*OQ%lFm(qDvNGsV z;1R`lFfuX0Y-SQ!S{AK7np2^y*V z9f3`8^Jjx~C01TZ(^8Yu$@FxJn1@tfu*Uau_*q4jYfVz&k|+ep7LhS z3sYIV-pUu1cmx!?y^CBl1vSN8ctyphi#r5O)l&Engz$f=2K*t9F-;jJGK5I1#(hJ$ zSq!zMMs`{0Sfw-;N-!cZ$edvmvO)Rz`2*9-mM>pQIXT$x#3G(0Y>i%d8wJtA-eQ?|PEh|FE!e#E6pDkD6sU@SN8nXACRZ=vY) zgwsW-(-LtX=zMqR>W0<)0#iX!b&5Q`ti-8&9yHhJ55e8p`p7knpK7Y@1>qIhMmz1*4erzd<8pbgl`i>{aBeM_qA)+$h}5#U{$%-H0gni zhnV2bnLeoQ=)lFi@M@?%2VBnv{jphNW@aWuYe;j=x^?WtdV>j*fvCo**z+|(ne7?% z@x!_1a4B`0wXrb=xa!E^VY>+TC?Sm+lzv1<1aUMM1X-Rl6RY5B3Y?kogpl192%=%8 ziTBU@?^ATSZ$isTTX|ure|h;6dG18r__McaZ)pZxUK3E}8xYPLAi5KE)?gLm|MMwr_MzXJ_f1^!etC(%hoxTEAH@&XVP#`m=}7b3R3y$I6hHeYh%XGpFfX^34Aq1m^wMu0HYRpPKqFO!^+Vy97~6|i@>R< zk(|)4xlLDf#l4kRs7YPkrP_WI|J*-koz*K9t7ZYKNgE0N#dgT~A}m2@DQ+5P0xLd` za-GJ%vt$&w=N3R?lPLZ86xB+x`4d{|muYB}i*Vm+8g+xHx!t_=V(j~uT7f_S3OFl~SAST8C{!^2bE8u+UGtPog06{s8VMWZiYzFlx#H~ksF ztqr=OXu8)_G|s#-Gm^HfC_@5~zpt067cdkaE@lx_0I7LFWT z&~$}*1_re#QU>3@-*^A_8nZlFJYTJ2$BuQfM_kinbf_EJF7 zh5%K!;mC$MlxK=Y2&qfEO?|_UX~kxy`v)0w3K5daEclGyy(o$QTm z+o%^|ZaRwoTmSYmS z8*5z4IS(IJ!G93;BpW>_H3fr|qQDpm?cTkcLIFlZwm(slA+m|gA|#fU4A7wXzc8TwTc#JWOIkUT090=!zTZ6)%Rabx;}zuP(_ z{KBX}W^kBR%}3($+C#JhXZ8#vaJ_x`M`&aOR$l)ryg3fbten>x99-CoX(~H}RIOzJ zjR1J8Mqy5&K*sJLAJ2_SJ_xFO4tPB>JYZ?Pd<6-?tBInSFO{(J%78Q@fp1CF&ueu;n&#N1LO$~ zW-yV7Z~44ehWq)87vT@H0Z$S4vcM?#IDeR0Xu#z>1D0#$>>P#qdI-Pzd|;qv%#`N) z3!4Q_n><#?Ijb?zyrIJ5H5DV{mOt|%dWs%$R*tJZ&M!P3G0s#80jLFUFW@+g=H}+e zR;VA82ad!6L{@3WuTJTm>=Lg@k?2H5(}d5IRGYj!tZa^IjEASUu??sW58#yae|?rg zP3^1SgVIvIdy8^N`&txxpkg14u91}`up%~SRl*zgcgE#qMf34u!t%@DKAf1kyh-N5 zXy>jb-N}|spr|Sm6)RRNmJG*6Q*wA0H-Ont>46k1z-ld~V=L5erG9!@of8_Rae33? z;TfCg^uk==05Aonmxt1gtx>SihXv_}MzKw}=5ZV>qR`UTEsv_t$))0vqaE-uXwq6- zed4iWp+QwuS`;ah7;OvaP_#$A<8|qDVjpHnQfsAHzmS-`wpk$T=1ptPg(qd#X=k7W zGKq!)Z`$3iX$#2hvfSWEC-XTTo)9%|G-Lld=k;@FQU0Z{eFsKi14$V5!p#dQNEFVD zt?9H$(w_@U!UcUvBFpha5F`8EB}+kofk@4|x@RzO`GA8J^Tl@Y6$ zKCNO#vYi|*2)ic3kgvmUR)uYo5DR&ycZJdtvZ$m_TaH&r=4i(|;QTueixAEww7;r+ zip(iz%uFdP%c&)IhrC~nreV8$9t){8=G zle5i4dl!p5v%Kg{6cKTot#vkrnG^^^4EvGJfoHkt18{mhw{8 zD5e-&clXgCO6$YfKP=ZaiaM(;{#)zv^qqgA8YNE>4g^hoedg!SpFb?zlW77B)+=Vp z`sh)!jN>x#Owa{v@8wOrLC=zRqqdeNCMHE&jJvWsx8l`f5yw+=D#*ZeT?|0iqPP04 zRf**fr}z?df%Xsfw5m^jy2w?nqojS|37tjvl-N$cA;|gZy;R!-1TiMXS6c7+V#(2g| zyMd(Kykoa`OjMM8%B>>?W|i`6feej;R11rjKLJk|SIu^BZ&e5^NtZ*!cleRWy7AnX z1n{3!E~dq&rCYdcS9rJ$$fw&J>sZoVxJ&KGR_%rAK%}3qfNvNcT5?yyPp8%g-4p`` zY>|Q!hnRiU#}K8`1MIQirR0s8)Ni#6FTS##buhZ3M;6%3a{s{ts*s`RjnFzQ!AZ2k z!68GwQuKMWV*AN&647yDma_KSW62>GrA}S;GiZh0&In9Fcb!8Lt#L zMhCW|saNjBACYaFx0Ee`Vc95Ss#;o2=Y4(S(wuynLr>Vdo?Tf>(|omFFrMEq(|`VV zfZmm=ggDWiP%%7CUHnd)Nm0_@FUSVK@W2V!Tu}_3gD>4dOaQS#7eQE(f`0qJet0Nw z0@gTjd@@_}uzB56Et=AX=f?V{ewP0UU0BL(Nk*yu{EGf@T!XbjiHj>+K@_hNcNIO# zVa1hdp2U?#x;&^(DU9q6IcGNJxUD`pyMAy)+QVdF)ub`tSK-p&geqn`w8IFf3&k#7 zIR8O2LCl`?a(Ap4C~Yd76*6DT9*T3Ksi@VW;bvO8O`vUNQUu)-g6j~j`foXVTXkq@ z;`sKw)_+QRo_=q*jLCp%PxL-UVSBYZt(tNA7qzg z9^v7sxNlYw#+`D6W?}Uws$l`457WBUd#XXlm|93kSjj}~NEAJd=Lf;ZqKk*nW^@Y( zGhBilA1ikF!Jg9l_ph9?XgR)pmy+kPM42z3Q@u{$bbwN7?ens_Cob<9|85HuMmLWi zs0UxdXV*}VBXisFJuWg-4Vo=l;AXeDDj434J2RP3VE)Me#hn0;*YSUE3>lFgPBN@S zQ9I=gic@c24VlNsUQ#<94~XLu7Nvn*+~Jk!ct%qj?o3NxaX$=+rg_)cD7f&QmT?D& z+gTPQ9*BJ!hJnm9~|i49pS%W(JXz>OylY&~K79BU-5j_yIC@8?Z!G<=G6E>4zlo}}VP8E!T5yAr|K^OcfVtZl~ z+t~$K=4P|c`CLvy%rpcjBgo(RxoBA3k~xVv^tsWOsLWN0e&yrY}zd(RA>9NR4;M$^w7b z)A*sakvF_&_M>P;?*X+V+4Kvm=8|oPnI!%fQ^A_-rKc^3>n|rKrvlQ_0N|zXdspOUCQrS z8pqBMRhB3rns}LdLGFbGhvte1oY(}8TcUK>4mR!EE`^N8MMYeXrz`HkxXOs!QA`bE zMlu1Z7mbaL9~SP-G{J#JLxlQ>pF1MH4}W(ZBAtM{SwkU9@?Y-1^zdAogZvk#fhYV( z=&QmFL)6}s3gAEO;I*MXVaIR05Fg*u;&f~ss@C!Tp^Z4Ry3aFi@h+BPtruI^<}o_* zpI+XE>!5uqJ~^4ZuhEY6t5#9r&3N~G0TXuXlsU#A!k;hM<&6Rpm^mryYoPvfLG9Pa(6f2nL&rNo7tDMd2^oH}2+8`F4I;>AWhA9uKa?eM4(+&YTBm zhI|*)#@~+f^701b-l**B>(h=Islkhc;FFr7c4o%#P8S#?2J&UDUl+tHx$NkJga|4M zG(%mMH^sGaV7$Dy<=EXbxeFKHGU<354i?CBL!zR(`erevk!tOsClzE$g){Vooy?j>(OLcT-uP# zA*#sP{V3{G*n*!XaY-uhtMUGDM8S~BF$v0!JOC;43m;gPuLPHU(%qe`A+(mkaKG^S z+#quJvCp5$z(^Z-W<1lfhNg{S7RP`~TkJjttX{O*2Xm)04FDW?ejR26r`ZlJ`}(0% zz~(6aB_$=DpFjQhL`%;d8Np)s=){!5H{~5Cr|#EHoc<^r%d&W?d(vmOPay8i2BFUs zicTyEQMiwfM6gqoE`)y2-Z*Y@2p|}A@>*yQcSNnU82-KQ-afnF{{L8WwhnKXj!}J3IH?=@J(cqfqb-3r={P zJV~Kk_lZQ~YB~A~u5+;R!m6qV?o7)ULTSQ3R_fU04vIOQLXk9(xOM7-Sm5Vy%HEOZ zQnQ0pCKTf%tu^0jBHpoPnlgJiad2}-=^2Xvjx|wRuM_%plboW0g4NNZN2?rY1E(Bt zwbbH1Wz~so!@&gc@iKUfYoXARhj9@Toc;t96eyE?4MgNDBSkB+)-V%&0^rg6PZtbL zv65@Sz>rM?8jA_5107#zXlPDh;SMBMxBv+v^Gm&dRaIX}NFWU(hMJHUUaeagJ^%9F zm6#uMUk|suvUZ3KUm80*%|PiM>thI?IGOnO0y)R`U3Ub9%T}EHaHNF;1h;=6gp?w* zmw`a^FtmjWhksLVCv?96c44_-0qTp-X_ae3<_2N_DqC85`Wv*4$m9!5O%;W`B=b?C z#CP#EYgkb5R+7(;794q;S%%pjr%%&T#Ke!5H)gHOOBr=qfiT_9;zRu}Zh;TK5Z2nw zyv(xka!+fvMZVEoYlZBY`HeZQ;*^_XpI)MpQD87Rqjo|&)bn60$7GRM`cSTpZrbOf zxYP|aR)Z^9puF)fE%nX%#Q=2o8K76IBS(UveE#5#0D-qwhYw!>RX(zY2SpmP(Af|l zg1q^tp;%^YH9jbG!Hiw#I^@HG&AayWMckJ(6d+}mqwYU`VW;q}?dG^o3X-UmR7OT$ ztBq|sGHFha%O*3>QMtId?pPGN(5-_`9%UFNUbHCFkogl73eLa|)lJ(F=mc~u$Wc7w z{vUiEWW|A#JVx+LY)858K1$wR+-KnZ#N&L|>qiWW{st{x0-1&~`)FM+e*>W^>V@I3 zp`kEd=LIb`!#@>2wuRyjxIaF(Ft}No)9*~Oqb#m+g46eK(-H9x)3yq z4EI7)POM%jkhE|2z5!tQChm3O!2w0zj*R$-&u9S_ASbR3!yJ0))Mw84|DLV>3Y_+w z?wN$_NWtnjq5av^;XG7tYiah~k6CDY)3oS+-#!7bprfNhq;&npjb@Iq+xBBm2I{8E zbT|%cD}e=~U;vF4(tC28Uzgo~!}gPqfM_hKQALmKx120f!VFq6vVI2c9-J=s?x$6w z4?!^FdcO5)%NG0bML#M2m6Qt zu$Yp3<9?=wV@E~+>WO2%tz>Kw3`X?_cI)as!@(H?ME%}pP-Z#El_j^G+oz7F=FX)T za51k?Kf{NMiYVFcdrB6Wx<;y5r#uazXQTJ~#ppS0Azb^1VWDs^<_SFH0$!O92OJ2S z7e#IK{_$(?)j5)^E%&v#CL|Mu;Lw$gCzvuD(2=YL8fd?WPbj!|ra>>Q!c zLoxZn!|ximc&qwMF24{MI1|8|cW2R-$$w?*+9)j23ovXExy@q^mY*amfYQGDX$K)) z@P1!pK7e6jU&^g@Oy1W~ydXs+Lq1(<#Gt>}KV3XJhAJ(Mvf%`!=`|nYCFX@|AnXYI z?+CF$BGh)3jT=Yit|CG#6>>UHq?WN)$akl0N!O(+aHQFvwFoLiZ+E({t;S^?#Ix|k z6jlW8b{_fkDGaglHz5mDEhj?38R)&h%f*T8n$)&qzW+ivHIB<_%(S9kaAtDnWJ@bITuZ8y`7e<~u^1840MS^pLHRK9a>Z((3-_sWrg?OK*oSYOH99`|KFCG@bvd*3v zL7H>l*iH^FIZL(hxR~&%f^YzhzUsu)?H?1p(Ku5p8)MnXmVDBpT)fbxYDENHSo(A6 zLhEC^BwtWh7IOrB}v8Js$9R=Fs@4G5)A5wY2-O=rk^Ax;d;g_rH( zKcLvFojzCB<~rq2begfQjv~9}UHBcXuai`BzXLio>llpU!zocQ~i>HaMc8+>DAwbThx$5YhRuZ9Md`M!$?7B0Th-BT|}N1mxsXtfrN zk-X9|+Vkf_&?8FcTa@^3Jf(H(VyVx&NZ^AZAsJN)eOfdz@+ZUe=z2<*t9Tl!m7ivG zXxlR2x$q@)GdL7W)5Ua1yeKZ(cdQqhP_Jof(N2sdI^Dt$&=gfkitItDzb&bFLXYJC z7bhsQ=e%9R-Te%@S6U90oz^Kc)m2-&_T~|T$urFY!m0=U{bH&7-Ad#ph0vr5+Ue-H zI9i=p*XC_+hKJ9CDiy>DbxB%R;V^-Ur5a`?hh7ic4R%?+i&zjOXPn3Ps)P%bL<>D@ zZ(jyOxE5+P?9=#r7Lb>T=^%vN{GyOp;)NX%c{lQf)0*by@)R{R{xGMd*9$C6Niou~ z!!y2tvk2`ms8d3u+}-zpDc*a|o%O#nRT|m~OUK%83d`(u&khP^%fCarxKvW*@gcw- z0<#PQ!^PWOh-+sCWJm-%cVa3iO7M40`af+}QNENi#I0SMoG(QtZ!U{zPduKoN?m;= z`ZCpm=DIrn3m1CkrRpkNTT&9Dh3#($^FvH}apju%<850y92Z-8{IYwFpjWj%o~*ut zRshDzist6#iLEhaG8O`L8xtAvpeiJ9P^QPJ8ZU>QUqlJ`Ni+I?WRHITj^N@?6a{0J zkasvg*kBRYGQuZ&gX%O$Oot@qL-UeS(2VVr zhW^wT4qM2jtlM&bn6<)?9F}lH!L}<1W&l;d4&aa!V#O$edLK;2Djg0#&}d3^8{3jI zq7xhp`E;mbW5MRatU2?|V6cL!VnDqlqO>$2{aJKuEM;fy{p}BYWjQ#2jaJqyT(x#u z*h>_DJbaS0Ky(&J8%QirM<3{)aC``SU@bV}j9t*xj>h#kG!=4$18#gcRB zdRxMIaMNy&O=L_<3+a)0xcOKIMP_fqiL)~~GZ*eXD))@}t)_mctaag&igD%}C{YL} zf~F!6ZET$&Q=;_JrSS9!%jz#6rh!8RPK;ySR3`T>mu4N>JoxG5oaOXrc15s|{n~7c zrE^o}?Qb#e*WpFYM5W5YzP(uG6uy;%fBC3VLIM`qhgRh-vyUfr^>=q3^mF^AAFtbS zR?2)|{s+xNy@lKsHtMs?DqgYGs|d+fH=O7e6$CN{L7eQ6ZeXMtolNQ6a}4Ibi2LUa z+9i^Vhak>S6oR`3tm=p5+pTPh-RZ{0l)54W#F?}&%ZRUZckgL^+2}TUtjxYwX>c?< zzt7bC$nfv$jolJn>h z>3UocUycyu70(+>f=~=r;sl6*g5z0Zqh3pNeO2jIhiI{>p#2XK#lRaV+o1HQrKLLD zcFM`BZ~b7myi41w5(ZgQVejqh+81syi8`m?-ROCjqnWvY_5v9k1O>vPBy>4p2|*5E zT%A9=@(8%h2Yv?@P6YJ`xZMG}jDpl0<>ocb8i`9E#+XgAS+#bA0cWjJh_{-WvJq&$0-XmHL@-ynoM1k>y67x7m=`w`Zy>Ot;D^TEF1GHi*URGPl-!x%K&6 z9(KqNBcqDZY?{lLZGP5sVph5T)aQVP_<$HuXiowjK792>Tqk9pmLD6>O{L^CF{4MK zGs8nU-NNJtOzL8@{R)< z|CWAYX!|%nSLpX=)pUHSCTb7&3iX%pnilG-g-C7aY!ps6p4MtK*tTsv@lr?#SJiz4 zb{O0Ux^w49=U0%?R9kEF{TYS|wo>it^L%{jE4m*t@~zh&cUVGs_DqW{?wp;yfcioSNJDNw z!QEh#cHb&wa2iq zMtA!S`o9_fc+b}J2X%Q`^_J}qy_MNHsIl>aY|#Y9vRV{V4mUOkUO%epvhBObhA48)k=8k1W^FsI=Im=0&|?^DzPW z73#7>!gOAf)Hylq9{o2q)6CCks>!Yi=zI_Wk&@qU3LD#FQDqjCOv$T09b#@yqQS7v z-`~PRF^`>1#a&-a3PABTO=v4F@+g$zE(mB+__saS+2gP5muHM+_=(xu? z>{QFubn}v&b@KUbO^I8o!-670Lo%XeamPl(V@3nqPi504Tf}r|>tar!J~JHGZs1y| z2*(Dn5>t63A8U#$P7H^>T9&{w|Ky@pI)`P`H=p4rnx9`n>%@CetTGbGRa-R z%W!&3sxxN(d@#-Yd~rcU1YOy@K!%a#_mfgmE;~(DC?27H?YsYENt3?SoTt%T#=bR1 zG!n`$CnlFI8>w^hL7<%*6G*!Y-@i6GB0n5DmYCSsbD(=jG!aIo(ZMtxX`ud-767a! zP?y7zSM|*h6w`{yd#`7?+rph? zDZJT&ITs5_Q`Y-CJH#a0Ia0;+MLoYut+P4*@wdyHZBrlI+8Akuph=LXQd=@o~*=)xY=+2|dG|UQd>FA(cT|G6+r;BOjT-@A;zyDsT zBCIo1=rkWCGJmXDF6eM0GjE`Ay_=JOzFnHwk1uO=cJJ;zTYuXuP)Zm(L&3onj-ur^Tg3HP3$e$&|lI?ptiKoX#al$CVyJ zXJvJAbBCrgKF1_V`%SG{729z$;JxELlbEzBt;ZViBjFM8Y1cQ2k9=!wo>nt5^_kLs z{$sSbp#Sln*kfIta~s{pWp(yv3#_l|a!0a)hnzexmh|p~&ONU4eRf*bnBfqzB3bi`-WGBo!#L z^D~-c#{Th1u!#y1-KiB7IB_!f;N7^7Q)+%sq;4LSa&bxF4NZ;|&EG6%86PKh>`;c! zwfhI9gXTZVDDG)$P;iqu`7Ugxf34+-BG2ajb96%=_9uMdxb2zTw*B7fTi zUi&5W@2PFjy%zqy$@&ZZ=GF2a^cAFk3SM!wC`mkyfdOnQEBgADuV25O;;*{)p1Y5? zH#BsVo1lZCNUp%dnjd+u(Kv}f@rVwr5?m29fJx3iupJX=ASm@}DBRlM1um^3NVy0m zrFEqi>CiVM>5AK@H?Gzg{vcVn{Ogxe>8hJNypr}4v$M{X)!TO19A8sY(t2a9{edFy zy=NXD@8fZJJuoLTB`HRETSHY=)}s@I^Znb0?N4`VO7I)+2~hW~y2$lOT2W`i)D&0~ zksd%5+;a7lkXu{7JQ3yKe)=@!gywDx69)!YU;it-r=!$!)$XqvbHblWhq(kTio|Fr zV|{nZyW_|WQ0x}IL9LWacL7<=Ln1A;J9{iII=`Z* zdeD!*TGr_9E;8lvmO07F(7Zr*?gMq+k+g{)%5#3ZV#Gq1zL@%)A0_SVEbr^!5-G2z zXGBrHgI+j%tv>@>)%G95^%b*U!iSP?55CM4FK9n}tbS)yRqOPO%cP3WzH4Jtm{PCh zZr0pt&~&w}Sh?*kH+by9@#H_V)1Soc|0HZMcrGtEz5<9r=XS6;<>c_XDz0^P4lZ?S~fG5FwBUk7EE>)wn_02ATMo zd9e>pr*)&A4y;_Vgko%5<MQ1JN&OrObDyTL6?P*{HZ=kfcE{BJE*L|wXvQ+B7q|I&|xDLdKp9*!|m+ zj{N@hjQ7Ca*vF@~yE3seQoC)n@b&zxj4qIOta3N#Ypq8LI)x68QSMC5H_hmjcZujZ=$OsRyu3^Gonk&Dph?a5OWbN(>BfR zfLgAbKfO&pPVbK*6R=2}->ZFYvxgRb8rH8YKEoc=t!kkS|_e+g%Z_B=Yh{HMJK zUaeWFK%1aYt#*6KOJqh@x5X+uR(&1o2@+~Cyc3zwd%BuQo<)N4szh>Jw(BmPtodc% zBd<-WtEoyn!Z*De?Q%SENvv5cFg`wE;NvBODif{gFX1U_KXV`P{^_z*PZ1Si7hD!o zI^MwDK1#*z^3W;MjIAcF=?2@GsYK85Pcq)pr7JX#uX}x#P0df%PsnXF>~(5Zy`V^n z2=Km27&_Ns0F)Y1S6{m$6P*Es@t~uhLa_+$ew3TXr)L#0o7@Ky%hHsJjs<@)spo%a+MZ~o56kUy!C24R0*_|8(F zI6+rl4pFoI@Q)1h{miw7Y#U15S%AczTg|q*IZA{2l0@i-ca7n_+$;ioe&wk2lC8)pO zLUKVecZdlXYAQ0-3xPxdyT9z!h#K?u^i&}l$4A@l&208DbLpwC*Lkn4&HHE0_JYTN zbYQosOZ#nOorFyrs5FBTUeoOf-Ml`0<9uJH9aR-ZtwO*7&t^O&tF^%H_3RB<>VC27dqxdd$<` zY{iw4k(?XKOQ*tl4nNQp*uaWgy>Y{34Q1{^GjZ!HgLlMdxks)K|5@nW3ruVq& zd4B6z@4McA-oKvLTK8Jr_pQyo_H})~=l491<8v@D2}#d=%R0Y^0F6DiojI3)ua;-( zxjDdPEOGD+g3c_iEPJ)Rd~W+LQpu6K+5GamjO;k+TqV2c&f3YsGeA;p-m)c3?b~V& zW_sH(cw7)Z779$huz~^yfI@pQvRdnfQr&v<(WfRf>?1nQMnwGg2Wj7BFDdtn4|Gc|nALg+-E#(5Ij(F`Fd!X;%Gg)f)WWVDF#_6>@ zqK8sW-8mvBC#hilPp1C8s@V^Zql{}hL-dvk4{K|ue6NXm<}trRs-=mIA%th+5h-nR zBO{9q%19n+{t>aeAJL$PVNAGM*i#hM zn-=tXNIIuNs}OR#x}u9wql2Q+OjRSb$p>u3&$MUVKpgI~z~HyXmo}4E+uOF4x3lUk zB~XTgg6Qc`>{VfdH$Xl}*r?3h0VxQEi8Nt&cb`F`f!Ri8&E&>*)6AEHi&ghWf4j>i z48Haob62npJnk@jt=d*DJ&m+xU2r@%PIfM>{Q&$@A7var95Zq|vqY&S{b*&MPl(Kf z>}9#K*Xp5@LaN7mE!kh{=yNM>L?XcV{Rfr{P4o2@dr3`nSBCZ)@~GEhFO<9gAVfuI zhtqJMT9!sA^x8c|)co45ta)e$_E9J4KtZt+$dCs;+&C$~6zjPbrN+OgFw zBhKjPsOZMZ@6XZx?7Q_bY4;l2hSl7gS*wSD2>wZGZr3B*)_iJ=x4w-T_2-ut6uOT| zkowVvA{2=1?Ciu7N{G#{VDW;>4$ikP^d^AA(4#+uAPO(xi-q(@XKk8t(8{dkXD~d6 z`OLnERpVVY?VJn09j8_8szTZ4PX?ITIBu#6yg0G>>-OvZG$--{kJDu}M0}l;Wl6$D z;IEUqcaP~#fN}PIwvQmS3iXf?!b>gx=Onu8L9ChLnNBn z>6O^i2$I~8r4_Ys;7#etn961&Q|ssF5-)eZyL(l|vDCu%(un7m+9tz~d;-cw^RIYk zIQSU8kBE3)`S?;yy8dpRPjZEpT;7ACA`|0>6?(#LZTDySx(j$}16G!KfY5HDeIQ)A zByP)8)0nvPPF>H-AgN=js+A1JC$IcGa(~yto?Fs)>JHuuKDDwisqK7BdFl5i3%du( zOPTBuhG%oXKx$AGF?6K(*^%3W`hNSx!qFHfNIGz|Uh?#$;v?5p`sbLU?vH+7-rJ%(%sQGM$9c(1q4^3U z2u504vYqw z6TpDa%7Rd@#}|Q);a~E6IEumVK8X1Tk#c$5v4~bDO_*y_FkhXD`>KWnwr}1`N5~tD zGb6JCcf|*~e7?%SQL#~4x7CU0^kpm5Jy+EK?d<(qahk9iMl?#d_nW2kw<3q_pj`XTb54u76$qwm%RG-ygT&^ zjkBWKPNZ@dmdeTt=&8kX<}STlMt(pmA_D|v52E~P(}FO~8Qi;VZ{>#Tp%cX%vM{a0 z{kY!0N9QhI>l|vfxP-%{g|Oh@H|U4BK52X* zBVBD$kJ{eOdc9K|wv ziYiwMqRX0%yxP*zK1Mu$K6W9C<#p}j4PFk9E=AhExMb+I^PR^I$t?#s$3Ijx%kLb0 zW*cT}BqRAxU`SoBS$^i|x|L0q_1l|-V?o&Ba`>u)#Dc^JC5LArR`^Y1P=KLG=kF;i zn(pexxx-@NI~#+`p3Of;L<0JAFY+7GjE!CGw~z~1DVo&EE@lzP+3xtt>EZRK530k_ z^`rS3AH80Y{m@ZQkJ=49@$kNDT`Z)by_&dFyXoHWJKwY2+w6wl#~yjCH7P}5_bI$E zxxL;y=8^FhIgZHf_V$A;>PAKrW@6vkLk0}G*g4UWXxQtmHm{}EH2U>XY=nAcYkCOp zn-~Q{0iM{43!zL+vyv(*KMOmwL$2o9F|&*F-M}ynVn~qXPKMc#AfZpH@_*^6$|iL) zF_HJUn#I*$Jft7v9I7&!nzJ%#`dYHbOai4$i(geTajp}r*>F&u?iEh{KYQ!+<(UMe z9pvLQ)Ze_3kJSj(J$ye@hfqRo^(iUrP}Ev=wok3eQ76&**SD-OK~1vl_3Zq%o4P$Sd6qu7$IP_EZqt9~u!iq^}j+Jz8he^~(!?(V-w-n7| z&98~>u8R$cH|q#FaY6dwvx1fb;IjEQ*(|Gm5nr6-B(i-60(>y!x(gau$c}%^3^9x zHvgE|GNJZpQ`x%ptBZde|M6p}+Sh00gPCP-ubG=>PHtV1OYu{4lbbiSZA_${LtRRC zdGW$kwN$_TX0&Lq{;;Hyeq~ynht;etW`WvUSn@p@-sKvboI8yjlaiy@*fDlMQNWs=Twy%AFG&BB_T2U zbhmM9v8(IN9crSv$%3hAZ8_<-RLf;ALs^mCLRZKEJ2Ma_Q=hb@B=GC;_aPK|`Itiw zDt;Ap>yu3vW5liv{DyRxFVLUv*?Ezv z&#|4~o|^O2(hu_neNVn{Hrdl%uHwyWk)N@3*CrfjUVLNRB)O=}hRX0LnZK3qK$ zQci}3)CQgIeDuiho&*x|9DQ|fSu@LqsLaRorJmR!cdBxz8b~w!#2k)m2a^IdvX!}F z>Zzg%-6Sv=jCjL};AEW3DdGq)FiR`u|!kxT}UhzpRdUsYYe!ppwpT~8va_!3vg6yIW zBx~!yr|zf-re-d)NxffQ0@C(sZtky~tryN@KhW7$RQlOxnIUw&*jHf^HQCl8`PYi2 zObbQLlWc3QOQBhwy*D<8QODHH9K z)jPMt{njR04vAs2Qroa!r9$kYf}h_8Ni{&Wc1LkY&PdNz&W#GAEu8k6*?nK&7$&sy zgrGrHOIxc--kCaVfWR-h#YLqh`6%NoH`TE4z&&nS*KOMm=|9jBtIRO8`YJki_!2r{ z8X4i?FNFN)gUEhQp75^eeVSODedx9K@-cE?YY)FuAGhL~UM~(M52LpC*0Y2DfBIP= zt+%&O&4OOQ``q&IrjFpF%Z-&4;3h@J-_*^-Clfb>0gX!!o zpUhs8rF9;!try%$|NOMbgc;A^%hzcXb_|^QKhuqMroK4ayKCB2+WyOO+mlKrv6bbu znP$vxV{uE`GgZuT*R88UKW5z|Hz~-Lu6fK6w=aw^6A}T>MEgGa=FJqNhXjRpn^P}8 zT*=yK+Z*JcIY#J%v$L}={r)b60HbTL^@_k`3xy*T!-VJjNzLn=fAu`4sY^)#Ckw z8|x}JQyw1;v402MfY+7Wf*aQZeHP~GR<4A4B^g+S(dX)H%RpfBKc$N^Yl&kg+VrG7 zC3)P~fS@KMY!2`bq{8Y}#rPpju4#{M!PyP(A0J(=wcfoOYMFAgYMtmp!`tS*S2U|% z^Tu%aMGw{lebF-#?F_H8YpjTyTin`Y@f)XWZJNhNI9etirKbn^Jb5zf^^lUNU|!4` zbgMI0+lr1g7neyQV3l0_-O>;qZ2@j~*)t8094YT`?Ek^sYT3UkopK`WHNFaTyC5(f^#u_=Ou%Jl-#+mH2V4hAw!)C z{cpKEhAf!g2BmCu21$UOrK-$TTnaRxbTwNWk(Q|VhsS=+Rtx!>d(#Zpv-z{-nFiji zSBApWaO8V~Kz624&>eEFEnh)*g7ORZwWnKk3Z#F3?teZ0QZ z5HEkJ_(%Ge#$WC|ZFU+4b)3pvINi;cMONJ$IGJ<;FtG#ErLWZ|~- zkza9_8pvXU&XnNn%LTl3w}noea2~LCl9iDW;Lo|YPB63c!}5qB5E$cUKdj^7N!GnJ z);{85x%1N2XAVc2c1w(g2hk@&_~Q>?_zSff8y7h~ZLOwoG^TsV= zozA1taluhc2YprV#l)Sq2%{I3-!CIG==6P{ocgTyrUdmud9wOocy@NflJbyA{${?W zCh5YW?)8c+VvC!3HJb)8U=Coe+_;sskPr$UAPfG{5ao1>lSw|yQi8_DgO?q$%&66V zMVBY=xfWN?d=8h5*bn7u)Y#UxMh$`TuDs6OH==p{j0O#im|O&7m4^)8G+vXd5z_Rn zir|^!cj30v(`8>Vetf^vIQC6cRxg9ka&dqArAs6H=bR-6eu`XXlIH5~7xv-Tm0;sC z0yQKJL*iP2y-7fVq=69fqFnf`f3^7NA-z!Y6SFOpE5CK3{rt#5S!P{A2kz=Nhw??c zjlxH0tJ~c2Ao|mn2d^M|?l^ZkRQ(ukNSn$(OHWK>NlU8AM+gi%etQP%)bjF4XSCq@8xX?*_Y-ff2vM{FQ1HuVI=J8Sj^J#B_lrNI&Ta+ZnD4YHR)cdgGvuQq)l8qIPdpY-71AFCr*((22c z31cJ^-aV9FA0dBo-S=+S2ONJ9Q(3xG7CcnOP zNG#eLh3m!DGx&B0e6OFsxaQ7|_AN~Y>5K*iPb~-Gu)OpuQch9~%Uz}tub+#Rf$pEp zj8i^k#npUDtR^MJ{TCeD*PlBx`r3~gX-tXukGG8b>|ZN1(|YSdUOiv% zjvx|^n*KGirYq)WEP40t?4HO&E^>eG z60SeXf^LwXoTLQ3SY?V^g8Mbbuv~psE@o7v?37h3LiD${?BDD5oN;0zpLd(iM_;+N z*p2Q?Xbe%0aY-j@RVBwL#c=v1RNFKt#Z2W|FwIm)DzGFe@cA_ll46vJ@xbBJgnyQJ zLBgB#Kd2}vxu&v|ztjOOt+XBZ9_W$q71jGM@gRP0&vLE5@>!@aMjZg4cyLlg8uvq>7X5E3j{Qm$mJI|LtVy712mt6O>MW{hO%ko>M){B3P* z5Mu6d&>O?jIo#h*f+grhdCeg(Pq3?hV)2vY5xo27vJqY*qv;N^7><_D^Ya7z{QR70 zS6$u~$p@U78mS*tF8O^LX+hQEQf&X}1dF+3nzQf!@jBWi{#8ATioUXp`0Fke6>Z)i zzMfEA;!DTr-<$>FJBSJhZhqh-#}Dm$VTBo?_OO;=N~NhHgOgYDv!3w#wC609!Tu!&AD&buPBfFI!>>JVoUFnXYNP8Wwm zRFXy&jJ+z~5U;l_@)(iajussuog<8>->#hl?mljtJv;aXzK|-_ZXn+}jq24Oll705 z1`N&k#$UgFB_s6ebXz7LCZ6c3N82sH$3o=E5!_Y%1SMb0B36;`2O5y932`t&2H+Cg z-Yg;PdbnfAXdD4HWf(>?2?^iQ!QIS@FiZm6f^ymRi4W)lMBR*^O1L1=%Rkw+JxQVV zeXxt^BdNgzDYp1RbQ^0iU|l7gsCs#O`vo|Cp{4r$-JXw{8r=YP+A86m7q0sz3^K0g z=H=a*S;*~6-_OHv^*LH}rrm@ql;P?&co=E->WCStSAWK!h)ik*M<|Sk(~t!X-B^-N zety1@uC8vIXOaR%-$Ni)SH&)8FKv7=vdjj+)SQ}`(LllMdUmqAK$c_y+k6#ESYQpg z7;^+T`ACsh8tQ|-7>Y_ighg#NNrysFC#3XvG4HPM{pkbm8RR`6fLcS^X5Xwuc=Yhe z^KKER9^GPI!jE$g+}B9(%)?PZ_V8ol0~5~zNhG4>tgFii?u zg4F<55THikX=!BBQf~p6>#jp;4+sC<%-x(?F47~r7^h5iXW&90K)23_J|mOK{bkr^&CDSaPp#BSTRWG~ji!3EGQ0FBqY42%7L}1< zK}_djvtICPS4qA%P$Uu=n_!Gv{hAtxLzvCe?f8_kM_o+0D>}aDiLbBu^stBt50f!& zMNd3V#OsC-W5UiMrJzqnMHkKjmMIF~9swrFOZ;MJB$}j2=_5w3xaB~6p@WC<7aTpH z#<}DTDc=mGv=8M7SE<>_H|-J6!m4!M#YF>CO2UZvgyH1OLE<$^^&Tld~QT z*Q!{|D>3EnOGhxV$#h_J;CK6i|Sxj7f{l>%cr|@%(;CB`yHQ#kAdDtRX=_<~5 z+%jT+dZNOSXfmaWV$aH_j|X^haq&EI-tZ&&oDi%AyNxsc6|g)4IEILMmm3r@J%C?u z(}ZJFN`aXktLk2urwBwL_6ve$hQ((Of{8z|+^RPK&!+16QCz2MWD4O<%xR;er>7#^ z@mL*FLd%dYVhPJD4*bH3id--~5bQJt26c>aLg(3Pn7D=uA%EW!wqCIx`z9u?Dd-Cz z36zLWV&mYTwX?G$a7EaSZV#nK@*OKYFM?H^L>lQS+JW(FYF-bXTSLUCW!hlXr{7%#ai6F4-H~Ptd1`3?zb{C zGs%SH7B-h=^n$>_B)`xkE967$z_6zz0>NVrS9<7I0{K%q}P=zV({zM!d9PCP!J25sO*6|+bA!6R!WM60_v-<6)^6Sq0u4OZF9%* zYa0;1_IN@q4)lM&(spd7r~K>B|5eqdA;Wh(fEwvWT)){kIms7Ch{E^0vCA65STpm; zB-^T_8~%P)0fDn=r%`j&w4xscD&ref??t7)aTL-BAqahfxJijc6dGpa5bv1T+f8U z;+7$dW;(8e_HDR{L^K2XBX%#7NG2vGWwo^o5OovGKwydx436Q)iU5idmC{L&wurZ!)CjgDmd86!EMUn)k-ssRF=ZTNX1Rx6{cf#0cNCYPQJPHCk)-wA{ zEN>dNw)fk9pz_luum|8{XS#oFe1-LeDDc4MsKyS?0Mc;c?gBNvJKGqrh0GHnuv&Pf z^Vs)DS9Q}haNVYW`L=?%7g1^(fR+dYl7Ib1Yf({o1)KzkH@6)D*NX`4g?kAcMlDnv zgxnE+ZiFlG0Z_yr3L{lwpDQMn#1ctB1wgcQ!)*NMU6{742txuYm2YiNoMEPePLLnJ z3h~pVk3J2>hfP4abaZrTT+P3ltsx{PFxMywg5dVy_Z|4sfbZ`I#s3l_%Lq0G`R`5y zr`j*jYz&dHbEZ3=+1zW|zv12qAuK!a04#DC8+-Ka*VWV0!Xry;@`x-R00xe55Wv*I z3VI1*7RzDkBU-Gmf}gG!L4VHl?~zY?2Bf0QwM_)D5XHG4upp$e%1SyE6BV$N(~!VW zsfJRD(W?;`i`Z2OtPQ;RtgNibc|C|p@CWG__WV;QnolF1p45~|2ug4}0Pw;^+`2dw ze0os|78VIa(e#FUmr-kj*}s*@ltqP1(Ar^zTSFos9?$`R;Uht?r#BzF237mWVs9lv zM4S=+>;z#5iGeyI7)!EEUORGCd5P>3GDQQ=F(6G-ySi~Lwma7N<##bV zAY7^pD+%G}#JjV9m0`T@@q5LlNL)wIph#sX077s8`P_+&ss|)3)zz9IFhTF=^P=6u zL|f}PQh_=uXV7D1>F4ZtZOU>d>Yl-{9lh^eD`2u~_;dQCiW;tCIPdCOSC9zy%ie{f zFf%jZRQOK1n0Nj9V0^BxfhFx*;(qQl=iSoMGW~t@5S$5yr!IqcXDm{SL*(!RUn`!j zJ9C7bD$(rbQOhcV)^XQBDik%rMwDQ{RO|(4a3;Zi5dY^`V`^%uyXWLJ#{Iw(ybAvF zxki7$?nxry)+Ge{&ybEua0vhxt;v0GUF}mQACX>+7sov`=Y@2V5$vc@KeNu>Uz>;6 z@{w(-5+uZW(xdd<2cha#pXEib?%~iCRMxn!8R7Ac~h%@hk|h_XTekyK=1J=9EHB z(dX~nQoKi0x`7ZNyw^Z-PvaINR_DGSgcHN_T&Rcu_7?d+Ta1==Gh$9iRO50iGSBma zLPA;qbQOY7K}MRu zhn((D{QdxM{gIusy!6vNR8Uo={Rf|dZ5c@J*eQsDn9$lloNFsifVZ&s5laSv2vc-8 z-1ZH1G#=b31bbtPUj^p8mM-Gr1M-3MaJW?^9=ASZ%qUV&K6t#JM(x+&{L-Y}Pd&QmMiO zTMaMu^5SGT7V_2f^l#v81@`#7v$HzdZ%vSo68J5=ZGX?nH#IdiSn9=K!h4|cssTF> zm=`=a|M@~*X$c$sd3SgJkdXatb{IiyBKU)NO5v^0kI7e#Wa$m4RD44 z3MCb9l*kn#EC)CcjhfPmNZ_bN;Gjrb5mjXBFNBj_1fJznh(;wE3^?qg@SOtl*Alx; zq1z}s0<9lUuSdU+;FF_(29S-h*Yn#G(JK@3HgAbG1hM}h#W4c#91$@wI_%$A<}`s$ znMU%44Ohapmh> z6?Q<8aZ#EQO@86`@9y4g*?*M8|DX3_|4aJEi@V9^l=MH|X?RM)7e!lN>#2stwf_aA Csgdsh literal 0 HcmV?d00001 diff --git a/report/img/model_frequency.png b/report/img/model_frequency.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8537e64f47f3834496f9ac925b8add7fb2039b GIT binary patch literal 35470 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 literal 0 HcmV?d00001 diff --git a/report/report.tex b/report/report.tex index 4cb772b..28e4ed5 100755 --- a/report/report.tex +++ b/report/report.tex @@ -183,11 +183,11 @@ \end{itemize} \item Содержание работы (перечень подлежащих разработке вопросов): \begin{enumerate}[label=\arabic{enumi}.\arabic*, ref=\arabic{enumi}.\arabic*] - \item Краткое описание задачи автоматического протоколирования совещаний; - \item Постановка задачи подбора оптимальной конфигурации системы автоматического протоколирования; - \item Системный анализ архитектуры системы автоматического протоколирования и факторов, влияющих на качество её работы; - \item Разработка генетического алгоритма для подбора оптимальной конфигурации модульного пайплайна автоматического протоколирования; - \item Анализ результатов апробации разработанного алгоритма; + \item Описание задачи автоматического протоколирования совещаний и её этапов; + \item Формулировка задачи оптимизации конфигурации модулей транскрибации и диаризации; + \item Описание пространства конфигураций: модели, параметры и целевая функция; + \item Разработка генетического алгоритма с модульным кэшированием и пакетным планированием вычислений; + \item Экспериментальная проверка алгоритма и анализ результатов; \item Заключение по работе. \end{enumerate} \item Дата выдачи задания «13» февраля 2026 г. @@ -226,62 +226,284 @@ \section*{Введение} \addcontentsline{toc}{section}{Введение} -Совещания являются основным способом передачи информации в крупных организациях, однако информация часто теряется из-за забывчивости участников и отсутствия на встречах части коллег. Протоколирование позволяет зафиксировать ключевые решения и распространить их среди всех заинтересованных сторон. +Совещания являются основным способом координации и передачи информации в организациях, однако значительная часть обсуждаемой информации неизбежно теряется. Протоколирование совещаний позволяет зафиксировать ключевые решения и договорённости и распространить их среди всех заинтересованных сторон. Актуальность автоматического протоколирования особенно возросла с распространением удалённой и гибридной работы, увеличившим количество совещаний~\cite{yandex-research-calendar}. -С технической точки зрения задача автоматического протоколирования представляет собой последовательность этапов: транскрибация (преобразование аудио в текст), диаризация (определение говорящих) и суммаризация (формирование протокола). Актуальность задачи возросла с распространением удалённой работы~\cite{yandex-research-calendar}, а развитие глубокого обучения и больших языковых моделей~\cite{whisper} сделало создание качественных систем возможным~\cite{auto-meet, building-real-world-meeting-summarization,end-to-end-speech-summarization, meetalk}. +С технической точки зрения задачу автоматического протоколирования обычно рассматривают как последовательность трёх этапов: транскрибация (преобразование аудиозаписи в текст), диаризация (определение принадлежности фрагментов речи конкретным говорящим) и суммаризация (формирование краткого протокола на основе стенограммы)~\cite{building-real-world-meeting-summarization}. Развитие моделей распознавания речи~\cite{whisper}, алгоритмов диаризации~\cite{pyannote-audio} и больших языковых моделей привело к тому, что создание качественных систем автоматического протоколирования стало технически возможным~\cite{auto-meet, meetalk, end-to-end-speech-summarization}. -Однако большинство исследований ориентированы на английский язык, а для русского языка отсутствуют полноценные датасеты и целостные решения. В рамках данной работы предлагается разработать модульную систему автоматического протоколирования для русского языка, основанную на последовательном выполнении транскрибации, диаризации и суммаризации. Каждый модуль системы может быть реализован различными алгоритмами и моделями, что приводит к большому числу возможных конфигураций пайплайна. В данной курсовой работе предлагается применить генетический алгоритм для подбора оптимальной конфигурации такого пайплайна под заданные ограничения по качеству и вычислительным ресурсам~\cite{skobtsov-evolution}. +Для каждого из этапов протоколирования существует множество открытых моделей с разными характеристиками: качеством, скоростью работы и требованиями к вычислительным ресурсам. Каждая модель, в свою очередь, обладает набором настраиваемых параметров, влияющих на итоговый результат. Возникает задача подбора оптимальной конфигурации пайплайна, то есть выбора моделей и их параметров, обеспечивающих наилучшее качество при заданных ограничениях по ресурсам. Полный перебор всех возможных конфигураций требует значительных вычислительных затрат, поэтому целесообразно применить методы эволюционной оптимизации~\cite{skobtsov-evolution}. -\newpage -\section{Актуальность темы} - -Актуальность автоматического протоколирования особенно возросла из-за распространения удалённой и гибридной работы: количество записываемых встреч растёт, а ручная обработка и анализ их содержания становятся практически невозможными. При этом качественный протокол требует не только точной транскрибации, но и восстановления структуры диалога и причинно-следственных связей, чтобы документ отражал ход обсуждения и его результат. - -На практике наиболее распространённый сценарий — обработка моноканальных записей без разделения дорожек по говорящим. В типичных совещаниях число участников может достигать 10–15 человек, присутствуют перебивания и быстрые смены говорящего, а ошибки диаризации дают каскадный эффект и напрямую ухудшают качество итогового протокола, особенно при фиксации поручений и ответственных. Дополнительные ограничения связаны с необходимостью локального развёртывания без внешних API и с лимитами вычислительных ресурсов (например, одна видеокарта до 16 ГБ или CPU), а также с большой длиной стенограмм. - -В таких условиях выбор “лучшей” комбинации моделей и параметров становится нетривиальной многокритериальной задачей: нужно одновременно учитывать качество транскрибации, диаризации и суммаризации и ограничения по ресурсам. Генетические алгоритмы являются естественным инструментом для поиска близких к оптимальным решений в больших пространствах конфигураций при наличии ограничений и нескольких критериев качества. +В данной курсовой работе предлагается генетический алгоритм для подбора оптимальной конфигурации модулей транскрибации и диаризации в системе автоматического протоколирования совещаний на русском языке. Полная система протоколирования включает три этапа, однако в данной работе рассматриваются только первые два --- транскрибация и диаризация. Этап суммаризации исключён из рассмотрения, так как оценка качества суммаризации с использованием больших языковых моделей требует значительных вычислительных затрат (порядка 20--40 минут на каждую оценку), что делает применение генетического алгоритма для оптимизации этого этапа практически невозможным в рамках доступного вычислительного бюджета. \newpage \section{Постановка задачи} -В данной работе необходимо: +Модульная система автоматического протоколирования совещаний представляет собой пайплайн, состоящий из нескольких последовательных этапов обработки аудиозаписи. На каждом этапе может быть использована одна из нескольких доступных моделей, каждая из которых обладает набором настраиваемых параметров. Различные сочетания моделей и параметров образуют пространство конфигураций пайплайна. + +\textbf{Задача оптимизации} формулируется следующим образом: найти конфигурацию пайплайна $\mathbf{x}^*$, минимизирующую целевую функцию: + +\begin{equation} +\mathbf{x}^* = \arg\min_{\mathbf{x} \in \mathcal{X}} f(\mathbf{x}), +\end{equation} + +\begin{equation} +f(\mathbf{x}) = \alpha \cdot \text{WER}(\mathbf{x}) + \beta \cdot \text{DER}(\mathbf{x}) + \gamma \cdot T(\mathbf{x}), +\end{equation} + +\noindent +где $\mathcal{X}$ --- пространство допустимых конфигураций, WER (Word Error Rate)~\cite{morris-asr-metrics} --- ошибка транскрибации, DER (Diarization Error Rate)~\cite{speaker-diarization-review} --- ошибка диаризации, $T$ --- нормализованное время выполнения пайплайна, а $\alpha = 0{,}4$, $\beta = 0{,}4$, $\gamma = 0{,}2$ --- весовые коэффициенты, определяющие баланс между качеством и скоростью. + +\subsection{Ограничения и вычислительный бюджет} + +Эксперименты проводятся на сервере с GPU Tesla T4 (16~ГБ видеопамяти) и 16~ГБ оперативной памяти. Используется русскоязычный датасет совещаний, разработанный в рамках дипломной работы, содержащий 8 записей совещаний с полной разметкой: текстом реплик, идентификаторами спикеров и временными метками. Датасет представлен в четырёх вариантах нарастающей сложности (raw, simple, medium, hard), различающихся условиями записи~\cite{ami}. + +Для ограничения вычислительных затрат приняты следующие решения: \begin{enumerate} - \item Описать модульную схему системы автоматического протоколирования совещаний как последовательность этапов (транскрибация, диаризация, суммаризация) и определить набор альтернативных компонентов/параметров (пространство конфигураций). + \item Используется только один вариант датасета (raw --- чистая склейка реплик без шумов). Это оправдано тем, что целью является сравнение конфигураций моделей, а не оценка их устойчивости к шуму. + \item Используется половина датасета (4 совещания из 8, около 45 минут аудио). Это позволяет сократить время одного прогона пайплайна с~10 до~5 минут. + \item Этап суммаризации исключён. Инференс больших языковых моделей для суммаризации на Tesla~T4 занимает 5--10 минут на одно совещание. Для половины датасета (4 совещания) это даёт дополнительные 20--40 минут на каждую оценку конфигурации, что многократно увеличивает общее время работы алгоритма и делает задачу непрактичной. +\end{enumerate} - \item Сформулировать целевую функцию (фитнес) для оценки конфигурации на основе метрик качества: WER для транскрибации, DER для диаризации, метрик суммаризации/протокола (ROUGE/BERTScore и QA-метрики), а также учесть ограничения на ресурсы и требования локального запуска. +Суммарный вычислительный бюджет ограничен 10 часами на Tesla~T4. Пространство конфигураций содержит 9375 возможных вариантов (см. раздел~2). При полном переборе, с учётом ~5 минут на оценку одной конфигурации, потребовалось бы около 780 часов вычислений. Это делает полный перебор практически невозможным и обосновывает применение эвристических методов оптимизации, таких как генетические алгоритмы. - \item Разработать и реализовать генетический алгоритм для поиска оптимальной (или близкой к оптимальной) конфигурации пайплайна: кодирование хромосомы, операторы селекции/кроссовера/мутации, критерии остановки. - \item Провести экспериментальную апробацию на тестовом наборе совещаний (или собранном датасете), сравнить результаты ГА с базовыми стратегиями подбора и проанализировать полученные конфигурации с точки зрения качества и вычислительных затрат +\newpage +\section{Пространство конфигураций} + +В данном разделе описываются модели и параметры, образующие пространство конфигураций для оптимизации. + +\subsection{Модели транскрибации} + +Для транскрибации рассматриваются пять моделей, поддерживающих русский язык: + +\begin{itemize} + \item \textbf{Whisper large-v3}~\cite{whisper} --- мультиязычная модель распознавания речи от OpenAI, обученная на 680\,000 часов данных. Одна из самых известных открытых моделей. + \item \textbf{Whisper medium}~\cite{whisper} --- уменьшенная версия Whisper, обеспечивающая более высокую скорость работы при некотором снижении качества. + \item \textbf{Faster-Whisper large-v3}~\cite{faster-whisper} --- реализация Whisper large-v3 на оптимизированном бэкенде CTranslate2~\cite{ctranslate2}, обеспечивающая ускорение в 4 раза при том же качестве. + \item \textbf{GigaAM-CTC}~\cite{giga-am} --- модель семейства GigaAM, специализированная на русском языке, использующая CTC-декодирование. Отличается высокой скоростью работы. + \item \textbf{GigaAM-RNN-T}~\cite{giga-am} --- модель того же семейства с RNN-T декодированием, обеспечивающая более высокое качество при несколько меньшей скорости~\cite{giga-am-v3}. +\end{itemize} + +\subsection{Модели диаризации} + +Для диаризации рассматриваются три модели: + +\begin{itemize} + \item \textbf{pyannote 3.1}~\cite{pyannote-audio} --- модель из библиотеки pyannote.audio, широко используемая в исследованиях. + \item \textbf{pyannote Community-1}~\cite{pyannote-community-1} --- улучшенная открытая модель из той же библиотеки, показывающая лучшие результаты на открытых датасетах. + \item \textbf{Sortformer}~\cite{sortformer} --- модель от NVIDIA NeMo, использующая новый подход к разрешению пермутаций говорящих. +\end{itemize} + +\subsection{Параметры} + +Помимо выбора моделей, конфигурация включает следующие параметры: + +\begin{itemize} + \item \textbf{beam\_size} --- ширина лучевого поиска при декодировании. Влияет только на модели семейства Whisper; для GigaAM фиксирован равным~1. Бо\'{л}ьшие значения повышают качество, но увеличивают время. + \item \textbf{vad\_threshold} --- порог детекции голосовой активности (Silero VAD~\cite{silero-vad}). Влияет как на транскрибацию, так и на диаризацию: слишком низкий порог приводит к ложным срабатываниям на шуме, слишком высокий --- к пропуску тихой речи. + \item \textbf{min\_speech\_duration} --- минимальная длительность речевого сегмента в секундах. Сегменты короче данного порога отбрасываются. Слишком малое значение приводит к появлению ложных сегментов, слишком большое --- к потере коротких реплик. + \item \textbf{clustering\_threshold} --- порог кластеризации при определении говорящих. Определяет чувствительность разделения голосов: низкие значения ведут к избыточному разделению, высокие --- к объединению разных говорящих в один кластер. +\end{itemize} + +Все параметры дискретизированы для обеспечения эффективного кэширования результатов. Пространство конфигураций представлено в таблице~\ref{tab:config-space}. + +\begin{table}[H] +\centering +\caption{Пространство конфигураций пайплайна} +\label{tab:config-space} +\begin{tabular}{l l l} +\toprule +\textbf{Ген (параметр)} & \textbf{Тип} & \textbf{Допустимые значения} \\ +\midrule +Модель транскрибации & категориальный & 5 моделей \\ +beam\_size & дискретный & \{1, 3, 5, 7, 10\} \\ +vad\_threshold & дискретный & \{0.3, 0.4, 0.5, 0.6, 0.7\} \\ +Модель диаризации & категориальный & 3 модели \\ +min\_speech\_duration & дискретный & \{0.25, 0.5, 0.75, 1.0, 1.5\}~с \\ +clustering\_threshold & дискретный & \{0.3, 0.45, 0.6, 0.75, 0.9\} \\ +\bottomrule +\end{tabular} +\end{table} + +Общее число конфигураций: $5 \times 5 \times 5 \times 3 \times 5 \times 5 = 9375$. + + +\newpage +\section{Генетический алгоритм} + +\subsection{Кодирование хромосомы} + +Каждая хромосома представляет собой вектор из шести генов, соответствующих параметрам конфигурации пайплайна (таблица~\ref{tab:config-space}). Каждый ген кодируется целым числом --- индексом в массиве допустимых значений соответствующего параметра. Такое кодирование позволяет единообразно работать как с категориальными (модели), так и с дискретными числовыми параметрами. + +\subsection{Генетические операторы} + +\textbf{Селекция.} Используется турнирный отбор с размером турнира $k = 3$: из популяции случайно выбираются три особи, и лучшая из них становится родителем. + +\textbf{Кроссовер.} Применяется равномерный кроссовер: каждый ген потомка независимо берётся от одного из двух родителей с равной вероятностью. + +\textbf{Мутация.} Каждый ген мутирует с вероятностью $p_{\text{mut}} = 0{,}15$. При мутации с вероятностью 70\% выбирается соседнее значение по шкале допустимых значений (смещение на $\pm 1$ позицию), а с вероятностью 30\% --- случайное значение из всего диапазона. Такой подход обеспечивает плавное исследование окрестности текущего решения и возможность выхода из локальных оптимумов. + +\textbf{Элитизм.} Две лучшие особи текущего поколения без изменений переносятся в следующее поколение, что гарантирует неубывание лучшего найденного решения. + +Параметры алгоритма приведены в таблице~\ref{tab:ga-params}. + +\begin{table}[H] +\centering +\caption{Параметры генетического алгоритма} +\label{tab:ga-params} +\begin{tabular}{l l} +\toprule +\textbf{Параметр} & \textbf{Значение} \\ +\midrule +Размер популяции & 15 \\ +Число поколений & 25 \\ +Размер турнира & 3 \\ +Вероятность мутации (на ген) & 0.15 \\ +Число элитных особей & 2 \\ +Веса целевой функции ($\alpha$, $\beta$, $\gamma$) & 0.4, 0.4, 0.2 \\ +\bottomrule +\end{tabular} +\end{table} + +\subsection{Модульное кэширование} + +Ключевой особенностью задачи является независимость модулей транскрибации и диаризации: оба работают непосредственно с аудиозаписью и не зависят от результатов друг друга. Это позволяет кэшировать результаты на уровне отдельных модулей: + +\begin{itemize} + \item Результаты транскрибации кэшируются по ключу \texttt{(модель, beam\_size, vad\_threshold)} и содержат значение WER и время выполнения. + \item Результаты диаризации кэшируются по ключу \texttt{(модель, min\_speech\_duration, clustering\_threshold, vad\_threshold)} и содержат значение DER и время выполнения. +\end{itemize} + +Если две хромосомы различаются только параметрами диаризации, повторный запуск транскрибации не требуется, и наоборот. Это значительно сокращает число фактических вычислений, особенно на поздних поколениях, когда популяция сходится к небольшой области пространства конфигураций. + +\subsection{Пакетное планирование по моделям} + +Загрузка нейросетевой модели в память GPU занимает 30--60 секунд для крупных моделей. При наивной реализации, когда каждая конфигурация оценивается отдельно, модели загружаются и выгружаются многократно, что приводит к значительным накладным расходам. + +Для решения этой проблемы реализован пакетный планировщик вычислений. После каждого поколения все не кэшированные конфигурации группируются по модели: сначала запускаются все конфигурации, использующие одну и ту же модель транскрибации, затем --- все конфигурации с одной моделью диаризации. Модель загружается в память один раз для всего пакета, что устраняет избыточные циклы загрузки и выгрузки. + +\subsection{Общая схема алгоритма} + +Алгоритм работает следующим образом: + +\begin{enumerate} + \item Инициализация случайной популяции из 15 особей. + \item Оценка всех особей: разделение на модули транскрибации и диаризации, проверка кэша, группировка не кэшированных конфигураций по моделям, пакетный запуск, сохранение результатов в кэш, вычисление целевой функции. + \item Сортировка популяции по значению целевой функции. + \item Формирование нового поколения: перенос 2 элитных особей, заполнение оставшихся мест потомками, полученными турнирным отбором, равномерным кроссовером и мутацией. + \item Переход к шагу 2. Повторение в течение 25 поколений. \end{enumerate} \newpage -\section{Моделирование процесса автоматического протоколирования совещаний} +\section{Результаты экспериментов} -\newpage -\section{Разработка методики оценки качества протоколирования} +\subsection{Сходимость алгоритма} -\newpage -\section{Обзор современных методов и технологий автоматического протоколирования совещаний} +На рисунке~\ref{fig:convergence} представлена динамика целевой функции по поколениям. Значение целевой функции для лучшей особи быстро улучшается в первых 4 поколениях (от 13.0 до 11.3), после чего происходит более медленное уточнение. Начиная с 10-го поколения алгоритм выходит на плато. Среднее значение по популяции сходится к значению лучшей особи, что свидетельствует о концентрации популяции в области оптимума. -\newpage -\section{Описание генетического алгоритма для подбора оптимальной конфигурации пайплайна} +\begin{figure}[H] + \centering + \includegraphics[width=0.85\textwidth]{img/convergence.png} + \caption{Сходимость генетического алгоритма: значение целевой функции лучшей особи и среднее по популяции} + \label{fig:convergence} +\end{figure} -\newpage -\section{Реализация генетического алгоритма и экспериментального стенда} +\subsection{Лучшие найденные конфигурации} + +В таблице~\ref{tab:top-configs} представлены лучшие конфигурации, найденные алгоритмом, с различными сочетаниями моделей. + +\begin{table}[H] +\centering +\caption{Лучшие конфигурации, найденные генетическим алгоритмом} +\label{tab:top-configs} +\begin{tabular}{c l l c c c} +\toprule +\textbf{\#} & \textbf{Транскрибация} & \textbf{Диаризация} & \textbf{WER, \%} & \textbf{DER, \%} & $f(\mathbf{x})$ \\ +\midrule +1 & GigaAM-RNN-T & Sortformer & 5.32 & 19.07 & 11.25 \\ +2 & GigaAM-CTC & Sortformer & 6.54 & 19.07 & 11.30 \\ +3 & GigaAM-RNN-T & pyannote Comm.-1 & 5.32 & 20.50 & 11.60 \\ +4 & GigaAM-CTC & pyannote Comm.-1 & 6.54 & 20.50 & 11.66 \\ +5 & F.-Whisper large-v3 & Sortformer & 7.59 & 19.01 & 11.84 \\ +\bottomrule +\end{tabular} +\end{table} + +Лучшей конфигурацией является сочетание GigaAM-RNN-T и Sortformer с параметрами: beam\_size~=~1, vad\_threshold~=~0.5, min\_speech\_duration~=~0.5~с, clustering\_threshold~=~0.6. Данная конфигурация обеспечивает WER~=~5.32\% и DER~=~19.07\%. + +Модели семейства GigaAM стабильно превосходят модели Whisper по качеству транскрибации русской речи, что объясняется их специализацией на русскоязычных данных. Модель Sortformer обеспечивает наилучшее качество диаризации, хотя pyannote Community-1 показывает сопоставимые результаты. Оптимальные значения параметров (vad\_threshold~=~0.5, min\_speech\_duration~=~0.5~с, clustering\_threshold~=~0.6) представляют собой умеренные значения, что соответствует ожиданиям: крайние значения параметров, как правило, ухудшают результат. + +\subsection{Распределение конфигураций} + +На рисунке~\ref{fig:scatter} представлено распределение всех оценённых конфигураций в пространстве WER--DER. Цвет точек отражает значение целевой функции. Видно, что алгоритм сконцентрировал поиск в области малых значений WER и DER (нижний левый угол), при этом также исследовав значительную часть пространства. + +\begin{figure}[H] + \centering + \includegraphics[width=0.85\textwidth]{img/wer_der_scatter.png} + \caption{WER и DER оценённых конфигураций. Цвет отражает значение целевой функции, звездой отмечена лучшая конфигурация} + \label{fig:scatter} +\end{figure} + +\subsection{Частота моделей в лучших конфигурациях} + +На рисунке~\ref{fig:model-freq} показано, как часто различные модели встречаются в 20 лучших найденных конфигурациях. Модель GigaAM-RNN-T доминирует среди моделей транскрибации (14 из 20), что соответствует её лучшему качеству распознавания русской речи. Модель Sortformer присутствует во всех 20 лучших конфигурациях, что подтверждает её превосходство в задаче диаризации. + +\begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{img/model_frequency.png} + \caption{Частота моделей в 20 лучших конфигурациях} + \label{fig:model-freq} +\end{figure} + +\subsection{Эффективность кэширования} + +За 25 поколений алгоритм выполнил 93 уникальных модульных вычисления: 27 конфигураций транскрибации и 66 конфигураций диаризации. При этом было оценено 121 уникальное сочетание параметров (полная конфигурация пайплайна). Без модульного кэширования потребовалось бы 242 модульных вычисления (121~$\times$~2), то есть кэширование сократило объём вычислений в 2.6 раза. + +На рисунке~\ref{fig:convergence} видно, что начиная с 8-го поколения число новых вычислений резко сокращается (0--4 за поколение), так как большинство конфигураций уже присутствуют в кэше. + +\subsection{Сравнение с другими стратегиями поиска} + +Для оценки эффективности генетического алгоритма проведено сравнение со случайным поиском. Результаты представлены в таблице~\ref{tab:comparison}. + +\begin{table}[H] +\centering +\caption{Сравнение стратегий поиска} +\label{tab:comparison} +\begin{tabular}{l c c c c} +\toprule +\textbf{Стратегия} & \textbf{Конфигураций} & $f(\mathbf{x}^*)$ & \textbf{WER, \%} & \textbf{DER, \%} \\ +\midrule +Полный перебор & 9375 & --- & --- & --- \\ +Случ. поиск (15 конф.) & 15 & 13.03 & 6.99 & 23.35 \\ +Случ. поиск (93 конф.) & 93 & 11.81 & 5.57 & 20.27 \\ +Случ. поиск (375 конф.) & 375 & 11.32 & 5.57 & 19.15 \\ +ГА (25 поколений) & 93 мод. выч. & 11.25 & 5.32 & 19.07 \\ +\bottomrule +\end{tabular} +\end{table} + +Генетический алгоритм с 93 модульными вычислениями нашёл конфигурацию лучше, чем случайный поиск с 375 оценками полного пайплайна ($f = 11{,}25$ против $f = 11{,}32$). При этом ГА использовал значительно меньший вычислительный бюджет. + +По сравнению с полным перебором, генетический алгоритм оценил лишь $93 / 9375 \approx 1\%$ от общего числа модульных конфигураций. При оценочном времени выполнения одного модульного вычисления около 2.5 минуты, общее время работы алгоритма составляет около 4 часов, что более чем в~100 раз быстрее полного перебора (780 часов). -\newpage -\section{Демонстрация применения алгоритма и анализ результатов} \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение} +В данной курсовой работе разработан генетический алгоритм для подбора оптимальной конфигурации модулей транскрибации и диаризации в модульной системе автоматического протоколирования совещаний на русском языке. + +Реализованный алгоритм включает модульное кэширование результатов, позволяющее избежать повторных вычислений при изменении параметров одного из модулей, а также пакетное планирование вычислений, группирующее конфигурации по модели для минимизации затрат на загрузку и выгрузку нейросетевых моделей. + +Экспериментальная апробация показала, что алгоритм сходится к близкому к оптимальному решению за 4--10 поколений, выполняя при этом лишь 93 модульных вычисления --- около 1\% от полного пространства поиска в 9375 конфигураций. Лучшая найденная конфигурация (GigaAM-RNN-T + Sortformer, WER~=~5.32\%, DER~=~19.07\%) превосходит результат случайного поиска с четырёхкратно бо\'{л}ьшим числом оценок. Оценочное время работы алгоритма составляет около 4 часов на Tesla~T4, что более чем в 100 раз быстрее полного перебора. + +В дальнейшем, в рамках дипломной работы, планируется расширение подхода на этап суммаризации при условии увеличения вычислительных ресурсов, а также апробация алгоритма на реальных данных с использованием полного датасета. + + \newpage \printbibliography[heading=bibintoc] -\end{document} \ No newline at end of file +\end{document}