diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
index 885e653..6f03a60 100644
--- a/.github/workflows/python-package.yml
+++ b/.github/workflows/python-package.yml
@@ -43,7 +43,7 @@ jobs:
pylint metasyncontrib/disclosure
- name: Check docstrings with pydocstyle
run: |
- pydocstyle metasyncontrib/disclosure --convention=numpy --add-select=D417 --add-ignore="D102,D105"
+ pydocstyle metasyncontrib/disclosure --convention=numpy --add-select=D417 --add-ignore="D102,D105,D406"
- name: Check types with MyPy
run: |
mypy metasyncontrib/disclosure
diff --git a/examples/tutorial.ipynb b/examples/tutorial.ipynb
index 0c66bc3..ed270ee 100644
--- a/examples/tutorial.ipynb
+++ b/examples/tutorial.ipynb
@@ -13,23 +13,26 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"id": "2442cb34",
"metadata": {},
"outputs": [],
"source": [
- "# import required packages\n",
"from collections import defaultdict\n",
- "import datetime as dt\n",
"\n",
"import numpy as np\n",
"import polars as pl\n",
"from matplotlib import pyplot as plt\n",
- "\n",
"from metasyn import MetaFrame, demo_file\n",
- "from metasyncontrib.disclosure import DisclosurePrivacy\n",
"from metasyn.provider import DistributionProviderList\n",
- "#from utils import get_demonstration_fp"
+ "from metasyn.distribution import (\n",
+ " DiscreteUniformDistribution,\n",
+ " FakerDistribution,\n",
+ " RegexDistribution,\n",
+ " MultinoulliDistribution,\n",
+ ")\n",
+ "\n",
+ "from metasyncontrib.disclosure import DisclosurePrivacy"
]
},
{
@@ -45,19 +48,56 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "3c2a44b7",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "
shape: (5, 13)PassengerId | Name | Sex | Age | Parch | Ticket | Fare | Cabin | Embarked | Birthday | Board time | Married since | all_NA |
---|
i64 | str | cat | i64 | i64 | str | f64 | str | cat | date | time | datetime[μs] | str |
1 | "Braund, Mr. Ow… | "male" | 22 | 0 | "A/5 21171" | 7.25 | null | "S" | 1937-10-28 | 15:53:04 | 2022-08-05 04:43:34 | null |
2 | "Cumings, Mrs. … | "female" | 38 | 0 | "PC 17599" | 71.2833 | "C85" | "C" | null | 12:26:00 | 2022-08-07 01:56:33 | null |
3 | "Heikkinen, Mis… | "female" | 26 | 0 | "STON/O2. 31012… | 7.925 | null | "S" | 1931-09-24 | 16:08:25 | 2022-08-04 20:27:37 | null |
4 | "Futrelle, Mrs.… | "female" | 35 | 0 | "113803" | 53.1 | "C123" | "S" | 1936-11-30 | null | 2022-08-07 07:05:55 | null |
5 | "Allen, Mr. Wil… | "male" | 35 | 0 | "373450" | 8.05 | null | "S" | 1918-11-07 | 10:59:08 | 2022-08-02 15:13:34 | null |
"
+ ],
+ "text/plain": [
+ "shape: (5, 13)\n",
+ "┌─────────────┬───────────────┬────────┬─────┬───┬────────────┬────────────┬──────────────┬────────┐\n",
+ "│ PassengerId ┆ Name ┆ Sex ┆ Age ┆ … ┆ Birthday ┆ Board time ┆ Married ┆ all_NA │\n",
+ "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ since ┆ --- │\n",
+ "│ i64 ┆ str ┆ cat ┆ i64 ┆ ┆ date ┆ time ┆ --- ┆ str │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ datetime[μs] ┆ │\n",
+ "╞═════════════╪═══════════════╪════════╪═════╪═══╪════════════╪════════════╪══════════════╪════════╡\n",
+ "│ 1 ┆ Braund, Mr. ┆ male ┆ 22 ┆ … ┆ 1937-10-28 ┆ 15:53:04 ┆ 2022-08-05 ┆ null │\n",
+ "│ ┆ Owen Harris ┆ ┆ ┆ ┆ ┆ ┆ 04:43:34 ┆ │\n",
+ "│ 2 ┆ Cumings, Mrs. ┆ female ┆ 38 ┆ … ┆ null ┆ 12:26:00 ┆ 2022-08-07 ┆ null │\n",
+ "│ ┆ John Bradley ┆ ┆ ┆ ┆ ┆ ┆ 01:56:33 ┆ │\n",
+ "│ ┆ (Flor… ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n",
+ "│ 3 ┆ Heikkinen, ┆ female ┆ 26 ┆ … ┆ 1931-09-24 ┆ 16:08:25 ┆ 2022-08-04 ┆ null │\n",
+ "│ ┆ Miss. Laina ┆ ┆ ┆ ┆ ┆ ┆ 20:27:37 ┆ │\n",
+ "│ 4 ┆ Futrelle, ┆ female ┆ 35 ┆ … ┆ 1936-11-30 ┆ null ┆ 2022-08-07 ┆ null │\n",
+ "│ ┆ Mrs. Jacques ┆ ┆ ┆ ┆ ┆ ┆ 07:05:55 ┆ │\n",
+ "│ ┆ Heath (Li… ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n",
+ "│ 5 ┆ Allen, Mr. ┆ male ┆ 35 ┆ … ┆ 1918-11-07 ┆ 10:59:08 ┆ 2022-08-02 ┆ null │\n",
+ "│ ┆ William Henry ┆ ┆ ┆ ┆ ┆ ┆ 15:13:34 ┆ │\n",
+ "└─────────────┴───────────────┴────────┴─────┴───┴────────────┴────────────┴──────────────┴────────┘"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "demonstration_fp =demo_file()\n",
+ "titanic_path = demo_file()\n",
"df = pl.read_csv(\n",
- " source=demonstration_fp, \n",
+ " source=titanic_path,\n",
" try_parse_dates=True,\n",
- " dtypes={\n",
- " \"Sex\": pl.Categorical,\n",
- " \"Embarked\": pl.Categorical\n",
- " }\n",
+ " dtypes={\"Sex\": pl.Categorical, \"Embarked\": pl.Categorical},\n",
")\n",
"df.head()"
]
@@ -75,27 +115,91 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 7,
"id": "b2f5eadd",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 13/13 [00:01<00:00, 12.23it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Lower bound distribution: 2022-07-15 12:21:15\n",
+ "Lowest value in dataframe: 2022-07-15 12:21:15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
shape: (5, 13)PassengerId | Name | Sex | Age | Parch | Ticket | Fare | Cabin | Embarked | Birthday | Board time | Married since | all_NA |
---|
i64 | str | cat | i64 | i64 | str | f64 | f32 | cat | date | time | datetime[μs] | f32 |
1 | "Brittany Brown… | "male" | 25 | 0 | "36347" | 51.982691 | null | "S" | 1907-12-02 | 17:07:57 | 2022-07-18 17:57:00 | null |
2 | "Steven Wright" | "male" | 25 | 0 | "73559" | 35.181497 | null | "C" | 1933-12-12 | 11:25:19 | 2022-08-14 11:51:18 | null |
3 | "Michael Yang" | "male" | 20 | 0 | "73510" | 77.549664 | null | "S" | 1915-04-27 | 13:42:48 | 2022-07-28 21:00:47 | null |
4 | "Andrew Stout" | "female" | null | 0 | "78506" | 23.700753 | null | "S" | null | 16:17:26 | 2022-08-10 00:55:50 | null |
5 | "Misty Landry" | "female" | null | 0 | "9510" | 15.404263 | null | "S" | 1932-12-07 | 12:42:44 | 2022-07-19 05:43:19 | null |
"
+ ],
+ "text/plain": [
+ "shape: (5, 13)\n",
+ "┌─────────────┬──────────────┬────────┬──────┬───┬────────────┬────────────┬──────────────┬────────┐\n",
+ "│ PassengerId ┆ Name ┆ Sex ┆ Age ┆ … ┆ Birthday ┆ Board time ┆ Married ┆ all_NA │\n",
+ "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ since ┆ --- │\n",
+ "│ i64 ┆ str ┆ cat ┆ i64 ┆ ┆ date ┆ time ┆ --- ┆ f32 │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ datetime[μs] ┆ │\n",
+ "╞═════════════╪══════════════╪════════╪══════╪═══╪════════════╪════════════╪══════════════╪════════╡\n",
+ "│ 1 ┆ Brittany ┆ male ┆ 25 ┆ … ┆ 1907-12-02 ┆ 17:07:57 ┆ 2022-07-18 ┆ null │\n",
+ "│ ┆ Browning ┆ ┆ ┆ ┆ ┆ ┆ 17:57:00 ┆ │\n",
+ "│ 2 ┆ Steven ┆ male ┆ 25 ┆ … ┆ 1933-12-12 ┆ 11:25:19 ┆ 2022-08-14 ┆ null │\n",
+ "│ ┆ Wright ┆ ┆ ┆ ┆ ┆ ┆ 11:51:18 ┆ │\n",
+ "│ 3 ┆ Michael Yang ┆ male ┆ 20 ┆ … ┆ 1915-04-27 ┆ 13:42:48 ┆ 2022-07-28 ┆ null │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 21:00:47 ┆ │\n",
+ "│ 4 ┆ Andrew Stout ┆ female ┆ null ┆ … ┆ null ┆ 16:17:26 ┆ 2022-08-10 ┆ null │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 00:55:50 ┆ │\n",
+ "│ 5 ┆ Misty Landry ┆ female ┆ null ┆ … ┆ 1932-12-07 ┆ 12:42:44 ┆ 2022-07-19 ┆ null │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 05:43:19 ┆ │\n",
+ "└─────────────┴──────────────┴────────┴──────┴───┴────────────┴────────────┴──────────────┴────────┘"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "from metasyn.distribution import RegexDistribution, FakerDistribution\n",
- "from metasyn.distribution import DiscreteUniformDistribution\n",
+ "specs = [\n",
+ " # we set passengerId to unique\n",
+ " {\"name\": \"PassengerId\", \"distribution\": {\"unique\": True}},\n",
+ " # We create new fake names for the name column\n",
+ " {\"name\": \"Name\", \"distribution\": FakerDistribution(\"name\")},\n",
+ " # Fit an exponential distribution based on the data for fare\n",
+ " {\"name\": \"Fare\", \"distribution\": {\"implements\": \"core.exponential\"}},\n",
+ " # For age we enforce a specific uniform distribution\n",
+ " {\"name\": \"Age\", \"distribution\": DiscreteUniformDistribution(20, 40)},\n",
+ " # We know cabin has a specific regular expression\n",
+ " {\"name\": \"Cabin\", \"distribution\": RegexDistribution(r\"[ABCDEF][0-9]{2,3}\")},\n",
+ "]\n",
"\n",
- "cabin_distribution = RegexDistribution(r\"[ABCDEF][0-9]{2,3}\")\n",
- "var_spec = {\n",
- " \"PassengerId\": {\"unique\": True}, \n",
- " \"Name\": {\"distribution\": FakerDistribution(\"name\")},\n",
- " \"Fare\": {\"distribution\": \"exponential\"}, # Fit an exponential distribution based on the data\n",
- " \"Age\": {\"distribution\": DiscreteUniformDistribution(20, 40)},\n",
- " \"Cabin\": {\"distribution\": cabin_distribution}\n",
- "}\n",
+ "mf = MetaFrame.fit_dataframe(df, var_specs=specs)\n",
"\n",
- "meta_frame = MetaFrame.fit_dataframe(df, spec=var_spec)\n",
- "print(f\"Lower bound distribution: {meta_frame['Married since'].distribution.start}\\n\"\n",
- " f\"Lowest value in dataframe: {df['Married since'].min()}\")\n",
- "meta_frame.synthesize(5)"
+ "print(\n",
+ " f\"Lower bound distribution: {mf['Married since'].distribution.lower}\\n\"\n",
+ " f\"Lowest value in dataframe: {df['Married since'].min()}\"\n",
+ ")\n",
+ "mf.synthesize(5)"
]
},
{
@@ -120,19 +224,79 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"id": "b8b96c16",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 13/13 [00:02<00:00, 5.16it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Lower bound distribution: 2022-07-15 17:12:24\n",
+ "Lowest value in dataframe: 2022-07-15 12:21:15\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
shape: (5, 13)PassengerId | Name | Sex | Age | Parch | Ticket | Fare | Cabin | Embarked | Birthday | Board time | Married since | all_NA |
---|
i64 | str | cat | i64 | i64 | f32 | f64 | f32 | cat | date | time | datetime[μs] | f32 |
3 | "Store. Rise." | "male" | 30 | 0 | null | 135.292425 | null | "Q" | 1921-01-30 | 13:25:14 | null | null |
3 | "Adult." | "female" | 30 | 0 | null | 37.80435 | null | "S" | 1928-09-01 | 12:18:42 | null | null |
3 | "Doctor." | "female" | null | 0 | null | 8.235304 | null | "S" | null | 18:26:39 | 2022-08-14 15:50:52 | null |
3 | "View. The." | "male" | 19 | 0 | null | 10.90519 | null | "C" | null | 13:42:53 | 2022-07-31 18:46:04 | null |
3 | "Some. I. Plant… | "male" | null | 1 | null | 0.539828 | null | "S" | null | 16:37:16 | null | null |
"
+ ],
+ "text/plain": [
+ "shape: (5, 13)\n",
+ "┌─────────────┬──────────────┬────────┬──────┬───┬────────────┬────────────┬──────────────┬────────┐\n",
+ "│ PassengerId ┆ Name ┆ Sex ┆ Age ┆ … ┆ Birthday ┆ Board time ┆ Married ┆ all_NA │\n",
+ "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ since ┆ --- │\n",
+ "│ i64 ┆ str ┆ cat ┆ i64 ┆ ┆ date ┆ time ┆ --- ┆ f32 │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ datetime[μs] ┆ │\n",
+ "╞═════════════╪══════════════╪════════╪══════╪═══╪════════════╪════════════╪══════════════╪════════╡\n",
+ "│ 3 ┆ Store. Rise. ┆ male ┆ 30 ┆ … ┆ 1921-01-30 ┆ 13:25:14 ┆ null ┆ null │\n",
+ "│ 3 ┆ Adult. ┆ female ┆ 30 ┆ … ┆ 1928-09-01 ┆ 12:18:42 ┆ null ┆ null │\n",
+ "│ 3 ┆ Doctor. ┆ female ┆ null ┆ … ┆ null ┆ 18:26:39 ┆ 2022-08-14 ┆ null │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 15:50:52 ┆ │\n",
+ "│ 3 ┆ View. The. ┆ male ┆ 19 ┆ … ┆ null ┆ 13:42:53 ┆ 2022-07-31 ┆ null │\n",
+ "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 18:46:04 ┆ │\n",
+ "│ 3 ┆ Some. I. ┆ male ┆ null ┆ … ┆ null ┆ 16:37:16 ┆ null ┆ null │\n",
+ "│ ┆ Plant. ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n",
+ "└─────────────┴──────────────┴────────┴──────┴───┴────────────┴────────────┴──────────────┴────────┘"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"meta_frame = MetaFrame.fit_dataframe(\n",
- " df=df, \n",
- " spec=var_spec,\n",
+ " df=df,\n",
+ " var_specs=specs,\n",
" dist_providers=\"metasyn-disclosure\", # Use the metasyn-disclosure plugin\n",
- " privacy=DisclosurePrivacy() # Use disclosure control\n",
- ") \n",
- "print(f\"Lower bound distribution: {meta_frame['Married since'].distribution.start}\\n\"\n",
- " f\"Lowest value in dataframe: {df['Married since'].min()}\")\n",
+ " privacy=DisclosurePrivacy(), # Use disclosure control\n",
+ ")\n",
+ "print(\n",
+ " f\"Lower bound distribution: {meta_frame['Married since'].distribution.lower}\\n\"\n",
+ " f\"Lowest value in dataframe: {df['Married since'].min()}\"\n",
+ ")\n",
"meta_frame.synthesize(5)"
]
},
@@ -167,17 +331,17 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"id": "6630b9a3",
"metadata": {},
"outputs": [],
"source": [
- "from metasyn.distribution import MultinoulliDistribution\n",
- "\n",
"def plot_outliers(dist_type, series_size=50):\n",
" dist_providers = DistributionProviderList([\"builtin\", \"metasyn-disclosure\"])\n",
- " disc_distributions = dist_providers.get_distributions(var_type=dist_type, privacy=DisclosurePrivacy())\n",
- " \n",
+ " disc_distributions = dist_providers.get_distributions(\n",
+ " var_type=dist_type, privacy=DisclosurePrivacy()\n",
+ " )\n",
+ "\n",
" for disc_class in disc_distributions:\n",
" if issubclass(disc_class, MultinoulliDistribution):\n",
" continue\n",
@@ -190,6 +354,7 @@
"\n",
" base_param = defaultdict(lambda: [])\n",
" disc_param = defaultdict(lambda: [])\n",
+ "\n",
" def _add(parameters, param, new_val):\n",
" for key, val in param.items():\n",
" parameters[key].append(val)\n",
@@ -205,13 +370,21 @@
" for param in base_param:\n",
" if param == \"new_val\":\n",
" continue\n",
- " plt.plot(base_param[\"new_val\"], np.array(base_param[param])-clean_base_param[param], label=\"base\")\n",
- " plt.plot(disc_param[\"new_val\"], np.array(disc_param[param]) - clean_disc_param[param], label=\"disclosure\")\n",
+ " plt.plot(\n",
+ " base_param[\"new_val\"],\n",
+ " np.array(base_param[param]) - clean_base_param[param],\n",
+ " label=\"base\",\n",
+ " )\n",
+ " plt.plot(\n",
+ " disc_param[\"new_val\"],\n",
+ " np.array(disc_param[param]) - clean_disc_param[param],\n",
+ " label=\"disclosure\",\n",
+ " )\n",
" plt.title(f\"{disc_class.__name__}: {param}\")\n",
" plt.ylabel(\"Difference between dist with and without outlier\")\n",
" plt.xlabel(\"Value of the outlier\")\n",
" plt.legend()\n",
- " plt.show()\n"
+ " plt.show()"
]
},
{
@@ -225,10 +398,131 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
"id": "fd6903c2",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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VGCyRERERKQCkyUiIiIiFZgsEREREakgeeqAJ0+eYM6cOYiLi0NGRgbkcrnS/n/++UdjwRERERHpmuRkaejQoTh48CD69++PKlWqQCaTaSMuIiIiogpBcrL0559/4o8//kCLFi20EQ8RERFRhVKuteHs7Oy0EQsRERFRhSM5WZo5cyamTp3KRXOJiIjojaDWY7jGjRsrjU26fv06nJ2d4eHhASMjI6W6Z86c0WyERERERDqkVrIUGhqq5TCIiIiIKiYupKsBXEiXiIhI/2htIV0vLy88ePCgRHlmZia8vLykno6IiIioQpOcLN24cQNFRUUlyvPz83H79m2NBEVERERUUag9z9L27dsVP+/evRvW1taK7aKiIsTFxcHT01Oz0RERERHpmNrJUvEgb5lMhoEDByrtMzIygoeHB6KiojQaHBEREZGuqZ0sFa8B5+npiZMnT8LBwUFrQRERERFVFJKXO0lOTtZGHEREREQVklrJ0pIlSzB8+HCYmppiyZIlKuuOHj1aI4ERERERVQRqzbPk6emJU6dOwd7eXuUgbplMhn/++UejAeoDzrNERESkf9T9/larZ+n5R298DEdERERvEsnzLL2JPUdERET05pI8wLtmzZqoVq0a2rRpg6CgILRp0wY1a9bURmxEREREOie5Z+nWrVuYPXs2zMzMMG/ePNSuXRvVqlVDeHg4Vq1apY0YiYiIiHTmpRfSvXbtGmbNmoX169dDLpeXuhTK644DvImIiPSPRgd4Py83NxdHjhzBgQMHcODAASQkJMDb2xsff/wxgoKCXiZmIiIiogpHcrJkY2MDW1tbhIeHY8KECWjVqhVsbW21ERsRERGRzklOlrp06YIjR45gw4YNSEtLQ1paGoKCglC7dm1txEdERESkU5IHeG/btg3379/Hrl27EBgYiD179qBVq1aoWrUqwsPDtREjERERkc5I7lkq5uPjg6dPn6KgoAB5eXnYvXs3Nm7ciPXr12syPiIiIiKdktyztGDBAvTo0QP29vYICAjAzz//jNq1a+PXX3/FvXv3tBGjkuXLl8PDwwOmpqYICAjAiRMnVNbfvHkzvL29YWpqCh8fH+zcuVNpvxACU6dORZUqVWBmZobg4GBcu3ZNm00gIiIiPSI5WSpOjtasWYP79+/j1KlTigRK2wO9N27ciIiICERGRuLMmTNo1KgRQkJC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DRYtWqTp+IiIiIh0SnKytHTpUnz//feYPHkyDA0NFeX+/v74+++/NRocERERka5JTpaSk5PRuHHjEuUmJiZ48uSJRoIiIiIiqigkJ0uenp44e/ZsifJdu3ahbt26moiJiIiIqMKQ/DZcREQERo4ciby8PAghcOLECfz888+YPXs2Vq1apY0YiYiIiHRGcrI0dOhQmJmZ4YsvvkBubi769esHV1dXLF68GO+99542YiQiIiLSGckzeD8vNzcXOTk5cHJy0mRMeoczeBMREekfdb+/yzXP0tOnT7F3716sXbsWZmZmAIA7d+4gJyenfNESERERVVCSH8PdvHkTnTp1QkpKCvLz89GhQwdYWlpi7ty5yM/Px8qVK7URJxEREZFOSO5ZGjNmDPz9/fHo0SNFrxIAvP3224iLi9NocERERES6Jrln6fDhwzh27BiMjY2Vyj08PJCamqqxwIiIiIgqAsk9S3K5XLHEyfNu374NS0tLjQRFREREVFFITpY6duyotAacTCZDTk4OIiMj0aVLF03GRkRERKRzkqcOuH37NkJCQiCEwLVr1+Dv749r167BwcEBhw4deiOnEeDUAURERPpH3e/vcs2z9PTpU2zYsAHnz59HTk4OmjRpgvDwcKUB328SJktERET6R93vb8kDvAGgUqVKeP/998sdHBEREZG+kJwsubm5ISgoCG3atEHbtm3h5eWljbiIiIiIKgTJA7y/+uormJqaYu7cuahZsyaqV6+O999/H99//z2uXbumjRiJiIiIdOal1oa7e/cuDh48iB07dmDjxo1lTivwuuOYJSIiIv2j1TFLubm5OHLkCA4cOID9+/cjISEBDRo0QFBQUHnjJSIiIqqQJD+Ga968Oezt7TFhwgTk5eVhwoQJuHv3LhISErBw4UJtxAgAePjwIcLDw2FlZQUbGxsMGTLkPxfuzcvLw8iRI2Fvbw8LCwv07t0b6enpiv3nzp1D3759Ub16dZiZmaFu3bpYvHix1tpARERE+kdysnT58mVUrlwZ3t7e8Pb2Rt26dWFra6uN2JSEh4fj4sWLiI2NxY4dO3Do0CEMHz5c5TGffPIJfv/9d2zevBkHDx7EnTt30KtXL8X+06dPw8nJCevWrcPFixcxefJkTJw4EcuWLdN2c4iIiEhPSB6zJITA33//jQMHDuDgwYM4dOgQjI2NFW/HDRs2TONBJiYmol69ejh58iT8/f0BALt27UKXLl1w+/ZtuLq6ljgmKysLjo6O+Omnn/DOO+8AeJbo1a1bF/Hx8XjrrbdKvdbIkSORmJiIffv2qR0fxywRERHpH3W/vyX3LMlkMjRs2BCjR4/GL7/8gj///BMdOnTA5s2b8eGHH75U0GWJj4+HjY2NIlECgODgYBgYGOD48eOlHnP69GkUFhYiODhYUebt7Q03NzfEx8eXea2srCzY2dmpjCc/Px/Z2dlKHyIiIno9SR7gfebMGRw4cAAHDhzAkSNH8PjxY/j4+GDUqFFo06aNNmJEWlpaiWVUKlWqBDs7O6SlpZV5jLGxMWxsbJTKnZ2dyzzm2LFj2LhxI/744w+V8cyePRvTp09XvwFERESktyT3LDVr1gw///wzateujR9//BH379/HmTNnsGDBAvTs2VPSuSZMmACZTKbyc/nyZakhlsuFCxfQs2dPREZGomPHjirrTpw4EVlZWYrPrVu3XkmMRERE9OpJ7ll6+PChxsbljBs3DoMGDVJZx8vLCy4uLsjIyFAqf/r0KR4+fAgXF5dSj3NxcUFBQQEyMzOVepfS09NLHHPp0iW0b98ew4cPxxdffPGfcZuYmMDExOQ/6xEREZH+k5ws+fr64uTJk7C3t1cqz8zMRJMmTfDPP/+ofS5HR0c4Ojr+Z73AwEBkZmbi9OnT8PPzAwDs27cPcrkcAQEBpR7j5+cHIyMjxMXFoXfv3gCAK1euICUlBYGBgYp6Fy9eRLt27TBw4EDMmjVL7diJiIjozSD5MdyNGzdKnaU7Pz8fqampGgnqRXXr1kWnTp0wbNgwnDhxAkePHsXHH3+M9957T/EmXGpqKry9vXHixAkAgLW1NYYMGYKIiAjs378fp0+fxuDBgxEYGKh4E+7ChQto27YtOnbsiIiICKSlpSEtLQ337t3TSjuIiIhI/6jds7R9+3bFz7t374a1tbViu6ioCHFxcfDw8NBocM9bv349Pv74Y7Rv3x4GBgbo3bs3lixZothfWFiIK1euIDc3V1G2cOFCRd38/HyEhITgm2++Uez/5ZdfcO/ePaxbtw7r1q1TlLu7u+PGjRtaawsRERHpD7XnWTIweNYJJZPJ8OIhRkZG8PDwQFRUFLp166b5KCs4zrNERESkfzS+NpxcLgcAeHp64uTJk3BwcHj5KImIiIgqOMkDvJOTkxU/5+XlwdTUVKMBEREREVUkkgd4y+VyzJw5E1WrVoWFhYXi7bcpU6Zg9erVGg+QiIiISJckJ0tffvklYmJiMG/ePBgbGyvKGzRogFWrVmk0OCIiIiJdk5wsrVmzBt999x3Cw8NhaGioKG/UqNErm22biIiI6FWRnCylpqaiZs2aJcrlcjkKCws1EhQRERFRRSE5WapXrx4OHz5covyXX35B48aNNRIUERERUUUh+W24qVOnYuDAgUhNTYVcLseWLVtw5coVrFmzBjt27NBGjEREREQ6I7lnqWfPnvj999+xd+9eVK5cGVOnTkViYiJ+//13dOjQQRsxEhEREemM2jN4U9k4gzcREZH+0fgM3i86deoUEhMTATwbx+Tn51feUxERERFVWJKTpdu3b6Nv3744evQobGxsAACZmZlo3rw5NmzYgGrVqmk6RiIiIiKdkTxmaejQoSgsLERiYiIePnyIhw8fIjExEXK5HEOHDtVGjEREREQ6I3nMkpmZGY4dO1ZimoDTp0+jVatWyM3N1WiA+oBjloiIiPSPut/fknuWqlevXurkk0VFRXB1dZV6OiIiIqIKTXKyNH/+fIwaNQqnTp1SlJ06dQpjxozB119/rdHgiIiIiHRNrcdwtra2kMlkiu0nT57g6dOnqFTp2fjw4p8rV66Mhw8fai/aCoqP4YiIiPSPRqcOWLRokabiIiIiItIraiVLAwcO1HYcRERERBWS5DFLRERERG8SJktEREREKjBZIiIiIlKByRIRERGRCuVOlq5fv47du3fj33//BQBInAiciIiISC9ITpYePHiA4OBg1K5dG126dMHdu3cBAEOGDMG4ceM0HiARERGRLklOlj755BNUqlQJKSkpMDc3V5SHhYVh165dGg2OiIiISNfUmmfpeXv27MHu3btRrVo1pfJatWrh5s2bGguMiIiIqCKQ3LP05MkTpR6lYg8fPoSJiYlGgiIiIiKqKCQnS61atcKaNWsU2zKZDHK5HPPmzUPbtm01GhwRERGRrkl+DDdv3jy0b98ep06dQkFBAT777DNcvHgRDx8+xNGjR7URIxEREZHOSO5ZatCgAa5evYqWLVuiZ8+eePLkCXr16oWEhATUqFFDGzESERER6YxMcIKkl5adnQ1ra2tkZWXByspK1+EQERGRGtT9/pbcsxQdHY3NmzeXKN+8eTN+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dS2i1wWTJSJSqU+fPhgzZgx++uknrFmzBh999JGiN+To0aPo2bMn3n//fQDPBg5fvXoV9erVK/N8jo6OuHv3rmL72rVryM3NVWw3adIEGzduhJOTE6ysrNSKsW7duvj1118hhFCKzdLSEtWqVVO7rcbGxigqKlK7vrZjfvF3lZ2djeTkZKXzGBkZSYq5Xr16MDExQUpKiiLpJSLVOMCbiFSysLBAWFgYJk6ciLt372LQoEGKfbVq1UJsbCyOHTuGxMRE/O9//0N6errK87Vr1w7Lli1DQkICTp06hQ8//FCp1yY8PBwODg7o2bMnDh8+jOTkZBw4cACjR48udRoDABgxYgRu3bqFUaNG4fLly/jtt98QGRmJiIgIGBio/8+ch4cHcnJyEBcXh/v37yslcapoK+Z27dph7dq1OHz4MP7++28MHDgQhoaGJWKOi4tDWloaHj169J+xWlpa4tNPP8Unn3yCH3/8EUlJSThz5gyWLl2KH3/8Ua32Er1pmCwR0X8aMmQIHj16hJCQELi6uirKv/jiCzRp0gQhISEICgqCi4vLf84UHRUVherVq6NVq1bo168fPv30U6UxTubm5jh06BDc3NzQq1cv1K1bF0OGDEFeXl6ZvTZVq1bFzp07ceLECTRq1AgffvghhgwZgi+++EJSO5s3b44PP/wQYWFhcHR0xLx589Q6TlsxT5w4EW3atEG3bt3QtWtXhIaGokaNGkrniYqKQmxsLKpXr15izFFZZs6ciSlTpmD27NmoW7cuOnXqhD/++AOenp5qHU/0ppGJFx+IExEREZECe5aIiIiIVGCyRERERKQCkyUiIiIiFZgsEREREanAZImIiIhIBSZLRERERCowWSIiIiJSgckSERERkQpMloiIiIhUYLJEREREpAKTJSIiIiIVmCwRERERqfD/AEAHGKDvYIoWAAAAAElFTkSuQmCC",
+ "text/plain": [
+ "