From 16241cc69b39cd735a92ac55ac3bc6d9898c928a Mon Sep 17 00:00:00 2001 From: oumaima-ech-chdig Date: Tue, 8 Oct 2024 10:55:34 +0200 Subject: [PATCH] Remote Proxy tutorial using fetch and __getitem__ --- .../tutorials/05.remote_proxy.ipynb | 373 ++++++++++++++++++ .../tutorials/images/remote_proxy.png | Bin 0 -> 38416 bytes 2 files changed, 373 insertions(+) create mode 100644 doc/getting_started/tutorials/05.remote_proxy.ipynb create mode 100644 doc/getting_started/tutorials/images/remote_proxy.png diff --git a/doc/getting_started/tutorials/05.remote_proxy.ipynb b/doc/getting_started/tutorials/05.remote_proxy.ipynb new file mode 100644 index 00000000..863edfdf --- /dev/null +++ b/doc/getting_started/tutorials/05.remote_proxy.ipynb @@ -0,0 +1,373 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a33c4f0335308f35", + "metadata": {}, + "source": [ + "# Using Proxies for Efficient Handling of Remote Multidimensional Data with Blosc2\n", + "\n", + "Next, in this tutorial, we will explore the key differences between the `fetch` and `__getitem__` methods when working with data in a Blosc2 proxy. Through this comparison, we will not only understand how each method optimizes data access but also measure the time of each operation to evaluate their performance. \n", + "\n", + "Additionally, we will monitor the size of the local file, ensuring that it matches the expected size based on the compressed size of the chunks, allowing us to verify the efficiency of data management. Get ready to dive into the fascinating world of data caching!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "92755a11cc34e834", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:42:54.896377Z", + "start_time": "2024-10-08T08:42:52.998694Z" + } + }, + "outputs": [], + "source": [ + "import blosc2\n", + "import asyncio\n", + "from blosc2 import ProxyNDSource\n", + "import time\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "id": "5ee57ce91fc28bbd", + "metadata": {}, + "source": [ + "## Proxy Class for Data Access\n", + "The Proxy class is a design pattern that acts as an intermediary between a client and a real data containers, enabling more efficient access to the latter. Its primary objective is to provide a caching mechanism for effectively accessing data stored in remote or large containers that utilize the **ProxySource** or **ProxyNDSource** interfaces. \n", + "\n", + "These containers are divided into chunks (data blocks), and the proxy is responsible for downloading and storing only the requested chunks, progressively filling the cache as the user accesses the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bab50ca19740a1aa", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:43:00.603510Z", + "start_time": "2024-10-08T08:43:00.589048Z" + } + }, + "outputs": [], + "source": [ + "def get_file_size(filepath):\n", + " \"\"\"Returns the file size in megabytes.\"\"\"\n", + " return os.path.getsize(filepath) / (1024 * 1024)\n", + "\n", + "\n", + "class MyProxySource(ProxyNDSource):\n", + " def __init__(self, data):\n", + " self.data = data\n", + " print(f\"Data shape: {self.shape}, chunks: {self.chunks}, dtype: {self.dtype}\")\n", + "\n", + " @property\n", + " def shape(self):\n", + " return self.data.shape\n", + "\n", + " @property\n", + " def chunks(self):\n", + " return self.data.chunks\n", + "\n", + " @property\n", + " def blocks(self):\n", + " return self.data.blocks\n", + "\n", + " @property\n", + " def dtype(self):\n", + " return self.data.dtype\n", + "\n", + " # This method must be present\n", + " def get_chunk(self, nchunk):\n", + " return self.data.get_chunk(nchunk)\n", + "\n", + " # This method is optional\n", + " async def aget_chunk(self, nchunk):\n", + " await asyncio.sleep(0.1) # Simulate an asynchronous operation\n", + " return self.data.get_chunk(nchunk)" + ] + }, + { + "cell_type": "markdown", + "id": "32fffd14035b20c4", + "metadata": {}, + "source": "Next, we will establish a connection to a multidimensional array stored remotely on the server (https://demo.caterva2.net/) using the [Blosc2 library](https://www.blosc.org/python-blosc2/index.html). The remote_array object will represent this dataset on the server, enabling us to access the information without the need to load all the data into local memory at once." + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "aa92e842ec2a2fd7", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:43:10.073998Z", + "start_time": "2024-10-08T08:43:09.567381Z" + } + }, + "outputs": [], + "source": [ + "urlbase = \"https://demo.caterva2.net/\"\n", + "path = \"example/lung-jpeg2000_10x.b2nd\"\n", + "remote_array = blosc2.C2Array(path, urlbase=urlbase)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9360ba9e4f946fe0", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:43:11.259755Z", + "start_time": "2024-10-08T08:43:11.238191Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data shape: (10, 1248, 2689), chunks: (1, 1248, 2689), dtype: uint16\n", + "\n", + "Initial local file size: 321 bytes\n" + ] + } + ], + "source": [ + "# Define a local file path to save the proxy container\n", + "local_path = \"local_proxy_container.b2nd\"\n", + "# Delete the file if it already exists.\n", + "blosc2.remove_urlpath(local_path)\n", + "source = MyProxySource(remote_array)\n", + "proxy = blosc2.Proxy(source, urlpath=local_path)\n", + "print(type(proxy))\n", + "initial_size = get_file_size(local_path)\n", + "print(f\"Initial local file size: {os.path.getsize(local_path)} bytes\")" + ] + }, + { + "cell_type": "markdown", + "id": "19b226b63acc7f59", + "metadata": {}, + "source": "As can be seen, the local container is just a few hundreds of bytes in size, which is significantly smaller than the remote dataset (around 64 MB). This is because the local container only contains metadata about the remote dataset, such as its shape, chunks, and data type, but not the actual data. The proxy will download the data from the remote source as needed, storing it in the local container for future access." + }, + { + "cell_type": "markdown", + "id": "32260c8fd2969107", + "metadata": {}, + "source": [ + "## Fetching data with a Proxy\n", + "The `fetch` function is designed to return the local proxy, which serves as a cache for the requested data. This proxy, while representing the remote container, allows only a portion of the data to be initialized, with the rest potentially remaining empty or undefined (e.g., `slice_data[1:3, 1:3]`).\n", + "\n", + "In this way, `fetch` downloads only the specific data that is required, which reduces the amount of data stored locally and optimizes the use of resources. This method is particularly useful when working with large datasets, as it allows for the efficient handling of multidimensional data." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ae1babeebf0a75ee", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:43:51.053692Z", + "start_time": "2024-10-08T08:43:49.190803Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time to fetch: 1.49 s\n", + "File size after fetch (2 chunks): 1.28 MB\n", + "[[[15712 13933 18298 ... 21183 22486 20541]\n", + " [18597 21261 23925 ... 22861 21008 19155]]\n", + "\n", + " [[ 0 0 0 ... 0 0 0]\n", + " [ 0 0 0 ... 0 0 0]]]\n" + ] + } + ], + "source": [ + "# Fetch a slice of the data from the proxy\n", + "t0 = time.time()\n", + "slice_data = proxy.fetch(slice(0, 2))\n", + "t1 = time.time() - t0\n", + "print(f\"Time to fetch: {t1:.2f} s\")\n", + "print(f\"File size after fetch (2 chunks): {get_file_size(local_path):.2f} MB\")\n", + "print(slice_data[1:3, 1:3])" + ] + }, + { + "cell_type": "markdown", + "id": "38960b586bd84851", + "metadata": {}, + "source": [ + "Above, using the `fetch` function with a slice involves downloading data from a chunk that had not been previously requested. This can lead to an increase in the local file size as new data is loaded.\n", + "\n", + "In the previous result, only 2 chunks have been downloaded and initialized, which is reflected in the array with visible numerical values, as seen in the section `[[15712 13933 18298 ... 21183 22486 20541], [18597 21261 23925 ... 22861 21008 19155]]`. These represent data that are ready to be processed. On the other hand, the lower part of the array, `[[0 0 0 ... 0 0 0], [0 0 0 ... 0 0 0]]`, shows an uninitialized section (normally filled with zeros).\n", + " \n", + "This indicates that those chunks have not yet been downloaded or processed. The `fetch` function could eventually fill these chunks with data when requested, replacing the zeros (which indicate uninitialized data) with the corresponding values:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "937180b9469272ae", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:44:13.262876Z", + "start_time": "2024-10-08T08:44:12.132677Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time to fetch: 0.93 s\n", + "File size after fetch (1 chunk): 1.92 MB\n", + "[[[15712 13933 18298 ... 21183 22486 20541]\n", + " [18597 21261 23925 ... 22861 21008 19155]]\n", + "\n", + " [[16165 14955 19889 ... 21203 22518 20564]\n", + " [18610 21264 23919 ... 20509 19364 18219]]]\n" + ] + } + ], + "source": [ + "# Fetch a slice of the data from the proxy\n", + "t0 = time.time()\n", + "slice_data2 = proxy.fetch((slice(2, 3), slice(6, 7)))\n", + "t1 = time.time() - t0\n", + "print(f\"Time to fetch: {t1:.2f} s\")\n", + "print(f\"File size after fetch (1 chunk): {get_file_size(local_path):.2f} MB\")\n", + "print(slice_data[1:3, 1:3])" + ] + }, + { + "cell_type": "markdown", + "id": "209d8b62d81e33d8", + "metadata": {}, + "source": "Now the `fetch` function has downloaded another two additional chunks, which is reflected in the local file size. The print show how all the slice `[1:3, 1:3]` has been initialized with data, while the rest of the array may remain uninitialized." + }, + { + "cell_type": "markdown", + "id": "4069a43a15ae3980", + "metadata": {}, + "source": [ + "## Data access using `__getitem__`\n", + "The `__getitem__` function in the Proxy class is similar to `fetch` in that it allows for the retrieval of specific data from the remote container. However, `__getitem__` returns a NumPy array, which can be used to access specific subsets of the data. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4f4fb754d2c34a48", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-08T08:44:27.127563Z", + "start_time": "2024-10-08T08:44:25.512306Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Proxy __getitem__ time: 1.611 s\n", + "[[[16540 15270 20144 ... 20689 21494 19655]\n", + " [17816 21097 24378 ... 21449 20582 19715]]\n", + "\n", + " [[16329 14563 18940 ... 20186 20482 19166]\n", + " [17851 21656 25461 ... 23705 21399 19094]]]\n", + "\n", + "File size after __getitem__ (2 chunks): 3.20 MB\n" + ] + } + ], + "source": [ + "# Using __getitem__ to get a slice of the data\n", + "t0 = time.time()\n", + "result = proxy[5:7, 1:3]\n", + "t1 = time.time() - t0\n", + "print(f\"Proxy __getitem__ time: {t1:.3f} s\")\n", + "print(result)\n", + "print(type(result))\n", + "print(f\"File size after __getitem__ (2 chunks): {get_file_size(local_path):.2f} MB\")" + ] + }, + { + "cell_type": "markdown", + "id": "a6cb08b7108e8e76", + "metadata": {}, + "source": "See? New data has been downloaded and initialized, as shown by the array values and the size of the local file. The `__getitem__` function has accessed the data in the chunks, and put the slice in the `result` array, which is now available for processing. The local file size has increased due to the new data that has been downloaded and stored in the cache.\n" + }, + { + "cell_type": "markdown", + "id": "6377016f45b2796", + "metadata": {}, + "source": [ + "## Differences between `fetch` and `__getitem__`\n", + "\n", + "\"DescripciĆ³n\n", + "\n", + "Although `fetch` and `__getitem__` have distinct functions, they work together to facilitate efficient access to data. `fetch` manages the loading of data into the local cache by checking if the necessary chunks are available. If they are not, it downloads them from the remote source for future access.\n", + "\n", + "On the other hand, `__getitem__` handles the indexing and retrieval of data through a **NumPy** array, allowing access to specific subsets. Before accessing the data, `__getitem__` calls `fetch` to ensure that the necessary chunks are in the cache. If the data is not present in the cache, `fetch` takes care of downloading it from its original location (for example, from disk or an external source). This ensures that when `__getitem__` performs the indexing operation, it has immediate access to the data without interruptions.\n", + "\n", + "An important detail is that, while both fetch and __getitem__ ensure the necessary data is available, they may download more information than required because they download entire chunks. However, this can be advantageous when accessing large remote arrays, as it avoids downloading the whole dataset at once. " + ] + }, + { + "cell_type": "markdown", + "id": "432c728702703cd8", + "metadata": {}, + "source": [ + "## About the remote dataset\n", + "\n", + "The remote dataset is available at: https://demo.caterva2.net/roots/example/lung-jpeg2000_10x.b2nd?roots=example. You may want to explore the data values by clicking on the *Data* tab; this dataset is actually a tomography of a lung, which you can visualize by clicking on the *Tomography* tab. Finally, by clicking on the **Download** button, it can be downloaded locally in case you want to experiment more with the data.\n", + "\n", + "As we have seen, every time that we dowloaded a chunk, the size of the local file increased by a fix amount (around 0.64 MB). This is because the chunks (whose size is around 6.4 MB) are compressed with the `Codec.GROK` codec, which has been configured to reduce the size of the data by a *constant* factor of 10. This means that the compressed data occupies only one-tenth of the space that it would occupy without compression. This reduction in data size optimizes both storage and transfer, as data is always handled in a compressed state when downloading or storing images, which accelerates the transfer process.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c508507d74434ecd", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "This tutorial has highlighted how the efficient integration of the **Proxy** class in **Blosc2**, combined with the `fetch` and `__getitem__` functions, optimizes access to multidimensional data. This combination of techniques not only enables the handling of large volumes of information more agilely, but also maximizes storage and processing resources, which is crucial in data-intensive environments and in scientific or industrial applications that require high efficiency and performance." + ] + }, + { + "cell_type": "markdown", + "id": "cec882cb3a545d57", + "metadata": {}, + "source": "" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/getting_started/tutorials/images/remote_proxy.png b/doc/getting_started/tutorials/images/remote_proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..913dcdf12674982a1c2cdaa5dc15270403ff7af3 GIT binary patch literal 38416 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

