diff --git "a/src/laboratory.ipynb" "b/src/laboratory.ipynb"
new file mode 100644--- /dev/null
+++ "b/src/laboratory.ipynb"
@@ -0,0 +1,2576 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "63594f228ab14d9796bbf24112269a52",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HTML(value='
Dict[str, torch.Tensor]:\n",
+ " # split inputs and labels since they have to be of different lengths and need different padding methods\n",
+ " # first treat the audio inputs by simply returning torch tensors\n",
+ " input_features = [{\"input_features\": feature[\"input_features\"]} for feature in features]\n",
+ " batch = self.processor.feature_extractor.pad(input_features, return_tensors=\"pt\")\n",
+ "\n",
+ " # get the tokenized label sequences\n",
+ " label_features = [{\"input_ids\": feature[\"labels\"]} for feature in features]\n",
+ "\n",
+ " # pad the labels to max length\n",
+ " labels_batch = self.processor.tokenizer.pad(label_features, return_tensors=\"pt\")\n",
+ "\n",
+ " # replace padding with -100 to ignore loss correctly\n",
+ " labels = labels_batch[\"input_ids\"].masked_fill(labels_batch.attention_mask.ne(1), -100)\n",
+ "\n",
+ " # if bos token is appended in previous tokenization step,\n",
+ " # cut bos token here as it's append later anyways\n",
+ " if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():\n",
+ " labels = labels[:, 1:]\n",
+ "\n",
+ " batch[\"labels\"] = labels\n",
+ "\n",
+ " return batch\n",
+ "data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from transformers import WhisperForConditionalGeneration\n",
+ "\n",
+ "\n",
+ "model = WhisperForConditionalGeneration.from_pretrained(\n",
+ " model_name_or_path, device_map=\"auto\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "DatasetDict({\n",
+ " test: Dataset({\n",
+ " features: ['input_features', 'labels'],\n",
+ " num_rows: 857\n",
+ " })\n",
+ "})"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "evaluation_dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 108/108 [09:19<00:00, 5.18s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "wer=24.938214396045723\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "from torch.utils.data import DataLoader\n",
+ "from tqdm import tqdm\n",
+ "import numpy as np\n",
+ "import gc\n",
+ "import evaluate\n",
+ "metric = evaluate.load(\"wer\")\n",
+ "eval_dataloader = DataLoader(evaluation_dataset['test'], batch_size=8, collate_fn=data_collator)\n",
+ "\n",
+ "model.eval()\n",
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ " generated_tokens = (\n",
+ " model.generate(\n",
+ " input_features=batch[\"input_features\"].to(\"cuda\"),\n",
+ " decoder_input_ids=batch[\"labels\"][:, :4].to(\"cuda\"),\n",
+ " max_new_tokens=255,\n",
+ " )\n",
+ " .cpu()\n",
+ " .numpy()\n",
+ " )\n",
+ " labels = batch[\"labels\"].cpu().numpy()\n",
+ " labels = np.where(labels != -100, labels, tokenizer.pad_token_id)\n",
+ " decoded_preds = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)\n",
+ " decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)\n",
+ " metric.add_batch(\n",
+ " predictions=decoded_preds,\n",
+ " references=decoded_labels,\n",
+ " )\n",
+ " del generated_tokens, labels, batch\n",
+ " gc.collect()\n",
+ "wer = 100 * metric.compute()\n",
+ "print(f\"{wer=}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 54/54 [07:20<00:00, 8.15s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "wer=24.934352795798578 and normalized_wer=13.639508070714834\n",
+ "{'eval/wer': 24.934352795798578, 'eval/normalized_wer': 13.639508070714834}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "import gc\n",
+ "import numpy as np\n",
+ "from tqdm import tqdm\n",
+ "from torch.utils.data import DataLoader\n",
+ "from transformers.models.whisper.english_normalizer import BasicTextNormalizer\n",
+ "\n",
+ "eval_dataloader = DataLoader(evaluation_dataset['test'], batch_size=16, collate_fn=data_collator)\n",
+ "forced_decoder_ids = processor.get_decoder_prompt_ids(language=language, task='transcribe')\n",
+ "normalizer = BasicTextNormalizer()\n",
+ "\n",
+ "predictions = []\n",
+ "references = []\n",
+ "normalized_predictions = []\n",
+ "normalized_references = []\n",
+ "import evaluate\n",
+ "metric = evaluate.load(\"wer\")\n",
+ "model.eval()\n",
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ " generated_tokens = (\n",
+ " model.generate(\n",
+ " input_features=batch[\"input_features\"].to(\"cuda\"),\n",
+ " forced_decoder_ids=forced_decoder_ids,\n",
+ " max_new_tokens=255,\n",
+ " )\n",
+ " .cpu()\n",
+ " .numpy()\n",
+ " )\n",
+ " labels = batch[\"labels\"].cpu().numpy()\n",
+ " labels = np.where(labels != -100, labels, processor.tokenizer.pad_token_id)\n",
+ " decoded_preds = processor.tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)\n",
+ " decoded_labels = processor.tokenizer.batch_decode(labels, skip_special_tokens=True)\n",
+ " predictions.extend(decoded_preds)\n",
+ " references.extend(decoded_labels)\n",
+ " normalized_predictions.extend([normalizer(pred).strip() for pred in decoded_preds])\n",
+ " normalized_references.extend([normalizer(label).strip() for label in decoded_labels])\n",
+ " del generated_tokens, labels, batch\n",
+ " gc.collect()\n",
+ "wer = 100 * metric.compute(predictions=predictions, references=references)\n",
+ "normalized_wer = 100 * metric.compute(predictions=normalized_predictions, references=normalized_references)\n",
+ "eval_metrics = {\"eval/wer\": wer, \"eval/normalized_wer\": normalized_wer}\n",
+ "\n",
+ "print(f\"{wer=} and {normalized_wer=}\")\n",
+ "print(eval_metrics)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Lora\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import torch\n",
+ "\n",
+ "from dataclasses import dataclass\n",
+ "from typing import Any, Dict, List, Union\n",
+ "\n",
+ "@dataclass\n",
+ "class DataCollatorSpeechSeq2SeqWithPadding:\n",
+ " processor: Any\n",
+ "\n",
+ " def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]:\n",
+ " # split inputs and labels since they have to be of different lengths and need different padding methods\n",
+ " # first treat the audio inputs by simply returning torch tensors\n",
+ " input_features = [{\"input_features\": feature[\"input_features\"]} for feature in features]\n",
+ " batch = self.processor.feature_extractor.pad(input_features, return_tensors=\"pt\")\n",
+ "\n",
+ " # get the tokenized label sequences\n",
+ " label_features = [{\"input_ids\": feature[\"labels\"]} for feature in features]\n",
+ "\n",
+ " # pad the labels to max length\n",
+ " labels_batch = self.processor.tokenizer.pad(label_features, return_tensors=\"pt\")\n",
+ "\n",
+ " # replace padding with -100 to ignore loss correctly\n",
+ " labels = labels_batch[\"input_ids\"].masked_fill(labels_batch.attention_mask.ne(1), -100)\n",
+ "\n",
+ " # if bos token is appended in previous tokenization step,\n",
+ " # cut bos token here as it's append later anyways\n",
+ " if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():\n",
+ " labels = labels[:, 1:]\n",
+ "\n",
+ " batch[\"labels\"] = labels\n",
+ "\n",
+ " return batch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import torch\n",
+ "from transformers import (\n",
+ " AutomaticSpeechRecognitionPipeline,\n",
+ " WhisperForConditionalGeneration,\n",
+ " WhisperTokenizer,\n",
+ " WhisperProcessor,\n",
+ ")\n",
+ "from peft import PeftModel, PeftConfig\n",
+ "\n",
+ "peft_model_id = \"DuyTa/vi-whisper-medium-Lora\"\n",
+ "\n",
+ "language = \"Vietnamese\"\n",
+ "task = \"transcribe\"\n",
+ "\n",
+ "peft_config = PeftConfig.from_pretrained(peft_model_id)\n",
+ "model = WhisperForConditionalGeneration.from_pretrained(\n",
+ " peft_config.base_model_name_or_path,\n",
+ ")\n",
+ "model = PeftModel.from_pretrained(model, peft_model_id)\n",
+ "model.to(\"cuda\").half()\n",
+ "\n",
+ "processor = WhisperProcessor.from_pretrained(peft_config.base_model_name_or_path, language=language, task=task)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 108/108 [12:31<00:00, 6.96s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "wer_lora=24.934352795798578\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "from torch.utils.data import DataLoader\n",
+ "from tqdm import tqdm\n",
+ "import numpy as np\n",
+ "import gc\n",
+ "import evaluate\n",
+ "metric = evaluate.load(\"wer\")\n",
+ "eval_dataloader = DataLoader(evaluation_dataset['test'], batch_size=8, collate_fn=data_collator)\n",
+ "\n",
+ "model.eval()\n",
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ " generated_tokens = (\n",
+ " model.generate(\n",
+ " input_features=batch[\"input_features\"].to(\"cuda\"),\n",
+ " decoder_input_ids=batch[\"labels\"][:, :4].to(\"cuda\"),\n",
+ " max_new_tokens=255,\n",
+ " )\n",
+ " .cpu()\n",
+ " .numpy()\n",
+ " )\n",
+ " labels = batch[\"labels\"].cpu().numpy()\n",
+ " labels = np.where(labels != -100, labels, tokenizer.pad_token_id)\n",
+ " decoded_preds = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)\n",
+ " decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)\n",
+ " metric.add_batch(\n",
+ " predictions=decoded_preds,\n",
+ " references=decoded_labels,\n",
+ " )\n",
+ " del generated_tokens, labels, batch\n",
+ " gc.collect()\n",
+ "wer_lora = 100 * metric.compute()\n",
+ "print(f\"{wer_lora=}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 54/54 [09:20<00:00, 10.39s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "wer=24.934352795798578 and normalized_wer=13.624135280553421\n",
+ "{'eval/wer': 24.934352795798578, 'eval/normalized_wer': 13.624135280553421}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "import gc\n",
+ "import numpy as np\n",
+ "from tqdm import tqdm\n",
+ "from torch.utils.data import DataLoader\n",
+ "from transformers.models.whisper.english_normalizer import BasicTextNormalizer\n",
+ "\n",
+ "eval_dataloader = DataLoader(evaluation_dataset['test'], batch_size=16, collate_fn=data_collator)\n",
+ "forced_decoder_ids = processor.get_decoder_prompt_ids(language=language, task='transcribe')\n",
+ "normalizer = BasicTextNormalizer()\n",
+ "\n",
+ "predictions = []\n",
+ "references = []\n",
+ "normalized_predictions = []\n",
+ "normalized_references = []\n",
+ "import evaluate\n",
+ "metric = evaluate.load(\"wer\")\n",
+ "model.eval()\n",
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ " generated_tokens = (\n",
+ " model.generate(\n",
+ " input_features=batch[\"input_features\"].to(\"cuda\"),\n",
+ " forced_decoder_ids=forced_decoder_ids,\n",
+ " max_new_tokens=255,\n",
+ " )\n",
+ " .cpu()\n",
+ " .numpy()\n",
+ " )\n",
+ " labels = batch[\"labels\"].cpu().numpy()\n",
+ " labels = np.where(labels != -100, labels, processor.tokenizer.pad_token_id)\n",
+ " decoded_preds = processor.tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)\n",
+ " decoded_labels = processor.tokenizer.batch_decode(labels, skip_special_tokens=True)\n",
+ " predictions.extend(decoded_preds)\n",
+ " references.extend(decoded_labels)\n",
+ " normalized_predictions.extend([normalizer(pred).strip() for pred in decoded_preds])\n",
+ " normalized_references.extend([normalizer(label).strip() for label in decoded_labels])\n",
+ " del generated_tokens, labels, batch\n",
+ " gc.collect()\n",
+ "wer = 100 * metric.compute(predictions=predictions, references=references)\n",
+ "normalized_wer = 100 * metric.compute(predictions=normalized_predictions, references=normalized_references)\n",
+ "eval_metrics = {\"eval/wer\": wer, \"eval/normalized_wer\": normalized_wer}\n",
+ "\n",
+ "print(f\"{wer=} and {normalized_wer=}\")\n",
+ "print(eval_metrics)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Quantization Whisper Lora"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from whisper_quant import WhisperModel\n",
+ "\n",
+ "model_size = \"medium\"\n",
+ "\n",
+ "# Run on GPU with FP16\n",
+ "model = WhisperModel(model_size, device=\"cuda\", compute_type=\"float16\")\n",
+ "\n",
+ "# or run on GPU with INT8\n",
+ "# model = WhisperModel(model_size, device=\"cuda\", compute_type=\"int8_float16\")\n",
+ "# or run on CPU with INT8\n",
+ "# model = WhisperModel(model_size, device=\"cpu\", compute_type=\"int8\")\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "segments, info = model.transcribe(\"audio.wav\", beam_size=1, language ='vi', temperature= 0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0.00s -> 7.10s] Hai, đây tức là một kẻ ăn mày vậy, anh ta chưa kịp quay đi thì đã thấy mấy con chó vàng chạy sồng sộc ra cứ nhảy sổ vào chân anh.\n"
+ ]
+ }
+ ],
+ "source": [
+ "for segment in segments:\n",
+ " print(\"[%.2fs -> %.2fs] %s\" % (segment.start, segment.end, segment.text))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "normalizer = BasicTextNormalizer()\n",
+ "norm = normalizer(segment.text)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "' hai đây tức là một kẻ ăn mầy vậy anh ta chưa kịp quay đi thì đã thấy mấy con chó vàng chạy sồng sộc ra cứ nhảy sổ vào chân anh '"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "norm"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 119,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import torch\n",
+ "from dataclasses import dataclass\n",
+ "\n",
+ "@dataclass\n",
+ "class DataCollatorSpeechSeq2SeqWithPadding:\n",
+ " processor: Any\n",
+ "\n",
+ " def __call__(self, features):\n",
+ " audios = []\n",
+ " for feature in features:\n",
+ " audios.append(feature[\"audio\"])\n",
+ " batch = {\n",
+ " \"audio\": [feature[\"audio\"]['array'] for feature in features],\n",
+ " \"transcription\": [feature[\"transcription\"] for feature in features]\n",
+ " }\n",
+ " return batch\n",
+ "data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor='No')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from torch.utils.data import DataLoader\n",
+ "from tqdm import tqdm\n",
+ "import numpy as np\n",
+ "import gc\n",
+ "import evaluate\n",
+ "metric = evaluate.load(\"wer\")\n",
+ "eval_dataloader = DataLoader(fleurs['test'], batch_size=16, collate_fn=data_collator)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import re\n",
+ "for data in eval_dataloader:\n",
+ " audios = data['audio']\n",
+ " transcriptions = data['transcription']\n",
+ " final = []\n",
+ " for audio in data['audio']:\n",
+ " print(\"-\" * 20)\n",
+ " segments, info = model.transcribe(audio, beam_size=1, language='vi')\n",
+ " out = [out.text for out in segments]\n",
+ " pred = ''.join(out)\n",
+ " norm_pred = normalizer(pred)\n",
+ " final.append(norm_pred)\n",
+ "cleaned_text_list = [re.sub(r'\\s+', ' ', text.strip()) for text in final]\n",
+ " \n",
+ "\n",
+ " print(cleaned_text_list)\n",
+ " print(transcriptions)\n",
+ " break\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ "\n",
+ " labels = batch[\"transcription\"]\n",
+ " print(labels)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for step, batch in enumerate(tqdm(eval_dataloader)):\n",
+ " with torch.cuda.amp.autocast():\n",
+ " with torch.no_grad():\n",
+ " final = []\n",
+ " labels = batch[\"transcription\"]\n",
+ " for audio in batch[\"audio\"]:\n",
+ " \n",
+ " segments, _ = model.transcribe(audio, beam_size=1, language='vi')\n",
+ " out = [out.text for out in segments]\n",
+ " pred = ''.join(out)\n",
+ " norm_pred = normalizer(pred)\n",
+ " final.append(norm_pred)\n",
+ " cleaned_text_list = [re.sub(r'\\s+', ' ', text.strip()) for text in final]\n",
+ " print(cleaned_text_list)\n",
+ " print(labels)\n",
+ " metric.add_batch(\n",
+ " predictions=cleaned_text_list,\n",
+ " references=labels,\n",
+ " )\n",
+ " del labels, batch, final\n",
+ " gc.collect()\n",
+ "wer_lora = 100 * metric.compute()\n",
+ "print(f\"{wer_lora=}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHHCAYAAACle7JuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABDf0lEQVR4nO3dd3gU5d7/8c+SwKaQQgKBREMCSJci5SBFEhAPXbCAYiFwEPARRIoe5aiUgxKKKJwDYkETDyJ2UFHaQYIQigHERwVBkBJQCCokIUCCyf37w1/mYUkhgYTdkffruvbSuad9Z3eyfHbmnhmHMcYIAADAhiq4uwAAAIBLRZABAAC2RZABAAC2RZABAAC2RZABAAC2RZABAAC2RZABAAC2RZABAAC2RZABAAC2RZABLlFSUpIcDoeSkpLcXQr+v3fffVchISE6deqUu0u5qJdeekk1a9ZUdnZ2mS97xYoVat68uXx8fORwOHTy5MkyX8flcjgcmjRpUqnnO3DggBwOhxITE8u8JtgTQQYe7d1335XD4dCSJUsKjGvWrJkcDofWrl1bYFzNmjXVrl27K1HiRSUmJsrhcBT52rx5s7tLLNSgQYNc6nQ6napXr54mTJigs2fPXtIyd+7cqUmTJunAgQNlW6yk3NxcTZw4UQ8//LAqV64sSWrUqJGaNWtWYNolS5bI4XAoJiamwLjXX39dDodDq1atklS6z+/CcYGBgYqJidGnn35aYD2DBg1STk6OXn755bJ6CyRJv/76q/r37y9fX1/NmzdPCxculL+/f6HTnr9tGzZsKDDeGKPIyEg5HA716tWrTOsEyoq3uwsAitOhQwdJ0oYNG3TbbbdZ7RkZGfr222/l7e2t5ORkderUyRqXmpqq1NRU3X333Ve83uL885//VK1atQq0X3fddW6opmScTqcWLFggSUpPT9dHH32kKVOmaN++fVq0aFGpl7dz505NnjxZsbGxio6OLtNaP/nkE+3evVvDhg2z2jp06KDXXntN6enpCgoKstqTk5Pl7e2tlJQUnTt3ThUrVnQZ5+XlpbZt27osv6Sf3y233KKBAwfKGKODBw9q/vz56t27t5YvX66uXbta0/n4+CguLk7PP/+8Hn74YTkcjst+DyQpJSVFmZmZmjJlirp06VKieXx8fPTWW29Zf2/51q1bp8OHD8vpdJZJbUB5IMjAo0VERKhWrVoFfi1u2rRJxhj169evwLj84Qu/lEvLGKOzZ8/K19f3spaTr3v37mrVqlWp5vn999+Vl5enSpUqFRiXlZVV5C/tkijJ9nl7e+u+++6zhh966CG1a9dOixcv1vPPP6/q1atf8vrLWkJCgtq3b69rrrnGauvQoYNeffVVbdy4Ud27d7fak5OT1b9/f7311lvatm2bbrzxRmvchg0b1LRpUwUEBLgsv6SfX7169VzeszvuuEONGjXSnDlzXIKMJPXv318zZszQ2rVr1blz51Jvc2HS0tIkScHBwSWep0ePHnrvvff0r3/9S97e//fPwltvvaWWLVvql19+KZPagPLAqSV4vA4dOuirr77SmTNnrLbk5GQ1btxY3bt31+bNm5WXl+cyzuFwqH379pL+CANTpkxRnTp15HQ6FR0drX/84x8F+iZER0erV69eWrlypVq1aiVfX1/rsP/hw4fVt29f+fv7KywsTGPGjCnzvg355/6fe+45zZ4926o3/3SMw+HQzp07dc8996hKlSpWUCuL7Ssph8OhDh06yBijH3/80Wo/ePCgHnroIdWvX1++vr4KDQ1Vv379XE4hJSYmql+/fpKkTp06Wac0zu9jtHz5ct10003y9/dXQECAevbsqe++++6idZ09e1YrVqwocAQi/z1KTk52mXb79u26/fbbVbt2bZdxx48f1549ey47BJ+vYcOGqlq1qvbt21dgXMuWLRUSEqKPPvqoRMt677331LJlS/n6+qpq1aq67777dOTIEWt8bGys4uLiJEmtW7eWw+HQoEGDLrrcAQMG6Ndff9Xq1auttpycHL3//vu65557Cp0nKytL48aNU2RkpJxOp+rXr6/nnntOxhiX6bKzszVmzBhVq1ZNAQEBuvXWW3X48OFCl3nkyBH97W9/U/Xq1eV0OtW4cWO9/vrrF63/6NGjGjx4sK699lo5nU6Fh4erT58+5XIKE56HIzLweB06dNDChQu1ZcsWxcbGSvrjH6Z27dqpXbt2Sk9P17fffqumTZta4xo0aKDQ0FBJ0gMPPKA33nhDd955p8aNG6ctW7YoPj5eu3btKtD3Zvfu3RowYICGDx+uoUOHqn79+jpz5oxuvvlmHTp0SKNGjVJERIQWLlyozz//vFTbkZ6eXuCXrcPhsOrMl5CQoLNnz2rYsGFyOp0KCQmxxvXr109169bV1KlTrX8wLnf7Siv/H4cqVapYbSkpKdq4caPuvvtuXXvttTpw4IDmz5+v2NhY7dy5U35+furYsaNGjRqlf/3rX/rHP/6hhg0bSpL134ULFyouLk5du3bV9OnTdfr0ac2fP98KssWditq2bZtycnLUokULl/batWsrIiLC5ahdSkqKcnJyrP0nOTlZ48aNkyRt3LhRUuFH80r6+RU234kTJ1SnTp1Cx7do0cIlTBUlMTFRgwcPVuvWrRUfH69jx45pzpw5Sk5O1ldffaXg4GA9+eSTql+/vl555RXrVFhR6z1fdHS02rZtq8WLF1tHrpYvX6709HTdfffd+te//uUyvTFGt956q9auXashQ4aoefPmWrlypR577DEdOXJEL7zwgjXtAw88oDfffFP33HOP2rVrp88//1w9e/YsUMOxY8d04403yuFwaOTIkapWrZqWL1+uIUOGKCMjQ6NHjy6y/jvuuEPfffedHn74YUVHRystLU2rV6/WoUOHyvwUJjyQATzcd999ZySZKVOmGGOMOXfunPH39zdvvPGGMcaY6tWrm3nz5hljjMnIyDBeXl5m6NChxhhjduzYYSSZBx54wGWZjz76qJFkPv/8c6stKirKSDIrVqxwmXb27NlGknn33XettqysLHPdddcZSWbt2rXF1p+QkGAkFfpyOp3WdPv37zeSTGBgoElLS3NZxsSJE40kM2DAAJf2sti+osTFxRl/f39z/Phxc/z4cbN3717z3HPPGYfDYa6//nqTl5dnTXv69OkC82/atMlIMv/5z3+stvfee6/Q9ywzM9MEBwdbn1u+o0ePmqCgoALtF1qwYIGRZL755psC4/r162d8fX1NTk6OMcaY+Ph4U6tWLWOMMS+++KIJCwuzps1/344cOWK1lfTzM8YYSWbIkCHm+PHjJi0tzWzdutV069bNSDIzZ84stPZhw4YZX1/fYrcvJyfHhIWFmeuvv96cOXPGal+2bJmRZCZMmFCg3pSUlGKXeeG0c+fONQEBAdZn2a9fP9OpUydjzB/7Ts+ePa35li5daiSZZ555xmV5d955p3E4HGbv3r3GmP/bPx966CGX6e655x4jyUycONFqGzJkiAkPDze//PKLy7R33323CQoKsurK/ztJSEgwxhhz4sSJYt9f/Plxagker2HDhgoNDbV+VX/99dfKysqyrkrK/1Ut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5s0rMO706dPavn27nn76aW3fvl0ffvihdu/erVtvvdUNlQIAAE/k7c6Vd+/eXd27dy90XFBQkFavXu3SNnfuXP3lL3/RoUOHVLNmzStRIgAA8GBuDTKllZ6eLofDoeDg4CKnyc7OVnZ2tjWckZFxBSoDAADuYJvOvmfPntXjjz+uAQMGKDAwsMjp4uPjFRQUZL0iIyOvYJUAAOBKskWQOXfunPr37y9jjObPn1/stOPHj1d6err1Sk1NvUJVAgCAK83jTy3lh5iDBw/q888/L/ZojCQ5nU45nc4rVB0AAHAnjw4y+SHmhx9+0Nq1axUaGurukgAAgAdxa5A5deqU9u7daw3v379fO3bsUEhIiMLDw3XnnXdq+/btWrZsmXJzc3X06FFJUkhIiCpVquSusgEAgIdwa5DZunWrOnXqZA2PHTtWkhQXF6dJkybp448/liQ1b97cZb61a9cqNjb2SpUJAAA8lFuDTGxsrIwxRY4vbhwAAIAtrloCAAAoDEEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYFkEGAADYlluDzBdffKHevXsrIiJCDodDS5cudRlvjNGECRMUHh4uX19fdenSRT/88IN7igUAAB7HrUEmKytLzZo107x58wodP2PGDP3rX//SSy+9pC1btsjf319du3bV2bNnr3ClAADAE3m7c+Xdu3dX9+7dCx1njNHs2bP11FNPqU+fPpKk//znP6pevbqWLl2qu++++0qWCgAAPJDH9pHZv3+/jh49qi5dulhtQUFBatOmjTZt2lTkfNnZ2crIyHB5AQCAPyePDTJHjx6VJFWvXt2lvXr16ta4wsTHxysoKMh6RUZGlmudAADAfTw2yFyq8ePHKz093Xqlpqa6uyQAAFBOPDbI1KhRQ5J07Ngxl/Zjx45Z4wrjdDoVGBjo8gIAAH9OHhtkatWqpRo1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ZQEAAA9wyQ+NvBJOnDih9u3bWw+lrFatmn744QdVqVLF3aUBAAAP4NFBZvr06YqMjFRCQoLVVqtWLTdWBAAAPIlHn1r6+OOP1apVK/Xr109hYWG64YYb9OqrrxY7T3Z2tjIyMlxeAADgz8mjg8yPP/6o+fPnq27dulq5cqX+53/+R6NGjdIbb7xR5Dzx8fEKCgqyXpGRkVewYgAAcCVd1rOWylulSpXUqlUrbdy40WobNWqUUlJStGnTpkLnyc7OVnZ2tjWckZGhyMhInrWEcuHuvx6etQSetQS3s/OzlspbeHi4GjVq5NLWsGFDHTp0qMh5nE6nAgMDXV4AAODPyaODTPv27bV7926Xtj179igqKspNFQEAAE/i0UFmzJgx2rx5s6ZOnaq9e/fqrbfe0iuvvKIRI0a4uzQAAOABPDrItG7dWkuWLNHixYt1/fXXa8qUKZo9e7buvfded5cGAAA8gEffR0aSevXqpV69erm7DAAA4IE8+ogMAABAcQgyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtggyAADAtmwVZKZNmyaHw6HRo0e7uxQAAOABbBNkUlJS9PLLL6tp06buLgUAAHgIWwSZU6dO6d5779Wrr76qKlWquLscAADgIWwRZEaMGKGePXuqS5cuF502OztbGRkZLi8AAPDn5O3uAi7m7bff1vbt25WSklKi6ePj4zV58uRyrgoAAHgCjz4ik5qaqkceeUSLFi2Sj49PieYZP3680tPTrVdqamo5VwkAANzFo4/IbNu2TWlpaWrRooXVlpubqy+++EJz585Vdna2vLy8XOZxOp1yOp1XulQAAOAGHh1kbr75Zn3zzTcubYMHD1aDBg30+OOPFwgxAADg6uLRQSYgIEDXX3+9S5u/v79CQ0MLtAMAgKuPR/eRAQAAKI5HH5EpTFJSkrtLAAAAHoIj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",
+ "text/plain": [
+ "