From 2ef4d6e1afd5664d25bdf3152d0d1f490ebbfc0e Mon Sep 17 00:00:00 2001 From: Lily Taub <115661359+lilydtaub@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:21:55 -0400 Subject: [PATCH 1/8] Add DGB2 Appyter --- appyters/Drug_Gene_Budger2/README.md | 11 + appyters/Drug_Gene_Budger2/appyter.json | 32 + .../drug_gene_budger2_appyter.ipynb | 888 ++++++++++++++++++ appyters/Drug_Gene_Budger2/requirements.txt | 10 + .../Drug_Gene_Budger2/static/dgb_logo.png | Bin 0 -> 35151 bytes 5 files changed, 941 insertions(+) create mode 100644 appyters/Drug_Gene_Budger2/README.md create mode 100644 appyters/Drug_Gene_Budger2/appyter.json create mode 100644 appyters/Drug_Gene_Budger2/drug_gene_budger2_appyter.ipynb create mode 100644 appyters/Drug_Gene_Budger2/requirements.txt create mode 100644 appyters/Drug_Gene_Budger2/static/dgb_logo.png diff --git a/appyters/Drug_Gene_Budger2/README.md b/appyters/Drug_Gene_Budger2/README.md new file mode 100644 index 00000000..ad40bc15 --- /dev/null +++ b/appyters/Drug_Gene_Budger2/README.md @@ -0,0 +1,11 @@ +# Drug Gene Budger (DGB) 2 + +This appyter takes a single gene as input and identifies up-regulating and down-regulating drugs from three connectivity mapping resources. + +- [Ginkgo GDPx1 and GDPx2 datasets](https://huggingface.co/ginkgo-datapoints) + +- [Novartis DRUG-seq U2OS MoABox dataset](https://zenodo.org/records/14291446) + +- [LINCS L1000 Chemical Perturbation dataset](https://maayanlab.cloud/sigcom-lincs/#/Download) + +In addition to producing tables of ranked up- and down-regulating drugs of the input gene, the notebook creates volcano plot visualizations and UpSet plots that identify overlap in regulators across datasets. \ No newline at end of file diff --git a/appyters/Drug_Gene_Budger2/appyter.json b/appyters/Drug_Gene_Budger2/appyter.json new file mode 100644 index 00000000..6da7e8b6 --- /dev/null +++ b/appyters/Drug_Gene_Budger2/appyter.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://raw.githubusercontent.com/MaayanLab/appyter-catalog/main/schema/appyter-validator.json", + "name": "DGB2", + "title": "Drug Gene Budger (DGB) 2", + "version": "0.0.1", + "description": "An appyter that retrieves drugs that up-regulate and down-regulate a single input gene across Connectivity Mapping datasets", + "image": "dgb_log.png", + "authors": [ + { + "name": "Lily Taub", + "email": "lilydtaub@gmail.com" + } + ], + "url": "https://github.com/MaayanLab/appyter-catalog", + "tags": [ + "L1000", + "Novartis DRUG-seq", + "Ginkgo", + "Connectivity Mapping" + ], + "license": "CC-BY-NC-SA-4.0", + "public": true, + "appyter": { + "file": "drug_gene_budger2_appyter.ipynb", + "profile": "biojupies", + "extras": [ + "toc", + "hide-code", + "toggle-code" + ] + } +} \ No newline at end of file diff --git a/appyters/Drug_Gene_Budger2/drug_gene_budger2_appyter.ipynb b/appyters/Drug_Gene_Budger2/drug_gene_budger2_appyter.ipynb new file mode 100644 index 00000000..f88f731e --- /dev/null +++ b/appyters/Drug_Gene_Budger2/drug_gene_budger2_appyter.ipynb @@ -0,0 +1,888 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "72bb0888", + "metadata": {}, + "outputs": [], + "source": [ + "#%%apyter init\n", + "from appyter import magic\n", + "magic.init(lambda _=globals: _())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "978b36d3", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter hide_code\n", + "\n", + "{% do SectionField(\n", + " name='input', \n", + " title = 'Gene of interest', \n", + " subtitle = 'Enter a gene for which you wish to get up and down regulators.'\n", + ") %}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e07b2ead", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter hide_code\n", + "\n", + "{% set input_gene = AutocompleteField(\n", + " name = 'input_gene',\n", + " label = 'Query Gene',\n", + " default = 'C9ORF72',\n", + " description = 'Enter the gene symbol of interest.',\n", + " file_path = 'https://appyters.maayanlab.cloud/storage/DrugRegulators_Appyter/all_genes.json',\n", + " section='input'\n", + ")%}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "733c8208", + "metadata": {}, + "outputs": [], + "source": [ + "%%appyter code_exec\n", + "query_gene = \"{{ input_gene.value.upper() }}\"" + ] + }, + { + "cell_type": "markdown", + "id": "123ecde2", + "metadata": {}, + "source": [ + "# Drug Gene Budger 2" + ] + }, + { + "cell_type": "markdown", + "id": "7ea9d01d", + "metadata": {}, + "source": [ + "This notebook takes a gene as input and identifies drugs that maximally up and down regulate the gene's expression in a collection of chemical perturbation datasets.\n", + "\n", + "- Ginkgo GDPx1 and GPDx2: Limma-Voom based differential gene epxression results for 1,354 drugs.\n", + "- Novartis DRUG-seq: Differential: Limma-Trend based differential expression results for 4,343 drugs. \n", + "- LINCS L1000 Chemical Perturbations: Queries the [LINCS Reverse Search Dashboard](https://lincs-reverse-search-dashboard.dev.maayanlab.cloud/) for pre-computed characteristic direction-based differential gene expression signatures from RNA-seq-like LINCS L1000 Expression Profiles covering 33,571 drugs.\n", + "\n", + "The Ginkgo dataset includes 4 primary cell types (eithelial melanocytes, smooth aortic muscle cells, skeletal muscle myoblasts and dermal fibroblasts) and one cell line (A549 lung carcinoma cell line). Previous analysis showed distinct transcriptional responses by cell type, so the drug rankings for the Ginkgo dataset are separated by cell type." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "503ae0b1", + "metadata": {}, + "outputs": [], + "source": [ + "## General\n", + "import pandas as pd\n", + "import numpy as np\n", + "import re\n", + "import warnings\n", + "\n", + "## HTTP Requests\n", + "import requests\n", + "\n", + "## Tables\n", + "from IPython.display import display, display_markdown, HTML\n", + "\n", + "## UpSet Plot\n", + "from upsetplot import from_contents, plot\n", + "from matplotlib import pyplot\n", + "\n", + "## Volcano Plot\n", + "from bokeh.plotting import figure, show\n", + "from bokeh.models import ColumnDataSource, HoverTool, LinearColorMapper\n", + "from bokeh.palettes import RdBu\n", + "from bokeh.io import output_notebook" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39a5abae", + "metadata": {}, + "outputs": [], + "source": [ + "# Storage url for Ginkgo and Novartis DE files\n", + "ginkgo_URL = 'http://appyters.maayanlab.cloud/storage/DrugRegulators_Appyter/ginkgo_de'\n", + "novartis_URL = 'http://appyters.maayanlab.cloud/storage/DrugRegulators_Appyter/novartis_de'\n", + "# silence warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95e9e0da", + "metadata": {}, + "outputs": [], + "source": [ + "in_ginkgo = in_novartis = in_lincs = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee3e36e5", + "metadata": {}, + "outputs": [], + "source": [ + "# get Ginkgo DE results for gene\n", + "gene_file = f'{query_gene}.f'\n", + "try:\n", + " ginkgo_de = pd.read_feather(f'{ginkgo_URL}/{gene_file}')\n", + " ginkgo_cell_types = list(set(p.split('-')[0] for p in ginkgo_de.Perturbation))\n", + "except:\n", + " in_ginkgo=False\n", + " print('Gene not in Ginkgo dataset')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b9fb1130", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_ginkgo_data(df, cell_types):\n", + " '''Create a results dictionary where each cell type\n", + " in the Ginkgo dataset is a key and the value is the DE data\n", + " for the query gene for that cell type.\n", + " '''\n", + " # get perturbations with given cell type\n", + " cell_type_results = {}\n", + " for k in cell_types:\n", + " subset = df[df['Perturbation'].str.contains(k)]\n", + " subset['log10adj.P.Val'] = subset['adj.P.Val'].replace(0,1e-323).map(np.log10)*-1\n", + " cell_type_results[k] = subset\n", + " return cell_type_results\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdc92b50", + "metadata": {}, + "outputs": [], + "source": [ + "if in_ginkgo:\n", + " ginkgo_gene_expr_dict = prepare_ginkgo_data(ginkgo_de, ginkgo_cell_types)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "200a83a1", + "metadata": {}, + "outputs": [], + "source": [ + "def l1000_reverse_search(gene_id:str, direction:str):\n", + " url = f'https://lincs-reverse-search-dashboard.dev.maayanlab.cloud/api/table/cp/{direction}/{gene_id}'\n", + " headers = {\n", + " 'Accept':'application/json',\n", + " 'Content-Type':'application/json'\n", + " }\n", + " try:\n", + " resp = requests.get(url, headers=headers)\n", + " resp.raise_for_status()\n", + " res = resp.json()\n", + " df = pd.DataFrame(res)\n", + " except requests.exceptions.HTTPError as e:\n", + " print(f\"Gene not found in LINCS: {e}\")\n", + " df=pd.DataFrame()\n", + " return df\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eccf1c5c", + "metadata": {}, + "outputs": [], + "source": [ + "l1000_up = l1000_reverse_search(query_gene.upper(), 'up')\n", + "l1000_down = l1000_reverse_search(query_gene.upper(), 'down')\n", + "if l1000_down.empty or l1000_up.empty:\n", + " in_lincs=False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d731a2ba", + "metadata": {}, + "outputs": [], + "source": [ + "# get Novartis DE results for gene\n", + "try:\n", + " novartis_de = pd.read_feather(f'{novartis_URL}/{gene_file}').set_index('index')\n", + " # format p-values\n", + " novartis_de['log10adj.P.Val'] = novartis_de['P.Adj'].replace(0,1e-323).map(np.log10)*-1\n", + " # rename logFC column for concordance with Ginkgo columns\n", + " novartis_de.rename(columns={'LogFC':'logFC'}, inplace=True)\n", + "except:\n", + " print('Gene not in novartis dataset')\n", + " in_novartis=False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5607885", + "metadata": {}, + "outputs": [], + "source": [ + "if in_lincs + in_novartis + in_ginkgo < 2:\n", + " print(f\"LINCS: {in_lincs}\")\n", + " print(f\"Novartis: {in_novartis}\")\n", + " print(f\"Ginkgo: {in_ginkgo}\")\n", + " raise Exception(\"Execution stopped, gene not found in at least 2 datasets\")" + ] + }, + { + "cell_type": "markdown", + "id": "dd12adb9", + "metadata": {}, + "source": [ + "## Query Gene" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b75c4da", + "metadata": {}, + "outputs": [], + "source": [ + "display_markdown(f\"This notebook shows results for the input gene **{query_gene}**\", raw=True)" + ] + }, + { + "cell_type": "markdown", + "id": "df830837", + "metadata": {}, + "source": [ + "## Rank Drugs" + ] + }, + { + "cell_type": "markdown", + "id": "97c523ce", + "metadata": {}, + "source": [ + "Within each dataset drugs are ranked by the statistical significance of the regulatory relationship. The pipeline uses the differential expression p-value for the Novartis and Ginkgo data and the characterstic direction coefficient for the LINCS L1000 data. \n", + "\n", + "When a dataset contains multiple perturbations for the same drug (i.e. a cell exposed to the drug at different doses), p-values are averaged across doses to get a single ranking for the drug. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32548529", + "metadata": {}, + "outputs": [], + "source": [ + "def get_rankings(data:pd.DataFrame, source:str, cell_type:str, direction:str):\n", + " '''\n", + " Given a dataframe of logFC and p-values for a gene of interest across perturbations, \n", + " rank the drugs by how the induce or repress the gene. \n", + "\n", + " Returns a tuple of 1) drug ranks averaged across drug dosages and 2) full\n", + " perturbation ranks. \n", + " '''\n", + " ranked_data = data.copy()\n", + " \n", + " if (source == 'Ginkgo') & (cell_type=='A549'):\n", + " ranked_data.loc[ranked_data['Drug']=='Brefeldin A from Penicillium brefeldianum', 'Drug'] = 'Brefeldin A'\n", + " elif (source == 'Ginkgo') & (cell_type != 'A549'):\n", + " ranked_data.loc[ranked_data['Drug']=='Brefeldin-A', 'Drug'] = 'Brefeldin A'\n", + " elif source == 'Novartis':\n", + " ranked_data.loc[ranked_data['Drug']=='Trichostatin A (racemate)', 'Drug'] = 'Trichostatin A'\n", + " # average rank across all drug dosages\n", + " drug_mean_ranks = ranked_data.loc[:,['Drug','logFC','log10adj.P.Val']].groupby('Drug')[['logFC','log10adj.P.Val']].mean().sort_values('log10adj.P.Val', ascending=False)\n", + " # filter for up or down regulation\n", + " if direction == 'up':\n", + " drug_mean_ranks = drug_mean_ranks[drug_mean_ranks['logFC'] > 0]\n", + " elif direction == 'down':\n", + " drug_mean_ranks = drug_mean_ranks[drug_mean_ranks['logFC'] < 0]\n", + " drug_mean_ranks.rename(columns={'logFC':'Avg logFC', 'log10adj.P.Val':'Avg -log10(Adj.PVal)'}, inplace=True)\n", + " return drug_mean_ranks, ranked_data\n", + "\n", + "def get_top(rank_results:pd.DataFrame, n=50):\n", + " '''\n", + " Given the drug_mean_ranks result from get_rankings, extract the names of the drugs\n", + " that most down- or up-regulate the gene of interest (top N).\n", + "\n", + " If there are less drugs than N, will return all results.\n", + " '''\n", + " top = {d.casefold() for d in set(rank_results.head(n).index)}\n", + " return top\n", + "\n", + "# create download link for table results\n", + "def download_link(df, fname):\n", + " if df.shape[0] == 0: return ''\n", + " csv = df.to_csv(fname, sep='\\t', index=True)\n", + " link = f'
@Nr_{5k$NS1NBEPtroT;KSIq+tXPK*+ z)d;LBsHHyH;xsA`G}f9A^QjBWD{97qMvt-`TFq&+wGn;-ZcET95v|UiIT CW>X_LUZ#1ed#wKO!p`z!7*vsgm59`mnR#OC{`v$F zaMPRtijcRHT=B+-AwUIgq`Ww59{O?W*i?~mdE5DU xc|gNGtz2 zG9TKQ*eliJgN=7-m+O^jOKDw5pSiC76`ykG6~A#WRe47B-rOo7P2Q&_m^&>8%fd4) zhIg61ojkLXeHnbsvy?XXBogfuYs=z!Ck2^D-j4o}__G}RJX1}WT3@AM3`kDbV|%#X z{ZkpWXYuA70nA67KlcGkxc4aa%TrKF8VYjVgq0U5b*k0(UB8$9&NDLrxr1KcL2Wn& z2-5$yV{79C2p#SAj-E!*y@X8%c|ayXk52YD2xxw#UFh)l9F$c=2y?dOrP;FVJ_EpB ztq&lVtT-Q 8xTI@<>|FNZ z)}hzAurGXym;%p2VhAMZ W3LwroXk_CajQpl8~(WsPUQmcU@s?Cl=F;O)2(HW|jnq))MQ3%e{Ec8*Fv> zTY_7UkCgt0tD2Dh??`GblZ>&QCRJp1%PkHA6)ml*(HqX0MYRI>-Im_znR+Ba*f5$- zbk-C%^+}r=_Sg!47vkMxkW22+2nkzcwhY1+Cw`y8j}wqXR%JXW`j(gI5vjaY8(68n zAQ4-{sl1t-y0yA#=T|1Ref&6oP|hKv`@Wlu+?M||TJJj~C~MZV`$@(}b6?-9&?Ymi z)C87k=sFOSnHr8B1DtKm(LypXltLGp1pov+^EG#AgYd&u4}Qx;*aREd7PLOM9(6cy zsgcR2Neve2&rSQqI1tqvuxWb^WHM=C=^17%IG2*~nSp@nQr862)W(CoA4n^Xw=1cW z*`vpTWYz2SDci+n7B#{O6l7jGlPR=2$e)EK8Km%NN<8&){#o9q4yH+N-NL4pjRtnf z4yH7dKcv~neuV zDqcH1eA5^yq}qSCBWj-Z_HUC6*AcuCV3RuJUZxpl-J&M2=4$s8#(tIPV&uzqW;PeI zV?4y@*C0^kx~qdW7qk6QHg}aBl=BM)*ru;zPbZOBRAt1Cq>w!G^m*2&{#>p1le)Tx z`COBxnn=<{lJsNv0uR8@)^*5utCHvp;)^m1j@T3x!|Bo345n)N?&-m(jITd8N?tq9 zwuz;AzIHL=yuUXTCS_*TJ|go;)*&OoCVl-EE~u0k179^p2dHZ&6fAM{o8)CEN4W(f z%}c0YAiHDxA>?O5?_R7M32V4~3ufZHlLwL3+5IvnrtJ(x3pGc4pp3`|$9W1j6b(&X zdmKG>a+EpLk^{8}i7P+Xa#O54lUeOD*GEm_bf%qu1(9`k^^BA?_4HvUYQAKee};a9 z;Eq;i;tEr|cBt+D2i&h|tLIdRXLW37=4^}tIx)Wg_~Lkg#Gnwlef04QaZ;ht=L};K z&HYl#zMI Z#pg3&n4l~!Cg#b34~*;lSC`ydDDJYZN8xM9qz>Ft6$gA%jfJR zRxTHY9iKBtaH6pFi4*xNvKNV^%}OGG<5e&00umCaI=0s%;!w^6`rK&iZ;$el_|&3K z(zJ^8thnWB0zPj;1(c#pQ^oID@#oRr;42STt1o+i8`0?5rnYLAD&HMcchckmrL9+T zDVvLaSPM@Go5J(F`F92DrWOJ&izW%HlUW@@WEl=Ado59wAEZJ3Ah-1_h4~8!J)ch< z2u$$73H*Cn0#8T+)32iabjzt%?gzh 5#iR!QZ>Dv}I zmr|!?nSeCuR5XW8V`dbsdAYJt?j09%o4|}ECFcQy;L79-k)KUBpQx$mS5Zz>{FNc_ zxA|K?BOHr13iSkgn$w!~!#Fh_@J7t?GIUxT(UCkefO#Dm4TB0**``_=VP@`Gp}3AL z0cU2LO~#2s-R->0)ReEWfwOvbdZ>}NAMEVvBCJjO8$qt3yMz(hX;5sDYSs=DBht$Z z169YoEtO1W(uuw!sIvBiFh<2+pl&_+P>mdyi^Y%DF!6pNL$IW4kIUf3oMn9@C;VZ~ zi3Ke@ZP;svFuJ_ EK>)c^FcSbN z&a739d69+&mpV{Z>sZqG$d0FhF*Amv_M0 ThW_`&MhnHeM#D?SkQP>xbC8GhKO@}do3qIO1b~sml zrPu_tJ@9=%rDQ;2VhRZYhRj3AfusYQJ~dBP8*bRoReh-}7FxKA{J%n$YddkPqTn+Q zJ`l*=4ctz|p5AFPdWU6b+iCN%p8yjmFIS8pt#d?qRsuYfqn_c_LU78?GX#gGfq?GY zOW4VB_hOs oM(4efS%tmlFF!l})8{<--~b+7 q;9sdG!}< Z;8Qq{@3@E0kMXB6CXT>>OouLJ8R=8Q_y{ z2E~`9Lv1nFOP?QLpM%8PEwK=M%z{rcprR{Z=RZk0btd&y3?Rn<1J&{91r`%9OVjgc z 454lcBo8r~io>eNl=K<-4Jdb7IJLf}zz3R}g^#}so*hX{(E zPbW27AA_uiA^f}+EHeuZx;r3Cur|rWaHk0rW|`P60--|v{CgKj9jS?w&*dB8%>riQ z`=9DE;2cQ>zwmABxJB@IE29I>Jr?9q{teD AhOr1#njX5M)giiLiggS zH*tYC6Rah3HGRG-`&M){Yh_)3UvKWD#zSLZ^6e8+{8xsImo+73$Y966?Oui;mk0{l z$!rtB*NPmMeYFm`5s4#Q=ZZypX5}A9 &6QmKh02JQ8&vB2E13nt7iuoJ%_2}Ao+j)QJzO0;XkDD0-uUCl&gCThO|tH@ zI`YIrEZ8rW{HJ(^dd~r|Hy&*K_nDC-C<3Wm8j%IHqM$~CEf$ sjrN7eX1(w*Gjk*dSJm)YH;|p_T^*rkIIAP zqW-&LMdWO4YoB-Qv+I6uEoPUI(@C3hIX!p*^o2al9)k-j-wyvmO6b5<3l>=qvqYf$ zz_HMKQy^oW)M`sb&Xw_!Aid_Xefm86RRzuM
t!X5&9nvWi|AqUJKUY`UPg(ze3geBx@1obk`ARHeCwGTt-*#& zK~fm=8n^RLI$R#_q*rS4-A-rZ{Yc1=nlFOepMVbBSQc(O$OtK+eGejm=uRpzujHW- z_1o3;T;qSHLp?zY6_p+W@(jSdyK~mE{C^54Evz(s-hblg8| 6~DA%AZ;`;rya+;;r2u}hoio{?>p>Vu1+;$V(elT z4oQ*0j{MKec5(v-1bHZ`=4=N(1eOXL89|c8>Tq7sAVX(TGTA%QCaat_vc~3HdW4Gi z5%c`QheUY1nr^^;9dnP);ikuF-!uhz(;SO$c366eN>`S3IG>P!MZ7`6U-tg=XwU>j zO pw$s^S-bt!P-?;uDN7#-zafExq0BqX`SAtHhH6 z1Ql=pt^VGYp4*u=9 <#wb6tlbM!QoUx%j67e|e^+XH96vQ&m}3XcQdd zMm#B>Y!x7YVA>KBc6ebS@P#1r1-Ba@HFHTyl4qN>b5%qVy$+M~-2At1fgZ`_bLpA- zUETSjh4%_JE88;0{cw2Ql~;tUHEcHJ+V4}{Z{QQi6F=>9wb{|t92c#vH))yqoR$Wv z6CE^720@SnwyMzuUg1k#4dd4C8d|VPQl5d8_*dIPf3E`-f56burCL2Z3m6pYSAjc9 zW;Pndm4`=qpCC+&61`y+f0Yo>Q5UbfCy)c)UG%ITm$;HppVQK}w{MjwTfrM1YZw&o zw)4a?A*DAvibNxek_^$y#TI_pAq^W^oQ7j}b%2BloYVQP-7-s21#u8s>tk3{F|1+V zgXj8W-62sqDJkc?+r&$i)iQayWk3}Lw5t|Tw;lHf-Suy|39SEI@Hf4O99#*%_ANUB zi)c*oqUabitK5m%-q#MQl6%X? o+nEi`SRLtU$#qX4#?)5}T2O>;7mOFn$cS2%8 z{-;O#(^K#o&{7>u&}UPE2)=(%mq+(J`t#(L1P%AiP>}pcn#jI+XQ>u@3g_^}kZ%c6 z&n;=g#*;Mp?19iw`-G@f$s#R5NTsy=?X@!@80g_wXnr5;E;|k)@~6-hgzqPHxgL1m zzy~qfGZUhkN#`39>>+U6L{8jqaJ?Yl`}671s1wMEVRsYbOp7QgRN!~VMROP%^iHrq zQy30F<9oJr*IgGxJ807XL^xqGiZ2n52mt;@QK>gz@&?Z} w-B4Y{Kiuz2Eo2M)zZ?hTB%N^9kHT!ls|xLN zxK{EEugRUj)|fO-ND)I+VqbmQZ9poJMC_OftO9_$uvK#`ITMwF?WsUHhHry?dZo&b zdXwE#P<(ht0{el&W%jY9=X*Q!@i-ljz=ntnv>@zqwiT0#ByW&Wq#8+DRVzH`YY`yi zp;$>Zbs!pVASQ$S#viPQ-3&)zQR( 315z%3-fZlz1PI4hTxRTw`=%qvkNAE2FXoS(ttR$6=UO7HDAwWYYi! zvrUyqL`PJ%fzzNMJVA7I(-3dC&T@3M^ys-Hl{PpWk1nPrl9GipovxU_E-`*J11o~< z7U}Q1!a_iq(|vtShzHbpEbqwh^XuEtB*v6I#DWa_8q+u+#c@y`=1Wydnd+_wI@@n; z9i|N9vd@W+pXMZR$eqBn6r2!bcvSx+W-0YG=)W#9^ET>Rh8O{^^&wWCoXiVI_3#e_ zgQ8WRt8=)4W@pOI2YfZrQ3q)XVsqi=pdC@XR9#&|P3aYV+~RIQq;Wjm{Hl^bl;}8C zYzh_-tM{ugOrVHlGeTs7i8pOC937m6WUX{`l#p^|Ne%*a(0^>@r7BO4V|57oLQ~dFOCCN? z-pDM|-!YbK(G(`zl21}DE;eEK#B*^{4;0sw$0o%NvaA`A=y0EzYr09x>}S6wXv@$> z<9^I aLtg+rsmJfw!^F_CY>ZH 5lC$_)UyRU6kFwaU}G@ipZ61XBSFbO zt~F9T|00WQi2 HY*}j+34Q;jQ(-0 z%s8Gie1A+w^yZz1GtOyRbrY7&=f?E=PMHr5*RN5|f!MQlsmX)Y;!cjRg{WRX+EHLZ z O&Z|Yu!V!5xU}w{v(MbsKAWS7sO6hw#J%c{vU_Wp%JGrRw zvI7_Y@1f7ha%n!i)W8zzj+9bBQ#Iky(ufK(o=mwU@7xjxN<)dO>921~uvCK1)(s~Z z6HUEiU#-6yTq h#BYy$@w$x6fqFDJy< zt!XKZTkGv}k}X*J)wWVhL x_%S z=tY;e#B0eZHY IXMM%O2Pp*-5eXC@s#n5-UOO!=JVv1vIAi8+L@b?thF zIz$hT*X IE{Yl=d`3> 5gmJuaH)y(1jUaclJnEi%RJ z-!DxmYO|{5TehXq5?FS(ue)AcmAbFp8_S(kW1~L-T4&GdXJM|2jmoa!stlhdeB3=N z{k5LO(!PA*{m%{Jo(q=sv3JK(E0vxhYk%v1H7+Wzw=LfCge~`DL)CHHcWqh4sMTD# ze`S?V1g^2jooGgM7@xyjA4%5ArO`>Qif0@4s=i*s@_u7F=Kx>}0Q^48NRxvQ3u3Jy z6;nV6+{2%*ZbbN$CWpHx*TJMi9wxHZrPA#Md`lQKFX;y%`*H5fIh>_sYObfV4zF~U zbCN?KUWL;kOrlYTM}BCql_-54uD)t~d^01fas!gdpjiZ|k 9SwP9kV^VCH5?j^JDm^bwqmqoCtJ6bZi>mJ0^W(uE@ zmiI1|+C6w);(DKPp|7nxzm5$s`faWs5Qs=&RZv-WO`d{kMmE!Gqwr52Kmi=Q7FY3O z?h1^pXiCq&RngCdI8C&q{p-49j78dC5t|Ozp!+zG{^U{3oog6qdE8j(CgP#dX+keT z5_2iO;%q@c==J1YUW`A3wx;{qXQk7ag zhqst%08s499Eo23_RCMC? 4j9@EV=scT^* zRu2}0471WiRbt5THRYm?;O`l8Uuh88)+K<+ml&vd!m}=UGD$Qz`$noWySK+?9=w$K zt;|EAo8ytqnj10hWLvY!SwUkQND`%0G0-wHnvR#g6!6Y8#u#4g@9#I3xCRq!UOtLi zlP0?R#P5~khsVOI0~5C%?g+x5^E2${Bu^SMtKP>zrxyfD87YbFziZb%Wyg)bnHFI% zB*GQw_#9gL#e-QmU;VX$>B9lQVqTz*!3^Z(I>(uG$OLYy@eRy1y6;@dI)RXA*3uhP zE0kgbuN4m9$kD^7e5zx`#7P#@QRd)w4AH)Kn0PD!=Or?)fyb>NDUba1jX558=?@uC zBWNPDc7Faz_W&1%#)J_|b)W8{+5oT#$rK(a* XKa@LDaL z@nwF<0%d6P@qNN)zdcRi`j|M5fL3`u_iHCdJ1H$}3EnX@<^{vIBqx^tTsH?nC gmmC`gN9|Gdol4kf9Ru1p}~4e$V?{tT>N9$3NaNwiF{n--v-ho zF)tTK=`j$(F-hF6biIV#C-w0`kYC~X{J=|pZ(ek{KjjKIAuM^NToMsTZnIKIuSOx? zTPU|qwK@#LgI(rYLSx)v-0iG45)gGnJg;jtA|hB)nnoZq_lOSM_kbB!R>d<32IhhE zV@M)VW8K~*{FP%t@M1V93gi So?_5djiHgaH-okg9OF5x8qh<|juvXSJd_aFvWsM&>{v z0R|cF%Jz->0#AAbB`0*Aok~$hgKT01eNssn);IG(NR$#Ww7FqK0pzQHfsZucPy$RU zaIcv~Uy8LX`Uv5 i5?kh@=3K zzhn^5fcq#tM8f9Chju$^s+!xi@w781YZowpEDYoCKljVibwJU~j^^bjU-95s@Q5P{ zs{4 _j?maSpZ#+9qVn8gLE7%t$o-6(ue5NGX2ad zbleeQ&4!E7TA@!x1eNFBMuH&Tv+&Ejh kCP68o1FfBf@XkoUvBk|j6*?1iamlzq+sDZgnS=r)i&(){zB zT3=UawoMr}DtbidhMH>%tXrM7`lMj##Kmx68Iotoxr^ib32=DF0l#>E`lBfqx=XJ* zaQOs9DZ_HK*J00tK!KA4C8%}kr0#{DoB1F;%E3dCqR~0d0Bp!-H}&dJ758LWH3ZWr zaHrn84s$*P*DnBX^lVVMGKiPQm!DYnZ{l(sA=j2;GYNiBaXFO<^<_SaU~tCy;YVhE z-*+nm7{xSE@b3Wd^DQY57>1sQ&n)-LVfz-duMaM8fq2ZS`%^kZuHzhId4-v$B6^?K zQK*MHqmoLdazk}D #%-xUjGR6H)fD4-Z?~)v1_6r z0~2}yK1UpR0i&G8xVQo>4~F?629dfSL4)HAIZ z+{X)wm_;s-Fup4UZpO(pKtk1)8JwtLFs8KF>2Z7l8OeHJ_S_a-x)i|X1ou0;Q{@dr z_Z!D}u>=pYwTP0`+b#s)*uVIGFZi*rY&|^BpQVcd`RmDjc?7 Hl`*u9oU;8D?{#-sW3Lh}?kfSC1oR?%kM-~%f36UWJMx9F;pO!v zksL=Axk+QhAne7AgT*4r>euo2?#v*HL%>r5y!2VUw1b5-57;hpM)?W+H^5g(+zDl! zHj%9>M;t3aaxNO@I}*JM3Lgu~!~6TUVS7elZ6|V2*1dGIBC;CA=7gg8IG3HkzQ2>- z28*H9@pDipK)_qo7aIG^yVV-u3yRQUta0p$(?UgDX?A~N6}+#?aSZpM=CSybDdG%& z1pGQe5H8qk*#4`)sW+cc0R~Ak3X1dP+2wc2E1rElcNHZ%wpN$#T-P_|W(PR*)>Xup z=+SS!Nx8}OoBYou;Kgnk6}r(+!>w1{zEFRrU+3d*X6%&ek_y%1ov7Wm#Vj4P7?2?k zI&Oz{;Fh0B2WWItL}D1y 2~!GqySqr_IfA1~ z8n&mU?wJM2Nu38Mea=r|fZ7SG!5aL&@;UFE4XUGC58Uwy2V4r`=F0CzkKx$XI!Y4> zvU(xMf}Ot#c>@hFXMh~1V>2(#gxCw@)YsMdC=ybjqTslZJECi7amR8;S9sM_vv@b9 z5W3^F0_U$BwHqsY%7&Jom~T-MgXY=dP~I2PvN@;C1t3emFnd8BWh#dl2wFMG#ZnOu zBoGcIH)(U&oySFTgU7`?1=nb`anm2b)(?VyC&$;lvbw1S1h+N7c&AUh97woa (z)tp0+%Vu9xcmQ zBhZUqmPPz}oL}qk{k=5NQahFQ>T{iPsLQs$Q &1U#~q^0q_RT6TOf8Fk&TiT*Y*3)oG-9YY?pcq8-LZaMMr5y%f zdYNh3lAd@y(!(D0(oJQ4u-sUeN>v=`qZsR4q6o0>^54Q%1y?aaar0f``_(oIBm*%m zskAh==a&Y&x`X$$i_Zy&Qd;s0JQ|cS^>4xscegqkNIJe-F}F4bBP$e1aC;P14lDHw zpxEOl#IYuiFX3H8g#71YEMLE_GjsN66!%J=Z^lX?hMBxq+Eo<6bXx3lR_Cax wAba72KeDMCE#td3V2#@njN_{a zXP|Z82%w^8QR*nThzkI7EZQoU+rI<1$(9O`b_c(#KR4_Vf(G_awc2n#$Zt099+t5S z `nnl`f&r`l`eCt2_?o+?UTBu5RX#J z8G75gf} 0jPLY>;T)K$jegy~ZCBS_Ko z&cmhETxVOuUiPuId|_7wcy1xg3$W9L?E!ofS>1EX`r^9s37;c)xZqf0W4U mc58HF*OZmnGn?)~T?cYG%KvwIFIQ>5m*GwmmFQ~_!gm6Vz>G@ul2SU~i^1ivVcZ75y!upn4yL;Z_QZK8 zwjoS6Sf02&_4@ewH)d24u{>Cq1Ue4}WJL0?Il->j+nYTG%;twHbk_v1%(=LM2pv%t zERAGqL{7PLp+!IMpJtEEe5kOmp5(803-GGM>^xD4PQLg!;lxT0Ep$9Jzl_A?O%(eU zGQ<)DGxB72J+1`O&MxVb=;H%)-B?^99AYhQqbj-q=m%jfo?mO__c(qqL` sJ`jc}UyCA$$1~arTi_3;oL3m?o&1≠46|lw6^&t zo@O8v1x*0=h`U~+uD!DE$9+_Gm%)j{3^aUZi+jEI>Z{k8qwf}ah%S~;;K5#9V}oJ= zw6UL19*Ckt_{^P wYcdy;HI)XcDKBy zy>Ql;8CVOuP6K *kW*Tbhc38`M>tBJ> zXF}t(*w#KLbsorLCwQOFe^i(?(TaoqL%8jOV-1I}jm|^Q&IZr|0n-6ClL}cxkaV%C zM*9iklA$MDnp*s&+bV4`nCm;Kvq1dJKpXfF3G`tJ^rU2f2@{-)uW?(zn0B?61>aq> z0}C9q;>De9P^SzCGW^**2CnP&QI2%&6RP+{lqk_zYU|KGk7Hg}ZyUbM3_Vpaw~ALZ z-OO~p8e9)v$7?|nc?0}^o)k{(-vnrvmJ-28r|1^m8kg}M-_*%hQMKAqFw9Ob)}v5e zG-l?KWi=7!ZwIRa(%nlxuTv7M6FpogY|3s|DgvLPP{3mgDM_?uzy-7rc-_V>wY2 z^8nU;u3q7K5y37-RXy$HbdUH&m|+J4X3fUFCXmU7En_K?2Eh6)#rXAII6Q1od+WPi zV~08Mab7`Em{Fy*pHF~)Se`|B0$1}6n_;$wU5ZVp5tp1Q0DMZ1DG<}J?w+l5Gu1bW zXw$0ZSp^zLf|z?&T3Y$OZ#Wz|ditt`LO(9~cFYv&yi2 ^k&2LLLkMs$&9&Vr zDA2xBuw!Kyc;&g?wbFHcz5B8aXe;8J#>}MqGA%crI7%B&)iXhE3)DgSWG4E#o?8<2 z;Ai;}br |2tg$5=!(iwv?A89lDhtTz zN(PPycr^jAZZMQwef-3+p*Z7*^Nl>CJsRY3xJ=Sl?)OPP<3%?GT6Xuo*#2E>U%Sb? z8gX&A56cDvv6ropIU+%VQvi1QE^nXxR>$_Emb -Z0nir;qmtFShm1wsjmKzI*LEOoTaZUXUCDcb`M8FCHF2C{KLQ3UE;& zt(nj+Dm1nMKfN6!KadLkx?{HncaDxz 6x>s| z;6c*2m *2B=>Y?Uu_9*InS(_-78w|S-;u*jqZdP+ou z;gH*LSB5Q?pdfUlP&pt#9ajo$CxK7_Jo94VGqfK|pW74&EB>7oinuX50lvyf)U7ZD z_JK~vJp~LK?NP~j$Hwn)vH+|D_JG7sRo^|Kw|>`dKq}PH4p5Nyur=9;O#w3)jvWvK zs#23^!1k44U_xE8ONsl$ly4g}ZL)Lc<%8_`WQQJQ;rFL22*C*uNj2$2V(46RFe@Rp zW99c1Wh_qfIoL0091EjA3k1|y8pB&%Pxqg0g`xB>s5(TOeein#2MubwEDBtpdT<}# ztgdox%M%gOR?KBzzZrb#_X`7omPfUK@KinQCYJ7|$9dUT)(`S&_Mv1MAYuX$1eASn z)X%$|U=FAeC>}hTZi?sb_4dBFw?p1!YWLJ8gp|k$oE1UF3yvKD=iY `2 zUhlq6U4VFSGcU}x;vyeA;yc!tRaEWxeU5jeP>OaLUdEqW50r}QYjgfNgZ4`oIFz<@ zg&xf09$?%)E(kYv0mK8=qQM%|xKh75ttk`?SXTwU2ZEj1wENh0H)AoMTd7o4FrL2H zYe1mj1S=q22 =7w*D<$sASz@>Ti@^QOnx@jIhUhW@n-ZpCN&Y> z?DJr>{A+2^)T+Fao;0Wx-|uyK^*rpvVpl}MB!y2fqL9^qc{5;49XEWWQ#X>b3_dS& zXIka;fqV_Cy6r&=pr-V$e52_T&G!` P00mzq%*#Bz24W$H7TulENbU`7K>kY%8(S2zd8d9kjqShB%%x`Y&% zPa09bIwNjlCnFcK1&7eZFCYIQk(9z{cfq2Z9z2J8vr#WG;cKcLNI(Q9TIAj}Loy$o z@l5=_+-Ig&|G3jDoDM_p14D8at_$h1&`gihO-{g-0{ Bu7cVEaq-T7Ol &!8>qlN4xt?I2uHo0(haZ zVhY`5DmLWPBemSo?LDezJPw5QyuO3GP`9Mr+{&ujqtkEy3?bxeT!TI#?gkmDr*O#C zH|Gh@cok+)CpNgn0*6@BspdtnBLW=wAUROG6e(el<@UaV59Ts_T(cJ73bYB(1??J& zjH59X5R$0B!o*V7Yn4w*&v*npG|b6zwr?7n HU{$~ai1_Go#b5|yp&)G zuMKR(YULH1;sx&Z6H6t1CT>-tG{5won4z(C8B{I#Z(6h$LCnE?SyxyevWoiiiOI<2 zXeyhHDTia5l3)v#)hQ7s{NGIs&(B!zSb`+@&GpiO8$bX?H_I?b>C$|nt8ZQWvS$|P z*YRQ!#6v*YOB7Vsc5<6KE^tsbH#+n1`Iu!Zs|0(I<4~m86qo=pd@3XJ3^W*(S1$ZU zeA+wn;qSE6i=YRlUw5u$b-8Q%dDwUVyh2@8lC_lG-kR~Z;0Nz;e>7NZAr?cdY3+XJ z&sa`;ET#^B*$kPc{`4(e5n?94q~7L`?WGJyPodl1JOV6$VJYfg;OOt=Z&2N~JD8FH zJI3oA3d85v9VwE~OmZiGKLE4Zj%1hnh0WqL5QmuF%h`0Z=mpC NIZ4ylXUWnmQ=~c`g^v(e|TsWn)?#G&jA!WmIJcGAk#c19-|h+*7DurNt`dT zf;R)Afbw&(1b9Aq3la^_yns4gy-;y*6*$i&`(Ws|Uh1Xu=3VwI Ghceu|b04ys($txnBgpeCvo3}=l$pakpvEm%BUQA%6QENzc I4+o0?M!&n|2p69a7 zmBy`fL3lvuF4~JbQT?ZmgQSR`x64Ro8VjZB|!T%Is=P*5Q*4wUa`p=n72?EHNjK zU)%%3bu5TJ>n9(-Rwy{BOIB$^&+%N!$ZWlKi+p?h-7YwxfohZ#q`3>6>o ck(w7S!iw^V@-kamL| KA7^{5E? jsC5iIS7a(1)yE5? L2BLAZ3 z>`*^pCTy-*jJm3op@IMDYQt4!wQvuGf+knFq9?Y)ZfD&9u=O8S(3jd%0ZL+ah3(=r z5??_$N48hXQV+;sUxbxHXwRq~F)ON(;RV}^s_VB3i5f&zWZglQ`RsGqUUGZbDU3Mg zn>$;RF7DyCZG=$W;D&;bUzNJyII4`;1YI@@i~VJ7V|P$NBb+NwQlN(4kSn6~t`8`r zw`w3^EbjV3ad5HZT0iW1c_JuVs3dc;INw)x={N4+Zvc_g5XMlnCrkND3^mC_<0{H^ zj9hetD&ylCbd4b7Obo_FSB<|ynhBg~BWPxxV%ukykt$Y*yac6#Jq!HCELtMs5c0rC z6^GamykG2zC0RB1Dj@@pVMmquOtf;#8R}p0eFkvtX5OZV-pWiocP)&q>pFd+6GLT9 zfbtA(Lzl?<^^_+bFiiQ&o_YpI^%1VIrHma8RP|!bYt@ulSi34j&MteNzQzPWbhdjA zI#`DIiC{1RhsyZF)c1=_JQN%8U5636%o#9Vi3untIfhRs7VBTOs;RsdA=z^MCHnw@ zKjJh3gt1yY-$)|XZA#5|*MSV368=ceS=(Lc85;FP28p%+HMnc5yJB?>VM?QkGq?1d z8Cg)2L|YL2I8TV(H}t0gO6%8523dhYtb%9SV3R6Gam?NfTaO}DFDe|K>E#}H)966y z2rkGZTyJ^SF3FZSbnXMR%N)|Q2U8_m`*wa3*iimK?7_};dSR>uTkX{Mkk2Xbe{^3_ z+YxXNp&9~T6N@)%)$k?DmkHALu?aEHunk?br`2)bMQCnNU>oZ~#Y9IfR6)RQ-I%HF z2(5gX!Q^)bjuwVZGse=S@?jLew3-$52)8q#j);qCe@{$wE0n*0VCfr*jGm+Pg^dH; z{#L7n`yO8`2i4}dkk=XeTQ&|pqI!HcISM(T@`cd*!ixluQf9)BHO1GBih6f5kdXtP zDy+{Ll64>gGwMMNQQF@yy7cFa6bMn;W>6N8H~5fXNqS?xej$yD`B#NbBgA}<2=}lL z??aiD)~vMA*?#E{Dl83MCFJV}1CP$9mmEln!lk#_$djp-)A|VtsGHlVG=R3K^( z37l&_l!iuQB~GLhi)|dCQ=%+bQdqZ`ql{Z6MXyYsw}tjK0iuA>dv|PL0%D+ Su)uTuHi0*dtG>Z@5In***!45vUrE?;+jVbm=ak7y}z~ z3yapze)xJdkY=^^*b}sCRIEPi4hg)W6-a2F@ikVk*N_SZzJZDqXUk=npk5#h@`B$} zvGN3HL`t}i)GFlA*G2$iiJF4Jq-p98mK39I(44+fmI#QtP<$4#=?jA)dN;L(;sE@m zYWNX1$C9lX5K>;SZy@}1#_tU>NVJSsQ}1F`wfE;?VN)PIrf;-cLSYv2^{MG4S3-Gq zm|<>OvaEI)LFtsuDmO_~wUoy?pI-(m&F zE*JGZrn$ zb2YHlN}-syQ4fZgxn3N>dM+)Q2T$TW+$#0X6V&s4pJ z3Qi401gK(aqaxFJDatR6Jt5?915TeGg{JdsXKi<{(ByJLF4&Ne(&@%|@7!LK!}9nE z0pyGPNL?}) 6AJPz_MF}p5#U}fL%moZm&-A@oiN=LiWM~ze zvM6sDf6Xy P7R?rSQX{5fOg9kE? zHL-HRP{hAQJWv?q8zCRYM=C}MEfgv&b_`hAN|^}yU4$=k2M$vAtu#yezsmW}k+U+` z6=3w_0`hruR06wO9(b>2g{EBk8qUve>`&kE?xmQc3{sA&y1@GQ$M=Eh!R-~wg)nfY zMh*M%U(Mudf=q65Uy$9Gnx{@i0O6yoTiUcJSkyUn`mp3uOpqFLzs^Qo i ci=XJd`XDEC1$T#CZqg|TL|$xzQUIC zT~v3ti09^`5n^a?imhAG7wwv~4Pz6v=`mejFuTW2i8e_rqJG7~_9@J&Dgg(Ywt&5? z8l)}&Y#gZfqPY?M^8O?&feQ9W>xc-I2CbEf@#23WD@M$Zwp )gl< z5$j?ou?Q{w&(#_K%m4nL7i&b?|8FWjVt(ttZOQ-oY2 cK(^1G(|AS}z_cy`(*8kuc|9wYcehU_i|55w@cfb92 z-TVJyCtxPkzaQxT8=deQm{ct*fk~3FKQe_&zh1;K!~)6mD&Flq5QIV83OGP HnzQ2WHu+Se(qrP-+0Uf$^#avRsW+-+fGE2Cmlt@vsp=zc!4JQ#nJ7naDY(prZw1 zZy EWaTN7-3B7GdN? zE~p0PjFM#X8cmkosSE&5aJU)}LFVQzX!Rjf26TUSKNK*Af6B7ulOVsLgW%GW^VOx7 zhlU}GN=|3^l>qL4I~tHf&{z)dvjC9`!gLM-WSww&2 jE>szkDn@W sF_#4)tUGL J5UI)r8K=%Jd9ofse)5E{0Mc2*TFGz?HVkhbU^9qXAV#mw$9La>?G&Cu-|BFF zGG6Og9AU)mb-yd)&VsMQhtNoQ1w}|=au47l?)9i`sHi#od1?Li0vx&Q040BZ>aL#) zYV$Y^b0A07xt*UPM!8Y(|3Ym;!K`o$!{mg%*Ts+=_Zs^FV9tQZ1Mi+na;hsdZnIfk z3K@b#9*ZF_PfgE1^yEQT3YbhBr9rc2{-Zp*Y;~7537G~f)K>sn1d-m0;CLFS`Sgi= zm_MG+63TO;QdqdD>hw5~qqg+R(@bsaE1^Vn^-wG*Y95(~d|*%C?A-*+=RXZUsM4(p z7eOU{Xn>SaMXj~V<0Y$Clhbjta$9u7d`ta|!~?glgPnfImDpIITL*YYK7jgv{4RlA z!$HWh-Cz^e@<544fkbmFoNH`NaHBdcl7~qFSrC?Z%0gHq*xSPH3ns_*d?-{^u$cAV z!+}-P7yV8=%GkSRsEy7W=(G*%52%EYkE KejQ09`HEd^O3p zoll5gX#?>mDzmAf_#t@hO-dH8uyp5KG`g;>(dCVW+=WOGKbYtoYg&!Fd5>BjxZrgC zOl!zXxP^IkDxyil`YKn;#`mC=hS~S7mV|7#6RDAE-q4Wy%%2`mgeCkwjRkn`@RWE8 zxsev66hfF-IB5?lw)r35C{ZAIfmnF%5>gh|cQmH3 GZb^J8C*g zcNSy{n1d+bM_8llJAgtqna$j+WijpuMD^IDv-D6I2f8mVJ}lTEmPZU>3? BX%ih@I_G(D- zSC-{`1sM_uqw}fAYAoZPJ|Wo w7 J58_EWExjWHVsDAiMCzJ%(NXPMjq+uRzdh4~&2F&7g73d1C-Xmb3 zJ%14_VSZtFZY5o`??c^Bx@#Ln~6e^kcjT5GpQtK0mTH?!x^c>$7%p74)Xt#!zGz z`)3x|4|3|4Bjr&v&mk|P5h!kHTz<>HW8c?`M5dHs3|VVEIi39o7t~q>%Kg7S{md%- zH?dlq6kh3-f4*0<|7QYTDpBufsQ&{?K}|ZcEXV^>%3jJkj(VL56LZoF@Iy_wO*Nlq zsNAQWw7#K;e!a8F|F`!h oCcP!9~cAxk41O^Km8?UXL5zbABYMy zmV2Xe7z)OdXd2|n@<9F;M8FiwF|x}7od4uw9IqJ6o}~jso3+He_2khFGqCV12XB8U zfDKbl4}%kCc`-w}3vnSg6DL7FzWPtj)} a3&v5>4Yl;img(49LONJ!W0J;dFyZRl>wV~kCX6%1<)r!tuz3x zk)qo|cadYE?;ayhJyQnkG_Mz` Date: Thu, 4 Sep 2025 16:30:37 -0400 Subject: [PATCH 2/8] update appyter.json --- appyters/Drug_Gene_Budger2/appyter.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appyters/Drug_Gene_Budger2/appyter.json b/appyters/Drug_Gene_Budger2/appyter.json index 6da7e8b6..18941129 100644 --- a/appyters/Drug_Gene_Budger2/appyter.json +++ b/appyters/Drug_Gene_Budger2/appyter.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/MaayanLab/appyter-catalog/main/schema/appyter-validator.json", - "name": "DGB2", + "name": "Drug_Gene_Budger2", "title": "Drug Gene Budger (DGB) 2", "version": "0.0.1", "description": "An appyter that retrieves drugs that up-regulate and down-regulate a single input gene across Connectivity Mapping datasets", From 1e59ff4a473da156daebb1f8c0db82e777ca06b4 Mon Sep 17 00:00:00 2001 From: Lily Taub <115661359+lilydtaub@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:35:42 -0400 Subject: [PATCH 3/8] fix logo filename --- appyters/Drug_Gene_Budger2/appyter.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appyters/Drug_Gene_Budger2/appyter.json b/appyters/Drug_Gene_Budger2/appyter.json index 18941129..89f266b0 100644 --- a/appyters/Drug_Gene_Budger2/appyter.json +++ b/appyters/Drug_Gene_Budger2/appyter.json @@ -4,7 +4,7 @@ "title": "Drug Gene Budger (DGB) 2", "version": "0.0.1", "description": "An appyter that retrieves drugs that up-regulate and down-regulate a single input gene across Connectivity Mapping datasets", - "image": "dgb_log.png", + "image": "dgb_logo.png", "authors": [ { "name": "Lily Taub", From f5d6195007733cf8d0e6f9ef3f0187a4876697fe Mon Sep 17 00:00:00 2001 From: Lily Taub <115661359+lilydtaub@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:42:45 -0400 Subject: [PATCH 4/8] update logo size --- .../Drug_Gene_Budger2/static/dgb_logo.png | Bin 35151 -> 231415 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/appyters/Drug_Gene_Budger2/static/dgb_logo.png b/appyters/Drug_Gene_Budger2/static/dgb_logo.png index 9c3ae3906c225d464e3924d9610007243a22ead3..aaccbe90182cc262fd390dc56d7f8f299c32db5a 100644 GIT binary patch literal 231415 zcmZ@=1wa(r*9TmLrMpC8>0G)yq`Of-VoB+4=?*2OQ;<&SkdOxHk}m1)@LPQGfAPKD zS@!PCy>sWBd*+ QahWHfvHR8RX2?GPGZ6PkM zEF&&XrtDyAYVigF14H}HI(CFXLItO%jXi@}ys9EAPfPX3JCeAWAry=LRnFcR)x~B) z_MH~{h0DNAg9?ZsgRdWv9D|8rZfsC|Lb|GLr&GFB@P{v-#;?!zJ#Cj9-)0%HnKHnn zHTT3-vpTy&G*DZz;E_6hNY+_2Fj^8gntZu@!}t>qme)3T!@yf_Jc#D#ba!=aW&KoR zrMxY>V>{An^e&5}is15XJ4|KeE^D7>S9+QlCaLtWW<4#h#!4J`M2t<*OXj=b#vsSB zU}a*_c(wE148JC4fc#QoA9#5DO~HXEG3$@yEKOGNy6Yu={c{^XLsH_@UJydeqJ)fL z#XE9EGIV5$Z=ueSs#5DwzDs2vt;ZGBfMh==YMh_&cqbH3*7!u_yn->a8eHETk$lp+ zY7@DQYr_OPBqi3&1e-0I J%R?x>O_dPjH!YG3_Y}s z2m=p`1@i>jf`z_eV2OUM3A6 %BR<7jT{6j1Uc0lEWd zC#~ZM1A~nH_<@B QM#Bfky%Mb~fB2|S*RPuao^@ *=x|~8t0^mPILkLM1RKWxTBLX8MA*${MyVs%<_gu!~BYwl7 zh*3G5<^GP1OWY77xbvM!{0nx9xIq(Y_JzJYU+HJ;3vyhm1Yn*{YR{6{g*PtK`tUf3 z9nk;>gY)Lh9@jCYWfM&}X&eXl=SN4J0-y|R8pW&B%qH~vNrU@IMPoBK>ev6V*@1v4 zdTl-naLZwL=H4p*+3y>NI6qGS3oQ13Z9E?U!AhHu>mvDfz<+HL?QmI#PyYK9UjU3S z8O!L?Nv8jCwXfmuV7$?j-va;ttsO}H8ukd_Ti?p@pOaL;{P6tmD^z5GMSe?j)p?%( z;lCz%3oo+t &n6zLF)+u;;E5jq!twMQR`YbK@eFJ46>z`lebi5clLvw)*MdJcFB zd?~nJguiVoar>rvbV(FM$#krI-2_@y#0B4)>D0|G+|SU=YrdR|iULUQvlAQ6@=Nx; zSM6369@8+LQbX>K{v5jZHH2trJGMueKj0NdAN4RD!x 2=o zM}NK*(8Y8zTN?KHQ(KYC@$Oub#~Q6uT%m6qg*YZDg<=h%WNjQRZGi`W_?kFv-kZ?- z7wY)s0zqqgJb3#1Xq?!&R7%H{m~)ihZQoB{*zv6&NXAb*yi9++%a&reIc+T$Tf_dZ zd&I38AON@;I=LK$a x_ zl)esYmDCw1UMOBNFHu4<`vxn MxR>YnfV3{CSs?f zGB7q=P9#3L&|{5`OttI|gMco#VS2}(RSKi644K&I8 ?el4MNvv0?x`mJw$ A0~L|TvW3_>dlRf`pr>iW7g?>>Bs6tI2WrDZ2HA|b2OI&EW6tn&dsTc1kTU9 zJu?u+7U2V%t3%z)fMBwt^sTV+E8-PK`n ?dY{oC4>1I 2aq++
;b=eCj`{Ea)hkA!KskItP-kN)o|f-Ic{= zP^Wboz)bK;e5roR7qGn|0J9~nv}U%>DwsxTkQhi5Eg 5QCbN{Ju?1~Vf%1nc_4m<^jCh_A4 zA7G!CtI!eMXlzsOYE4BB^}cFC^hU?LIUt8yG)g}7=MW}}?U?~fw8#*>$V5`1b7rwH ztc@`KOej9mCsT@{acI}>rj^{ku(JkPbPbx-JV@OZXp)~coYI(YEK9DAmET~ |OMB+KF!iSqHUON$tblvKRVd zA$N|&+Tne%qm~pS`tY$5xYN}foM&9mc0Li^C7s@xUBA;fsn1q8uQ;mX9^&%-1|~Z7 zA1c26@=^6(qI?g5-ormanM>i+BAAURS7aP71r4tb0yM9hf_}KJZEK$Lt{h_g6fz_z z?nHf(U7F9%DDd%F!T3{e80GZSe@Ax#V;;biX$*mV= zVuDA`ej2Wkz7xE(@afWUj|i~}#CEO Q?j^?2D)uYcNlB@Xm54 z4)S82#yA;1^)n|p5dbX_b`aiiWKN@4=%86jpAhJaWdk}ZKySJ`34-PC({h!kg3Uu) zYEFz5#iJ9DvtuXuqj=i1zS}|Wr{^uoJxN`|(>ea3rTn r9OsAJ@1NRUOFf~XufJ22$M5Z3+xQ7?z@{fi$^o8Wr}cN*tC!&$b=6nju-5Z zvx`DE)v{(J6_^!FirR%yJ;XTW$Xp2teXE5D7+Kpo#;+g~c-9#kVl33ji?c)!JlH}e z*I{JcTVaxKVV35O4#_Xv3 (PlhV7g#1R(XeGKy`*y)dv2B-V^A>;^dt|(MdAorWj-2xi0a5TY)CbEx z?}^Q~tU&58#qA vb5Mtv)iWckp)O_g$y1S(A(ozA~ pC4e2NYoe=01>K)?@AaWM#Nz4tU+~62;^U zzC@MEnn4ySg_4Tuc%88pa-B)WBwY??NsBukCu|`7+V~`O$T`83`@il_kt8UM%$NmG zD~cBNRw4z5RV)MupUctaS9FTvXY1$wZ~(UE=Emnr0h3sBv`OCG`jS?)BOrSQ_J>SP zDN)sseJ?C^=Bh$r@Xy@*JdgVxZNF>bn-xXuWv36qH< Jt@Wg%h-^G8m1O%I!D(v(6{TX5wwMancSl%w{#zKZBe7FEJ!TcOX;fgw zr&M?^ym*42$)Ut66ZmH_V)6E=%*8>BhE)p5cf;crnx+;Th{-w<_8Kz#cfc70v;P2^ zX*O^~GLT=0y*#Mhrz0TvZqbZ923&b_3s^bC*12Q7yZqAc!cMoLYzh3iBuPG+_C|2w zDMWnVbe^y^5!o&`L~;3b=Jdh$C~u?0VQMxPC5E_J8(@Q3A)BPw1Ec=7;Q N1)Eg5lmsZ zJ7WKp=HTbpmSr7?5Xn$Jo?-3HV+=$pFNfD@!?w~nCL11fpcXfcGIQ^674?+e$?*G& zxdyEP%)jGtzql9ecyDR;vCq$w+n-UB!GiQk4a}22j?wE&S~rXc_!{)B9xi&EqF+v@ zw&~1RwtlIx%{XCq8``H?LBFSDEL5$QW}=Q+`3ATE#a_xMn(=iGjwoN69@BO1BUyjQ z_2$IS-m&lza|Z^qN|D=d`~7%31X$r%p}ee+=#`1@kqH#ifs@^f+sFzg=s7a#;FS;^ zQYdr>nkCo-iRoZR7n2wn66U-rLHXpuQ`VB$$g1~pf9J5WY-#xK_ucXpW(EB6@$I13 zS86*GVBQrCY&HXqx%noMWgn8MrV` L b($L%dnQQ)2^ML$^#M<|kInHxP=CSZpmMo~DX@)y r9wkxyz*>A%2QTh={k6OE_q@X+(91n){?GYmRRIJx5_esQ4=iwQDUW z^g8=(F9%DbRBJTuDeJayU;nl!UANRjF~VKNr$0N3E05kd%o=kJetAGqIl>ZKf$u<0 z23RH^6OK6|203D($Rue*M|5Z7arH^ci}9>?O~ePk2tkv1m0eb#xO>M*+z|in2jBj9 zhC^MU;_iEOa9IJf-S>YiXf1XH%+(y`EezCffXD @dXTVznnd`(oBP|M)KaK2
IERC_r(tJbhi_ul+rx8`+E~5XnMEuVMRUfvv6ni-8|3{U*TyE(sVq zO^Q{_4*wu3iz@5EKmE~}B1ZCSG+x|~w?eE4{wXAOHEu*YeO$-l>yc&nrHFA7PK`oG zRpuyGZ3Y*vasP#+t^9H*X74SRc>3Z&%S#9L^lS&t?|PTso0v>Xut<=w0#a*KrK#98 zYx-`Xz}?WTs^rPmvGJs^l7T&!02E$Mo;+1zRK1+2h(I$S^nLxHkh^D5yU*H@mTLFj zE6l%gj@6LRAyPTiPJ5Gb;(Ks@G@wI!w%%IYnG=OKgretY-Qj7|{Eb-OkV$Y8t^wKC z^N0b_SHxQhXfCn2_0fNG51ZYgv4N#Kvt@Ru3oZG&y!DKFu9I!b7hUUf%Co`COQ60u z3BEEzA}0CR8E`*~dn=Rgc=nxE6QQt5yB8}>O1u6Nf}Ydj2xe8E6TbB4Y-P|g%bI!5 z)i7;YdGrYsr8inTh~r2w#-C>e6AxJBRc_KYXNG5^5zmofc5hT=>#s?e+=OJ&{KW2R zu?l@l IH{m^SD@4lNtbK(!uq92 z+bP&O@%olpMqc$AW#wfckweMhE5xuoxrMQmR#!`dj+LiU3deR&M(uz NRcVLSwzU`jX6mpM$jAch7; zo}d?ZQmIQY`RCkV6Fa5Yg$GK=gvGg|=y2zp2eosH@emu4I#ZH?=oKBl6Szdu5->bd z6Uuf+mKjl&f-^3OmwyFXK@=)MlacbC`^I91s*~}pH4pfd|716ZPsl9 8Qdn)Qays)a@n`#YME+$CynsdrFXLEDsrH#S8ry!irTGp z;c`xL 8PNObVrjJpl4-73M-be#*r03Ay>U!ld@2o zio~MAwM=#>i~jyBr^LhBePUOyhvePG+#DJG rN-Vyh2bz9fhczNXpLevpBW1(C65ucVv$Kc8Hg zI+zXYZUgLo1L%|b-L>w!0=#RBouh97d VUc!uuI#={ljGdG45nnMr zI9TcMi1LIGxRFGNp}rIf$SEKnASxnG40$E5jV{YV$xLpCQmf=%rK E)O6I z48;Oa5d>3wi-n{ISApKF ovl*r*}HdIbe7bXe*50Q_f%>!o_~+U8bnF zWd9eG CHCgEDzuQBq(lRZVR1B>KJIiED*AJ& zQwXGHBu{OA(iKwT0O-VIrY*6QVAD+(^()mFu_5Ko5mJ}p=dr3HNzF=)&~mhx8yMw# zg@ =41nER0xm zaT-Q71up7ICj>hsr@V!^2U$A-Cuno)a?|4> RetT4Z&*S4=m z0n>Qk^xhSuPQfP~`qFI+B3Buus=Vy~Bwb9p< &CL=J8h{>{q<2NClWjM$8goVIjGJ zRYdBvhAJTAN;Y*Ly0{-S$ekEOlctCP_vgkC$bPD|s=+CP={y!qb;~H1fl= i(!*_}w}vEZ>5%6vy#8eWx*DsBTJM-{Y^6Zl~A4 Wue(P zz%t6*6rb>?)qO3w!syPvu7GLDnouE>_dt0J?5F@ymT`&wFeasnh@H_TQ^gZcq1&yt z%gZ_8 &x+{$_j1&vKb2}4+M`D8+1e}SfLepssc7XA z?F#a++()UQzAux9-xP$A3gX}7jGAfCQ1j`gXT-ceSZ;n7GlIbBXDqqgoq-L}b`Y@P z8%b-8SS&9ooe?bS`b1nr40*$RImxt|+uu Mcyhy^}UjKTfAffC@9*B{ttFu92K-NAw BIlWoW<>W52J1U-NDDz{ZWzPfP^!v0#cjWo~K^lp$g8>QrQ9h4FFIVIeR)StrLnU 8KH?=AC0=qyW7dpJ3&s{@Alh$5%?)&gI>stSC!+IVO+Sg6o zZtnrh+VNz<_Y=LB&rPJ&w8AuG!LiS=WcPn@U^{`wU=c}X+{hRpn!``@x&L#%z?V)K z)7wmCM%Q(N@7oyycM*MeL|!Pd`j6=yxH!a|!QZYwrdnQ;!UX^lZ1lkk5qsmWU#fQz zgjsioE6?`FF>5yQrE^w?_j??>6v#7t7+Do4 &XbFB@&QaAnP)lf$>L^I4o)81(ei=m!E zULsBj58Z1w)OQ&m`G~F>fk^U^P%rWL4dN(C3C5gEMj|S*kBA=_M0e}?qHwTk%OwVD zqERBGPS_%|zZEH^SG -BP;A0@iFv)tSP6ECFNn*{ zh~ fj|SH4XEzpyBlheneNIEdM&ym1OY z-lnB6YM^sgXWgNH$!}(#N=g{O#aZ^*OGNW1N>gs!uPF-6a?<@zMP4oqwd@RVX9v`F zbHKgxs hPz6Y>;Jc{EWhNC>*mQK3H*I>5lSd2BjP|KJDE`9Bp zF_;Qtda7vpHn-yCq5}Gim0jYpredF>riN}#n*NB!sD1{;@0_sHeaw}XW;U141JJ@m zT0_yj`ZQ_${Kwoa_*sZurLi?@%a6iQzhA} K$y_N0>iO>3L^J# zt9*0b4Z222iE~JP@6ups9j 9 sd taf)ReY@Rpv`425&Zt0Z>TMP7r0~Jl;zCIbA!9}G! zDO%d(A8VUV#vu!QC=9~%wBS<>1N-NdTVXhcDr)BO?#{JDH2}$>TH0efKReXo&f4db zUFR-kYbK_xJL{rrfSI%Wd4~;|FXDGi;l140tro-NXc;}3-6KJyXvm#7C=i80!-0{P zl!@8jhz^LSf@+?h5{ DAY7x9!w+Y>4Xvu9uc3qZNI2G)yp6h3+uN$X!WvGXx)FlWvci zpBH=PB(2}%H_T^@|1LI1e8A=+?dscSnyBv=hwcv4ghdt(cr97V0>PzE1sCylT(4z4 zYlusVb24bgBDAjgymTq(^@CXsks|K`xv_|-Sjvt&yQ4n=JuxGg76_Ss6?zh$v_3r@PG+9>_QHj6yGpbmTR>!;EJ={NeV zs=dsB5Nb9BVH9%3)9ms&6MP#t%IN6hYP$?j;3H0`X3F2aI13R1hO-AgOIzjx16>P8 zJxP~i0#lx-fHnc8@|eTR&LuKIS9HVT8-^OvUJ}%ap<%jVI*CCkOUlSa>jEKISP8;k zc}&8BWUY8kdCqZ?q_s!vX^-vm&arTEnfH5QO{2eLXS$k9T|3`h_j|6ZXF;>yEmGzC z!>qe}e}wJZeI6qfQauppvVj#uz~v_%D@l{>eBe7Px9&+y#Oc 5AD?@IN&U$z?vIr~ zuiaKzBR?R;gdQHm9&=HKzQ{Sgc Ch%`Z+w1e|>0F}vaY zK?7;P;J`g|aUbI-kqBJ04`1B+D-`#r&!BFv+w79|y`ok?%B^obe?ddR)x;FTmU39I zN!JmiKYw-`J{uL3-jREfxAiG{_4-74xD*Qu6P>#dvooIV)mJO}_o=iI+-mNF>G7HZ zdL%sPIOIXiy{|+N ^R@oF--Wp#0P2Q} zAM@VQD=d4`WVP)S#JIj`iT&K_%9hTp9KQc&p-D8I-|)x{iPk6$&4q=X?AhFpW}LH= zOLNZZ9&=bd=1n|-X;aH3U3tcBhmtqkW*ieZ)I=>9 7 zNx&%{U!vMvu)i8~0ngb4a&$T-l{d~EJ_v!V6I$1J4F9MRuv-QGIM3RBx&cYo&7wb6 zeJQ5bsEfmJ_-tRlq545A?Aaz2B_2CDX>J?n0n_Gq3?!=TI}^`SuXsmyYu;N`g35ia z+WB+U MnybkGWui`XH8GOfTdSbD7B>@VISLlpGr$h2%1ao z^wUm**6O^5TY3hqZd!U~N!kmD2Ky}{>w#6vAm1X=ib_si+?l&$w@osZ*l;W9z?fJV zH|eYlK}#S{(1?uPYuZ-lq vm=;}$cfOja28@w-?=n?T+IG6=+%?N@j0ORg;7sL~SmKK?K;nEVu0Wo0MHG=Mx z)Cv)YL3YZU@{kJ(#f-&qb^Q*k5vwvK)|DR<>rQkl9`79HJ_yp56kXt&rFwr*{2f8y zJXSr)?Qf?;1yxbN&x>>jc~UM}9}b}b7d1*}){=zLnsbTShLbzfhN~{anu|Nbnltm= z1DIhRmFTtO2YlJmJsSM|%F@(5QUdiIcdI`H;x$}PSo=ZK(1EAodM$i2TEZpSSpQD` zyjM$rj6i&Bp>W0po-8>NG!6 H z!AO`uDwGWJv`hl#4su9!-bMiiZVwd^h)glaZ6 k9+(ue)!x-U5qvpsLqdMFAa&Ff(SEtV zYI (9pdApq22N%R>_`#8zB?h#c=b~C zVt5M|6eK#3V;wSn*bq8R*n%bXsAHC$u%LK}PuSJqoQ@g;EZ6v;pXY5zeB@u#{c^KW zLg3-7InS{9O0t>pp7Lhl>r(qb$6*r6rFWLF%;lnd*eM(DP{f*Ki^PfQhpMH6Y**ug zD~jX%KWjqL#NZIzk?G6LHc;seCi7P4NLr)KNV4Y=h3XaL9r35|0 72Dayqlt5z{i(o?+m1|gK_-P`Xw&p{tVX|qa;b3SZ*djx&ag3z0`=Yir3KDqr1 zP~Dd{I(>D6ddbcW)AA?n_ctdW>qCQ v!f{prm;TBQg~+C%O8+j!TK zyHl&%Vabmt8|P(H5!3Gbo~es#94I=6_N+1F&XgoVou}dT3?!y$B^eRHv(gQ5Qg@!D z!ZB^31Xp+;gOdncyfTi`Ho=r-* ;?quq z%NW*lq_P)-uG 5vKtOa z$0jS_JH FxMR?i_p|XYZnK1Et=M?(Z#eR_9Iq^b7HNuK z4lZZ~pDl{-HT4kt)FHNI?+N)Hcz4XtVec2N9XYssz^~R33-h@dI4)zr)+n~TBTx2c z9JZ?~GyWYT|0?&D@@vo1>JupU3X$XQh<(zh{!peBtf{P-@wu7n>upvrDf)SrNZ4Cm z9G%3#0rmINS7}v+Pi5HyEmJuTGi*;+-AU|^h;y 3Qlcz#-D%JF%p+|X6e#I@V3XK~PKc2$7rNi^m83|Sa;`#wIq#aHUiDzNS9 z^o>3U{K}(m>^rksGtRMapkPbkhJk&ZyZyNR`o_r>VdAU*!N*6X4)XItAa=6$AdM%} z?oiDgJM|Ec9i8`JUSycX$+n{jCb0_NhIrkH^8M^j^G%z|n3G{f&uddYMJrCy3JVl& zZwu&NhDdarA_i;`w5kRZC&9~dobdz`%kfY$uPB3Zy4o=nnYTdd)#Cf4?Q0la&Vu34 z)OF5CgFuVTm#oGGKE+2Z(r);upOQHi5`oR8a5q+#_gLBZ2rX_X4g<8#=oNe8JIzGH zp2mK$*)811nbqb!;IjfP&fb>;@N?fV!upPyj|vr<7fZQ#b0mZxLe$> #b5MJ{5X>Ri^pl9xwY)2reu5 z(kH?>bMwfv1K< d*Q6E)BQ)-RbOC$`kmI0=&7b^@R1$KCS$tsKn{ zpDOk+y_R5VpqPlkmlo`Zmv}k-ux)W>RD6HtliK-iy4Ov!_T4Dq3HZcFphuMRJSvz- z2{Twa)Hz#13>7@3Y!n0;#TrtfHLNJ{PlM(q=)sy|FK8q0F`k_gog^awoueGAmFLW# zd3?B#wOWK~nl!w}VDSLW{;oh3U=`t2>TtOW4dGT>cP3Y@*de_wlN`!c!t}Sr9+YiV zIbn&ma;S!7U0EW#v$pE{OiZ7R=Vs`hgip}Y^`ktU?+ua{)nY4c_h|o%E!H2eis++% z^ALUmAj$1kG+CFEEw5V3FHrfZ)vlW_5?30L_)&l8X-9mw&Mxb7P!^BAZgM|Owv!6F z1Gk2oQ6O!cCpiVSqa!Z8SoeH3dI*=Z)XWG3ju`6l;A;kGW4 UU{9S8Iq(7TR^wGA9o zw4~y)4z1M%CKn`lKsIOwT2m3d4cJRA)$W!sf4* biMSd6ff62z(>s6@a60#BY4$_M1#WI!Na6w|VjJ6njoO%>PjTK? z_D9^qWiQqakS>SOGMB$NV=Kd`JS+%(d&tstg(bF3HKfENIQB|}G7VjLEG?C2R&Sdi zTbbe6sjk7|{Jg1CnL{PhC{H4qRuiMDzQID{`!%TMgVyUpGbG2Xx1bm#Kiwnfxo@Nz zghn{enx#U$FB7?pdCE7Bn+Cjmh!#B^Et(p_CYRtkmihQgkL1ex-f@O3ari{y`x^$I z?7%}y4uiIL+%|dtE}7$sS+_R&1-owUnatwRo`Z8qd+%T30Y_ifS5cwtwCEwHNh1*V zDAo9c2h(66j@}q0S8kG|NuH&C9U;fdFuSWPK^zHA65;ud6bNA!8xohE4B#CW-=Z*R znn@oLP5pG~46WT*cEf;b4gn#W%neqGZ ;oB-Y2e< zS1aWVF?^RSOHIYXyhVC*X VU*cS42B^+5f>VWsSk$TYn6__;zCeS*cjMe5M}Ose=_xt5*}v^ z^QE~=E54;3PA4s~SJ8-?uOQpCZTj~gu0t?|_=mj38j+iq<35o0Eu!t _{kv%MPD4TdF-Yxneq;l9_fe}fQ2}MHT>En zt5G-7 (J^$ka94(L0`xc5z*cf)dt1ni*S366eMg22(gp8%j zOKwRlnT3Ooh1&bexl8cB95UniEE(PY9I5&_4d%897e>&}vG)lWFlh^PXPk^hEUcJV zWEyY%7Zougt@FEsrway#Zd`;T3 ngNI*5NUhNr V1}Z*o<;UUzLk8O~l(E*pp2QN?HrwSM5*!AhV|*?iIsYW6;O*NRI6eG( zxEpk&$ ^CZGK$J=At0a7|C2Vga|K)yvKVxwa!q#(+8? zFS3Cryv~a2>ZHeq;7W`;7?q>voA_R~HhB$SSyl(Cb6MlvNV1hXL!>&h{EW$vWFt%T zIC`j4H9i!f5Xop9Zb5NF`^sZf+l_HyjFn3HC*owAbbwDJ<-|7FTn=U5yB$M+XpLsK zwfw`t;Zr;x^y~3C|9*_SgItsysi-B{&6RI4&!0im%ZQs8zi02YI)2*Wwfu{X`Gs=9 zav}?{d*LS99t`>2gKDxZ*o3?#nA7r-I|K3 YJqbf`DBya+mlY?^OuT z=BvIKbkwMp1KMapJ!6hz2)^Djb$Zx-eqb2;Nt)<`>byD~5nPdByLp^460_9B5{0j< zbGaR3Sw&K!Wc;mCX&qrXg6;2h_ihw`od>Cmw>RWO5{wZo$>GxQT_J@fHzzwy<{Cz* z6s=n5T9&)AE4SjBARqLfc>YToVQ)kIbc3#lr!cUdjIhM>Y+_Ha81YFHi3!lliPp0A z*7h7SjJcmf9z#_}AZQ$*6_IILa0+m?mTypj7`D@s`}t(RVJNP$KeIXGgyGU8A&4L2 z@_?mTi{ZkjvSRWs_~@|W!fI+pyiL0*x5t27C?In=Byy?N4(oQxLdjQD?bd#fD-!AN z=HwCZVv=FpXKxMXhC1z>^u7nI=T(hI>#zkERG+j4wJ3o2-;? zFQ%~XoNjK&XLqHH;S&y8gU>%ZUV8_8bA6V5NZskx);@Qrh3K=(VW$9Ra9dDx(xmBA zayCy1hJCjr!vDXzlHVS`<52-jWEL$bGfV~P0pP8cW1 wnC~ZE&~C)Zgvsv~6v?IYF)oPA !IJ z@*$ Z=Ms;`KRLAj!n$x45r$13o6*?MNs_rGdyTnN*kdyA_g}E z`WOf~pr23q6sX8fX%+dTcbBJjH$4QTp@Umm%x?o%5c~-HPE|4okrj%Ynj7y_Myq`S zNO8lQb-UK+5`C(UZf}lXoF3;!ZF0wOry3Y