{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d2eb9c7b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "import os\n",
    "import json\n",
    "import requests\n",
    "import urllib3\n",
    "\n",
    "from bs4 import BeautifulSoup, SoupStrainer\n",
    "import time\n",
    "\n",
    "import datetime\n",
    "import tqdm\n",
    "import glob"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "94386983",
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_ordered_unique(l):\n",
    "    seen = set()\n",
    "    unique_list = []\n",
    "    for item in l:\n",
    "        if item not in seen:\n",
    "            seen.add(item)\n",
    "            unique_list.append(item)\n",
    "    return unique_list "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9f32b8ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "base_dir = \"/mnt/data-ssd-1/data/nz-parl/\"\n",
    "manifest_file = os.path.join(base_dir, \"manifest.json\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7b819820",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(manifest_file, \"r\") as fi:\n",
    "    manifest = json.load(fi)[:9]\n",
    "len(manifest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cc825eed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'https://www.parliament.nz/en/pb/hansard-debates/rhr/combined/HansD_20220310_20220310'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "manifest[3][\"url\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cfe06869",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7a866c23",
   "metadata": {},
   "outputs": [],
   "source": [
    "date_string = \"20220310\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c630ce95",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "found 35 items in metadata for 20220310\n"
     ]
    }
   ],
   "source": [
    "dd = f\"/mnt/data-ssd-1/data/nz-parl/{date_string}\"\n",
    "with open(os.path.join(dd, \"results.json\"), \"r\") as fi:\n",
    "    metadata = json.load(fi)\n",
    "print(f\"found {len(metadata)} items in metadata for {date_string}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3f313957",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'20220317': 0,\n",
       " '20220316': 1,\n",
       " '20220315': 2,\n",
       " '20220310': 3,\n",
       " '20220309': 4,\n",
       " '20220308': 5,\n",
       " '20220303': 6,\n",
       " '20220302': 7,\n",
       " '20220301': 8}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# find manifest_element for this date\n",
    "manifest_url_to_index = {url: i for i, url in enumerate([m[\"url\"] for m in manifest])}\n",
    "manifest_date_to_index = {url.split(\"_\")[-1]: i for url, i in manifest_url_to_index.items()}\n",
    "manifest_date_to_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5d2867fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(35, 35)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# make sure the top-level manifest and metadata agree\n",
    "manifest_item = manifest[manifest_date_to_index[date_string]]\n",
    "res_vids = set([m[\"url\"] for m in metadata])\n",
    "manifest_vids = set(manifest_item[\"links\"][\"vimeo\"])\n",
    "assert manifest_vids == res_vids\n",
    "len(res_vids), len(manifest_vids)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf206a2b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "774eac6c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.utils.conversion import load_audio_as_array, write_wav, convert_audio\n",
    "from suno_utils.utils.notebook import play_audio, play_array\n",
    "from IPython.display import Audio\n",
    "\n",
    "from suno_utils.utils.conversion import load_audio_as_bytes\n",
    "from suno_utils.utils.alignment import align_segments, process_align_meta"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf255215",
   "metadata": {},
   "source": [
    "## Audio files\n",
    " - ### assumes that mp4s have been converted to mp3s\n",
    "\n",
    "### quick and dirty way, in a directory with mp4,\n",
    " - ### `mkdir audio; for f in *.mp4; ffmpeg -i $f  audio/${f:r}.mp3`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f21900e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# vid_in_order = [\n",
    "#     l.replace(\"https://vimeo.com/\", \"\") + \".mp3\" for l in manifest_item[\"links\"][\"vimeo\"]\n",
    "# ]\n",
    "\n",
    "# files_in_order = make_ordered_unique(vid_in_order)\n",
    "\n",
    "# datestr = manifest_item[\"url\"].split(\"_\")[-1]\n",
    "# files_in_order = [\n",
    "#     os.path.join(base_dir, datestr, \"audio/\", l) for l in files_in_order\n",
    "# ]\n",
    "# assert len(files_in_order) == len(manifest_vids)\n",
    "# print(len(files_in_order))\n",
    "# files_in_order[:2]\n",
    "\n",
    "#manifest[3][\"links\"][\"vimeo\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "34a0a94d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# concatenate audio file into one mp3\n",
    "def concat_files(flist):\n",
    "    arr, (old_sr, old_nc) = load_audio_as_array(flist[0])\n",
    "    if old_nc == 2:\n",
    "        arr = arr[:, 0]\n",
    "    pieces = [arr]\n",
    "    for f in tqdm.notebook.tqdm(flist[1:]):\n",
    "        arr, (sample_rate, n_channels) = load_audio_as_array(f)\n",
    "        if sample_rate != old_sr:\n",
    "            raise RuntimeError(\"poo\")\n",
    "        if n_channels == 2:\n",
    "            arr = arr[:, 0]\n",
    "        pieces.append(arr)\n",
    "    return np.concatenate(pieces), sample_rate\n",
    "\n",
    "\n",
    "def write_concatted_mp3(manifest_entry, force=False):\n",
    "    vid_in_order = [\n",
    "        l.replace(\"https://vimeo.com/\", \"\") + \".mp3\"\n",
    "        for l in manifest_entry[\"links\"][\"vimeo\"]\n",
    "    ]\n",
    "\n",
    "    files_in_order = make_ordered_unique(vid_in_order)\n",
    "    datestr = manifest_entry[\"url\"].split(\"_\")[-1]\n",
    "    audio_dir = os.path.join(\"/mnt/data-ssd-1/data/nz-parl/\", datestr, \"audio/\")\n",
    "    \n",
    "    wav_fname = os.path.join(audio_dir, \"whole-audio.wav\")\n",
    "    mp3_fname = os.path.join(audio_dir, \"whole-audio.mp3\")\n",
    "    \n",
    "    if os.path.exists(mp3_fname) and not force:\n",
    "        print(f\"file {mp3_fname} exists. Skipping...\")\n",
    "        return mp3_fname\n",
    "    \n",
    "    files_in_order = [\n",
    "        os.path.join(audio_dir, l)\n",
    "        for l in files_in_order\n",
    "    ]\n",
    "    files_in_order = list(reversed(files_in_order))\n",
    "    \n",
    "    whole_array, sample_rate = concat_files(files_in_order)\n",
    "    byte_width = whole_array.dtype.itemsize\n",
    "    print(f\"writing wav to {wav_fname}\")\n",
    "    with open(wav_fname, \"wb\") as fi:\n",
    "        write_wav(fi, whole_array.tobytes(), byte_width=byte_width, sample_rate=sample_rate)\n",
    "    \n",
    "    \n",
    "    convert_audio(wav_fname, mp3_fname)\n",
    "    os.remove(wav_fname)\n",
    "    return mp3_fname"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "25d1e3c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d6ea1be15fce4b0e934180d2aab89d9f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/9 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "file /mnt/data-ssd-1/data/nz-parl/20220317/audio/whole-audio.mp3 exists. Skipping...\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "81d53924096a4b359b7d0f4e9f45fc2b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/75 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "writing wav to /mnt/data-ssd-1/data/nz-parl/20220316/audio/whole-audio.wav\n",
      "file /mnt/data-ssd-1/data/nz-parl/20220315/audio/whole-audio.mp3 exists. Skipping...\n",
      "file /mnt/data-ssd-1/data/nz-parl/20220310/audio/whole-audio.mp3 exists. Skipping...\n",
      "file /mnt/data-ssd-1/data/nz-parl/20220309/audio/whole-audio.mp3 exists. Skipping...\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d4ab8a8d0ae549e59d15b22b78b036d8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/95 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "writing wav to /mnt/data-ssd-1/data/nz-parl/20220308/audio/whole-audio.wav\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6acf3f9dba6c467a8e23d03d6473e38a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/8 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "writing wav to /mnt/data-ssd-1/data/nz-parl/20220303/audio/whole-audio.wav\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0651efdfe822472ab8c45b56b5c48dd2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/69 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "writing wav to /mnt/data-ssd-1/data/nz-parl/20220302/audio/whole-audio.wav\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "07b7d3d5a6734334a43d84bcb629257a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/69 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "writing wav to /mnt/data-ssd-1/data/nz-parl/20220301/audio/whole-audio.wav\n",
      "done\n"
     ]
    }
   ],
   "source": [
    "for manifest_item in tqdm.notebook.tqdm(manifest):\n",
    "    audio_fname = write_concatted_mp3(manifest_item)\n",
    "    manifest_item[\"mp3_filename\"] = audio_fname\n",
    "print(\"done\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d277a62d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 0 ns, sys: 2 µs, total: 2 µs\n",
      "Wall time: 5.72 µs\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "#audio_fname = write_concatted_mp3(manifest_item)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "db12ce32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/mnt/data-ssd-1/data/nz-parl/20220301/audio/whole-audio.mp3'"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "audio_fname"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dbc4ce59",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e39fc8df",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_section(section):\n",
    "    strong_items = section.find_all(\"strong\")\n",
    "    section_header = section.get(\"class\", \"UNK_CLASS\")\n",
    "    metadata = {\"text\": [], \"strong_text\": [], \"section_header\": section_header}\n",
    "    for item in section:\n",
    "        if item in strong_items:\n",
    "            metadata[\"strong_text\"].append(item.text)\n",
    "        else:\n",
    "            metadata[\"text\"].append(item.text)\n",
    "    if \"(remote)\" in \" \".join(item.text):\n",
    "        metadata[\"remote\"] = True\n",
    "    else:\n",
    "        metadata[\"remote\"] = False\n",
    "    metadata[\"text\"] = \"\\n\".join(metadata[\"text\"]).strip(\"\\n\").strip(\":\").strip()\n",
    "    return metadata\n",
    "\n",
    "\n",
    "\n",
    "def parse_transcript(transcript_soup):\n",
    "    main_body = transcript_soup.find_all(\"body\")[0]\n",
    "    results = [parse_section(sec) for sec in main_body.find_all(\"p\")]\n",
    "    return results\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "acc6bcf0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d048dab7",
   "metadata": {},
   "outputs": [],
   "source": [
    "transcript = parse_transcript(BeautifulSoup(manifest_item[\"transcript_page\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "c972399f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "778"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(transcript)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "93c731bb",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data_dir' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_4073381/908301045.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdata_dir\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m: name 'data_dir' is not defined"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58c42a9a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6d5d63df",
   "metadata": {},
   "outputs": [],
   "source": [
    "#transcript[55]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fbf4ffec",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load audio\n",
    "audio_bytes, (sample_rate, byte_width, _) = load_audio_as_bytes(audio_fname, n_channels=1)\n",
    "audio_dur_s = len(audio_bytes) // sample_rate // byte_width\n",
    "if sample_rate != 16_000 or byte_width != 2:\n",
    "    print(\"original file had odd samp rate or byte width\")\n",
    "    audio_bytes_16khz = convert_audio_bytes(\n",
    "        in_bytes=audio_bytes, \n",
    "        in_sample_rate=sample_rate, in_byte_width=byte_width, in_n_channels=1,\n",
    "        out_sample_rate=16_000, out_byte_width=2, out_n_channels=1,\n",
    "    )\n",
    "else:\n",
    "    audio_bytes_16khz = audio_bytes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f5fbcc18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "356831"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "full_text = \" \\n \".join(t[\"text\"] for t in transcript)\n",
    "len(full_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "19dd516b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "62484426",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sox\n",
    "#sox.file_info.duration(audio_fname) / 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0da37aa5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "39dca9e0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "87d13351",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 482 ms, sys: 984 ms, total: 1.47 s\n",
      "Wall time: 15min 57s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "align_dict = align_segments(audio_bytes_16khz, 16_000, 2, 1, full_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "95918038",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "67.0% aligned\n"
     ]
    }
   ],
   "source": [
    "align_meta = process_align_meta(align_dict[\"words\"])\n",
    "print(\"{}% aligned\".format(round(np.mean([e[\"success\"] for e in align_meta]) * 100, 1)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "892e495b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e075abd1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#pd.Series([e[\"success\"] for e in align_meta]).astype(float).plot(figsize=(12,8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "1b0e8e64",
   "metadata": {},
   "outputs": [],
   "source": [
    "#pd.Series([e[\"success\"] for e in align_meta]).astype(float).iloc[100:6000].plot(figsize=(12,8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "6ebd4db4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean([float(m[\"remote\"]) for m in transcript])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "89e5f525",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'text': \"I thought irony wasn't allowed!\",\n",
       " 'strong_text': ['Hon Simon Bridges'],\n",
       " 'section_header': ['Interjection'],\n",
       " 'remote': False}"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transcript[116]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3fbebbd8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "707affa9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c27ebb36",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.utils.slicer import (\n",
    "    get_align_gaps,\n",
    "    get_vad_gaps,\n",
    "    get_intervals_from_gaps,\n",
    "    get_audio_slice\n",
    ")\n",
    "from suno_utils.utils.alignment import _reconstitute_slice_text\n",
    "import portion"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "9dff2499",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "58.1% slice coverage\n"
     ]
    }
   ],
   "source": [
    "# make slices\n",
    "vad_gap_intervals = get_vad_gaps(audio_bytes_16khz)\n",
    "align_gap_intervals = get_align_gaps(align_meta, audio_dur_s)\n",
    "safe_gap_intervals = vad_gap_intervals & align_gap_intervals\n",
    "slice_intervals = get_intervals_from_gaps(safe_gap_intervals)\n",
    "cov_frac = np.sum([to_s - from_s for from_s, to_s in slice_intervals]) / audio_dur_s\n",
    "print(\"{}% slice coverage\".format(round(cov_frac * 100, 1)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5b18e58a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d736e46e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "979e96e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "speaker_idx_map = portion.IntervalDict()\n",
    "speaker_idx_map[portion.closedopen(0, len(full_text))] = \"speaker\"\n",
    "meta_idx_map = dict()\n",
    "\n",
    "def postprocess_slice_meta2(slice_intervals, align_meta, fulltext):\n",
    "    # annotate with text and speakers\n",
    "    slice_meta = []  # [(start, end), turns]\n",
    "    for start_s, end_s in slice_intervals:\n",
    "        # get character index spans\n",
    "        start_idx = None\n",
    "        for e in align_meta:\n",
    "            if \"start\" in e and e[\"start\"] >= start_s and start_idx is None:\n",
    "                start_idx = e[\"startOffset\"]\n",
    "        end_idx = None\n",
    "        for e in align_meta[::-1]:\n",
    "            if \"end\" in e and e[\"end\"] <= end_s and end_idx is None:\n",
    "                end_idx = e[\"endOffset\"]\n",
    "        # one can be none if edge but not both\n",
    "        if start_idx is None and end_idx is None:\n",
    "            raise ValueError(\"both start and end index are None\")\n",
    "        # assemble speaker segments within index range (if one is none then empty segments)\n",
    "        speaker_turns = []\n",
    "        if start_idx is not None and end_idx is not None:\n",
    "            for (intervals, speaker,) in speaker_idx_map[portion.closedopen(start_idx, end_idx)].items():\n",
    "                for interval in intervals:\n",
    "                    text = _reconstitute_slice_text(\n",
    "                        interval.lower, interval.upper, fulltext, meta_idx_map\n",
    "                    )\n",
    "                    speaker_turns.append((speaker, text))\n",
    "        slice_meta.append(((round(start_s, 2), round(end_s, 2)), speaker_turns))\n",
    "    return slice_meta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "eef74667",
   "metadata": {},
   "outputs": [],
   "source": [
    "slices_meta = postprocess_slice_meta2(slice_intervals, align_meta, full_text)\n",
    "slices_audio = [\n",
    "    get_audio_slice(audio_bytes, sample_rate, byte_width, from_s=from_s, to_s=to_s)\n",
    "    for from_s, to_s in slice_intervals\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "dcfbc27b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.utils.notebook import play_bytes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b7814372",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6efecbe7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "53f54cad",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "21b23758",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1308"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(slices_audio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "056cd7e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "We have put significant additional resourcing into our Māori health providers in order to try and reach into some of those communities. It is a more challenging group of people to reach\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "                    <audio controls>\n",
       "                        <source src=\"data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//NYwAAAAAAAAAAAAEluZm8AAAAPAAABUQAAjuAABAYJCw4RExUYGh0gIiUnKi0vMjQ2OTw+QUNGSUtOUFJVWFpdX2JlZ2psbnF0d3l7foGDhoiKjZCTlZeanJ+ipKeprK+xs7a4u77Aw8XIy83P0tTX2tzf4eTn6ezu8PP2+Pv9AAAAAExhdmM1OC41NAAAAAAAAAAAAAAAACQDgAAAAAAAAI7g4ihPoQAAAAAAAAAAAAAA//M4xAARKrJprUEQAJUAxQMCALjeN5jGyGMdjHI/5zkJ/1Oc53znOc5z1O//oQjSEt8hCEI3IQjfznOft15DnP/9CN1O//5yEJ5CCwfP//1g+ihhRehaZgC0Y0lJ4CVuxyYkmSAK/mB0vsNc//M4xBobiwqUAYYwAG+4po5xTuaWUbdNF2aTPFGrI2EDwhmf3/PHqe8B/y8/jI8d089m3tVK19VFnEa3F1/+714nW3/+lfpjE0P3ZpMi3em3f+7f6zaz9t//z9/Fl6hlVFUExOPoEmD+2HnE//M4xAoXOgqiL8kYAJWIwJjJdZhzQxBFFljxx4hPq7W2nw2SIfkckdnLCpaziw5IOcaws84f8M4fwkln/yGoQtpLL/Gpu7mLdEuaHVCOqpjRdA8eRUgHzZBj+3XmA4oYhUjVtmIJZhkrJkVK//M4xAwWQSKqVApGGCFvCqicVWSSsWfASniZFqjPDpatI6WEhHIPQK2GR51YTgQkBFgYPC4jYDcjjQcEBqQEbBPAIkGgcyKgAEYftJM+6vrOqCAu1lRjo9GMjSURv9QGMRI2hLERlGuW5Z55//M4xBIX6haZAjBNoCTBAWY9wM6aMoNE4z7m4kzO336z90Uv+KMToJyDsyMKZbNUbwzWRgfmIVpxILjCsV3uvW7W+DtSOmVcmXBXU6YVEt51YPmSwQJK2f7Yva1QTFAF0d3FOBkRcnGkj4PK//M4xBEXaqaZrjDFUEKX4Eo2sgd9rTnTBBoEBnAYJmCPStdB2mxJOqKEYPEDu3qZJsqBUy/OtcKxP77kqGJUUGpNdXXVbBl1J3k/6N0q6/p80oqPZDf/1iVyhQAYPJ5McxpzHnE2oknJl44g//M4xBIU8UqQxjBHIJSCmzd1MzeT/hr5NngjyMoGLxDyo1M1IjqCjkgrFBUJiVAJspa4oaLCIiPCEZU4wtA6umBFUV70pU08rt/uJjA8Poi8025/Lrg7AZzumhBlOcSHZhRWlmXuooI8ps2f//M4xB0U+pamVjDE9LH7AzuXdGI0CX0KsCZPP69yfSoRNJvyun+700nOhGBEwgA1DvIyI3f7s2h2bo/u8dbBB//cUyeZnpVG0ODYnQNKmgIcK2yByBRkVohQYC5sLk4gEh0nMQUSh3iIoBQ8//M4xCgU4S6cokjFDEIDHjhBFOIlLeQjzwTpwAZNjWX0XiY6oNHASNmEhVogad/1fxd4fUs/fZ61/7ANxMzHZDW3Db5ZivmMt8HaJOs/odTBHmfqeJGBjUigLCiLcxG9h9L9cbA2RR0EC4+f//M4xDMZKfa0AHpHEFlfSRIrs7nVQdOvN8IIE3sTFbQAAACvk7EhHC/+xPl6yZIFAzFghGIAGsMf//V1sYta1nut2u1oowE+kCf9l00mPdTmoNS0e69Mej22AmrGs0JhXWWN9e92bfo6tSco//M4xC0T8RMaXlvM7hVO2NUHE5YMT/QAkk3JQODSHlBMPCsHZyz/0idkt///2tU2iXZFpu4Z+G8a9cwRmHE3nuTh1mpdqfAz58h26ImLkuZz2/fb/UTO+Y6nBNj79IkyHYr7P1vLsZmYCYIV//M4xDwVGV7J9npEtOV82bcIxij0GhC5H//pXFwqwXHDu/61uTWRdkowqSXf8fMiTI1TKkO2BHKAaVuvByp3B6Xa1lIKyuYcbAodKhIgDQ8OqEpVBVDzRxE6usHgaKEeprQNFxQkp5BAANw1//M4xEYVIJLKXnsGaNmv/9s6OaGhpEv0s2B+hRCs24NTJVPG60BOkuDnB5FoUwPds5/JayFiKL8YxS97O5aYHLGH5y3izxQY1ZRqHGoADhUAnSHkGpnzzSZaoiUSTEfUmrrV8lSZjq3Uk81I//M4xFAUmNqoNg4MCGbCSufvIvA71LGn4XtFaaIpOBkHfnF8JtNBnL60JhBJylgmH5n9Eiyl6uYQDd6BUhWMpWFm9a0Zndk/VK2ot79Om3p6aaqDFoEJ9NNZAnUCgGBtwkdAQmbyWx9nSCFs//M4xFwS2eqkAMMEyPrF6hQbzYRIRQIxqSa8IIRw9YVRXhnWmhVTRovS4vT5dPl7mX/csfuguPmyAaVFJX9f//1/G/xE3pJ1UMDgrIIFIdz1jG6WXZAqcNCx8nw9h+C4f/GhguBHH4kD6sgu//M4xG8bGk62Bg4QEKltLlEzdstmhwpKgqjvYwA8glc2I1Hmbd1Zm1n+4qqX+qXXW1fT0qbNYoD0wdlAfCKKh4wZFoDgHAqBQPGoRFjCaDdjjGfu3O9ud3VnYeVs3ercj+/0v5T0VEyd3b38//M4xGEcKzbVlmHHHhL8K+WjjCmrKdCK1HEVRB3AC3/Baj5gkxLm6bTddqeLEisTSt4VrKgtj6IX1OBT6S3KqdUrA0wbH9uvZMu0fTa6HKq/sl0QhCqxe90Z1U/vzJUrC1vv//6+/29VU6EE//M4xE8VKsK9lHjEuKwqzpsdUoIBC5QAAg9bQRRq+qIiNggaQIMEJMJ0c4L7vI8PCYs5uT5kRflbe5fk531Su5/CdE4XBZQ2zjP4IDO6gx4PscKLKSaCKgBAP//V4o3F/3SzQtWjVg2JosYK//M4xFkUWZq9tnpGNHOPncqJOQuMNMmkH0TmFDYrk/S6Fz2YDncew3Lrf2B9/w+FwhhOTF/4t68ZDe7TaCaU6mQMnnjaxIutOMEcwfNHEnA/St5NYBvtABDb//oVoy//o8FVQpY2+QS7h/X5//M4xGYXIVLWfnmS8D5FsMsluoRX2VKV6SHmhKNmO4UfgyC+BGLfBCZiFR7SvsoXf88p+SIwB4xqKxQKJQ0PCI6rWvLJ9DEAM8hP/1PK6MTA+f/xFE7iCrGvRJJwTOY0of1eYA+IrrEvxLnY//M4xGgU2SraNniM0pujCmswzWHa6kysjVAgmTpaqqN51Q0P44ngM6RRyP1KVv/7K0rGcjtOjGM/KpiUZtv7//9qun/1m/+rpq5NUwzVSbrknXJKDLWT2M9SrtitZVGD46riUck0ZpWnCGWD//M4xHMVGyrI9mDE2jlM5XvpccrEfylkc06zOc6yAjL73lKdrKd7wpHrfcvu3L/m7TWN09TU+3rv/7f/fT6P/+GZR7ihkZa05LsMviCYKCEjOVlWrL6l0qGBFLjtUUwXhtDUoj0zpxjtM7G2//M4xH0Us0LNtgsEFudLdZnDgeLS96FILCUAiRTqJvEliRE4TiqIstmzr82nuLgHCWBodzv4bQxIk1ALWYswBJYrCr4FThiOaojxBmnQ4KyUDIjpBTNqcewirwjLh8X2Qy56AoR4hXVgW+n4//M4xIkU8Rq6fgsGGFkzVRxrZSxzIuJ+uEOSyfC2KL24Qb2uQupyX06VJAUb0JJUeFlpLEdGsYEhTd8vgmL1g/pDxlUdsGBYYPOTk9gEAARF7NAiYlpStW6//KNQr9t6b9nUDTyqefpUv3Mr//M4xJQUYUqhtAvGFCbQ+/UhbSH8Sh2eYAgrFMS86h30JmZRDAJ6VUnR/npgVRjjdJK3J+kaidGYhUuX5dfGhsSnStvuV9uViOUTkgiFMLnLAZM6mjtDCKURy2JZenKbmiMKUK7GfPxUeCxA//M4xKEWMRq5vgMMHEQMRUhDz0dqkWM/1/63IlcOrYBk7ku8biMSGTq9gjMStc1ccieIc8YmJmmViClkKK9cZnI6oUrmQsCGeLHimXxy/jkdLfOpFPokYwypf37IUPWKYap8VeNCql/8Hz/9//M4xKcWcVbBlnhFSv5Qa9UCMEAcHvKaE4pcTJAYBIjXKAcuRxXSY3P/P+turh7z/dcpl3Vv1+621tXyzJsjkr/9/9yf+pmJ+sm1+hCSEoyIQiNQAABEAQDBZznlRxICB6Ih5SASDzGDy/sV//M4xKwUEVqw9gvGFI2zO2khSUgILY8iYV4AHnC4ORo5yD4+ceVICIEQmHVNubP2cc2HGcp2e6Go37e2PJ31qZOs+2t52lXf1Xzf+ndb4V4NaXYd//9pPZLdjsoIdyyFPNHFFjwi6rYFF1N0//M4xLoZszqoVkiZPcAKlQKeVfbOgSFaLPUBAwkokgkRFXfDjW15vPDUdc1rSCix3TQSNBVKZzvMnG+jhKwOhZ4qCjSkkljagT/wX1g6UkV27LoMYogu2ez9Nbd7GFZf7bVPyre7vYiaPQp5//M4xLIhy0qoNDox5EOrbOR7NUtG6OjhQXM4Uqn1//0t5PnZV////0/vWhd9cpoer0lt1rkbwmAXCBxVXdK67dtbZJExs1wwQDcmHlljgkAcCQQCZyMqCREtzz08f3X94XT89faDy7/ZpdoB//M4xIkWaz7WXDCHdgIY09EJ2VyJOe5XAzneRm2/dtql/6zK3RlIIYiFBqdv///0c3CzP////vKyDhTwZQkCqIDCSDwWuv7DLGGXxXTPGAEznZvFACACmuW5kS9E38NzfV+8zPEFXowsNNBv//M4xI4Xoyr2XmGE04eU4dnki6p/y7voi9Chh671/f1P/3z8U091u8VdSeg9ZdKIKKAhA//7EoqKZwFXtvhpqQ0pLhKGl6no5KP/co2WkAn6mjXkUTMOYojMOSksy+75VK2e5cVUVfz13dHg//M4xI4Y8hq5kAYQELUpTVElzGsYz/xQZKGH9VR/+X1/0NZkR2co3L/f//0/SeX/keX5POD1qsQRHp/ypA+M5DYUF5FSWjhbl+SsKSzl/wQ2nPZzCPmgLgZPjE3oe6pUk4ZaqWRbrvpcyBUW//M4xIkUyyLV3nmElIf7fb/ZPZu1DNdZStTt3a1F9WWdUrd6wjxLTSVf8qkyZlOEUprtLbrthJ0PcZhYQtAAClHRqVXP2TX29YNXfMR/ufzP3aJ+whFWF/TP6c1yY1yL/faxLXBIrkDB42Az//M4xJQVcqq1tnjE1G9mh+SSpun3//8iWlz6UNLPymhpEGoCklpxMjEF0CuwVqDVEbVcwG13ntgh6zLuQlxNLUswx8qci2h7pg7+DG/rJN5Mip9wIv2z81O8pl0Zy6Qvv9/tPkGROLmbP/+4//M4xJ0U8WL2/gvGGmVOTwWbBZ1jFKa2Sv+Ak6WDAKFCKJsqpioKe+mmG4oDJyUWKFjdBhWrvCA7kedsy3S7EtkbKH3C49URvjrTSVvQG4jOcUr/YLrWcB1lZ5wsGP/khA0sece+HaiqSYVo//M4xKgT+X6uVJvGNAIoP1nayBliwQoChCFErjKhhShZtZCIL9FoYyav0O9/0Y9nFve7EnKRQRKkIOyod69PT/GdXz0ZpCNVCEciMd6EHo2u7VOd6PTVwzchKf//4dpgCBlQjA4Ht+4hnm1i//M4xLcVKOK2VA4KGCVbxZjHQ8v0BUhOhcLC0xnCUzPAJtTenFoOmbF+M12z1WbHgGEhaZQckj9mj0oqu2RiU1O5ymdGFpr+r87o0gdyKjNe9f/1b9CwbuACKaAZwS4JnZfAaJBtlkq2C+Rm//M4xMEVIkKxlMPENC6wFV9ShT9gJn1tnP8mhkdbjMhJH9j0bRP0WjoXSn+zf5PVmz6ChGdGRPkt/3vPejE6Exdo4XUw7VOgmIKH4g0QDlUZBw8JiQoHHFz1j7jdsn9pSDPNSAhxkQggsUBJ//M4xMsWwn7CVHmE1AcICckIVQpCRq4G2X3bWJhoJDnXL8+mwuStXl8GMMGxQqcekUkcwbbtcZFQ0SRV15KnUPTJaXZEXeGHZGdVK3w6CAdLYFhQPh2shgMFolr16odyQedcO5U+sEK3JCd+//M4xM8XW0LI7mDKupq7EiAxZg8Td9SZC3zBCqzEUrQggm5Qwk9qjzxKDW6TFErETUv8JlSLhU6xF96REeq1+Uqgy/Ao/f3balKF7XYzLF2IDDiM0Bell4FGDSGeSl6pYSWT8ikpc0cCGFAV//M4xNAUuSbmVgvGBj61DMFh957rF+tF7V2l444JxFI6i0KDtnFyyXK6cf6Z+8btOX4vx8F09YlPyP//84z/VAmZYMLYogQg7vArh4LDBco9X/upb/8O1cVE43TSkw+Z1BUTSmPQFUkMESbI//M4xNwUYR61YAMGFK0OU/I/35wInnfpcHypcO7rWdYLZWXR2Z+rdSvQxn+/v/61bs1aPoZlZdWQqGfxdWq3///1T/8nderOQG1EHYJuOD1fRDDbKEra7mTqUgzKkD6fXEVxULvXc/REZPv6//M4xOkdShqxhMMG2Nnl0yM0S37Ou8SuVc9w4vKIiZwjW6Eu9UI3r/+37EIQgznDndRaCAgCCSgY/iej0RWEZ3ogqDfplECYKFHsjGaZY4SwuVKo2RsePOSpkxn1xVIzQiuk9L3TXfZv9C+C//M4xNIUszbRtkjLCjPShAxO6KEEoZFMvFxgEydjNnO8rP5+qYlkvOVVCsuc6UxGKCRiewgopSCHzpHtT4w2V9XVZRlHoa6HyaqFgAySaBvBgagN7id7yf4VQhrK6nfOPu/WlmK9EPTyPLfI//M4xN4UQmKw5EjE3JKfHRvoW+CVOiAILAbAKMRNf+/wVScEMKUUrQvuZakfsf7H+qUjVQUgMBFqyy3AAN7Byi2YPHkywoKkPRlkuUaojbckJe64sGPVoki+3ITM0SOc1KGPTJVo7XSyIKMY//M4xOwaijq5jnjS1Mk32MZ9V2K0tHDCjgKNDD/dKm2o6NYrMmYSUugMSSAiStssqU2////yK8zbNVE/scFXptWIIxuWtRJKYfNmsFKhPu3J2PVTiAEIHncijRbu6mJun11nLL0tFCJw7NEw//M4xOAT6hbOUAvGGaNdTtlO+gw4kzSDMPOMrJO5jKeC1T73/7SJmfVJ3cysqFT/vp5CVPv//qs+1WfCO/Bhc0Uq1iUkl9JwDyM45ifDAQIjMQkhCFXbVARkMPFHESnMMGcUJuLsWH9iJqp4//M4xO8ZEyq1pnmEzeJOgyroZ2YXe6USSc57FLYzRnom2/WrL+Sr2Ko4SfR15P0OIxogLBYdEEEhY3+JN6kQY/KosPiRc1UFRcPD/wz5NPcszCx920CSISXJFkuRifrWNO4QcPmmlNGFbuoe//M4xOkXyv7SXnmEe+EiY6FA8DkVKcHDJeh7xb7v1advHGbaQwgnHXVT8VW5Nv/VvoIOrKpnvu/X+R4ZgedEP9H7K5AB/GEF0fOUQAEHVCiJAynK0Uk6hu/IWXpRbqQLD7qjRYmIaBDdWsYL//M4xOgY2wLRtkPKhgxiW5/uG1VRWhUHUxkD7mhgM5hI1Hvh7dzK5ZSbsi2ejo2V9bfu2Uj3Vnq/Xrf2t//jPGjPE/9BNh34RCxJapZSlBM4FhgfFYF2V5wZHRnJkqQ1UT30es80jEcAWyPK//M4xOMWwm60bHoE3Ii31MibOVDTZGIZ3Rrvuy9bluoJh6x90jW6ePJnQZBtzHVlEpvLVZvXrsxSmy4iJIgWZt/a3FZxUEwbK1xShWdFUTPt64kWn0lmIXNP7NuLR2CW6z61zPOmPDuEBRyQ//M4xOcZsy69lnoK1kpQ8EjFHZEOdCclP0YxGsfnw47VOQgj1es5znv685GZQMdJLMxDYUDgFAiSjuWLi7v9dy7v/1XX/fxSVLu7uLn5YkFKUFYNxfzVBUcUwkiD/LCShZxhPslIsMcgcixL//M4xN8UQXq4VmBE8kAihMHHnfLQlIzIzZJOX8uzCF7wiwhfvw29Ed73nYjnQYCGao6p2azEoqnzHcRQYIjEGiosKLETD2UVKKsAwmwsysZ0GgUUK0qPROrKi+7Lt/2+yOPh0RFTvD1iAozW//M4xO0eEz7CXkiRVdQj5rJI4smkWcWsn+Lsbrp49AvFDO7PmZ0NQxWZ1LcYbqsylZFEhI6gIc9FssqtarOXVDao5mfdtl1UmqHZ1qyCxksOe2it91X/6EqWyhJ+xFbEKpEkpf9XEU5B7BCH//M4xNMb8zK9FnjKvUVqTKqSqM1wc8Qry7lnkRfHKC46Nnjvlq+EPvx8mvg8jGAv83MgG7T0T9CzoQuPkeiuc9ACAC+X5G5u7mDF+kU93zQ/e6OEdzTiL2m9YnTxEr0DMG7/hAVWs0k231jR//M4xMIVye7OVAvKEGs7zQoxAkCiK40KlNQwWrWjGa3hRNXZeHVYPKImbyP0Qh5/v93Mt+rvUeumQ1jLZKI9CsqXtM0++hpOnlXTS3av2sWv/sttqX7WeKWw5uoJlDjZqY1iDKPjmD5RJh2B//M4xMkZAz72XkBHa+c8i9EAGHAiXYuJvlPADXgiWFEqPUFyksVYeR4UYCbgVDY4+xMRHiIaCoChp1QiIxEblgzXiU71PxKz/Ep09PMErF4dR5Mopod9kSHIP18OCgAxoOUoOpbLZPYqSiUm//M4xMQVEyr2XDIEbxEiLD78Oa70M5B2hARD60PvX7UpLIPKBaQTMLa37/pgNXdF2L2bYqvSwo69Ps3cSCxVX62/1zrtfLjKEwGggpMLAMrNPApLUJJLyKq3jI7tr4vM4Lru7+PqQczd45ln//M4xM4VAHbbHAMMBEzQ3tO/H/d36/bW/ps13K/XM/79FifrecZjv2l8lW3BpZZ7p7duHLEenX6jY9yCtVoF+8LQOnO4PsFwCj3KiASr2AigOwTz6MxmtvGEsxVhplN9cMqDzRdoyPB03Kqt//M4xNkVYQrXHsCMyGsFRmdyoRuMeqoxszZWfJ/9Nj4W0TjHCdbYS9OlP8+8kQrkYUNKJnS1Cv8RDb2s1p76+ZVKgE9NwgvPm2gWkd5KMMLqkYFAccHsY3z7/XcDfYzx+sNzl2BRHxXtzd3Y//M4xOIU2hKxigsGFJcwQo1Y6jw7StUalLJ304UPuyPMmVvNuW/5K9kMytRF6l37v91n36folmgUl6UZ6gVqDhGQwBue7+O6YZ0GAJUw9IA0b+hh9v6VH8cFB9fiup9o7nPkLRcGSPOoZkQr//M4xO0YohaoQsPGXMwyx69EgnIwE+uXJv7y6xvv5a3O/OGf0oR8k9nPdoTQ+eRIKIZDci05R6jbkfVa9DEhrTHqAg/slcfGR7DHxEfAK5NIMMAAJyaEBvR7lCIEH2DoMK4VJR/0YhfcBhaX//M4xOkXwq6xvHjFLF7DX7My4zUDYYB4o40w0oBhUWYPqBe6JrCr6EluKgIKDBoOA4P4qGFBPf9h72/Fj06lgYKuIFA3idrYMrEV+FvfOBDC8vg/AJo1WSGQNmUKyuCQqBrOUfLFkCxVvtLn//M4xOkX2irCXmsGOKcWmRlY5EoqpYCgH9F4s/TwtoqIRLUIwoAyB1bHhiGFBZJQmPOS+/0i1qYgsDgDP5cXnDd/wBifupQljygDggi6PylC8/uNOFPDKBvkuoh+slj1cHG9YVpbwsyugIBz//M4xOgXwOKldHpMqBnQyFo9NDlKkoY2Z69DJ69Lf6K5MG0mnV/+pNoj78i6JbakGwi3MECKGgbg3cOgFA8IJBoYkw/NvLlChAeCnreWP56y3tOswXIqRxyUY0lsLwQq1efrLLJGr8+cNveZ//M4xOgasPq2XgvYGJNNBjt2pJGpnRr/H7pvPbWd835DFYcZ6ybSXkiE5vsPzlkuX6/5Ttn9Tb7+mxcxfrytBtJqPpJHmhc6CstwXhRZEG3VLSGsJoXQsSOobImkayt51QhGHHdbWB8/53EL//M4xNwcWz6wVHiQ/XL9jRmmxGAGarvDPwvcf1Dc5oJwjaTEMEAEPoMBsnOioGWzDl4MCdt1StDf3NChmZTs80DiwROo5qZu45KBxQvffIUNU/WxwVMJ+3Kms75UthI6o8one742kXKIIFZ3//M4xMkXkmbhvDBXU4yRshtFSOcWJVMyZEbLF5VOzWgJxGaxKpt8MBC0QCFEBgJ3bCCwzMa5FX1LM6f1V82gZ6oVq7/3R8yopdfTtfqzre/UEGRmdxk8rafqbUOJ///5X4JwmkBAYPcbISgt//M4xMkX2WLGXHpGzK22AvXVnAE4gVGegAtI+rOSNMv7lHG+mpU3kGEE7BEWCxRvgiOVppHl+RM/6p9HumktZS0szfV+v8noy7d02/qMMcDwXlHZf/qUc13zgnN1gmr/QXB/QqDR8M+z9wzo//M4xMgYIybNngPEH4Fqds6wSqGywl7ioyEKY6AhDXEU5OvwjiJlSc7/nPSjn6nP9bubjnzvpt++5XRm15VRk9aM9lc6BJ6BEQzXoyOnkbOCYPVCjHKQ5xABq7AY4NyEOQocXmXVBKaoAY8a//M4xMYV2kayPnjE7B6EwfQDUKpIqKj6Qu6i4bmG69V4laVIneuUZ6uFG/rMWYbUhCBn99PzP+mZl5vwKNzZlnya25f6SsiAw6SrZBpEGC8FChG6JY7BGoK4tIoo0TvQYjsUUwQChhRXBYNh//M4xM0Z0zK09njE0XUUKMMiggBAH21BGFiEHUSjC4wSEJx2qh7/pl4f3WA5+NCplQMFUoBUohHx9s0Tr070idkVceZcqJV7s0xfz5akf66unV116Z6Mj/ehH7///VNMK//IneTrR9kbV1WL//M4xMQfC0a09EBTbE6THVISUUCieVpJgtUba+Il2lmjJolMMTNXHQaGlWpieJolYJ9Nl8BjogyMAAITTw1ApNjf+963jI7IKOA+Iw+QEZpxuiiGDaxzmdFTfqp4oTRyz707EA1DW4iBv+pe//M4xKYUyv7afECHPYyq50XP/swfFsh5ysvVSHzR0wXQex1xW82S1Pbyqv7lxlOslH+qv5cNlHEVxgQg4KTAjXBMT6svqNtpi7TQWw4KBtSAgZqc9jP7m1tunm9lch2OxXIzoYh2b71BOo05//M4xLEU6L7afgPMFF1PlYQ0XJHLyLo8oJiafs8IOXLP1xpaMySSy6DMbgG2iGRh0jv3wovdzWYxUKVkKVmMKcrBjM5W1K3+n/lbVWlfu//y////0Y3o/05m/nmqx3gzK4EQpbBwmSKCPh5V//M4xLwYAkK8UHpE3EJKWViZWVNP5mvicmAYTOKEDESAJu722jJqwZoteTG/WHVPYzSUvlq88HAZAggOlQz5At3u0Nm3IQbrJmjfb5qmrRlCTzj8aGYxOOZ/yeLbpuTdhwtGqxxccxvVjsd7//M4xLsUOz7eVkhE88dG0OCsiAGXzp2ScZcW0ClBIo8OCSlctJg8XQXFCAWC5B48daI9ynddxXej/6SWDwwQBcRAEiZr1vvPzP//iTQ5JhACkmAlvj+1AC4nMQCXOUFLPLi4RNsbW4wVrRmo//M4xMkVMVqxtAvGEFvdWYpl11rkfsYpxgJ+hf825WYpmX/Svprfrd5SlYysUjpeb/WWj9Ka/3///9G9PQPOcFQq7UIRZifdtLeNZk2DydxF2aSojvB3iwWS8cijVyRWk9cp0c3aSX0kns31//M4xNMVcd6wKGBQ7Jn72iZepXQoAGFBrVI7oWeY0rASsVx6t+hvV7ej6+XlLOUlP1dHeb/8vf6f/9aydDFWQc0w9QBQA+sLV+aLAxCCWzVQDtUxbnAqwsbpok3SLidcFi3GwSWlt3txreeV//M4xNwUiz7KVkoEqJ6NR6BXCkzOOUSIQCEKdC9EVUUriyrrZlP/o/3vtkM8zRhMD4q1XR+7826zUYN0p3CRx6ktscskkHuZ0S8jBYEkjIWJjUETVBBEyqu/I6SEX+70hO1mZVJ3q/n8bVVv//M4xOgX2zrSfnmEfNbu7MlmVM79yMz+OdssqlI2ky8aIKhTc2dP3AiExUEhQWC7D7ilgtArXOHxhh7O16gvQG9oK0J2eZdYd6uXqXje63wwjs6JtMrChkVwnqHHQnlHGiQTLYi/rw+dlpMN//M4xOcWsfqeKsGErAHQEZi20Ek3to3sscTF1rQha01T7jUjjs2Uw5sp54+ixsxSX9LUfZovdJ6vPkg3Hxc0X3mJ84ZvXdHDnIf8XTjz3vdTjj7QOMo0SYwjp6VKrZ23o8zqMbNs/8+z+DQo//M4xOsY6YLRv0kwAix7DRBt8acTnotstumthso1L//////1mf81ZkANrXhI+7YUDBGCYXjimEBIxAjAAGMwkR0g4wSiwQB+55bu9SRCr10vwj/nxPhmnlzzgpVVZ287P//kzn80WMx4Zhz0//M4xOYoO37bH49YAIdw7WZDQKOFFP9krXtDo6RK8tBIOuxH/VsqUf4eCPMCegMKVivIBfkCiFhcj1rOIkVlpL30fc9ragU1SAyVo3MsOdlkMIcjCqCoSIJOaGIQ0zYZZohPCl1yMDRqIUN9//M4xKQWefbGTckYAH8T12l9l85WQf1/K3h6sVeJbecpl/uU6ymq+QTcVutd3Ez6EAVZvJeglIe8bPiOqK6GvIhT9gubq6MFgwcWLYt/AzqFc3zMzM71nA4m651v7/+2TYgTsYQMBYPdvlQv//M4xKkY0q7FlnhFVc2LmjTFS/e5A4fd5ZPW6ur/JZB6vtFilQdsRM3TNIAABajsM4AUKrGT4tvtv9qW/hvXtn80JmZz9YGJsOBnapWpngJxw9ShqJA/EDEaKLC1QkatnvCzuyv+VkLzNLu4//M4xKQVEb7VvmDE2MFzhFAmyGNi5AmqacRScavubDc4OrxVeJauNq6kd7BMEPJoadMN0O5xgop1I6HZqeKluH2oO78/Tm78Q5OvX+btyFKwzlr9+en9P/q9b/5uc/nPqFzYULiwoE2CRT1H//M4xK4Wcc6sAHmLZKB9TCFJ1JvQbckGoqFvhQmBAB4VGpCRcW3JgEoYKhjvRL+Mh3RBqW7adOo+CfX30bVteg25e/9tW6ZHNrq7ym68pZP6o3dvTT/nvbtKh9h8g40SRJSSmwBgAR1PD466//M4xLMV+zbmVmsKUiuzcjbqJWq3niyqhMGpaIQ630VjO7kzveWVSBz85yoveIlT0vyH1bU3G4zVbQSkIJec2V/2bn7qzHojcIf8Wd/2c/1xcMKJKAla12mFqNRgQE2WXD4svEVvZ3606UCP//M4xLoUgvbeNmrEVsaNh59BAfvh4TT4ya/hv1B/147RHeWiM6DvVOCM8vZci69W3NY7nW101XRdCv9DalJWxPT0/////M1X4iYs0+u5YHVJRJkU25JKM10Q+Joe75D04VSO8NMH7ja6Wtdu//M4xMcVYfbBnnrEmFr1KbQVy6jPKCyiUcnrVHVkNk1siXo9Nub/0u7mViMbv8rUsyt////+6/lZPrn0CCo53qUFyJNCEhRjiTF5HAv1WA6itTjiT4Y88GIXhxcbLb3yrWcqZnz8aj+Vy3ax//M4xNAVIr7KPnpEsKQU5Z3NHMyLegrj6j40TkyQKHGIoFi1oUE4KMbJTNxESjHKhqn2f4h8oFjxMQ2v0Bxc0xVkUpaW7d7MPmEuxRS9tFIEbQD09IDyVHRAcmQj2W0UcQm7BIY5RZ7EGtPP//M4xNoUwtraPgvEGoCh2ksj6vnehx2Up1OV3VWd43/vQhSDtQi0Yu286Mi/mbP3/5P/7oTr11KPWakTzc6oNKD6EDUDyg+cJkkm4x6hGyxTq0ulrqEG4tRm4mRDfVQkU6egREFRpENdEIyI//M4xOYW0RapfovEPHGbcXQTw5Db7sXeSf0796nQBCmKJjnZnIf9dnySbruyDXzoXJ6Mg0g9CBIIi2H3////0b8S1WVWlpq6yUZ+6n1rokllUJEWDUxIlB15xgs4e+uI2KCROUCGhpFQ+9OK//M4xOkX6tq+PnmErO+bzEZKeSJrDfXE0LevJcPRJM2ueRSREEbJDjEhyX+QoRhycDhwn35Cf/ib/qPI3+yqrzlM2T///+QBx9ZpRGUGqjcH9UgS2l3orpSYO4ZUTPO2BTSdIJ7QjycdQC3T//M4xOgXycqw9H4K6GL1p/BdfyO5v7aJhBmuJLHULz6eTyNten5dt7o4gh2e8MFyJxTe9Lv3mL2EpogIb6P9TyyQ/UEIEIAAm3LJhzLkvJj9+4okoi/62lsPlncpU8KjksCQS2dW2Q2aVQkt//M4xOcZez7WNnhLbscIc+BZ/+AZlGZPPJkcc6j983uXICPJyJwbZsJzz/1shbR8slIYEAsDIMDwVA9YWYcD4+pP6RrCs0p5XGLOq7PipUGgutZEZapuQavsqzshwj8KM43NOJ9GKddHqeMa//M4xOAV6eLWNnhFTil+Wvsp5kv3FJaFB3sQkbkdJUS2YpZwcn1Stc5/qVlJBxA5Z6fNAcRIYagqUK9IBWDZqxKnn0xHKk2Kf+I3CBagXivrLHovx0SUf/yWj/LR7eGBezrdZ7bVfu+wovH8//M4xOcbaba6/sJG7CoOOgDIbhTU0fkc8yscIR0SLKFERD/OE+XNMIifzp7TZqWJqSqW6tvXogQdgRC+A02c9NrPGL5iAbAAfx9/94bXrGLeYVWKraTVgAVbEC5hjNSjHVmqIL7vZuAtXGRX//M4xNgYOVLFlnoGzoS44jcFqx9nfs/vLfRz7BqMZ7cYjMKVlXKsfsKOyVru73oSO8AjQy/v//lsbT4c9VKKQzRR4IWaGfM8I8PC3/Xrd8a9xbWpkABQf5CnfaUgQg8njYDiP92px3l5fIEc//M4xNYYUjLdtkjM3k+Rbyl5P4094U/mGczi5nM++qjIZGhViLgeW6TmUrKf10ZvZGr7ywztUBeUuKld93/6fdgQKobUwRKAkBAuVgIy4apIApUMAaDAvRcmuaEm9V9+CyCRqhGxSDUHKoWG//M4xNMW8kK5lnmGrBgNsGNiNrUVoj0uOIVC5M0ASAWCaQ2J72vWoguH++KS5xEzWt2t7yH9QikwwbrqwG52QAlyicaCEtpD9xDMWUqlVLLlcXtka6+yLr2Xsu8oZnur0t70/PN2grtqMfyQ//M4xNYUah6wFnjEvkSG7aUtoRZXx8UeqXTh09w8r6EeRLvDsVEeqS9/aqsjumz/+jej9Ep5V6Kb//Dv/Qajm1F7EaQAk3Jo0t4/KAZHxoRHm67xIp1EZ+BfSQdCjhGqQAmRIDZAZf00VoIR//M4xOMU0LK+XkmETH4k3/D5HZbBAg976wtKG3pHUjEHU7MNn8D//8PRmz9TK58vWiiXpeTZr//4n/H65N2EGPUFVAkGOSy74f2P4MrErAUSnOVFPhX0d6mGLx9Hbh0O8w1Yk2tOhju2s/YA//M4xO4Zey61nmDFhKEFMvPDTZMj/CgJMchkGCQcVbtkwrCh0Owu1xGGCA+6TkFAHYwmek+u3Uet1HUf/w1qHFTyp4Er6nLB/5x4Szl9pmC4aZ3WRoMOvrAwH22YWrTBR3sxV8OlbvhdAxjK//M4xOcXIzrCVkhHlYK5BZz5kdkRZxo0Yj1dkM+aqubpalft22sXMbSz8/d7t79vI/IjI6mL/fz1dBN3KAg4o7ZChOoh+rc1H+TMFqgL6QQqDCSJop2InlUntM2bwKWgwqfELevqXdschEEX//M4xOkX6TrCXnsG6K5CmYhnIQm9NXc1CbeuTvY+vJsp/VKXR0s9TPISiIvsp/6i/uwGdyEJuTJlUFzdzgxkMUcvqTl112KjJBdLrP/TIw3JTEXlWEVQmUZeIIegxTEBMdrJhjNdrKdNET9o//M4xOgYEr7FlsMKkq47Gdc+qaEzjxiTX9j5JqXTqTkQkms887XPnzp1Xfhf8Lz/I4RSu/q/7nTyRUOIlOJ+p19W1FpxPwzY8FY8qtv1TWRzT8gMTJpTqpReqX8ygkC2QTlOJNqpVW9yKLtb//M4xOYbaz60VniTPC2FvRY+f2kpkar6nkxVQvCacK3436kp/DnGL+HqUq3z/ZmNjKUvy/o8penu+29Sr0V3NqhvXl8rBhv/k+E7uJMXAahLZZUFiq4yKRRqpnZ3Eblb8xm27xcCcyzipui///M4xNcYyz6kAEDNPW5rNtwVKOM+M826gyVYOrPpGDhkLk1S1z7G2FUwhcxx+rZSr4qtnrQVnBE+VKKLPH3dZmTVgCb1/0Ul84HsPykTG47lxQZqwIGB6JC0/gQYHPk1As/XZDxCB640xUQQ//M4xNIVOuqs8DDE/RoWTKCMMGA+h2ebgAM4XPhJdKXDSEQ++dbcf16QuoeSZeR7kynM7Ch5kc9YMfcLPSMVqp0v9pB3qD4JhEVV1rrvBbZ3EyZsqZJFFHJgiSoJyZZAGanI0gvED2l9muoU//M4xNwUkNqZkgvMFFA9JIhcNHjZLJtT5lEHFoUhuJEXhNtLh8vtcN8mEQ0mRCcCgZSbsXJMbo3GVwRPve6DzS76VTpgVyu71/////S79syq3N8bYmdL4BnsIAUnV4DW5ynJAjGq0TzSq27t//M4xOgZ0jaldGGG7HO7Ju5kMTLtkj2poITNUsKJCmbqBdEv1dq0yw+XIUaL8LvlYeiVw4qW78LbsX/4hO/weY9uUAA7bbfePnAUNXoXQmSMU7ailyz2hsK0ekKCLoEACEMQ/OCFMa+65BTe//M4xN8ZCRqUAMPSzLuk1ZnY59xpelevZ3i++cyPRfPTluSRgBlUjEIproTRtu1FPpyH5XfoHSVEDZis90aId+oECILVV0T/zso/22ikYxIaRpUYj2PutHMdULTWO+SMujYIZVIGr3B+Oavh//M4xNkTwiK4NmBHNgd9UPpxcy0dL7mIxrNMG0Zru7Zx7MyduuSnU2jsWSlc9KXfUmxaMvMr9HLzh4ItzN1DrfEzxH/2NWpowhFvqUmHpkgA/VR5CeofGP82H2sHzHy8IyeU+Wo9a68N6+Yo//M4xOkYml66PnmEuBfe4G2opGcqp7VIby14x7GS97K//zopBO37/q6arYXKyte339L2/8j/9RA3/qc8QY7MymZbIKHbs/8LCxKKDBd6RMILdKTg+6roRub2EmJJYbpf4t7Hu55pUambXHM5//M4xOUYGsrJdnoK8mniAt8FBNvXED5lx6C6hJCHIKzr79tZu5oYQkz4d8inEzISjvRHq+qe1Oss9vbXpqjd//+//6EqaNaVug29Gt/18ICJRgkLjmVZVrLJtvdtx/pdnFnMAyVSrxIkbbaQ//M4xOMZYz7ONnpK7jVVWoLEPHWX5w6yiavNb/ps/9Ch6a1korBYlTIxSj2i7vObVZFqvWs3IkBpaii2nUOmEbIuUJFE1CAu0bdW/6+n/ikCUOVqSuHaQGNpScZmfJrBuLXwnDiy/FkC6Ohc//M4xNwZgz7GFnpLDxnkte2EoAUCN7X9LNRfa8ZNzK0TBIqMPEh0H9zMNbRfL1933rrmoNooS5DFpJWNH7izFmVOKnLv9an/lqmK02DlDYCWDcH8MZJe7LxJomrjnONWMgRwmngSMSWphhj0//M4xNUYIV8O/npG8team+DK+KHwdJSgxKvIhCkIp9P9/ZaJNaKO66VOltPf8mvu+hGuSrq5BGgQhB5Pyn//9Kg12Tg4va3GSY5NWzNx9XZBVfIp7h5ThPPMInx49wEqsrDPmnzkZufq1npP//M4xNMVwVq9VgvQFGGx9NZsFDFUHsSM0TkvcsBn6VtD+gg5tV9/d3qcutpbcJByv/RWlaBCaQSAZCGAuB4fiZRRjbUcUdGfY2DWzUJaee+ZlMJgbrrWzlesuuJwJwow4YNvnzIpVpElElhi//M4xNsValqszniNHGBBYr2/Kv1NU7Jvy3E2NotX/6j1aOTTytKzKZ6M12KQQTMK/RPO3zv+T9NhZND7PZyi5+B6RNSML9CR/gZB5VjFsQWKk7F4uiRBhNVLK6EXu1rSO/TGM+O4bpmd1dSy//M4xOQWARLKXnmWtN8OVyvwx7/Xb9F1u/foIy9P/Kit//0aJG3XZd1fV6um/V1d73bRH/jPj/LvHPQZAhkQhF7e0AAMLTj11NsllukqieAHD5IOvlVglaqYGw9WOH/F8DTFtVHa2qY1d8qe//M4xOsYay7WXnjK0855j5iiEbscpZCV6LR9tiV9Kv6p9f516/1PN039Xzrn0u/m4SFVDCCxCHELPKUmOoYEDlSQEAoUKZW45JJJI6E+qjCCMPJgntZeUSSplwj1queeXDWgnBQNlhQH2pC5//M4xOgZGz6xtHiNPdIzxKo2JCQLrtDrix1kuegxd6pRr7ObrC8VtFiIMtaOjnxrGjBQYaWcQHCAsmd3hf///q4AnfIFkpUXm/YZIpbMllsqhIsfgE230LpP6qrgjrUKbJcp0YyvGMxBUGJe//M4xOIXMz7NvECRPcxRODF6oScGeU9JqlU7r+2jf2tt2shi5FTt/09FsiL82kuVrdTPmGKPnMHa6s0eHnMyW9LdkgfVS1pGTUc1lnZEMqbUYRxtkRTRsF6WX1SK9o90DiWPB/G3TylPpt5b//M4xOQUqL7qXEiGIms+NL8IzZq+zHLJdv/+padDKKu6OcO0dU9v0YvUt+72EliLf/zCIKpRVg8crfmnEREdJW1Wk525NeA+Zb5iYk72M8PUegUZqLqc1TD5aQoYz2E4pI2UipGCzPQrU5ex//M4xPAYgybS/GGE7JimTwmMSf5fLpChOx0EHI2MELQsfwR0sQf6gqBXX3qBrE3aIQSSueW9gcegR07hZ7/kRd61uSQc31kv3VH+IjwCRRtsQRyUQOUQNEkGKQO34zdTqLOpTM2iAiQzfrnS//M4xO0Yazq6VEjLMQ4sW1cWEETr/LZ/8SlvggiVHD6Xe+XXHP0LV29jlqn3iCTGRtz/roH9H9yv0et//lVO//3BKqHtYMWOrmBLL6tbZIsa4wMwhGTKqqSXIlY3V3q8lob9q7PEjoJqkvp1//M4xOoYIYa2XHpGrGjE/cuJGUo8OwAAWCIHxcG5l1FqM5+5tRsqeUw8JRGUUYWF3fgQHuYRP4MvVxduCyz+RhiXId6qxA5hQ4t+//wP8KhpZ74lowJBcZKqvDWMyht7OUsgwC7wawC6AfYj//M4xOgX6zLKXkjFNAt7iKVbmHh5LyELC+QoHmaGufw+8SiooIAosBhorvf/OY0ORYcQOqKv399D/6m7OdCBYKc8RctD9C8BRcn////K//0UQ//5wg4ONu3i1iIfaTb7D3rcWxro+LuWxRPq//M4xOccAh6kAA4QGEDjzQUGLyh9o2ST2rZYIlkQpz3NOSHCWqFCiwVDDwz6ZYOg0DXxdgKxFtpNJkrCOOUKI7K7aOyzh86ZpapW8fUDIWtsBrJkBfxxM7oKCMFRM7AQotrjdXhMbrYHEgkW//M4xNYYs0LCVnjK0Av5RecNkkATICILSoRqaAhVQqAgmN5ErcIwMW1jzkOS/vbLXP2SkVP025hNH9X0oebSBaJQU7dbLJ7QzrhfBy6XggwP6DecU2PFwfIVr6tUORlYDYb2o3hRhgMgs5GU//M4xNIU2PLefnmGcFVQOCV0Kys1CHBEigRBF3po6L7O2xwIz3rPq/8jdW6elpkl+7aH5x6kCP/UtWiyp//5nDsDIf+wS8bEWhi1qPm97yQ3QMhHxQuDGsGZifcrkRYOJfkWOztda03DBWfH//M4xN0UgJKtjJPQMJS9FYo5MnOq48NXv489BdJ8IkBOCbAqXLDb5Ny3tnVihE3/3iQUCceBA1Xh2U///PySn8UVM9NJK67pb9xMSUMFsVhDDY4Lza4nUdMRc2vfA9zUBugUBjq2pMLFIBA2//M4xOoZ6vq+XoPEVTNmFmn3pupD8TLHUgICoSFST4WHBAE5c/kA+XN2QjPyhxZd5OCAfSXEBxb+f/Ti28/hFIDLKhI1DX7lY/okAauMwh0FbCawHsTB82RAQAKw0JDxc422Jx7iYhzbhZji//M4xOEWOLqgKg4eFDvh0g0GgNyjCAnsaeMUh4enlNXpvb7T+CEgoODxiCUY9RX5Ue5qFiGEkxYdwmpodTh8nSSMFiR2ng4+CiB9xAKWnmlQKpTP6zuvtSkjgAAb+icIM9G54WC7iuQgqQ2h//M4xOcXiSLFvgsGFEgAlVwjAigEEoSu8Vzg+3JG5EGa0pVNrdc8yFKZUOSwOnjIjxRmkOkW+LJHlVnKA0tHTa6dND2cSK//if1RMIHj1a3HLrtbApLB9TZYalhVlD7FjTyB6F1bLddDftdb//M4xOcdeja1FnoM/KP5GNQSp97We7jf69+w3Ijb//wf//+spXPhZlJAWfobgvgXm96XXsf+hBoEWqMcJHUPnH3RwDC3tuIInI5EK87GnBBjwU+2el7KAU3Q7neLZyBHVidCuasSGRx6mWiy//M4xNAU0Oq+XmGGqAdWKwbhvhGStThPwjJG5tQ9VlzTC/2yBdvLgjSyjCEeCoqKlm4rIos1EmckXPkr2lSxIvNdh8HqrT97Gr9pteEb/yTFXCePY3b2H1okPjh6BthdGKEQZMqFUS42ixQw//M4xNsVewLqXkhLd2mCFRHMqkrV2ta+21sQpj42vg310ZFZyek0J1vVJCauuB3fjlNJOM/9RCLLKZw2Qn0Gnp0//L52ohyCRjjAo16LiyBrlNURcBEvJJImPU/6nMPfllUgXqdURCRowFWe//M4xOQjCz65vDDSmR5Wk42JnSGLVvHBlywIGS1qoYkRlObdkdSyrIXOiXWa1sqc7ehfRFZtLJ6PRLOYGzQqAzPMLTqLQMSnkqU89TfltixuzkSDk/Q2dY6+Ra4TVbLZrrdbHJJB+5GPhr67//M4xLYUuWLSXHpGTBV+5C0Xni4uvyuzPQ6vnHev6uXlkROeBmsvnubnoHExNQDP4YMlxAzSlIWeoAHGdC3vSUnyjvZy6yBRySAsXPxzhODiSZMDqj0lJHIHUxFdKTVFBUNF0kH5ksLWmcz8//M4xMIVCWbOfmGEXLQ4+rF/3RO5SzjOxEM3RxEOxIGOKOHZP2RMZTymo6sJGzGiLMp7orGQ+itVGsqG6r91Ncz1bbOTzKYVqnto5niFMlij6mqQG82awP8VF3BjgzBskOV6vZqTkoOBjbkU//M4xMwVSUb+XjBG5izgn1qZjFvMeJuO6L+qlCnzTVeZD8IQ0O5swH2fACUwwKAEZjGbj19kea/KQcnL6/9pRc3/z9rYNmVTX/+c/i5ubqRTcXdxtjWZBwB6P1iMlEOXhNir1jl3FmLFsnAy//M4xNUW0uLFsCjKudeSygE3O5RJdrMsOQcRvFMBkLmSEWKIdi49Qs1PnmUvndg7BoTiM8b7e1lcvr9L54NVmaf//6zjPxC8zWRQApuS+wabF2zhwSXaAiTMIIrk8lVOc/ksre7JZB6B0Cwo//M4xNgWslLGTHhFVKJBg+GbRjgKkSpY2JSgoK0mO8kUIDnMHO02OHgUXZ0HL+XdEsk5EzfiX4rkxRyRezBGvttHzkHedSq2eh8r6TGQQduVy8EfaICrJxv4RRzAJL4gk0NR1QSSfACEwCAu//M4xNwWaSrmVmvGPkAh/fZwArXZ6Fs96MZER3djOjMy8lMy0IfRvsikYQ4Oygn7P/qv/+NrwtP9B6Hjlz/lsSBKiPim0Rx3OD/Qd/xgoD7J0kAJAsTmpCeFizBPlQ1kot3LCStqfJyM/pd4//M4xOEUOK7WHgsMCKlymqzB246P9C0cPLz7KNmXr8OE9xAOgIlAsSuEuzTODCzssTYtkx6j/h38ieDz9/kgqdpCqT3xtD/IUca0IMZC19iLsS9xRQHQuL/SLtkGggVrNAQbwOuYhINGHzBD//M4xO8Zct7KNnmE0BRKJfouNaqE1czp1SilMaiS3dn3VWo7Xzq6tc1HY/zKM3VGR9P/v///jcwl/HFkdQTG1WBgICUcl7YxXYgqVu8NgN8gppDkCVqOIOYY62TNGJzy72yxxbk0OlnPxG5s//M4xOgXYV7GPnmG1KJPOTLb3on9bm+QJmnHtOte2dAhNbgMUPJW6WHhJjs0QqWJY5oJU4g/xP5OQZxWitUmQYINhWS+0Y4oRDhmxGha7bJ6ErV8KpRCx5o++6Rb9zpx5OXMnIPdsTTdiBCU//M4xOkXSvaxdnjKzNOEPuWTX4Bx8Gps+k4KPOhE0wRqAJ8gTvFefLpPRqFl11MGC+MEBN5MWclCafo6EqN+poIqQCGqoP/VcOfO70oc0qloGRgyJQuKRp7ADqbcBTN+/l9j2tP/m183ald8//M4xOoXsVqyPnmEuOWZCm58zTk5YI6edlogjJSImA302d5ghSIQcCkPYVhlDrWDuDkXK2iEI9euAOFikC1cd3TImMqU0F6mJxHtR+y9evM15LP31hmrYYWOr4O5fjEnDlF5455wtfYoUAf///M4xOoYGTK9fgvMFP03vVID6h105Ht8lg/kPJfSQiDCrRFxHlw9Ek473RW6KUu/IZYapcWaGHEzmjyOn3r6ysfmyPZokPZouXMNyusofnkO3w4/2tnV78cu7NOK3wuCkGgjnSGLAjBAkCUH//M4xOgjkj6xVMPYvCWiZGQSYSyiIQ7mhbUOmkayl//PdRxIVAmM657/2DIPbBKB0QiCQUAYAw4U3NBZRkuYmrHbWTfLjKHOtkIV+dtB3Wy3hE6f1KWtG3N1Vis2Z1ayTGdE5WmpfUK1SlLm//M4xLgdAlbltlhZDjItDW////6f84IPia711aC3I5/7dwzNNIVBRf5ECkqwcVsaJVVumKX+qxxMhSMNPmwmJtnAjj8QQfXEt6y5n6qWurf/G5J/+hfMvhJ8NuGsOYciUiNSISf/+r1BiVKZ//M4xKMUiubI7lmEWnrDSgEjq7hAGYfWwzJqzRVT5FHaquXrVyyre972d0z7ZCpftvwlUFSX4Zl5X6hT0hfThRX8z0/QkGNFkkc7dClABnOLwqiFISIZu/5f39Cjv/n5cKvNIkqEOm3UMX2C//M4xK8UmkbVtgmGGmbUYrPNQkdNHKIAFRWKzYgDBAYUygWTZpBuH9DCB8Cgd8IAhZZ5qdXxzDwl1Wszf8c+0zzPx2nw9+7Dm6Tf/ebpLRS888pWMFCKF1lDjxw1Pop7qTTQYGQH0cVWcX2J//M4xLscI0a2NljTPP+lEL2H2f9tqXNYZE6BPJyxdNJjUl0TukxOrm6m05lSjlLerHCZmNgjNiXXIwGl4cIR9DSfkOUB3n8rTyMketGlsEYE3FOShIB3nm4Vt9sm+tIExOGwe4g4RjwP5+T0//M4xKklm0a+JkJfyMEhMKCJERrKrZcYXuum8y2UYKUC3S9DKDMtF3Zplk8oOitWJQ0JQEUEQiRufDdkOCixKcln+75buDfDQBDRwYqGRtwEz+uHsNnnY5L0PmPCerw6AwCWriGEI1hCIhQ1//M4xHEUWKLOVBMMDHxrn6d/5HpJCJwbujm/xLrrpXRnRoRmWhy9Mn5pIKZYecxYSpZ1HhjRKxVH/4Tub5AJVY8i5ZY423JB8/K8dpRP2PDA91mUKs0i+i5JZbiP3sGGoPNajlQjRkZd3+11//M4xH4USda5DHjE1HeKR4ueAaTODbmO59dO9r0zSbE1kym3SpSh+shnHF1TYTIEf//k5cI/FAsqDABjYSBR/qEBIDyI80I4ubbNGYR+PnOsitYaHAoVY+1GIpdGMljVPVrvcPIBAQpFXyq+//M4xIsVyXLuXnjO5v3T9ERcoU4i04r3OMsWBUgc6FQWKnYi//6rUAtnkrZUHlUAIbxg/+3DBgQoxrtkDDM7/KRC2QpY9kvBfxztdtyt3N3WCsVavqbVvDmctbZVVmbv38stKPqv+huhg2Nc//M4xJIVKYK5tHjEzM7WeVbxZasTjzf////x1av/8Gesy0mlBW21UlZ85agqS8sB/nwRUuSwCyxykN6ZO7WYfPmKeEYNSS5GBNbYtl0PFM9iB2LPA6SltBEAmwP7azQoNUcLqVZXLpCBQhWD//M4xJwU4xKphMmEke/xBIf5d6kE4sRVKr4sfy5S41wXaYu33UNU1KbkZP8YBlkFgJYAASITI2Bhbt00eOamVewl+p7XpuMG7jJifiXf9QHpWKzSqRgVt2tNtYUKitrKJ2GGPuSgpF4UFDpR//M4xKcUkP65FHmEWG8QRapuGqeEZ0gj8nv9Zftjo997BeGI3u1JnSNGj80kJtgipcbu2tsavz04QURBGD/ZFF3wWLcjsuSzyaiThnw8TZmeBYAJHEA0QALApr8CY1VnYCdJS03//lspXb/l//M4xLMduz68TDBSvUdSqyq391CtkVOkKBFMdX2Fg1CpUBUONSSWSNpOwf+QThQp1SnKWFVPoy6MUutWRj1ydj4uJ0p+a75+tKbu3t3vSraoL6NDiib9b1XdZXR6Ink8n6/J/zf7p+/+iP+3//M4xJsUalb6XEBFLv9KEBW/wUPEhSlUgqmhUlqiptKbCR3AnadAWAa06P2E5hQiy0OLT1h2lutrwHhVyhIJfyP51RNSgYPh8JGEBCBoHIUpp7a1ghB/9O7B49XjOyoPLC762qBAggfmlzRF//M4xKgVKrruXnrKnvUAAR260phWFRUywIwyjyJELxRJxRDLIRe7ITtU+6ZepqmMb5Nnp/b3kMZPKdT7f29/26LO+dxBzhzh30WQiEZIQRS+oGc+3PkO9w54A+rMv++CP3gARy5quWWRtpaP//M4xLIU2OrSfgsGGIBVWwQRWo9WngLoykCIvpGUUSzqz+Skfn9zJhXWWDOdz8gv/35///8qTyi+1v/35n8tJVUz3jvDNRhOJhqfsgemWgnTxJDaTl27NRo8/ZL+zN2eH+leKQ7BeC4w+3Sl//M4xL0VusLKXAJEEYqbuhyDGHrKPs8rD286hHTxscmknB7KJ6/uXqCdktdL21zor0aS+j5KuOcpNfBX4nmU/RQ0MKqJgIqf/dw7qWNCT441JI5GkBI/fPX2iUu2MQ3dfuQxqswxkLZHmamB//M4xMUVczrlvBhNO0bMqFKIWbY6HafVZI1VKxsblErLc61Yxm+N80imcTkOQ9U9dktAxWxjl+DlM5hB2yszfBAWI6ykCFRGaC7H6s1UPWBBYXk/8q7+VPHf/5a09WEScEH+V4MByxAThcrc//M4xM4UgY7aekGEfK5kiV+JAYvr1h2emMRUIgjFo4MzXtPFjSpIHY6sXsSldAh2uCI+u4Jy4upTZUOgECgq5QiR8rvyEkGmkbLf+unabEQTALw/8YKLb3aWVg0rkyGq8LFr1udkwQRNrSyI//M4xNsbaU7OXMPM0N0gsocuWN+abOT1NmW1FvsbSVNKPWXRHmOZEV9v0VU1Rquj/9DUe9FgzI+yvvZP/n/7tjf0XGqiChFSRqJ8fOD3AcnLt5JCGYlYyngQznHGD9NY7FZXFWOfVIaXtZ+z//M4xMwUOQLA7HsEeO8a1MVDrSphLhJqLLqKV3pSPyfn3cqdM5uXu/SQ22dwgjv60/JfWA+fglF+7bbJVvxF/yHDiIVIUk6LV3FBERcRQqiviK4ekUbixgo1ddTqsPVcWMSd89RCquxovVH6//M4xNoUot6w6sGEsJ0KxuRx3nxMDXE9tAMilOVSk8vBY18pt27dWq4ySCxiAgr3//pod7q1bJs//RP9ERIwVPov/4dvYMqmVq5G1/mMLAGua2BGzggGypocedtABJZYKM2vXmYLOjH1zcSm//M4xOYW+jq9vnjFMPWN0JQJNvbLOCJ0In1amCkRNCBuxKBiUNUdSe4qYqhUuucyPljvljtLoirer68WKxVbxRxm03KUTE5HkuF1uRCk20GgABhOSLAzikUjLNKCfSSiRFUzpS16b6w2bGoY//M4xOkZGyK5nniNXAU4cEZeZflVaO0kQ3sqf9L/67Nv+x5/Cp8viTcv5/qbHypF//+VIP4adwMTWCdqnKPhahArTDPghAVYoPM3j9Dokcp9xgoX1RAnQMZJO7B6LQDCvAXABd1B4TgekgIZ//M4xOMVAPLVnAsMEmUlM6TG+hefTqJt3KnNCM86N7bOZFbb5l73Qw2UKB1YU5/N98joIazUWPvZapKnglVGRn53NJGUM5w3lcsK5DDfDkQ8mBhgLakZjwDjA0Q6yFoWHYVqlIN1M+dk++ys//M4xO4YopacKnmGsH5WXODBEqAYW33IbHGtKJpORc3+MQzPRyhq5T2So4DhwwJ5UIIE1SRRDj9Jjy0NoYqXhaepv7bBGswuswuKBsn0gi1BKM2IfkiNltRvwz62ck3Rd93LuGKJVH+//clG//M4xOoXGgag0nsGMD00UtfQ/Dhyp0W9rRsQ0epHCTieDGVykSLzPM98Y2NZMlIcAIGx0+pbOJqSqfl2ed7XZ660KlUFgUcPBdHepnsYSbSNbPyFn9/iWJNKdiwB/w1VbeQCgNQOOCkLoXnG//M4xOwhaiq+PnsS3E9DtlUxonZE2vE51prGK4Uwxbzgh8oR4IVyiSOAJSBlrhyI3yNTtpSJ9/KU9l44R3jKQfT0SRd+J0pa8u5X9XWPNwmceM8AtP/oQFAO0WUnh8XI1H+Woi1ytKMVLjKC//M4xMUWSVbqNnpK7kjKjeGpnwgwAC/ZGWampa5Es6pNrDIKCO4UliPjOQzxJEhM5EZlZf69G1a1dRByMKapa7EzVT/volXv0tXrrbK3V36nJ/8g7qCuhC5b4E4HXIrFAOp+3qMTGPBIAlti//M4xMoVgWLKPgvGGBRw7IFz30x8lJntT3utf0VSXQjr/pLZymmUpKeV1tT/penV6icqsdG6o71RnIWTLbJU/PfXIT+in878jH+6uwQkIYUCnPrEiSVB6KBYVNIkV/ItJsoPtzZR3BbfacMv//M4xNMXgx6+NnjK0Xzq+0U73SUqqdNmZGvvrT1197c/r//7N+zkYtFIYKZ2NLOnyow3Ng05V8GQujRwUbUOy6iA8lS8mIITdpNqRok81GEmZpMSTfYYPtMoLs9tSoWUdZipjXVhODzRUGUH//M4xNQV8yq0THjEreDAMMEsDmRGlCE5YGKAP6gkJsTZJlP3KEIAQLHT2+uD3j+fgi/75f//8/7l7zN/yriTBO9Ctmsi1RDs8M8hShRA61KS+UOXocSbura/3dp/QEegYIcQiOXCUrYcIOjk//M4xNsbWz7KXkiTHR+6hQyFMirliL+VLdZRURbqq5pms6QUWtbh8iy15l48vuOiy+9pt9SdaOlJ5UFGC8tuKvAhaSYV06EOUVkQ0SpuONxx300HZ0jqKSMhgMYiesoWrWCsPPQVHeM3WyJJ//M4xMwWIzbnHhhHcZ2OTZWM+vr/+/7WYp0D/8tvEO4WZO2Ycq+FA5m8vpng3RA+Uh8LPIr//9u06iyBcQ63qb72qPZb1Vcim3UhCkYWFmt5Mo0IR8hx/3fgByJy4+8PwxF8s6oqdlmV5C6Q//M4xNIU4O7GVEPQYGLMh6K57Ll9GO6bXT06ZtFYwEOLkolXRbZOXzSc3FEmjpsAnf568ukd/d/JuRg1+8njBRF2wKwIFLbNSxlXzqMucZ3VQ007ZjkZosaT3CglW96iVarl7ZQbhBjXkCkA//M4xN0V+kbeVDDFppQ1jW0Rs9FYjrdq11dLFMmiFZ6zP7eZCvFbXYZCf6k/wdQQqCSV9wQqR9QpIQgeJSguQHJrjn9VRur9EA1YMkELwI8rQNcmN5YZB2WM7LuakXrqPi0rnF9PSMQZI2hG//M4xOQUsWbCVA4EFHCv61LJTBw7UYtGZJxdA01T8jT/7cu650sklE+nV20KqOlegqS1kYBE9TwIwgrBQmYfqIbClURQElK6pCTB86D4QMmDAEZRSrJmeW8nvJ8rmD3BHLv+fSYq9wzmXwp8//M4xPAY+r6kSMDE8O39tEGiFEKGWgkFhwJ6HRIpwEZimATQYs6uov/JK/rLc5kVmEhlUKvU67nCoUMVGb73CBKNTvT+89SqDVakttiT/ATo2s87itR5Ni6k2rmVDJtNbJr2d0wYKYdF/hhz//M4xOsYmlK2VHjLDAReoP6RI+lX+T4/kX6eTqXCrOfTk6/55dueSavHDMCeCwdNEi6JuqllX1N4r8fVhFBs/3ZAVtGcSEYOOJVIDXHrL0ny86xol80RyNu0UD7vYfPco/KcmGJdmj64OpbM//M4xOcYydq+XnjS2G1v99JtzyLaQU7u5f1ZalZg99OXVX9lYz1JUYzuvE0f+4YW60FN+2pgLBf5W+rIZ//8fXjqZNRstsbSUkH3RuPO32axBHhGCRueebjgTc3RwiX1JMj99dskS+QAzlE7//M4xOIUiebmXAPGGtKLdeAIh+dDerfx1uYarBgD2yRVKunQWz1RVOrqyHb5erorXKdP//d/6MgG6Dn/RcGRe3////qI6bOrIEJzdcIlWD+inDmg2qKkrXhsHIU1Ig0i4nocTEWKnYGv91W8//M4xO4ZO0LCXnoE1M5WFL5jF9F7PtmCJEql1Vq/RMhjRhWZfbnL85aPFQokbIHxSmQxoWIdr6ZLryDIPv5Vb4djFTZbEiAqxM2HECKlMTjKjTTyqTlb8C7J35+hk9Fa8yPrUinMzKWi1qFM//M4xOgZOxLeXnmFD0R3d/7dG6GqlabNavI1V7Mrcz7JK1GIXC125bBjIZDJsFDBHJjNojbQQmjRw9t1CCgkLtzSFGNzQQuOJIGITbhRG2nMnJ0e+N7DIMKErXW/IPH5VLdzVPPNThtHoxCp//M4xOIWUdK+VnmKyI/cWabpfU/6dI0Ln5b9M9DckOoff4czzgAUSuMHA2JN73pfss/LgV6Ky/OoXbCBQgZpAJ4oldzyWes5UsJkN3I2MIyN20tl2o/2QEIqaQFxKIUP9qoWkOKnB+pdg09j//M4xOcdKzq8fmCS/Kk8q4NwSTgJrzmp3dLGQAoMVeCkTB4JftrFuJuW9TTM1ZzKNVwsNbjgsrpEckPMLRdkP+xp/+/d8dodovHidhWlBYhEmwRCBcIj3togoTYf/1MQtth8kHR1/frGG3aq//M4xNEegz7BtDDS/T/55TsiAg/VUoNkeXh80mXcP6+hKymJWLyQvhrnIu2S5dsO1D1LiZdvIhpGV6fG+pT1Iou1/w39zQw+Y4Im8ucWZbSDgFNoIG3WriPquSeeD+YVUFcKu9FiTuK58CdG//M4xLYXiRbOfg4MFJSqhIglsughR8X9T3GvVturjSCRsLDXMRdR57Kp5Qxzj3yruRngCgZmL9yp0/+u+dM/LY2W1Okeljr0oreuv/m/qhlCgiI2GvX8Ib66l79qfDDKBgStsURKFj/J4DI///M4xLYWCS7bHnjE7JqPJ46Sic81aeaiskofq2XtYces+quG1+2vj5O88ItPqG2AeWkX/vMP6jgl+UqT/81/8jPR48FlasASRnp9u95nvd3Hu7aTSe/Mzwk4DJxBAg+Ftjl21tkk6zXFwagB//M4xLwUIgrKVHjE2IfzZI4VXV5SRFSqJNj1Wovhq5UikWnaXNpV2EluiOnDOXqmelqa5KbPp/mP//yWc3//2/+zKpU5c/L6VLqFI0a5wOwIHMEjCq0pbdbY46E9A/OW0XnIAFJOdS+0rTYI//M4xMoXqz7KXFhNdamgeGWEJsdE393NktskIPMNCLQo51jwz//S6fdiKWLtEPZQI5kfZ2VPKlGdqxIFXJdrJMb/yWtxNw1dY1NLlnlvrq4GOvwQBhV3EDB2N8O0A8OIgjhHIo+Ofkj4a7F8//M4xMoU2zr2XECHPyl9qhMTQg8eYEjxx+JZ6wcRFkHygv2niGtv2YE6cj8hh1n/6n6nuY607N7JZG3B/qWGzUX5dS4peIGaP2qOXa4vHm+vDLZRMrQ/AzxlB/gYQdQrhI0CMaK7o3QxoRGR//M4xNUUaY7iXDGGlrq4qsi2WT69fgsLf/z6pCzHBOdz46F+EdsT9g8k1/jGUUrvsSNMXS5OQPbBA9MSEYGwBE2VCyYBM12Tgsma9ST0JgGiV8c2h+A4YOrvUIzwDbPIe3RXysfL/8pKZbnv//M4xOISsOrTHhvGhKnduUhAAQC4BEHTPWxN8//7v7tPexm5Hd+z377RJ9k+HlvMRAUWB3i8eD7ifoLafHndkkrBAABOrqC6Hl4HoTAApixdwzPIMhSubwWYV46jRce6GpRcHGPzdVAx/QdP//M4xPYaAbbiXnpHIveG9QRDMs35YX6n5ENQzBpVUeV6UrXMTFnaxH6GUf9hYTK0jihM7fbqubO/brz+Umk/jk3xyq9Z06vCpQSnD9+v//qC4f9Yfo2mW5bsxd4tau4YQ8eG8XfnM3x5qp15//M4xO0YmdbCXmDM7Cuv919NnMd1cEF0EhF4gP3cBQN6UYrt5i4iKlBmUrCPb6V7odjGn55nmL6spCp19HNOR5q37ExEyHLv///oZxc3oNzDDBqGRMWjYZjTnvi8Rh3NkslaYjihl4nL0hEE//M4xOkcsibGVnjY0CtdSUp4OZbsoBQOue6IzzQzHLa0XtKLcn6XM0gcGJzVVlIyO/W6vWRTrK7ui6OzdXT7t/959Tt7iCkIp3T///p/93WZXMhL8nsPPWhJJzWZqpliTD/DMuBggkEZoiCI//M4xNUaQzbuVnlU/jpgARqX/GGjiVHOmbLhc3PauMh06Z3FRg1ViAySuvEjHdpQxHcz2eqoVG/ZdLKzIKEgZGaqLrvnXrX/+9r6SAIsWcHd/rpb1o1LaXLqUhEISFh4YGE6P7fooqja/xAT//M4xMsV6zbefmDEkSD7IYj1SCtg3FMS01I2LRHW/aqLDWYl6ri24rkKToYEPq4oCY2lWMyzXuSZPpKiJWXJKDG6VR6X/+6JFP6OMQYwBI//uI0zUAsZSXBCQRUFv0iF/8sYwwNNZn7YhgHc//M4xNIYGk7fHnsEXBOmTAgNiiRusvKwWufqqzMp0y+Wbo4qsNFXPqIbLAbqzf9GrZRhRjOZG22Wtk63/93SRDGqql2re30/2r0ahEIucIx/z850RAMWCrBgYseqBkvv9SYhMfbRho+XwzXq//M4xNAYGkbPHnrEsDstfMZ1M/MzSiJTmcrc9zOZZasUgemXCR5qt2/5jOoqKCB+rbZbdF6N+bpmWvzG/qimzfKn9cyscqlSQ5RGUKHCbq7xExyuHZlHDIVF1aYaTJyBNqYugDp+bswVAJy4//M4xM4Xyz648njE1SSTxZvPTOpgXHnyXUJNFOj0uet52Qmc4YUaZ4YfQ/nRupvpNd9OzUX2+/01N6P6/5+5lt9v//0byUJN5TN9BhAoroVCtwrDIqZNNHsew7ZsXoW9Of1O4OdXo4ygm6qZ//M4xM0WgzrBEAMKFRkcYTnPS8l1v5qiV/izPGp+OSVD11Yz+nkOT9u3qV1zXf3/n/++vdlKyKpUfNSZV9v0GUVxARnh31kjjg/mizxOxddgkPFLzahmACFMN+xQeGY9U9E1z0MWdP87M43Z//M4xNIUwzrGfGIEyPaLDDhURH5+l+nf9Mh4GQsEUPXSuxDD4nInHr66vutShdyJg3uyiJvr2a7Z2pARA8gqQgPlFgI/vmeLEuhjIzJydPGnOjEsogNMsZIwbwxVOphbC9N9mpGMYJzjc6hV//M4xN4U6z61uAsKFM92xWRyPG0yh5xx3zdCv6LnTfPO56IQUhxoLCpAMvXJyoWyWrJlpdB1vKQ+0/Zdu30v9LNZqgjEQ97LN7dx5gBgEnmFgACEKVsBsYMkSJ7cSxqNoVD4Ziyuww1TcYSg//M4xOkXCQLKfjYYhGoVVEqWGXh+vsZZ5nVnRutw9wH/p1CgOf1DKxzABzXMMf4GDzxcycmETw9Yz/W9rLaaK6IUhqic1klkllHtX4KMQFCi/VhIe7OyH4SLpIpthMUcQIGo0K319Ky4xcmz//M4xOsYoWq1lHpHCAgXQfMzmWZmiobKIdCMGZoakGBmggwLJxdYiPFX6XUKMhoigLguwcEwTGgq8kzOf7VN7s+4oboEHWRBz9ZZ2yp1COW9wp3ddZw4HlcNxBS95+Um5Q0yzbqK5cCIZZcB//M4xOcXgdbaXlJGPL53prOBcpIpK3Dj9LN+N/JPqhbBe30rciMtk2/y5UQ0DP0IS0IEI/o3Pt5U1Zv5t9VgUSFJkljYlg7zX5LCl6JNlG4MZcn7A/YajSbx1DI/qLvPB6CaGDUAIDgjt8xz//M4xOgYIWLmXnmGkie4l4KsZczYnqecx+GZKSOJv5rmv2p7/uqiJpKlZQy/xwo77hKaF660/+ikWZCEzDQBAosyKwo/qEz5LB04oSPW7+JBMkRDilZLESdhj5km8gbezuzzcRkVHep5I35C//M4xOYWClKo9MDE9AkX95WUSEqtPnMvr2/AQeQ3OOiJiANXR7IhDqJdi4EZuQnPdjyNqhx23351MmRSP5v/5boCFjYeTOf+oAuijPD+QrBU7YUQuqkqUet/cgBN8buwEoCJxRrL+JuP2b59//M4xOwcql66ftIK/C7yNeNHZUOujGZDDmQCjvW+HkTvIk805G0rnmZ2cxFc5zmZKAIIhLTZ3TYrbeSQTKd7ZP/ZOh9zMJWq6vM///9/WrF5Nzla6aPEnUvWW/cTRnEJKMCgRhsLrB4WOOXI//M4xNgXqiq+Xg4EHAZiUaaSsH+oCdBNCrbHrgzG6w2nUqsMo/Y9L9IluiS5qqbWlnye/k4lZEMKHU9EWnSa7MokvR38ykdNGVbb0M21UohimdEr9P9VoYrnKVmZpv/r63s/LiQYinQWJbCi//M4xNgd40bFlnlTWscK2XjBUUWEuHugEjrUMiUKCt51ZaZgeTPIZ+iB5iY7ykPJJOD5qb1GhksLJCQjPWkpdLVGM2wcQ2z7b/t+6sehasxGZrrUn1dlf7Z7yrsiPtnk97ZFmQ9fT//VW/9m//M4xL8Zoy7BvnmE0RkuJVq6V0gFUfDDo/Dh/K1jsWs3FMEIazXl+QWw58Hzh+mWfefrjht38REc8XXyR9Cr5OcIoVDhEghPp5830LMv0cDenQ4GxfAAAJxd9zQGBmRuiJ7xL7u7nuM//37f//M4xLcWMzqplGDE9MAEEiU9XhE+XmACRCQIiACuGLPkBIKwNtOpKi/m5JHEqo/ulCEhhQ43DU7MSsWS+/ZhhEzw8jsz0utGaL5B+e3sbiD0yHvVTqxkN0reG0Cs9QW0gpd9ubbkkozGFyYN//M4xL0eG0K+XljTXKI6szNgTc3mjAhCoHgcIXmm3YJShtGURxWFDDcElcrIXfrHEOLap4RnDyhpgV1FF//GO5bMpxkk5NuNbWzZgrcdslJbF600lptSQAo/jygVC59Bq+rrySE4tEiBgGgB//M4xKMiOzrdvFjS1xJkHHuuxosIQT0X1ztNKvup9ptkz3oZ9FkaVhTm0Rv1L9DFmOx1BiQYk6Ir2CW1BLZ7Tt3+R8RBokSefrUkcWgAZ/9ep5gsLOMmDCzu02pSnu70WryqqMgS4VWi+5GU//M4xHkVOgLOXEjEmB9qONLu0yBszEq1MTs566+Z8mkhjrkA2BcYKGyARBHET4pkGpQjvziLKkd59H19JP7NeZiTvQW1vbLes3Xyxsu3/98XVQDCQdAUH/9TMEjmzPl2Sx9m1Xou6G61/lG5//M4xIMaKgLGVNJFDN403hpwaP8Ksw39uGgftlWgZENHqHxwjU/RJr9Q1G5wW+LEqXWyX69/18jEWc5BQ7yhkxxdkm9tjUP+RCBs4xYbCIhBg/QafgE4BUEORNqoy8aosjIVz9jMdgZhybmh//M4xHkYwerCJnrFKCJLvZRmKDRlxCCgneuohGhO3jQ6KdA8Ax/eu5hz3iRl6lb5pVKrLMvSif/cyWrUoscLf4odEjgnv+5JX7ffwIHFlXdupuRpyD/DO8HMIBrysJvicjwrQ7UlolE28fAg//M4xHUVoerW/mpK5D7c8VM/UkAFTQTy1YBuu9BF/F//N/vBZg3ETjlJITfvqm2i4TulTflgAxQWR/LfIVkHdTcgcNVSiKjaTkGUsIXcec3ZIh7NoiNFwW5ON5XuG9b7UdVH3XS0vtXgCXqw//M4xH0UuUbqPnnGynpFuIPmjBcoBKFIuWlBCiKh0USIVVHf9G/iz1BnNgveHP/56tXqeKSNuCmqkalkUvFq7b0QFSC8g01ZSAJIiOY9D3DUltWcMYCGSfBB/tFPwbrLA6dQ4jJjHFYs5z1M//M4xIkUqPbiXgvKHkKKzQcCa2Wvm0ffaxK5Yi0SjGiZN5H685SE/5WHlYQW4pE5G05RjFaN5L0b/uGihajxbz/WiwrBls2ojyEmsWSRL77bTemXG2Xqlf++ERGAT6RhhUO3kQsQ2RmE23YY//M4xJUU0LrOXnmEwNTrH6+pM8ZoDS6baf0Xu8PsnyD/EgioN0kjFh69mxNBevaR27GaOQT4G3OZF4V4RGRqennv7uvqjUWiNrzos09siMaI2zAgIgh2CxAQYoBnrNRBwGA6hAxFBnts/8NB//M4xKAU+RreXnpGrgz+M/ghnu7Ifw9RBBo/dO7as/iJtk4jx9eQMD556iH8N5wHjoxKNFhU9Jx5bNGNLMi9W7LLT+yPmZHwnjO8mTFmiowDozEX/eO77WLhNUlnBYSGLZQGpFKtw2POUkuL//M4xKsaUv60AHiM3Xz6rNt2yf/5p2l9bvjP+7Vj90EWNpzms4lteZzkscpzVFqqCneHh3d/9raAHZaWMhKBPrSSmJNcDDslWc9DXE5EHpDem0zlJL77j7rf1v714lfqIKi7koWcMAZ5NUe3//M4xKAY0zrEyjhM3N3/4z/79dsqb3n5zHXo7atP0FRQnQIAGXF2s3ibRnsAnhxPoNBXCYo1VUfMtXcWK32ofU4XYRlqUv1VqrilIaA0wARuafaaFHNMEUNgAIpXlLwjS6JODo6Dh8H4gMAY//M4xJsUKW8nHgYMFoCBL60HIAmR4ABMPFmCoAIIkhEJX1g05a+uzhpDOdio5qZEEXYpdKpeSjpuydKPMVtHKwsapTFQzvUspV/9H/Rir+zcYZClM6FekRRSqy/9v/Uc/lOXQ+MH+M/Ar4g4//M4xKkTcVrKQAPGFPWCgV2O0wXmKwqhL/AXJ2DvY4lnhFFwkRUCMWkLDdyuEMkc4yvmHwRVOalI5lgsqArOFm/n9RZrnszPnp9DA0f+nVkqK5NDAGIjDxdD+6z8Knr/2Mm1BCF5JCc+6PwG//M4xLoXA0LKVmpKMFLkbT+AEcvZ6zixKZQZCxmXYC1tJSzTbInAbMquJFxYH1HVCzhw1LjjDM4pShO4Xcb/KZcv0OKGVD1QMHDwRdFd7/9HfVqcVRW7H9Ibo/lJmBPH3Bc0MSLg6QAQUemH//M4xL0VIYK+VHrGbDgsTEoPiCEZsZOq1AjM3KLvqUitDpso2SCWDBxiGBVTRoahkHbfrpsCunTbrIH0XrNqSbHdvKJ6qScUhdWPWuSRNIxUTzZ6VSSUySdARK6mj0tb7yPmsnqKSYyQdczI//M4xMcUMMKxlHmGpIRFuuLHW/hHtmTpDoPctWZMdmTZ6P1eb209tmem7S9rpTRu/asKp+dewVQ0j/UV/7ja1XgFvpAFQTrg7GUQ3dJINvRlnC+rgwsy90NEWITxo2p5tBo49GEUsMc/8jcq//M4xNUU0RK1FnmGcCjXm1Hqar5Z2nDVUDV+6utqK05S/7ElQpmaGS9G7+iKbvRimoc1UOyNLrf//pd/920dnxkQWEyKcrSjkn3Juj+lRNg6SmcCiPmzjOooo0BilJNbo5u1R24+z6udSVN///M4xOAVEkq1vmDE8GJMjQoqDIneikkus4KjRUOCQMEu+howmjNJbYL0Nc1R5f2J3bFpQhHZwPUjvYA5+lIDwODbjAPH020jrECEjLkGuk/tXHppnXMxdqUC6vLY2UWDk4M40BBhw4nA+Wrw//M4xOoY2zqdlmIEveg+oEuXH3hZnU1eDQb/KjDIyjd3d3Id6u7G+p3var2nd7r91FPZGmtV2pbr2/kA4yIUtRQINn/IkARizxwQNLMTBkwo9U4cy1FYxUxVEZmrTz2vHgZMMRLNpC1lphGQ//M4xOUUWPrSVnmEdrQzNd3sc7wqzXNnbvYadvaKC8RhxMaZ1/muOm78r/lzcsUa/0ILMa5W7nrCRecrfaPBqgwIZFYYP+wTC5CKxTMl6bm0GNRICRCpKT7QF6TXUPMJWvMMeh5hh327I73X//M4xPIZK0Kc7EjFMFOYhyIwgphz9msEg2W5G2Rjml/ccenej6ms1oMrdP/r0j4i09AHZX9/Jgf7fopLsh/zXr1VvdUVIgx6jZGugQyTls3Jm9imPVOvxRztMoMiEnAoYxpNonu7m1Pee4in//M4xOwYEeKhFDDFMUfFdIsJmKfM6lnPS63hTWTnm9/gq4s7jRNE8Uybhj7v/+ozv44zKLpy/9/zr8mCuxetN60jC2EbnhACP0kLlnKqoZqoxZhDTGp5HtGfGPRYOcNCIOai0MwT5CCo7E4s//M4xOoYCl6drEjFLWDpYZiIbndF8WcVmjmI1yvnS8vOwN1+sYZG73sYOKakWj/+v/XKw0n9v/pp9zP/rqyF4HKsDYwCWlUoIohROOYng+XSaJJIIY9g3+w+oKEOKfA2i1hhD4GkBPYK3TIk//M4xOgYAWahFEmE1URlI4mePsSGk7kGUZtRhicDije60qhQmSqAvEyjUtknIA8wwFoH3j8J6ug1QlNtJooXF54hUt2WvN8EHyeSJ5UnCNOnWSfk6+JfOxuQ6jeEDDIg1GdRzns12bl7hcoY//M4xOcX+V6ZlUkYAZ3NhDCMJbKWeRiDO5GFe5R75u/0u/ytAhpmqgmQAAnry9rITxVVUVkwkZJYMFcR43zFbV4ax6HQSKrU0q7SwOaELiwS4SatpbLzmGtjw4OOnspb5tW1pMCXGDNY24uX//M4xOYnayqVkYxIAOMqWOzJysy4Zkk2PFl6OZM3zFy7K0nJn7SdsKlC+6+1qxvW3qzPrZm3fszMz3TPKDMuqurblqMwg1hpc35zzfZl2axWms3nt6Z6d6ZSqv+Bf+YVYDh/KZhHIWEcQDob//M4xKcmky61k4lgAIlXx/zqMnoojvL+pydJQWxSESYwkZeRuCSCUS6fUjyJt1Sjpjf2viVzhLFlAWxh1LG1p/Li94M+qUpqekt3+dMDJF1B3/e+N1zikXeJL7+8Xm1rf+vnFvX781K+lYnj//M4xGsjAnqhYc94AWPbNs/5x8/Xpj0xf/4t5N8QUHrG9454NZ3TW6hVf8EwashALf5pQfyQzfLyzM6NRDuExKNky9gmXXcrYDcJ1g/hH0MR0RnRCGuNGw8GqGwGGbbeqYhRqadZOdTNasVK//M4xD4j6yq9lnmFqH1rcz8/GFwWWOlG1uZIz1crhQYbVAc7S1nqfjKF2Uff1R7tJWN9xnZ377P/39rqXYQDmEUwgBk6wnB9GpIw5C/o2ZOZtunf7be737It7Q4k1Hp21mrMZuy+78ZZB8rY//M4xA0X8Vrm/gvQFIaZ4VxNY2G0aaUXbKfJNJ/KDgAsSYE6/qO8SGpwRfuVe4hiL6Ch3Bgcm9lm9ZX6d8cc5R0A+YtsgIqiNKWDbEh6xzGl2NForv1VVV61XL6YxqZKCmbwAADFhsJY+U3D//M4xAwU4V7GVAPOHLxhRGCcem9Zj3M9gb5i/QMaTC6h1yiHJ2UftKFnxhMLmtUPRpRuWWy+7d+Pm0UgGlcgiRWPmm9FVr3C0qJVaIRq67DN867+ym7IpAFovAf3qJHFQWzBH/XDcQI035Sm//M4xBcUqWbONnsGjEedopCBe+QBFRrGGrz48msrtYVGNMTqcYjJvP//7Eim6aOQ0oiQryK8W0pGseTFhoXyi1rf05rlcse83d0APJ9Owf5BCZRnCRAp4LLPb/aeqmIhEJmLIRS7rb5W3H3C//M4xCMT2vrFlkhFdJFsMryl6WjntE5BMnr/IphOFWuY/18xf/o9UZ8K1MeZN/xj+Ro0v/K//hWdaj/2nZJLZKBNJRQRskEJyWguow9cLlnM1JwHXKjjAeoR0Ip7m1NDXDCfhInBimWU/777//M4xDIU0XLxvgJGGvaJMwjiKwFgguJJRCJd3tka6yA9zuhaxO1h5KnnxMs6yuoFhWBNHNiGfE02T3YWnylBAEA4yP4kGapBa5uilKwTkF5JLemX+nSyuHISAB4pjVL3tJ31Xn4gMCNTSoDW//M4xD0UmRrAVgMGGh9zv6ougwCAMHBAce4ByD/d/73kA/WhhCBSIxtOwb+SYoLteIh+tOYb9iGKeEXEFhiZ/DP6OvmLZsvItnVCvdwafY7ptTX6LIyhlNMrtvv7P7f+pmRncctDAZLOCKXI//M4xEkUik7SXgvEGAmLPDYu7//7iSoIQKQSDzOQhxI0NexiiIQhF3r0hq4Y40GwcPV3vcAe5EHaJrRCbuY56rPlT6vvpU7N9GYm387W+v9P8mRVdiKrp1Kxue/9f///1NyeRBDoqOwtKsSJ//M4xFUUkzq9lAPEFBSCFzuPZlLVHym1jUSOCK01fR6DmJ07mkwyLVfR2lSndVTu5ZLMFy1epsr7fLXdKtrHL/0XvN//+yQqIKCawk8REh6zns/TlND7DI0PkyiaE0tuu112ulH/7YTkkrhX//M4xGEUYhq9ksPEiHHOWbEhBFKw61e2o0d7xjzI9kwZkgBciAmLZqFDNMl5/glFtBUrOIb3/2SL//OjmvI2+wR//9QYl2BhAZOPODAWBAERlR2o5I43OYloPwP2ppz+stEovm4TghQ+tiHo//M4xG4U2ksOXnhE/kEyxDP3poaT0yqeFpZ3voMXECix9QFyIORQLKOOIKU1cop0sZFw2jfhdCKk0ftfu/IMQ2L1is6SLKUwbWOUj//ZBQEyHA+FQAUn3feTdCXErn3eGxng/eKMGt0mHQ5u//M4xHkU4N7pvAMMFktzFl3MBgRxzL9w54aWIZl/y8N9yYwYVHt6c5xOec/53//6TyfWgUMJqHnADi33P+OBpx4iAQk9CzcRItVACgGDLEjecRBvQ8MBS9/oeLzNdRbbSs6DSH0YlPblUVzq//M4xIQYYhq89HoG7Eqtkjkog/DSLL02fp8ORRBt183HbHcQcjWshON+7W1Nh36BX97pRJCRwHNrGB+BRdr9KoOPRaXAz0niWxYiHK9cmFGrUewNDUafJgiBL/7skgkwUUDD12OzS2QUdXQ0//M4xIEbOXKqNA4MGMsOXI29j9NKJKvB8s+04Qhu2ShCWh74NKmMwUq4JAoT1HiFDLEEjq5GVceV9rkuniE1toBxkokA1D+5ixEJM/pU7UfVTJ1QUZlUOIQQOCh89BoEBOb2dm1/WT6lV5Oi//M4xHMfizadaNIK+dC7kDokwoxBEQGr1UDsntFHd5YS4GJIRW6uoqWuDCVit6sKg0f9LpDQUOvxFyIR+pTSPWW0RnV3I90AEGuNCcyIAxnuTgzPvmoOxVySp/0r9t38Vvq5l39sPR9JKRXK//M4xFMfSlqlksmXBGb/VjYtyo8dC39XFfH7VCXdduOJy9ofh8WyYVGJesa5v9lfUfKVHqQMhKpmpGAJXyDIPymdcL7ByF1v1Lk9Ahr5co2AI4CRmSsDiReQhdX/IiaVUyBoSoXsiukCBAgX//M4xDQdEy7OVsJE25whBXrtwyql4XNjFIzue9NyyiCLaswoHBXNPGVknc6+2pwdjvOdP//7TpeGMIOECkFn///6G72/XmU70Mh8EDZqxEMwAEg9sMaPBirKQVBoGNtgNMcAB0LE0milse1E//M4xB4VyRa9dnmGoIZ5lsfGNL34zUTFChBhROJNXVZmFLGuLCJzZ14qmZrdOvWCoNoFvsw0Gh5Y6RV/+0WEr6tVRl4iAVWAkBuaWRgpLq2lIrBUSSREPUvQBwlE7KWG77PjaPwuYezoZ09T//M4xCUUOkK+XFmEPDMwJyt1KZaEq5J1czEe+vXv/3++dEWzt0ZTq+9O5vjNQIu/R3u/A6WVQs4mCAL/MCf/EckDnjNXmdXqGEjNqUe61AvjWI3d4NQjFQAELo3p+jkvsNSQSi3Xhn2s2f6j//M4xDMhwza5kniSnQggggplYjtJlG5GIwuPpMCtInC6wjFbVigEHoJhQMQQIBRqRdsuf68m7FbeQ1PV0e3XXlkdyeTSyiBhRic6vUcrXkQJzSXaVRk66MVtECjKNtAjDBbfoeJf+1uSj/gs//M4xAsXAz8afkCRX89t6iWQ3IWZHmSg5xccL2Lhxi0MCmLSr+StuCfvvfr6d9q027KBhBiorf/eXVFVFK1WMdkpb2W5aOvamjyzLstroxt7G2Zl3mXy7GhmolRa5sAkU5rsgCo/juDk+x5e//M4xA4VYXraXDJFYJRCMZjwGv9it33u3beC71K2aO77sH7s4TC7J9nBGsJFIRR1XSqm2T6PUEYOiX6xj5MRD0BJU33knA2ZZi9S61Pq5KVkOSrhquR5FFWSAoxnG8spGQuldG/by9V8mB3m//M4xBcZ8RrNvn4YpIGo091WtFC3cUrzAIBYZtmks9Ytmn/90tmZaJKmonvD+HpKRqQTMhxixC83qdRkyTwXrSKgkBFuEGj5fWj3ndqCsoJVx9c1+o+C4AdAqKz8UpFde5Gi43Jhj/eWlouf//M4xA4XYuLuXsPEzo/uVM4HtMldqK5l0UFXwZI17ApiWrTsYT5SzejwxHevR+oKV8idVXgIn6fM/DiE4N/o9a9IMv//dLU6XcqVdWrf+N6t/K3M///8aHPLPWGqDBqoSC2BTj//QWoa+Pq5//M4xA8W+0bGVnpOzIQDW5sV6BnA0jffSdUMQ9KgqJHSpZEcMeJVDBiMKsxmSyM00ii+/UjMaUvM9r22z6//r9b2u526NW7H20Z+fX/p////Nb/55DmKeF8vNicqUZZXA/jYmyCA3TCuImzM//M4xBIYgzrK9ovKXM6PDe3RqJefIQGFv9TD+F7quHSvRl//lU/73CIWWBkt0CYv6viaITSYnu1HRB7+ttVO2kn//5Pn+f7t5CH1Rv////OcjVP8jegAAQObjgOPS2ryYCbzIKaCaV+Ir9Qh//M4xA8Wcl65kgvOHBDHvVztAHzTFxVvKE1cbhKNjLzqcPCAZRmwWsqscIQEF9SqNWOG7b9jtkzW9W9m56sz/+3spzc526km6t0QPGzXQkRzX/1yntvRtYAWkGUbN1DrAXkJ2FGlU6bJLmGx//M4xBQU2kK5lJPENKfSGZvDnVLfL5xIMZKA0fqiLlpqzS6IiNbVmuxaL/200vL362sv7ntuv3Vuq61EPEgqbaNc3+2bbXmJU+bhg2oSCBR/4RARwmLqsV69zuLXUQStpye67Qn9O26+2tC0//M4xB8aaz68THiMvfV0rp6MSIzt+2Wfe28d/e/mLe9EBBd6CBHzLuyaKdRhAvez//MdkykI22+Z2fYe2tO/973O2VHZB3SxODCGZeun3WCEL0oIli1xTQ9JJv9ZbXLR8TEQISgcDhLoQXfh//M4xBQV8tsWXimFp8Fm40jqwyJmLvRP6naucX9/zr2dsp9qNYhTbXrcr8u47LBAl8Y4tjVYbpVv//s8y0cv/Y1DfebspSnGS9d/RnlTwol1C6Jd10ZQUkHgiRlbExljHGTWmM5T55T+8Mv1//M4xBsU6U7WXgPQGLWGksb/xI6sXp23tamNWqEouimLQHxAH5Z6Xf3TXCMKkYLVEjxZ52o9/QV7t8IBtSf/b8s/JUOwCkeAi3FBDWf37ACUAgq2NxyolZx1yT5mGNwSUyd7bE/CSW0UXWyo//M4xCYUWQa+VHmErBUoy2n1pnsYGAgaNQrEp0kEyhY8EHHSU7o6TmVpa7seKpAQNfR/19XkpEP1Y4hK3VElBhepgbZLDRP9sHI7ndXT5NdjvAhocWc0iNsDhum2dED1CCVZ3O6IpEf/u6rU//M4xDMUyz66NhPEEJOhSEDsZf/be//ZdXJo+VVPet/7Kzf+3+37ae9P//B0qgwBdZDczHQACDZUPAGijdS2chCtM1J1SB2zBHWWqmh+r6gzKbygzmYDCGK7IZ67orI+5KNSfptYqORzI7/P//M4xD4U2bathIMEPKf41QZLBzUOAX4odFWE5eMsFvyVsjUiFGgAS0lQM9Rwve/9WZpWUq7w+6w43IaA8F2GscuN0LufhyEckErtPzrfGNTu9f39i7u+CM5RrCgqrU00LmnwQf6Kggu1aRCR//M4xEkUKRa+Vg4MFHJuq03///DqAwh/Gbkxh8HYKwNAvvubZ/aScxL0CvJ7rgybxaxWA2Yz/KMMqEHkacc+c5upUoYwkIowmQCZJPQ60iJUKhBIIiRgu/cD7LcAvA5MNrJb+G////8EHR3K//M4xFcVOYraNgPKGuVSKuHXBdx0LEBsMlRMkCaGoa7zEfGd9FlUcvuLd6s8xnVG+nNVaSuaZS////Mqo5lcqOzs23/10/2////96CupMbEjoVpXdqCm4Tx4oHQG4kCFWTNATg/vxhBGrnMn//M4xGEUuz7ZlgPKF45ZywrK8zCwBSMVwzkVEYRLVvk1U/NSBnCyzwjFkg9ArjRYyBn2vLqD6Dx5dnoodSs0lT1CmQPiB3TZ8fuUK21yF7ClgIIOscjjTlEg5YJBimxNEqMIAhMEQzhHzDAu//M4xG0UaOKxtnmGiKcgvdbaid/nooGJ4jbLOv42bkOjQ8PFzInCI8I7WDJcM5NxVxpZd20xv/oRc02er1Acz2L63+XMKqM4gVM4f4kVwRssKtZXMgJbldGhB3ATLcT1WLYkzLmrxEHsz/yS//M4xHoUyQrGXgrMAJX3CB8vp6amjDCaM9L7/j1nb39+2YqJBgeK3fv7/+zbIfnAD3az1310BqVGoSe///f4apAAggQfJNMBUDTsK8PRCWqEMegAgbPrjmsWTQxPyPfzyZmUKcEjQPJKTtcV//M4xIUWMb65DnmFEDodcbN6hf+WXOtK3VsfkJd9aqKRWt9vSXMzMAgTe0gEYYCxwfVAbetUJjKQJBCtWLik2aHUetHETDy6R+HDJoprS33G7DHJ6SjQHP8vY1O7MeeWsTvT2zYyPbtGQ/SF//M4xIsUGLq1lAsGFJ4q5ruqK5ZwShpXsp0uNiYipNRIrMPaIrHqhKmmUAsIH3Aiah8/KppbXUgU6hxBFsxbxLImiWshWPEoHhBBIjnCrmHFmkAxcAHABChYBvHUFzL3BaENoryLhOp3eRIJ//M4xJkU2YqtkgsGFLq69t72d6pH1B+kgOcLVZpBMHuWLpIqUHgGLJynB+4UmISkRR6i55r3BRDXHDNcjFhFrv90e+YGrV+tE0MMnXnqqA36zlFN0Rlu+rv1IXRZOf5UXyQIQ4rvP///zMNo//M4xKQUyTKxlAsGEFbQKky1ClQBwfOYBAxazQncW801uI34VirTz6Wzy8BngXAekjgVDG0bG8oCwSSfpSrE4hCgwQkACPqeXUKfhE9EEZcLhgT/TE48oGIY/9a/dR3dkep7FBqHgmPSSMhc//M4xK8UiyasRkBFsT7rgwR+Gq0MNSWWvVuEm3/h8s94KvhTO+bqVJnzp/xtj/lvVVdD5zv4Y3ryhvrL/qyzWRmIrd0BVrdxNKsqCcsUYLu1VYuYqKiiNmaUFf799f//Ee+o4QRVhiSkssaa//M4xLsVQaK9rnhG7C5BM5q8KRsfAUJwkuc4fllzyA8FRjY73T49u900WO8HS0PZHBVak9XmlY3/WbKJM2z4IoC4bWtlJXsw0gq6Q+L6HV/NS6ZtBBajyGvA6mItXPNZElLhMkyVFZMiOg3i//M4xMUXyi7KVnjS2BUZEAkRK6V0zgCKJyP0y3CKcxYAFMAWmZdFwpKkUxCUqcLwuLPmdbu1ktLElXuESHS5zkJsh1HNKgfttfgfZfKk1YCQa4tlFc/wZ4/4TIzn5EOdRk8JQfh0O2CCr54E//M4xMQU2XreXmGEsspzrAhTvvzPqcSAxOePXCURLTaIokaJcXYvjnlUgBgetuSPh9hIrJzb1M8C9z9iFbT9CrZDUHVKyAC/+ls9MaMMW5NqlqHOGqVTFHZAhY6fggEsKQsAFIEOwOu3YtSv//M4xM8UuRLGXgpGECWQBRFVWezpnK1VVr32cureZOlkXqUElFq0JsrORhwo1vMU7pczsXaaqgXWdZqCikhqQpMAJv21tdlH56oSE8Za4hcrCX9bDY/Ueh6my0dWPoEcnukiwnE0ibIwyMNl//M4xNsVGKKtjAvQGDt51rftFnLXNvPZOkbmcyg3ect9LZlnUZrMiPvN/KnTncj8iPW2lkV9Xh/xpvtbKqt6Jm3Sll/iD4M/pVTPm5zh4W040E7BtO2VaVsFcvOwweqQIUCNBYVhkoBo1NAZ//M4xOUWMZa1lHpEqAyM0U7dezkpyoGoYdH3MD7+g4QJiElvvSSqUPCgieZn3zbNil1OZH+u3T8DqFlgiLO61oAnKxCKVh804SB0lRAgAwXUwATJ29jZT7S0mJ10ELVxYHDKmNJs0EA97Xzz//M4xOsZeyq+/sGEuEQoSEWfXPl0/zyvmHMDFpmACA474T2WIvzgn//yGM2enXWP+/mfRcjeD8+3fp3btb8zoJHGKt5mpJIyqsnv2q7mcHhuzEzB8+y18/k8dRRvx1XNx2du03FfEeNrzNcV//M4xOQU8R6o9HjEsBQs60a2hbcaHAkADioQR+Hgqw/rzr/UllpWcU6n5XYGKdubNWojqNaJ1mxYVKkd4fUisupnAbiQYADTFmwToWKDa5yLiBPSNusNKc6TJPTeLtcrxqROm2lKVHIkjVnp//M4xO8ZibauXEmGPd5ZNPtLEGPygj2gmK8RM4ANsPBggdVpqOuWSNKqP80XaHsyGQaQ356HALOJuS9VnaebU459Malblt0APyruCEGkyZMmFoEU2w+4oZlv9T5xahqhh7pDuQXDUXkYlceq//M4xOcnW0bNvGGT6vHP+pdnLHqnfR/iIequKlXA/u4KccvzLYBnAukRAQWi7Zl1QMoyXMv3d7iU7gu20ICrUkRpyMlks9rUknqMs2J3txZlm7SKvmXkbuNx+17892EuZ54qNmNaWd7OeTKr//M4xKgVWR7uXHjMzqkuAxPpT/uw12DitcAC4ilDP8wUK1h+DsUPwrCdLQ1MkjNnEl+d/JzUmajXNRk3Kmm+OXP1+3xR1FxLQFUKHEgoOraxyVBMFyQTGtUJgMlvoBNlqwTfjmUyEhWLMGvR//M4xLEXWZKwAAYSEKhlkICSg4IEqhRSmbhYMS9zQIoy1QAxwIb6xcS19V5PYe3YnuvlpoKtMmDpxij7rn6gYvU5bm6Enm4Su7uZlm/ELMnd0TcXN2CAg0qwMAoI/1oypTaogUpfsGm1bNQ1//M4xLIWyPrFvAvMDN2iumqIkJQB+iU6Paq8LUbUexhEkiStpdQVAsFjeJaJekM1CYSTemzfd783686VVITB+6vND4OVQICUJ4WA3gH8eQSAATnBowEgiDo5BY6qBmdXIqnezUO7pVXSjm2J//M4xLUWUaK0sGGGzPb8rf9af9CGVfb//TVv//Xnog2/DVUcAORnfDJ+ikKC0diU6jj1PYkckRxUVadml2bup9pi2v6uOaWtVUPUEY04eHIZBpJwq4WEhAOjAbGKMFzQ6EeGSFPncvpLd4Q5//M4xLocCw7GVnsE1EZQ9R7iGdVtRYxB5donzD3/N81/x1B7E4jz3572dbxXDCo4mSSbUnMP/diouFBJ/E42SNxiJtlINI3Lrek2ZbFJCMm//jf9hNdqRBXQzqtYcjO+adqs6c9K7fVllofU//M4xKgailLNlAPQEIWnK6qnSUy7e7r0/7X6KtCrQqTig+4ijyOUIsJGF8S02hEOJpqWjS9AHZDUDBwp2sCDXBbTNx6+nN+fwAREIy8kqFnK/9/NmYXVTa+woCgq1g0Gp5BkiPMi4dwTO8r0//M4xJwWuyrxtkjK26yWHCvSjJa2i6zrmqbQ8JPslVG/xhsXOVIsCk2jl3l0ck/fvIzza8ViGBCg2RCiXySj0iWSphGeHnVHal7WPf0GMQnGoHnSWtJZSbScUozyx9KFDIZReIfI+wSflI/m//M4xKAUwULSfhsGLL0qyDTaVU47HJMKCcFIgYCgCzikZxYZaVFY5VYKYOJuKCQEETYBAJ0AGQ2L0pItFicMXNLyQoHmPihxHrchKXVm2nRInSzerr1HPUesR2NDAvWiO0owBz+3OCQqSOEF//M4xKwTmR6wInpGfMcLQZRSpoSifzkpRLPbrK46ta5L79dXOfI3Wdfe96Th3PZKrTeSoGLcIIZBlc7IACKUR6Kd0u9Tv+jLU/2O5CHfdAggh8myW1dXsWwQ8AWMMr659Stmj30HORSxVYWH//M4xLwT2JrOfhDEHMwcIlhiEjEKio22tHvsPaqW7vA08uPuzufPiT5dNyHIrKBawKKT/7/noPJSYkLGCqBjzjkTaESo5U+8f5jYY/1771n86zp5s1Gvvb2vv83vu/WrYMn95uNdPev0egsL//M4xMsW4za9rDDEdNXa66JeX1hDWZ+grZIdOOVtV1oOoYcSP2w6HMcIWIP6E0zebM3qdUvhSBENLpCOImKWJhQqd/HhoDAqEioo0qusN3yzjPmMiRU91XYJdGiosKqJFbfV8oDHtKIRAVjW//M4xM4b4zrSVChNYL46S0PdEpaqzXY4tEKAJfzhMdnZ5kvVgZgsfUlmKrMGzQnBY0Nt0yrxwOgyGgaDqBXWFQVdUlNThExtk84gWxRE6PLD5WsJB2otO1Nwgjn/twKwvYxk40JIScmghFCP//M4xL0UKQ7efAmGGH3xownMyFuxW0ynla0Niy7Ktl5ZaVvRnTu3y8vs+pV1QU5FldphZLPfWxOuyt9//6M76H7f/VOzFNGEQTHCrq5CAOZmEkgkmqSQqJIk0UlnBoQlk9zMPG9okfyBAJx9//M4xMsVUP7GVBmGcInr5G7+djyxMc2oTGRtwaWy59ZngEvGicIk4ul46js72xWkPMUdVQQGtOrHekTSBmolRN+NwF2ZM8vCjUBgbjZGwjZclBad0TL4QfFyE4kQnqA5KtmpkymE7FkQOE1O//M4xNQUgya1tDDE1aczKbk6GzNmdcK8KTBQCrD4uLi40VhRyA4eAjucSMFUFzYuKNUowp5e3e9XbW1c3QZKnpbEAEdWF1cqAeIZUQ3Cy71rvtvLV5VbvC+xjNQYSAajhcIEEIOFKOk6Rkno//M4xOEU0RayVAmGHETgxAMkCHVeMOHW2mhn2QQadaRNvwPI/w6bClGAogi73qNqiiEbGBoWKm9bM5qenXswI15NUZlscsgu/pakbYhMEABpBRqKZ5EIMEWkSSQSZzmdqk5SVtpZ1xoZjLcV//M4xOwXaXKqSjMGwPYp5lfDJKIG9ofuReTH/KfFyYzrIx5bfWQyCOiAeeWZ2b6VGhYTmnuA4q24Q2uY1SjBFNdlqbknLbXAQF8AmLAztSSEGz01kXRPPq9PY9ODMuaAwxUDc3dzJS09BnpC//M4xO0Y8dqyVAMGHK/nZ1o29I9MtBbnu7/OKRlecy3yL0RMucU+xfvH6OhjnGe79a0g5KdrhBwxI91f9dhb/DquOXW352EZ09AqYaRiWRGFAyBGRG9g+hhoxRsw+ytaMZtmLWq8QNrv6Ttr//M4xOgYAda2UkmGlJgq5tEqGJjeUsj5SEwmYTU0RfF8thbEIhCEwoIQhSRH9lzOeTERmjdOGLqjGeR9P/t20kDWVXUtmllOWFo9QmxWG+aCyVlgTnFcmb9hQDidNTMVgyGOgkNz8/BotJfK//M4xOcX4iLCXAmGGV7ahwsnQc+wzQliEcY2LJ6fxVLzOjPKBdhUeGhESaESBclYV22okg8bJ3mWvSZ9i5LgW9Z5mapYgLnqiNYiZo6NLNNsw92wtPZLio0omQIYDhet8m7/8RWHfdjM0/CW//M4xOYXUzLKdkBFkevXfNme79m7fHbGjf2a/Wu3ptmc3cztGvjyeghZFcTJS+0e96E07gXONAJUzZtkkP+gVFWNAAg0U4CENnhQ/ybAJpfT+/YA/ncD8UI3i2wXtP+SEuRNmasVue//i8Ls//M4xOcXOaa2dDJGcHcTo425mtBp//46MTJdG0XulM5l+Mpd///n+iFKfyqhEerrsMJ8xMP///QhhsrYiSsPlRLpRMUZhYldGg////8wjjXLNFcmaynhpFqi0YUNTsKNn5rn/////9vW1Hey//M4xOkYAc6ttUkwAMN8LvHO6vtD1IwxfCjQvZSsUaE9/8//zNVRiCwD////ytMY1TGM5SlmL////0epepS0M8v////mNUrZQESwYCNKGAhThQE0JBcgrEaqTEFNRTMuMTAwqqqqqqqqqqqq//M4xOgoSu6BiY94AKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//M4xKUMyqFgH8AQAaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\" type=\"audio/mpeg\"/>\n",
       "                        Your browser does not support the audio element.\n",
       "                    </audio>\n",
       "                  "
      ],
      "text/plain": [
       "<pydub.audio_segment.AudioSegment at 0x7f68f285a9d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ii = 213\n",
    "print(slices_meta[ii][1][0][1])\n",
    "play_bytes(slices_audio[ii], sample_rate=sample_rate, byte_width=byte_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "8db9269d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "alens = pd.Series([len(slc) for slc in slices_audio]) / sample_rate / byte_width\n",
    "alens.hist(bins=30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "id": "1f4b4215",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5bb7b5b7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "574d25a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['transcript', 'words'])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "align_dict.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "fd72b5ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'end': 77.77,\n",
       " 'endOffset': 265,\n",
       " 'start': 77.34,\n",
       " 'startOffset': 263,\n",
       " 'word': 'te',\n",
       " 'success': False}"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "align_meta[51]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "af4f557a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "37884348",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "75e23e3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "byte_width = whole_array.dtype.itemsize\n",
    "#(sample_rate, byte_width, n_channels)\n",
    "with open(\"test.wav\", \"wb\") as fi:\n",
    "    write_wav(fi, whole_array.tobytes(), sample_rate=sample_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "032e09ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "26f9f1c6d9f64090aacf206f1df83e10",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/3 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "whole_array = concat_files(files_in_order[-4:][::-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "70e89837",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20126592,)"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "whole_array.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3599538a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "561e3943",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "e124309b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.utils.conversion import load_audio_as_array, write_wav, convert_audio\n",
    "from suno_utils.utils.notebook import play_audio, play_array\n",
    "from IPython.display import Audio\n",
    "\n",
    "from suno_utils.utils.conversion import load_audio_as_bytes\n",
    "from suno_utils.utils.alignment import align_segments, process_align_meta, postprocess_slice_meta\n",
    "\n",
    "from suno_utils.utils.slicer import (\n",
    "    get_align_gaps,\n",
    "    get_vad_gaps,\n",
    "    get_intervals_from_gaps,\n",
    "    get_audio_slice\n",
    ")\n",
    "from suno_utils.utils.alignment import _reconstitute_slice_text\n",
    "import portion\n",
    "import time\n",
    "from suno_utils.utils.conversion import write_wav"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "7143e2d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_audio_16k(audio_fname):\n",
    "    audio_bytes, (sample_rate, byte_width, _) = load_audio_as_bytes(\n",
    "        audio_fname, n_channels=1\n",
    "    )\n",
    "    audio_dur_s = len(audio_bytes) // sample_rate // byte_width\n",
    "    if sample_rate != 16_000 or byte_width != 2:\n",
    "        raise RuntimeError()\n",
    "    audio_bytes_16khz = audio_bytes\n",
    "    return audio_bytes_16khz, audio_dur_s, sample_rate, byte_width\n",
    "\n",
    "\n",
    "def _make_aligned_segments(audio_fname, transcript_fname, align_meta_fname):\n",
    "\n",
    "    audio_bytes_16khz, audio_dur_s, sample_rate, byte_width = load_audio_16k(\n",
    "        audio_fname\n",
    "    )\n",
    "\n",
    "    with open(transcript_fname, \"r\") as fi:\n",
    "        parsed_transcript = json.load(fi)\n",
    "    full_text = \" \\n \".join(t[\"text\"] for t in parsed_transcript)\n",
    "\n",
    "    with open(align_meta_fname, \"r\") as fi:\n",
    "        align_meta = json.load(fi)\n",
    "\n",
    "    pct_al = np.mean([e[\"success\"] for e in align_meta]) * 100\n",
    "    print(\n",
    "        f\"found {len(align_meta)} elements in alignment meta, {pct_al} percent aligned\"\n",
    "    )\n",
    "\n",
    "    # make slices\n",
    "    vad_gap_intervals = get_vad_gaps(audio_bytes_16khz)\n",
    "    align_gap_intervals = get_align_gaps(align_meta, audio_dur_s)\n",
    "    safe_gap_intervals = vad_gap_intervals & align_gap_intervals\n",
    "    slice_intervals = get_intervals_from_gaps(safe_gap_intervals)\n",
    "    cov_frac = np.sum([to_s - from_s for from_s, to_s in slice_intervals]) / audio_dur_s\n",
    "    print(\"{}% slice coverage\".format(round(cov_frac * 100, 1)))\n",
    "\n",
    "    speaker_idx_map = portion.IntervalDict()\n",
    "    speaker_idx_map[portion.closedopen(0, len(full_text))] = \"speaker\"\n",
    "    meta_idx_map = dict()\n",
    "\n",
    "    # create audio slices\n",
    "    slices_meta = postprocess_slice_meta(\n",
    "        slice_intervals, align_meta, full_text, speaker_idx_map, meta_idx_map\n",
    "    )\n",
    "    slices_audio = [\n",
    "        get_audio_slice(\n",
    "            audio_bytes_16khz, sample_rate, byte_width, from_s=from_s, to_s=to_s\n",
    "        )\n",
    "        for from_s, to_s in slice_intervals\n",
    "    ]\n",
    "\n",
    "    additional_info = {\"cov_frac\": cov_frac, \"pct_aligned\": pct_al}\n",
    "    return slices_audio, slices_meta, full_text, additional_info\n",
    "\n",
    "\n",
    "def make_segments(data_dir):\n",
    "    audio_fname = os.path.join(data_dir, \"audio\", \"whole-audio.mp3\")\n",
    "    transcript_fname = os.path.join(data_dir, \"parsed_transcript.json\")\n",
    "    align_meta_fname = os.path.join(data_dir, \"alignment_meta.json\")\n",
    "\n",
    "    if not os.path.exists(audio_fname):\n",
    "        raise Exception(\"can't find audio file\")\n",
    "    if not os.path.exists(transcript_fname):\n",
    "        raise Exception(\"can't find transcript file\")\n",
    "    if not os.path.exists(align_meta_fname):\n",
    "        raise Exception(\"can't find alignment file\")\n",
    "\n",
    "    slices_audio, slices_meta, full_text, additional_info = _make_aligned_segments(\n",
    "        audio_fname, transcript_fname, align_meta_fname\n",
    "    )\n",
    "    return slices_audio, slices_meta, full_text, additional_info\n",
    "\n",
    "\n",
    "OUTPUT_BASE_DIR = \"/mnt/data-ssd-1/data/nz-parl/processed_data/slices\"\n",
    "\n",
    "\n",
    "def make_slices_from_directory(data_dir):\n",
    "    slices_audio, slices_meta, full_text, additional_info = make_segments(data_dir)\n",
    "\n",
    "    datestr = os.path.split(data_dir)[-1]\n",
    "    output_dir = os.path.join(OUTPUT_BASE_DIR, datestr)\n",
    "    os.makedirs(output_dir, exist_ok=True)\n",
    "\n",
    "    output_slice_meta = []\n",
    "    for audio_slice, meta in tqdm.notebook.tqdm(\n",
    "        zip(slices_audio, slices_meta), total=len(slices_meta)\n",
    "    ):\n",
    "        interval, other = meta\n",
    "        if not other:\n",
    "            continue\n",
    "        st, ed = interval\n",
    "        txt = other[0][1]\n",
    "        fn = f\"{st}_to_{ed}\".replace(\".\", \"\") + \".wav\"\n",
    "        fname = os.path.join(output_dir, fn)\n",
    "        write_wav(fname, audio_slice)\n",
    "        output_slice_meta.append({\"filename\": fname, \"interval\": list(interval)})\n",
    "    with open(os.path.join(output_dir, \"slice_metadata.json\"), \"w\") as fi:\n",
    "        json.dump(output_slice_meta, fi)\n",
    "    return output_slice_meta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "78019ae3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/mnt/data-ssd-1/data/nz-parl/20220315'"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datestr = \"20220315\"\n",
    "data_dir = os.path.join(\"/mnt/data-ssd-1/data/nz-parl/\", datestr)\n",
    "data_dir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "f7f4c422",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "found 55396 elements in alignment meta, 71.32825474763521 percent aligned\n",
      "57.0% slice coverage\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f59f19e32c1d48e483fe632e55c153eb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1295 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "output_slice_meta = make_slices_from_directory(data_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d5110393",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "910eabfc",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "88dd16d2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "26619aea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f0681354a6e740a29e3f6d5352637e82",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1293 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75047050",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b323b28f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bfbcb0bd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