r9z zUCKY-w*4H%iJWjT9q;TNV&MDs_XNy&E*rzn7l)=?`#{S^`fKG zqy_X4H(+8ygP8A4(QLz`el+g!tL@TC7#KQI`%sqj@4J)3MCV>zv#bYc?EqK7YzKHj zDUAK)F!H1+V?V>V_;^|>DlyNqT}GfLshU+9wKl;(1273HUWil`YgcB%+MKn)6CMW$ zAV!Ia%vIvmFcCfR_`Yf43 zrH`vSm0z@ar(KC1tN{;ic>2OgBwsO0$gs)%fc4RCgE{N zfYs7S*%3}afLsNvhMy+B*`8p03$)k-wNS%oO0YxNIk$Pz&N!j1Hyq$a{OY z$RUh;j$KPrhBz6anOAz8#}iWXp&!_GSRj;n%%1pI(F z`M>rFiV)bMfsVtxFUjegKwpp_O5@50pmsZSA*^{@Ys%?C6QISld`>~==;*8ciOkhz zy_hp?K3=nrc4Dce&4FmPz5e8_(+Zj-JkR7+D(mN6G0|$W<3$H#Lq34RKB?{`V>OM8brgENc%^K zjJy@S;lalvV{)V2>#Nt7^J;C1xAESj#$X*q`sphA??MzD^R8T zR=>snU{9zAkn=+;^DiLz)2XDfXJIo~ZIUNgG8n{|c7>uQtS1}$>XMq-nM^jh?r_o) zPNC24&(@WK#4o43kvNT16o1 z?K<)0W^VKZ`yGsV$ypoKJA9N261$wWtz@Lt9YLfel6#(@fs!C=kgJmBnvZkxD1YY8 zlbqK%Pc6-LO3}daLfHSFziH{7Fu{hQ0(;`ouu4Ualh}8j-=sddu)5~23%KXYB>a#H@dP3c&m38hNHG>GSZZyemtQXr_xB0J-7}fIL)!I%eeag-K!G5>2{#XlP zu2wudf$P6f726g%hSOl3)$M!Z7iIm4a^cUdaf7$x8t3}@{_9v$Zx$eqef7UdOGWZUrAwVC%6 zJX>>mfYGh+1xG5=@9q*=cjCnnCi9~*@vF!eW7$sapB{AM2Nu17<^@!-s-R_a?hw+g z&I2aESFZ1)^01$Moiy+)nMJ=qD2v}+sWmtA?a8`q2pR#nhazvgAGKE8W(QDAtw`}(U|JKHI;yE&G>7SA_WmKrxQVXUgpFtLl8>cmqPp!Ase z;OkOWxV+Won_E`M8}*<++c&6k172DnwVp^P&ndoy*%;KrEKfa$EM(=O<>7p0O%rr^ z#0q^K6$&Wba)H)JP*sOsh(Ob)a1y;a198=fHK0yt_lNrCMw2+{c&R99w>fn^3c=?Y z!5$<@@cvCgh}U;}zF1k72(8{k(B}V5GKqtdpsUmU28qzRfzD*lZW>C7nfUSo_@TvT z085vS?KiAoG6HSRWDc9beG~7hs2&S_0-dcTJ3&5C_Bv<>MGkLR^cg)=BxeyyC7Q-txtRQ6=CShpd^Dlo=^F=snfQGQiE z0-x|~qLO*#F&@6nwJpMXjw{TEO(N`K_rE=#E%t>uUzDNiZ1qDkd)#3dpf5t?-I?T@ zTU9;FMvo}OK>v2$J*oAUv#%V{Ze}`8OCkf(81C3N7sgF*Wa}d7KROkEcl=(q`(1PB z$98ZJrCJRnVPdYZh0#L}vl~I#;>b0)j=I4#|4&h%hlynhKrA!XR%{(!w@)8Xt{E5h z_&!41+VvzNo5CIQ5j!8LiuGG{CfQa4K^9^>0d(iZ7B#WX%H~IUV?~oPx1~Yjx>~I> ztdLr$TqmtYeT7$z;6x->7S!_>eCP}^;)u{$*MXnLs}^fwXs7Y=&A2WnbY8m8O-8#rcy z=e?c)?}}Fj4t)rRv`?t^HKtpb;$IBu&tfTK16GDN-mVnWej2%ny+CwLqw?S{PvL_@Bo;Zg$9;G2x8_ z00tie*)s9I0d%-g8$>5594b*hCAqfNkywnfW!`0tgdXf^*DMd>Bx^V1OA9eV|7wp0l#Es{(-_dyUPpDdLM|@DIOz?i0H?;tk-7bJhNX`x*3;0Of?6FH z{i{)Fa@j1QQyLnYuSN1?%3ZENz{{@S@%}94oLE>VJ;3Qp=c(khpPhKq3v5YRpaH1!OfuMp*a5S5d!m>c zXo;V9E$;y1PLhgzQtX$W_8yGmYo@=O*kdo3H%}apjs?{a)yF19w{;VI{V>R;PSM*)tf zHw2xCd!FgID+Gn`2(-df)(s^o1}TrC5bknk+OeNCa*X2b#0-$fW+0El-=L8EqxYRV z^XkRXiX8mcQ_IB8KwC}nLS6Yd&6}F8j1T)Y;*l0I?TQE&Y91h^VF94t%O7}TJk5i@ z{@OmGBJIiZfdV1IkAVc}^|5fBrqr_tYA*S1L$-Wl{f7 z6MsYqwMg=_0hJm`T`n;EMtMtmnmkDH_3@c-Sz6nJ0{nF^IrG>9bzT_D+POiie^8Jv)$9Fb4wjKOfnii~r4N>NJhmF^e$m|YAeg6IMmTw|v||97|sR*s!0 z!1qU{5TJo~#BOh62ELMd)jALeS0d?j=>Maah%}(x!t<6tO{l~v0x=&LzxcJX;!|$B zi}l~DE;!+vf-isnhPniZm;gb&+HFsd3kJTBI%8fu{D%R;<3b}qc>;@;V?y)HVeZA{ zVHZ|Dz@8v>bY>#a&i+3|N*{3(cb!m(kPgsBfL^768Ak=QJMGFrmlMc;9~|RP4ZdHL zgvZlbL@_fnS~Ydn&R@R-df-$$4v(Abm`zRJOL~Okl9_e9|96dKDEPsfCz0Af@L~|v z@Nj8fPqE6jde2a=c!53ghyJko={LWWSJZ^WMU$VSplkh)%QOQ5bF|H?I#Gxml+U~` zoQOHh-zBgb>fPO4A1F8<|0y_s?dKQ~OW5ZSlV(!G^PqhF`n3-RyaCj6%_SrRB=~PO z94D$@SKg_k63++Dgo2EpDPzdpv5$dy@=@^1St~DL6PduXI3RCZi9p z1PNKD)q}l!Yt^iGOz7mne+#k-yI;JrS@zd70k-Kp=tfP!$xO80q@y;&QrohWWn-4UVkFSmK18%U>dD4t09xHHT}KEGE(>?gyoLHG%b)ov)L`QB9wqJjxrMU-wI7* zLJPi?)|jQfkRnCXTbB;z=D36e8twC4oKgIwuqgElahjlJNqm6r0K@{{04VG4YQ((Ex(Q!x-6kf#P^co7-L* z#k^5xS64nLXlglPNF7$%=D;^8VRK)2TgcoUDC7tlN?I=CMXnye1iMsqy!ZHEL9e* zlfqAmbKo?w&wu&)RbnPrGVm#I_atnW_se5|hxQF#n0A?CT+&w59qIekefDYU5a7{DI-{qC=g zVQp~!Y5zqDPUrY{;zxz&X^|E+2rVj-yTEk&AWRlK@> zy-e2zMEL%d4m)1=<7Fu#EbP~g*o1`ZN}2@&Jzu{Tu{SyA+BP`{MK~4rv?8~Nmo=sK zKJJ)6>&80?^{NRDM&y!WV9`R^-;%Q?G2R$I(?v%`W&c4V@YY)sI0o&5BE=U#y3PYO zPPIt~Lb8_za2BkAE~VE9M68mL2M;k~gnX|05*XF<6jC{kf$&hcR&{SuGh_aHa}?&u zl-{cVWdmpKU3zQ#-VR#9h=-U9OjBEhX=>x&d9`4*_WN2(6oVEaR zC^sdB11)gP2IMEk%5MrEnN#?3Dw)DR_ju@tn8 ziVR_usU=OoZJjVZ2b8*%k#tap)49 zN@8ohB=s==YwDcu^&ZnbkP8#^@ga}Ss$Z{2HD2#GBlV*NqPM%s8CwN;!?a9TJo>v3 zgyjWR{fiWZ<^F;JkVGw4=!W9+_ICs!Tfod&6kCAF+ywT1tYiv$$!(40uQeaEo!Ib~ zW&Bq(17U(Oc>@B7V3&A~7OT^r){^n;gAmqloe}6Jnr{xj+isuA1}x-E*zCG9$+Gv< zp!PdGHLd6fqNLf??=7X=aBzT)8yihoB1REvfB?lr#5r${x`Xj4RkK7x7UrshxL*mQ zT@Q+|9(6a|Z4gPC&*JIb+Y{1#E0B)XvNt=T{a@tO?gcC3(e|Hh$bh<3Z6I)ebHbEh z`kCo9L-4I3HtGW$rKd<0#!!49+pz9Ul-Dnm7?fo+hET2m{Wp2-*NcYwMy6@2haV11 z5(6mWkSEXEU#>JfL`FlO+cYt)QiHnPyBENuE`+S!CuW@!r00b62#QlkvB8>?0 zSVd2OvSFeT?%OT@H@$yIHS?SAb;h>y@7VPe{ccJx3eD#0fez&l~GOzO(9u+2MjD$w$|Tq<0O}5Okrw)-AB_p z$KmvuG6PYkL^|Wg6Y9#v^Dd?xuf1Il77U?N{UD8Az&i0UjRFfltGl7mfMyQ?$j_4|z-2w^^^KNXQD@BtDp0vdL z7y+)}{1K^Fm&s5M@b5K>OnXme1Vi(YSzo<_hD4GBS(oXZ!r2dP<6_Lj%Q#;7LA?YZNKTjia?sF+lSr)?+^;0kQ_G7xjF?i( zy^`(d1QlbyPvl1?v<;w07m?fGRKi!oNLNP_j{R_za z4X~k6pf>I3SiM5E<#?l=i$TAKi|zcFO*-J%q@cyD5m-0qMwWRN14&zDXsw>7xGfy< zU>?H4P0yYNbpXvsryhZa-4LeYR|pCk`UwLQahCdF5_Kt}>Q8Jp;vGxiyh(oC`|l96 zyMn6iLA%NT?`1(-8f9{e=9U7ynkh|x|FUDRUpEV_UN8x|zit@sv zGU6<> zaURzovjzb6`wg^dbHE@pbP(Lrcsal~h=fasDZjR>ersG}H=oXQ9nG&T$MN8y#Iqyq*PzWWRJkIr1J(31xmZ*ewLF~;?8b80l)1TQ8ffeJ>%UNY z%7PFB!-0ovl4g$;={i$w5%~QJ@J!-K92z>r>(;%wrZaHS_ZeY35}N_hOOsqs~MhO50q>}jnAJU+~NtD}R zj-kdRe)1_$Q9Bp7gA;-? zH<6kMOw9p6hs=MGcSF?4lnnMMHqPh@IAa#V#F0%c`o zVTN${JLvjL|6gx6zf2}V)5!GPW(+`BQ3Pgigot&O81M1= z3mqO1I&;nG3(JgK0sEV0;`m-1RqBG^q@r9z?zpM^s0h2J~;VIr!K+NskKDkM%K z*7?4yG*6$Z+ix!1ysk#8351FmSy&m+Z^J>waS3(~tV;!Fvwbv;hWd+RE16E=pVy6) zTrn%O*7{Smg`B!{K|C&8nS+O0dF_1!v`4YO?Tgb}Fb?<5CvHke{A~kJ0uosCC#%!n zGL*hzV`Uw-U8$~oydQ>yhOc6;S4Zippb&x2W@OMh=(!&9ZJdDh1%`OYQ;`>C1udoZll4`MvbfMX`Y zV&PyrBwG9eWJ>v@G9-F^y2{J~NH+c2Lv7ect@e;ODkN(Q!(xqk(^1_H-|tMxNP+O? zxt+by;RWQDHDK^3RerhC10g1Q@RdFb@5PQd@ju`{w4W%7mEJa|h1IAfdjw=I=AN&O z->To_?!>kof3?X8wGEaVpUqLLlq-^WyS(hfT0U&)D)s~2Rx7DYIo6n{uuq6ZPS+B_ zR(=sDe5}$XxVFNo^@EP3&k8S4_A_YP9fLF04r*N`Ty>h=$~l4Gi$=tnK}qiLd6_Rn zP#n7$9eqiii$o9~#j6}9-D~bEJ@Z)v6Ky3GV6!spbOYSQG4V538mkcqHZaE3e~zPt znbHwSRSd=v*qnPw-BAb!bJ*U!3>+d_4nsrgQC;vkH*CB;`)Tp>v;8({KUxAc1CL74 zQzTbvXV@Z>DmVIIWa%~p+=7f|$%un?AKIU;HGpWMO3cS9>*<%mAkUqmttG}uEpuy= z!_nXseDhl=ujTiv2F~I&Qj2aJQI8av=7*-oYs|46Dm9t-Q{2ge3b+(?n$4+7DM5gMcLkx%n-V*9OAkRuz)xIRE1-_m&;^^QT( zD-TRN!UPX=D(5YLFYt*4J!|zmqKb5({+qva*v6zm$ZnH9fyq#%_W_nbb{U;Y!J7a{ zq}XngV$pO@8tlA|U*pa0js#LTS|o}T^l3l?jCy5sHeQ8X;~Ac%OqjyQN^(XP5= z6N2RW4&8yxvGp_w?Fg9%;$?yK_UVq~6T+`QnVDsR2#`O_m`GL;O+;dQ0ZyWpRvmbv zbBJ=z7AzOqjhy8=+PiNZg0zg6^URc-_%AwvZxUi&4ep)SsF1F@CSpo|gm3uu} zyxXY@t2wl$?WO5Gb$zJpKvT}~Xt4QA4$F6Uy4*r~c{^5B5+%NYt~an?J`Bf5Z(IU% zt;Fg|vDt^G%32c``*~XBdS~BsecL=wOPm+QUP+b7i%y^!I^jiQ_dD%zIE#*-%zWXo z9{YNy;uA{c|11{e_7$5GBeUwK;P+ZpAWVO)ZbOQWp9HLoe081vq*gNauj6O~Fn1aM zS=l$#&n6GI+D~9b$O^S=K9h->o_+w;zDu$u@OwMfXLNO2b(7IU3r1ZU2_aufG2aV8 zU0RgkF;wTatE;pN4 zT5PxUNSMG`AQ!vJ;8PaSv$qDf82KoKG$?`iEyw-L6t2J)XrC`YcOuy$M8Xp*|^O+)Fo3d<`6!GjQ(tnP`wiS*kBRHxA=Gp<_Mez&9Dvl@*OGK?Z}oh(z#wAy=E;Kbav>hQawS z@9%Cyb3#vBU^C!^2|!1(1XFI9`=)0Iwy2P2C{`G>9peZeh5!QwyLli z?&p;UvYJ;K77u{!Es6@I2fLy32c*3D>-J&B9$;Rp}WVe?t z21VU2L0B9ql_uM87d1$c4o9*KjA=Lzu+$d`zQmrr$O$9sSMdbRnyDOMf8ycBG`Oi3 z3?5J=FirdI$FIRZv0E}~=s}TUCTS+ac=8kJ-fG99M8Z4wi5(ng?GMlDWajS-vVHf< zLIiu72&qK{l5z0j*VF<>bqfHuMP!2Ch-OD{{p!oXsv`|^(DCC_pIenglI=Aw)H@n? zMBV_+vk0F^;=&Ussrf+DvYvr5QYFN1jTe?O7&<-gT3}HTvK+}QpG?fNxVuMY5SyOE z;cpkG>@0|%HXjpWB6ceX%SYUZSpEFdK^-l6rBRyPM}tuVcvEVwU3`dZ==~V@OkN#V z1UeGguV5PNSz+~QqsP&&V~`Nct9fcsN<|2pCJC^^Z67+D5LPqa9WA$c)%4s|a$h<_2n==D;Bi)9!D{Y+3x8Re$VN^AB)Tex|u!UHPlsti)1&ZIGiS z-=vMh6TMbpM7t({IkethFB& zDNpy{8liDtx3IiX*M%oLaH+BB} z=!ms>zLl-*LX71u%qy)q&_~-uHZc9kH^On|7MZf!le6As2@GIflI><1MC56gga=FV_Caz8w%u6cc?4J4hr9UfN_EzM2 zoSh2IT;sK88F3+}MRRL)PgvA0kokGlgBEFK1S`51Z18t%=ZlSIBQ+G?3zf5KeT>lv zAt{m$nSXv8V+30S|Jj_0Resr=3h1CaM2uLq`PFg6muR%&tDk#%k_ydTyzDKt1V_M; zxPS+`itjVo-A_A+uteJ>0EGF#34)EpO);CG!i1B)hXIm1YWW9+;kbTuE=16Dl8|r7 zvu#WS2(Rj|>;T2i8`v|&%`HEAozSfRgqb7i(gRG!FD=3h`o)vp1%67EPZFrbx-|vw zKWSCHl%#J=`7=46NeSnke^Bex9ZzI=*GE2Dnd$S)04hq=Ef9e4R&4cl0f*zJ*PPd_ zpUx?N$J@4{wlRFfa7f);3HQ(#fUX<&{pk}06cb~j7VIafe{7Kj8mG0izV8R|=0n^; zl7w!Lk{Jo99%Mztj7bLZ7*vsBCJVnjy4?(jbyh;hAx&qN_(Ww`5r_n^?@a<6x#Gpv z*Q%dWs3u(scAsDiA@A&54MH@1rIl?=u)z;vG<*gTjlcUp{m4uLx{g-A+)jGuYE3d# zaajW|o=z~9EqWpWk7)G^)C*#GJ)Il7&guEzh~W24%DGb|n7F4hz^oz$xsX9CHgN=+ zyr+=>Z0|gU5B@=Vqqt7_p{uqxaQ*-@*{klb<*z~QfL$;n6DQ~ZS))dLPsmb|fZO1^ zH(e#}yfIwvR^zu_Tv$|g(f729ga-Q^BGl~G%Pbyo-(;A^(P0RwOuu2GLdFUVy`}tV z`<5t&`V$zm>qpiI!2eah4eA7#rjo%O3I@rQ7Q9asi9y!9-9F;aVrEi7!Q4m-FO!P} zQgf}}of={yfwHKTAh>=}MSsGi?999N#{&3C;FnhV0B~OgKP#Xu*AIT2X2O#&0t)C_ zr;KR;`_xk;)Kw5ifhRf9uQnm_vKsq;8hgvIsjEwtiQyDH&*&M7LZ;B}M?xiy zyIPOhK~ZC8Al@xTUf$7%%CWm@rOVwrBZK7z=;E0`3B00$(xITX%94*{Y@2amVIkX~ z*$1TIgZ%EWTmy&)5Leu(S+M1!Km<>`;`*&J z{(+abY7xv(J<5E)`eSJ{1Hn2mtybhgNrf=TE9iD)y`C2Ws=Nv>+hQGIdXv&HG|14b7VJC6!_`TG`Px@3er?tO-M=t{nU`= z@i(4X1zrzR%N~C}hASZ@)dK+dYUk=ny^Xwg)FGL~gN0-cZFnpwGrEmH7JhqmQ!e<= z+=53&(nFU(;I6_z*cE`R2%5xSyufP``2AJ})KZfmLmNJ9mX_HxJDM^zSNYF-HqvK% z$v9rj&urXZheWQw7zEIXG*2+T;>fa3YFWaH^1qac)(cLB!`txRbe?+CXS>m{!8tL_ zP$6ymD3Eg?_kRGs5oDvyk<=VTDCpBBG5&0uNs8t0(bHnh)YAM1ot$9-mg8yo_`jk# zS|Y!)y$KDOvh74i(;UR=bN6D`z;9Z&2u5yxDh)%4CvPAh8wL_NpuvHV=SS!1mhHR# zVb5g%H>8xAEkELx@gd6N7X%L$8u!IRfB0c}MWT%swh*xM^vF)Leb_TQ#0@DkGq$G9 z{>BNV20(!x5Je!s&V4m&!dqewx!6kvtovl4Ai+^SZmSRcAHBpn*vis$0iCNL{ti0E zPjl=KVLV|tqnRhprc43N@giKt8(>9ZB_wlI4XuLvR3I7$Y_tdH8-@`IbUc&hLEW-M z1~4i?fN@cR>I7AWTl=pTvILQr%Ufx7y{!-?FMk5h$YOw5WKuA znb`5_X)Ijy6tdEz@{AbMHs;?cPi8a)RNq+OZ`7JGi7}^ry+TR=ed2Rn0PQMKP>$8! zCm&zyo6Fy)-$)flnrH780PPRrEeLf}VGNjEWiSevxV$Yx&l*~4%arHe5V@bO;)c90 zt1_^Dhe~|I9Kq&t|NdGIeG)MYbTPx)WsHLigUYxA#l<)DbbI>6xLwqnjF>T3!+}aF zF#6MhH~&V5mHaaNeB*8gqh|9<#-P0*=nyd)=)N7agp66RwnZ+Wyaj~Ot|^C=t<~eUfE0exB1W{BKLtkw0K5Ua_wqL`Y`+B&`u&7<4*j9 zcM9;g7zbt%_N*%5-J#?=<+9LT?A-D9o320H)R>7M%!t^-{q&}fvOAg7N?4g3PKRzs zva?t@aehq0?RI2n=aS$Y<2QzzZSf*(mNtPg_>xy01dyngMmp%TpSg=v?@ut6yhII3 zgzlr_iOcv8qqRegF{>yS|5qq&yAleTTIvUj`Zw_yZ{R_TVtdY)R?)Sey{Ut{7)47w`KpsKUbd>w~!_eu4 z-`_WcodQcxq645H@rzM65$5j)^K1LN{azuOk>x}-KZ|b9V+TWa!`a-LX=R5)K5PH^2ffeXNir>ASWmuwsjwP3eq#JFSCs0^zfiAqbmjK2bc-GC z89$2_?-p;kDmR z2mrX#szrcVe@leGx>Kr?*1Y};B-i^UF+w6DG>m)W;0f48A=a}^dVu^1Yf~#HHjUrm z$-6Z%w)o~~PQ&^m4$)U})eN-l1T@0r$d1BxF2ilv7k zLYN+C?;gcn>$uWnxQ{%j@8JNW_Nn`7y~R2UX{in4r4SL(s?X=ya*omdFqHq8A%J2S zZ|g@*4S&8)HPRCIIVB+CfdJ8Dv6WBkFJAx@Up^={H07&1(nG2h#4q-zO@`84zb&qb zZriZ?EadHX7spDmT%`;o096HHci&<60A6lsZ|FnUE#3SVAK%2@d-0{>3-|p?Vf+>I zVmv_I@vB|=>e>p(qseyf;B_IkqD!lk8=k*yII{>mFi!hQZMrWagT}X5^MDTyO4lRl zB}4Bm(ScZySy*k{O|nd2NSh=q}i})w0xRpJh3w^pv zK5iZmkq2EbaFhXFFD3t_)Ri!E!nhVOX|iFbxIk`|`r z2R~7N;Xc9Wnm9R`7Zsef%dy;izWOs@T|HoDXf6^Ag%Jy6BwCs#VHhOxFydMkC0T(U z+^vfXaDTek7F;XL^Za-EFJM&TDuO`+9A^Yxp+t@xMu+0WVqR@K(oj?PQZ~W9>z14b zS97YaOENT4Din#sy75mEdxfE81$c|FYLUc*pE|qtaMhM_`;LaMa>YTGI(f{*j!L33SmW< z;pT6^W`TH`be9{gCx%by%|qr$F|J#0hcA@woEvnJroj_S?Keau41c$(Chg~yI%DH+ zc+Pw!Y8QE^w}IkDa7z_yVPn@IAz57c@R7n#tw4?ADdjC`SR$Too&Dg>W%meNBY*Z4Cv?#RQINPHKig~T$6a5aP4#<6T>tMwqHo_QX@FrXaa z0L221wW&s?%(p=40v(9H#)86#WcGQVDq!Vl3bq3Wp$inVa@aV66AA7;J%oFvP3)p9 zT=oDGL%?YzGB7B~bFIN<+od)Zq4kcLlfAm@#e=(enokW!yKj$s{?OFPe<7l3YiY72 zSe;vKeFg3URs8{qMy!d&nE)L-B&Gij)2!g zxw}{Y_r7l$OVkHq!pfaUEJS)so3HiWS9W8K5-yvrZpWK%@X4lBplbk*Xo?sRQj+*& zam#%v^$!c6lKQVXV<8HPwW|GTy^{NHWTdl}afmJTQkK@2qLztK({XTcK-BH=mIi^@ zEVwgdYf3!MSML)XYk3lMz1FL*_UogE4^@#CTe@b&`wl^&vZ~UtLJDQpk&JWswpL>+x;aK14R+5-3fo$nsL91!hq zpSVsoQC%A%s&^q&zaapPSfl7SdxGRKM#U3g==X`GWyvUb^iGXonufEdKAaVNVqY0i zLs~#XdU&9479>0OF?iy0IzxEc@i*;ksF+FZ=AL+7Ccij9Re(=HX0i91LVswVrCTtu zh}zv2gntDcXqNANOPg|R!%Wmdt>=gu3Ud617z2yh|MFFLw<(KJIBlJP?q0`W9Z4e3 zzzdXxy9^8@lm1}yE2+f}BPy=-Kd+klS*M&W_I9dZv;N5yrtJSCU05+h&(i6k`!OvT zC}$ElNb%1^!@>lwZsqEsVnBTYF8}ih=BThs?kc1zCpCT1`fgr#a9)HS%5NyXHCOC6 zMqK{SEa}A!Pl;pa{ncW)_e1Z7aVmunC=&q2ts#tv=Em#AJ6BWmifO4j&o47e*=3IU zTM#6hChLV>4PnDZTgadC7c(JPWW;h-jM=w~F%iiARROQz@XaL$< zs6PY~*sS7dHdp*x_b_G$xLvTnGDl4d?y-a>gh0TVSlA@5P0#ZetzUwmR20Qf8WTW< zNrI|%I0Rb<(Pg2Y<-tGar-yPNo0APd^CVrzj{{gLRyS<< z%jXoRepcokaJ#_99m@(PzecuNDr{<)H(K; zamK}TD1J^j54n4Hv{JM;YT)cqC-H`LEb6ow{@PLWT)PK=qYr^Vd4es50-s@|1CWQZ?!f5qH|5)RW19sCYLN3R7LO3lz(N9W zRt(^M(0sYug4=X?;rXZ?*cAgeJ2RhEK&4y2LU6X-TkIMFwQ>;b+7iEK@j>&QKQnyM zg{AjT+BL`Vp}PZsN%UMkRi(~M@~5UA8-yZC`ycXOYFsFxDfP^cKBYr9V9C^R@oLO4 zJCzD*V`p8y@>YR~|F>QldtDWX55;`G%&9{C!Z~+dd2m190 zxsP0|sS%^3z8S^`8PI1ChH`&-A!Q<0%g@8QSpQZRPzk?TndjWb%AXExia!i;&fl_R zJVg~Z!SSesZDSryzAJ)nQrd5Z#yPfDp~Oc9WU%CozchgERZ9fkS=l{F>#A@}+!3D; z!OD-$ObitNfUJICt@{7*pjhnpQWfG0`Sh)48x%jqvVWt|r`qC7qySw9`TQz)ni z*==)5Sh?(qQ6|RTl7f}Lm7+xZOf&!d{nMqwZ9H^i_^XVxbmYg=_uU)$&2qplUqx)0 zOqCkdgF*+GFKsA!feUAZsN0iw515(T(~v2grvL>fqpTbq$ovNIw*^9vV-3vurZE9b z;FhX!-NuKf!6sv)Y1~%b@;&WtUY8C@my=#l06#D=(G%vh(djU3Tqeli%T&nRe*ovlU!m%DKmsfm|puRO+uIM(X=RUb?`jW$ak$5~} zTC6>@NxLK^H|b@143Do0Za2GhtunPCV|yVzlPJ_#cF-{W9O%C=jr$O>Y3;YafMEb~ z2=akREC>9S27s-GO5+y?GG^0W>9W-WqA<&$#Yj2RsV*gCqbczlcQC?d19yQaw*SjOnS4o zb(35E%dOyyb7a{Eb*R~Z<`%*=xqf!YXSe;#qL93(OySCH2ZCN8m%~T#u(OT@4Nz&t z6Eo;Xz8d*lJM5g$t=;DgFqRNpWp%Q;IN!&`caAmba8g*sJt+iBmnqU-&7__CSEpf| zY>>2G- z{9L+a5)0AMCOe-M^ms^qt7eL(pof9_B@^RZpdU-|DgS2OfaQlT(Zf6~2hb&fq2Vzy zg~@AMSnILI-j|r*TYMIU&c7)lkUew%kQjwixRCQ3sD=XdC{r20P#rJjqj<=}i{Lja z2x9El;37h<8+TBukrFJSiI?H3Xz)k?-I_?i(jUk&5b&6q37iPcPpBmI6uH=0Ur6opI`S3(<&yX@zyLN107 zM7`&*(8D_k3q(U*eMw+*=wh{RTzOahc)eOnQ+0@9Grf@a2>p0-=ov^RfZz`q0~-YT z0CL4X361`>KsoYTTVUrjhozna1sndATZ9Xw1J>10G;}-lRomUG`~73cZ;N}?VO+{HpNg`RDgY=)L0E3%y1?oMf;3M~J(@!*!!V%MX*xFKo0-hDpN z1g}84xnpQPhSrJ&1%l9pYpE!qzcj^R^Pl(iHi;?1tuzV~v8zy3d;W4jme2KbNTK#E zp6KXr#O>Onh*IYq6`^N1tYuixZ9fd)M zkWzVu^Q-Nupk)q%=Wp?t5J1Bd#bWuSrqPGUv_IWO=p;%6-pw#(Lw!_WNoacnSkv_$#K<+4C9rqoG2O@pGQyaD8pK!y^Ikc2j-UXk1OPeR@ zHXt|Vm%pm91fSAZS@&5xszifm3ae^EE>5(X(h9ED10lc8Eb+GBfge!|9Uz%24mEc# zp)lgJ!@&b3eIWDgL$^KjH76+j(GfY?y8uM(E;`O zdhLU9J-x5`nY+*UmHR7+ab~*Pre&0YI%e1K7%fkqz8@Y%-oYC!6ds8(Y7PI%^-r@t z21j-3SH}=)mmXr7vCBo>GJlxCg(V7ee&0rfGXzk`6m=3y`lH0 z-c!>Tblut@DTPEfpcU2Q{H@GDm}I17IayWoqu5{;TBDIWBJQ0~BNPBq#wxPDH417M z1f>DZ&eUq1oN3W=9b!pVtI?x!wO04f`jhc$hYUI6m&i~&Kc%1WE)BP@}IgD;vyFb+_#a_N=~5R%^gJ#LJm zH*M*`x|m2}gY#V$H=g=Mly%dH_~bJFdGC~eT{)IMz))NZzne{ytVdgHBNQ9norPS_ zsN6u-gz7ozNtWXCdU4=pJtPjykzS$3pks`c_uO`0_$HGmW5&&-;xjhD&!g0M=oxIH zXp1lM&SBk*m%>TdSYtsKTbBkMi>T8L9V0&c5*N)64Fea8{2n4i-iz<(VY^3rr(>EK zB699`87X*749#B?Z>NA+JzDn~_*0t4pRd`zCzrbQ+Qi|8NkWs}F=@1!nxX^rVD{~~ zY6WF={G=yn=vbfCVdfu|X3hnVT1fL&v0cuOZ&VadP%doY!u-URafwPy6!lb;!3$vQ z=+uUn-|iwKF*kz=?WOPX_yh%lIf2LMv2Zm>KJ-3@2ER?>wt1_%aGa_Et~vaMw|0YF zTSNJiU>6&BGI9?Ci=EXV=r(vS(c83^0eB-_eZZ=oZEYv(NMH8>BeV{5ED|QMmgswy zTd%?BjJ0Aj`WeC(2GvIae8|ouv+KW%BNoPNJUF1je>5(WtWCKg}k4PV;*P-wzb-Y&WTw|Li;2A7OnXW$(LRQXjd0Wz=s$96RlIVj6-Wu zEZ*J7tZAtlflVJ%u-r)iZLK@l+9ZwNv3Jn1xOH2SiF=(ePiK?oUT?(xUZYc7^VYs=Vh^g77d1PIV1saG+RFMC}-EEQ45!G9h6- zGzX_!ZoeEOyo7oFgc}NWUc?*SC{wET$PMayqdx5e66tc z{A;bUT(nit0l;O901xl|z!nfk^JgRZS=Ga0(6`_H`JKK1GE7gAzde2E^}y`K5JOCE z5RGARYxgHn0m(5PI@E7rksDyWUHVTKZ=z!@FlQFs%;-Ppl%uURy=+~W?A70hyYw-O zN!S`7qYh7(?XnsTNVU*b%k8_~*dK}m=hI(_EeB;-GC6fj#n8f-@lAAF_WDxoOn#Oa z5s$cwi~B>|j0gmRUhsbMYbeeKb+7>tXIOHNgwqx%E+Hyakl?%LXs@rI4l1f8$pCiU zOzCU}bp26X?oWe*{PDY4g>GGeL1b-hZPv|3JATWH)Z^&&{z^idMeE!Btd7ka z!|^p0H$6W$2rtFG{rn6wuKd2I{$7eG)u8(zmF{JWXwK6^6;m6Z0SnGsgSA_fzVRUB zC*h>{@EXJ&nyZ+`1|l2pmbr=3ga8*s?P9bXL|#aoM&8#-31b;@2KDsZfVvL?T7T_6 z7$JWjyQ-2G>})MamCeB#lUKj=+V1hf^=T_v#QxJ87t&7xQ{RakPckN0k5dQ^2)0~| zhNU8wcPk1RjYy-JAW`Lyz~bgKWbFvh181ro!**D1ji=mgAtl4p zcuIqfyyVuu_meqoB$40a@>IxY-L>LVhr-YgKE(Y*iH68R=)-ICEaIbMy`-Oe@HqP- zLn~~tXq9F>TE{1Ip?RLvTwtm5tHO`yZ!)iuEPW?zj`44{FmlI><2ewQJM62&afVDG z1u=!FgYD#Dt8=Xt)$FmrXHtxA{3$ab};yXiu`ZP$HvQ8cUP zW6U6+%0#Wh;<^)8m%)vAkGd+jKxRqYbG!*IV4_&MrF$Z84}7@k@NE+zU)s-U+rIRX z?_OO>qZJGTECUU{;%O6NXFq2hZ~vU&{Pj#Q$KiaDL#a$K=00k>7D-@+GFR8`xr{&Q zx>wdO0W)@XUoP+Q9zHwkn7jS1%+3j{)V}+Jt~5N;d)veJ6F8*iPRmb)7ClsQHws&d z8c=6N4E6{JXyx*m&PN!ychJ*zO{z|IX|~N3pzBH{X7v(ao%z4Mj+8-z^zJflJlk9|dU* z25YWKe+_21RPOukew34Hkj15$iJjM*J>$`XFB>KnJ$o!TQKZ$U zo#?>-PtOj43PvV9t9S%mWERGx%kkoATW);vuyDq&BroC zqmoGK`~!b2Hx9N}gPHFYkTeUC{*9Ju`Mu_^9Z`B)Sq_X>xfV7>AL)WoSMsauk$%#t z=ss5%3^}dbh1=G-QmDz|;@U~8R3Vq((j~N`%YuJ2T0!Z}3t;tQ8p4vL%|q0=(!UdJ zZ4#1#IIPBY?3O5?twi(xLk3RH_DPNtE@PbEm>1uedJKn8hF=FEd4O1&f*~Ks__Z!;VA2@$nL#pgNr6hnFidJ9F32ayCz^NrX*DE ztG1@nA%oJKtDsLuH0L830V3&_{*AdkV+(5Y5hJ+lp~G}T!xfwsRn%;cYSZN4KE{u*7%NdX)0H|Ua~ZsUabr0XW%ssDD zoyRk&-!NBv=#7mCPg@z^!gvE4oBpp8UV%0zJE4)n4@0dtKCxV>U_Y_{YjeD0tf-Xv5jPJGJbB;Ii31~lM!~A6YqOPJ`X3WK9)tZJ{ zo@?1Kpt$=vf)KLL&@h&OO�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 B%rgK0 literal 0 HcmV?d00001